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 py23str

Python2とPython3での日本語文字列対応について

毎回、同じようにつまづいて、同じような感じで対応してます。

なので、いいかげん自分に判りやすいようにまとめておきます。

日本語対応といっても、ソースコード中に日本語を書くつもりはありません。

データはYAML形式のファイルで用意。

そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 毎回「うぅっ」とうなってます。

結論

日本語を含む文字列処理で .foramt() や .join() を使いたい

Python2 では日本語を含む文字列は .encode('utf-8')して UTF-8 で保持。

Python3 では日本語の有無に関係なく、素直にstrのままでよし。

日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい

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 py23str

Python2とPython3での日本語文字列対応について

毎回、同じようにつまづいて、同じような感じで対応してます。

なので、いいかげん自分に判りやすいようにまとめておきます。

日本語対応といっても、ソースコード中に日本語を書くつもりはありません。

データはYAML形式のファイルで用意。

そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 毎回「うぅっ」とうなってます。

結論

日本語を含む文字列処理で .foramt() や .join() を使いたい

Python2 では日本語を含む文字列は .encode('utf-8')して UTF-8 で保持。

Python3 では日本語の有無に関係なく、素直にstrのままでよし。

日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい

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

Python2とPython3での日本語文字列対応について

毎回、同じようにつまづいて、同じような感じで対応してます。

なので、いいかげん自分に判りやすいようにまとめておきます。

日本語対応といっても、ソースコード中に日本語を書くつもりはありません。

データはYAML形式のファイルで用意。

そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 毎回「うぅっ」とうなってます。

結論

日本語を含む文字列処理で .foramt() や .join() を使いたい

Python2 では日本語を含む文字列は .encode('utf-8')して UTF-8 で保持。

Python3 では日本語の有無に関係なく、素直にstrのままでよし。

日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい

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 / こうなって ul 標準入力からYAML形式のテキストを読み込み yaml.load()でテキストをデータに データの文字列2つを ごにょごにょいじって foo + ' ' + bar .format() .join() yaml.dump()でデータをYAML形式のテキストにして 標準出力に書き出し p このように。 ここまでのモードの関連に従うならば、 例えば上記の結果になる元のテキストは pre ul 標準入力からYAML形式のテキストを読み込み yaml.load()でテキストをデータに データの文字列2つを ごにょごにょいじって foo + ' ' + bar .format() .join() yaml.dump()でデータを \ YAML形式のテキストにして 標準出力に書き出し / こうありたい。 ulモード中では、行頭の字下げの数で「入れ子」の指示になるという仕様で、 何とか考えてみました。 @INC_LINK NAME=v3.patch pre $ cat v3.patch | patch -p1 / @INC_LINK NAME=foo_3.txt 実行してみます。 pre $ ./ezmd.py < foo_3.txt : - p: - ここはp - ul: - li /: 標準入力からYAML形式のテキストを読み込み - li /: yaml.load()でテキストをデータに - li /: データの文字列2つを - li /: ごにょごにょいじって - ul: - li /: foo + ' ' + bar - li /: .format() - li /: .join() - li /: yaml.dump()でデータをYAML形式のテキストにして - li /: 標準出力に書き出し - pre: |2 ここはpre / 大丈夫そうですね。 pre $ ./to_html.py foo_head.yaml foo_3.txt > foo_3.html / @INC_LINK NAME=foo_3.html todo ul { s: h1, h2, h3, ... } { s: p } { s: pre } { s: ul, li } a (href) hr img video s ---- h2 バージョン4 (a (href)タグ) ul a (href) p 追加してみます。 自分のa href="xxx"タグの使い方を振り返ると、 ほとんどpタグの中かulタグの中です。 なのでとりあえず、pモードとulモードの文字列処理の箇所だけに、対応を入れてみます。 a (href)の場合、トップレベルのモードを遷移させるまでもなさそうです。 pre 文字列中に [[ xxx | yyy ]] の記載があれば YAML形式の - a href="xxx": yyy を経て HTML形式で yyy に 文字列中に [[ xxx ]] の記載があれば YAML形式の - a href="xxx": xxx } を経て HTML形式で xxx に / このくらいの仕様でやってみます。 @INC_LINK NAME=v4.patch pre $ cat v4.patch | patch -p1 / @INC_LINK NAME=foo_4.txt 実行してみます。 pre $ ./ezmd.py < foo_4.txt : - p: - ここは明示的にp - p: - a href="v2.patch": v2.patch - p: - バージョン2のための - a href="v2.patch": パッチ - となります。 - p: - a href="http://kondoh.html.xdomain.jp/ezhtml/index.html": 簡易なHTMLパーサ 2018秋 - p: - これは - a href="http://kondoh.html.xdomain.jp/p3d/index.html#v3_import": pythonのモジュールのインポート - について。 - pre: | ここはpre p ここもpre h1 ここもpre - ul: - li /: a href="v2.patch": v2.patch - li /: a href="v3.patch": v3.patch - li /: - バージョン2のための - a href="v2.patch": パッチ - となります。 - li /: - これは - a href="http://kondoh.html.xdomain.jp/p3d/index.html#v3_import": pythonのモジュールのインポート - について。 - p: - ここはp / 大丈夫そうですね。 pre $ ./to_html.py foo_head.yaml foo_4.txt > foo_4.html / @INC_LINK NAME=foo_4.html todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] hr img video s ---- h2 バージョン5 (hrタグ) ul hr p 追加してみます。 複数のハイフンだけの行が現れると、横線に変換する事にしてみます。 ハイフン2つだけとかなら他に何か意味ありそうなので、 一応4個以上の場合に有効とします。 自分のhrタグの使用箇所は、そのほとんどが pre - p: { hr: / } / 経ての pre


/ として使ってます。 ハイフン4個以上の行が複数行続く場合も、その行数の横線になるように。 横線指示の直後にモード指定が無い場合は、 デフォルトのモード'p'として扱う事にします。 @INC_LINK NAME=v5.patch pre $ cat v5.patch | patch -p1 / @INC_LINK NAME=foo_5.txt 実行してみます。 pre $ ./ezmd.py < foo_5.txt : - 毎回「うぅっ」とうなってます。 - p: hr: / - h2: 結論 : - p: - Python2 の世界には .buffer は存在しないので注意。 - p: hr: / - pre: | $ cat p2.py #!/usr/bin/env python2 : - p: - ここはp - p: - '---' - p: hr: / - p: hr: / - p: - ここは暗黙のp - h3: ここはh3--- - p: hr: / - p: hr: / - p: - '---' - p: - ここはp - ul: - li /: 標準入力からYAML形式のテキストを読み込み : / 大丈夫そうですね。 pre $ ./to_html.py foo_head.yaml foo_5.txt > foo_5.html / @INC_LINK NAME=foo_5.html todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] img video s ---- h2 バージョン6 (img,videoタグ) ul img video p 追加してみます。 img, video ともに自分で使うときのパターンはほぼお決まりで、 a (href)タグと似たようなものです。 なので仕様もa (href)タグと同じような感じにします。 a (href)タグ同様に、pモードとulモードの文字列処理の箇所だけに、対応を入れます。 pre 文字列中に [[ img | xxx ]] の記載があれば YAML形式の - img srcf="xxx": / を経て HTML形式で に 文字列中に [[ video | xxx ]] の記載があれば YAML形式の - video src="xxx" controls playsinline: "" を経て HTML形式で に / 形式をa (href)タグの場合と合わせたので、 a (href)タグの箇所をちょっと改造するだけの対応になります。 @INC_LINK NAME=v6.patch pre $ cat v6.patch | patch -p1 / @INC_LINK NAME=foo_6.txt 実行してみます。 pre $ ./ezmd.py < foo_6.txt : - 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 は存在しないので - img src="beat.jpg": / - 注意。 : - ul: - li /: a href="v2.patch": v2.patch - li /: a href="v3.patch": v3.patch - li /: - バージョン2のための - a href="v2.patch": パッチ - となります。 - li /: - これは - a href="http://kondoh.html.xdomain.jp/p3d/index.html#v3_import": pythonのモジュールのインポート - について。 - li /: img src="beat.jpg": / - li /: video src="cut.mp4" controls playsinline: '' - p: - ここはp : - p: - ここはp - p: - video src="http://kondoh2.html.xdomain.jp/rt/out_v44/fix_1.mp4" controls playsinline: '' - ul: - li /: 標準入力からYAML形式のテキストを読み込み / 大丈夫そうですね。 pre $ ./to_html.py foo_head.yaml foo_6.txt > foo_6.html / @INC_LINK NAME=foo_6.html todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] s 目次機能 ---- h2 バージョン7 (sタグ) ul s p 追加してみます。 sタグは「打ち消し線」の指定です。 これまた a (href)タグ同様に、pモードとulモードの文字列処理の箇所だけの対応で。 形式も強引にa (href)タグに合わせてしまいます。(^_^; pre 文字列中に [[ - | xxx ]] の記載があれば YAML形式の - s: xxx を経て HTML形式で xxx に / 形式を強引にもa (href)タグの場合と合わせたので、 変更箇所は驚くほど軽微です。 @INC_LINK NAME=v7.patch pre $ cat v7.patch | patch -p1 / @INC_LINK NAME=foo_7.txt 実行してみます。 pre $ ./ezmd.py < foo_7.txt : - p: - そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 - 毎回 - s: 「うぅっ」 - 「ぬはぁ」とうなってます。 - p: hr: / : - ul: - li /: 標準入力からYAML形式のテキストを読み込み - li /: yaml.load()でテキストをデータに - li /: s: データの文字列2つを - li /: ごにょごにょいじって : / 大丈夫そうですね。 pre $ ./to_html.py foo_head.yaml foo_7.txt > foo_7.html / @INC_LINK NAME=foo_7.html todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] 目次機能 ---- [[name|c_v8]] h2 バージョン8 目次機能 目次を自動生成する機能を追加してみます。 さすがにこの機能は2 passになります。 ul 1 passめで、h1, h2, h3, ... のヘッダタグの情報を集めます。 2 passめで、目次挿入場所に、作成した目次を貼り付けていきます。 p 'index'だけの行が現れると目次モード。 そこから他のモードになるまでの区間に目次を挿入します。 目次モード中の箇所に、目次作成のためのパラメータを指定します。 pre index パラメータ / パラメータは、目次にするヘッダタグの種別の範囲を指定します。 範囲指定はPythonのリストのスライスの指定のようにします。 pre index 2:5 / lst[2:5] なので目次にする対象は h2, h3, h4 pre index 3: / lst[3:] なので、目次にする対象は h3, h4, .... pre index :3 / lst[:3] なので、目次にする対象は h1, h2 pre index / パラメータの指定がなければ lst[:] 扱いで、全てのヘッダタグを対象にします。 目次の形式は、ヘッダタグの階層に従って ulタグの入れ子の構成にします。 ulタグの処理は既に実装してるので、 ヘッダの番号に応じて字下げしたテキストデータを作り、 ulタグとして処理すれば楽チンですね。 @INC_LINK NAME=v8.patch pre $ cat v8.patch | patch -p1 / @INC_LINK NAME=foo_8.html pre $ cat foo_8.txt : そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 毎回[[ - |「うぅっ」]] 「ぬはぁ」とうなってます。 ---- index ---- p 2: の場合 index 2: ---- p :4 の場合 index :4 ---- p 2:3 の場合 index 2:3 ---- p 2 の場合 index 2 ---- p 3 の場合 index 3 ---- h2 結論 / 実行してみます。 pre $ ./ezmd.py < foo_8.txt : - p: - そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 - 毎回 - s: 「うぅっ」 - 「ぬはぁ」とうなってます。 - p: hr: / - ul: - li /: a href="#c_1_0": Python2とPython3での日本語文字列対応について - ul: - li /: a href="#c_2_1": 結論 - ul: - li /: a href="#c_3_2": 日本語を含む文字列処理で .foramt() や .join() を使いたい - li /: a href="#c_3_3": 日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい - li /: a href="#c_3_4": ここはh3--- - p: hr: / - p: - '2: の場合' - ul: - li /: a href="#c_2_1": 結論 - ul: - li /: a href="#c_3_2": 日本語を含む文字列処理で .foramt() や .join() を使いたい - li /: a href="#c_3_3": 日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい - li /: a href="#c_3_4": ここはh3--- - p: hr: / - p: - :4 の場合 - ul: - li /: a href="#c_1_0": Python2とPython3での日本語文字列対応について - ul: - li /: a href="#c_2_1": 結論 - ul: - li /: a href="#c_3_2": 日本語を含む文字列処理で .foramt() や .join() を使いたい - li /: a href="#c_3_3": 日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい - li /: a href="#c_3_4": ここはh3--- - p: hr: / - p: - 2:3 の場合 - ul: - li /: a href="#c_2_1": 結論 - p: hr: / - p: - 2 の場合 - ul: - li /: a href="#c_2_1": 結論 - p: hr: / - p: - 3 の場合 - ul: - li /: a href="#c_3_2": 日本語を含む文字列処理で .foramt() や .join() を使いたい - li /: a href="#c_3_3": 日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい - li /: a href="#c_3_4": ここはh3--- - p: hr: / - h2: a name="c_2_1": 結論 / さすがにこれは、パッとみて大丈夫かどうか分かりかねますね。 pre $ ./to_html.py foo_head.yaml foo_8.txt | tee foo_8.html | nkf -u :

そして、YAML形式データファイル中の文字列を、UTF-8で日本語に置き換えようとして、 毎回 「うぅっ」 「ぬはぁ」とうなってます。



2: の場合


:4 の場合


2:3 の場合


2 の場合


3 の場合


結論

