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

spec: 日本語の段落の途中の改行がスペースに変換されないように削除してほしい #187

Open
MurakamiShinyu opened this issue Dec 28, 2023 · 9 comments
Labels
spec Spec related thing

Comments

@MurakamiShinyu
Copy link
Member

Goals

現在のvfmでは、 --hard-line-breaks オプション(設定の hardLineBreaks プロパティ)が指定されないかぎり、テキスト内の改行文字はそのまま出力されます。その改行文字は、ブラウザの標準のwhite-space処理によりスペース(U+0020)に変換されます。この改行がスペースに変換される仕様は欧文にはよいですが、日本語や中国語のように単語間や文間にスペースを入れないで書く言語では、不便です。vfmで、テキストを整形出力しているところの処理を改良して、改行の前後の文字が全角文字ならば改行を削除するようにするのがよいかと思います。

現状のvfmでは:

$ vfm
日本語の文章を書くときに、
適当に改行を入れながら
書けるようにしたい。
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <p>
      日本語の文章を書くときに、
      適当に改行を入れながら
      書けるようにしたい。
    </p>
  </body>
</html>

この結果、ブラウザでの出力では、

日本語の文章を書くときに、 適当に改行を入れながら 書けるようにしたい。

のように余計なスペースが入ることになる。

vfmを改良して、

    <p>
      日本語の文章を書くときに、適当に改行を入れながらようにしたい。
    </p>

のように前後が全角文字なら改行を削除するようにするとこの問題が解消する。

Prior Art

  • 日本語のTeXでの扱いでは、改行の直前の文字が全角文字であれば改行はスペースに変換しないで削除するようになっている

Discussion

改行文字の前後がどのような条件の場合に改行を削除するか、仕様を決める必要がある。

CSS Textでのwhite-spaceの処理で同様の議論がされている。次のissueで提案されている方法を採用したい:

@MurakamiShinyu MurakamiShinyu added the spec Spec related thing label Dec 28, 2023
@tats-u
Copy link

tats-u commented Nov 6, 2024

Prettierの仕様が参考になると思います(流石に日英間を消すかどうかを文脈依存にするのはやり過ぎたと思っています)

prettier/prettier#11597
prettier/prettier#16691
https://github.com/prettier/prettier/blob/main/src/language-markdown/print-whitespace.js

それと、Firefox限定で日本語に挟まれた改行は空白にならず消されます

@tats-u
Copy link

tats-u commented Feb 22, 2025

現在のFirefoxの仕様

※日中 = East Asian WidthがW・F・Hのいずれか かつ 用字がハングルでない かつ 絵文字(Firefoxは絵文字(Emoji)プロパティで判断だが㊙などを絵文字と誤判定する)でない
※約物 = Unicodeの一般カテゴリがP
※日中約物 = (日中かつ約物)またはU+FF5E(~)

次の1.・2.のいずれか(直前のバリエーションセレクタは無視)

  1. 前後両方が日中である
  2. (lang属性がja・zhのいずれかの場合のみ)片方のどちらかが日中約物

@MurakamiShinyu
Copy link
Member Author

現在のFirefoxの仕様、かなり良いと思いますが、ひとつ気になったことは、

であげた例のうち、次のものがこの期待通りにならないことです:

日本語のテキスト! 
English textを埋め込む。

日本語のテキスト! English textを埋め込む。

(In this example, there is an ideographic space U+3000   after the )

JLREQ「3.1.6 区切り約物及びハイフン類の配置方法」 で、「文末にくる区切り約物(cl-04)の前はベタ組とし,区切り約物(cl-04)の後ろは全角アキとする」と書かれているように、文末の区切り約物(!や?)のあとには全角スペースを入れるのが通常です。文末ごとに改行を入れて入力したようなテキストデータの場合、全角スペースの直後で改行が入っていることになります。ブラウザでこの改行は無視されてほしいですが、Firefoxでもこれができてません。

@tats-u
Copy link

tats-u commented Feb 23, 2025

現在はバリエーションセレクタを飛ばして隣の文字を探しているとのことですが、一般カテゴリがZsのもの(=全半角空白含む)も飛ばすように変更すると良さげですね。

@MurakamiShinyu
Copy link
Member Author

「現在のFirefoxの仕様」の

※日中約物 = (日中かつ約物)またはU+FF5E(~)

※日中約物 = (日中かつ約物)またはU+FF5E(~)またはU+3000(全角スペース)

に変えるのがよいのでないでしょうか? 全角スペースの直前の文字が何であろうと、全角スペースのあとに改行があるときその改行はスペースに変換されないほうがよいと思います。

@tats-u
Copy link

tats-u commented Feb 23, 2025

確かに。
https://www.compart.com/en/unicode/category/Zs
によれば、一般カテゴリがZsかつ東亜文字幅がWFHのものは全角スペースしかないので、コードポイント指定よりも一般カテゴリで指定する手もありますね。

@MurakamiShinyu
Copy link
Member Author

全角スペースは空白文字なのに約物のように扱う例外的な文字なので、U+FF5E(~)と同様にコードポイント指定でよいと思います。CSS Text Level 4仕様の text-spacing-trimhanging-punctuation でも、「ideographic space (U+3000)」が隣接する全角約物の詰めや、先頭約物の突き出し対象になることが、コードポイント指定で書かれているし。

@tats-u
Copy link

tats-u commented Feb 23, 2025

了解です
時間があったらBugzillaに投げておきます

@tats-u
Copy link

tats-u commented Feb 25, 2025

https://bugzilla.mozilla.org/show_bug.cgi?id=1950321

投げました
補足があればそちらにお願いします

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

No branches or pull requests

2 participants