Skip to main content

Module line_break

Module line_break 

Source
Expand description

行の折り返し機会(soft wrap opportunity)の判定。

§なぜ必要か

従来の折り返しは1 文字単位だった。次の文字が入らなければ そこで改行するので、英単語が語中で分割されていた。 CSS の既定(overflow-wrap: normal / word-break: normal)では 単語は分割しない。収まらなければはみ出すのが正しい。

実害は見た目だけではない。min-content(最小内容幅)は 「available=1 で組んだときの幅」で測っているため、語中で切れる実装だと min-content が 1 文字ぶんになる。flex の縮小はこの値を下限に使うので、 項目を 1 文字幅まで潰してしまう(実サイトのナビ項目 “Papers” が 縦一列に潰れた)。

§方針

UAX #14 の完全実装はしない。実用上効く規則だけを入れる。

  • 空白の後ろでは改行できる
  • 漢字・かな等(表意文字)の前後では改行できる
  • それ以外(英数字が連なる部分)では改行できない

禁則処理(行頭・行末禁則)は既存の vector_font 側が持っており、 ここでは扱わない。

§既知の差

厳密には、行の途中で始まった単語が収まらない場合はその単語ごと 次の行へ送るのが正しい。現状は送らずにはみ出させる。 計測(vector_font)と描画(web_engine::layout)で同じ規則を 使うことを優先した——両者がずれると、箱の大きさと実際の文字の位置が 食い違い、見た目の崩れとして現れる。

Functions§

can_break_between
prevnextで改行してよいか。
is_ideographic
その文字が表意文字(漢字・かな・全角記号など)か。