【问题标题】:Changing <q> and </q> tags to " pairs in specific places在特定位置将 <q> 和 </q> 标记更改为 " 对
【发布时间】:2012-04-22 01:53:22
【问题描述】:

我正在使用工具链将 markdown 转换为 HMTL5,使用 Pandoc 作为 HTML 内容插入到 WordPress 的可视化编辑器中。

当涉及到插入图像时,WordPress 会放置所谓的shortcode 形式

[caption id="attachment_100" align="aligncenter" width="300" caption="This is an image caption"]

进入 HTML 文本。这并不是真正的降价,而是由 Pandoc 解释的,它将每个 " ... " 对转换为 &lt;q&gt; ... &lt;/q&gt; 对以用于 HTML 输出。这在 WordPress 中无法正常工作。

我需要防止转换" ... ",但仅限于那些出现在明确定义的[caption ... ] 方括号内的转换,这些方括号由WordPress 专门放入并且不能与其他内容混淆我放进去的。

我对@9​​87654322@ 或Haskell 的了解还不够,无法编写一个内联paseser/filter 来免除这个文本片段的Pandoc 处理。鉴于我对 Pandoc 和 Haskell 不熟悉,到目前为止,我在 pandoc 邮件列表上收到的建议已经超出了我的想象。

我曾想过编写一个 Perl 过滤器,但出于非常充分的理由强烈反对使用正则表达式。

我在这里询问是否有一种可靠的方法可以将 &lt;q&gt; ... &lt;/q&gt; 标签反向替换为 " ... ",仅用于在通过 pandoc 运行后的 [caption ... ] 块中的文本,作为后处理步骤。

有人可以建议我如何解决这个问题吗?

非常感谢。

【问题讨论】:

    标签: haskell filter pandoc


    【解决方案1】:

    你想要这样的东西吗?

    import Data.List
    import System.IO
    
    main = do
       inh  <- openFile "input.txt"  ReadMode
       outh <- openFile "output.txt" WriteMode
       str <- hGetContents inh
       hPutStrLn outh (outsideCaption str) 
       hClose inh
       hClose outh
    
    outsideCaption::String->String
    outsideCaption [] = []
    outsideCaption str@(x:xs)
        | isPrefixOf "[caption" str = insideCaption str
        | otherwise                 = x:outsideCaption xs
    
    
    insideCaption::String->String
    insideCaption []       = []
    insideCaption (']':xs) = ']':outsideCaption xs
    insideCaption str@(x:xs)
        | (isPrefixOf "<q>"  str) = '\"':insideCaption (drop 3 str)
        | (isPrefixOf "</q>" str) = '\"':insideCaption (drop 4 str)
        |  otherwise              = x   :insideCaption         xs
    

    这段代码读取一个名为“input.txt”的文件,执行您描述的替换并将结果打印到“output.txt”。

    将当前主目录替换为:

    main = interact outsideCaption 
    

    使其从标准输入读取到标准输出,例如:

    [rothesay]Ygfijj: echo "testing <q> [caption<q></q>]" | ./test 
    testing <q> [caption""] 
    

    【讨论】:

    • 谢谢。我编译并运行它,它工作!不过,我可以麻烦您进行两项更改:(1) 是否可以使其在原地运行,写入与输入相同的输出文件,或者以其他方式接受来自标准输入和标准输出的 I/O? (2) 我意识到我还需要去除一对&lt;p&gt; &lt;/p&gt; 标签。第一个出现在前导[caption 之前,即&lt;p&gt;[cation,第二个出现在second ] 之后,即]&lt;/p&gt;,而不是在第一个封闭] 之后。再次感谢。
    • @chandra 我添加了关于如何使用标准输入/标准输出的建议,您能否为您提到的其他替换提供示例输入/输出?
    • 谢谢。我相信我现在可以读取和写入同一个文件。我无法在 cmets 框中输入示例 I/O。请看看这个link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2016-07-27
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    相关资源
    最近更新 更多