01
スクリプトタグで使う
ビルド設定を持たないサイトでは、スクリプトを1つ読み込むだけで動作します。CSSはバンドルに含まれているため、読み込むファイルは1つです。設定はタグの属性で渡し、読み込み後に追加された記事も自動的に対象になります。
<script
src="https://cdn.mojikumi.jp/v1/mojikumi.min.js"
data-target=".entry-content"
data-style="article"
></script>| 属性 | 既定値 | 内容 |
|---|---|---|
| data-target | auto | 本文のセレクター。autoは既知の本文要素を順に探します |
| data-style | article | article(記事向け)、book(書籍風)、headline(見出し重視) |
| data-precision | auto | native、auto、fullのいずれか |
| data-exclude | なし | 追加で除外するセレクター。カンマ区切り |
| data-css | true | 同梱CSSを読み込むかどうか |
| data-auto | true | falseにするとMojikumi.start()を呼ぶまで何もしません |
02
CSSだけで使う
CSSプリセットを読み込み、本文の要素にクラスを付けます。標準CSSに対応したブラウザなら、これだけで約物まわりの空白が詰まります。ビルド設定の変更もJavaScriptの追加も不要です。プリセットはbook、web、editorial、minimalの4種類で、それぞれ詰めの強さが異なります。
import "mojikumi/css";
<article lang="ja" className="mjk mjk-book">
<p>『Webの日本語』を端正にする</p>
</article>03
DOMフォールバックを追加する
標準CSSが未実装のブラウザでも同じ表示を得たい場合は、DOM層を追加します。約物が連続する箇所や、行頭・行末に置かれた括弧など、CSSだけでは揃わない位置を実行時に計測して補正する層です。precisionをautoに設定しておけば、対応済みのブラウザでは処理そのものが実行されません。
import "mojikumi/css";
import { mojikumi } from "mojikumi";
const instance = mojikumi(".article", {
preset: "book",
precision: "auto"
});04
Reactで使う
サーバーでは通常のHTMLを出力し、ブラウザに届いた時点で不足分だけを補います。要素を囲むComponentと、既存の要素に適用するHookのどちらでも利用できるため、現在のレイアウトを組み替える必要はありません。
import { Mojikumi } from "@mojikumi/react";
export function Article({ children }) {
return (
<Mojikumi as="article" preset="book">
{children}
</Mojikumi>
);
}05
Markdown / MDXで使う
rehypeプラグインとして組み込むと、記事本文にプリセットが適用されます。原稿のMarkdownは変更する必要がなく、書き手が字組みを意識することもありません。コードブロックと数式は処理の対象から除外されるため、記号の並びが崩れることはありません。
import rehypeMojikumi from "@mojikumi/rehype";
export default {
rehypePlugins: [
[rehypeMojikumi, { preset: "editorial" }]
]
};06
プリセットを選ぶ
プリセットは、どの調整を行うかの組み合わせです。迷う場合はwebを選んでください。書籍に近い体裁が必要ならbook、見出しの文節改行を優先するならeditorial、約物の重なりだけを詰めたいならminimalが適します。nativeはブラウザの実装だけを使い、JavaScriptによる補完を行いません。
| 調整 | web | book | editorial | minimal | native |
|---|---|---|---|---|---|
| 連続する約物 | ○ | ○ | ○ | ○ | ○ |
| 行頭の調整 | ○ | ○ | ○ | — | ○ |
| 行末の調整 | 条件付き | ○ | ○ | — | ○ |
| 和欧文間 | ○ | ○ | — | — | ○ |
| 段落の字下げ | — | 1em | — | — | — |
| 見出しの文節改行 | — | — | ○ | — | — |
| JSによる補完 | ○ | ○ | ○ | ○ | — |
07
ブラウザの実装との切り替え
precisionは、標準CSSとDOM補完のどちらをどこまで使うかの指定です。既定のautoでは、ブラウザが実際に約物を詰めているかを実測してから判断します。構文としては対応していても表示が変わらない実装があるため、対応表ではなく実測で切り替えています。
| 値 | 動作 | 使いどころ |
|---|---|---|
| native | 標準CSSのみを使用します | JavaScriptを増やしたくない場合 |
| auto | 不足している処理だけを補います | 通常はこれで十分です |
| full | 常にDOM補完を適用します | 検証時や、実装差を確認する場合 |
08
適用範囲を変える
コード、フォーム、編集中の領域、SVG、MathMLは、指定がなくても対象から外れます。任意の範囲を外したい場合は、その要素にdata-no-mojikumiを付けます。まとめて外すなら、excludeやdata-excludeにセレクターを渡します。
<span data-no-mojikumi>console.log("日本語")</span>- 既定の除外:script、style、code、pre、kbd、samp、textarea、input、select、option、contenteditable、svg、math
- data-no-mojikumiを付けた要素と、その内部
- data-excludeまたはexcludeで追加したセレクター
09
プログラムから操作する
スクリプトタグで読み込むと、グローバルのMojikumiから操作できます。data-autoをfalseにしておけば、開始のタイミングも自分で決められます。npmから使う場合は、同じ処理をmojikumiパッケージのmojikumi関数が担当します。
Mojikumi.start({ target: ".article", style: "book" });
Mojikumi.refresh();
Mojikumi.stop();| 関数 | 内容 |
|---|---|
| start(options) | 適用を開始し、以降に追加された記事も対象にします |
| refresh() | 行頭・行末の判定をやり直します |
| stop() | 生成した要素とクラス、読み込んだCSSをすべて取り除きます |
10
自分のサーバーへ置く
CDNを使わない場合は、npmパッケージに含まれる同じファイルを自分のサーバーへ置けます。node_modules/mojikumi/dist/mojikumi.browser.jsを公開ディレクトリへコピーし、srcをそのパスに変えるだけです。動作は変わりません。
<script src="/assets/mojikumi.min.js" data-style="article"></script>11
元に戻す
スクリプトタグを消す、あるいはstop()を呼ぶと、その場で元の状態に戻ります。Mojikumiは本文の文字列を書き換えないため、取り外したあとに痕跡は残りません。
- 生成した要素とクラスを取り除き、変更した属性を元の値へ戻します
- 本文の文字列は変更していないため、保存されたデータには何も残りません
- スクリプトが読み込めなかった場合も、本文はそのまま表示されます
12
設計方針
- まず標準CSSで動作し、ブラウザが対応していればそれだけで完結します
- 本文の文字列は書き換えないため、コピーした文章も読み上げの内容も元のまま保たれます
- ブラウザの対応が進むほど、読み込まれるコードは自然に減っていきます
- 約物メトリクスを備えていない書体では、詰めを適用しません