Slide 1

Slide 1 text

1 情報科学若手の会 2024 LT WebAssemblyで拡張可能な 軽量マークアップ言語の開発 浅田睦葉 GitHub: @momeemt

Slide 2

Slide 2 text

2 自己紹介 省略

Slide 3

Slide 3 text

・Markdownは統一された規格が無く、  CommonMarkやGitHub Flavored Markdown(GFM)などの後発の規格がいくつかある  → 脚注はCommonMarkに定義されている?GFMには?  → インライン脚注はpandocで変換できる?  → リストの要素に見出しを含めてMarkdown.plで変換できる?CommonMark準拠だと?  → MultiMarkdownを使うとルビを振ることはできる? ・人々はMarkdownの枠を超えた表現力をMarkdownに要求している 3 Markdownクイズ 😄 まあ確かに欲しいよな 知人のMarp製スライド pタグを省略できる JSXであるところのMDX

Slide 4

Slide 4 text

・Markdownの統一された規格は無く、CommonMarkやGitHub Flavored Markdownなどが乱 立している  → 脚注はCommonMarkに定義されている?GFMには?  → インライン脚注はpandocで変換できる?  → リストの要素に見出しを含めてMarkdown.plで変換できる? ・人々はMarkdownの枠を超えた表現力をMarkdownに要求している 3 動機 まあ確かに欲しいよな 知人のMarp製スライド pタグを省略できるJSX 4 変換規則・対象を拡張することを 前提にしたマークアップ言語が欲しい

Slide 5

Slide 5 text

5 文法 ・文法を最小限にして、できるだけ簡単に拡張可能な言語仕様にする  ・多くのマークアップ言語は拡張が処理系依存 ・Brackの重要な文法は1種類(厳密には3種類)だけ  ・コマンド呼び出し構文  ・[module.ident arg1, arg2, ..., argN]  ・`[]`はインライン、`{}`はブロックで、   単なる置換メカニズム  ・`<>`はマクロ

Slide 6

Slide 6 text

6 プラグイン① ・WebAssemblyバイナリをプラグインとして扱う ・現在はRustのみで書いているが、JavaScriptやGo、Cなどでも書ける ・HTMLターゲットのboldの実装は単純  ・[std.bold hello]はどう処理されるか  1. コンパイラが文字列“hello”をプラグインに渡す  2. bタグで囲った文字列“hello”を返す ・インライン脚注は置換のみでは実現できない  ・抽象構文木を操作可能なマクロを利用する  ・文書のASTとIDを受け取る  ・フッターに脚注を挿入するコードを書く

Slide 7

Slide 7 text

7 プラグイン② [展望] ・LSPも書いている(今は簡単なエラー報告ができる程度) ・プラグインがLSPの機能を実装できるように進める予定  ・型検査、補完、Inlay Hints、Code Actions、Semantic Tokensなど ソースコード トークン列 具象構文木 (CST) 抽象構文木 (AST) 変換前表現 生成結果 tokenizer parser transformer → プラグインが定義したフォーマッタを呼び出す expander → プラグインが定義したマクロを呼び出す codegen → プラグインが定義したコマンドを呼び出す

Slide 8

Slide 8 text

8 ターゲット ・テキスト形式ならターゲットを自由に選べる  ・先述したHTMLをはじめとして、pandoc ASTやはてな記法、JSON、XMLなど ・バイナリ形式だと少し大変そう  ・フックを入れたい [展望]  ・JSON形式に変換した後に、そのデータを利用して任意のプログラムを実行する  ・既存のPDFバックエンド(typst/pdf-writerなど)を利用して直接PDFを出力する  ・動画、画像、音声、その他?

Slide 9

Slide 9 text

9 何に使うの ・現状: 私のブログ(blog.momee.mt)はBrackで書かれています ・このスライドはCanvaで作りましたがBrackで書けるようになると嬉しい  ・Marp、結局はHTMLの暴力になってしまう ・単一のファイルからPDF、Playground、講義動画の出力 ・今はマークアップ言語が主流ではない、文章主体の作業を効率化したい

Slide 10

Slide 10 text

まとめ 10 ・9月末にv0.1.0を出す予定です!興味があれば動かしてみていただけると嬉しいです ・Brackが使えそうな分野があればぜひ教えてください