Resaltado o coloreado de sintaxis desde el backend
Digamos que quieres poner en tu web, no sé, el glorioso himno javero de NanowarOfSteel, HelloWorld.
Así que abres una etiqueta pre, luego una code, lo metes todo dentro, y esto es lo que pasa:
package it.nanowar.ofsteel.helloworld;
public class HelloWorldMainLauncherClass {
public HelloWorldMainLauncherClass( int foo ) {
super();
this.foo = foo;
}
// etc.
}
¿Qué esperabas, magia? ¿Que te lo coloreara el navegador por la cara?
La cruda realidad
Habrá que ver qué hace la gente, ¿no? Porque este problema es tan típico que estará más que resuelto, de forma sencilla y elegante, ¿verdad?, ¿VERDAD?

Pues la cruda realidad es que, como casi todo en esta vida, la inmensa mayoría de la gente lo hace mal.
Porque sí, según un estudio de la universidad de Yolo Valgo, más del 87% de las webs que publican código, hacen el coloreado en el frontend con una librería javascript.
No voy a discutir aquí por qué eso es un horror, salvo que se trate de un código que vaya a cambiar después de que lo envíes al cliente. Lee a este señor, con el que estoy plenamente de acuerdo y lo explica mucho mejor que yo.
Pero bueno, en nuestro stack habrá una forma de hacerlo bien, unas buenas prácticas para no andar reinventando la rueda... esto será lo más normal del mundo, ¿no?
¿Si fuera así, crees que se llamaría esta sección "la cruda realidad"? Pues eso.
Me he hartado de buscar y no hay nada ni medio decente. He intentado adaptar un par de librerías y herramientas, y no me ha convencido el resultado. Añadían una complejidad que no me merecía la pena, y me estaba saliendo de scope sobremanera...
Así que al final he acabado usando un port desactualizado de highlight.js. Que tiene sus limitaciones y al estar desactualizado no se ve exactamente igual que, por ejemplo, en stackoverflow. Pero aquí tenéis el resultado, coloreado desde el backend.
package it.nanowar.ofsteel.helloworld;
public class HelloWorldMainLauncherClass {
public HelloWorldMainLauncherClass( int foo ) {
super();
this.foo = foo;
}
private Integer foo = 0;
public void songRefrain() {
for (int i = 0; i < foo; i++) {
System.out.println("Hello World!");
}
int pippo = 0;
while (pippo < foo) {
System.out.println("Hello World!");
pippo++;
}
}
public static void main (String [] args) {
System.out.println("Hello World Programmer Start");
HelloWorldMainLauncherClass tizio = new HelloWorldMainLauncherClass(2);
tizio.songRefrain();
System.out.println("Program Finished!");
tizio.falseMethod();
}
/*
* If I may introduce a bug, the JVM will manage it for me
* ensuring both security and portability
* Then I'll write my code once, and run it everywhere!
* With Static and Strong Typing, will let my programs be type safe!
*/
public void falseMethod() {
boolean metal=false;
if(metal==false) {
String joeyDeCaio = null;
joeyDeCaio.length();
}
}
}
¿Quieres que me extienda en este truco? Pues revienta este botón a clickazos: