yumemi/front/markdown
実行時の Markdown(0.13.1)。DB に置いた本文の Markdown を木(Block と Inline)に読み、yumemi の要素で描く
Component。el は生の HTML を受けないので、面は Markdown を木に読んで html の要素で組むしかない ── その読みと
組みを app ごとに書き直さずに済むよう、yumemi が持つ。
- 読む記法の範囲と読み方は
Optionsで選ぶ。document()(文書:見出し h1〜h6・段落・コードの塊・表・引用・ 入れ子の箇条・区切り線、行の中のコード・太字・斜体・リンク)、post()(書き手の投稿:見出し 2 段・段落と改行・ 太字・箇条・番号・リンク・---、空行は数のまま)、outline()(規約のような文:見出し 3 段・箇条・番号・ 段落の行を詰める・前書き、行の中は読まない)の 3 つを置く。Options(..document(), tables: False)のように替えてよい - 読まない記法は字のまま返す。HTML の直書きも字で、描くときに escape される(生の HTML を通す口は無い)
- リンクの
hrefはLinksの柵を通ったものだけがLinkになる。通らないリンクの記法は字のまま - 描き方は
Look(要素の種類ごとの class と属性)で選ぶ。viewは塊の並びを 1 つの断片で返し、包む要素は app が置く。木を app の Block で描くならparse/blocksだけを使う - 構文の色付けはしない。コードの塊の言語名は
preのdata-langに残す - 書き手を信用しない本文も毎回読んでよい:読む時間は本文の長さに線形。引用と箇条の項目の入れ子は
max_depth(16)段 までで、それより深い>と箇条の印は字のまま
Types
pub type Block {
Heading(level: Int, inlines: List(Inline))
Paragraph(lines: List(List(Inline)))
Code(lang: String, text: String)
Quote(blocks: List(Block))
Bullets(items: List(List(Block)))
Numbered(start: Int, items: List(List(Block)))
Table(
header: List(List(Inline)),
rows: List(List(List(Inline))),
)
Rule
Blanks(count: Int)
}
Constructors
-
Heading(level: Int, inlines: List(Inline))段は
Options.headingsの対で#の数から写したもの(1〜6)。 -
Paragraph(lines: List(List(Inline)))段落。
BreakLinesは書いた行ごと(描くと行の間にbr)、JoinLinesは行をつないだ 1 行。 -
Code(lang: String, text: String)フェンス(```)のコードの塊。
langは開きの行の最初の語(無ければ “”)。中身は字のまま。 -
Quote(blocks: List(Block)) -
Bullets(items: List(List(Block)))箇条。項目は塊の並び(1 行の項目は 1 つの
Paragraph)。 -
Numbered(start: Int, items: List(List(Block)))番号の箇条。
startは最初の項目の番号(Options.number_startが False なら 1)。 -
表。セルは行の中の記法の並び。
-
Rule -
Blanks(count: Int)空行の連なり(
Options.count_blanks)。countは行の数 ── 畳まない。
pub type LineBreaks {
BreakLines
JoinLines(separator: String)
}
Constructors
-
BreakLines段落の中の改行を残す(描くと
br)。行の中の記法は行ごとに読む。 -
JoinLines(separator: String)段落の行を
separatorでつないでから読む("\n"は描くと空白に見える、""は詰める)。
リンクの柵。柵を通らない [字](URL) は字のまま(Link にしない)。
pub type Links {
NoLinks
WebLinks
SafeLinks
}
Constructors
-
NoLinks -
WebLinkshttp://・https://の後に字があり、空白・"・<・>を含まない URL だけ。 -
SafeLinksattr.safe_urlを通る URL(http・https・mailto・tel と scheme の無い相対)。前後の空白は落とす。
要素の種類ごとの Part。bare() から替えたい欄だけを替える(Look(..markdown.bare(), paragraph: ..))。
pub type Look {
Look(
heading: fn(Int) -> Part,
paragraph: Part,
blank: Part,
code: Part,
code_frame: option.Option(Part),
quote: Part,
bullets: Part,
numbered: Part,
item: Part,
table: Part,
table_frame: option.Option(Part),
header_cell: Part,
cell: Part,
rule: Part,
strong: Part,
emphasis: Part,
code_span: Part,
link: Part,
spaces: Spaces,
)
}
Constructors
-
Look( heading: fn(Int) -> Part, paragraph: Part, blank: Part, code: Part, code_frame: option.Option(Part), quote: Part, bullets: Part, numbered: Part, item: Part, table: Part, table_frame: option.Option(Part), header_cell: Part, cell: Part, rule: Part, strong: Part, emphasis: Part, code_span: Part, link: Part, spaces: Spaces, )Arguments
- heading
-
段(1〜6)ごとの見出し。タグは
h1〜h6。 - blank
-
空行 1 行分の空き(
Blanks)。aria-hiddenのpに U+00A0 を 1 つ。 - code
-
コードの塊の
pre(中にcode)。言語名はdata-lang。 - code_frame
-
preを包むdiv(横に送る枠など)。None は包まない。 - table_frame
-
tableを包むdiv。None は包まない。 - header_cell
-
見出しのセル(
th、scope="col")。 - link
-
リンクの
a(hrefは木の値)。relなどはここに。
pub type Mark {
StrongMark
EmphasisMark
CodeMark
EscapeMark
EntityMark
AutolinkMark
}
Constructors
-
StrongMark**太字**。中身は空でなく、頭と尻が空白でない。太字は重ねない。 -
EmphasisMark*斜体*。 -
CodeMark`コード`(逆引用符の数を合わせる)と<code>…</code>。 -
EscapeMark\の次の字を字のまま。 -
EntityMark<・>・&・"・&#数;を字に戻す。 -
AutolinkMark<http…>の自動リンク(linksの柵を通る)。
pub type Options {
Options(
front_matter: Bool,
trim_lines: Bool,
count_blanks: Bool,
headings: List(#(Int, Int)),
rules: Rules,
bullets: List(String),
number_marks: List(String),
number_start: Bool,
nesting: Bool,
code_blocks: Bool,
quotes: Bool,
tables: Bool,
line_breaks: LineBreaks,
marks: List(Mark),
links: Links,
)
}
Constructors
-
Options( front_matter: Bool, trim_lines: Bool, count_blanks: Bool, headings: List(#(Int, Int)), rules: Rules, bullets: List(String), number_marks: List(String), number_start: Bool, nesting: Bool, code_blocks: Bool, quotes: Bool, tables: Bool, line_breaks: LineBreaks, marks: List(Mark), links: Links, )Arguments
- front_matter
-
先頭の
---の行から次の---の行までを前書きとして読み、Document.metaに入れる(本文から外す)。 閉じの---が無ければ前書きは無い。 - trim_lines
-
行の頭と尻の空白を落としてから読む(字下げした印も印になる。入れ子は読めない)。
- count_blanks
-
空行の連なりを
Blanks(数)で返す。False は塊の区切りとして捨てる。 - headings
-
#の数と見出しの段の対。対に無い数の#の行は字(段落)。#の後に空白が要る。 - bullets
-
箇条の印(
"-"・"*"・"+")。印の後に空白が要る。 - number_marks
-
番号の後の印(
"."・")")。番号は 1〜9 桁の数字、印の後に空白が要る。空なら番号の箇条を読まない。 - number_start
-
番号の箇条の始まりの数を残す。False は 1 から。
- nesting
-
箇条の項目の中を塊として読む(字下げで入れ子・コードの塊、項目の間の空行、字下げの無い続きの行)。 False は 1 行 1 項目で、印は行頭に詰めて書いたものだけ。
- code_blocks
-
- quotes
-
>の引用(中は同じ読み方で塊に読む)。 - tables
-
|の表(2 行目が|---|の区切り)。 - marks
-
行の中で読む記法。
要素に付ける class と属性。
pub type Part {
Part(class: css.Class, attributes: List(el.Attribute))
}
Constructors
-
Part(class: css.Class, attributes: List(el.Attribute))
pub type Rules {
NoRules
OnlyDashes
ThematicBreaks
}
Constructors
-
NoRules -
OnlyDashes前後の空白を除いて
---だけの行。***・___・----は字。 -
ThematicBreaks空白を除いて
-・*・_の 1 種が 3 つ以上の行。
Values
pub fn document() -> Options
文書の読み方 ── 見出し h1〜h6・段落(行はつないで読む)・コードの塊・表・引用・入れ子の箇条と番号(.・))・
区切り線、行の中のコード・太字・斜体・リンク(相対も通す)・自動リンク・\ と文字参照。
pub fn field(
document: Document,
name: String,
) -> Result(String, Nil)
前書きの欄。同じ名の欄は値の空でない最初のもの。
pub fn outline() -> Options
規約のような文の読み方 ── 前書き(status: … ほか)、行の頭と尻の空白を落とし、#〜### は段 1〜3、- の
箇条と 1. の番号(始まりの数は残さない)、段落の行は詰めて 1 行に。行の中の記法は読まない。
pub fn plain(text: String, options: Options) -> String
記法の印を落とした字(一覧の抜粋)。行ごとに読み、行の数と順を変えない ── 区切り線の行だけを落とす。
見出しの #・箇条の印・行の中の記法を落とし、番号の箇条の 1. は字のまま残す。それ以外の行は
書いたまま(行の中の記法だけを落とす)。コードの塊も行として読む。
pub fn post() -> Options
書き手の投稿の読み方 ── #・## は段 2、### は段 3、空行は数のまま(Blanks)、段落の中の改行は br、
- ・* の箇条と 1. の番号(1 行 1 項目、行頭に詰めて書いたものだけ)、前後の空白を除いて --- だけの行は
区切り線、行の中は太字と http(s) のリンクだけ。それ以外(表・引用・コード・斜体・入れ子)は字のまま。
pub fn render_inlines(
items: List(Inline),
look: Look,
) -> List(el.Element)
行の中を描く。字は必ず el.text(escape される)。
pub fn view(
text: String,
options: Options,
look: Look,
) -> el.Element
本文を読んで描く Component。塊の並びを 1 つの断片で返す(包む要素は app が置く)。