markdown-it-py plugin that makes CommonMark friendly to Japanese/Chinese/Korean: no spurious spaces at soft line breaks, working emphasis next to full-width punctuation.
Project description
mdit-py-cjk-friendly
markdown-it-py を 日本語・中国語・韓国語 (CJK) フレンドリーにするプラグイン。
pip install mdit-py-cjk-friendly
from markdown_it import MarkdownIt
from mdit_py_cjk_friendly import cjk_friendly
md = MarkdownIt("commonmark").use(cjk_friendly)
md.render("これは**「重要」**です。")
# <p>これは<strong>「重要」</strong>です。</p>
md.render("これは長い文章なので\n途中で改行しています。")
# <p>これは長い文章なので途中で改行しています。</p> (不要な空白が入らない)
直る問題
CommonMark は空白で単語を区切る言語を前提に設計されており、 CJK テキストでは有名な問題が2つ起きる:
- 文中改行が空白になる — Markdown ソースを日本語文の途中で改行すると、 描画後に不要な半角スペースが入る。本プラグインは改行の前後がともに CJK 文字なら詰めて結合する (英文の折り返しは従来どおり)。
- 全角約物に隣接した強調が効かない —
**「重要」**ですは CommonMark の flanking 規則で不成立になりリテラルの**が残る。本プラグインは flanking 判定で CJK 文字を punctuation 互換として扱い、パーサレベルで 解決する (コードスパン・コードブロックには影響しない)。
強調の挙動は CommonMark CJK-friendly 仕様ドラフト の考え方に従った、markdown-it-py 向けの独立・簡易実装です (JavaScript は本家プロジェクトのプラグインをどうぞ)。
ふりがな(ルビ)— オプション
構文の追加になるため、別プラグイン ruby として opt-in で提供する
(でんでんマークダウン形式):
from mdit_py_cjk_friendly import cjk_friendly, ruby
md = MarkdownIt("commonmark").use(cjk_friendly).use(ruby)
md.render("{漢字|かんじ}") # → <ruby>漢字<rp>(</rp><rt>かんじ</rt><rp>)</rp></ruby>
md.render("{東京|とう|きょう}") # → モノルビ (読みの数=文字数のとき)
- 読みの数が文字数と合わない・空の要素がある場合は変換しない(推測しない)
\{でエスケープ。コードスパン・コードブロック内は変換されない<rp>括弧つきで出力するので、ルビ非対応の環境では「漢字(かんじ)」に落ちる
傍点・傍線(text-emphasis)— オプション
でんでんマークダウンには圏点専用の記法が無く、*text* を縦書き時のみ
圏点表示する仕様しか持たない(種別を区別できない)。傍点・傍線を種別込みで
書き分けたい場合に、Pandoc 風のクラス付きスパンを別プラグイン bouten
として opt-in で提供する:
from mdit_py_cjk_friendly import cjk_friendly, bouten
md = MarkdownIt("commonmark").use(cjk_friendly).use(bouten)
md.render("[邪智暴虐]{.sesame_dot}") # → <em class="sesame_dot">邪智暴虐</em>
md.render("[あ]{.underline_double}") # → <em class="underline_double">あ</em>
- クラス名 1 個(英字始まり)を
<em class>に透過するだけ。見た目 (どのクラスがゴマ点・二重傍線か)は CSS が定める ]の直後が{.class}でなければ何もしない。リンク[x](y)や 素の[x]を壊さない。inner はプレーンテキスト扱い(推測しない)*/**(強調・太字)は素の Markdown で足りるので対象外- 青空文庫の種別に対応するクラス例: 傍点
sesame_dot/white_sesame_dot/black_circle/white_circle/bullseye/fisheye/saltire/black_up-pointing_triangle/white_up-pointing_triangle、傍線underline_solid/underline_double/underline_dotted/underline_dashed/underline_wave(上側はoverline_*)
対応する CSS の例(縦書き):
em.sesame_dot { font-style: normal;
text-emphasis: filled sesame; -webkit-text-emphasis: filled sesame; }
em[class^="underline_"] { font-style: normal; text-decoration: underline; }
補足
- 効くのは
.use(cjk_friendly)したパーサだけ。同一プロセスの他のMarkdownItインスタンスは上流と完全に同じ挙動を保つ - markdown-it-py 2.x / 3.x 対応
ライセンス
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mdit_py_cjk_friendly-0.3.0.tar.gz.
File metadata
- Download URL: mdit_py_cjk_friendly-0.3.0.tar.gz
- Upload date:
- Size: 15.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5f590adbbb5529e1f640788763764bbb3b798a6f760c463c41af3d6951b36f5
|
|
| MD5 |
5d0868054a23a8358c666ea2f34e206b
|
|
| BLAKE2b-256 |
c78cedbc883de1e957b7cf2eaf5fef71016724b28377bca154016806169b77f8
|
Provenance
The following attestation bundles were made for mdit_py_cjk_friendly-0.3.0.tar.gz:
Publisher:
publish.yml on aiseed-dev/mdit-py-cjk-friendly
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mdit_py_cjk_friendly-0.3.0.tar.gz -
Subject digest:
b5f590adbbb5529e1f640788763764bbb3b798a6f760c463c41af3d6951b36f5 - Sigstore transparency entry: 2143279173
- Sigstore integration time:
-
Permalink:
aiseed-dev/mdit-py-cjk-friendly@8af03d4da142664cea66aa7a27c547635155ac3a -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/aiseed-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8af03d4da142664cea66aa7a27c547635155ac3a -
Trigger Event:
push
-
Statement type:
File details
Details for the file mdit_py_cjk_friendly-0.3.0-py3-none-any.whl.
File metadata
- Download URL: mdit_py_cjk_friendly-0.3.0-py3-none-any.whl
- Upload date:
- Size: 8.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd8ee19dde9292b1db70bf047eb860c7e8719855452fa483efdee3923d80bd6d
|
|
| MD5 |
e24ae84f56e865db6c3b92ed5ff2c800
|
|
| BLAKE2b-256 |
4e4840549b5e757a7974d87a9e7e083604c009f047fa1fdc3920f4079907d7aa
|
Provenance
The following attestation bundles were made for mdit_py_cjk_friendly-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on aiseed-dev/mdit-py-cjk-friendly
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mdit_py_cjk_friendly-0.3.0-py3-none-any.whl -
Subject digest:
fd8ee19dde9292b1db70bf047eb860c7e8719855452fa483efdee3923d80bd6d - Sigstore transparency entry: 2143279214
- Sigstore integration time:
-
Permalink:
aiseed-dev/mdit-py-cjk-friendly@8af03d4da142664cea66aa7a27c547635155ac3a -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/aiseed-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8af03d4da142664cea66aa7a27c547635155ac3a -
Trigger Event:
push
-
Statement type: