Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 解决第一个练习中的“问题”;潘多克过滤器“;页_Lua_Markdown_Pandoc - Fatal编程技术网

Lua 解决第一个练习中的“问题”;潘多克过滤器“;页

Lua 解决第一个练习中的“问题”;潘多克过滤器“;页,lua,markdown,pandoc,Lua,Markdown,Pandoc,上的第一个问题要求将所有文本转换为大写,除非它是URL或链接标题的一部分。因此,我阅读了关于lua过滤器中“执行顺序”的讨论,并提出了 text=需要“text” 链接={} 功能链接(el) 链接[el.target]=el.content 返回el 结束 函数Str(el) el.text=text.upper(el.text) 返回el 结束 函数内联线(元素) 对于i=1,#元素,1 do 如果元素[i].tag=='Link',则 elems[i].content=''--这样我就可以

上的第一个问题要求将所有文本转换为大写,除非它是URL或链接标题的一部分。因此,我阅读了关于lua过滤器中“执行顺序”的讨论,并提出了

text=需要“text”
链接={}
功能链接(el)
链接[el.target]=el.content
返回el
结束
函数Str(el)
el.text=text.upper(el.text)
返回el
结束
函数内联线(元素)
对于i=1,#元素,1 do
如果元素[i].tag=='Link',则
elems[i].content=''--这样我就可以在文档中看到它了。
--elems[i].content=pandoc.Str“你好”
结束
结束
返回元素
结束
--[[--明确强制过滤器的顺序--从“执行顺序”列表。。。
返回{
{Link=Link,
Str=Str,
内线=内线
}
}
]]
认为这会解决我的问题。但不知何故,我无法让它工作。我还尝试通过强制调用过滤器的顺序(在脚本末尾…注释)来显式安排表,但它似乎不起作用。我做错了什么?

练习要求:

将标记文档中的所有常规文本放在所有大写字母中(不接触URL或链接标题中的文本)

这可以按照您上面描述的方式完成:

本地文本=需要“文本”
功能Str(s)
s、 text=text.upper(s.text)
返回s
结束
这样就只剩下URL和链接标题了


单独留下链接文本有点困难。Pandoc Lua过滤器在深度优先顺序中遍历文档树,因此链接节点只有在其内容被处理后才会被处理。我们可以用一个简单的过滤器来验证和可视化这一点,比如

函数内联(i)
打印(i.tag、pandoc.utils.stringify(i))
结束
在像
Hello[免费百科全书]这样的输入上运行上述内容(https://en.wikipedia.org)
将产生

Str     Hello,
Space    
Str     Free
Space    
Str     Encyclopedia
Link    Free Encyclopedia
使用
内联线
而不是
内联线
也没什么不同:嵌套元素在我们知道它们属于哪个元素之前就被处理了。这实际上意味着我们不能(轻松地)防止转换影响特定子树

这是不幸的(而且,作为Lua过滤系统的作者,我希望在将来改变这一点)。然而,并不是所有的都失去了。我们可以通过一个简单的技巧来解决这个问题:保存,然后恢复原始链接内容:

本地文本=需要“文本”
本地链接=pandoc.List()
用于所有CAPs的函数
s、 text=text.upper(s.text)
返回s
结束
功能保存链接(l)
链接:插入(l)
结束
功能恢复链接(l)
返回链接:删除(1)
结束
返回{
{Link=save_Link},
{Str=to_allcaps},
{Link=restore_Link},
}
在这里,我们遍历文档三次,如返回的过滤器列表中的三个独立过滤器所示。首先,我们将所有链接收集到一个列表中;然后我们在所有的帽子里做每件事;最后,我们恢复原始链接,从而撤消链接标题中的所有大写修改

紧凑型:

本地文本=需要“文本”
本地链接=pandoc.List{}
返回{
{Link=function(l)links:insert(l)end},
{Str=函数返回pandoc.Str(text.upper(s.text))end},
{Link=function(41; return links:remove(1)end},
}

按照问题的表述方式,我认为人们根本不必触及
链接
元素。这个练习应该可以用
Str
pandoc.SmallCaps
(或
内联线
pandoc.SmallCaps
)来解决。谢谢@tarleb。问题是,据我所知,链接的内容是由其他内联线()组成的,我无法阻止
Str
过滤器下降到
内联线列表中。因此,我认为需要两个级别的内联线(一个用于应用案例转换的顶级文档,另一个用于不应用案例转换的内联线遍历)才能实现这一点。谢谢你帮我做这件事。练习说明修改文档“不接触URL或链接标题中的文本”。这是一个提示,但也有点误导,因为
Str
过滤器不会影响这些属性。本练习没有提到链接标题,链接标题将通过
Str
进行更改。因此,我应该注释除
Str
函数之外的所有内容?我这样做了,把它放在一个名为
allcaps.lua的文件中,然后运行命令
echo“Hello[Google](https://www.google.com).“| pandoc--lua filter=。/allcaps.lua--to=native
,它产生
[Para[Str“HELLO”,空格,链接(“,[],[],[])[Str“GOOGLE]”(”https://www.google.com“,”),Str.“]]
。所以,我想我当时(现在仍然)是想问,是否有办法在链接中不大写
Str
。有?无论如何,谢谢大家分享你的想法。太好了!谢谢你的详细解释。