niszetの日記

細かい情報を載せていくブログ

(Pandoc)OpenDocument形式出力でsyntax highlightingを(ただしインラインCodeかつODTではない)

簡単とは思っていなかったけどやっぱり大変…。

ODT形式の出力はシンタックスハイライトに対応できていません。そのため、これに対応するべくPandocの修正を試みています。

とりあえずissue建てた。

github.com

PRを1個出していて、これはOpenDocument形式での出力時に、対応するコードに対してシンタックスハイライト用のタグが埋め込まれるというもの。

ただし、styleの定義が存在しないのでLibreOfficeで(たぶんMS Wordも同じだけど)開いたときには標準の文字と何も変わらなく見えます。

styles.xmlを更新して対応する文字スタイルを追加しておけば、スタイルが正しくあたるところまでは確認しています。

問題はCodeBlockの処理がDocxのそれと違う事、そしてスタイルを自動生成するコードを作らねばならないことの2点です。

そもそも今のODTではautoのstyleを大量に生成してしまうのでそれってどうなの?というのもあるんですが。この辺りはODT/LOWの思想がどうなっているのかを確認していないので(LOWでファイルをつくってunzipして確認すればよい)追々やっていきまする。

作業時間は1日くらいですが、ほとんどコードとにらめっこしてる時間でしたね。Docxのコードをコピーして型合わせみたいな感じでしたし。

引き続き、PandocのODT形式出力の仕様の強化にむけてやっていきたいと思います(力尽きないといいなぁ…)

追記

そういえばコレはマージされました。さすにす。

あと、CodeBlock対応のために上記のCodeの処理を変えました。

github.com

これはdocxの処理を発想はそのまま、コードは合う形で移植したものです。

とりあえずtestを対応するものに書き換えれば、OpenDocument形式での出力は一応整合するかな。style名は修正したいのだけど。

問題はstyleを実装するWriter/ODT.hsの方で、これを修正するのが骨が折れそうなのです…。とりあえず動くところまでは頑張りたい

(Pandoc)Docx/ODT Writer中の文字コードの確認処理

時間を無駄に溶かしたのでメモをする。

はじめにPandocじゃない話を書いておくと、Rは"\uxxxx"でunicode文字を入れることが出来る。"\u2603"とかやれば☃だ。大文字のUを使えば、4桁で済まない文字も入れられるし、上4つを0で詰めておけば先と等価な文字コードとして"\U00002603"が得られる。これは下記のvignettesにもあるので読むとよろしい。

cran.r-project.org

最初、inlineのRのコードの`をescapeさせるにはどうするんだっけ?を調べていて、"\u0060"ってどうするんだっけ…と下記のブログとかを見ていたのでした。

rviews.rstudio.com

で、本題。

ODTやDocxの出力、同じような処理をしているくせに別々にWriter内(あるいはそのサブモジュール)で書いているし、構成というか思想が違うのでこれらの形式間で機能を移植しようと思っても簡単には出来なさそう。それぞれの内部で何をしているのかをみていかないと、思わぬところで詰まりそう…

ということで眺めていたのですが、文字コードの確認処理がそれぞれ入っています。

https://hackage.haskell.org/package/pandoc-2.10.1/docs/src/Text.Pandoc.Writers.Docx.html#isValidChar

https://hackage.haskell.org/package/pandoc-2.10.1/docs/src/Text.Pandoc.XML.html#escapeStringForXML

若干記述が違うし、いったいこれはなんなんだ…ということで、上記のRでの表現方法とあわせて沼ってましたが単に勘違いでした。Docxは上を閉じていないのでアレなんですが、基本的にはこれらの記述は等価ですね。しかしodtのこの上限はどこから…?

…が、よく見るとコメントにここを見ろって書いてある。で、Character Rangeにしっかり書いてあるわけでした。

www.w3.org

ここ由来で"\x10FFFF"が来ているんですね~。

ということでスッキリ。まぁ当面ここの仕様は変わらないだろうし、Docxの方に上限つけたらえぇんちゃう?っていうPRでも書いてみるか…(実害がないのでいらないのではと思うが)

(Pandoc)Span記法を使うとdocx出力にコメントを残すことが出来る

誰得だよ…

マニュアルの何処にも書いてないと思いますが、docxに出力するときにSpanに特定のclassを与えることでWordのコメント機能を使えるということに気づきました。

入力にこんな感じの文を与えてdocxに変換します。

aaa[bbb]{.comment-start}ccc[ddd]{.comment-end}

結果のスクリーンショットはこんな感じ。

f:id:niszet:20200928232246p:plain

bbbのところがコメントになり、dddは無視されていますね。逆にdocxを入力にした場合は上記のように逆変換されるはずです。試してないけどコードはそれっぽいので(ダメそうならissue建てて)

ソースを1行ずつ精読してooxmlの資料等と突き合わせていたら見つけたけど、これは誰得なんだ…

私はただodt形式の出力にシンタックスハイライトをつけたいだけなのに…どうしてこんなことを…

追記 2020/Oct/4

なんと、この書きづらいSpanを簡便な記法で処理してくれるlua filterをK4zuki氏が書いてくれました。pandockerを使えば簡単に使えますね!

github.com

(Pandoc)ODT出力にtoc-depthが設定できるようにしました

修正は2行だけ

Pandocの、ODT形式での出力をdocx形式での出力と同程度のコトが出来るようにしたく、調査等をしています。

とりあえず手が付けられそうなtoc-depthの修正を試みました。

修正自体は2行だけなのですが、PR出すのは初めてなので色々手間取りました…。そもそもgitの使い方を忘れているというアレ…。

ODTはtemplateを見に行くので、そちらに値を出せるようにWriterを修正、template自体もその値を埋め込めるように修正です。修正箇所はPRの方でdiff表示してもらえれば良いのでそちらで。

github.com

これで次のリリースからは使用可能と思いますが、もし変な挙動してたら教えてください…(仕組み的に変な動きはしないと思うんですが…)

(Pandoc) 各ファイルの役割はCONTRIBUTINGの中に簡単な説明があった…(メモ)

見落としていた…

ODT Writerに関するPRを投げるために、CONTRIBUTINGのページを見ていたのですが、そこの最後の方にPandoc のソースコードの各ファイルについて簡単な説明が書いてありました。

pandoc.org

最初に概観するときに知っておきたかった…。

まぁ今となっては大体どれが何をしているのか知ってるのですが、Pandocはなんだかんだで非常に大きなリポジトリなので、全体像をつかむのは大変です。何かをしたいなら、まず全体を知るべき、ということで…。

(Pandoc) MS Word (docx) 出力でも --number-sections オプションに対応している(メモ)

仕様を追い切れていないが…。

Pandoc 2.10.1 から docx の出力で --number-sections オプションがサポートされました。

これをodtにも入れたいなぁと思ってコードを見ていましたが、Writerにべったり依存なのでコードをかなり追わないといけないなということが分かっています。

ひとまず挙動から確認しているので、その途中のメモ。

対応するコードはこのあたり。

github.com

このコードを見ればわかると思うのですが、Headerに対して処理を加えています。

また、実際のセクション番号はこのあたりで処理していて、

github.com

attributesにnumberがあればそれを利用することがわかります。

で、このnumberについてはPandoc's ASTで確認すると入っていません。なので、Writerの処理の中で附番されていることと考えられます。

一方で、Headerにnumber attributesをつけておけば、その値が入ることが予想できますね。

実際、

## R Markdown {number=100.1.1}

のようにすれば、

f:id:niszet:20200924125034p:plain

となり、値が反映されることがわかります。ただし、次の節などにはこの値は引き継がれないので注意。

一方で、unnumberedクラスは有効で、コレをつければ附番されません。

#### aaa {.unnumbered}

なお、{.unnumbered number=100}のようにすればnumberの方が勝ち、番号付きになります。

(Pandoc)複数のdocx/odtを結合する、をWordやLOWの機能でやるべきか…?(メモ)

検討中の話…。

docxはMS Word上で結合できます。リンク形式にする場合は下記のページの説明が分かりやすいです。

www.koikikukan.com

これをunzipして見てみると、_relsに実際のファイル名を入れているため、word/document.xml単体では処理できないので、Pandocの処理内でここもあわせて作成ということは難しそう。その代わり、事前に章ごとにファイルを決めておいて、このドキュメントのひな型の枠に入れるのは良さそう。ただし章番号がどうなるのかは不明。あと、TOCは生成できるのか?みたいなのもある。

odtの場合、LOW上で結合する方法はこちらのWikiに書いてある。LibreOfficeWikiに結構書いてあるので良いですね。ただし、日本語化したときの文字列はバージョンごとに揺らぎがあるかもしれないので、なんとなく雰囲気で理解する必要があるかもしれない。

help.libreoffice.org

こちらはcontent.xmlで閉じていそうなのだが、デフォルトの表示文字列も一緒に含まれているようなので、Pandocでこれを自動生成した場合には一度odtファイルをLOWで開いて更新という処理が必要になりそうだなと考えています。それ以外の章番号などの話はdocxと同様に問題になるかも。

どちらももう少し実例でやってみないとわからないので、「とりあえずやってみるぞ」という気持ちをここに書いておきます。いつまでもやってないようならだれかつついてみてください…。