Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ハイライトを有効にすると、コードブロック内でインライン命令が使えない #1251

Closed
Yuki-book opened this issue Jan 13, 2019 · 10 comments

Comments

@Yuki-book
Copy link

問題

config.ymlでrougeによるhighlightを有効にしてEPUBを生成すると、
コードブロック内に記述したインライン命令のHTMLタグがソースコードとして挿入されてしまいます。

test.re

= ソースコード

//emlist[サンプルコード][cpp]{
int @<i>{makemap}(int ad ,char* gMap)
{
    int rc = 0;
    if (ad == E_Asc)    { 
        rc = makeMapA(&gMap);   @<balloon>{昇順マップ}
    } else { 
        rc = makeMapD(&gMap);   @<balloon>{降順マップ}
    }
    return rc;
}
//}

実行結果(ハイライト有効)

epub

実行結果(ハイライト無効)

epub0

期待する動作

  • ハイライト有効時は、インライン命令を正しく展開する。
  • ハイライト有効時は、インライン命令を展開せずに除去する。
@Yuki-book
Copy link
Author

ソースコード専用の引用も同じ問題あり

//emlistの代わりに、//sourceとしても同じ問題があります。
//sourceはハイライトできないので影響ないと思ってましたが、
同じ現象となりました。

実行結果(//source)

epub1

@kmuto
Copy link
Owner

kmuto commented Jan 14, 2019

これは古くは #168 で起草しているのですが、妥当な解決方法をいまだ見出だせていません。

単純に代替文字で置き換えて戻せばよいのでは…と考えたくなるところですが、実際やってみると…

  • 代替文字のせいで文法パーサがその箇所で文法エラーになる
  • 文法合致にせよ文法エラーにせよ、どうハイライト表現されるかはハイライタおよびコード言語に依存し、場合によっては前後の文字と結合されてしまって分離できないことがある
  • どのインライン命令が使われるか制約しきれないため、タグAのオープン/クローズ、タグBのオープン/クローズ、……と必要な代替文字がいくらでも必要になり得る(これは順序を覚えておけばいちおう1つにまとめられなくはないか…?)

手元の制作実績では、「特定のコード言語」かつ「特定のインライン命令」のときに限定してコードハイライトの実体のロジック(rougeとかpygmentsとか)のほうを加工するという手段で回避していますが、とても場当たりですね。

@Yuki-book
Copy link
Author

#168に気がつきませんでした。

了解しました。ハイライト側のパーサーとの関係で、実現は難しそうですね。
インライン命令を使うときは、ハイライトを無効にして使うようにします。


ハイライトのパーサーに影響を受けない、ソースコードの引用命令みたいモノが欲しくなりますね。
//source がそんなようなモノと思ってましたが違うみたいですし。

@kmuto
Copy link
Owner

kmuto commented Jan 19, 2019

#1256 で試していますが、泥縄度がかなりひどいですね…

@kmuto
Copy link
Owner

kmuto commented Feb 10, 2019

いちおう #1256 でインライン命令を保持するパッチを書き終えましたが、コア部分の挙動をかなり変えており、危なそうなのと、EPUBでしかまともに動かない(TeXの場合はハイライタがTeX側にあっていじれない)という問題があります…。

@Yuki-book
Copy link
Author

対応ありがとうございます。素晴らしいです。
esc-highlightブランチで、手元のコードで確認して OKでした。

私は、EPUB限定対応でも良いです。

コア部分の挙動をかなり変えており、危なそうなのと、EPUBでしかまともに動かない

正式リリースには、当分入らないのでしょうか?

@kmuto
Copy link
Owner

kmuto commented Feb 11, 2019

確認ありがとうございます。
あまり筋のいいやり方ではなさそうという自覚があるので、現状ではこれを正式リリースに入れることは考えていないですね…。

拡張モジュールで提供するにはちょっと広くいじりすぎているので難しい…。伸び伸びになっているパーサを新しくする計画が実施されるときに考え直したほうがいいのかも。

@Yuki-book
Copy link
Author

了解しました。

作成する書籍によりコードブロック内では、
インライン命令を使うか、ハイライトを使うかを使い分けた方が良さそうですね。

新パーサー計画を楽しみに待っています。

@kmuto
Copy link
Owner

kmuto commented Feb 11, 2019

ロジックを切り出して review-ext.rb としてみました。
https://raw.githubusercontent.com/reviewml/reviewknowledge-ja/master/docs/epub/highlight/review-ext.rb

  • 作業フォルダにこのファイルを置くことでEPUBMaker/WebMakerでのハイライト内エスケープが効くようになります。
  • emlist等でハイライト言語が明示指定されていなければハイライトしない、というようにしています。そうじゃなくてたとえば言語がnoneだったらハイライトしない、としたければ174行目のところを|| ops[:lexer] == 'none'のようにすればよいかと思います。

@Yuki-book
Copy link
Author

拡張モジュールの提供ありがとうございます。
問題なく使用できることを確認しました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants