6

我必须像这样解析YAML Front Matter,所以我查看了源代码,发现了这个,但我不太明白(我不太了解红宝石)。javajekyll

所以我的问题是,如何YAML Front Matter在 java 中解析?

我的类路径中有snakeyaml,我YAML Front Matter将从markdown文件中解析,为此我使用pegdown

4

3 回答 3

8
void parse(Reader r) throws IOException {
    BufferedReader br = new BufferedReader(r);

    // detect YAML front matter
    String line = br.readLine();
    while (line.isEmpty()) line = br.readLine();
    if (!line.matches("[-]{3,}")) { // use at least three dashes
        throw new IllegalArgumentException("No YAML Front Matter");
    }
    final String delimiter = line;

    // scan YAML front matter
    StringBuilder sb = new StringBuilder();
    line = br.readLine();
    while (!line.equals(delimiter)) {
        sb.append(line);
        sb.append("\n");
        line = br.readLine();
    }

    // parse data
    parseYamlFrontMatter(sb.toString());
    parseMarkdownOrWhatever(br);
}

要获得 get Reader,您可能需要 aFileReaderInputStreamReader.

于 2012-08-16T11:01:26.010 回答
2

好的,因为您的评论澄清了您的问题:

---yaml 前面的内容是包含三个破折号 ( )的行内的所有内容。YAML Front matter 总是在文件的开头。

因此,您只需解析文件并从文件开头提取 YAML Front Matter。您可以使用自动机或正则表达式对其进行解析。这真的取决于你。它的结构总是相同的:

---
这里有一些 YAML
---
Markdown / Textile / HTML 文件内容
于 2012-08-12T17:24:29.390 回答
2

如果你只是对前面的事情感兴趣,你可以使用 SnakeYaml 的 loadAll 方法:

Object yamlFrontMatter(Yaml yaml, InputStream in) {
    return yaml.loadAll().iterator().next();
}

SnakeYaml 只会读取第一个 yaml 结构(前面的内容)并忽略尾随的非 yaml 文本。

不幸的是,SnakeYaml 没有优雅的方式来输出剩余的文本,所以如果你想同时解析前端和正文,这种方法没有优势:-(

于 2013-01-15T17:25:15.093 回答