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

rougeでhighlightしている場合、//listの識別子に特定の拡張子が含まれるとコンパイルエラーになる #1016

Closed
orangain opened this issue May 22, 2018 · 3 comments

Comments

@orangain
Copy link
Contributor

問題

config.ymlでrougeによるhighlightを有効にした状態で、//listの第1引数 (識別子) として hello.txt などの「rougeのlexerが存在しない拡張子を持つファイル名」を指定すると、review-epubmakerがunknown lexerというエラーで停止してしまいます。

config.yml (抜粋):

# ソースコードハイライトを利用する (rouge,pygmentsには外部gemが必要)
highlight:
  html: "rouge"
  latex: "listings"

sample-book.re:

= はじめに

//list[hello.txt][こんにちは]{
Hello
//}

実行結果:

$ bundle exec rake epub
review-epubmaker config.yml
WARN: review-epubmaker: compile error in sample-book.re (RuntimeError)
WARN: review-epubmaker: unknown lexer
compile error, No EPUB file output.
rake aborted!
Command failed with status (1): [review-epubmaker config.yml...]
lib/tasks/review.rake:76:in `block in <top (required)>'
/Users/orange/samplecodes/review-rouge-highlight/sample-book/vendor/bundle/ruby/2.4.0/gems/rake-12.3.1/exe/rake:27:in `<top (required)>'
/Users/orange/.rbenv/versions/2.4.0/bin/bundle:22:in `load'
/Users/orange/.rbenv/versions/2.4.0/bin/bundle:22:in `<main>'
Tasks: TOP => epub => book.epub
(See full trace by running task with --trace)

期待する動作

エラーとなることなくepubファイルがビルドされること。ソースコードはシンタックスハイライトされなくて構いません。

rougeの代わりにpygmentsを利用した場合や、review-pdfmakerでlistingsを使った場合は、この期待する動作になります。

なお、 //list[hello.txt][こんにちは][]{ として明示的に第3引数で空文字を指定すると期待する動作になりますが、冗長なのであまり書きたくありません。

議論

いくつか論点があると思います。

  1. HTMLBuilderでは言語指定がない場合に、識別子の拡張子が言語指定として使われる実装になっている。
    • この挙動は フォーマットガイド にはドキュメント化されていない。
    • LATEXBuilderには実装されていなさそう。
    • 個人的には、この挙動を廃止するか、ドキュメント化してLATEXBuilderにも実装するかで統一したほうがわかりやすいと思います。
  2. rougeでは指定された言語のlexerが見つからない場合に、エラーとなる実装になっている。
    • pygmentsやreview-pdfmakerでlistingsを使った場合にはエラーにならない。
    • 個人的には、エラーとするかどうかはどちらも方針としてありだと思いますが、挙動が統一されている方がわかりやすいと思います。
    • 1の挙動を維持するなら、エラーとしないほうがありがたいです。
  3. エラーの発生場所や原因がわかりにくい。
    • エラーの直前 で変数 lexer に再代入しているので、表示されるエラーメッセージにほとんど情報がなくなってしまっています。欲を言えばソースコード中での行数もわかるとありがたいです。

環境

$ bundle exec gem list

*** LOCAL GEMS ***

bundler (1.14.6)
image_size (2.0.0)
multi_json (1.13.1)
pygments.rb (1.2.1)
rake (12.3.1)
review (2.5.0)
rouge (3.1.1)
rubyzip (1.2.1)
@kmuto
Copy link
Owner

kmuto commented May 22, 2018

再現しました。
「HTMLBuilderでは言語指定がない場合に、識別子の拡張子が言語指定として使われる実装になっている」は何か理由あるのでしたっけ? > @kdmsnr さん。
初期の
1eea405 で入れたものらしい。

私の制作範囲だとIDに拡張子付きで入れることはまずないので、この現象に当たったのは初めてでした。LaTeXのほうは非対応、emlistなどにはHTMLでもそもそも効かない、という状況のため、特に強い理由がなければ識別子からlexerを引き出すのはやめたいな…というところです。

@kdmsnr
Copy link
Collaborator

kdmsnr commented May 22, 2018

初期は pygments 前提かつ list_body の引数に lang がなかったからでしょうねえ。レガシーの原稿がなければ、削除しても大丈夫そうです。

@kmuto
Copy link
Owner

kmuto commented May 22, 2018

#1017 を作ってみました

@kmuto kmuto closed this as completed in 85a7e7f May 23, 2018
kmuto added a commit that referenced this issue May 23, 2018
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

3 participants