コピペしただけでグチャグチャだが、後で整理する。
ディレクトリ構成
./node_modeules/ の下に
- reline/
- reline-cli/
- reline-parse/
- reline-stringify/
- reline-remove-trailling-spaces/
- reline-add-line-number/
- reline-to-html-pre/ (rehype と hastscript を使う)
なんやかんや
- パッケージ reline で、名前 reline をエクスポートする。reline の実体は、relineParseパーザープラグインと relineStringifyストリンギフィイアプラグインをuseしたunifiedプロセッサの凍結版。英語だと "This package exports the identifiers XXXX and YYYY." のような文言がある。
- reline-cli は自作する。remark-cliの真似。unified-args をインストールすると、unified-engine は依存インストールされる。
- とりあえず、relineParse, relineStringify は作る。
- トランスフォーマーとして、relineRemoveTraillingSpaces, relineAddLineNumber, relineToHTMLPre
- reline.use(relineToHTMLPre) からの rehypeStringify
- インターファミリー・プロセッサをどうセットアップするのか? もう一度調査。
- ファミリーはモノレポ構成にまとめるとよい
メインドライバー
redot 少し編集してテンプレート風にした。
"use strict"; var unified = require("unified"); var parse = require("XXXX-parse"); var stringify = require("XXXX-stringify"); module.exports = unified() .use(parse) .use(stringify) .freeze();
remark 少し編集してテンプレート風にした。
import {unified} from 'unified' import xxxxParse from 'XXXX-parse' import xxxxkStringify from 'XXXX-stringify' export const xxxx = unified() .use(xxxxParse) .use(xxxxStringify) .freeze();
CLI
redot を少し編集してテンプレート風にした。
#!/usr/bin/env node "use strict"; var args = require("unified-args"); var processor = require("XXXX"); var proc = require("XXXX/package.json"); var cli = require("./package.json"); var extensions = ["XXXX", "YYYY"]; args({ processor: processor, name: proc.name, description: cli.description, version: [ proc.name + ": " + proc.version, cli.name + ": " + cli.version ].join(", "), pluginPrefix: proc.name, presetPrefix: proc.name + "-preset", packageField: proc.name + "Config", rcName: "." + proc.name + "rc", ignoreName: "." + proc.name + "ignore", extensions: extensions });
remark を少し編集してテンプレート風にした。
#!/usr/bin/env node import {createRequire} from 'node:module' import {args} from 'unified-args' import {XXXX} from 'XXXX' const require = createRequire(import.meta.url) const proc = require('XXXX/package.json') const cli = require('./package.json') // To do: enable `markdown-extensions` once it supports ESM. const extensions = [ 'XXXX', 'YYYY' ] args({ processor: XXXX, name: proc.name, description: cli.description, version: [ proc.name + ': ' + proc.version, cli.name + ': ' + cli.version ].join(', '), pluginPrefix: proc.name, packageField: proc.name + 'Config', rcName: '.' + proc.name + 'rc', ignoreName: '.' + proc.name + 'ignore', extensions })
パーザー
redot コピペの残骸がそのままだwww
"use strict"; // generated by dot.pegjs var parser = require("./dot.js"); function parse(doc, file) { try { return parser.parse(file.contents || doc); } catch (err) { file.fail(err.message, err.location, "redot-parse"); } } function parserFactory() { this.Parser = parse; } parserFactory.Parser = parse; module.exports = parserFactory;
remark
/** * @typedef {import('mdast').Root} Root * @typedef {import('mdast-util-from-markdown').Options} Options */ import {fromMarkdown} from 'mdast-util-from-markdown' /** @type {import('unified').Plugin<[Options?] | void[], string, Root>} */ export default function remarkParse(options) { /** @type {import('unified').ParserFunction<Root>} */ const parser = (doc) => { // Assume options. const settings = /** @type {Options} */ (this.data('settings')) return fromMarkdown( doc, Object.assign({}, settings, options, { // Note: these options are not in the readme. // The goal is for them to be set by plugins on `data` instead of being // passed by users. extensions: this.data('micromarkExtensions') || [], mdastExtensions: this.data('fromMarkdownExtensions') || [] }) ) } Object.assign(this, {Parser: parser}) }
ストリンギファイア〈コンパイラ〉
redot
function root(node) { return [ utilProcessChildType(node, commentMacro), utilProcessChildType(node, commentBlock), utilProcessChildType(node, commentInline), utilProcessChildType(node, digraph), utilProcessChildType(node, graph) ] .filter(function(value) { return value !== ""; }) .join("\n"); } var compile = function compile(doc) { return root(doc); }; function parserFactory() { this.Compiler = compile; } parserFactory.Compiler = compile; module.exports = parserFactory;
remark
/** * @typedef {import('mdast').Root|import('mdast').Content} Node * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownOptions * @typedef {Omit<ToMarkdownOptions, 'extensions'>} Options */ import {toMarkdown} from 'mdast-util-to-markdown' /** @type {import('unified').Plugin<[Options]|void[], Node, string>} */ export default function remarkStringify(options) { /** @type {import('unified').CompilerFunction<Node, string>} */ const compiler = (tree) => { // Assume options. const settings = /** @type {Options} */ (this.data('settings')) return toMarkdown( tree, Object.assign({}, settings, options, { // Note: this option is not in the readme. // The goal is for it to be set by plugins on `data` instead of being // passed by users. extensions: /** @type {ToMarkdownOptions['extensions']} */ ( this.data('toMarkdownExtensions') ) || [] }) ) } Object.assign(this, {Compiler: compiler}) }
[追記]
- ドライバー: This package exports the following identifiers: unified. There is no default export.
- ドライバー: This package exports the following identifier: remark. There is no default export. ドライバーは名前付きエクスポートだけのようだ。
- ストリンギファイア: This package exports no identifiers. The default export is remarkStringify. プラグインはだいたいデフォルトエクスポートするみたいだ。
- CLI:
"bin": { "remark": "cli.js" },
のように記述する。
[/追記]