reline 雑メモ

コピペしただけでグチャグチャだが、後で整理する。

ディレクトリ構成

./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" }, のように記述する。

[/追記]