我试图抽象出一组模块,以便在多个管道中使用它们。在我的第一个管道之前,我有这个。
IModule[] textReplacement = new IModule[] {
Replace(" -- ", "—"),
Replace("--", "—"),
Trace("Text replacement performed...")
};
然后,在一个管道中:
Pipelines.Add("Pages",
ReadFiles("*.md"),
Concat(textReplacement),
WriteFiles("*.html)
);
当我执行时,Text replacement performed...
被写入控制台,因此执行流程正在通过这两个模块。但是 -
实际上不会发生文本替换。 (或者,如果确实如此,那么它不会持续存在于继续沿着管道传输的文档中。)
将空文档添加到文档集中。
Concat
的文档明确指出:
指定的模块使用空的初始文档执行,然后输出原始输入文档,而不进行修改与指定模块序列的结果连接。
我无法弄清楚为什么会这样,为什么需要或有用,或者如何摆脱它。我不能在我的文档集中浮动文档,否则会导致后续管道出错。
答案 0 :(得分:1)
这里的技巧是使用LINQ .Concat()
方法形成一个单独的数组,该数组包含特定于每个管道的模块,以及在管道之前声明的公共模块数组({{1}在示例中)。这有效,因为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()
);
之外,还有其他方法可以创建单个数组以提供给IPipelineCollection.Add()
。例如,您可以使用.Concat()
和List<IModule>
在每个管道之前创建List<T>.Add()
以创建模块的聚合序列,然后在创建管道时将其转换为数组。您还可以编写一个知道如何将多个序列连接成一个数组的扩展方法。
将来,通过引入一个专门为此目的而设计的List<T>.AddRange()
特殊模块,它可以变得更容易,该模块充当子模块的容器(https://github.com/Wyamio/Wyam/issues/197):
Modules