pygments

octubre 21, 2015

Pygments

Librería que permite exportar código de python con formato (Syntax Highlighter) a HTML o latex

In [1]:
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter

Generar código python en un documento html

In [2]:
ejemplo_codigo = 'print "Corre lola, corre"'

# Argumentos (código, lexer, formato)
code_html = highlight(ejemplo_codigo, PythonLexer(), HtmlFormatter())

Resultado en el explorador:

print "Corre lola, corre"

Modificar el estilo del código

In [3]:
from pygments.lexers import get_lexer_by_name

ejemplo_codigo = 'print "Corre lola, corre"'

lexer = get_lexer_by_name("python", stripall=True)
formatter = HtmlFormatter(linenos=True, cssclass="source")
result = highlight(ejemplo_codigo, lexer, formatter)

Código generado:

<table class="sourcetable">
<tr>
    <td class="linenos">
        <div class="linenodiv">
            <pre>1</pre>
        </div>    
    </td>
    <td class="code">
        <div class="source">
            <pre>
            <span class="k">print</span> <span class="s">&quot;Corre lola, corre&quot;</span>
            </pre>
        </div>
    </td>
</tr>
</table>
1
print "Corre lola, corre"

Lexer

Los lexer dividen el código en fragmentos de tipos determinados como: comentarios, palabras clave, números, etc. A cada uno de estos grupos (tokens) se le puede dar un formato en específico y dependen directamente del tipo de lenguaje usado.

In [4]:
import pygments.lexers as pl

# Se obtiene el lexer para código Python
pl.get_lexer_by_name('python')
Out[4]:
<pygments.lexers.PythonLexer>

Nombres de los lexers disponibles relacionados con python

  • python, py, sage
  • python3, py3
  • numpy
  • cython, pyx, pyrex (extensiones .pyx, .pxd, .pxi)
  • pycon (formato de salida de consola de python)

También se puede obtener un lexer a partir de un archivo:

In [5]:
# Se obtiene un lexer para código ruby
pl.get_lexer_for_filename('spam.rb')
Out[5]:
<pygments.lexers.RubyLexer>

Crear estilo

Se debe crear una clase que hereda la clase Style del módulo pygments.style y se define en este un diccionario con las carácterísticas que se quieren editar como clave.

In [6]:
from pygments.style import Style
import pygments.token as pt

class MyStyle(Style):
    default_style = ""
    styles = {
        pt.Comment: 'italic #727272',
        pt.Keyword: 'bold #191966',
        pt.Name: '#f00',
        pt.Name.Function: '#0f0',
        pt.Name.Class: 'bold #0f0',
        pt.String: '#007F00'
    }

Algunos parámetros para modificar el estilo del código en el documento HTML

  • bold Negrita
  • nobold Sin negrita
  • italic Itálica o cursiva
  • noitalic No itálica o cursiva
  • underline Subrayado
  • nounderline No subrayado
  • bg: Fondo transparente
  • bg:#000000 Fondo color #000000 (negro)
  • border: Borde transparente
  • border:#ffffff Borde color #ffffff (blanco)
  • #ff0000 Color de texto #ff0000 (rojo)
  • noinherit No heredar estilo por defecto

Generar código con el nuevo estilo

In [7]:
# Código a agregar
ejemplo_codigo = '# Se imprime el nombre \nprint "Corre lola, corre"'

# Se agrega la clase MyStyle como el nuevo estilo a HtmlFormatter
formatter = HtmlFormatter(style=MyStyle)

# Se desactiva el uso del CSS por defecto
formatter.noclasses = True

code_html = highlight(ejemplo_codigo, PythonLexer(), formatter)
# Se imprime el nombre 
print "Corre lola, corre"

Exportar un archivo completo de python a HTML

Se crea el archivo de ejemplo sample.py con el siguiente código:

# Se generan datos de ejemplo, un dataframe de 4 columnas y 1000 filas
rnd_1 = [random.randrange(1,20) for x in xrange(1000)]
rnd_2 = [random.randrange(1,20) for x in xrange(1000)]
rnd_3 = [random.randrange(1,20) for x in xrange(1000)]
fecha = pd.date_range('2012-4-10', '2015-1-4')

data = pd.DataFrame({'fecha':fecha, 'rnd_1': rnd_1, 'rnd_2': rnd_2, 'rnd_3': rnd_3})

Desde consola, en el mismo directorio del archivo creado se ejecuta:

pygmentize -f html -O full -o sample.html sample.py

-f html es para crear un archivo html de nombre sample.html a partir del archivo sample.py
-O full crea un archivo html completo (estructura head, body) y estilo (código css). Sin esta opción solo transcribe el texto contenido en sample.py

You Might Also Like

0 comments

Apoyado por: