如何将一组模块抽象为要包含在多个管道中的变量



我正在尝试抽象一组模块以在多个管道中使用它们。 在我的第一个管道之前,我有这个。

IModule[] textReplacement = new IModule[] {
    Replace(" -- ", "—"),
    Replace("--", "—"),
    Trace("Text replacement performed...")
};

然后,在管道中:

Pipelines.Add("Pages",
   ReadFiles("*.md"),
   Concat(textReplacement),
   WriteFiles("*.html)
);

当我执行时,Text replacement performed...被写入控制台,因此执行流正在通过这两个模块工作。然而--

  1. 实际上不会发生文本替换。 (或者,如果是这样,它不会保留在继续沿管道运行的文档中。

  2. 空文档将添加到文档集中。

Concat的文档明确指出:

指定的模块使用空的初始文档执行,然后输出原始输入文档,无需修改,并与指定模块序列的结果连接。

我只是不知道为什么会这样,为什么需要或有帮助,或者如何摆脱它。 我不能在我的文档集中浮动空文档,否则会导致后续管道中出现错误。

这里的诀窍是使用 LINQ .Concat() 方法形成一个数组,该数组由特定于每个管道的模块与在管道之前声明的公共模块数组(示例中textReplacement(组成。这是有效的,因为IPipelineCollection.Add()接受params IModule[]数组。

IModule[] textReplacement = new IModule[] {
    Replace(" -- ", "—"),
    Replace("--", "—"),
    Trace("Text replacement performed...")
};
Pipelines.Add("Pages",
    new[]
    {
        // Modules before the common set
        ReadFiles("*.md")
    }
    .Concat(textReplacement)  // The common set
    .Concat(new[]
    {
        // Modules after the common set
       WriteFiles("*.html)
    })
    .ToArray()
);

当然,这很尴尬。当然,除了使用 .Concat() 之外,还有其他方法可以创建单个数组以馈送到IPipelineCollection.Add()。例如,您可以使用 List<T>.Add()List<T>.AddRange() 在每个管道之前创建一个List<IModule>来创建模块的聚合序列,然后在创建管道时将其转换为数组。您还可以编写一个扩展方法,该方法知道如何将多个序列连接成单个数组。

将来,通过

引入一个名为Modules的特殊模块,这将变得更加容易,该模块专门为此目的而设计,该模块充当子模块(https://github.com/Wyamio/Wyam/issues/197(的容器:

Modules textReplacement = Modules(
    Replace(" -- ", "&mdash;"),
    Replace("--", "&mdash;"),
    Trace("Text replacement performed...")
);
Pipelines.Add("Pages",
    ReadFiles("*.md"),
    textReplacement,
    WriteFiles("*.html)
);

最新更新