首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >haskell中的pandoc包含文件过滤器

haskell中的pandoc包含文件过滤器
EN

Stack Overflow用户
提问于 2014-02-06 01:36:26
回答 3查看 1.2K关注 0票数 4

我正在使用这个haskell pandoc包含文件筛选器

代码语言:javascript
复制
#!/usr/bin/env runhaskell
-- includes.hs
import Text.Pandoc.JSON

doInclude :: Block -> IO Block
doInclude cb@(CodeBlock (id, classes, namevals) contents) =
  case lookup "include" namevals of
       Just f     -> return . (CodeBlock (id, classes, namevals)) =<< readFile f
       Nothing    -> return cb
doInclude x = return x

main :: IO ()
main = toJSONFilter doInclude

在markdown中使用以下代码片段

代码语言:javascript
复制
~~~~ {include="tasks/mdbook.js"}
~~~~

这实际上包括文件到标记,但我希望它也包括代码格式,例如

代码语言:javascript
复制
```js

此处的文件内容

代码语言:javascript
复制

我如何更新上面的haskell代码来完成这个?使用类似于

代码语言:javascript
复制
~~~~ {code="tasks/mdbook.js", format="js"}
~~~~
EN

回答 3

Stack Overflow用户

发布于 2014-03-11 08:06:08

由于include筛选器保留了代码块的所有classes,因此您只需使用以下代码即可包含文件内容并对其应用代码格式:

代码语言:javascript
复制
~~~~ {.javascript include="tasks/mdbook.js"}
~~~~
票数 2
EN

Stack Overflow用户

发布于 2014-02-06 03:37:35

我假设您正在尝试解决的问题是拥有一个引用某段代码的标记文档,并且您希望避免将代码复制粘贴到文档中以及手动同步两个版本的噩梦。因此,您已经尝试通过过滤器将源文件包含到markdown文档中来解决这个问题。

我用不同的方式解决了同样的问题。我将所有(相关)源代码保存在markdown文档中,并编写了一个工具来提取所有源代码。我的特殊用例是,我正在为讲座编写幻灯片,每次我编辑我的幻灯片时,我都会提取代码并确保它被编译。为了方便我的学生,我还把所有的代码打包成一个zip压缩包。

我的工具可以在这里找到:https://github.com/josefs/CodeExtract

您可以像这样编写代码块:

代码语言:javascript
复制
~~~ {.haskell file="Hello.hs"}
main = putStrLn "Hello World!"
~~~

当通过我的小工具运行包含这些代码块的文档时,它将生成一个包含块中代码的文件Hello.hs

还有一个更高级的功能,支持多个代码片段,这些代码片段可以在同一文档中结束。例如,您可以有两个代码块,如下所示:

代码语言:javascript
复制
~~~ {.haskell template="Hello.hs.tmpl" var="mainfkn"}
main = putStrLn str
~~~

~~~ {.haskell template="Hello.hs.tmpl" var="misc"}
str = "Hello World!"
~~~

然后是一个模板文件,Hello.hs.tmpl,如下所示(它使用与pandoc相同的模板格式):

代码语言:javascript
复制
~~~
module Main where
$mainfkn$
$misc$
~~~

它将生成一个文件Hello.hs,其中包含模板文件,但变量替换为markdown文件中相应的代码块。这非常方便。

我希望你会发现我的工具很有用,尽管我知道它可能不能解决你的特定问题。

票数 1
EN

Stack Overflow用户

发布于 2014-02-07 00:53:29

您似乎想要的是更新代码块的属性。下面是你可以做的:

代码语言:javascript
复制
#!/usr/bin/env runhaskell
-- includes.hs
import Text.Pandoc.JSON

doInclude :: Block -> IO Block
doInclude cb@(CodeBlock (id, classes, namevals) contents) =
  case lookup "include" namevals of
       Just f     -> do
         let newAttrs = filter ((/= "include") . fst) namevals ++ [("code",f), ("format","js")]
         return . (CodeBlock (id, classes, newAttrs)) =<< readFile f
       Nothing    -> return cb
doInclude x = return x

main :: IO ()
main = toJSONFilter doInclude

根据需要更改newAttr的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21584396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档