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

时间:2016-01-29 10:08:37

标签: wyam

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

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

然后,在一个管道中:

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

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

  1. 实际上不会发生文本替换。 (或者,如果确实如此,那么它不会持续存在于继续沿着管道传输的文档中。)

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

  3. Concat的文档明确指出:

      

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

    我无法弄清楚为什么会这样,为什么需要或有用,或者如何摆脱它。我不能在我的文档集中浮动文档,否则会导致后续管道出错。

1 个答案:

答案 0 :(得分:1)

这里的技巧是使用LINQ .Concat()方法形成一个单独的数组,该数组包含特定于每个管道的模块,以及在管道之前声明的公共模块数组({{1}在示例中)。这有效,因为textReplacement接受IPipelineCollection.Add()数组。

params IModule[]

当然,这很尴尬。当然除了使用IModule[] textReplacement = new IModule[] { Replace(" -- ", "&mdash;"), Replace("--", "&mdash;"), 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() ); 之外,还有其他方法可以创建单个数组以提供给IPipelineCollection.Add()。例如,您可以使用.Concat()List<IModule>在每个管道之前创建List<T>.Add()以创建模块的聚合序列,然后在创建管道时将其转换为数组。您还可以编写一个知道如何将多个序列连接成一个数组的扩展方法。

将来,通过引入一个专门为此目的而设计的List<T>.AddRange()特殊模块,它可以变得更容易,该模块充当子模块的容器(https://github.com/Wyamio/Wyam/issues/197):

Modules