我必须在java
中解析YAML Front Matter
,如jekyll
,所以对源代码和found this进行了解析,但我无法理解它(我不太了解红宝石)。
所以我的问题是,如何在java中解析YAML Front Matter
?
我的classpath中有snakeyaml,我将从markdown文件中解析YAML Front Matter
,我使用pegdown
答案 0 :(得分:7)
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);
}
要获得Reader
,您可能需要FileReader
或InputStreamReader
。
答案 1 :(得分:2)
好的,因为您的评论澄清了您的问题:
yaml前面的内容是行内部的三个破折号(---
)。
YAML前面的内容总是在文件的开头。
所以你只需要解析文件并从文件的开头提取YAML Front Matter。您可以使用自动机或RegEx解析它。这完全取决于你。它总是以相同的方式构建:
--- some YAML here --- Markdown / textile / HTML contents of file
答案 2 :(得分:2)
如果您只是对前面的事情感兴趣,可以使用SnakeYaml的loadAll方法:
Object yamlFrontMatter(Yaml yaml, InputStream in) {
return yaml.loadAll().iterator().next();
}
SnakeYaml只会读取第一个yaml结构(前面的内容)并忽略尾随的非yaml文本。
不幸的是,SnakeYaml没有优雅的方式输出剩余的文本,所以如果你想同时解析前面的事物和身体,这种方法没有优势: - (