Listados de código en CRySoL

Esta receta explica cómo formatear adecuadamente listados de código y consola para la creación de recetas de CRySoL, aprovechando al máximo las posibilidades del módulo drupal para GeSHi.

Formato HTML

Esta sección te interesa si utilizas cualquier variante de HTML para escribir tus posts, ya sea "filtered" o "full", etc.

El sistema más sencillo (pero menos potente) es utilizar pre. Tiene importantes desventajas:no tiene coloreado y tendrás que cambiar a mano todos los caracteres '<', '&', etc que aparezcan en el código por sus equivalentes HTML y eso es un verdadero latazo. Per a pesar de eso puede ser útil para mostrar el contenido de un fichero de texto sencillito, por ejemplo un @/etc/network/interfaces@

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp

Sin embargo, GeSHi los interpreta correctamente de modo que no tienes que tocar nada del código que deseas mostrar, y además añade coloreado de sintaxis y números de línea en el margen. Para usar GeSHi, debes utilizar las marcas [code] y [/code] para los listados de código. La marca [code] permite añadir un atributo para indicar el lenguaje, como puedes ver en este ejemplo:

[code type=cpp]
#include <iostream>

using namespace std;

int main() {
    cout << "Hello World!" << endl;
    return 0;
}
[/code]

que se mostrará así:

#include <iostream>
 
using namespace std;
 
int main() {
    cout << "Hello World!" << endl;
    return 0;
}

Formato Textile

Esta sección te interesa si utilizas Textile para formatear tus posts en CRySoL.

En este caso debes tener una precaución adicional. Textile no procesa bien los elementos <pre> de HTML con PHP5. Debería dejarlos tal cual, pero en lugar de eso, procesa el marcado Textile. Eso también ocurre con el elemento [code], aunque es este caso no es un bug; simplemente textile no entiende que eso es un bloque para GeSHi y también lo transforma como si fuera Textile. La solución para ambos problemas es utilizar la marca <notextile>, como en el siguiente ejemplo:

<notextile>
[code type=cpp]
#include <iostream>

using namespace std;

int main() {
    cout << "Hello World!" << endl;
    return 0;
}
[/code]
</notextile>

Lógicamente el resultado debe ser el mismo.

Números de línea

Si quieres números de línea (muy útiles para explicar el código) simplemente añade el atributo linenumbers. En el ejemplo, fancy se utiliza para marcar el número de línea cada 5 líneas.

[code type=cpp linenumbers=fancy fancy=5]

y consigues:

#include <iostream>
 
using namespace std;
 
int main() {
    cout << "Hello World!" << endl;
    return 0;
}

Consola

Si es para mostrar un comando que ocupa una sola línea puedes usar <kbd>:

<kbd> uname -o </kbd>

que aparece tal que:

$ uname -o

Si necesitas mostrar texto de la consola manteniendo el espaciado, utiliza un bloque code de tipo "console":

[code type=console]
$ ip addr
1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 576 qdisc pfifo_fast qlen 1000
    link/ether 01:0f:ef:26:d0:ed brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 255.255.255.255 scope global eth0
[/code]

que queda así:

$ ip addr
1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 576 qdisc pfifo_fast qlen 1000
    link/ether 01:0f:ef:26:d0:ed brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 255.255.255.255 scope global eth0

Referencias

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de magmax

He encontrado dos

He encontrado dos problemillas:

El primero es que no resalta sintaxis GNU/Emacs (Lisp, vamos). No sé si es porque no está instalado el módulo, pero con la cantidad de cosas que hay para Emacs lo veo necesario.

El segundo es que, aunque geshi es lo bastante inteligente como para interpretar correctamente los símbolos HTML, resulta que drupal sigue cambiando las caritas Sad

Para muestra de ambos, un botón ya modificado.

--
In a world without Walls and Fences, ¿who needs Windows or Gates?

Miguel Ángel García
http://magmax.org

Imagen de magmax

Me corrijo...

Sí que los marca. Basta con usar "lisp".

Miguel Ángel García
http://magmax.org