WordPressでInDesignの様な文字組−その⑥

ぶら下がり処理 ぶら下げ組み を行います hanging-punctuation は使いません

唐突とうとつにゴメンナサイ 大事な事なので最初に言っておこうかなと SEO 的に

和欧間スペース と並んで実装したかった機能になります

ぶら下がり処理とは

カンタンに説明しますと 日本語組版にいて行末の句読点は突出とっしゅつ はみ出し してもイイよ ってルールです

html 的には 行末の句読点は <p> タグの外に配置してもイイ と言った方が解り易いですかね

ぶら下がりのon/off

こちらがぶら下がりを on/off した際の比較画像になります

ぶら下がりをしない場合は 禁則処理も伴って 。」 が次行へ追い出されてしまいます

また 追い出した事により元の行は文字数が減ってしまうので justify の効果により文字間が間延びしてしまいます

という事で 当サイトの様なグリッド使い には是非とも実装したかった機能になります

実装方法

hanging-punctuation は使いません

css にはぶら下がりのコントロールとして hanging-punctuation が用意されていますが これは使用しません 2019 5 月の時点で Safari でしかサポートされておらず また 将来的に生き残れるか不安もあります

position: absolute;

そこで モノを動かす時の定番 position: absolute; を使用します まずはソースコードから

php

 preg_replace_callback_array( 
	 [ 
		 '{[、。, ]}uis'  => function ( $match ) { 
			 return 
				 '<span class = "thx_punc_wrap">' . 
					 '<span class = "thx_punctuation">' . 
						 $match[0] . 
					 '</span>' . 
				 '</span>' . 
				 '<span class = "thx_clps_spc"> </span>'; 
		 }, 
	 ], 
	 $str 
 )//preg_replace_callback_array() 

 // 半角スペース用に Kosugi をエンキュー
 function enqueue_kosugi_space() { 
	 wp_enqueue_style( 'google-webfont-style', '//fonts.googleapis.com/css?family=Kosugi&text= ' ); 
 } 
 add_action( 'wp_enqueue_scripts', 'enqueue_kosugi_space' ); 

html タグ それ以外 に分割 それ以外 の箇所を正規表現で検索置換します

検索された 、」。」,」.」 を二つの span で囲み その後ろに半角スペースを追加します

また 追加された半角スペース用の書体として Google Fonts Kosugi を半角スペースだけエンキューします

css

 /*  句読点  */ 
 .thx_punctuation { 
	 position: absolute; 
	 line-height: 1em; 
 } 

 .chrome .thx_punctuation { 
	 bottom: -0.1em; 
 } 

 .gecko .thx_punctuation { 
	 bottom: -0.15em; 
 } 

 .safari .thx_punctuation { 
	 bottom: -0.15em; 
 } 

 /*  句読点のラップ  */ 
 .thx_punc_wrap { 
	 position: relative; 
	 display: inline-block; 
 } 

 /*  相殺スペース  */ 
 .thx_clps_spc { 
	 -webkit-user-select: none; 
	 user-select: none; 
 } 

 .chrome .thx_clps_spc { 
	 font-family: sans-serif; 
	 font-feature-settings: "hwid"; 
 } 

 .gecko .thx_clps_spc { 
	 font-family: Kosugi; 
	 line-height: 0; 
 } 

 .safari .thx_clps_spc { 
	 font-family: Kosugi; 
	 line-height: 0; 
 } 

 /*  句読点のラップ  相殺スペース  */ 
 .chrome .thx_punc_wrap + .thx_clps_spc { 
	 font-feature-settings: "fwid"; 
 } 

 .gecko .thx_punc_wrap + .thx_clps_spc { 
	 font-size: 2em; 
 } 

 .safari .thx_punc_wrap + .thx_clps_spc { 
	 font-size: 2em; 
 } 

まずは 句読点そのものを囲んでいる .thx_punctuation position: absolute; とします これで <p> タグなどの 親タグ外への配置が可能になります

続いて 放蕩ほうとう span となってしまった .thx_punctuation 拠り所よりどころとして .thx_punc_wrap position: relative; とします

この状態で 句読点は元の場所をキープできるものの がない状態なので後続する文字がおおかぶさってきます

そこで 被ってくる文字として .thx_clps_spc を全角スペース幅として用意します

ここからが ブラウザにって挙動が変わってきます

Chrome は素直で良い子です php で追加した半角スペースを font-feature-settings: "fwid"; とする事で全角の幅になってくれます

Firefox Safari は半角スペースに対する font-feature-settings: "fwid"; が効いてくれません

そこで 半角スペースが 50 %幅の Kosugi を採用し font-size: 2em; とする事で全角幅を確保します

そもそも php の時点で全角スペースを追加すればよいのでは?との意見もあるかと思いますが html の性質上 半角スペースは行頭行末に吸収されたり 複数個連続しても一個になったりと web 上で 文字組版を行う際はハンドリングがよく 非常に便利です

まとめ

書いてしまうとこれだけの事なのですが 辿たどり着くまでは紆余曲折うよきょくせつ右往左往うおうさおうしました その道中には副産物もあり 今回の仕組みと同様の手順で 簡易的な 重要 役物詰めが可能になります

今回の記事のソースコードは役物詰めを含めたコードからの抜粋になっているため 少々不自然で散文的になってしまっています

次回の記事にて 簡易的な 役物詰めの紹介とともにソースコードを掲載し 後にプラグイン化を予定しております

コメント