パース
Cosense のテキストを AST に変換する関数を紹介します。どの関数も例外を投げず、記法として成立しない部分は通常のテキストとして返します。
parse
parse(source, options?) はページ全体を受け取り、ブロックの並びを返します。1行目はタイトル、code: と table: は複数行のブロックとして扱います。タイトル行は Cosense Web と同じく記法を読まず、
[x] も #tag も書いたままの文字になります。ページではない文字列の記法を読むときは、本文の 1 行なら parseLine、文章の断片なら tokenizeInline を使います。
TypeScriptimport { parse } from "@cosense-toolbox/parser"const page = parse("タイトル\nこれは [リンク] です")for (const block of page.children) { if (block.type === "line") { console.log(block.children.map((node) => node.type)) }}独自記法は
options.extensions で追加できます。テーブルのセルでは既定でリンク記法だけを読みます。行と同じ記法を使うには、記法の拡張 の tableCellNotation をご覧ください。parseLine
parseLine(raw, options?) は、エディターのように1行単位で扱うための関数です。常に通常行として解釈するため、code: や table: はブロックになりません。options.line と options.offset を指定すると、返る位置情報をページ全体の座標にそろえられます。tokenizeInline
tokenizeInline(source, options?) は、行内の記法だけを解析してインラインノードの配列を返します。改行を含まない1行を渡してください。インデントや引用の判定は行いません。createParser
同じ拡張を何度も使う場合は
createParser(options?) で設定済みのパーサーを作れます。以降は parse や parseLine を呼ぶたびに extensions を渡す必要がありません。asImageSrc
asImageSrc(url) は、画像として表示できる URL に変換します。Gyazo のページ URL は画像 URL に直し、画像でない URL は null を返します。AST 内の URL 自体は変更しません。asEmbedSrc
asEmbedSrc(node) は、embed ノードを <iframe> に入れるプレーヤーの URL にします。YouTube の開始位置 (t) と再生リスト (list) は引き継ぎます。Cosense Web が埋め込まないサービスの provider なら null を返します。
TypeScriptimport { asEmbedSrc, parseLine } from "@cosense-toolbox/parser"const [node] = parseLine("[https://youtu.be/abc?t=1m30s]").childrenif (node?.type === "embed") asEmbedSrc(node) // → "https://www.youtube.com/embed/abc?start=90"asMapUrl
asMapUrl(node) は、location ノードを Google マップの URL にします。Cosense Web の地図のリンク先と同じ形で、ラベルがあればその名前で検索し、無ければ座標の場所を開きます。改行コード
normalizeLineEndings(source) は CRLF と CR を LF にそろえます。parse は解析前に正規化するため、位置情報をソースと照合するときは正規化後の文字列を基準にしてください。AST の構造については AST と位置情報 をご覧ください。