2012-08-02 18 views
6

que tiene que analizar YAML Front Matter en java como jekyll, Así Iooked en el código fuente, y found this pero no puede hacer mucho sentido de la misma (no sé mucho de rubí).materia de análisis YAML frontal en Java

Así que mi pregunta es, ¿cómo puedo analizar YAML Front Matter en java?

que tienen snakeyaml en mi ruta de clase y yo estaría de análisis YAML Front Matter de un archivo de rebajas, para el que yo uso pegdown

+0

Hay varias bibliotecas YAML disponibles para Java, snakeyaml es una de ellas. Entonces, ¿cuál es exactamente su problema con la lectura de YAML desde la parte frontal? – Polygnome

+0

Mi pregunta es ¿cómo puedo separar el frente de YAML del recorte y analizarlo de forma segura? – Gautam

Respuesta

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); 
} 

Para obtener un obtener Reader, es probable que necesite un FileReader o un InputStreamReader.

+0

Vamos, Arian, este es menor que un ejemplo de expresiones regulares, ¿Qué pasa con las situaciones en las que el usuario usa más de 3 '-' o menos el yaml comienza, Todo esto es fácil con regex, pero estoy buscando algo más confiable que regex. – Gautam

+1

La especificación de formato (1) indica claramente que la primera línea contiene exactamente tres guiones. (1) https://github.com/mojombo/jekyll/wiki/YAML-Front-Matter – Cephalopod

+0

Tristemente no puedo aplicar esa restricción – Gautam

2

Ok, ya que su comentario aclaró lo que su pregunta es:

El frente yaml que es la materia todo lo que está dentro de las líneas con tres guiones (---). YAML La materia del frente SIEMPRE está al principio del archivo.

Así que solo tiene que analizar el archivo y extraer la materia prima YAML desde el inicio del archivo. puede analizarlo con un autómata o un RegEx. Depende de ti. Siempre está estructurado de la misma manera:

 
--- 
some YAML here 
--- 
Markdown/textile/HTML contents of file 
+0

Entiendo la expresión regular método, pero estoy tratando de evitar eso si es posible. Entonces, ¿cómo lo hago con el 'autómata' – Gautam

+0

Es como cualquier analizador que pueda escribir. Lea una línea. Si es' --- 'cambie un bool a true y comienza a escribir el YAMl en un buffer. Si presionas '---' 'a gain cambia el bool a falso y deja de escribir en el búfer. Entonces su buffer contiene todo YAMl. Solo asegúrese de detectar solo al comienzo del archivo. Es realmente, muy trivial, y dar muestras de código significaría publicar una solución completa y funcional. Y no creo que ese sea el propósito de SO. – Polygnome

+0

No estoy familiarizado con el analizador de escritura. – Gautam

2

Si son sólo interesado en el asunto principal, se puede utilizar el método loadall de SnakeYaml:

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

SnakeYaml sólo leer la primera estructura yaml (los preliminares) e ignorar el texto no yaml de salida.

Desafortunadamente, SnakeYaml no tiene ninguna manera elegante de salida el resto del texto, por lo que si desea analizar tanto la materia delantero y el cuerpo al mismo tiempo, no hay ninguna ventaja en este enfoque :-(