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.
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; }
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.
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; }
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
Comentarios
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
Para muestra de ambos, un botón ya modificado.
--
In a world without Walls and Fences, ¿who needs Windows or Gates?
--
In a world without Walls and Fences, ¿who needs Windows or Gates?