haskell - 如何使用 Pandoc 从 Markdown 文件中获取 YAML 元数据? [ haskell ]

标签 haskell pandoc

我想获取元数据和内容。

鉴于此 Markdown 文本:

---
title: The Title
---

just some content

这个函数提取Meta:

extractMeta :: Pandoc -> Meta 
extractMeta (Pandoc meta _) = meta

我总是得到

Meta {unMeta = fromList []}

作为回应。

元数据 block 似乎包含在其他地方:

Pandoc (Meta {unMeta = fromList []}) [HorizontalRule,Para [Str "title:",Space,Str "Something",SoftBreak,Str "id:",Space,Str "123123",SoftBreak,Str "---"],Para [Str "hi",Space,Str "this",Space,Str "is",Space,Str "the",Space,Str "first",Space,Str "blog",Space,Str "post"]]

有什么方法可以让 Pandoc 使用其 Haskell API 解析 YAML 元数据吗?

谢谢。

完整代码:

module Main where
  import Data.Text (pack, Text)
  import Text.Pandoc (def, readMarkdown, runIO, ReaderOptions (readerStandalone))
  import Data.Functor ((<&>))

  readAndPack :: FilePath -> IO Text
  readAndPack = (<$>) pack . readFile . (++) "posts/"

  main :: IO ()
  main = do
    md     <- readAndPack "binary.markdown"
    pandoc <- runIO $ readMarkdown def { readerStandalone = True } md
    print pandoc

最佳答案

问题是:默认情况下未启用 YAML 元数据。您需要 Ext_yaml_metadata_block 才能获得您想要的内容。下面是按预期解析 YAML 元数据的完整代码。

module Main where

import Data.Text (pack, Text)
import Text.Pandoc (def, readMarkdown, runIO, ReaderOptions (readerStandalone))
import Text.Pandoc.Extensions
import Text.Pandoc.Options
import Data.Functor ((<&>))

readAndPack :: FilePath -> IO Text
readAndPack = (<$>) pack . readFile . (++) "posts/"

main :: IO ()
main = do
  md     <- readAndPack "binary.markdown"
  pandoc <- runIO $ 
    readMarkdown 
      (def { 
        readerStandalone = True,
        readerExtensions = 
          enableExtension Ext_yaml_metadata_block (readerExtensions def) } ) 
      md
  print pandoc

这是输出:

Right (Pandoc (Meta {unMeta = fromList [("title",MetaInlines [Str "The",Space,Str "Title"])]}) [Para [Str "just",Space,Str "some",Space,Str "content"]])

关于haskell - 如何使用 Pandoc 从 Markdown 文件中获取 YAML 元数据? [ haskell ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71915534/

相关文章:

Haskell 递归函数中的无限循环

file - 为什么必须在源文件开头指定模块名称?

haskell - 使用递归在 haskell 中编写一个函数来确定字符列表中有多少位数字

haskell - gtk 窗口停止更新,即使应用程序看起来正在运行

emacs - Emacs 中的 Markdown 预览失败 : (pandoc? ) 错误 127

unicode - Haskell:将 unicode 整数转换为实际的 unicode 字符

r - 在 rmarkdown html 输出中添加 X-UA-Compatible

r - 用于书本的自定义 LaTeX 模板

使用 ctags 的 Vim Markdown 导航 : using 'tagbar' + 'markdown2ctags' with 'vim-pandoc'

r - 在 r markdown 中包装 pandoc 表列名