h1 簡易なおれおれマークダウン 2019秋 [[name|c_index]] [[ date ]] @TOPS 2019/SEP/21 新規作成 2019/SEP/23 [[ @バージョン2$_(preタグ) ]] 追加 2019/SEP/24 [[ @バージョン3$_(ul,liタグ) ]] 追加 2019/SEP/25 [[ @バージョン4$_(a$_(href)タグ) ]] 追加 2019/SEP/26 [[ @バージョン5$_(hrタグ) ]] 追加 2019/SEP/27 [[ @バージョン6$_(img,videoタグ) ]] 追加\n\ [[ @バージョン7$_(sタグ) ]] 追加\n\ [[ @バージョン8$_目次機能 ]] 追加\n\ [[ @バージョン9$_headタグのtitleを何とかする ]] 追加\n\ [[ @バージョン10$_バグ修正や調整など ]] 追加 2019/SEP/30 [[ @バージョン11$_コードの見直しと調整 ]] 追加\n\ [[ @バージョン12$_(br) ]] 追加\n\ [[ @バージョン13$_(dl) ]] 追加 2019/OCT/01 [[ @バージョン14$_(table) ]] 追加 2019/OCT/02 [[ @バージョン15$_タグ情報のデータ形式変更 ]] 追加\n\ [[ @バージョン16$_もう少しコード見直し ]] 追加\n\ [[ @バージョン17$_ulからtableへの変換 ]] 追加 2019/OCT/03 # [[ @バージョン18$_a$_(href)タグで文字列に'|'を含めるとダメなのを何とかしたい ]] 追加\n\ [[ @バージョン19$_tblのセルの中の文字列で、先頭に複数の空白を含めたい ]] 追加\n\ [[ @バージョン20$_tbl_ulモードでthタグも ]] 追加 2019/OCT/04 [[ @バージョン21$_(a$_(name)) ]] 追加\n\ [[ @バージョン22$_バッファに出力してからペースト ]] 追加 2019/OCT/06 [[ @バージョン23$_h1,h2,h3で後に空行あったらデフォルトのpモードに ]] 追加 2019/OCT/07 [[ @バージョン24$_モード遷移の不具合修正 ]] 追加\n\ [[ @バージョン25$_タグの属性と文字列の装飾系のタグ ]] 追加 2019/OCT/08 [[ @バージョン26$_折り畳み ]] 追加 2019/OCT/10 [[ @バージョン27$_例の形式の入れ子 ]] 追加\n\ [[ @バージョン28$_例の形式でpタグやulタグ ]] 追加 2019/OCT/12 [[ @バージョン29$_例の形式で改行を許すように ]] 追加\n\ [[ @バージョン30$_改行削除の不具合対策 ]] 追加\n\ [[ @バージョン31$_include ]] 追加 2019/OCT/13 [[ @バージョン32$_macro変換 ]] 追加\n\ [[ @バージョン33$_目次を折り畳るように ]] 追加\n\ [[ @バージョン34$_マクロの値への追加 ]] 追加 2019/OCT/15 [[ @バージョン35$_バグ修正 ]] 追加\n\ [[ @バージョン36$_コメント対応 ]] 追加\n\ [[ @バージョン37$_macroの変換結果に「例の形式」やモードの記述を含めたい ]] 追加 2019/OCT/17 [[ @バージョン38$_macroに引数を ]] 追加\n\ [[ @バージョン39$_マクロの展開を確認し易いように ]] 追加\n\ [[ @バージョン40$_マクロの展開表示をもうちょっと改良 ]] 追加\n\ [[ @バージョン41$_マクロ展開表示の改良その2 ]] 追加 2019/OCT/29 [[ @バージョン42$_pre以外でも'/'を使えるように ]] 追加 2020/JAN/24 [[ @バージョン43$_不具合修正 ]] 追加 2020/JAN/30 [[ @バージョン44$_to_html.pyを整えてみました ]] 追加 2020/FEB/15 [[ @バージョン45$_目次用のアンカー文字列 ]] 追加 2020/APR/05 [[ @バージョン46$_ヘッダのタイトル指定 ]] 追加\n\ [[ @バージョン47$_ヘッダのタイトル指定のバグ修正 ]] 追加 2020/JUL/16 [[ @バージョン48$_hrefのリンク指定の拡張 ]] 追加 2020/SEP/06 [[ @バージョン49$_ちょっとした更新 ]] 追加 2020/SEP/16 [[ @バージョン50$_include再び ]] 追加\n\ [[ @テーブルの修正 ]] 追加 2020/SEP/18 [[ @さらなる修正 ]] 追加 2020/SEP/24 [[ @inc_utのバッファ対応 ]] 追加 2020/SEP/26 [[ @inc_utのバッファ名の自動生成 ]] 追加\n\ [[ @get_title.py修正 ]] 追加 2020/OCT/03 [[ @リンクのラベルの省略 ]] 追加 2020/OCT/10 [[ @INC_LINKの更新 ]] 追加\n\ [[ @DETAIL_M ]] 追加 2020/OCT/22 [[ @INDEX ]] 追加 2020/OCT/23 [[ @evalとdateとcmd ]] 追加 2020/NOV/18 [[ @リンクのbasename対応 ]] 2021/FEB/23 [[ @bare対応 ]] @TOPE ---- このページ自身も [[index.txt]] から本ツールで生成してます。 pre $ ./to_html.py head.yaml index.txt ezmd > index.html / ダウンロード用のスクリプト [[dl.py]] pre $ chmod +x dl.py $ ./dl.py / dl.pyのバグをなおしました (2020/FEB/17) ---- h2 使用例 [[ doc/index.html | 簡易なおれおれマークダウン 2019秋の使用例 ]] ---- h2 はじめに 以前に [[ http://kondoh.html.xdomain.jp/ezhtml/index.html | 簡易なHTMLパーサ 2018秋 ]] を作成しました。 以降、HTML形式のものを作るときは、まずYAML形式で作成。 それから自作のツールezhtml.pyを使って、YAML形式からHTML形式に変換するようになりました。 ですがここにきて、YAML形式の作成も「かったるく」なってしまいました。 例えば、次のような既存のテキストの場合 @INC_LINK NAME=foo.txt まずはYAML形式で @INC_LINK NAME=foo.yaml を作成しておいて pre $ ./ezhtml.py y < foo.yaml | nkf -j > foo.html $ nkf -g foo.html ISO-2022-JP $ cat foo.html | nkf -u
毎回、同じようにつまづいて、同じような感じで対応してます。
なので、いいかげん自分に判りやすいようにまとめておきます。
日本語対応といっても、ソースコード中に日本語を書くつもりはありません。
データはYAML形式のファイルで用意。
そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 毎回「うぅっ」とうなってます。
Python2 では日本語を含む文字列は .encode('utf-8')して UTF-8 で保持。
Python3 では日本語の有無に関係なく、素直にstrのままでよし。
Python2 では素直に sys.stdin/sys.stdout を read/write。
Python3 では sys.stdin.buffer , sys.stdout.buffer を使う。
Python2 の世界には .buffer は存在しないので注意。
/ に変換。 @INC_LINK NAME=foo.html このように表示されます。 ですが、このYAML形式を作成するのが結構ツライです。 できれば [[ foo.txt ]] から [[ foo.yaml ]] の形式に変換できないものか... 世の中にはマークダウン形式の規格・仕様は存在します。 ですが、ここはひとつ目をつむって「簡易おれおれマークダウン」な仕様の 変換ツールを作ってみる事にします。 ---- h2 headとbody [[ foo.yaml ]] の段階で、headとbodyに分かれてます。 そしてbody以降は、最低スペース2つの字下げが必ず入ってます。 headでfoo.txtからの固有の情報は pre - title: py23str / だけで、あとはほぼお決まりで固定です。 headのtilteはあとで編集するとして、bodyだけ何とか変換するように目指してみます。 まずは @INC_LINK NAME=foo_head.yaml を用意。 そして @INC_LINK NAME=foo.txt から、これから作成を目指すツールで、何とか @INC_LINK NAME=foo_body.yaml を自動生成します。 あとはスクリプトなり何なりで、例えば pre $ ( echo '' ; ./ezhtml.py y < foo_head.yaml ; echo '' ; ./ezhtml.py y < foo_body.yaml ; echo '' ) | nkf -j > foo2.html $ nkf -g foo2.html ISO-2022-JP $ nkf -u foo2.html毎回、同じようにつまづいて、同じような感じで対応してます。
なので、いいかげん自分に判りやすいようにまとめておきます。
日本語対応といっても、ソースコード中に日本語を書くつもりはありません。
データはYAML形式のファイルで用意。
そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 毎回「うぅっ」とうなってます。
Python2 では日本語を含む文字列は .encode('utf-8')して UTF-8 で保持。
Python3 では日本語の有無に関係なく、素直にstrのままでよし。
Python2 では素直に sys.stdin/sys.stdout を read/write。
Python3 では sys.stdin.buffer , sys.stdout.buffer を使う。
Python2 の世界には .buffer は存在しないので注意。
/ @INC_LINK NAME=foo2.html となります。 ---- h2 タグ おれおれ仕様のツールなので、 自分がよく使うHTMLのタグだけ対応して、 滅多に使わないものは、最後に手動で編集する事にします。 HTMLのbodyの中で、自分がよく使うタグは何か? ul h1, h2, h3, ... p pre ul, li a hr img video s p とりあえず、このくらい。 最初はここから [[ foo.txt ]] の範囲だけに絞って ul h1, h2, h3, ... p p だけで骨組みを考えてみます。 ---- h2 簡易にモード切り替えで [[ foo.txt ]] から [[ foo_body.yaml ]] を生成したい訳ですが、 テキストを、属してるタグで切り分けてみると pre ;;; --> h1 Python2とPython3での日本語文字列対応について ;;; <-- h1 ;;; --> p 毎回、同じようにつまづいて、同じような感じで対応してます。 なので、いいかげん自分に判りやすいようにまとめておきます。 日本語対応といっても、ソースコード中に日本語を書くつもりはありません。 データはYAML形式のファイルで用意。 そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 毎回「うぅっ」とうなってます。 ;;; <-- p ;;; --> h2 結論 ;;; <-- h2 ;;; --> h3 日本語を含む文字列処理で .foramt() や .join() を使いたい ;;; <-- h3 ;;; --> p Python2 では日本語を含む文字列は .encode('utf-8')して UTF-8 で保持。 Python3 では日本語の有無に関係なく、素直にstrのままでよし。 ;;; <-- p ;;; --> h3 日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい ;;; <-- h3 ;;; --> p Python2 では素直に sys.stdin/sys.stdout を read/write。 Python3 では sys.stdin.buffer , sys.stdout.buffer を使う。 Python2 の世界には .buffer は存在しないので注意。 ;;; <-- p / HTML形式だと、開始タグと終了タグで、まさにこのような感じで領域を指示します。 おれおれマークダウンでは、簡易な記述を目指すので、モード(状態)を持たせます。 テキストの先頭から末尾に向かって、状態を切り替えて、どのタグの領域かを指示する事にします。 例えば、次のように。 pre h1 Python2とPython3での日本語文字列対応について p 毎回、同じようにつまづいて、同じような感じで対応してます。 なので、いいかげん自分に判りやすいようにまとめておきます。 日本語対応といっても、ソースコード中に日本語を書くつもりはありません。 データはYAML形式のファイルで用意。 そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 毎回「うぅっ」とうなってます。 h2 結論 h3 日本語を含む文字列処理で .foramt() や .join() を使いたい p Python2 では日本語を含む文字列は .encode('utf-8')して UTF-8 で保持。 Python3 では日本語の有無に関係なく、素直にstrのままでよし。 h3 日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい p Python2 では素直に sys.stdin/sys.stdout を read/write。 Python3 では sys.stdin.buffer , sys.stdout.buffer を使う。 Python2 の世界には .buffer は存在しないので注意。 / p, h1, h2, h3をモード名として、モード名だけの行が現れると、 現在のモードをそのモードに切り替えます。 h3 h1, h2, h3モード 他のモードに切り替わるまでの間の複数行のテキストについて ul 各行の先頭、末尾の空白文字は無視。 空行は無視。 各行の有効な文字列を結合して、タグの中身の文字列とします。 pre h1 Python2とPython3での日本語文字列対応について p / は pre - h1: Python2とPython3での日本語文字列対応について / てな具合に。 h3 pモード 他のモードに切り替わるまでの間の複数行のテキストについて ul 各行の先頭、末尾の空白文字は無視。 空行があると、pタグの打ち直し。 各行の有効な文字列を結合して、タグの中身の文字列とします。 pre p 毎回、同じようにつまづいて、同じような感じで対応してます。 なので、いいかげん自分に判りやすいようにまとめておきます。 日本語対応といっても、ソースコード中に日本語を書くつもりはありません。 データはYAML形式のファイルで用意。 そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 毎回「うぅっ」とうなってます。 h2 / は pre - p: - 毎回、同じようにつまづいて、同じような感じで対応してます。 - p: - なので、いいかげん自分に判りやすいようにまとめておきます。 - p: - 日本語対応といっても、ソースコード中に日本語を書くつもりはありません。 - p: - データはYAML形式のファイルで用意。 - p: - そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 - 毎回「うぅっ」とうなってます。 / てな具合に。 ---- h2 バージョン1 (h,pタグ) ではこの仕様で、骨組みのコーディング。 pre $ cat ezmd.py #!/usr/bin/env python import yaml import nkf heads = [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9' ] end = '$$$_end_$$$' modes = heads + [ 'p', end ] def do_mode(mode, buf, res): if mode in heads: buf = list( map( lambda s: s.strip(), buf ) ) buf = list( filter( lambda s: s!='', buf ) ) s = ''.join(buf) res.append( { mode: s } ) elif mode == 'p': buf = list( map( lambda s: s.strip(), buf ) ) buf.append('') (lsts, lst) = ( [], [] ) for s in buf: if s: lst.append(s) elif lst: lsts.append(lst) lst = [] for lst in lsts: res.append( { 'p': lst } ) def ezmd(lst): lst = ['p'] + lst + [end] (buf, res) = ( [], [] ) mode = '' while mode != end: s = lst.pop(0) if s in modes and s != mode: do_mode(mode, buf, res) mode = s buf = [] else: buf.append(s) return res if __name__ == "__main__": b = nkf.get_stdin() (s, nkf_opt) = nkf.to_str(b) lst = s.split('\n') lst = ezmd(lst) u8 = yaml.dump( lst, default_flow_style=False, allow_unicode=True, encoding='utf-8' ) b = nkf.cvt(u8, nkf_opt) if nkf_opt != '-u' else u8 nkf.put_stdout(b) # EOF / 日本語の文字コードの問題やPython2, Python3の問題は、すべて nkf.py が吸収してくれてるはずと信じて、進めてみます。 [[ http://kondoh.html.xdomain.jp/ezhtml/index.html | 簡易なHTMLパーサ 2018秋 ]] から @INC_LINK NAME=ezhtml.py nkf.py は使いまわしつつ、互換性を保ちながらアップデートしてきたので、 [[ - | [[ http://kondoh.html.xdomain.jp/argmnt/index.html | テキスト配置ツール ]] ]] から最新版の [[ ../kon_ut/nkf.py | nkf.py ]] を配置しておきます。 おれおれ仕様のテキストファイルは @INC_LINK NAME=foo2.txt それでは実行。 pre $ ./ezmd.py < foo2.txt - h1: Python2とPython3での日本語文字列対応について - p: - 毎回、同じようにつまづいて、同じような感じで対応してます。 - p: - なので、いいかげん自分に判りやすいようにまとめておきます。 - p: - 日本語対応といっても、ソースコード中に日本語を書くつもりはありません。 - p: - データはYAML形式のファイルで用意。 - p: - そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 - 毎回「うぅっ」とうなってます。 - h2: 結論 - h3: 日本語を含む文字列処理で .foramt() や .join() を使いたい - p: - Python2 では日本語を含む文字列は .encode('utf-8')して UTF-8 で保持。 - p: - Python3 では日本語の有無に関係なく、素直にstrのままでよし。 - h3: 日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい - p: - Python2 では素直に sys.stdin/sys.stdout を read/write。 - p: - Python3 では sys.stdin.buffer , sys.stdout.buffer を使う。 - p: - Python2 の世界には .buffer は存在しないので注意。 / 出力されたHTML形式をさらにezhtml.pyにつないでHTML形式に。 pre $ ./ezmd.py < foo2.txt | ./ezhtml.py毎回、同じようにつまづいて、同じような感じで対応してます。
なので、いいかげん自分に判りやすいようにまとめておきます。
日本語対応といっても、ソースコード中に日本語を書くつもりはありません。
データはYAML形式のファイルで用意。
そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 毎回「うぅっ」とうなってます。
Python2 では日本語を含む文字列は .encode('utf-8')して UTF-8 で保持。
Python3 では日本語の有無に関係なく、素直にstrのままでよし。
Python2 では素直に sys.stdin/sys.stdout を read/write。
Python3 では sys.stdin.buffer , sys.stdout.buffer を使う。
Python2 の世界には .buffer は存在しないので注意。
/ 大丈夫そうですね。 headとつなげて仕上げを。 仕上げ用のツールを用意しときます。 @INC_LINK NAME=to_html.py @INC_LINK NAME=foo3.html OK。 todo ul [[-|h1, h2, h3, ...]] [[-|p]] pre ul, li a (href) hr img video s ---- h2 バージョン2 (preタグ) ul pre p 追加してみます。 h3 preモード preタグの場合、どこまでがpreタグの中か? 次のモードへの切り替えの判定が微妙です。 このモードは特別に、'/'だけの行でモード終了としてみます。 行頭に'/'だけ表示したい事はまぁ無いだろうし、 あったとしても、' ' + '/' にして行頭にスペースを入れてしのぐ事にします。 モードが終了するまでの間の複数行のテキストについて ul モード開始直後の複数連続の空行は無視。 モード終了直前の複数連続の空行は無視。 タグの中身として、各行末尾に改行追加で連結した文字列とします。 p preタグのYAMLへの変換は [[ http://kondoh.html.xdomain.jp/ezhtml/index.html | 簡易なHTMLパーサ 2018秋 ]] [[ http://kondoh.html.xdomain.jp/ezhtml/index.html#pre_yaml_dump | preタグのyamlダンプ ]] でこしらえた yaml_dump() を流用しておきます。 ezhtml.pyのオリジナルのyaml_dump()ではstrを返す仕様にしてました。 今回の場面ではUTF-8のままで良いので、そのように修正して使います。 モード終了指示の方式にすると、 '/' で終了してから、次のモードまでの滞空期間ができてしまいます。 モードが何者でもないその間は、とりあえずデフォルトのpモードで。 pモード中に何もテキストがなく、続く別のモードが始まれば、 デフォルトpモードでは何も表示しないので、大丈夫でしょう。 @INC_LINK NAME=v2.patch pre $ cat v2.patch | patch -p1 / @INC_LINK NAME=foo_2.txt 実行してみます。 pre $ ./ezmd.py < foo_2.txt - h1: Python2とPython3での日本語文字列対応について - p: - 毎回、同じようにつまづいて、同じような感じで対応してます。 - p: - なので、いいかげん自分に判りやすいようにまとめておきます。 - p: - 日本語対応といっても、ソースコード中に日本語を書くつもりはありません。 - p: - データはYAML形式のファイルで用意。 - p: - そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 - 毎回「うぅっ」とうなってます。 - h2: 結論 - h3: 日本語を含む文字列処理で .foramt() や .join() を使いたい - p: - Python2 では日本語を含む文字列は .encode('utf-8')して UTF-8 で保持。 - p: - Python3 では日本語の有無に関係なく、素直にstrのままでよし。 - h3: 日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい - p: - Python2 では素直に sys.stdin/sys.stdout を read/write。 - p: - Python3 では sys.stdin.buffer , sys.stdout.buffer を使う。 - p: - Python2 の世界には .buffer は存在しないので注意。 - pre: | $ cat p2.py #!/usr/bin/env python2 import sys import yaml if __name__ == "__main__": s = sys.stdin.read() d = yaml.load(s) foo = d.get('foo') bar = d.get('bar') d['hoge'] = foo + ' ' + bar d['fuga'] = 'foo={} bar={}'.format(foo, bar) d['guha'] = '(^_^)'.join( d.values() ) s = yaml.dump(d, default_flow_style=False) sys.stdout.write(s) # EOF - p: - ここはデフォルトp - p: - ここは明示的にp - pre: | ここはpre p ここもpre h1 ここもpre - p: - ここはp / 大丈夫そうですね。 pre $ ./to_html.py foo_head.yaml foo_2.txt > foo_2.html / @INC_LINK NAME=foo_2.html todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] ul, li a (href) hr img video s ---- h2 バージョン3 (ul,liタグ) ul ul, li p 追加してみます。 h3 ulモード 全体の簡単にするためにモードの開始、終了をトップレベルの状態の遷移だけにしました。 なので、基本的に「入れ子」の構造を諦めてます。 が、ですが、このulモードの中だけは「入れ子」を結構使ってます。 例えば pre - ul: - li /: 標準入力からYAML形式のテキストを読み込み - li /: yaml.load()でテキストをデータに - li /: データの文字列2つを - li /: ごにょごにょいじって - ul: - li /: foo + ' ' + bar - li /: .format() - li /: .join() - li /: yaml.dump()でデータをYAML形式のテキストにして - li /: 標準出力に書き出し / こうして preそして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、
毎回
「うぅっ」
「ぬはぁ」とうなってます。
2: の場合
:4 の場合
2:3 の場合
2 の場合
3 の場合
Python3 では日本語の有無に関係なく、素直にstrのままでよし。
(改行を入れてみると)
Python2 では日本語を含む文字列は
.encode('utf-8')して UTF-8 で保持。
Python3
では日本語の有無に関係なく、
素直にstrのままでよし。
ここは改行の直後
バージョン2のための パッチ となります。
v2.patch と v3.patch と v4.patch
これは pythonのモジュールのインポート について。
:ここはpre : / @INC_LINK NAME=foo_12.html todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] dl ---- h2 バージョン13 (dl) これまた自分ではあまり使いませんが、dlタグ。 ulタグに習い、dlモード期間中は、字下げで区別するようにします。 preモードのように、モード期間中の最低の字下げ数を調べて、をれを基準に。 最低字下げ数の行はdtタグに。 そうでなければddタグに。 空行が出てくると、dtかddのタグを打ち直します。 @INC_LINK NAME=v13.patch pre $ cat v13.patch | patch -p1 / 確認用のデータ [[foo_13.txt]] pre $ diff -u foo_12.txt foo_13.txt --- foo_12.txt 2019-09-30 01:42:26.000000000 +0900 +++ foo_13.txt 2019-09-30 15:37:25.641863000 +0900 @@ -164,5 +164,40 @@ 改行を入れてみると 長い文字列\n「こんちには 世界(^_^)\nこんちには(^_^)\n世界(^_^)\nfoo=こんちには \nbar=世界(^_^)\nこんちには(^_^)\n世界(^_^)\nfoo=こんちには」\nの場合 +p + dlをためす + +dl + int + 整数 + float + 実数 + complex + 複素数 + +p +あるいは + +dl + +int + + 整数 + + 割込 + +float + + 実数 + + 浮遊 + (飲物の中のアイスクリーム?) + +complex + + 複素数 + + 劣等感 + pre ここはpre / 実行してみます。 pre $ ./ezmd.py < foo_13.txt : - foo=こんちには」 - br: / - の場合 - p: - dlをためす - dl: - dt: - int - dd: - 整数 - dt: - float - dd: - 実数 - dt: - complex - p: - あるいは - dl: - dt: - int - dd: - 整数 - dd: - 割込 - dt: - float - dd: - 実数 - dd: - 浮遊 - (飲物の中のアイスクリーム?) - dt: - complex - dd: - 複素数 - pre: | ここはpre / 大丈夫そうですね。 pre $ ./to_html.py foo_head.yaml foo_13.txt > foo_13.html $ nkf -u foo_13.html : foo=こんちには」
の場合dlをためす
あるいは
ここはpre : / : dl int 整数 float 実数 complex 複素数 p あるいは dl int 整数 割込 float 実数 浮遊 (飲物の中のアイスクリーム?) complex 複素数 劣等感 p : @INC_LINK NAME=foo_13.html todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] table ---- [[name|c_v14]] h2 バージョン14 (table) tableタグ、全部サポートすると果てしなさそうなので、自分が使いそうな機能だけ対応してみます。 まだスタイルシートが定着して無い頃、 ページのレイアウトにtableタグが入れ子で使われるといった乱用がはびこっていたため、 個人的には、今だにtableタグにあまり良い印象はありません。 そんな事もあり、以前はtableタグに頼らずに ul [[ http://kondoh.html.xdomain.jp/txtbl.html | 簡単なテキストの表組みツール (C言語) ]] [[ http://kondoh.html.xdomain.jp/txtblcnt.html | TXTBLCNT (簡単なテキストの表組みツールのためのさらなるツール) ]] p などと、テーブルをテキストで描画するツールを作り [[ http://kondoh.html.xdomain.jp/midi.html | SMFを読み込み音の波形データを作るプログラム (C言語) ]] などで [[ http://kondoh.html.xdomain.jp/midi.html#smf_outline | SMFの構造概略 ]] などとpre タグで表示しておりました。 例えばこのように。 pre +--------+------------------+--------+-------------------------------------------------------------+ | 分類 | 種別 |データ長| 内容 | +--------+------------------+--------+-------------------------------------------------------------+ |ヘッダ |ID |4バイト |"MThd" アスキー・コード 'M','T','h','d' の 4バイト | | +------------------+--------+-------------------------------------------------------------+ | |サイズ |4バイト |以降のヘッダのバイト数をビッグエンディアンで格納 | | | | |ヘッダの場合は値6固定なので、00,00,00,06 の4バイト | | +------------------+--------+-------------------------------------------------------------+ | |フォーマットタイプ|2バイト |値0, 1, 2 のいづれかをビッグエンディアンで格納 | | | | |ここではフォーマットタイプ 0 の SMF のみ扱うので、 | | | | |00,00 の2バイト | | +------------------+--------+-------------------------------------------------------------+ | |トラック数 |2バイト |トラック数をビッグエンディアンで格納 | | | | |フォーマットタイプが0の場合は、トラック数は1固定なので、 | | | | |00,01 の2バイト | | +------------------+--------+-------------------------------------------------------------+ | |時間分解能 |2バイト |四分音符の分割数をビッグエンディアンで格納 | | | | |四分音符1つをここで指定した値で分割した長さが、時間の最小単位| | | | |ただし1バイト目の最上位ビットが'1'の場合は、別の扱いとなる | | | | |ここでは1バイト目の最上位ビットが'0'のSMFのみを扱う | +--------+------------------+--------+-------------------------------------------------------------+ |トラック|ID |4バイト |"MTrk" アスキー・コード 'M','T','r','k' の 4バイト | | +------------------+--------+-------------------------------------------------------------+ | |サイズ |4バイト |以降のトラックのバイト数をビッグエンディアンで格納 | | +------------------+--------+-------------------------------------------------------------+ | |デルタタイム |可変長 | | | +------------------+--------+-------------------------------------------------------------+ | |イベント |可変長 | | | +------------------+--------+-------------------------------------------------------------+ | |デルタタイム |可変長 | | | +------------------+--------+-------------------------------------------------------------+ | |イベント |可変長 | | | +------------------+--------+-------------------------------------------------------------+ | | : | | +------------------+--------+-------------------------------------------------------------+ | |デルタタイム |可変長 | | | +------------------+--------+-------------------------------------------------------------+ | |イベント |可変長 | | +--------+------------------+--------+-------------------------------------------------------------+ / ですが、見ての通り末尾が揃いません。(T_T) 等幅フォントとはいえ、ASCIIのフォントと日本語のフォントの幅は異なります。 そして、ツールは日本語のフォントの幅が、ASCIIのフォントの幅の2倍になっている事を期待しています。 あきらめて、簡単な範囲でtableタグに対応しておきます。 h3 基本の仕様 できるだけシンプルに。 'tbl'だけの行でtblモードに。 tblモード中は ul 空行や空白文字だけの行は無視。 有効な1行がテーブルの1行のtrタグに相当します。 テーブルの1行はYAMLの { 'tr': xxx } を経て HTMLのxxx に変換。 1行の中は基本的にddタグ。 文字列中に '|' が現れるとddタグの打ち直し。 p 例えば pre tbl foo|bar|hoge 1 |2 |3 4 |5 |6 / で tbl foo|bar|hoge 1 |2 |3 4 |5 |6 p となるように。 h3 セルの中の文字列が長い場合 横に長過ぎるテキストも何なので... ul,liタグと同様に、行末が'\'の行は次行と結合の扱いとします。 例えば pre tbl foo|bar|hoge aaaaaaaaaaaaaaaa | \ bbbbbbbbbbbbbbbb | \ cccccccccccccccc 4 |5 |6 / で tbl foo|bar|hoge aaaaaaaaaaaaaaaa | \ bbbbbbbbbbbbbbbb | \ cccccccccccccccc 4 |5 |6 p となるように。 h3 文字列中に'|'を含めたい場合 '\|' でエスケープします。 例えば pre tbl foo|bar|hoge 1 |2\|-2|3 4 |5 |6\|7 / で tbl foo|bar|hoge 1 |2\|-2|3 4 |5 |6\|7 p となるように。 h3 thタグにしたい場合 行の開始はデフォルトはtdタグですが、 タグの打ち直しのときに、 '|'の代わりに2つ連続の'||'を使って仕切ると、 以降thタグへと切り替わる事にします。 再度'||'で仕切るとtdタグに戻ります。 行の先頭や末尾に'|'をつけても無視しますが、 '||'で始まっている場合はthタグから開始となります。 例えば、行の先頭と末尾に'|'を追加して pre tbl |foo|bar|hoge| |1 |2 |3 | |4 |5 |6 | / としても tbl |foo|bar|hoge| |1 |2 |3 | |4 |5 |6 | p と変わらず。 ここで pre tbl ||foo|bar|hoge| | 1 |2 |3 | | 4 |5 |6 | / などとすると tbl ||foo|bar|hoge| | 1 |2 |3 | | 4 |5 |6 | p 先頭行がこのようにthに。 さらに pre tbl ||foo|bar|hoge| ||1 ||2 |3 | ||4 ||5 |6 | / などとすると tbl ||foo|bar|hoge| ||1 ||2 |3 | ||4 ||5 |6 | p 先頭のカラムもthに。 h3 セルの結合 th, tdタグのcolspan, rowspanを指定できるようにします。 セルの仕切り '|' あるいは '||' の直後に、スペースを入れずに 'c'あるいは'r'の1文字が続き、 さらにスペースを入れずに10進文字列が続く場合に、 そのセルにcolspanあるいはrowspanの指定を追加します。 colspanかrowspanのどちらかしか指定できない仕様ですが、 まぁ自分としてはこれで十分という事で。 pre tbl ||foo |c2 bar|hoge| ||1 ||2 |3 |4 | ||r2 4||5 |6 |7 | | a |b |c | ||d ||e |f |g | / などとすると tbl ||foo |c2 bar|hoge| ||1 ||2 |3 |4 | ||r2 4||5 |6 |7 | | a |b |c | ||d ||e |f |g | p このように。 h3 セルの中の対応タグ pタグ、ulタグ、dlタグと同じ扱いで do_str() を使っているので、 a (href)タグのリンク、brタグの改行が使えるはずです。 pre tbl ||foo |c2 bar|hoge| ||1 ||2 |3 |4 | ||r2 4||5 |6 |7 | | a |b |c | ||d ||e |f |g | ||z || hoge\nfuga | [[v14.patch]] |\ [[http://kondoh.html.xdomain.jp/index.html \| トップページ ]] | / などとすると tbl ||foo |c2 bar|hoge| ||1 ||2 |3 |4 | ||r2 4||5 |6 |7 | | a |b |c | ||d ||e |f |g | ||z || hoge\nfuga | [[v14.patch]] |\ [[http://kondoh.html.xdomain.jp/index.html \| トップページ ]] | p このように @INC_LINK NAME=v14.patch pre $ cat v14.patch | patch -p1 / 確認用のデータ [[foo_14.txt]] pre $ diff -u foo_13.txt foo_14.txt --- foo_13.txt 2019-09-30 15:37:25.000000000 +0900 +++ foo_14.txt 2019-09-30 21:40:43.000000000 +0900 @@ -199,5 +199,48 @@ 劣等感 +p +table + +tbl + +foo|bar|hoge +1|2|3 +4|5|6 + +p +table th + +tbl +||foo|bar|hoge +1|2|3 +4|5|6 + +p +table th2 + +tbl +||foo||bar|hoge +||1||2|3 +||4||5|6 + +p +table colspan + +tbl + +||foo||c2 bar|hoge +||1||2|3|4 +||4||5|c2 6 + +p +table rowspan + +tbl + +||foo||r2 bar|hoge +||1||3 +||4||5|6 + pre ここはpre / 実行してみます。 pre $ ./ezmd.py < foo_14.txt : - dd: - 劣等感 - p: - table - table border="1" cellspacing="0": - tr: - td: foo - td: bar - td: hoge - tr: - td: '1' - td: '2' - td: '3' - tr: - td: '4' - td: '5' - td: '6' - p: - table th - table border="1" cellspacing="0": - tr: - th: foo - th: bar - th: hoge - tr: - td: '1' - td: '2' - td: '3' - tr: - td: '4' - td: '5' - td: '6' - p: - table th2 - table border="1" cellspacing="0": - tr: - th: foo - td: bar - td: hoge - tr: - th: '1' - td: '2' - td: '3' - tr: - th: '4' - td: '5' - td: '6' - p: - table colspan - table border="1" cellspacing="0": - tr: - th: foo - td colspan="2": bar - td: hoge - tr: - th: '1' - td: '2' - td: '3' - td: '4' - tr: - th: '4' - td: '5' - td colspan="2": '6' - p: - table rowspan - table border="1" cellspacing="0": - tr: - th: foo - td rowspan="2": bar - td: hoge - tr: - th: '1' - td: '3' - tr: - th: '4' - td: '5' - td: '6' - pre: | ここはpre / 大丈夫そうですね。 pre $ ./to_html.py foo_head.yaml foo_14.txt > foo_14.html $ nkf -u foo_14.html :
table
foo | bar | hoge |
1 | 2 | 3 |
4 | 5 | 6 |
table th
foo | bar | hoge |
---|---|---|
1 | 2 | 3 |
4 | 5 | 6 |
table th2
foo | bar | hoge |
---|---|---|
1 | 2 | 3 |
4 | 5 | 6 |
table colspan
foo | bar | hoge | |
---|---|---|---|
1 | 2 | 3 | 4 |
4 | 5 | 6 |
table rowspan
foo | bar | hoge |
---|---|---|
1 | 3 | |
4 | 5 | 6 |
ここはpre