我必须像这样解析YAML Front Matter
,所以我查看了源代码,发现了这个,但我不太明白(我不太了解红宝石)。java
jekyll
所以我的问题是,如何YAML Front Matter
在 java 中解析?
我的类路径中有snakeyaml,我YAML Front Matter
将从markdown文件中解析,为此我使用pegdown
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
,您可能需要 aFileReader
或InputStreamReader
.
好的,因为您的评论澄清了您的问题:
---
yaml 前面的内容是包含三个破折号 ( )的行内的所有内容。YAML Front matter 总是在文件的开头。
因此,您只需解析文件并从文件开头提取 YAML Front Matter。您可以使用自动机或正则表达式对其进行解析。这真的取决于你。它的结构总是相同的:
--- 这里有一些 YAML --- Markdown / Textile / HTML 文件内容
如果你只是对前面的事情感兴趣,你可以使用 SnakeYaml 的 loadAll 方法:
Object yamlFrontMatter(Yaml yaml, InputStream in) {
return yaml.loadAll().iterator().next();
}
SnakeYaml 只会读取第一个 yaml 结构(前面的内容)并忽略尾随的非 yaml 文本。
不幸的是,SnakeYaml 没有优雅的方式来输出剩余的文本,所以如果你想同时解析前端和正文,这种方法没有优势:-(