yumemi/front/markdown

実行時の Markdown(0.13.1)。DB に置いた本文の Markdown を木(Block と Inline)に読み、yumemi の要素で描く Component。el は生の HTML を受けないので、面は Markdown を木に読んで html の要素で組むしかない ── その読みと 組みを app ごとに書き直さずに済むよう、yumemi が持つ。

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)。

  • Table(header: List(List(Inline)), rows: List(List(List(Inline))))

    表。セルは行の中の記法の並び。

  • Rule
  • Blanks(count: Int)

    空行の連なり(Options.count_blanks)。count は行の数 ── 畳まない。

読んだ本文。meta は前書き(Options.front_matter)の key: value を書いた順に。

pub type Document {
  Document(meta: List(#(String, String)), blocks: List(Block))
}

Constructors

  • Document(meta: List(#(String, String)), blocks: List(Block))
pub type Inline {
  Plain(String)
  Strong(List(Inline))
  Emphasis(List(Inline))
  CodeSpan(String)
  Link(href: String, label: List(Inline))
}

Constructors

  • Plain(String)
  • Strong(List(Inline))
  • Emphasis(List(Inline))
  • CodeSpan(String)
  • Link(href: String, label: List(Inline))
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
  • WebLinks

    http://・https:// の後に字があり、空白・"・<・> を含まない URL だけ。

  • SafeLinks

    attr.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

    &lt;・&gt;・&amp;・&quot;・&#数; を字に戻す。

  • 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

pub type Rules {
  NoRules
  OnlyDashes
  ThematicBreaks
}

Constructors

  • NoRules
  • OnlyDashes

    前後の空白を除いて --- だけの行。***・___・---- は字。

  • ThematicBreaks

    空白を除いて -・*・_ の 1 種が 3 つ以上の行。

pub type Spaces {
  CollapseSpaces
  KeepSpaces
}

Constructors

  • CollapseSpaces

    字はそのまま(HTML が空白の連なりを 1 つに畳む)。

  • KeepSpaces

    行頭の半角の空白の連なりと、行の中の 2 つ以上の連なりを U+00A0 にして見た目に残す(1 つの空白はそのまま)。

Values

pub fn bare() -> Look

class も属性も付けない描き方。

pub fn blocks(text: String, options: Options) -> List(Block)

本文を塊の並びに読む(前書きは捨てる)。

pub fn document() -> Options

文書の読み方 ── 見出し h1〜h6・段落(行はつないで読む)・コードの塊・表・引用・入れ子の箇条と番号(.・))・ 区切り線、行の中のコード・太字・斜体・リンク(相対も通す)・自動リンク・\ と文字参照。

pub fn field(
  document: Document,
  name: String,
) -> Result(String, Nil)

前書きの欄。同じ名の欄は値の空でない最初のもの。

pub fn inline_text(items: List(Inline)) -> String

行の中の字だけ(記法の印を落とす。リンクは字、コードは中身)。

pub fn inlines(text: String, options: Options) -> List(Inline)

行の中の記法を読む。

pub fn outline() -> Options

規約のような文の読み方 ── 前書き(status: … ほか)、行の頭と尻の空白を落とし、#〜### は段 1〜3、- の 箇条と 1. の番号(始まりの数は残さない)、段落の行は詰めて 1 行に。行の中の記法は読まない。

pub fn parse(text: String, options: Options) -> Document

本文を読む。\r は落とす。

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(items: List(Block), look: Look) -> List(el.Element)

読んだ木を描く。

pub fn render_inlines(
  items: List(Inline),
  look: Look,
) -> List(el.Element)

行の中を描く。字は必ず el.text(escape される)。

pub fn rule(line: String, options: Options) -> Bool

区切り線の行か(Options.rules)。

pub fn view(
  text: String,
  options: Options,
  look: Look,
) -> el.Element

本文を読んで描く Component。塊の並びを 1 つの断片で返す(包む要素は app が置く)。

✨ Search Document