Cuando estabamos haciendo skipper, estuvimos viendo como parsear el código en vhdl. Empezamos con expresiones regulares, la verdad es que son muy poderosas, pero cuando se trata de parsear un lenguaje, no son lo mas recomendable, ya que el código termina pareciendo un archivo binario. Hay muchos analizadores como yacc, lex y algún otro mas que no conozco. No son la panacea pero si hacen la vida mas fácil.
Pregunto en el canal de #pyar como podía hacer y don __lucio__ me dijo pyparsing, parsing para humanos, así lo define él y la verdad es que no le erró para nada. Empecé a leer un poco y como ya vamos a ver el código queda hablado, es como si le estuvieramos diciendo al programa lo que tiene que hacer escribiendo en humano y nos entendiera :-).
Es un render de wiki en html muy simple, le faltan alguna características, pero la idea base de que hacer algo como esto es muy sencillo.
El código es:
#!/usr/bin/env python #coding=utf-8 from pyparsing import * def convertToHTML_A(s,l,t): try: temp = t[0].split() url = temp[0] text = " ".join([ i for i in temp if i != url]) except ValueError: raise ParseFatalException(s,l,"invalid URL link reference: " + t[0]) return '<A href="%s">%s</A>' % (url,text) wiki_text = """= Pyparsing es bastante ''Loco'' = Acá ponemos como ^superíndice^ == Algún otro título == Algo ~~tachado~~ y algo ,,chiquitito,, === Ahora un link === [http://softwarefreedomday.org/ Sitio oficial del Software Freedom Day]""" head6 = QuotedString("="*6, endQuoteChar="="*6).setParseAction(lambda tokens: "<h6>" + tokens[0] + "</h6>") head5 = QuotedString("="*5, endQuoteChar="="*5).setParseAction(lambda tokens: "<h5>" + tokens[0] + "</h5>") head4 = QuotedString("="*4, endQuoteChar="="*4).setParseAction(lambda tokens: "<h4>" + tokens[0] + "</h4>") head3 = QuotedString("="*3, endQuoteChar="="*3).setParseAction(lambda tokens: "<h3>" + tokens[0] + "</h3>") head2 = QuotedString("="*2, endQuoteChar="="*2).setParseAction(lambda tokens: "<h2>" + tokens[0] + "</h2>") head1 = QuotedString("="*1, endQuoteChar="="*1).setParseAction(lambda tokens: "<h1>" + tokens[0] + "</h1>") italic_bold = QuotedString("\'"*5, endQuoteChar="\'"*5).setParseAction(lambda tokens: "<i><strong>" + tokens[0] + "</strong></i>") bold = QuotedString("\'"*3, endQuoteChar="\'"*3).setParseAction(lambda tokens: "<strong>" + tokens[0] + "</strong>") italic = QuotedString("\'"*2, endQuoteChar="\'"*2).setParseAction(lambda tokens: "<i>" + tokens[0] + "</i>") strike = QuotedString("~~", endQuoteChar="~~").setParseAction(lambda tokens: "<del>" + tokens[0] + "</del>") superscript = QuotedString("^", endQuoteChar="^").setParseAction(lambda tokens: "<sup>" + tokens[0] + "</sup>") subscript = QuotedString(",,", endQuoteChar=",,").setParseAction(lambda tokens: "<sub>" + tokens[0] + "</sub>") urlRef = QuotedString("[",endQuoteChar="]").setParseAction(convertToHTML_A) texto = head6.transformString(wiki_text) texto = head5.transformString(texto) texto = head4.transformString(texto) texto = head3.transformString(texto) texto = head2.transformString(texto) texto = head1.transformString(texto) texto = italic_bold.transformString(texto) texto = bold.transformString(texto) texto = italic.transformString(texto) texto = strike.transformString(texto) texto = subscript.transformString(texto) texto = superscript.transformString(texto) texto = urlRef.transformString(texto) print texto
La verdad es que hay poco para comentar, QuotedString nos devuelve los tokens que estén encerrados entre ese quote, luego con setParseAction, le asociamos un método que es el que reemplaza las quote por los tags en html. En cuanto a lambda es solo una función anónima, sin nombre. Mirando a subscript vemos que lleva como parámetro a tokens y luego en los dos puntos el código de la función anónima, que en este caso concatena al token con los tags en html .
A continuación el resultado de esto
Pyparsing es bastante Loco
Acá ponemos como superíndice
Algún otro título
Algo tachado y algo chiquitito
Ahora un link
Sitio oficial del Software Freedom Day
Que en html es
<h1> Pyparsing es bastante <i>Loco</i> </h1> Acá ponemos como <sup>superíndice</sup> <h2> Algún otro título </h2> Algo <del>tachado</del> y algo <sub>chiquitito</sub> <h3> Ahora un link </h3> <A href="http://softwarefreedomday.org/">Sitio oficial del Software Freedom Day</A>
- TiN's blog
- Inicie sesión o regístrese para enviar comentarios
- 399 lecturas
-



