首页 > 解决方案 > 如何正确地进行自定义降价标记

问题描述

我目前从事一个个人写作项目,由于我想要支持的相关平台和输出格式的差异,我最终维护了几个不同的版本,这些都不是很容易解决的。在我看了几次 pandoc 和它所代表的纯粹森林之后,我得出结论,仅仅模板并不能满足我的需要,更糟糕的是,我似乎需要一个自定义过滤器和编写器的组合......就足够了说:弄乱 AST 是我觉得超出我的深度的地方。足够了,与其在这里问“我如何做 X”这样的具体问题,而是一个“X 是正确的方法,或者什么是正确的方法,你能给出一个它如何联系在一起的例子?'......所以如果这个问题相当冗长:我很抱歉。

我目前的目标是拥有像下面这样的自定义标记,它应该“跟踪”哪个角色说了什么:

<paul|"Hi there">

如果我转换为 HTML,我想要类似于:

<span class="speech paul">"Hi there"</span>

弹出(也许是 <p> 标签),而如果它只是纯降价/纯文本,我希望它默默地消失:

"Hi there"

查看我研究过的 JSON AST 结构,我想要一种类似于“Emph”标签的新结构类型,称为“Speech”,它允许将整个文本块放入其中,这是有道理的附加的额外信息(说话的人)。所以是这样的:

{"t":"Speech","speaker":"paul","c":[ ... ] }

问题 #1:当 lua 过滤器看到文档时,它显然已经被提炼成 AST。这意味着以类似于大多数宏扩展器示例所做的方式替换项目并不能真正起作用,因为它需要向前阅读。使用这种方法,我只需将零碎的内容替换到位(<NAME| 变为 StartSpeech,随后的第一个单独的 > 变为 EndSpeech,但这会使格式错误的输入成为更大的潜在问题,因为静默失败。此外,这些标签与 AST 的外观完全不符。

更复杂的是,我的一些角色最终在整个故事中学习了第二语言,为此我采用了一种不同的格式,其中包含对口语文本的简化理解,以及对所说内容的透视角色理解。例子:

<paul|"Heb je goed geslapen?"|"Did you ?????">

我可能会在我的过滤器中添加第三个“UnderstoodSpeech”组,但是(问题 #2)此时,说话者、原始语音和理解的翻译之间的关系完全消失了。只要最终文档在这些各自的订单中并且仅在这些订单中需要这些值,就可以了……但是如果我希望我的 HTML 版本看起来像

"Did you?????"

带有包含原始语音的工具提示/悬停效果?这几乎是不可能实现的,因为 AST 不包含那种关系细节。

我在过滤器中创建的任何类型的 AST 都是我需要在自定义编写器中理解的。理想情况下,我想尽可能多地为作者重复使用 pandoc 的库存功能,但我什至不知道此时这是否可行。

所以现在我的问题是:有很好的 pandoc 理解的人可以给我一个例子,说明如何将相关数据位保持在一起并以正确的方式应用它们?我的意思是展示一个基本示例,说明需要在以下工具链中的 lua-filter 和 lua-writer 脚本中添加什么

[CUSTOMIZED MARKDOWN INPUT] -> lua-filter -> lua-writer -> [CUSTOMIZED HTML5 OUTPUT]

标签: luapandocmarkup

解决方案


推荐阅读