: / むー、まぁ、百聞は一見にしかず @INC_LINK NAME=foo_8.html 大丈夫そうですね。 todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] headタグのtitleを何とかする ---- h2 バージョン9 headタグのtitleを何とかする 自分ではいつもheadタグには日本語は書かないので、 ここは安易に @INC_LINK NAME=v9.patch pre $ cat v9.patch | patch -p1 / 実行してみます。 pre $ ./to_html.py Usage: ./to_html.py head.yaml body.txt [title] $ ./to_html.py foo_head.yaml foo_8.txt | grep title py23str $ ./to_html.py foo_head.yaml foo_8.txt 'sample page' | grep title sample page $ ./to_html.py foo_head.yaml foo_8.txt 'sample page' > foo_9.html / OK @INC_LINK NAME=foo_9.html todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] バグ修正や調整など ---- h2 バージョン10 バグ修正や調整など h3 まずは不具合の修正 色々試してみて不具合でました。 ulタグの処理前に、字下げの絡みで行の結合をする箇所。 pre def esc_join(lst): res = [] for s in lst: if res and res[-1] and res[-1][-1] == '\\': t = res[-1][:-1] res[-1] = strip_tail(t) + strip_head(s) else: res.append(s) return res / res[-1]が空文字列''の場合に、''[-1]になってアクセスでエラーが出る事がありました。 pre - if res and res[-1][-1] == '\\': + if res and res[-1] and res[-1][-1] == '\\': / な修正をしておきます。 h3 調整 次の調整を入れておきます。 ul 行末のスペースやタブは予め削除しておく preモード中で余分な字下げは取っておく / @INC_LINK NAME=v10.patch pre $ cat v10.patch | patch -p1 / h3 お試し では満を持して、このページ自身もこの仕様のテキストで書いてみましょう。 [[ head.yaml ]] [[ index.ez.txt ]] このテキストファイルから pre $ ./to_html.py head.yaml index.ez.txt ezmd > index.html / [[ index.html ]] となります。 (再帰だ〜) todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] br dl ---- h2 バージョン11 コードの見直しと調整 コードを見直してみて、ちょっとした修正や調整をしました。 修正確認用に[[index.ez.txt]] の時の結果のHTMLを [[index.ez.html]] として置いておきます。 pre $ cp index.html index.ez.html / @INC_LINK NAME=v11.patch pre $ cat v11.patch | patch -p1 $ ./to_html.py head.yaml index.ez.txt ezmd | diff -u index.ez.html - $ / 動作的に変化なしでOK。 todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] br dl ---- h2 バージョン12 (br) 改行のbrタグはあまり使わないのですが、 たまーに使う場面がでてくるので対応してみます。 使うとしたらpモード中や、ulモード中。 となると、a (href) のときのコードの箇所 pre def do_str(s): # a href (h, t) = ('[[', ']]') (ih, it) = list( map( lambda p: s_idx(s, p), (h, t) ) ) if 0 <= ih and ih < it: s3 = lst_strip( ( s[:ih], s[ih+len(h):it], s[it+len(t):] ) ) m = s3[1] if m: (v1, v2) = lst_strip( m.split('|') ) if '|' in m else (m, m) s3[1] = do_v1v2(v1, v2) return from_lst( cut_empty(s3) ) return s / ここに追加すれば良さそう... と、、、この a (href) のコード、、、 よく見ると1つの行に2個以上のアンカーに対応できてないのでは? pre $ echo hello | ./ezmd.py - p: - hello $ echo hello [[foo]] | ./ezmd.py - p: - hello - a href="foo": foo $ echo hello [[foo]] hoge [[bar]] | ./ezmd.py - p: - hello - a href="foo": foo - hoge [[bar]] / やっぱり! brタグの対応を入れつつ、この不具合も直しておきます。 brタグ仕様は、文字列中の '\\' + 'n' を見つけると、 { 'br': '/' } を経ての
という事で。 @INC_LINK NAME=v12.patch pre $ cat v12.patch | patch -p1 / まず、複数のアンカー対応の確認から pre $ echo hello | ./ezmd.py - p: - hello $ echo hello [[foo]] | ./ezmd.py - p: - hello - a href="foo": foo $ echo hello [[foo]] hoge [[bar]] | ./ezmd.py - p: - hello - a href="foo": foo - hoge - a href="bar": bar / OK。 つづいてbrの改行の確認を。 確認用のデータ [[foo_12.txt]] pre $ cat v12.patch | patch -p1 $ diff -u foo_8.txt foo_12.txt --- foo_8.txt 2019-09-27 13:23:29.000000000 +0900 +++ foo_12.txt 2019-09-30 01:42:26.000000000 +0900 @@ -53,6 +53,12 @@ Python3 では日本語の有無に関係なく、素直にstrのままでよし。 + (改行を入れてみると) + Python2 では日本語を含む文字列は\n .encode('utf-8')して UTF-8 で保持。 + + Python3\n では日本語の有無に関係なく、\n素直にstrのままでよし。\n + ここは改行の直後 + h3 日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい @@ -94,6 +100,8 @@ バージョン2のための[[ v2.patch | パッチ ]] となります。 + [[v2.patch]] と [[v3.patch]] と [[v4.patch]] + [[http://kondoh.html.xdomain.jp/ezhtml/index.html | 簡易なHTMLパーサ 2018秋]] これは[[http://kondoh.html.xdomain.jp/p3d/index.html#v3_import | pythonのモジュールのインポート]]について。 @@ -109,6 +117,10 @@ ul [[v2.patch]] [[v3.patch]] +[[v2.patch]] [[v3.patch]] + [[v2.patch]] + [[v3.patch]] + [[v2.patch]] [[v3.patch]] バージョン2のための[[ v2.patch | パッチ ]] となります。 これは[[http://kondoh.html.xdomain.jp/p3d/index.html#v3_import | pythonのモジュールのインポート]]について。 [[ img | beat.jpg ]] @@ -148,6 +160,9 @@ yaml.dump()でデータを \ YAML形式のテキストにして 標準出力に書き出し + 長い文字列「こんちには 世界(^_^)こんちには(^_^)世界(^_^)foo=こんちには bar=世界(^_^)こんちには(^_^)世界(^_^)foo=こんちには」の場合 + 改行を入れてみると + 長い文字列\n「こんちには 世界(^_^)\nこんちには(^_^)\n世界(^_^)\nfoo=こんちには \nbar=世界(^_^)\nこんちには(^_^)\n世界(^_^)\nfoo=こんちには」\nの場合 pre ここはpre / 実行してみます。 pre $ ./ezmd.py < foo_12.txt : - p: - Python3 では日本語の有無に関係なく、素直にstrのままでよし。 - p: - (改行を入れてみると) - Python2 では日本語を含む文字列は - br: / - ' .encode(''utf-8'')して UTF-8 で保持。' - p: - Python3 - br: / - ' では日本語の有無に関係なく、' - br: / - 素直にstrのままでよし。 - br: / - ここは改行の直後 - h3: a name="c_3_3": 日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい : - p: - バージョン2のための - a href="v2.patch": パッチ - となります。 - p: - a href="v2.patch": v2.patch - と - a href="v3.patch": v3.patch - と - a href="v4.patch": v4.patch - p: - a href="http://kondoh.html.xdomain.jp/ezhtml/index.html": 簡易なHTMLパーサ 2018秋 - p: - これは - a href="http://kondoh.html.xdomain.jp/p3d/index.html#v3_import": pythonのモジュールのインポート - について。 : - ul: - li /: a href="v2.patch": v2.patch - li /: a href="v3.patch": v3.patch - li /: - a href="v2.patch": v2.patch - a href="v3.patch": v3.patch - ul: - li /: a href="v2.patch": v2.patch - li /: a href="v3.patch": v3.patch - li /: - a href="v2.patch": v2.patch - a href="v3.patch": v3.patch - li /: - バージョン2のための - a href="v2.patch": パッチ - となります。 - li /: - これは - a href="http://kondoh.html.xdomain.jp/p3d/index.html#v3_import": pythonのモジュールのインポート - について。 - li /: img src="beat.jpg": / : - li /: yaml.dump()でデータをYAML形式のテキストにして - li /: 標準出力に書き出し - li /: 長い文字列「こんちには 世界(^_^)こんちには(^_^)世界(^_^)foo=こんちには bar=世界(^_^)こんちには(^_^)世界(^_^)foo=こんちには」の場合 - li /: 改行を入れてみると - li /: - 長い文字列 - br: / - 「こんちには 世界(^_^) - br: / - こんちには(^_^) - br: / - 世界(^_^) - br: / - 'foo=こんちには ' - br: / - bar=世界(^_^) - br: / - こんちには(^_^) - br: / - 世界(^_^) - br: / - foo=こんちには」 - br: / - の場合 - pre: | ここはpre / p 大丈夫そうですね。 pre $ ./to_html.py foo_head.yaml foo_12.txt > foo_12.html $ nkf -u foo_12.html :

Python3 では日本語の有無に関係なく、素直にstrのままでよし。

(改行を入れてみると) Python2 では日本語を含む文字列は
.encode('utf-8')して UTF-8 で保持。

Python3
では日本語の有無に関係なく、
素直にstrのままでよし。
ここは改行の直後

日本語を含むUTF-8のテキストを標準入力、標準出力で扱いたい

:

バージョン2のための パッチ となります。

v2.patchv3.patchv4.patch

簡易なHTMLパーサ 2018秋

これは 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をためす

int
整数
float
実数
complex

あるいは

int
整数
割込
float
実数
浮遊 (飲物の中のアイスクリーム?)
complex
複素数
ここは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
/ 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 p : @INC_LINK NAME=foo_14.html todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] ---- [[name|c_v15]] h2 バージョン15 タグ情報のデータ形式変更 ulのリストからtableへ変換を少し試してみてたのですが、、、 本ezmd.pyが出力するYAML形式は、 [[http://kondoh.html.xdomain.jp/ezhtml/index.html | 簡易なHTMLパーサ 2018秋]] が受け付けるける形式です。 基本的に辞書のリストですが、 辞書の長さは1に限定し、タグのプロパティ情報は辞書のキーの文字列に含めています。 この冗長というか特殊な形式に従って、内部でタグ情報を保持しているので、 プログラムからタグのプロパティ情報を変更しようとすると、面倒で骨が折れます。 pre tag_new(name, prop, v) / dl name タグの名前 prop プロパティの辞書 v タグの値 p を導入して、空クラスをベースにしたクラスインスタンスに置き換える事にします。 自分が多用する空クラスのスタイルについては [[http://kondoh.html.xdomain.jp/pac/index.html#closure_empty_class | クロージャと空クラス]] を参照 そして最後にYAML形式でdumpする直前に、 これまでと同じ形式にまとめて変換するようにしました。 @INC_LINK NAME=v15.patch pre $ cat v15.patch | patch -p1 / これまでのテキストデータで確認してみます。 pre $ ./to_html.py foo_head.yaml foo_14.txt | diff -u foo_14.html - $ $ ./to_html.py head.yaml index.ez.txt ezmd | diff -u index.ez.html - $ / OK propを辞書にしたので、 プロパティ指定の順番が変わる可能性がありましたが、 運良く一致してます。(^_^)v todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] ulからtableへの変換 ---- h2 バージョン16 もう少しコード見直し 次の一手を容易にするため、もうちょっと整理しておきます。 h3 モード遷移しつつ行を処理するパターン ul 複数行を上から調べてバッファに行を溜めていって... モード遷移したと判定したところで、溜った行に対して処理関数を実行。 全部の行を調べ終ったところで、\ 行が溜ってたら最後に処理関数を実行。 p このパターンの処理。 pre buf_loop_new(buf, is_call, func) / にまとめてみました。 h3 行末エスケープで次行と結合 仕様はそのままですが、解りにくそうな実装だったので、 再帰を使って書き直してみました。 (解り易すくなったかどうか疑問ですが...) @INC_LINK NAME=v16.patch pre $ cat v16.patch | patch -p1 / 確認を。 pre $ ./to_html.py head.yaml index.ez.txt ezmd | diff -u index.ez.html - $ $ ./to_html.py foo_head.yaml foo_14.txt | diff -u foo_14.html - | nkf -u :
  • -
  • +
  • ここはp

    :

    table rowspan

    - +
    foo
    / 前回は完全一致でしたが、今回はプロパティの指定順が変わってしまいました。 辞書の順番は変わり得るのでOK ---- h2 バージョン17 ulからtableへの変換 大分類、中分類、小分類の3階層くらいの箇条書の内容を「表」にしたもの。 良く見かけます。 例えば 箇条書 ul 挨拶 朝 おはよう ちぃーっす 昼 こんにちは ちぃーっす 夜 こんばんわ ちぃーっす 出発 出 いってきます ほな 送 いってらっしゃい 帰宅 帰 ただいま ただいまもどりました 迎 おかえり おかえりあそばせ p 表になると tbl |r6 挨拶 |r2 朝 | おはよう | ちいーっす |r2 昼 | こんにちは | ちいーっす |r2 夜 | こんばんわ | ちいーっす |r3 出発 |r2 出 | いってきます | ほな | 送 | いってらっしゃい |r4 帰宅 |r2 帰 | ただいま | ただいまもどりました |r2 迎 | おかえり | おかえりあそばせ p 前者のままで良い気もするのですが、 見栄えにこだわって、何でもエクセルで表にする悪しき文化の影響なのか、何なのか... 前者のソースは pre ul 挨拶 朝 おはよう ちぃーっす 昼 こんにちは ちぃーっす 夜 こんばんわ ちぃーっす 出発 出 いってきます ほな 送 いってらっしゃい 帰宅 帰 ただいま ただいまもどりました 迎 おかえり おかえりあそばせ / すなおな木構造。 それに対し後者は pre tbl |r6 挨拶 |r2 朝 | おはよう | ちいーっす |r2 昼 | こんにちは | ちいーっす |r2 夜 | こんばんわ | ちいーっす |r3 出発 |r2 出 | いってきます | ほな | 送 | いってらっしゃい |r4 帰宅 |r2 帰 | ただいま | ただいまもどりました |r2 迎 | おかえり | おかえりあそばせ / セルの行方向の結合rowspanに相当する'|r値'の箇所の調整が、えぐいです。 こういうややこしい事は機械に任せるべきでしょう。 tblモードの中で、ulモードの形式を扱えるように対応してみます。 h3 tblモードの中のローカル・モード tblモード中に ul テーブル・オリジナル・モード (tbl_org) テーブル・ulモード (tbl_ul) p の2つのローカル・モードを設けます。 特に指定がなければ、従来通りのテーブル・オリジナル・モード。 文字列 "tbl_ul" だけの行が現れると、以降はテーブル・ulモード。 テーブル・ulモードでは、ulモードの形式を受け付けます。 文字列 "tbl_org" だけの行が現れると、以降はテーブル・オリジナル・モードに戻ります。 tbl_orgやtbl_ulを行き来した結果の複数の表は、 結合して1つの表にまとめるようにします。 @INC_LINK NAME=v17.patch pre $ cat v17.patch | patch -p1 / [[foo_17.txt]] pre $ diff -u foo_14.txt foo_17.txt --- foo_14.txt 2019-09-30 21:40:43.000000000 +0900 +++ foo_17.txt 2019-10-02 15:21:09.963512000 +0900 @@ -242,5 +242,111 @@ ||1||3 ||4||5|6 +p +箇条書 + +ul + 挨拶 + 朝 + おはよう + ちぃーっす + 昼 + こんにちは + ちぃーっす + 夜 + こんばんわ + ちぃーっす + 出発 + 出 + いってきます + ほな + 送 + いってらっしゃい + 帰宅 + 帰 + ただいま + ただいまもどりました + 迎 + おかえり + おかえりあそばせ + +p +表 + +tbl + |r6 挨拶 |r2 朝 | おはよう + | ちいーっす + |r2 昼 | こんにちは + | ちいーっす + |r2 夜 | こんばんわ + | ちいーっす + |r3 出発 |r2 出 | いってきます + | ほな + | 送 | いってらっしゃい + |r4 帰宅 |r2 帰 | ただいま + | ただいまもどりました + |r2 迎 | おかえり + | おかえりあそばせ + +p + tbl_ulモード + +tbl +tbl_ul + 挨拶 + 朝 + おはよう + ちぃーっす + 昼 + こんにちは + ちぃーっす + 夜 + こんばんわ + ちぃーっす + 出発 + 出 + いってきます + ほな + 送 + いってらっしゃい + 帰宅 + 帰 + ただいま + ただいまもどりました + 迎 + おかえり + おかえりあそばせ + +p + tbl_orgとtbl_ulの結合 + +tbl + ||種別|状況|セリフ + +tbl_ul + 挨拶 + 朝 + おはよう + ちぃーっす + 昼 + こんにちは + ちぃーっす + 夜 + こんばんわ + ちぃーっす + 出発 + 出 + いってきます + ほな + 送 + いってらっしゃい + 帰宅 + 帰 + ただいま + ただいまもどりました + 迎 + おかえり + おかえりあそばせ + pre ここはpre / 実行してみます。 pre $ ./ezmd.py < foo_17.txt : - p: - 箇条書 - ul: - li /: 挨拶 - ul: - li /: 朝 - ul: - li /: おはよう - li /: ちぃーっす - li /: 昼 - ul: - li /: こんにちは - li /: ちぃーっす - li /: 夜 - ul: - li /: こんばんわ - li /: ちぃーっす - li /: 出発 - ul: - li /: 出 - ul: - li /: いってきます - li /: ほな - li /: 送 - ul: - li /: いってらっしゃい - li /: 帰宅 - ul: - li /: 帰 - ul: - li /: ただいま - li /: ただいまもどりました - li /: 迎 - ul: - li /: おかえり - li /: おかえりあそばせ - p: - 表 - table cellspacing="0" border="1": - tr: - td rowspan="6": 挨拶 - td rowspan="2": 朝 - td: おはよう - tr: - td colspan="3": ちいーっす - tr: - td rowspan="2": 昼 - td colspan="2": こんにちは - tr: - td colspan="3": ちいーっす - tr: - td rowspan="2": 夜 - td colspan="2": こんばんわ - tr: - td colspan="3": ちいーっす - tr: - td rowspan="3": 出発 - td rowspan="2": 出 - td: いってきます - tr: - td colspan="3": ほな - tr: - td: 送 - td colspan="2": いってらっしゃい - tr: - td rowspan="4": 帰宅 - td rowspan="2": 帰 - td: ただいま - tr: - td colspan="3": ただいまもどりました - tr: - td rowspan="2": 迎 - td colspan="2": おかえり - tr: - td colspan="3": おかえりあそばせ - p: - tbl_ulモード - table cellspacing="0" border="1": - tr: - td rowspan="6": 挨拶 - td rowspan="2": 朝 - td: おはよう - tr: - td colspan="3": ちぃーっす - tr: - td rowspan="2": 昼 - td colspan="2": こんにちは - tr: - td colspan="3": ちぃーっす - tr: - td rowspan="2": 夜 - td colspan="2": こんばんわ - tr: - td colspan="3": ちぃーっす - tr: - td rowspan="3": 出発 - td rowspan="2": 出 - td: いってきます - tr: - td colspan="3": ほな - tr: - td: 送 - td colspan="2": いってらっしゃい - tr: - td rowspan="4": 帰宅 - td rowspan="2": 帰 - td: ただいま - tr: - td colspan="3": ただいまもどりました - tr: - td rowspan="2": 迎 - td colspan="2": おかえり - tr: - td colspan="3": おかえりあそばせ - p: - tbl_orgとtbl_ulの結合 - table cellspacing="0" border="1": - tr: - th: 種別 - th: 状況 - th: セリフ - tr: - td rowspan="6": 挨拶 - td rowspan="2": 朝 - td: おはよう - tr: - td colspan="3": ちぃーっす - tr: - td rowspan="2": 昼 - td colspan="2": こんにちは - tr: - td colspan="3": ちぃーっす - tr: - td rowspan="2": 夜 - td colspan="2": こんばんわ - tr: - td colspan="3": ちぃーっす - tr: - td rowspan="3": 出発 - td rowspan="2": 出 - td: いってきます - tr: - td colspan="3": ほな - tr: - td: 送 - td colspan="2": いってらっしゃい - tr: - td rowspan="4": 帰宅 - td rowspan="2": 帰 - td: ただいま - tr: - td colspan="3": ただいまもどりました - tr: - td rowspan="2": 迎 - td colspan="2": おかえり - tr: - td colspan="3": おかえりあそばせ - pre: | ここはpre / 確かにソースのテキストが pre +p +表 + +tbl + |r6 挨拶 |r2 朝 | おはよう + | ちいーっす + |r2 昼 | こんにちは + | ちいーっす + |r2 夜 | こんばんわ + | ちいーっす + |r3 出発 |r2 出 | いってきます + | ほな + | 送 | いってらっしゃい + |r4 帰宅 |r2 帰 | ただいま + | ただいまもどりました + |r2 迎 | おかえり + | おかえりあそばせ / のときの出力箇所 pre - p: - 表 - table cellspacing="0" border="1": - tr: - td rowspan="6": 挨拶 - td rowspan="2": 朝 - td: おはよう - tr: - td colspan="3": ちいーっす - tr: - td rowspan="2": 昼 - td colspan="2": こんにちは - tr: - td colspan="3": ちいーっす - tr: - td rowspan="2": 夜 - td colspan="2": こんばんわ - tr: - td colspan="3": ちいーっす - tr: - td rowspan="3": 出発 - td rowspan="2": 出 - td: いってきます - tr: - td colspan="3": ほな - tr: - td: 送 - td colspan="2": いってらっしゃい - tr: - td rowspan="4": 帰宅 - td rowspan="2": 帰 - td: ただいま - tr: - td colspan="3": ただいまもどりました - tr: - td rowspan="2": 迎 - td colspan="2": おかえり - tr: - td colspan="3": おかえりあそばせ / と pre +p + tbl_ulモード + +tbl +tbl_ul + 挨拶 + 朝 + おはよう + ちぃーっす + 昼 + こんにちは + ちぃーっす + 夜 + こんばんわ + ちぃーっす + 出発 + 出 + いってきます + ほな + 送 + いってらっしゃい + 帰宅 + 帰 + ただいま + ただいまもどりました + 迎 + おかえり + おかえりあそばせ / のときの出力箇所 pre - p: - tbl_ulモード - table cellspacing="0" border="1": - tr: - td rowspan="6": 挨拶 - td rowspan="2": 朝 - td: おはよう - tr: - td colspan="3": ちぃーっす - tr: - td rowspan="2": 昼 - td colspan="2": こんにちは - tr: - td colspan="3": ちぃーっす - tr: - td rowspan="2": 夜 - td colspan="2": こんばんわ - tr: - td colspan="3": ちぃーっす - tr: - td rowspan="3": 出発 - td rowspan="2": 出 - td: いってきます - tr: - td colspan="3": ほな - tr: - td: 送 - td colspan="2": いってらっしゃい - tr: - td rowspan="4": 帰宅 - td rowspan="2": 帰 - td: ただいま - tr: - td colspan="3": ただいまもどりました - tr: - td rowspan="2": 迎 - td colspan="2": おかえり - tr: - td colspan="3": おかえりあそばせ / 一致してます。OK pre $ ./to_html.py foo_head.yaml foo_17.txt > foo_17.html $ cat foo_17.html | nkf -u :

    箇条書

    • 挨拶
        • おはよう
        • ちぃーっす
      • 昼 :
    foo bar hoge
    1 おかえり
    おかえりあそばせ
    ここはpre
    
    / : tbl_orgとtbl_ulの結合 tbl ||種別|状況|セリフ tbl_ul 挨拶 朝 おはよう ちぃーっす 昼 こんにちは ちぃーっす 夜 こんばんわ ちぃーっす 出発 出 いってきます ほな 送 いってらっしゃい 帰宅 帰 ただいま ただいまもどりました 迎 おかえり おかえりあそばせ p : @INC_LINK NAME=foo_17.html うまく動作して嬉しいので、他にも木構造を表にする例をば。 h3 動物の分類 テキスト pre 肺 恒温 胎生 哺乳類 卵 鳥類 変温 卵 爬虫類 えら、肺 変温 卵 両生類 えら 変温 卵 魚類 / 箇条書 ul 肺 恒温 胎生 哺乳類 卵 鳥類 変温 卵 爬虫類 えら、肺 変温 卵 両生類 えら 変温 卵 魚類 p 表 tbl tbl_ul 肺 恒温 胎生 哺乳類 卵 鳥類 変温 卵 爬虫類 えら、肺 変温 卵 両生類 えら 変温 卵 魚類 p 頭にヘッダの表を追加 pre tbl || 動物の分類の仕方 || 呼吸 | 体温 | 子の増やし方 | 分類 tbl_ul 肺 恒温 胎生 哺乳類 : / tbl || 動物の分類の仕方 || 呼吸 | 体温 | 子の増やし方 | 分類 tbl_ul 肺 恒温 胎生 哺乳類 卵 鳥類 変温 卵 爬虫類 えら、肺 変温 卵 両生類 えら 変温 卵 魚類 h3 TXTBLのときの例の表 [[ http://kondoh.html.xdomain.jp/txtbl.html | 簡単なテキストの表組みツール (C言語) ]] や [[ http://kondoh.html.xdomain.jp/txtblcnt.html | TXTBLCNT (簡単なテキストの表組みツールのためのさらなるツール) ]] の表です。 今となっては思い出深いこの形式の表。 2000年代の中頃、某メーカーのガラケーの開発に関わっていた時に、 ワードで嫌という程書かされました。 シャープの桂さん、元気かな〜\n (あ、言っちゃった) tbl ||関数名||int foo_send(const unsigned char *buf, unsigned bytes) ||説明 ||データ送信開始 |引数 ||項番 |仮引数名| 型 | 説明 |1 |buf |const unsigned char *|送信するデータの先頭アドレス |2 |bytes |unsigned |送信するデータのバイト数(最大4096*9=36Kバイトまで指定可能) |返却値 ||項番 |型 | 説明 tbl_ul 1 int 0 FOO_OK 正常終了 <0 FOOO_EINVAL パラメータの値が異常である FOO_EBUSY 現在送信中である FOO_EIO エラーが検出された FOO_ETIMEDOUT タイムアウト発生 前提\n\ FOOドライバが初期化されていること。すでに送信中でないこと。\n\ 結果\n\ 指定した長さのデータが、送信開始される。送信の完了はドライバ状態の通知を利用すること。\n\ 概略説明\n\ 指定されたデータを、DMA送信バッファにコピーして、送信を開始する。 p ソースのテキストは pre tbl ||関数名||int foo_send(const unsigned char *buf, unsigned bytes) ||説明 ||データ送信開始 |引数 ||項番 |仮引数名| 型 | 説明 |1 |buf |const unsigned char *|送信するデータの先頭アドレス |2 |bytes |unsigned |送信するデータのバイト数(最大4096*9=36Kバイトまで指定可能) |返却値 ||項番 |型 | 説明 tbl_ul 1 int 0 FOO_OK 正常終了 <0 FOOO_EINVAL パラメータの値が異常である FOO_EBUSY 現在送信中である FOO_EIO エラーが検出された FOO_ETIMEDOUT タイムアウト発生 前提\n\ FOOドライバが初期化されていること。すでに送信中でないこと。\n\ 結果\n\ 指定した長さのデータが、送信開始される。送信の完了はドライバ状態の通知を利用すること。\n\ 概略説明\n\ 指定されたデータを、DMA送信バッファにコピーして、送信を開始する。 / h3 midiのときの表 冒頭で紹介した [[ http://kondoh.html.xdomain.jp/midi.html#smf_outline | SMFの構造概略 ]] の表で試してみましょう。 tbl ||分類|種別|データ長|内容 tbl_ul ヘッダ ID 4バイト "MThd" アスキー・コード 'M','T','h','d' の 4バイト サイズ 4バイト 以降のヘッダのバイト数をビッグエンディアンで格納\n\ ヘッダの場合は値6固定なので、00,00,00,06 の4バイト フォーマットタイプ 2バイト 値0, 1, 2 のいづれかをビッグエンディアンで格納\n\ ここではフォーマットタイプ 0 の SMF のみ扱うので、\n\ 00,00 の2バイト トラック数 2バイト トラック数をビッグエンディアンで格納\n\ フォーマットタイプが0の場合は、トラック数は1固定なので、\n\ 00,01 の2バイト 時間分解能 2バイト 四分音符の分割数をビッグエンディアンで格納\n\ 四分音符1つをここで指定した値で分割した長さが、時間の最小単位\n\ ただし1バイト目の最上位ビットが'1'の場合は、別の扱いとなる\n\ ここでは1バイト目の最上位ビットが'0'のSMFのみを扱う トラック ID 4バイト "MTrk" アスキー・コード 'M','T','r','k' の 4バイト サイズ 4バイト 以降のトラックのバイト数をビッグエンディアンで格納 デルタタイム 可変長 - イベント 可変長 - デルタタイム 可変長 - イベント 可変長 - : デルタタイム 可変長 - イベント 可変長 - p ソースのテキストは pre tbl ||分類|種別|データ長|内容 tbl_ul ヘッダ ID 4バイト "MThd" アスキー・コード 'M','T','h','d' の 4バイト サイズ 4バイト 以降のヘッダのバイト数をビッグエンディアンで格納\n\ ヘッダの場合は値6固定なので、00,00,00,06 の4バイト フォーマットタイプ 2バイト 値0, 1, 2 のいづれかをビッグエンディアンで格納\n\ ここではフォーマットタイプ 0 の SMF のみ扱うので、\n\ 00,00 の2バイト トラック数 2バイト トラック数をビッグエンディアンで格納\n\ フォーマットタイプが0の場合は、トラック数は1固定なので、\n\ 00,01 の2バイト 時間分解能 2バイト 四分音符の分割数をビッグエンディアンで格納\n\ 四分音符1つをここで指定した値で分割した長さが、時間の最小単位\n\ ただし1バイト目の最上位ビットが'1'の場合は、別の扱いとなる\n\ ここでは1バイト目の最上位ビットが'0'のSMFのみを扱う トラック ID 4バイト "MTrk" アスキー・コード 'M','T','r','k' の 4バイト サイズ 4バイト 以降のトラックのバイト数をビッグエンディアンで格納 デルタタイム 可変長 - イベント 可変長 - デルタタイム 可変長 - イベント 可変長 - : デルタタイム 可変長 - イベント 可変長 - / こうして試してみると、機能の不足が見えてきますね。 ul 字下げでカラムの位置を示した上で、\ 空欄のセルが描けるように、空白を指定したい。 同じような事だが、セルの中で文字列の先頭に複数の空白を含めれるようにしたい。 tbl_ulモードはtdタグのみなので、thタグも指定できるようにしたい。 p todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] tblのセルの中の文字列で、先頭に複数の空白を含めたい tbl_ulモードでthタグも a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい ---- h2 バージョン18 a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい この不具合をやっつけておきます。 まず現状の不具合を確認。 pre $ echo [[foo]] [[foo]] $ echo [[foo]] | ./ezmd.py - p: - a href="foo": foo $ echo '[[foo|bar]]' [[foo|bar]] $ echo '[[foo|bar]]' | ./ezmd.py - p: - a href="foo": bar $ echo '[[foo|bar|]]' | ./ezmd.py Traceback (most recent call last): : File "./ezmd.py", line 136, in f = lambda i: cvs[i]( s3[i] ) File "./ezmd.py", line 132, in mcv (v1, v2) = lst_strip( s.split('|') ) if '|' in s else (s, s) ValueError: too many values to unpack $ echo '[[foo||bar]]' | ./ezmd.py Traceback (most recent call last): : File "./ezmd.py", line 136, in f = lambda i: cvs[i]( s3[i] ) File "./ezmd.py", line 132, in mcv (v1, v2) = lst_strip( s.split('|') ) if '|' in s else (s, s) ValueError: too many values to unpack / 文字列sに複数の'|'が含まれていると、 要素数3以上のlistが返って、(v1, v2)でunpackのエラー。 delim_pop()を追加して対応してみます。 pre def delim_pop(s, delim): f = lambda lst: ( lst[0], delim.join( lst[1:] ) ) return f( s.split(delim) ) / dl s 文字列 delmi 区切り文字列 返り値 sにdelimが含まれていると、 (最初のdelimまでの文字列, 最初のdelimを除く以降の文字列) のtupleを返す。 sにdelimが含まれていないと、 (s, '')を返す。(popという事で) p @INC_LINK NAME=v18.patch pre $ cat v18.patch | patch -p1 / 改善の確認を。 pre $ echo [[foo]] | ./ezmd.py - p: - a href="foo": foo $ echo '[[foo|bar]]' | ./ezmd.py - p: - a href="foo": bar $ echo '[[foo|bar|]]' | ./ezmd.py - p: - a href="foo": bar| $ echo '[[foo||bar]]' | ./ezmd.py - p: - a href="foo": '|bar' / 他に悪い影響出てないか確認を。 pre $ ./to_html.py head.yaml index.ez.txt ezmd | diff -u index.ez.html - $ $ ./to_html.py foo_head.yaml foo_17.txt | diff -u foo_17.html - $ / OK という事でページ冒頭の目次で、この章へのアンカーも無事に変換できてます。 todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] tblのセルの中の文字列で、先頭に複数の空白を含めたい tbl_ulモードでthタグも [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] ---- h2 バージョン19 tblのセルの中の文字列で、先頭に複数の空白を含めたい h3 tbl_orgモードの場合 pre $ ./ezmd.py < tbl > a|b|c > EOL - table cellspacing="0" border="1": - tr: - td: a - td: b - td: c $ ./ezmd.py < - table cellspacing="0" border="1": > - tr: > - td: a > - td: ' b' > - td: c > EOL
    a b c
    / @INC_LINK NAME=foo_19_abc.html 現状では、このようなHTMLデータが生成できない訳ですが... 実際にアンカーをクリックして「表」を表示してみても、 特に'b'の前にスペース空いてない様子ですね。 やはりあまり意味ないか。 h3 tbl_ulモードの場合 元々こっちのモードの問題でした。 そもそも空欄のセルが作れない。 さかのぼると、ulモードでの箇条書で空欄の項目が作れない。 pre $ ./ezmd.py < ul > a > > c > EOL - ul: - li /: a - li /: c $ ./ezmd.py < ul > a > '' > c > EOL - ul: - li /: a - li /: '''''' - li /: c / だめ。 ソースコードでは pre def do_mode_ul(buf, res): buf = esc_join(buf) buf = list( filter( lambda s: s.strip(), buf ) ) buf = list( map(idt_cnt, buf) ) # (i, s) : / ulモードの処理の冒頭で、 s.strip()かけて空文字になるような行は、除外してます。 pre - ul: - li /: a - li /: '' - li /: c / から pre $ ./ezhtml.py y < - ul: > - li /: a > - li /: '' > - li /: c > EOL
    • a
    • c
    / なHTMLデータを生成して @INC_LINK NAME=foo_19_ul.html これは意味あります。 そしてこのデータから、空欄セルを含む「表」にしたい。 行頭から字下げの空白の数が意味があって、 次に空欄を意味する何かが欲しい。 安易に'xxx'や"xxx"と、文字列全体を囲うパターンで考えてみると、 ul 'や"で、最も外側で囲ってる場合は、それを外す 文字列中で先頭や末尾以外に'や"を含めたいときは、そのまま含めるとして... 先頭や末尾に'や"を持つ文字列を表現したいときが問題 先頭だけか末尾だけに'や"きてるときは、そのまま含める 先頭と末尾に'や"を含めたい場合 ... p 'や"で、最も外側で囲ってる場合は、それを「1回だけ」外す。 これにしてみますかな。 となると、これは ul pモード ulモード dlモード tblモード p から使ってるdo_str()関数で対応。 pre # # sol : str or lst # def map_sol(f_s_ret_sol, sol): f = lambda o: o if isinstance(o, Empty) else f_s_ret_sol(o) return flat_map(f, sol) if type(sol) == list else f_s_ret_sol(sol) def do_str(sol): # str or list cvs = (do_br, do_a_href) for cv in cvs: sol = map_sol(cv, sol) return sol / ここで最初にdo_out_quoteという変換を追加してみます。 @INC_LINK NAME=v19.patch パッチを適用 pre $ cat v19.patch | patch -p1 / 何と言うか、これだけで目的の空欄のセルについては良さそうです。 動作確認。 pre $ ./ezmd.py < ul > a > '' > c > EOL - ul: - li /: a - li /: '' - li /: c $ ./ezmd.py < ul > a > I'm b > c > EOL - ul: - li /: a - li /: I'm b - li /: c $ ./ezmd.py < ul > a > ' > c > EOL - ul: - li /: a - li /: '''' - li /: c / おや? pre $ ( ./ezmd.py | ./ezhtml.py y ) < ul > a > ' > c > EOL
    • a
    • '
    • c
    / HTML形式は狙い通り。YAML形式の場合、そうなるのか... tbl_ulの場合は pre $ ./ezmd.py < tbl > tbl_ul > a > '' > c > EOL - table cellspacing="0" border="1": - tr: - td colspan="2": a - tr: - td colspan="2": '' - tr: - td colspan="2": c $ ./ezmd.py < tbl > tbl_ul > a > '' > c > '' > d > EOL - table cellspacing="0" border="1": - tr: - td: a - td: '' - td: c - tr: - td colspan="3": '' - tr: - td colspan="3": d / そして、「1回だけ」外す確認を pre $ ./ezmd.py < tbl > tbl_ul > a > '' > "'c'" > EOL - table cellspacing="0" border="1": - tr: - td: a - td: '' - td: '''c''' / おや? pre $ ( ./ezmd.py | ./ezhtml.py y ) < tbl > tbl_ul > a > '' > "'c'" > EOL
    a 'c'
    / やはりHTML形式にすると狙い通り。 (YAML形式のquoteは、少し直感的じゃないのかも) h3 midiのときの表 [[ http://kondoh.html.xdomain.jp/midi.html#smf_outline | SMFの構造概略 ]] の場合 tbl ||分類|種別|データ長|内容 tbl_ul ヘッダ ID 4バイト "MThd" アスキー・コード 'M','T','h','d' の 4バイト サイズ 4バイト 以降のヘッダのバイト数をビッグエンディアンで格納\n\ ヘッダの場合は値6固定なので、00,00,00,06 の4バイト フォーマットタイプ 2バイト 値0, 1, 2 のいづれかをビッグエンディアンで格納\n\ ここではフォーマットタイプ 0 の SMF のみ扱うので、\n\ 00,00 の2バイト トラック数 2バイト トラック数をビッグエンディアンで格納\n\ フォーマットタイプが0の場合は、トラック数は1固定なので、\n\ 00,01 の2バイト 時間分解能 2バイト 四分音符の分割数をビッグエンディアンで格納\n\ 四分音符1つをここで指定した値で分割した長さが、時間の最小単位\n\ ただし1バイト目の最上位ビットが'1'の場合は、別の扱いとなる\n\ ここでは1バイト目の最上位ビットが'0'のSMFのみを扱う トラック ID 4バイト "MTrk" アスキー・コード 'M','T','r','k' の 4バイト サイズ 4バイト 以降のトラックのバイト数をビッグエンディアンで格納 デルタタイム 可変長 '' イベント 可変長 '' デルタタイム 可変長 '' イベント 可変長 '' : デルタタイム 可変長 '' イベント 可変長 '' p ソースのテキストは pre tbl ||分類|種別|データ長|内容 tbl_ul ヘッダ ID 4バイト "MThd" アスキー・コード 'M','T','h','d' の 4バイト : イベント 可変長 '' : デルタタイム 可変長 '' イベント 可変長 '' / 右下の空欄のセルが可能になりました。 で、「先頭に複数の空白」の要望は、 下から3行めの':'の前にスペースをとりたい所から来てます。 todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] tblのセルの中の文字列で、先頭に複数の空白を含めたい tbl_ulモードでthタグも [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] ---- h2 バージョン20 tbl_ulモードでthタグも tbl_orgモードでのthタグ、tdタグの切り替えは「||」だったので、その仕様に寄せておきます。 ul セルの文字列の先頭が「||」のときのみ、そのセルはthタグにします。 その場合、セルに表示する文字列は「||」以降に。 thタグのセルの先頭に「||」を表示したければ、「||||...」で開始。 tdタグのセルの先頭に「||」を表示したければ、、、 「'||...'」とクオートで囲ってもだめです。\n\ ulの段階でクオートは取られてしまうので。 「' ||...'」などと、クオート直後に空白を入れればよさげです。\n\ セルの中の文字列の先頭に空白が入ろうとも、「表」の表示にはほぼ影響ないはずです。 / @INC_LINK NAME=v20.patch pre $ cat v20.patch | patch -p1 / 実行してみます。 pre $ ./ezmd.py < tbl > tbl_ul > foo > ||bar > hoge > |fuga > ||||th > ' ||td' > EOL - table border="1" cellspacing="0": - tr: - td: foo - th: bar - td: hoge - td: '|fuga' - tr: - th colspan="4": '||th' - tr: - td colspan="4": ' ||td' / 大丈夫そうですね。 tbl tbl_ul foo ||bar hoge |fuga ||||th ' ||td' p では例によって h3 midiのときの表 [[ http://kondoh.html.xdomain.jp/midi.html#smf_outline | SMFの構造概略 ]] の場合 tbl tbl_ul ||分類 ||種別 ||データ長 ||内容 ||ヘッダ ID 4バイト "MThd" アスキー・コード 'M','T','h','d' の 4バイト サイズ 4バイト 以降のヘッダのバイト数をビッグエンディアンで格納\n\ ヘッダの場合は値6固定なので、00,00,00,06 の4バイト フォーマットタイプ 2バイト 値0, 1, 2 のいづれかをビッグエンディアンで格納\n\ ここではフォーマットタイプ 0 の SMF のみ扱うので、\n\ 00,00 の2バイト トラック数 2バイト トラック数をビッグエンディアンで格納\n\ フォーマットタイプが0の場合は、トラック数は1固定なので、\n\ 00,01 の2バイト 時間分解能 2バイト 四分音符の分割数をビッグエンディアンで格納\n\ 四分音符1つをここで指定した値で分割した長さが、時間の最小単位\n\ ただし1バイト目の最上位ビットが'1'の場合は、別の扱いとなる\n\ ここでは1バイト目の最上位ビットが'0'のSMFのみを扱う ||トラック ID 4バイト "MTrk" アスキー・コード 'M','T','r','k' の 4バイト サイズ 4バイト 以降のトラックのバイト数をビッグエンディアンで格納 デルタタイム 可変長 '' イベント 可変長 '' デルタタイム 可変長 '' イベント 可変長 '' : デルタタイム 可変長 '' イベント 可変長 '' p ソースのテキストは pre tbl tbl_ul ||分類 ||種別 ||データ長 ||内容 ||ヘッダ ID 4バイト "MThd" アスキー・コード 'M','T','h','d' の 4バイト : ||トラック ID 4バイト "MTrk" アスキー・コード 'M','T','r','k' の 4バイト '' : イベント 可変長 '' : デルタタイム 可変長 '' イベント 可変長 '' / tbl_orgモードなしで、tbl_ulモードだけでthタグ出来てます。 「ヘッダ」「トラック」もthタグに変更してみました。 todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] tblのセルの中の文字列で、先頭に複数の空白を含めたい [[-|tbl_ulモードでthタグも]] [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] a (name) ---- h2 バージョン21 (a (name)) a (name)タグは、「バージョン8 目次機能」の中で、自動生成されて使われてます。 h1,h2,h3,...のタグを生成する箇所で pre $ cat v8.patch : -def do_mode(mode, buf, res): +def do_mode(mode, buf, res, hd_names): if mode in heads: buf = lst_strip(buf) buf = list( filter( lambda s: s!='', buf ) ) s = ''.join(buf) - res.append( { mode: s } ) + (h_i, n) = ( int(mode[1:]), len(hd_names) ) + name = 'c_{}_{}'.format(h_i, n) + res.append( { mode: { 'a name="{}"'.format(name): s } } ) + hd_names.append( (h_i, n, name, s) ) + elif mode == 'p': buf = lst_strip(buf) / このように。 「バージョン15 タグ情報のデータ形式変更」 を経て、この箇所の現在は pre def do_mode(mode, buf, res, hd_names): if mode in heads: buf = lst_strip(buf) buf = cut_empty(buf) s = ''.join(buf) (h_i, n) = ( int(mode[1:]), len(hd_names) ) name = 'c_{}_{}'.format(h_i, n) res.append( tag_new( mode, {}, tag_new('a', {'name': name}, s) ) ) hd_names.append( (h_i, n, name, s) ) / このように。 実際に生成を試すと pre $ ./ezmd.py < h3 > foo > index > EOL - h3: a name="c_3_0": foo - ul: - li /: a href="#c_3_0": foo / この名前 "c_3_0" が自動な訳で、 別の箇所からここへのリンクを張ろうとしても、 生成してみないと判らない... 生成して判っても、さらに編集すると名前が変わるかもしれず、 結局は「使えない」状態... 現にこの章の冒頭で、 「バージョン8 目次機能」へのリンクを張りたかったのですが、 叶わなかった訳です。 ちゃんと明示的に pre yyy / を埋めれるように対応してみます。 a (href)タグの場合は pre テキスト [[v1|v2]] 内部データ ( 'a', {'href': v1}, v2 ) YAML { 'a href="v1"': v2 } HTML v2 / でした。 ul pモード ulモード dlモード tblモード p から使ってるdo_str()関数の対応で、いけるかな? ul,dlモード、「表」の中へとリンクを張るは、まぁないでしょう。 ほぼ、pモードのどこかへのリンクになるという事で。 また、目次のときの使い方のように、 pre v2 / と、v2を抱え込む必要はないのかも知れません。 pre テキスト [[ name | xxx ]] 内部データ ( 'a', {'name: xxx}, '' ) YAML { 'a name="xxx": '' } HTML / とりあえず、この仕様で。 @INC_LINK NAME=v21.patch これだけで済みました。 pre $ cat v21.patch | patch -p1 / 試してみます。 pre $ ./ezmd.py < foo [[name|bar]] hoge > > [[#bar|fuga]] > EOL - p: - foo - a name="bar": '' - hoge - p: - a href="#bar": fuga $ ./ezmd.py < foo [[name|bar]] hoge > > [[#bar|fuga]] > EOL

    foo hoge

    fuga

    / foo [[name|bar]] hoge [[#bar|fuga]] このような感じです。 これで晴れて [[#c_v8|バージョン8 目次機能]] や [[#c_v15|バージョン15 タグ情報のデータ形式変更]] へとリンクが張れました。 todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] tblのセルの中の文字列で、先頭に複数の空白を含めたい [[-|tbl_ulモードでthタグも]] [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] [[-|a (name)]] h1,h2,h3で後に空行あったらデフォルトのpモードに ---- [[name|c_v22]] h2 バージョン22 バッファに出力してからペースト todoの 「tblのセルの中の文字列で、先頭に複数の空白を含めたい」 と関連するか微妙ですが、 ちょいと大きな変更を。 以前に少し、 「表」のtableタグが「入れ子」の構造を可能にしていた事からか、 「ページのレイアウトを整えるため」などと、 本来と違う目的のためにtableタグが乱用された時代があった事を言及しました。 かく言う自分もその昔、 お仕事で組み込み用の小さなブラウザなどを開発してた時に、 tableタグの「入れ子」を使って、 疑似フレーム対応してたような気がします。\n (式神ブラウザ「ヘクトアイ」などと申しておりまして...) 表のセルの中に、h1,h2,h3タグでヘッダをうって、pタグで段落つけて、preタグの内容を、 などと記述したくはありませんが... 表のセルの中に、ulやdlのリストを入れるくらいは、やりたいかも。 それ使うかどうかは別として、そう出来るように作っておいてもいいのかも。 現状では、トップレベルでモードを遷移させつつタグ生成しています。 なので、tblモード中のセルの処理の中で、ulモードに移ることは叶いません。 直接入れ子の記述は出来ませんが、次のような策でいきます。 ul 現在のコードでは、トップレベルのタグは、あるリストへと出力されます。 何らかの仕組みで出力先のリストを切替えれるようにしておいて... ある範囲のタグを、別リストに出力させた後 再び出力先を元のリストに戻して処理を続行します。 「貼り付け」の指定が現れると、別リストの内容を取得して貼り付けます。 h3 仕様 リストの切替え指示はどうするか? swbufモードを追加します。 'swbuf'だけの行が現れるとswbufモードに。 そこから他のモードになるまでの区間で、 切替える先のバッファ名を指定します。 pre swbuf バッファ名 / バッファ名の指定が無ければ、 元のデフォルトの出力先に戻します。 pre sbuf / 「貼り付け」の指示は、例によって「あの形式」で指定します。 pre [[ paste | バッファ名 ]] / で、処理中のデータに、バッファ名のバッファに溜っている内容を貼り付けます。 使い方を誤ると、「何とでも破綻し得る」危険な仕様です。 @INC_LINK NAME=v22.patch pre $ cat v22.patch | patch -p1 / 試してみます。 ul バッファ名 foo に切替え 段落 FOO を出力 デフォルトのバッファに切替え 次の段落を出力 bar バッファ名fooの内容を貼り付けて hoge バッファ名fooの内容を貼り付けただけの段落を出力 pre $ ./ezmd.py < swbuf > foo > p > FOO > swbuf > p > bar [[paste|foo]] hoge > > [[paste|foo]] > EOL - p: - bar - p: - FOO - hoge - p: - p: - FOO / pタグの「入れ子」になってますが、一応意図した通りです。 色々試してみます。 pre p foo swbuf buf_ul ul bar hoge swbuf buf_dl dl bar hoge swbuf p bar tbl foo | [[ paste \| buf_ul ]] [[ paste \| buf_dl ]] p hello tbl tbl_ul foo [[ paste | buf_dl ]] [[ paste | buf_ul ]] p paste buf_ul [[ paste | buf_ul ]] paste buf_dl [[ paste | buf_dl ]] paste buf_dl in ul ul abc [[ paste | buf_dl ]] p paste buf_ul in dl dl abc [[ paste | buf_ul ]] / ul 段落fooを出力 出力先をbuf_ulに切替え uリスト bar, hoge 出力 出力先をbuf_dlに切替え dリスト bar, hoge 出力 出力先をデフォルトに戻して 段落barを出力 テーブル(tbl_org)のセルの中に buf_ulやbuf_dlの内容を貼り付け 段落helloを出力 テーブル(tbl_ul)のセルの中に buf_ulやbuf_dlの内容を貼り付け 次の段落を出力 ''paste buf_ul'' buf_ulを貼り付け 次の段落を出力 ''paste buf_dl'' buf_dlを貼り付け 段落 'paste buf_dl in ul' を出力 uリスト liタグにbuf_dlを貼り付け 段落 'paste buf_ul in dl' を出力 dリスト ddタグにbuf_ulを貼り付け p 結果は ---- foo swbuf buf_ul ul bar hoge swbuf buf_dl dl bar hoge swbuf p bar tbl foo | [[ paste \| buf_ul ]] [[ paste \| buf_dl ]] p hello tbl tbl_ul foo [[ paste | buf_dl ]] [[ paste | buf_ul ]] p paste buf_ul [[ paste | buf_ul ]] paste buf_dl [[ paste | buf_dl ]] paste buf_dl in ul ul abc [[ paste | buf_dl ]] p paste buf_ul in dl dl abc [[ paste | buf_ul ]] ---- 表のセルの中にリストを入れると、 下部にスペースが空いてしまうようです。 その他は意図した通りです。 表のセルの中にpreタグも入るだろうか? pre swbuf buf_aa pre int 123 double 123.445 / swbuf buf_bb dl int 123 double 123.456 swbuf tbl tbl_ul pre [[paste|buf_aa]] dl [[paste|buf_bb]] / swbuf buf_aa pre int 123 double 123.445 / swbuf buf_bb dl int 123 double 123.456 swbuf tbl tbl_ul pre [[paste|buf_aa]] dl [[paste|buf_bb]] p OK 入りました。 では [[ http://kondoh.html.xdomain.jp/txtbl.html | 簡単なテキストの表組みツール (C言語) ]] や\n [[ http://kondoh.html.xdomain.jp/txtblcnt.html | TXTBLCNT (簡単なテキストの表組みツールのためのさらなるツール) ]]\n の表です。 swbuf tblcnt_tail dl 前提 FOOドライバが初期化されていること。すでに送信中でないこと。 結果 指定した長さのデータが、送信開始される。送信の完了はドライバ状態の通知を利用すること。 概略説明 指定されたデータを、DMA送信バッファにコピーして、送信を開始する。 swbuf tbl ||関数名||int foo_send(const unsigned char *buf, unsigned bytes) ||説明 ||データ送信開始 |引数 ||項番 |仮引数名| 型 | 説明 |1 |buf |const unsigned char *|送信するデータの先頭アドレス |2 |bytes |unsigned |送信するデータのバイト数(最大4096*9=36Kバイトまで指定可能) |返却値 ||項番 |型 | 説明 tbl_ul 1 int 0 FOO_OK 正常終了 <0 FOOO_EINVAL パラメータの値が異常である FOO_EBUSY 現在送信中である FOO_EIO エラーが検出された FOO_ETIMEDOUT タイムアウト発生 [[ paste | tblcnt_tail ]] p 末尾のセルの中で、dlタグを使ったバッファから貼ってます。 [[ http://kondoh.html.xdomain.jp/index.html | トップページ ]] からの [[ http://kondoh.html.xdomain.jp/hist.html | 更新履歴 ]] も、 [[ http://kondoh.html.xdomain.jp/hist.txt | 更新履歴用のテキスト ]] から生成するようにしてみました。 todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] tblのセルの中の文字列で、先頭に複数の空白を含めたい [[-|tbl_ulモードでthタグも]] [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] [[-|a (name)]] h1,h2,h3で後に空行あったらデフォルトのpモードに ---- h2 バージョン23 h1,h2,h3で後に空行あったらデフォルトのpモードに ちょっとでも楽をしようと。 例えば自分でテキストを書いてみると pre h2 見出しA p 段落A pre : / 段落B : / なパターンがとても多く。 h1,h2,h3,... で見出しの内容のあと空行があると、 デフォルトpモードに遷移する事にします。 pre h2 見出しA 段落A pre : / 段落B : / や pre h2 見出 し A 段落A pre : / 段落B : / などが可能になります。 @INC_LINK NAME=v23.patch pre $ cat v23.patch | patch -p1 / まずはいつもの動作確認を。 pre $ ./to_html.py head.yaml index.ez.txt ezmd | diff -u index.ez.html - $ / OK pre $ ./ezmd.py < h1 > > foo > bar > > p > hoge > EOL - h1: a name="c_1_0": foobar - p: - hoge / に対して pre $ ./ezmd.py < h1 > > foo > bar > > hoge > EOL - h1: a name="c_1_0": foobar - p: - hoge / OK pre $ ./ezmd.py < h1 > foobar > p > hoge > EOL - h1: a name="c_1_0": foobar - p: - hoge / に対しても pre $ ./ezmd.py < h1 > foobar > > hoge > EOL - h1: a name="c_1_0": foobar - p: - hoge / OK [[index.ez.txt]] から、h1,h2,h3指定の後の省略できる'p'行を削除して確認してみます。 pre $ cp index.ez.txt index.ezz.txt / index.ezz.txt編集 [[index.ezz.txt]] pre $ diff -u index.ez.txt index.ezz.txt | nkf -u --- index.ez.txt 2019-09-27 22:37:18.000000000 +0900 +++ index.ezz.txt 2019-10-06 13:36:18.000000000 +0900 @@ -9,7 +9,6 @@ h2 はじめに -p 以前に [[ http://kondoh.html.xdomain.jp/ezhtml/index.html | 簡易なHTMLパーサ 2018秋 ]] を作成しました。 @@ -150,7 +149,6 @@ h2 headとbody -p [[ foo.yaml ]] の段階で、headとbodyに分かれてます。 @@ -263,7 +261,6 @@ h2 タグ -p おれおれ仕様のツールなので、 自分がよく使うHTMLのタグだけ対応して、 滅多に使わないものは、最後に手動で編集する事にします。 @@ -300,7 +297,6 @@ h2 簡易にモード切り替えで -p [[ foo.txt ]] から [[ foo_body.yaml ]] @@ -398,7 +394,6 @@ h3 h1, h2, h3モード -p 他のモードに切り替わるまでの間の複数行のテキストについて ul @@ -425,7 +420,6 @@ h3 pモード -p 他のモードに切り替わるまでの間の複数行のテキストについて ul @@ -472,7 +466,6 @@ h2 バージョン1 (h,pタグ) -p ではこの仕様で、骨組みのコーディング。 [[ ezmd.py ]] @@ -706,7 +699,6 @@ h3 preモード -p preタグの場合、どこまでがpreタグの中か? 次のモードへの切り替えの判定が微妙です。 @@ -918,7 +910,6 @@ h3 ulモード -p 全体の簡単にするためにモードの開始、終了をトップレベルの状態の遷移だけにしました。 なので、基本的に「入れ子」の構造を諦めてます。 @@ -1583,7 +1574,6 @@ h2 バージョン8 目次機能 -p 目次を自動生成する機能を追加してみます。 さすがにこの機能は2 passになります。 @@ -1846,7 +1836,6 @@ h2 バージョン9 headタグのtitleを何とかする -p 自分ではいつもheadタグには日本語は書かないので、 ここは安易に @@ -1898,7 +1887,6 @@ h3 まずは不具合の修正 -p 色々試してみて不具合でました。 ulタグの処理前に、字下げの絡みで行の結合をする箇所。 @@ -1928,7 +1916,6 @@ h3 調整 -p 次の調整を入れておきます。 ul @@ -1946,7 +1933,6 @@ h3 お試し -p では満を持して、このページ自身もこの仕様のテキストで書いてみましょう。 [[ head.yaml ]] / 削除した'p'行は pre $ wc -l index.ez.txt 1983 index.ez.txt $ wc -l index.ezz.txt 1969 index.ezz.txt $ expr 1983 - 1969 14 / 14行 pre $ ./to_html.py head.yaml index.ezz.txt ezmd | diff -u index.ez.html - $ / OK todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] tblのセルの中の文字列で、先頭に複数の空白を含めたい [[-|tbl_ulモードでthタグも]] [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] [[-|a (name)]] [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] モード遷移のバグ修正 ---- h2 バージョン24 モード遷移の不具合修正 このページの [[ #c_v14|バージョン14 (table) ]] の表示が乱れていました。 先の [[v23.patch]] の next_mode_switch()関数の変更にバグがありました。 例えば pre $ ./ezmd.py < pre > tbl > foo|bar > / > EOL - table border="1" cellspacing="0": - tr: - td: foo - td: bar - tr: - td colspan="2": / / preモードからは'/'行でしかモード遷移しないはずが、 tblモードに移ってしまってます。 修正しておきます。 @INC_LINK NAME=v24.patch pre $ cat v24.patch | patch -p1 / 確認を。 pre $ ./ezmd.py < pre > tbl > foo|bar > / > EOL - pre: | tbl foo|bar / OK そして、いつもの確認も。 pre $ ./to_html.py head.yaml index.ez.txt ezmd | diff -u index.ez.html - $ $ ./to_html.py head.yaml index.ezz.txt ezmd | diff -u index.ez.html - $ / OK todo ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] tblのセルの中の文字列で、先頭に複数の空白を含めたい [[-|tbl_ulモードでthタグも]] [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] [[-|a (name)]] [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] [[-|モード遷移のバグ修正]] プロパティを細かく指定出来るように 打ち消し線以外にも文字列の装飾を ---- h2 バージョン25 タグの属性と文字列の装飾系のタグ todo ul tblのセルの中の文字列で、先頭に複数の空白を含めたい p そのものの対応ではないのですが、 表のサンプルを意図した表示に近づけるべく、 手を入れてみました。 h3 タグのプロパティ(属性)の指定 プロパティは面倒なので、 自分ではあまり指定したくありませんが... 細かく指定可能なように作っておくのは、それはそれで必要かと。 モードの切替え時にプロパティを指定する案もありますが、 例えばtblモードの中では、tr, th, td が多数、入り乱れて生成されるので、 狙ったタグにプロパティの指定を追加するのは困難です。 困った時の ul グローバルな状態を追加して 奥深くから設定し 奥深くから参照する p 頼み。(長い) tag_props という辞書を追加して ここに「現在の」プロパティの辞書を、タグ名ごとに登録します。 do_str()からの登録は例の形式 pre [[ prop | { YAML形式のプロパティの辞書 } ]] / でtag_props全体に上書きで登録します。 pre [[ prop | {} ]] [[ prop ]] / ならtag_propsクリア。 tag_new()関数から、tag_propsを参照。 作成するタグ名のプロパティが見つかれば、 そのプロパティ辞書をベースにして、 引数のプロパティを追加、上書きして使用します。 h3 そしてここで「落し穴」 tblモードのローカル・モードtbl_ulでは、 一旦liタグを含むulタグを生成してから、 まとめてtable, tr, th, tdタグに変換します。 tblモードでプロパティの指定をしたかったのですが、 この仕様を素直に使ってる限り、 ul, liタグの段階までしかプロパティが指定できません。 liタグがth, tdタグへと変換されるので、 liタグの段階で、th, tdタグに指定したいプロパティを指定するという、 強引な解決にしておきます。 h3 内部処理で設定してたプロパティは引き継がないように さらにややこしい事に、 変換処理中にliタグには、 内部的に'sub_ul'というプロパティを追加して使っていました。 liタグからth, tdタグに変換する際には、 この'sub_ul'以外のプロパティだけを、引き継がせるようにしました。 また、liタグはデフォルトで終了タグなしにするため、 内部的に'/'というプロパティを持たせてます。 これをそのままth, tdタグが引き継ぐと、終了タグが消えてしまいます。 ilタグからプロパティ'/'は、引き継がないように。\n (ああ、ややこしい) h3 さらに「落し穴」 [[ prop | xxx ]] 指定行は、奥深くで状態を変更するだけで、 それ自体は何も表示する物を生成しません。 li, tr, th, tdタグを生成する箇所で、 空リスト[]を値にしたタグを生成するケースが出てしまい、 意図しない不要な空行などが表示されたりしました。 map()関数の処理を、手製のflat_map()関数に置き換えて、 リスト要素の空リストを消すように、 場当たり的に対処してみました。 h3 文字列の装飾系のタグ ここまでは、自分でよく使う「打ち消し線」だけ対応してました。 pre [[ - | xxx ]] / で pre YAML形式 { s: xxx } / で pre HTML形式 xxx / ul 強調(em) 強い強調(strong) アンダーライン(u) イタリック(i) ボールド(b) p についても同じような「手間」なので、 まとめて対応を入れておきます。 pre 打ち消し線 [[ s | xxx ]] [[ - | xxx ]] 強調(イタリック?) [[ em | xxx ]] [[ * | xxx ]] 強い強調(太字?) [[ strong | xxx ]] [[ ** | xxx ]] 下線(アンダーライン) [[ u | xxx ]] [[ _ | xxx ]] 斜体(イタリック) [[ i | xxx ]] [[ / | xxx ]] 太字(ボールド) [[ b | xxx ]] / h3 パッチ @INC_LINK NAME=v25.patch pre $ cat v25.patch | patch -p1 / h3 まずはデグレしてないか確認 pre $ ./to_html.py head.yaml index.ezz.txt ezmd | diff -u index.ez.html - $ $ rm -rf ttt ; mkdir ttt ; cd ttt $ wget http://kondoh.html.xdomain.jp/ezmd/index.txt $ wget http://kondoh.html.xdomain.jp/ezmd/index.html $ mv index.txt ../index-v24.txt $ mv index.html ../index-v24.html $ cd .. ; rm -rf ttt $ ./to_html.py head.yaml index-v24.txt ezmd | diff -u index-v24.html - $ / OK h3 表のセルのalignプロパティお試し tbl abcdefghijklmnopqrstuvwxyz foo|\ [[prop\| {td: {align: center}} ]] \ bar|\ [[prop\| {td: {align: right}} ]] \ hoge|\ [[prop]] tbl_ul foo [[prop| {li: {align: center}} ]] bar [[prop| {li: {align: right}} ]] hoge [[prop]] tbl_org foo [[prop\| {td: {align: center}} ]] bar [[prop\| {td: {align: right}} ]] hoge [[prop]] tbl_ul foo [[prop| {li: {align: center}} ]] bar [[prop| {li: {align: right}} ]] hoge [[prop]] h3 文字列の装飾系のタグお試し pre [[s|打ち消し]] [[-|打ち消し]] [[em|強調]] [[*|強調]] [[strong|強い強調]] [[**|強い強調]] [[u|下線]] [[_|下線]] [[i|斜体]] [[/|斜体]] [[b|太字]] / [[s|打ち消し]] [[-|打ち消し]] [[em|強調]] [[*|強調]] [[strong|強い強調]] [[**|強い強調]] [[u|下線]] [[_|下線]] [[i|斜体]] [[/|斜体]] [[b|太字]] ul [[s|打ち消し]] [[-|打ち消し]] [[em|強調]] [[*|強調]] [[strong|強い強調]] [[**|強い強調]] [[u|下線]] [[_|下線]] [[i|斜体]] [[/|斜体]] [[b|太字]] tbl tbl_ul [[s|打ち消し]] [[-|打ち消し]] [[em|強調]] [[*|強調]] [[strong|強い強調]] [[**|強い強調]] [[u|下線]] [[_|下線]] [[i|斜体]] [[/|斜体]] [[b|太字]] p [[ex_tbl.txt]] pre $ ./to_html.py head.yaml ex_tbl.txt ex_tbl > ex_tbl.html / @INC_LINK NAME=ex_tbl.html todoの 「tblのセルの中の文字列で、先頭に複数の空白を含めたい」 は、「済」にしておきます。;-p) swbuf todo_buf_25 ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] [[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]] [[-|tbl_ulモードでthタグも]] [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] [[-|a (name)]] [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] [[-|モード遷移のバグ修正]] [[-|プロパティを細かく指定出来るように]] [[-|打ち消し線以外にも文字列の装飾を]] 折り畳み swbuf p [[detail| todo | todo_buf_25]] ---- h2 バージョン26 折り畳み details, summaryタグの「折り畳み」機能を [[ http://kondoh.html.xdomain.jp/index.html | トップページ ]] に使ってみたく。 対応してみます。 h3 仕様 HTML pre
    label (detail contents)
    / YAML pre - details: - summary: label - (detail contents) / という事なので、例によってあの形式を使います。 detail contens は、 swbufで出力先を切替えて溜め込んだデータを、 ペーストする事でしのぎます。 pre [[ details | summaryラベル | 貼り付けるバッファ名 ]] / h3 パッチ @INC_LINK NAME=v26.patch pre $ cat v26.patch | patch -p1 / h3 お試し pre $ ./ezmd.py < swbuf > buf-1 > p > foo > ul > bar > hoge > swbuf > p > [[detail | fuga | buf-1]] > EOL - p: - details: - summary: fuga - p: - foo - ul: - li /: bar - li /: hoge $ cat tmp.yaml | ./ezhtml.py

    fuga

    foo

    • bar
    • hoge

    / OK swbuf buf-1 p foo ul bar hoge swbuf p [[detail | fuga | buf-1]] 多分影響ないはずですが、いちおう従来の確認を。 pre $ ./to_html.py head.yaml index.ezz.txt ezmd | diff -u index.ez.html - $ $ ./to_html.py head.yaml index-v24.txt ezmd | diff -u index-v24.html - $ / OK では早速 todo にも swbuf todo_buf_26 ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] [[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]] [[-|tbl_ulモードでthタグも]] [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] [[-|a (name)]] [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] [[-|モード遷移のバグ修正]] [[-|プロパティを細かく指定出来るように]] [[-|打ち消し線以外にも文字列の装飾を]] [[-|折り畳み]] 例の形式の入れ子 swbuf p [[detail| todo | todo_buf_26]] ---- [[name|c_v27]] h2 バージョン27 例の形式の入れ子 h3 例の形式 はじめはa (href)タグのリンクのために用意した「例の形式」ですが pre [[ foo | bar ]] / 画像や動画用に転用 pre [[ img | URL ]] [[ video | URL ]] / テキストの装飾にも pre [[ - | foo bar ]] [[ _ | foo bar ]] [[ / | foo bar ]] / バッファからの貼り付け pre [[ paste | バッファ名 ]] / プロパティの設定 pre [[ prop | { li: { align: center } } ]] / 折り畳みのsummary detailタグのための記述 pre [[ detail | ラベル | バッファ名 ]] / もう「何でもあり」になってます。 '|' 以降の箇所に、さらにこの形式の入れ子で使いたいですが... pre [[ v1 | [[ va | vb ]] ]] / 適当に安易に組んでるので、現状ではそれは叶いません。 pre def do_a_href(s): (h, t) = ('[[', ']]') (ih, it) = list( map( lambda p: s_idx(s, p), (h, t) ) ) if 0 <= ih and ih < it: s3 = lst_strip( ( s[:ih], s[ih+len(h):it], s[it+len(t):] ) ) def mcv(s): (v1, v2) = lst_strip( delim_pop(s, '|') ) if '|' in s else (s, s) return do_v1v2(v1, v2) cvs = ( (lambda s: s), mcv, do_a_href ) f = lambda i: cvs[i]( s3[i] ) return from_lst( cut_empty( flat_map( f, range(3) ) ) ) return s / do_str()から呼び出される、このdo_a_ref()での処理がネストしない前提になってます。 この関連を何とかして、ネスト可能に持っていってみます。 h3 仕様 pre [[ detail | label | バッファ名 ]] / の箇所を拡張します。 detailのバッファ名の位置が文字列でない場合は、出力バッファを参照せずに、 直接その文字列以外の値を「detail」の内容として扱います。 h3 パッチ @INC_LINK NAME=v27.patch pre $ cat v27.patch | patch -p1 / 変更箇所が多いです。 とりあえず動くようにだけ目指したので、かなり汚してしまったかも。 もっとシンプルに実装出来る気がするのですが... h3 デグレなし確認 まずは以前と同じ動作か確認。 pre $ ./to_html.py head.yaml index.ezz.txt ezmd | diff -u index.ez.html - $ $ ./to_html.py head.yaml index-v24.txt ezmd | diff -u index-v24.html - $ $ ./to_html.py head.yaml index-v26.txt ezmd | diff -u index-v26.html - $ $ ./to_html.py head.yaml ex_tbl.txt ex_tbl | diff -u ex_tbl.html - | nkf -u --- ex_tbl.html 2019-10-07 18:07:10.000000000 +0900 +++ - 2019-10-09 23:08:53.000000000 +0900 @@ -19,7 +19,7 @@

    表のサンプル

    midiのときの表

    SMFの構造概略

    - +
    分類
    @@ -74,7 +74,7 @@ - + @@ -86,7 +86,7 @@

    簡単なテキストの表組みツール (C言語)
    TXTBLCNT (簡単なテキストの表組みツールのためのさらなるツール)

    -
    分類 種別 データ長 内容
    イベント 可変長
    :
    :
    デルタタイム 可変長
    +
    関数名
    / 最後のは環境の違いによるもので、 辞書の順番の違いで、プロパティの指定順が入れ替わってます。 これは想定内でOK h3 例の形式の入れ子のお試し pre $ ./ezmd.py < [[foo| [[bar|hoge]] ]] > EOL - p: - a href="foo": a href="bar": hoge $ ./ezmd.py < [[detail| label | [[img|foo]] ]] > EOL - p: - details: - summary: label - img src="foo": / $ ./ezmd.py < [[detail| [[img|foo]] | [[img|bar]] ]] > EOL - p: - details: - summary: - img src="foo": / - img src="bar": / / 一応、思惑通り。 果たしてHTMLで、label が画像とかできるのだろうか? [[detail| foo | [[img| beat.jpg]] ]] [[detail| [[img| beat.jpg]] | [[video| cut.mp4]] ]] [[detail| bar | hoge / [[#c_v8|バージョン8 目次機能]] / fuga / [[#c_v15|バージョン15 タグ情報のデータ形式変更]] ]] [[detail| [[#c_v8|バージョン8 目次機能]] | [[#c_v15|バージョン15 タグ情報のデータ形式変更]] ]] 今使ってるブラウザはSafariですが、いけてます。(^_^v あと一声、出力バッファからペースせず、この「例の形式」でpタグやulタグを生成したいところ。 [[ http://kondoh.html.xdomain.jp/index.html | トップページ ]] でも使ってみましょう。 swbuf todo_buf_27 ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] [[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]] [[-|tbl_ulモードでthタグも]] [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] [[-|a (name)]] [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] [[-|モード遷移のバグ修正]] [[-|プロパティを細かく指定出来るように]] [[-|打ち消し線以外にも文字列の装飾を]] [[-|折り畳み]] [[-|例の形式の入れ子]] 例の形式で簡単なpタグやulタグを生成できないものか swbuf p [[detail| todo | todo_buf_27]] ---- [[name|c_v28]] h2 バージョン28 例の形式でpタグやulタグ h3 例の形式 「例の形式」であるところの pre [[ v1 | v2 ]] / は ul tag_new(name, prop, v) で生成されるtagデータの内部形式 そのtagデータのリスト 空リスト p に変換されて(do_v1v2()関数)、後続の処理に渡ります。 [[#c_v27|バージョン27 例の形式の入れ子]] で、v2 の箇所にさらに入れ子で「例の形式」を記述可能にしました。 ですが、v2の位置にpタグやulタグを配置しようとしても、直接記述する事はできません。 トップレベルのモードをpモードやulモードに遷移させねばならず、 予め、出力バッファを切替えておいて、そこにデータを溜めておく必要があります。 そのデータが溜ってるバッファを指定して pre [[ v1 | [[ paste | バッファ名 ]] ]] / などと貼り付けていました。 [[#c_v22|バージョン22 バッファに出力してからペースト]] 面倒です。 どうにか、v2 の位置に直接記述したいところ... h3 アイデア 本ツールが最終的に出力するYAML形式のデータは、 [[ http://kondoh.html.xdomain.jp/ezhtml/index.html | 簡易なHTMLパーサ 2018秋 ]] が、入力データとして処理する形式です。 ならば、このYAML形式のデータをv2の位置に記述してしまえばいいのでは? 本ツールでは、タグの内部形式のデータを pre def tag_to_dic(tag): pstr = lambda k, v: '{}="{}"'.format(k, v) if v != None else k lst = [ tag.name ] + list( map( lambda kv: pstr(*kv), tag.prop.items() ) ) k = ' '.join(lst) def v_get(v): if type(v) == list: return list( map(v_get, v) ) if isinstance(v, Empty): return tag_to_dic(v) return v return { k: v_get(tag.v) } / この関数で辞書に変換します。 最後に pre : lst = list( map( tag_to_dic, lst ) ) u8 = yaml_dump(lst) : / タグのリストを辞書のリストにして、YAML形式で出力してます。 例えば「例の形式」のv1が'yaml'ならば、v2のテキストをYAML形式としてyaml.load()。 特別なタグ名'yaml'として tag_new( 'yaml', {}, v=yaml.load()結果 ) として内部データで保持。 tag_to_dic()関数の変換で、タグの名前が'yaml'の場合は特別扱いして、 保持してる、yaml.load()結果のデータを返すようにします。 yaml.load()結果は、辞書かリストが返るとして... 現状の呼び出し側では、辞書が返る事だけを期待てるので、修正が必要です。 この方針で何とかしてみましょう。 h3 仕様 「例の形式」でYAMLデータを記述する場合 pre [[ yaml | YAMLデータ ]] / YAMLデータは当然、 [[ http://kondoh.html.xdomain.jp/ezhtml/index.html | 簡易なHTMLパーサ 2018秋 ]] が期待する「くせ」のある形式です。 ul 辞書の要素数は1 辞書のキーの文字列にプロパティ情報を押し込んであって 辞書の値は「文字列」、「上記の仕様の辞書」、「リスト」のいづれか リストの要素は「文字列」、「上記の仕様の辞書」のいづれか p 例えば pre [[ yaml | {p: [foo, bar]} ]] [[ yaml | [{p: [foo, bar]}, {p: hoge}] ]] [[ yaml | {ul: [{li /: hoge}, {li /: fuga}]} ]] [[ yaml | [ {p: [foo, bar]}, {ul: [{li /: hoge}, {li /: fuga}]} ] ]] / のような感じ。 h3 パッチ @INC_LINK NAME=v28.patch pre $ cat v28.patch | patch -p1 / 前回の [[#c_v27|バージョン27 例の形式の入れ子]] での実装も見直して、修正してみました。 (あまり改善されてない気もしますが...) h3 まずはいつものデグレ確認 pre $ ./to_html.py head.yaml index.ezz.txt ezmd | diff -u index.ez.html - $ $ ./to_html.py head.yaml index-v24.txt ezmd | diff -u index-v24.html - $ $ ./to_html.py head.yaml index-v26.txt ezmd | diff -u index-v26.html - $ $ ./to_html.py head.yaml ex_tbl.txt ex_tbl | diff -u ex_tbl.html - | nkf -u --- ex_tbl.html 2019-10-07 18:07:10.000000000 +0900 +++ - 2019-10-11 00:04:07.000000000 +0900 @@ -19,7 +19,7 @@

    表のサンプル

    midiのときの表

    SMFの構造概略

    -
    関数名 int foo_send(const unsigned char *buf, unsigned bytes)
    説明 データ送信開始
    +
    分類
    @@ -74,7 +74,7 @@ - + @@ -86,7 +86,7 @@

    簡単なテキストの表組みツール (C言語)
    TXTBLCNT (簡単なテキストの表組みツールのためのさらなるツール)

    -
    分類 種別 データ長 内容
    イベント 可変長
    :
    :
    デルタタイム 可変長
    +
    関数名
    / 例によって、最後の結果は想定内でOK。 h3 今回の機能の確認 仕様の箇所のサンプルから。 pre $ ./ezmd.py < [[ yaml | {p: [foo, bar]} ]] > EOL - p: - p: - foo - bar $ ./ezmd.py < [[ yaml | [{p: [foo, bar]}, {p: hoge}] ]] > EOL - p: - p: - foo - bar - p: hoge $ ./ezmd.py < [[ yaml | {ul: [{li /: hoge}, {li /: fuga}]} ]] > EOL - p: - ul: - li /: hoge - li /: fuga $ ./ezmd.py < [[ yaml | [ {p: [foo, bar]}, {ul: [{li /: hoge}, {li /: fuga}]} ] ]] > EOL - p: - p: - foo - bar - ul: - li /: hoge - li /: fuga / うーむ。デフォルトpモードなので、pタグがネストしてしまった... 素のpモードの上での、pタグの例が悪かったですね。 pre $ ./ezmd.py < [[ detail | foo | [[ yaml | {ul: [{li /: bar}, {li /: hoge}]} ]] ]] > EOL - p: - details: - summary: foo - ul: - li /: bar - li /: hoge / [[ detail | foo | [[ yaml | {ul: [{li /: bar}, {li /: hoge}]} ]] ]] [[ detail | 日本語 | [[ yaml | {ul: [{li /: ひらがな}, {li /: カタカナ}]} ]] ]] OK しかし「例の形式」は改行を許さず、1行で記述せねばなりません。 例えば、以下のtodoリストのulタグを、1行のYAML形式で書くのは、さすがに至難の技です。 swbuf todo_buf_28 ul [[-|h1, h2, h3, ...]] [[-|p]] [[-|pre]] [[-|ul, li]] [[-|a (href)]] [[-|hr]] [[-|img]] [[-|video]] [[-|s]] [[-|目次機能]] [[-|headタグのtitleを何とかする]] [[-|バグ修正と調整]] [[-|br]] [[-|dl]] [[-|table]] [[-|ulからtableへの変換]] [[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]] [[-|tbl_ulモードでthタグも]] [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] [[-|a (name)]] [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] [[-|モード遷移のバグ修正]] [[-|プロパティを細かく指定出来るように]] [[-|打ち消し線以外にも文字列の装飾を]] [[-|折り畳み]] [[-|例の形式の入れ子]] [[-|例の形式で簡単なpタグやulタグを生成できないものか]] 例の形式で改行を許せぬものか swbuf p [[detail| todo | todo_buf_28]] ---- [[name|c_v29]] h2 バージョン29 例の形式で改行を許すように [[#c_v28|バージョン28 例の形式でpタグやulタグ]] では「例の形式」 pre [[ v1 | v2 ]] / に対して pre [[ yaml | ezhtmlのYAML形式 ]] / で、v2にどんなタグでも記述できるべく対応してみましたが... ょっと凝ったタグを使おうとすると、 v2箇所が横に長〜い記述になってしまいます。 「例の形式」の途中に改行を含める事は許されません。 なんとか、改行を入れる事はできないか... h3 改行のエスケープ これまでに、ulモードの処理と、tbl_orgモードの処理で、 同様に横に長〜くなるのを嫌って、改行を許すように手を入れてました。 改行の前に'\'を入れた場合、改行をエスケープさせて、2つの行を連結してました。 まず、これらのモードだけの対応にせずに、根本的な部分に処理を追加します。 そもそも pre if __name__ == "__main__": b = nkf.get_stdin() (s, nkf_opt) = nkf.to_str(b) lst = s.split('\n') lst = list( map( strip_tail, lst ) ) lst = ezmd(lst) lst = flat_map( tag_to_dic, lst ) : / ここで、標準入力からの文字列の塊を、 改行ごとに行に分けてリストlstにしてます。 この段階で、改行の前にエスケープ・コード'\'があると、 行に分けずに'\'だけ削除する事にします。 これで、 ul エスケープしてない改行コードで行を分割し 各行の中には、エスケープしてた改行が残った状態 p となります。 ulモードとtbl_orgモードでは、 従来の処理互換のため、行を連結してた箇所で、行の中の改行は削除します。 これで例えば pre p foo [[ bar | \ line-1 \ line-2 \ line-3 \ : line-n \ ]] / などと記述しても、従来の行文字列の処理箇所には pre p foo [[ bar | line-1 改行 line-2 改行 line-3 改行 ... 改行 line-n ]] / という、複数の改行コードを含む「1本の文字列」が渡るはずです。 h3 アイデア さて、ここから pre line-1 改行 line-2 改行 line-3 改行 ... 改行 line-n / の文字列。 これは、標準入力から受け取った文字列と、同じ形式と見なせるはず。 ここから何とか、呼び出しを「でんぐり返して」 pre if __name__ == "__main__": b = nkf.get_stdin() (s, nkf_opt) = nkf.to_str(b) lst = s.split('\n') lst = list( map( strip_tail, lst ) ) lst = ezmd(lst) lst = flat_map( tag_to_dic, lst ) : / この辺りに喰わせるように持っていければ「めでたしめでたし」なのでは? h3 仕様 「例の形式」にでんぐり返し処理用のものを追加します。 pre [[ mode | xxx ]] / xxxは改行込みの文字列を想定しているので、使う場合は実質 pre [[ mode | \ xxx\ yyy\ : zzz\ ]] / と、なりましょうや。 ですが、ここからの実装が「いばらの道」でした。 ul xxx が普通の文字列の場合は単純で問題無し xxx の中に「例の形式」が入れ子になってる場合が難問 その場合のxxxの中の「例の形式」は、でんぐり返して処理したいのですが... do_v1v2()関数にv1 == 'mode' として渡ってきたときには、xxx の中の「例の形式」の評価が終わってます xxx の中の入れ子の部分がタグデータになってから、mode処理のv2として渡ってきます p 腐心しつつ、あれこれ試した結果、少々あきらめて折衷案的なものに落ち着きました。 pre [[ mode | ^...$ ]] / modeのときはv2の先頭と末尾には^と$を追加します。 v2として処理するのは、当然...の中身の部分だけです。 ...の中で'$'を使いたいときは'\$'で、エスケープします。 これで、... の中で pre ...[[ ... ]] ... / などとネストしてても、 一発で'$'までを文字列として取り出して処理します。 使うときは実質 pre [[ mode | ^\ line-1 \ line-2 \ [[ foo | bar ]] \ line-3 \ $ ]] / な感じになります。 h3 パッチ @INC_LINK NAME=v29.patch pre $ cat v29.patch | patch -p1 / 腐心してなんとか実装しました。 (ですが、多少の敗北感はいなめない...) h3 まずは従来通りの動作の確認 pre $ ./to_html.py head.yaml index-v28.txt ezmd | diff -u index-v28.html - $ $ ./to_html.py head.yaml ex_tbl.txt ex_tbl | diff -u ex_tbl.html - | nkf -u --- ex_tbl.html 2019-10-07 18:07:10.000000000 +0900 +++ - 2019-10-12 01:04:18.000000000 +0900 @@ -19,7 +19,7 @@

    表のサンプル

    midiのときの表

    SMFの構造概略

    -
    関数名 int foo_send(const unsigned char *buf, unsigned bytes)
    説明 データ送信開始
    +
    分類
    @@ -74,7 +74,7 @@ - + @@ -86,7 +86,7 @@

    簡単なテキストの表組みツール (C言語)
    TXTBLCNT (簡単なテキストの表組みツールのためのさらなるツール)

    -
    分類 種別 データ長 内容
    イベント 可変長
    :
    :
    デルタタイム 可変長
    +
    関数名
    / OK h3 今回の機能の確認 このページ自身に pre [[ #c_v28 | [[ mode | ^\ ul \ バージョン \ 28 \ 例の形式で \ pタグや \ ulタグ \ $ ]] ]] / などと記述してみると [[ #c_v28 | [[ mode | ^\ ul \ バージョン \ 28 \ 例の形式で \ pタグや \ ulタグ \ $ ]] ]] 上記のように。 ulタグ全体が、1つのリンクになってしまいました。 同様に pre [[ #c_v28 | [[ mode | ^\ tbl \ tbl_ul \ バージョン \ 28 \ 例の形式で \ pタグや \ ulタグ \ $ ]] ]] / では [[ #c_v28 | [[ mode | ^\ tbl \ tbl_ul \ バージョン \ 28 \ 例の形式で \ pタグや \ ulタグ \ $ ]] ]] 表全体が1つのリンク。 使うかどうかは別として、こういう事も記述できます、という事で。 [[#c_v28|バージョン28 例の形式でpタグやulタグ]] で試したYAML形式の場合と、同様の結果が得られる記述が可能か、試しておきます。 pre $ ./ezmd.py < [[ yaml | {p: [foo, bar]} ]] > EOL - p: - p: - foo - bar / この場合は pre $ ./ezmd.py < [[ mode | ^\\ > p \\ > foo \\ > bar \\ > $ ]] > EOL - p: - p: - foo - bar / OK ヒアドキュメントの都合で行末の'\'は'\\'にしてます。 pre $ ./ezmd.py < [[ yaml | [{p: [foo, bar]}, {p: hoge}] ]] > EOL - p: - p: - foo - bar - p: hoge / だと pre $ ./ezmd.py < [[ mode | ^\\ > p \\ > foo \\ > bar \\ > \\ > hoge \\ > $ ]] > EOL - p: - p: - foo - bar - p: - hoge / OK pre $ ./ezmd.py < [[ yaml | {ul: [{li /: hoge}, {li /: fuga}]} ]] > EOL - p: - ul: - li /: hoge - li /: fuga / では pre $ ./ezmd.py < [[ mode | ^\\ > ul \\ > hoge \\ > fuga \\ > $ ]] > EOL - p: - ul: - li /: hoge - li /: fuga / OK pre $ ./ezmd.py < [[ yaml | [ {p: [foo, bar]}, {ul: [{li /: hoge}, {li /: fuga}]} ] ]] > EOL - p: - p: - foo - bar - ul: - li /: hoge - li /: fuga / も pre $ ./ezmd.py < [[ mode | ^\\ > p \\ > foo \\ > bar \\ > ul \\ > hoge \\ > fuga \\ > $ ]] > EOL - p: - p: - foo - bar - ul: - li /: hoge - li /: fuga / このとおり。 pre $ ./ezmd.py < [[ detail | foo | [[ mode | ^\\ > p \\ > bar \\ > \\ > hoge \\ > $ ]] ]] > EOL - p: - details: - summary: foo - p: - bar - p: - hoge / うーむ。ちょっと違うけど、この違いは「いたしかた無し」かも。 [[ detail | foo | [[ mode | ^\ p \ bar \ \ hoge \ $ ]] ]] まぁHTMLでは、多分同じですね。 pre $ ./ezmd.py < [[ detail | foo | [[ yaml | {ul: [{li /: bar}, {li /: hoge}]} ]] ]] > EOL - p: - details: - summary: foo - ul: - li /: bar - li /: hoge / pre $ ./ezmd.py < [[ detail | foo | [[ mode | ^\\ > ul \\ > bar \\ > hoge \\ > $ ]] ]] > EOL - p: - details: - summary: foo - ul: - li /: bar - li /: hoge / これは一致。OKです。 pre [[ detail | 日本語 | [[ yaml | {ul: [{li /: ひらがな}, {li /: カタカナ}]} ]] ]] / 日本語の場合も pre [[ detail | 日本語 | [[ mode | ^\ ul \ ひらがな \ カタカナ \ $ ]] ]] / [[ detail | 日本語 | [[ mode | ^\ ul \ ひらがな \ カタカナ \ $ ]] ]] OK テキストが横に長〜くならずに、同様の結果を得られます。 これで、出力バッファを切り替えて予め作成したタグを、 後ろの方で貼り付けずに済みます。 テキストの段階で、多少見通しが良くなります。 ではさっそくtodoでも使ってみます。 pre [[detail| todo | [[mode| ^\ ul \ [[-|h1, h2, h3, ...]] \ [[-|p]] \ [[-|pre]] \ [[-|ul, li]] \ [[-|a (href)]] \ [[-|hr]] \ [[-|img]] \ [[-|video] ] \ [[-|s]] \ [[-|目次機能]] \ [[-|headタグのtitleを何とかする]] \ [[-|バグ修正と調整]] \ [[-|br]] \ [[-|dl]] \ [[-|table]] \ [[-|ulからtableへの変換]] \ [[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]] \ [[-|tbl_ulモードでthタグも]] \ [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] \ [[-|a (name)]] \ [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] \ [[-|モード遷移のバグ修正]] \ [[-|プロパティを細かく指定出来るように]] \ [[-|打ち消し線以外にも文字列の装飾を]] \ [[-|折り畳み]] \ [[-|例の形式の入れ子]] \ [[-|例の形式で簡単なpタグやulタグを生成できないものか]] \ [[-|例の形式で改行を許せぬものか]] \ ulで改行が消える不具合 \ $ ]] ]] / のテキストの結果が、以下の内容です。 [[detail| todo | [[mode| ^\ ul \ [[-|h1, h2, h3, ...]] \ [[-|p]] \ [[-|pre]] \ [[-|ul, li]] \ [[-|a (href)]] \ [[-|hr]] \ [[-|img]] \ [[-|video] ] \ [[-|s]] \ [[-|目次機能]] \ [[-|headタグのtitleを何とかする]] \ [[-|バグ修正と調整]] \ [[-|br]] \ [[-|dl]] \ [[-|table]] \ [[-|ulからtableへの変換]] \ [[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]] \ [[-|tbl_ulモードでthタグも]] \ [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] \ [[-|a (name)]] \ [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] \ [[-|モード遷移のバグ修正]] \ [[-|プロパティを細かく指定出来るように]] \ [[-|打ち消し線以外にも文字列の装飾を]] \ [[-|折り畳み]] \ [[-|例の形式の入れ子]] \ [[-|例の形式で簡単なpタグやulタグを生成できないものか]] \ [[-|例の形式で改行を許せぬものか]] \ ulで改行が消える不具合 \ $ ]] ]] ---- h2 バージョン30 改行削除の不具合対策 前回の [[#c_v29|バージョン29 例の形式で改行を許すように]] でバグがありました。 元々行末の'\'で行を連結してたulモードとtbl_orgモードの処理箇所で、 rm_nl()に置き換えて、改行を消すようにしました。 単純に置き換えたのが、まずかったです。 pre $ ./ezmd.py < ul > foo > bar > [[ hoge | fuga ]] > EOL - ul: - li /: foo - li /: bar - li /: a href="hoge": fuga / 例えば上記のulタグ。 最後のリンクの箇所をmodeの形式に置き換えて、 別のulタグを生成しようとすると... pre $ ./ezmd.py < ul > foo > bar > [[ mode | ^\\ > ul \\ > hoge \\ > fuga \\ > $ ]] > EOL - ul: - li /: foo - li /: bar - li /: p: - ulhogefuga / 後者のulタグに必要な改行 pre 'ul 改行 hoge 改行 fuga' / が、前者のulタグの処理で、先に削除されてしまい pre 'ulhogefuga' / の文字列になってしまってます。 h3 対策の方針 改行の削除を、ulモードとtbl_orgモードだけで、個別にするのをやめます。 とりあえず改行込みで処理してしまってから、 最後に不要な改行を、一括しえ削除するようにします。 preタグの中は「聖域」なので、改行削除の手出しは無用です。 h3 パッチ @INC_LINK NAME=v30.patch pre $ cat v30.patch | patch -p1 / h3 いつもの確認 pre $ ./to_html.py head.yaml index-v29.txt ezmd | diff -u index-v29.html - $ / OK h3 不具合の修正確認 pre $ ./ezmd.py < ul > foo > bar > [[ mode | ^\\ > ul \\ > hoge \\ > fuga \\ > $ ]] > EOL - ul: - li /: foo - li /: bar - li /: ul: - li /: hoge - li /: fuga / OK [[ http://kondoh.html.xdomain.jp/index.html | トップページ ]] の [[ http://kondoh.html.xdomain.jp/index.txt | テキスト ]] にも反映してみます。 [[detail| todo | [[mode| ^\ ul \ [[-|h1, h2, h3, ...]] \ [[-|p]] \ [[-|pre]] \ [[-|ul, li]] \ [[-|a (href)]] \ [[-|hr]] \ [[-|img]] \ [[-|video]] \ [[-|s]] \ [[-|目次機能]] \ [[-|headタグのtitleを何とかする]] \ [[-|バグ修正と調整]] \ [[-|br]] \ [[-|dl]] \ [[-|table]] \ [[-|ulからtableへの変換]] \ [[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]] \ [[-|tbl_ulモードでthタグも]] \ [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] \ [[-|a (name)]] \ [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] \ [[-|モード遷移のバグ修正]] \ [[-|プロパティを細かく指定出来るように]] \ [[-|打ち消し線以外にも文字列の装飾を]] \ [[-|折り畳み]] \ [[-|例の形式の入れ子]] \ [[-|例の形式で簡単なpタグやulタグを生成できないものか]] \ [[-|例の形式で改行を許せぬものか]] \ [[-|ulで改行が消える不具合]] \ 他のテキストファイルをinclude的に取り込みたい \ $ ]] ]] ---- [[name|c_v31]] h2 バージョン31 include include機能を追加してみます。 h3 仕様 pre [[ include | URLかファイルのパス ]] / 「URLかファイルのパス」の中身は、本ツールの期待する形式のテキストデータです。 h3 パッチ @INC_LINK NAME=v31.patch pre $ cat v31.patch | patch -p1 / 実装は単純です。 追加したtext_get(s)関数で、テキストデータを取得。\n URLを指定する場合は wget コマンドを使ってます。 そのまま pre [[ mode | テキスト ]] / の処理を利用するだけです。 h3 いつもの従来分の確認 pre $ ./to_html.py head.yaml index-v30.txt ezmd | diff -u index-v30.html - $ / OK h3 今回の追加機能の確認 [[foo_31.txt]] を用意しておいて... pre $ cat foo_31.txt h3 foo bar ul hoge fuga / そのままincludeしてみると pre $ ./ezmd.py < [[ include | foo_31.txt ]] > EOL - p: - h3: a name="c_3_0": foo - p: - bar - ul: - li /: hoge - li /: fuga / トップレベルのpタグの配下にincludeされました。 pre $ ./ezmd.py < [[ include | foo_31.txt ]] > EOL

    foo

    bar

    • hoge
    • fuga

    / 確かに外側のpタグの配下に全てincludeで「含まれ」ます。 そのまま pre [[ include | foo_31.txt ]] / を下記に貼り付けると [[ include | foo_31.txt ]] 上記のように。 折り畳みと組み合わせると pre $ ./ezmd.py < [[ detail | foo_31 | [[ include | foo_31.txt ]] ]] > EOL - p: - details: - summary: foo_31 - h3: a name="c_3_0": foo - p: - bar - ul: - li /: hoge - li /: fuga / [[ detail | foo_31 | [[ include | foo_31.txt ]] ]] テーブルの例のテキストを [[ ex_tbl_1.txt ]] \n [[ ex_tbl_2.txt ]] pre [[ detail | 表の例1 | [[ include | ex_tbl_1.txt ]] ]] [[ detail | 表の例2 | [[ include | ex_tbl_2.txt ]] ]] / [[ detail | 表の例1 | [[ include | ex_tbl_1.txt ]] ]] [[ detail | 表の例2 | [[ include | ex_tbl_2.txt ]] ]] このように。 URLを指定する場合 pre [[ detail | 更新履歴(2019/Oct時点) | [[ include | http://kondoh.html.xdomain.jp/hist.txt ]] ]] / [[ detail | 更新履歴(2019/Oct時点) | [[ include | http://kondoh.html.xdomain.jp/hist.txt ]] ]] このように、このサイトの更新履歴を、ここに折り畳みで貼り付けてみました。 (ただし、リンクはトップページのディレクトリからの相対なので、まともに飛びません) [[detail| todo | [[mode| ^\ ul \ [[-|h1, h2, h3, ...]] \ [[-|p]] \ [[-|pre]] \ [[-|ul, li]] \ [[-|a (href)]] \ [[-|hr]] \ [[-|img]] \ [[-|video]] \ [[-|s]] \ [[-|目次機能]] \ [[-|headタグのtitleを何とかする]] \ [[-|バグ修正と調整]] \ [[-|br]] \ [[-|dl]] \ [[-|table]] \ [[-|ulからtableへの変換]] \ [[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]] \ [[-|tbl_ulモードでthタグも]] \ [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] \ [[-|a (name)]] \ [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] \ [[-|モード遷移のバグ修正]] \ [[-|プロパティを細かく指定出来るように]] \ [[-|打ち消し線以外にも文字列の装飾を]] \ [[-|折り畳み]] \ [[-|例の形式の入れ子]] \ [[-|例の形式で簡単なpタグやulタグを生成できないものか]] \ [[-|例の形式で改行を許せぬものか]] \ [[-|ulで改行が消える不具合]] \ [[-|他のテキストファイルをinclude的に取り込みたい]] \ macroによる文字列の置換 \ コメント対応 \ $ ]] ]] ---- h2 バージョン32 macro変換 [[#c_v31|バージョン31 include]] でincludeに対応したので、今回はmacro変換の対応です。 変換用に「キーの文字列」から「値の文字列」に対応する辞書を用意します。 テキストの文字列を処理する前に、変換用の辞書で文字列を変換します。 変換用の辞書は、とりあえず、世界に1つだけグローバル変数で用意してみます。 h3 仕様 macro定義用のモードを追加します。 'macro'だけの行が現れると、macro定義モードに移行します。 他のモードに切り替わるまでの間に、 YAML形式で文字列の辞書を記述します。 macro定義モードで記述された辞書は、 基本的に変換用の辞書に「追加」されます。 初期値は空の辞書で、pythonの辞書の.update()メソッドによる追加です。 同じキーのものは上書きされて更新。 辞書の内容の削除や、全体クリア処理を特別に設けるのも面倒なので... 変換辞書が更新された後、キーと値が同じものを見つけたら、 辞書から削除するようにしてみました。 文字列の変換はdo_mode()関数で、各モードの処理前に処理対象の文字列のリストに対して行ないます。 「聖域」preモードと、macroモード自体は、変換の対象外です。 h3 文字列を複数行の文字列に変換したい場合 できると便利そうなので、対応してみました。 変換用YAML形式の辞書を定義するときに、 変換前の文字列のキーに対して、値を文字列のリストにします。 h3 パッチ @INC_LINK NAME=v32.patch h3 従来分の動作確認 pre $ ./to_html.py head.yaml index-v31.txt ezmd | diff -u index-v31.html - $ / OK h3 今回の追加機能の確認 [[foo_32.txt]] pre $ cat foo_32.txt macro foo: FOO bar: BAR p foo bar hoge ul foo bar hoge foobarhoge macro foo: foo p foo bar hoge ul foo bar hoge foobarhoge macro hoge: 123 p foo bar hoge ul foo bar hoge foobarhoge macro bar: bar ' bar': - ' BAR-1' - ' BAR-2' - ' BAR-3' p foo bar hoge ul foo bar hoge foobarhoge / では実行。 pre $ ./ezmd.py < foo_32.txt - p: - FOO BAR hoge - ul: - li /: FOO - li /: BAR - li /: hoge - li /: FOOBARhoge - p: - foo BAR hoge - ul: - li /: foo - li /: BAR - li /: hoge - li /: fooBARhoge - p: - foo BAR 123 - ul: - li /: foo - li /: BAR - li /: '123' - li /: fooBAR123 - p: - foo bar 123 - ul: - li /: foo - li /: BAR-1 - li /: BAR-2 - li /: BAR-3 - li /: '123' - li /: foobar123 / OK 他にも例をば pre [[ detail | midiの表 | [[ include | ex_tbl_1.txt ]] ]] / [[ detail | midiの表 | [[ include | ex_tbl_1.txt ]] ]] な表の例をinclude。 pre macro 分類: Type 種別: Kind データ長: Length of data 内容: Contents ヘッダ: Header トラック: Track サイズ: size フォーマットタイプ: Format Type Track数: Number of Tracks 時間分解能: Time Division デルタタイム: Delta Time イベント: Event バイト: ' Bytes' 可変長: variable length / などと変換の設定をしてみます。 macro 分類: Type 種別: Kind データ長: Length of data 内容: Contents ヘッダ: Header トラック: Track サイズ: size フォーマットタイプ: Format Type Track数: Number of Tracks 時間分解能: Time Division デルタタイム: Delta Time イベント: Event バイト: ' Bytes' 可変長: variable length pre [[ detail | midiの表 | [[ include | ex_tbl_1.txt ]] ]] / 先ほどと同様にincludeしてみると [[ detail | midiの表 | [[ include | ex_tbl_1.txt ]] ]] えせ英語バージョンのできあがり。 macro 分類: 分類 種別: 種別 データ長: データ長 内容: 内容 ヘッダ: ヘッダ トラック: トラック サイズ: サイズ フォーマットタイプ: フォーマットタイプ Track数: Track数 時間分解能: 時間分解能 デルタタイム: デルタタイム イベント: イベント バイト: バイト 可変長: 可変長 h3 折り畳みのdetailと組み合わせる場合 まず、ulのdetailによる折り畳みがあったとして pre [[ detail | label | [[ mode |^\ ul \ abc \ FOO \ def \ $ ]] ]] / [[ detail | label | [[ mode |^\ ul \ abc \ FOO \ def \ $ ]] ]] この1行のFOOの箇所を、複数の行に変換したい場合。 複数行なので文字列のリスト。 pre macro FOO: - [[foo | bar ]] - ' foo-1' - ' foo-2' - hoge / なんですが、このように定義すると、意図した通りになりません。 [[bar_32.txt]] pre $ cat bar_32.txt macro FOO: - [[foo | bar ]] - ' foo-1' - ' foo-2' - hoge p [[ detail | label | [[ mode | ^\ ul \ abc \ FOO \ def \ $ ]] ]] $ ./ezmd.py < bar_32.txt Traceback (most recent call last): File "./ezmd.py", line 762, in lst = s_to_tag_lst(s) File "./ezmd.py", line 754, in s_to_tag_lst lst = ezmd(lst) File "./ezmd.py", line 713, in ezmd e.run() File "./ezmd.py", line 138, in run func(e) File "./ezmd.py", line 710, in func = lambda e: do_mode(e.mode, e.tmp, hd_names) File "./ezmd.py", line 631, in do_mode buf = lst_strip(buf) File "./ezmd.py", line 102, in lst_strip = lambda lst: list( map( lambda s: s.strip(), lst ) ) File "./ezmd.py", line 102, in lst_strip = lambda lst: list( map( lambda s: s.strip(), lst ) ) AttributeError: 'list' object has no attribute 'strip' / 改行のエスケープによる行の結合は、 macroによる変換よりも先に行われます。 pre [[ detail | label | [[ mode | ^\ ul \ abc \ FOO \ def \ $ ]] ]] / の箇所は、先に pre [[ detail | labal | [[ mode |^ul 改行abc 改行FOO 改行def 改行$ ]] ]] / という1行になります。 その後で、FOOの箇所が複数の文字列に変換されるので pre 'FOO' の箇所が文字列のリスト '[[foo | bar]]' ' foo-1' ' foo-2' 'hoge' / この場合、内部処理的には pre [[ detail | labal | [[ mode |^ul 改行abc 改行FOO 改行def 改行$ ]] ]] / がまず pre '[[ detail | labal | [[ mode |^ul 改行abc 改行' 'FOO' ' 改行def 改行$ ]] ]]' / の3本のリストに。 それから、FOOの箇所が pre '[[foo | bar]]' ' foo-1' ' foo-2' 'hoge' / に変換されるので pre '[[ detail | labal | [[ mode |^ul 改行abc 改行' '[[foo | bar]]' ' foo-1' ' foo-2' 'hoge' ' 改行def 改行$ ]] ]]' / 結果、複数の文字列に。 そう。 「例の形式」が複数の文字列にまたがってしまってます。 「例の形式」は1本の文字列の中で、改行を含んでいてもOKですが、 1本の文字列におさまってないとダメです。 ややこしい。 この場合の正解は [[hoge_32.txt]] pre $ cat hoge_32.txt macro FOO: | [[foo | bar]] foo-1 foo-2 hoge p [[ detail | label | [[ mode | ^\ ul \ abc \ FOO \ def \ $ ]] ]] / 先のダメな場合との差分は pre $ diff -u bar_32.txt hoge_32.txt --- bar_32.txt 2019-10-13 10:45:45.000000000 +0900 +++ hoge_32.txt 2019-10-13 10:35:55.000000000 +0900 @@ -1,10 +1,10 @@ macro - FOO: - - [[foo | bar ]] - - ' foo-1' - - ' foo-2' - - hoge - + FOO: | + [[foo | bar]] + foo-1 + foo-2 + hoge + p [[ detail | label | [[ mode | ^\ ul \ / FOOの変換後の文字列は、YAML形式で改行を含む1本の文字列です。 pre '[[foo | bar]]改行 foo-1改行 foo-2改行hoge' / になります。 これで実行すると pre $ ./ezmd.py < hoge_32.txt - p: - details: - summary: label - ul: - li /: abc - li /: a href="foo": bar - ul: - li /: foo-1 - li /: foo-2 - li /: hoge - li /: def / 貼り付けると macro FOO: | [[foo | bar]] foo-1 foo-2 hoge p [[ detail | label | [[ mode | ^\ ul \ abc \ FOO \ def \ $ ]] ]] hoge_32.txt を include しても pre [[ include | hoge_32.txt ]] / [[ include | hoge_32.txt ]] 同様です。 macro FOO: FOO p [[detail| todo | [[mode| ^\ ul \ [[-|h1, h2, h3, ...]] \ [[-|p]] \ [[-|pre]] \ [[-|ul, li]] \ [[-|a (href)]] \ [[-|hr]] \ [[-|img]] \ [[-|video]] \ [[-|s]] \ [[-|目次機能]] \ [[-|headタグのtitleを何とかする]] \ [[-|バグ修正と調整]] \ [[-|br]] \ [[-|dl]] \ [[-|table]] \ [[-|ulからtableへの変換]] \ [[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]] \ [[-|tbl_ulモードでthタグも]] \ [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] \ [[-|a (name)]] \ [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] \ [[-|モード遷移のバグ修正]] \ [[-|プロパティを細かく指定出来るように]] \ [[-|打ち消し線以外にも文字列の装飾を]] \ [[-|折り畳み]] \ [[-|例の形式の入れ子]] \ [[-|例の形式で簡単なpタグやulタグを生成できないものか]] \ [[-|例の形式で改行を許せぬものか]] \ [[-|ulで改行が消える不具合]] \ [[-|他のテキストファイルをinclude的に取り込みたい]] \ [[-|macroによる文字列の置換]] \ コメント対応 \ 目次は折り畳めないものか \ $ ]] ]] ---- h2 バージョン33 目次を折り畳るように 目次を折り畳もうとしても、うまくいきませんでした。 例えば [[foo_33.txt]] pre $ cat foo_33.txt h1 foo1 index ---- [[ detail | label | [[ mode | ^\ index \ $ ]] ]] ---- h2 foo2 h3 foo3 h2 bar2 h3 bar3 / そのまま実行すると pre $ ./ezmd.py < foo_33.txt - h1: a name="c_1_0": foo1 - ul: - li /: a href="#c_1_0": foo1 - ul: - li /: a href="#c_2_1": foo2 - ul: - li /: a href="#c_3_2": foo3 - li /: a href="#c_2_3": bar2 - ul: - li /: a href="#c_3_4": bar3 - p: hr: / - p: - details: - summary: label - index: [] - p: hr: / - h2: a name="c_2_1": foo2 - h3: a name="c_3_2": foo3 - h2: a name="c_2_3": bar2 - h3: a name="c_3_4": bar3 / 折り畳まない前者の方の目次はOKですが、 折り畳む後者の detail の側が残念な結果に。 h3 原因 目次生成処理の箇所 pre def do_index(hd_names): : def f(buf): names = names_get(hd_names, slice_get(buf) ) func = lambda h_i, n, name, s: ' ' * h_i + '[[#{}|'.format(name) + s + ']]' buf = list( map( lambda vs: func(*vs), names ) ) outbuf.push_tmp() do_mode_ul(buf) return outbuf.pop_tmp() return flat_map( lambda tag: f(tag.v) if tag.name == 'index' else tag, outbuf.lst_get() ) / ここで、最後の行の処理。 ul outbuf.lst_get() で目次挿入前の、出力結果のタグのリストを取得。 flat_map()関数で、lambda から ... else tag, までの処理にかけてます。 ここで、タグリストのトップレベルのtagの名前が'index'のものしか見てません。 p 折り畳みのdetailタグの中に、タグを挿入する場所を示すindexタグが入っていても、 これでは探せません。 h3 対策 タグの値vに、さらに別のタグや、タグのリストを保持してる場合も、 深く探索するように変更してます。 h3 パッチ @INC_LINK NAME=v33.patch pre $ cat v33.patch | patch -p1 / h3 いつもの従来動作の確認 pre $ ./to_html.py head.yaml index-v32.txt ezmd | diff -u index-v32.html - $ / OK h3 改善の確認 pre $ ./ezmd.py < foo_33.txt - h1: a name="c_1_0": foo1 - ul: - li /: a href="#c_1_0": foo1 - ul: - li /: a href="#c_2_1": foo2 - ul: - li /: a href="#c_3_2": foo3 - li /: a href="#c_2_3": bar2 - ul: - li /: a href="#c_3_4": bar3 - p: hr: / - p: - details: - summary: label - ul: - li /: a href="#c_1_0": foo1 - ul: - li /: a href="#c_2_1": foo2 - ul: - li /: a href="#c_3_2": foo3 - li /: a href="#c_2_3": bar2 - ul: - li /: a href="#c_3_4": bar3 - p: hr: / - h2: a name="c_2_1": foo2 - h3: a name="c_3_2": foo3 - h2: a name="c_2_3": bar2 - h3: a name="c_3_4": bar3 / OK では早速、このページの先頭の目次も pre index 2 / から pre [[name|c_index]] [[ detail | 目次 | [[ mode | ^\ index \ 2 \ $ ]] ]] / に変更してみます。 [[#c_index|このページの先頭の目次]] [[detail| todo | [[mode| ^\ ul \ [[-|h1, h2, h3, ...]] \ [[-|p]] \ [[-|pre]] \ [[-|ul, li]] \ [[-|a (href)]] \ [[-|hr]] \ [[-|img]] \ [[-|video]] \ [[-|s]] \ [[-|目次機能]] \ [[-|headタグのtitleを何とかする]] \ [[-|バグ修正と調整]] \ [[-|br]] \ [[-|dl]] \ [[-|table]] \ [[-|ulからtableへの変換]] \ [[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]] \ [[-|tbl_ulモードでthタグも]] \ [[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]] \ [[-|a (name)]] \ [[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]] \ [[-|モード遷移のバグ修正]] \ [[-|プロパティを細かく指定出来るように]] \ [[-|打ち消し線以外にも文字列の装飾を]] \ [[-|折り畳み]] \ [[-|例の形式の入れ子]] \ [[-|例の形式で簡単なpタグやulタグを生成できないものか]] \ [[-|例の形式で改行を許せぬものか]] \ [[-|ulで改行が消える不具合]] \ [[-|他のテキストファイルをinclude的に取り込みたい]] \ [[-|macroによる文字列の置換]] \ コメント対応 \ [[-|目次は折り畳めないものか]] \ macroの値への追加 \ $ ]] ]] ---- h2 バージョン34 マクロの値への追加 同じような記述で、少しづつ内容に追加があるような場合。 内容をmacro定義にしておいて、内容に追加があるたびにmacro定義の値に「追加分」を追加。 macro定義を以前と同様に表示すれば、自動的に内容に追加分が反映されていると。 こんなストーリーを実現したく、macro変換の辞書の更新処理に手を入れてみました。 h3 仕様 従来の仕様は pre macro YAML形式の辞書 (他のモード) / YAML形式の辞書を「更新用辞書」とすると、 pre 変換用の辞書.update( 更新用辞書 ) / で、変換用の辞書を更新し 変換辞書から「キーと値が同一のもの」は削除。 以上の従来の仕様に対して、「追加用の辞書」というものを追加します。 更新用辞書の内容に、キー__ADD__が存在すると、値に「追加用の辞書」が定義されているものとして、辞書の更新に使用します。 「追加用の辞書」には、「更新用辞書」に含まれているキーと同じキーを指定して、 更新用辞書の「値」に追加する分の「値」を定義しておきます。 例えば、 pre macro foo: bar p foo macro __ADD__: foo: hoge p foo / とした場合 ul はじめ変換辞書のキーfooの値はbarに定義。 fooを表示しようとすると「bar」と表示。 次にキーfooの値barに対して、値hogeを「追加」。 変換辞書のキーfooの値はbarhogeに。 fooを表示しようとすると「barhoge」と表示。 p になって欲しいなと。 @INC_LINK NAME=v34.patch pre $ cat v34.patch | patch -p1 / h3 従来動作の確認 pre $ ./to_html.py head.yaml index-v33.txt ezmd | diff -u index-v33.html - $ / OK h3 今回の機能の確認 まずは仕様の例を pre $ ./ezmd.py < macro > foo: bar > p > foo > > macro > __ADD__: > foo: hoge > p > foo > EOL - p: - bar - p: - barhoge / OK 少し凝って [[foo_34.txt]] pre $ cat foo_34.txt p [[ detail | label | [[ mode | ^\ ul \ abc \ FOO \ def \ $ ]] ]] macro FOO: "[[foo]]\nfoo-2\n foo-2-1\n foo-2-2" p [[ detail | label | [[ mode | ^\ ul \ abc \ FOO \ def \ $ ]] ]] macro __ADD__: FOO: "\nbar\n bar-2" p [[ detail | label | [[ mode | ^\ ul \ abc \ FOO \ def \ $ ]] ]] / FOOの内容は pre FOO "[[foo]]\nfoo-2\n foo-2-1\n foo-2-2" "[[foo]]\nfoo-2\n foo-2-1\n foo-2-2\nbar\n bar-2" / と変更されるはず... pre $ ./ezmd.py < foo_34.txt - p: - details: - summary: label - ul: - li /: abc - li /: FOO - li /: def - p: - details: - summary: label - ul: - li /: abc - li /: a href="foo": foo - li /: foo-2 - ul: - li /: foo-2-1 - li /: foo-2-2 - li /: def - p: - details: - summary: label - ul: - li /: abc - li /: a href="foo": foo - li /: foo-2 - ul: - li /: foo-2-1 - li /: foo-2-2 - li /: bar - ul: - li /: bar-2 - li /: def / それらしく動いてます。 pre [[ include | foo_34.txt ]] / としてincludeしてみると [[ include | foo_34.txt ]] OKです。 h3 TODOリスト todoリストの「済」項目をmacro定義にしてみます。 (実はこれがしたかった) pre macro TODO_DONE: | "[[-|h1, h2, h3, ...]]" "[[-|p]]" "[[-|pre]]" "[[-|ul, li]]" "[[-|a (href)]]" "[[-|hr]]" "[[-|img]]" "[[-|video]]" "[[-|s]]" "[[-|目次機能]]" "[[-|headタグのtitleを何とかする]]" "[[-|バグ修正と調整]]" "[[-|br]]" "[[-|dl]]" "[[-|table]]" "[[-|ulからtableへの変換]]" "[[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]]" "[[-|tbl_ulモードでthタグも]]" "[[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]]" "[[-|a (name)]]" "[[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]]" "[[-|モード遷移のバグ修正]]" "[[-|プロパティを細かく指定出来るように]]" "[[-|打ち消し線以外にも文字列の装飾を]]" "[[-|折り畳み]]" "[[-|例の形式の入れ子]]" "[[-|例の形式で簡単なpタグやulタグを生成できないものか]]" "[[-|例の形式で改行を許せぬものか]]" "[[-|ulで改行が消える不具合]]" "[[-|他のテキストファイルをinclude的に取り込みたい]]" "[[-|macroによる文字列の置換]]" "[[-|目次は折り畳めないものか]]" / などと定義しておいて macro TODO_DONE: | "[[-|h1, h2, h3, ...]]" "[[-|p]]" "[[-|pre]]" "[[-|ul, li]]" "[[-|a (href)]]" "[[-|hr]]" "[[-|img]]" "[[-|video]]" "[[-|s]]" "[[-|目次機能]]" "[[-|headタグのtitleを何とかする]]" "[[-|バグ修正と調整]]" "[[-|br]]" "[[-|dl]]" "[[-|table]]" "[[-|ulからtableへの変換]]" "[[-|tblのセルの中の文字列で、先頭に複数の空白を含めたい]]" "[[-|tbl_ulモードでthタグも]]" "[[-|a (href)タグで文字列に'|'を含めるとダメなのを何とかしたい]]" "[[-|a (name)]]" "[[-|h1,h2,h3で後に空行あったらデフォルトのpモードに]]" "[[-|モード遷移のバグ修正]]" "[[-|プロパティを細かく指定出来るように]]" "[[-|打ち消し線以外にも文字列の装飾を]]" "[[-|折り畳み]]" "[[-|例の形式の入れ子]]" "[[-|例の形式で簡単なpタグやulタグを生成できないものか]]" "[[-|例の形式で改行を許せぬものか]]" "[[-|ulで改行が消える不具合]]" "[[-|他のテキストファイルをinclude的に取り込みたい]]" "[[-|macroによる文字列の置換]]" "[[-|目次は折り畳めないものか]]" pre p [[detail| todo | [[mode| ^\ ul \ TODO_DONE \ macroの値への追加 \ コメント対応 \ $ ]] ]] / を記述すれば [[detail| todo | [[mode| ^\ ul \ TODO_DONE \ macroの値への追加 \ コメント対応 \ $ ]] ]] このように。 そこから、今回新たに「済」になった項目 「macroの値への追加」 を追加してみます。 pre macro __ADD__: TODO_DONE: "\n[[-|「macroの値への追加」]]" / 先頭の改行を忘れずに! macro __ADD__: TODO_DONE: "\n[[-|「macroの値への追加」]]" p そして「済」に移動した項目は削除して、todoを表示。 pre [[detail| todo | [[mode| ^\ ul \ TODO_DONE \ コメント対応 \ $ ]] ]] / これで今回のtodoの完成です。 [[detail| todo | [[mode| ^\ ul \ TODO_DONE \ コメント対応 \ $ ]] ]] ---- h2 バージョン35 バグ修正 Python2の環境で、 このページ自身のテキスト [[index.txt]] を変換しようとすると、 いつしかエラーが出るようになっていました。 修正します。 h3 Python2でのエラー pre $ ./to_html.py head.yaml index-v34.txt ezmd Traceback (most recent call last): File "./ezmd.py", line 787, in lst = s_to_tag_lst(s) File "./ezmd.py", line 779, in s_to_tag_lst lst = ezmd(lst) File "./ezmd.py", line 738, in ezmd e.run() File "./ezmd.py", line 132, in run func(e) File "./ezmd.py", line 735, in func = lambda e: do_mode(e.mode, e.tmp, hd_names) File "./ezmd.py", line 632, in do_mode macro_dic_update(buf) File "./ezmd.py", line 604, in macro_dic_update d = dict( map( lambda kv: list( map(cv, kv) ), d.items() ) ) File "./ezmd.py", line 604, in d = dict( map( lambda kv: list( map(cv, kv) ), d.items() ) ) File "./ezmd.py", line 603, in cv = lambda o: list( map(cv, o) ) if is_lst(o) else str(o) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128) / Python3では文字列はstr型、Python2ではstr型かunicode型。 Python3ではstr型のoをstr(o)で変換しようとするとoのままでOK。 Python2ではunicode型のoをstr(o)でstrに変換しよとしてエラー。 h3 そもそもこの問題の箇所でstr(o)にしてる理由 yaml.load()した結果の変換辞書の値側で、「123」や「True」などがあれば、intやboolの値になっています。 そういうケースに備えて、ここでstr(o)で文字列に変換しています。 h3 対策 nkfの中で吸収したいところですが、ezmd.pyでimport sixもしてるので、とりあえずezmd.py側で。 まず、is_str(o) について。 この関数の判定は、ezmd.py の内部データの世界だけのものなので、ゆるゆるです。 is_lst(o) による「リスト」でもなく、かつ、is_tag(o) による「タグ」でもなければ、真にしてます。 これを、より厳しく。 Python3ならtype(o)がstrか、Python2ならtype(o)がstrかunicodeか。 この条件を追加します。 そうした上で、エラー発生箇所の pre str(o) / を pre o if is_str(o) else str(o) / に置き換えておきます。 これで、Python2でoがuniocdeのときはstr(o)をしないはず。 h3 パッチ @INC_LINK NAME=v35.patch pre $ cat v35.patch | patch -p1 / エラー問題の他にも、ポカをみつけたので修正を入れてます。 h3 修正確認 pre $ ./to_html.py head.yaml index-v34.txt ezmd | diff -u index-v34.html - $ / そしてPython2の環境にて pre $ ./to_html.py head.yaml index-v34.txt ezmd | diff -u index-v34.html - | nkf -u | grep ^[-+] : -
    関数名 int foo_send(const unsigned char *buf, unsigned bytes)
    説明 データ送信開始
    +
    foo
    -
    foo
    +
    foo
    : -
    foo
    +
    分類
    - + -
    分類
    :
    :
    +
    Type
    - + / OK エラーは消え、結果にタグの属性の順番の違い以外の変化はありません。 macro __ADD__: TODO_DONE: "\n[[-| Python2の環境でエラー ]]" p [[detail| todo | [[mode| ^\ ul \ TODO_DONE \ コメント対応 \ $ ]] ]] ---- h2 バージョン36 コメント対応 ちょっとテキスト中の一部を「無効化」して様子を見てから、 また復活させたいてな事が多々あります。 テキストを処理するときに、コメントとして扱う対応を入れます。 h3 仕様 YAML形式と同様に「'#'以降行末まで」にしたいところですが、 pre [[name|foo]] [[#foo|bar hoge]] / 的に、ちょいちょい重要な'#'が出てくるので、パースして判断するのが繁雑です。 ここはひとつ、「行頭が'#'で始まる行はコメント」で。 h3 パッチ @INC_LINK NAME=v36.patch pre $ cat v36.patch | patch -p1 / It's very simple. preタグ以外について、 行末エスケープによる「行の結合」処理の直前に、 コメント処理を入れてみました。 聖域preタグの中は、行頭が'#'でも有効です。 行結合前にコメントを処理するので pre p foo \ bar \ hoge / を pre p foo \ # bar \ hoge / にすると pre p foo \ hoge / 相当になります。 h3 従来の動作の確認 pre $ ./to_html.py head.yaml index-v35.txt ezmd | diff -u index-v35.html - $ / OK h3 今回の追加機能の確認 pre $ ./ezmd.py < ul > foo > bar > hoge > EOL - ul: - li /: foo - li /: bar - li /: hoge $ ./ezmd.py < ul > foo > # bar > hoge > EOL - ul: - li /: foo - li /: hoge $ ./ezmd.py < p > foo \\ > bar \\ > hoge > EOL - p: - foobarhoge $ ./ezmd.py < p > foo \\ > # bar \\ > hoge > EOL - p: - foohoge / OK macro __ADD__: TODO_DONE: "\n[[-| コメント対応 ]]" p [[detail| todo | [[mode| ^\ ul \ TODO_DONE \ macroの変換結果に「例の形式」やモードの記述を含めたい \ $ ]] ]] ---- h2 バージョン37 macroの変換結果に「例の形式」やモードの記述を含めたい macroによる変換は、do_mode()関数冒頭で、 モードの処理をする直前の箇所に入ってます。 ここで、聖域「preモード」以外を判別して、 モード処理対象の文字列リストに変換をかけてます。 なので、do_mode()呼び出しで指定された引数「mode」の中だけの、 文字列の変換になります。 例えば [[foo_37.txt]] pre $ cat foo_37.txt macro foo: hoge bar: - ul - hoge-1 - hoge-2 p foo bar / などと記述しても pre $ ./ezmd.py < foo_37.txt - p: - hoge - p: - ul - hoge-1 - hoge-2 / となります。 barの箇所は、pモードから逃れる事はできません。 そこを何とか pre p foo bar / の箇所は pre p hoge ul hoge-1 hoge-2 / の扱いにしたいところ。 対応してみます。 h3 パッチ @INC_LINK NAME=v37.patch pre $ cat v37.patch | patch -p1 / macro変換の位置を、do_mode()関数の冒頭から、 ezmd()関数内で do_mode() を呼び出すよりも前にしました。 実際には buf_loop_new()関数からコールバック的に呼び出される、 is_call()関数の中で変換してます。 buf_loop_new()関数の中での buf の扱い方にも修正を入れました。 h3 従来の動作の確認 pre $ ./to_html.py head.yaml index-v36.txt ezmd | diff -u index-v36.html - $ / OK h3 今回の追加機能の確認 pre $ ./ezmd.py < foo_37.txt - p: - hoge - ul: - li /: hoge-1 - li /: hoge-2 / OK h3 todoリスト では早速、TODO_SHOWなるマクロを定義して使ってみます。 pre macro TODO_YET: macroに引数を TODO_SHOW: | [[ detail | todo | [[ mode | ^\ ul \ TODO_DONE \ TODO_YET \ $ ]] ]] __ADD__: TODO_DONE: "\n[[-| macroの変換結果に「例の形式」やモードの記述を含めたい ]]" p TODO_SHOW / macro TODO_YET: macroに引数を TODO_SHOW: | [[ detail | todo | [[ mode | ^\ ul \ TODO_DONE \ TODO_YET \ $ ]] ]] __ADD__: TODO_DONE: "\n[[-| macroの変換結果に「例の形式」やモードの記述を含めたい ]]" p TODO_SHOW ---- h2 バージョン38 macroに引数を マクロに引数の変換を追加してみます。 h3 仕様 変換辞書に ul 特別なキー'__ARG__' その値として「引数の辞書」 p を追加します。 「引数の辞書は」 ul 変換辞書の対象のキー その値として「仮引数名のリスト」 p として用意します。 例えば変換辞書が pre FOO: hello NAME, you should DO __ARG__: FOO: [NAME, DO] / という状態のときに pre FOO(bar, work) / が現れると pre hello bar, you should work / に変換。 pre FOO(hoge, sleep) / だと pre hello hoge, you should sleep / てな具合に。 そして「変換辞書」を、そのような状態に設定するために、 macroモード中に記述する「更新用の辞書」はどうすべきか? やはり __ARG__ というキーを使って記述します。 pre macro FOO: hello NAME, you should DO __ARG__: FOO: [NAME, DO] / 仮引数の設定を削除するときは、値に [] の空リストを指定します。 pre macro __ARG__: FOO: [] / また、変換用辞書からキーが削除されたら、__ARG__ 側の設定も削除されます。 マクロ呼び出しでは、キーの後に pre ( xxx, xxx, ... ) / 括弧の中に、','で区切って実引数を並べて指定します。 仮引数と実引数の個数が合わないときは、 合う分までだけ使って変換をかけます。 なので、実引数が足りない場合は、一部は仮引数のままで表示されます。 h3 パッチ @INC_LINK NAME=v38.patch pre $ cat v38.patch | patch -p1 / h3 従来の動作の確認 pre $ ./to_html.py head.yaml index-v37.txt ezmd | diff -u index-v37.html - $ / OK h3 今回の追加機能の確認 pre macro foo: hoge bar: - ul - hoge-1 - fuga-2 __ARG__: bar: [hoge, fuga] p foo bar(x, y) p foo bar # 削除用 macro foo: foo bar: bar p foo bar(x, y) / の場合 ---- macro foo: hoge bar: - ul - hoge-1 - fuga-2 __ARG__: bar: [hoge, fuga] p foo bar(x, y) p foo bar # 削除用 macro foo: foo bar: bar p foo bar(x, y) ---- OK h3 よく使うパターンをマクロで見易く さほど変わらない気もしますが、例えば次のパターン pre [[ detail | label | [[ mode | ^\ ul \ foo \ bar \ $ ]] ]] / [[ detail | label | [[ mode | ^\ ul \ foo \ bar \ $ ]] ]] このパターンを引数付きのマクロにしてみます。 pre macro DETAIL_MODE: | [[ detail | label | [[ mode | ^\ modes \ $ ]] ]] __ARG__: DETAIL_MODE: [ label, modes ] / macro DETAIL_MODE: | [[ detail | label | [[ mode | ^\ modes \ $ ]] ]] __ARG__: DETAIL_MODE: [ label, modes ] p などと定義しておいて pre DETAIL_MODE(foo_tbl, \ tbl \ tbl_ul \ foo \ bar \ hoge \ ) / などとマクロを使ってみると DETAIL_MODE(foo_tbl, \ tbl \ tbl_ul \ foo \ bar \ hoge \ ) このように。 一応、中間のYAML形式も確認しておきます。 [[foo_38.txt]] pre $ cat foo_38.txt macro DETAIL_MODE: | [[ detail | label | [[ mode | ^\ modes \ $ ]] ]] __ARG__: DETAIL_MODE: [ label, modes ] p DETAIL_MODE(foo_tbl, \ tbl \ tbl_ul \ foo \ bar \ hoge \ ) / pre $ ./ezmd.py < foo_38.txt - p: - details: - summary: foo_tbl - table cellspacing="0" border="1": - tr: - td colspan="2": foo - tr: - td: bar - td: hoge / どちらかと言うと、展開後のテキストを表示したいところでしたね。 macro TODO_YET: マクロの展開を確認し易いように __ADD__: TODO_DONE: "\n[[-| macroに引数を ]]" p TODO_SHOW ---- h2 バージョン39 マクロの展開を確認し易いように h3 仕様 コマンド引数のオプションを追加します。 って、ここまでオプション指定は皆無でした。 pre import sys / からの追加です。 gccの仕様にならって -E で。 pre $ gcc --help | grep -i preprocess | grep -i only -E Preprocess only; do not compile, assemble or link / dl -E 「マクロ展開っぽい動作」 p としてみます。 h3 パッチ @INC_LINK NAME=v39.patch pre $ cat v39.patch | patch -p1 / h3 従来の動作の確認 pre $ ./to_html.py head.yaml index-v38.txt ezmd | diff -u index-v38.html - $ / OK h3 今回の追加機能の確認 前回の [[foo_38.txt]] を使って pre $ cat foo_38.txt macro DETAIL_MODE: | [[ detail | label | [[ mode | ^\ modes \ $ ]] ]] __ARG__: DETAIL_MODE: [ label, modes ] p DETAIL_MODE(foo_tbl, \ tbl \ tbl_ul \ foo \ bar \ hoge \ ) / pre $ ./ezmd.py -E < foo_38.txt p macro DETAIL_MODE: | [[ detail | label | [[ mode | ^ modes $ ]] ]] __ARG__: DETAIL_MODE: [ label, modes ] p [[ detail | foo_tbl | [[ mode | ^ tbl tbl_ul foo bar hoge $ ]] ]] p tbl tbl_ul foo bar hoge / pre $ ./ezmd.py -E < foo_38.txt | diff -u foo_38.txt - --- foo_38.txt 2019-10-16 19:33:29.624169000 +0900 +++ - 2019-10-17 00:35:29.695229535 +0900 @@ -1,16 +1,26 @@ +p macro DETAIL_MODE: | - [[ detail | label | [[ mode | ^\ - modes \ + [[ detail | label | [[ mode | ^ + modes $ ]] ]] __ARG__: DETAIL_MODE: [ label, modes ] p -DETAIL_MODE(foo_tbl, \ -tbl \ -tbl_ul \ - foo \ - bar \ - hoge \ -) +[[ detail | foo_tbl | [[ mode | ^ +tbl +tbl_ul + foo + bar + hoge +$ ]] ]] + + +p + +tbl +tbl_ul + foo + bar + hoge / 「何となく展開された内容」になってます。 ul 前半は、行の結合処理で行末エスケープの削除 真中あたりは展開の違い 後半は、「例の形式」のモード指定で、呼び出しが「でんぐり返って」\ 処理された分が追加 もうちょっと何とかしたい。 macro TODO_YET: マクロの展開表示をもうちょっと改良すべし __ADD__: TODO_DONE: "\n[[-| マクロの展開を確認し易いように ]]" p TODO_SHOW ---- h2 バージョン40 マクロの展開表示をもうちょっと改良 場当たり的に改良してみました。 h3 パッチ @INC_LINK NAME=v40.patch pre $ cat v40.patch | patch -p1 / 出力先のoutbufの切替えが、「テンポラリ」バッファじゃなく、 「オリジナル」バッファのときだけ、展開結果を表示します。 展開結果の文字列に「改行」が含まれていると、 行結合処理を逆にさかのぼらせて、「エスケープ」+「改行」 に置き換えなおして表示します。 h3 従来の動作の確認 関係ないはずですが、一応... pre $ ./to_html.py head.yaml index-v39.txt ezmd | diff -u index-v39.html - $ / OK h3 今回の追加機能の確認 前回同様に [[foo_38.txt]] を使って pre $ cat foo_38.txt macro DETAIL_MODE: | [[ detail | label | [[ mode | ^\ modes \ $ ]] ]] __ARG__: DETAIL_MODE: [ label, modes ] p DETAIL_MODE(foo_tbl, \ tbl \ tbl_ul \ foo \ bar \ hoge \ ) / pre $ ./ezmd.py -E < foo_38.txt p macro DETAIL_MODE: | [[ detail | label | [[ mode | ^\ modes \ $ ]] ]] __ARG__: DETAIL_MODE: [ label, modes ] p [[ detail | foo_tbl | [[ mode | ^\ tbl \ tbl_ul \ foo \ bar \ hoge \ $ ]] ]]\ / pre $ ./ezmd.py -E < foo_38.txt | diff -u foo_38.txt - --- foo_38.txt 2019-10-16 19:33:29.624169000 +0900 +++ - 2019-10-17 01:18:32.628846240 +0900 @@ -1,3 +1,4 @@ +p macro DETAIL_MODE: | [[ detail | label | [[ mode | ^\ @@ -7,10 +8,11 @@ DETAIL_MODE: [ label, modes ] p -DETAIL_MODE(foo_tbl, \ +[[ detail | foo_tbl | [[ mode | ^\ tbl \ tbl_ul \ foo \ bar \ hoge \ -) +$ ]] ]]\ + / それらしくなりました。 先頭の p は、ezmd()関数の冒頭で、 デフォルトpモードとして最初に追加してた分になります。 pre def ezmd(lst): lst = ['p'] + lst (buf, hd_names) = ( [], [] ) : / -E 出力結果を、ちゃんと処理できるだろうか? まず pre $ ./ezmd.py < foo_38.txt | tee foo_38.yaml - p: - details: - summary: foo_tbl - table cellspacing="0" border="1": - tr: - td colspan="2": foo - tr: - td: bar - td: hoge / そして pre $ ./ezmd.py -E < foo_38.txt | ./ezmd.py - p: - details: - summary: foo_tbl - table cellspacing="0" border="1": - tr: - td colspan="2": foo - tr: - td: bar - td: hoge / pre $ ./ezmd.py -E < foo_38.txt | ./ezmd.py | diff -u foo_38.yaml - $ / とりあえず一致。 この短いテキストでの例だけでは「なんとも」ですが... とりあえずincludeは展開されないはず。 はっ。出力先が「オリジナル」バッファのときだけに限定したので、 swbufモードで切替えた時も、表示されない... macro TODO_YET: マクロ展開表示の改良その2 __ADD__: TODO_DONE: "\n[[-| マクロの展開表示をもうちょっと改良すべし ]]" p TODO_SHOW ---- h2 バージョン41 マクロ展開表示の改良その2 マクロ展開結果を記録するかどうかを、 [[**|「出力バッファの状態」]] で判定するのではなく、 [[**|「例の形式」によるモード処理中なのかどうか]] で判定するようにしてみました。 h3 パッチ @INC_LINK NAME=v41.patch pre $ cat v41.patch | patch -p1 / h3 従来の動作の確認 関係ないはずですが、一応... pre $ ./to_html.py head.yaml index-v40.txt ezmd | diff -u index-v40.html - $ / OK h3 今回の追加機能の確認 まずは前回同様に [[foo_38.txt]] を使って pre $ cat foo_38.txt macro DETAIL_MODE: | [[ detail | label | [[ mode | ^\ modes \ $ ]] ]] __ARG__: DETAIL_MODE: [ label, modes ] p DETAIL_MODE(foo_tbl, \ tbl \ tbl_ul \ foo \ bar \ hoge \ ) / pre $ ./ezmd.py -E < foo_38.txt | diff -u foo_38.txt - --- foo_38.txt 2019-10-16 19:33:29.624169000 +0900 +++ - 2019-10-17 06:11:28.313139204 +0900 @@ -1,3 +1,4 @@ +p macro DETAIL_MODE: | [[ detail | label | [[ mode | ^\ @@ -7,10 +8,11 @@ DETAIL_MODE: [ label, modes ] p -DETAIL_MODE(foo_tbl, \ +[[ detail | foo_tbl | [[ mode | ^\ tbl \ tbl_ul \ foo \ bar \ hoge \ -) +$ ]] ]]\ + / pre $ ./ezmd.py < foo_38.txt | tee foo_38.yaml - p: - details: - summary: foo_tbl - table cellspacing="0" border="1": - tr: - td colspan="2": foo - tr: - td: bar - td: hoge / pre $ ./ezmd.py -E < foo_38.txt | ./ezmd.py | diff -u foo_38.yaml - $ / ではひとつ、大きなテキストで。 pre $ ./ezmd.py -E < index-v40.txt | diff -u index-v40.txt - | nkf -u | less --- index-v40.txt 2019-10-17 01:33:49.632704000 +0900 +++ - 2019-10-17 06:46:55.271461558 +0900 @@ -1,3 +1,4 @@ +p h1 簡易なおれおれマークダウン 2019秋 @@ -8323,7 +8324,11 @@ [[ detail | label | [[ mode | ^\ ul \ abc \ -FOO \ +[[foo | bar]]\ + foo-1\ + foo-2\ +hoge\ + \ def \ $ ]] ]] @@ -8904,7 +8909,39 @@ [[detail| todo | [[mode| ^\ ul \ -TODO_DONE \ +"[[-|h1, h2, h3, ...]]"\ +"[[-|p]]"\ +"[[-|pre]]"\ : / 確かにマクロ展開分だけの変化に見えます。 pre $ ./ezmd.py < index-v40.txt > index-v40.yaml $ nkf -u index-v40.yaml | head - h1: a name="c_1_0": 簡易なおれおれマークダウン 2019秋 - p: - a name="c_index": '' - p: - details: - summary: 目次 - ul: - li /: a href="#c_2_1": はじめに / YAML形式にしておいて pre $ ./ezmd.py -E < index-v40.txt | ./ezmd.py | diff -u index-v40.yaml - $ / 完全に一致。OK pre $ cat index-v40.txt | wc -l 9962 $ ./ezmd.py -E < index-v40.txt | diff -u index-v40.txt - | wc -l 510 $ ./ezmd.py -E < index-v40.txt | ./ezmd.py | wc -l 11021 / 1万行程度の入力テキスト中、 510行程度の差分があって、 1万行程度のYAML形式の出力が一致してます。 おそらく「うまくいってる」はずです。 macro TODO_YET: | macroの実引数の文字列中に')'があるとダメな件 includeした内容も展開して表示できぬものか pre以外でも'/'を使えるように __ADD__: TODO_DONE: "\n[[-| マクロ展開表示の改良その2 ]]" p TODO_SHOW ---- h2 バージョン42 pre以外でも'/'を使えるように 既存のテキストにモード行を入れる作業をしてみると、 pモードからulモードへ、そして再びpモードに戻るようなパターンが多々ありました。 ulモードでもpreモードのように、終端で'/'が使えても良いかなぁと。 どうせなら、ul以外の他のモードでも使えて良いかなぁと。 さらにどうせなら、スタック構造とまではせずとも、1つ前のモードを覚えておいて、 '/'行で1つ前のモードに戻れたら良いかなぁと。 h3 仕様 互換性のため、既存のpreモードの'/'は従来通りの動作を保ちます。 基本的にその他のモードでは、'/'だけの行が現れると、 1つ前のモードに遷移します。\n (前の状態に戻るわけではなく、前のモードで新たに開始します) h3 パッチ @INC_LINK NAME=v42.patch pre $ cat v42.patch | patch -p1 / 短いです。 h3 従来の動作の確認 pre $ ./to_html.py head.yaml index-v41.txt ezmd | diff -u index-v41.html - $ / OK h3 今回の追加機能の確認 例えば pre h4 sample v42 foo bar ul 大阪 京都 / hoge fuga tbl tbl_ul 滋賀 奈良 / hello world / 名古屋 東京 / xxx yyy / の場合は ---- h4 sample v42 foo bar ul 大阪 京都 / hoge fuga tbl 滋賀 奈良 / hello world / 名古屋 東京 / xxx yyy ---- macro TODO_YET: | macroの実引数の文字列中に')'があるとダメな件 includeした内容も展開して表示できぬものか __ADD__: TODO_DONE: "\n[[-| pre以外でも'/'を使えるように ]]" p TODO_SHOW ---- [[name|c_v43]] h2 バージョン43 不具合修正 永らく放置されてた不具合がありました。 headタグが2重に出力されておりました。 修正します。 あと、.py群を1つ下のディレクトリ、例えばdoc_base/に移動しておいて、 そこにcdしてから実行するような場合、 includeではcdした事がわからず、ファイルが見つからない不具合がありました。 場当たり的ですが、includeしたいファイルが無いと、 とりあえず1つ上のディレクトリで試すようにしてみました。 h3 パッチ @INC_LINK NAME=v43.patch pre $ cat v43.patch | patch -p1 / ---- [[name|c_v44]] h2 バージョン44 to_html.pyを整えてみました [[ ../kon_ut/index.html | pythonのユーティリティ・プログラム 2020冬 ]] が揃ってきたので、to_html.pyの見直しもかねて、kon_utを使うようにしてみました。 h3 パッチ @INC_LINK NAME=v44.patch pre $ cat v44.patch | patch -p1 / h3 kon_utの配置 例えば最新版を次のような手順でダウンロードして、使えるようにしておきます。 pre $ cd /home/hoge $ mkdir kon_ut $ cd kon_ut $ wget http://kondoh.html.xdomain.jp/kon_ut/empty.py $ wget http://kondoh.html.xdomain.jp/kon_ut/dbg.py $ wget http://kondoh.html.xdomain.jp/kon_ut/thr.py $ wget http://kondoh.html.xdomain.jp/kon_ut/cmd_ut.py $ wget http://kondoh.html.xdomain.jp/kon_ut/io_ut.py $ wget http://kondoh.html.xdomain.jp/kon_ut/chat_conn.py $ wget http://kondoh.html.xdomain.jp/kon_ut/nkf.py $ wget http://kondoh.html.xdomain.jp/kon_ut/arg.py 例えば $ python -m site --user-site /Users/hoge/Library/Python/3.6/lib/python/site-packages $ ls /Users/hoge/Library/Python/3.6/lib/python/site-packages ls: No such file or directory ディレクトリが無かったら作っておく $ mkdir -p $(python -m site --user-site) $ pwd /home/hoge/kon_ut なので echo $(pwd) > $(python -m site --user-site)/kon_page.pth などと.pthファイルを生成 / これでたぶん、どこにいてもkon_utのファイルがimportできます。 pre $ cd /tmp $ python >>> import dbg >>> dbg.out('hoge') hoge / h3 ezmdの配置 kon_utと同様に、ezmdも使えるようにしておきます。 pre $ mkdir /home/hoge/ezmd $ cp ezmd.py join_yaml.py to_html.py head.yaml /home/hoge/ezmd/ $ cp ezhtml.py /home/hoge/ezmd/ # !!! (nkf.pyはkon_ut側にとりこまれたので既に使えるはずです) 例えば $ python -m site --user-site /Users/hoge/Library/Python/3.6/lib/python/site-packages $ ls $(python -m site --user-site) kon_page.pth $ cat $(python -m site --user-site)/kon_page.pth /home/hoge/kon_ut $ ならば $ pwd /home/hoge/ezmd $ echo $(pwd) >> $(python -m site --user-site)/kon_page.pth $ cat $(python -m site --user-site)/kon_page.pth /home/hoge/kon_ut /home/hoge/ezmd $ / h3 to_html.pyの呼び出し 例えば [[sample.txt]] としたら pre $ python -m to_html -t sample -h head.yaml -o sample.html sample.txt $ cat sample.html sample

    sample

    hogehoge

    foo

    fugafuga

    bar

    ---

    Type
    :
    :
    foo bar
    hogehoge fugafuga

    ---

    / @INC_LINK NAME=sample.html -h 指定の head.yaml がカレントディレクトリに無ければ、 先の例で /home/hoge/ezmd/ にダウンロードした head.yaml が使われます。 ---- [[name|c_v45]] h2 バージョン45 目次用のアンカー文字列 h1, h2, h3, ... の見出しから自動生成するアンカー文字列の形式が pre c_<見出しのh1,h2,..の数字>_<先頭からの総番号> / のせいで、リンク先をURLで示したいときに、解りにくい問題があります。 「バージョン21 (a (name))」で述べてる通りです。 安易に、見出しの内容の1行目がASCIIコードだけなら、 何とかしてみました。 そうで無ければ従来通りの解りにくいアンカー文字列のままです。 スペースを'_'に変換した上で、 既に使用されていたら '_2', '_3', ... を追加してみて、 使われていないものを探します。 h3 パッチ @INC_LINK NAME=v45.patch pre $ cat v45.patch | patch -p1 / h3 実行例 例えば pre $ cat hoge.txt h1 hoge index 2: h2 fuga fuga fuga h2 foo foo foo h3 bar bar bar h2 ホゲ ホゲホゲ h3 フガ フガ ---- / pre $ python -m to_html -t hoge -h head.yaml -o hoge.html hoge.txt $ cat hoge.html hoge

    hoge

    fuga

    fuga fuga

    foo

    foo foo

    bar

    bar bar

    ホゲ

    ホゲホゲ

    フガ

    フガ


    / @INC_LINK NAME=hoge.html ---- h2 バージョン46 ヘッダのタイトル指定 to_html.py のパラメータ指定のうちで、 ヘッダ部分のタイトルは、ページによって個別に違います。 ここはデフォルトの指定はあまり意味がなく、個別に指定が必要で面倒です。 特に指定が無ければデフォルトの動作として、 bodyの中のh1タグから拾ってくるようにしてみました。 これで、お決まりのhead.yamlの使用と、 index.txtからindex.htmlの生成の場合は、 to_html.py の実行だけで何とかなります。 日本語はISO-2022-JPだけ試し確認してみました。 他のエンコーディングの場合はうまくいかないかもです ;-p) h3 パッチ @INC_LINK NAME=v46.patch pre $ cat v46.patch | patch -p1 / h3 実行例 ここはひとつ、このページ自身で... pre $ python -m to_html / pre $ head index.html | nkf -u 簡易なおれおれマークダウン 2019秋

    簡易なおれおれマークダウン 2019秋

    目次
    • はじめに
    • headとbody
    • タグ
    • 簡易にモード切り替えで
    • バージョン1 (h,pタグ)
    • バージョン2 (preタグ) / ---- h2 バージョン47 ヘッダのタイトル指定のバグ修正 内部で使ってるjoin_yaml.pyの仕様を勘違いしておりました。 to_html.pyで-hによるヘッダの指定が無ければ、join_yaml.pyの標準入力に与えるデータに、 head.yamlの内容も含まれる事にしていました。 to_html.py で-hのヘッダの指定が無いときは、 -h head.yaml がデフォルトで指定される事にします。 h3 パッチ @INC_LINK NAME=v47.patch pre $ cat v47.patch | patch -p1 / h3 実行例 今度こそ、このページ自身で... pre $ python -m to_html / pre $ head index.html | nkf -u 簡易なおれおれマークダウン 2019秋

      簡易なおれおれマークダウン 2019秋

      目次
      • はじめに / ---- h2 バージョン48 hrefのリンク指定の拡張 アイデアを思い付いたので、久しぶりの更新です。 従来からのhrefリンクの使いづらさは [[ @バージョン45$_目次用のアンカー文字列 ]] [[ @バージョン21$_(a$_(name)) ]] で述べてる通りです。 ふふふ。 上記リンク。うまく張れてるようですね。 h3 仕様 従来のa hrefタグ pre [[ v1 | v2 ]] v2 / を拡張して pre [[ @v1 | v2 ]] / を導入します。 v1がh1,h2,h3,...の文字列に該当するものがあれば、 目次で使うリンク文字列"c_xxx_yyy"に置き換えて pre v2 / に変換します。 pre [[ @v1 ]] / の場合は pre < href="c_xxx_yyy"> v1 / に変換します。 ほとんどが、こちらの使い方だと思います。 また、上記"@v1"のv1の中にスペースがあると、うまく動作しません。 スペースは"$_"に置き換えて指定します。 冒頭のリンクの例では pre [[ @バージョン45$_目次用のアンカー文字列 ]] [[ @バージョン21$_(a$_(name)) ]] / と記述して pre

        バージョン45 目次用のアンカー文字列

        バージョン21 (a (name))

        / に変換されます。 h3 パッチ @INC_LINK NAME=v48.patch pre $ cat v48.patch | patch -p1 / 1 pass目での処理するのは無理で、 2 pass目の目次生成の処理に追加して、 紛れこませてます。 ---- h2 バージョン49 ちょっとした更新 include のファイルパスが相対パスのときの、サーチパスをちょっと変えてみました。 これまで、カレントディレクトリに無かったときに、とりあえず1つ上のディレクトリ固定としてました。 実行してるezmd.pyのあるディレクトリを追加しました。 pre --- v48/ezmd.py 2020-07-16 01:04:06.000000000 +0900 +++ v49/ezmd.py 2020-09-06 21:26:41.000000000 +0900 @@ -215,8 +215,12 @@ ps = ('http', 'https') cmd = 'wget -q -O-' if any( map( lambda p: s.startswith(p + '://'), ps ) ) else 'cat' - if cmd == 'cat' and not os.path.exists(s): # todo - s = '../' + s + if cmd == 'cat' and not os.path.exists(s) and s[0] != '/': + for d in [ '..', os.path.dirname( __file__ ) ]: + t = os.path.join( d, s ) + if os.path.exists( t ): + s = t + break b = subprocess.check_output( cmd + ' ' + s, shell=True ) (s, nkf_opt) = nkf.to_str(b) / to_htmlのオプションもちょっとだけ変更しました。 -o の出力ファイル指定 ’-' でstdout出力に 拡張子'.yaml' または、-yaml 追加でYAML形式のまま出力に h3 パッチ @INC_LINK NAME=v49.patch pre $ cat v49.patch | patch -p1 / ---- h2 バージョン50 include再び [[ @バージョン31$_include ]] が、あまりにも使いにくいです。 C言語のプリプロセッサのように、 別途、単純な前処理のincludeを導入します。 [[ ../inc/index.html | include処理の推敲 ]] から [[ ../kon_ut/index.html | kon_ut ]] に追加してあるので、それを使います。 include指定行は、行頭から@で始まり、続いて「@以外または空白文字以外」が1つ以上続くパターンにします。 「@以外または空白文字以外」が1つ以上続く部分が、ファイルの指定になります。 h3 パッチ @INC_LINK NAME=v50.patch pre $ cat v50.patch | patch -p1 / パッチを当てると、データテキストファイル3つも追加されます。 [[ TOPS ]] [[ TOPE ]] [[ INC_LINK ]] h3 使用例 [[ TOPS ]] と [[ TOPE ]] は、冒頭でよく使う「更新履歴」と「目次」生成用です。 pre @TOPS 2019/SEP/01 新規作成 2020/SEP/01 追記 @TOPE / などと記述すると pre swbuf buf_update tbl tbl_ul ||日付 ||変更内容 2019/SEP/01 新規作成 2020/SEP/01 追記 / swbuf p [[ detail | 更新履歴 | [[ paste | buf_update ]] ]] swbuf buf_index index 2: swbuf p [[ detail | 目次 | [[ paste | buf_index ]] ]] / に展開され @TOPS 2019/SEP/01 新規作成 2020/SEP/01 追記 @TOPE となります。 [[ INC_LINK ]] は preタグでincludeしてバッファに記録しつつ、 detailタグで折り畳んで、ラベルはリンクにします。 pre @INC_LINK NAME=v50.patch / などと記述すると pre swbuf buf_v50.patch pre @v50.patch -nr -s / swbuf p [[ detail | [[ v50.patch ]] | [[ paste | buf_v50.patch ]] ]] / に展開されて @INC_LINK NAME=v50.patch となります。 include指示行に字下げ -s オプションを追加しました。 [[ @INC_LINKの更新 ]] (2020/OCT/10 追加) ---- h2 テーブルの修正 気になりつつ長らく放置してた問題を対策しておきます。 [[ tbl_ng.txt ]] pre h1 tbl_ng tbl tbl_ul foo bar hoge fuga / / の場合 pre $ cat tbl_ng.txt | ./ezmd.py - h1: a name="tbl_ng": tbl_ng - table border="1" cellspacing="0": - tr: - td rowspan="2": foo - td: bar - tr: - td: hoge - td: fuga / からの pre $ to_html -o - tbl_ng.txt tbl_ng

        tbl_ng

        foo bar
        hoge fuga
        / pre $ to_html -o tbl_ng.html tbl_ng.txt / @INC_LINK NAME=tbl_ng.html と、残念なbarセルのcolspan指定になっていました。 h3 パッチ @INC_LINK NAME=v51.patch pre $ cat v51.patch | patch -p1 / h3 確認 pre $ cat tbl_ng.txt | ./ezmd.py - h1: a name="tbl_ng": tbl_ng - table border="1" cellspacing="0": - tr: - td rowspan="2": foo - td colspan="2": bar - tr: - td: hoge - td colspan="2": fuga / pre $ to_html -o - tbl_ng.txt tbl_ng

        tbl_ng

        foo bar
        hoge fuga
        / pre $ to_html -o tbl_ok.html tbl_ng.txt / @INC_LINK NAME=tbl_ok.html OK。 h3 さらなる修正 OK。じゃなかったです。見逃していました。 pre $ cat tbl_ng.txt | ./ezmd.py - h1: a name="tbl_ng": tbl_ng - table border="1" cellspacing="0": - tr: - td rowspan="2": foo - td colspan="2": bar - tr: - td: hoge - td colspan="2": fuga / 末尾の fuga は colspan 1 になるはずです。 ソースを追いかけてみると、tbls_join()関数にバグがありました。 @INC_LINK NAME=v52.patch pre $ cat tbl_ng.txt | ./ezmd.py - h1: a name="tbl_ng": tbl_ng - table cellspacing="0" border="1": - tr: - td rowspan="2": foo - td colspan="2": bar - tr: - td: hoge - td: fuga / pre $ to_html -o tbl_ok2.html tbl_ng.txt / @INC_LINK NAME=tbl_ok2.html 今度は大丈夫だろうか? ---- h2 inc_utのバッファ対応 [[ ../kon_ut/index.html | kon_ut ]] の [[ ../kon_ut/inc_ut.py | inc_ut.py ]] を使っています。 inc_ut.py にバッファの機能を追加した影響で、 自動的にezmd.pyもincludeがバッファ対応になりました。 詳細は [[ ../inc/index.html | include処理の推敲 ]] をご参照ください。 @INC_LINK NAME=v53.patch として @INC_LINK NAME=DETAIL を追加してみます。 例えば pre @>sample-1 tbl tbl_ul ||名前 ||値 hoge 123 / @< @DETAIL LABEL=サンプル-1 NAME=sample-1 / と書けば @>sample-1 tbl tbl_ul ||名前 ||値 hoge 123 / @< @DETAIL LABEL=サンプル-1 NAME=sample-1 となります。 従来からの pre swbuf buf_sample-2 tbl tbl_ul ||名前 ||値 hoge 123 / p [[ detail | サンプル-2 | [[ paste | buf_sample-2 ]] ]] / からの swbuf buf_sample-2 tbl tbl_ul ||名前 ||値 hoge 123 / p [[ detail | サンプル-2 | [[ paste | buf_sample-2 ]] ]] と、どう違うのかと言われると、まぁほぼ同じなのですが、、、 こうも書けるようになった、という事で。 ---- h2 inc_utのバッファ名の自動生成 [[ ../kon_ut/index.html | kon_ut ]] の [[ ../kon_ut/inc_ut.py | inc_ut.py ]] に機能を追加しました。 '@>'でバッファ名を指定しなければ、自動生成されます。 include指示行で'$$'として最後に登録したバッファ名を参照できます。 pre @> tbl tbl_ul ||名前 ||値 hoge 123 / @< @DETAIL LABEL=サンプル-3 NAME=$$ / とも書けるようになりました。 @> tbl tbl_ul ||名前 ||値 hoge 123 / @< @DETAIL LABEL=サンプル-3 NAME=$$ となります。 ---- h2 get_title.py修正 @INC_LINK NAME=v54.patch typoを見つけたので修正。 ついでに、h1がいつのまにか必須になっていた原因がわかったので、 修正しました。 ---- h2 リンクのラベルの省略 pre [[ path_to_html | ラベル ]] [[ url_to_html | ラベル ]] / の場合に、ラベルの文字列を調べて書くのが面倒です。 '|' の後のラベルの箇所を省略すると、 できるだけ頑張って、 HTMLデータのheaderからtitleを探すようにしてみました。 @INC_LINK NAME=v55.patch tilteを探す部分は、 [[ ../kon_ut/index.html | ]] に [[ ../kon_ut/html_ut.py | html_ut.py ]] として追加してみました。 pre [[ path ]] / のように'|' のない場合は、 従来通り pre [[ path | path ]] / 扱いのままです。 ---- h2 INC_LINKの更新 include指示行に字下げ -s オプションを追加しました。 @INC_LINK NAME=v56.patch ファイル中に行頭から’/'だけの行があると、preの末尾として判定されてしまい、 意図したように動作しない事があったので、対策してます。 ---- h2 DETAIL_M @INC_LINK NAME=v57.patch @INC_LINK NAME=DETAIL_M を追加してみました。 @INC_LINK NAME=DETAIL と結果としての機能は同様ですが、swbufを直接使わないで実現してます。 例えば pre @> tbl tbl_ul ||name ||value hoge 123 / @< @DETAIL_M LABEL=table NAME=$$ / は pre [[ detail | table | [[ mode | ^\ tbl \ tbl_ul \ ||name \ ||value \ hoge \ 123 \ / \ $ ]] ]] / に展開されて @> tbl tbl_ul ||name ||value hoge 123 / @< @DETAIL_M LABEL=table NAME=$$ になります。 既出の DETAIL では pre @> tbl tbl_ul ||name ||value hoge 123 / @< @DETAIL LABEL=table NAME=$$ / は pre swbuf buf_tMp_1234 tbl tbl_ul ||name ||value hoge 123 / swbuf p [[ detail | table | [[ paste | buf_tMp_1234 ]] ]] / に展開されて @> tbl tbl_ul ||name ||value hoge 123 / @< @DETAIL LABEL=table NAME=$$ になります。 ---- h2 INDEX @INC_LINK NAME=v58.patch @INC_LINK NAME=INDEX を追加してみました。 @INC_LINK NAME=TOPS @INC_LINK NAME=TOPE の後半に含まれてますが、目次単体で使いたい場面用です。 ---- h2 evalとdateとcmd @INC_LINK NAME=v59.patch 個人的によく使う日付の形式が [[ date ]] なので [[ ../kon_ut/index.html | ]] の [[ ../kon_ut/index.html#tm_ut.py | tm_ut.py ]] に date432() なる関数を追加してみました。 それを利用して、そのまま文書に貼り付けたく、 「例の形式」で指定できるようにしました。 pre [[ date ]] / せっかくなので、それを実現するために、 pre [[ eval | 文字列 ]] / も追加です。 eval()結果は文字列が返ることが前提です。 内部で eval( 文字列 ) を実行し、 その結果の文字列を、内部的に pre [[ mode | 結果の文字列 ]] / としてタグにしてます。 pre [[ date ]] / の場合は、ezmd.pyでimport tm_utしておいて、内部で pre [[ eval | tm_ut.date432() ]] / 相当の処理となってます。 この際なので、ezmd.pyにimport cmd_utも追加しました。 pre [[ cmd | コマンド文字列 ]] / で、コマンド文字列を実行し、結果として表示される文字列が pre [[ mode | 結果として表示される文字列 ]] / として取り込まれます。 pre [[ cmd | date ]] / は [[ cmd | date ]] になります。 ---- h2 リンクのbasename対応 @INC_LINK NAME=v60.patch pre [[ ../../foo/bar/hoge.c ]] / のリンクにすると、格好悪いので pre [[ ../../foo/bar/hoge.c | hoge.c ]] / などとラベルを整えたりします。 hoge.c の basename の部分が長いと面倒なので、 $ を書くと、basename を取り出してくれるようにしておきます。 これで pre [[ ../../foo/bar/hoge.c | $ ]] / でOKです。 pre @INC_LINK NAME=xxx / のリンクラベルも、basename $ 指定にした版を INC_LINK_BN として追加しておきます。 @INC_LINK NAME=INC_LINK_BN ---- h2 bare対応 [[ ../midi/index.html | おれおれマークダウン形式で書き直し作業中 ]] の都合で機能追加というか、手を入れてみました。 実はezmd.pyの対応だけでは済まずに、[[ ../ezhtml/index.html | ]] 側も、 セットでてを入れてます。 "pre"の中でHTMLの仕様の下線...などをそのまま使用したく。 "pre"直後の行が"bare"だけの行になっていると、以降、その"pre"の中では、 ...などがそのまま記述できます。 ezmd.pyとしては、preタグのプロパティにbare="True"を追加するだけの変更になります。 下流のezhtml.py側で、プロパティにbare="True"がついてると、 &, <, > の3つの文字について、"&", "<", ">" のエンコード処理をせずに素通ししてHTMLを生成します。 @INC_LINK NAME=v61.patch pre pre foo bar hoge / / では pre foo bar hoge / となりますが、 pre pre bare foo bar hoge / / では pre bare foo bar hoge / となります。 ----