unifiedパーザープラグインの事例 2

https://github.com/redotjs/redot/blob/main/packages/redot-parse/redot-parse.js

"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;

ファイル dot.js でデフォルトエクスポートされているオブジェクトが parser 。parser.parse() 関数は、string → dotast::Root だろう。

This::parse = redot-parse::parse は、文字列またはvfileをもらう。parse(null, file) とすると file から入力。

エクスポートは parserFactory 、この名前は分かりやすい。パフォーマーのファクトリ。ファクトリの使い方は二通り。

  1. (new parserFactory()).Parser(doc);
  2. parserFactory.Parser(doc)

ここでは使ってないが、関数の戻り値としてパフォーマー関数を得ることもある。結局3種類使っている。

  1. プラグイン関数の戻り値がパフォーマー関数
  2. プラグイン関数〈コンストラクタ〉で new したオブジェクトがパフォーマーオブジェクト
  3. プラグイン関数〈オブジェクト〉自体がパフォーマーオブジェクト

プラグイン関数=パフォーマー関数 は使ってないから、パフォーマー関数をラップする必要がある。

もう少し統一的なアタッチ〈プラグ〉方法にして欲しかった。