Truncate newline between non-ASCII characters #61
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
解決したい問題
rurema/doctree#1579 で話していた問題への対応です。
ソースコードの編集上の都合で、入力される文章の中に改行が含まれている場合がありますが、Web ブラウザの CSS Text Module Level 3 への対応状況がまちまちなため、幾つかの Web ブラウザでは日本語文章の中でこの改行が空白として利用者に見える形で表示されてしまうという問題があります。
解決案
概要
ソースコードの編集上の都合で含まれている (HTML として出力する上では) 不要な改行を、「マルチバイト文字の間の改行は不要である」ということを根拠に bitclust 側で取り除くことで、この問題に対処します。
実装案1
BitClust::Preprocessor#wrap では、入力文字列を行単位で処理しています。このとき、
という条件が同時に満たされる場合、現在処理中の行から末尾の改行を取り除きます。これにより、マルチバイト文字の間の改行が取り除かれるのではという寸法です。
次の行を見て判断する必要があるため、判断が必要になり次第先に次の行を読んでしまうというようなロジックを加えています。(つまり peek している)
実装案2
この Pull Request のコメント欄にあるように、実装案1では幾つかの解決できない問題があるため、BitClust::Preprocessor ではなく BitClust::RDCompiler の挙動を変更したのが実装案2です。
まず最初に、複数行からなる入力文字列を HTML 向けのテキストノード (実際はタグの含まれないただの文字列) に変換している箇所を、必ず
#text_node_from_lines
で処理するようにリファクタリングしました (但し pre 要素向けのテキストノードを生成する際にはこれを利用していません)。この処理は、以下の箇所で発生するようです (それぞれの構文規則の正確な名前は分からなかったので適当な名前を充てています)。その上で、マルチバイト文字の間の改行を取り除く処理を
#text_node_from_lines
に加えました。以下のテストケースを追加しています。それぞれの構文規則ごとに、英語と日本語を渡したときの挙動をテストしています。paragraph についてだけは、更に詳細な条件でテストしています (paragraph で成功すれば同じ実装を利用している他の箇所でも成功する可能性が高いだろうという考えから)。