{WP-Syntax Hackeado} Cómo mostrar código fuente en los comentarios[1]
Publicado el 24 de julio de 2008Bueno, ¡ahora sí! Después de unos cuantos comentarios y horas de workarounds, pude hacer funcionar el plugin WP-Syntax para los comentarios. Ante todo muchas gracias a todos los que comentaron en el post anterior, renombrado y actualizado: Como mostrar código fuente en los comentarios[0]
void main(){ printf("Gracias por la paciencia que tuvieron, y las pruebas varias que hicieron. Si no fuera por los que intentaron dejar código en los comentarios, nunca me hubiera dado cuenta que andaba mal. Los invito a volver a comentar con código en este post."); } |
¿Porqué? Simple, primero porque el escape de caracteres es mejor. jk me hizo notar en esta entrada que con <code> WordPress transformaba “&” y “->” en “& amp;” y “& gt;” respectivamente. La otra razón, por la cual se había elegido pre desde un principio, es que si se desactiva el plugin, el código mantiene la indentación (aunque no los colores).
Se perdió prácticamente todo el formato de los comentarios, voy a ver si lo arreglo. Espero que no se me enojen por todos los comentarios que dejaron :P.Aparentemente está cerca la versión 0.9 de WP-Syntax, ya tendré más información.
Dejo el post como historial de lo que había hecho…
Ahora paso a contar más o menos las cosas que fui haciendo, probando, y aprendiendo, hasta que logré una solución “linda” y prolija.
El problema: Solamente el usuario admin del blog tenía permitido usar los tags <pre> en los comentarios. ¿Qué hacer al respecto? Mmmh… En verdad no sé en qué orden fui haciendo las cosas, pero hice de todo.
Como estoy desarrollando mi propio plugin para WordPress (muy lentamente y sin stress en algún rato libre), ya tenía una idea del tema de los “hooks” con filtros y acciones. Resumidamente, esto son acciones y funciones de WordPress que podemos reemplazar con las nuestras dentro de un plugin. De esta forma, cambiamos algo del comportamiento de WordPress sin cambiar el “núcleo”, cosa que el cambio se mantenga en una actualización del CMS (y mantener la modularidad).
Así que se me ocurrió que una idea bastante obvia era sobreescribir la función que filtrara los pre de los comentarios, para que permitiera usarlos. Buscando por ahí, me encontré con el archivo kses.php dentro del directorio wp-includes. Este archivo es uno de los responsables de permitir o no ciertos tags y demás, aparte de devolver el valor de la función “allowed_tags();” que comenté acá:
Ups!
Mis disculpas, creo que ya se de donde viene el problema. Si se fijan a la derecha de la caja de texto donde se escriben los comentarios, muestra las tags permitidas para comentar. Esto no está escrito a mano, sino que llama a una función en PHP allowed_tags().Lo que tengo que hacer, es buscar la forma de permitirles a los usuarios usar el tag pre…
¡Perdón por el amague!
¡Ya me pongo a solucionar eso!
Lo que no encaré en el momento, fue que ahí estaba el array con todos los tags permitidos, tanto para postear como para comentar. Esto fue lo que me dí cuenta bien al final, pero cuando ya había probado todo lo que se les ocurra. No documento absolutamente todo acá por varias razones. Primero porque no me acuerdo todo lo que hice, segundo porque quedaría muy largo, y tercero, porque mas vale poner lo que aprendí nomás 😛
Siguiendo con el tema, estuve por #wordpress en irc.freenode.net, donde me recomendaron que hackeara el plugin para usar el tag <code> en vez de <pre>, ya que es más indicado para código. Ahora, el tag pre tiene la característica que mantiene los espacios, por lo que respeta la indentación. Para aplicar esto a <code> también, simplemente tuve que agregar el siguiente código al css del plugin:
code {white-space: nowrap;}
Eso y un poco de mano en el plugin, y ya tenía el tag pre reemplazado por el tag code. Agradezco mucho la ayuda de StoneCypher, quien me tiró pistas y recomendaciones para llegar al resultado final.
Sin embargo, seguía igual. Si bien el archivo kses.php permite que los usuarios posteen con <code>, no contemplaba <code lang=””>. Para eso, tuve que agregar lang al array que define los tags y sub tags permitidos en dicho archivo (ver el código). Pero esto no era una solución “linda”, debía incluirlo en el código del plugin. Además, fue una de las últimas cosas en las que me dí cuenta. Al final quedó con el tag <pre>…
Aprovecho para comentar, hablando de soluciones “lindas”, que en algún momento comenté de dicho archivo la línea que filtraba el contenido de los comentarios, y si bien anduvo, dejaba totalmente vulnerable al blog. Esto es un buen ejemplo de LO QUE NO HAY QUE HACER. Sobre todo cuando no conocemos bien las repercusiones…
Bueno, leyendo bien ese bendito kses.php, se me prendió la lamparita al leer: Can be override by using CUSTOM_TAGS constant. Listo, ahí picó la solución, agregar code y lang a ese valor desde el plugin. ¡Así terminó andando!
Ya entré en contacto con Ryan McGeary, el desarrollador de WP-Syntax, y hablando de todo este tema me comentó lo siguiente:
WordPress tiene muchas restricciones innecesarias e inevitables en su publicación de contenidos. WP intenta hacer lo “correcto” y prevenir a los que comentan de agregar formatos especiales y es complicado el workaround.
Además, tenía pensado actualizar un poco el plugin cuando tuviera tiempo. Ya le envié un mail con los cambios que le hice. El plugin está publicado bajo GPL, pero quiero saber si quiere incluir los cambios en su plugin, o si hago un fork para publicarlos. Así que en unos días estará disponible o bien una nueva version de WP-Syntax, o un nuevo fork :D, obviamente el código disponible también.
Me está pasando lo mismo con WordPress que me pasó en algún momento con GNU/Linux. Por momentos me frustro porque no puedo lograr lo que quiero que haga, pero al final me doy cuenta que la culpa no es de WordPress, sino mía por no conocer la API lo suficiente… ¡WordPress FTW! No es lo mismo una vez que se empieza a meter mano en el código.
zetta 24 julio. 2008 - 04:16
zetta 24 julio. 2008 - 04:17
u_u damn!!
fbt 24 julio. 2008 - 04:29
zetta!
¿Qué tocaste?
😛
echo "A mi me anda!";
Luciano 24 julio. 2008 - 12:10
Juan Funez | One Frag Left! 24 julio. 2008 - 13:58
1,2, probando con codigo pascal:
Write ("Hola, mundo!");
Writeln ("¿funciona?");
Juan Funez | One Frag Left! 24 julio. 2008 - 14:13
cout<< "Anda la Osa!\n";
Imzyos 24 julio. 2008 - 14:18
echo 'que bien ','yo espero ', 'tu plugin';
Como idea, sería interesante que se mostrara el resaltado en la vista previa del comentario, pero creo que va a ser complicado, excelente trabajo fernando
Pablo 24 julio. 2008 - 14:37
Yo uso el plugin y antes del tag pre uso el code, así especifico, pero me gustó la idea del hack para usar directamente code.
fernando 24 julio. 2008 - 15:00
Mmmmmmmmmh… Aparentemente hay gente que está escribiendo los tags, ¿pero no escribe código adentro? Confirmenme si es así, o hay algún error. Cuando fui a editar sus comentarios, tenían los tags, pero nada de código adentro.
Bueno, un hack a la vez dicen. Veremos cómo hacemos con la vista previa…
Al desarrollador original le gustó mi código, así que va a estar en la siguiente versión de WP-Syntax 😀
Ya comentaré novedades…
Luciano 24 julio. 2008 - 15:30
Fernando, en mi post “en blanco” hay codigo adetnro, codigo en php.
un simple echo
Obviamente los tagos de
Luciano 24 julio. 2008 - 15:30
Ahora que veo
Los tags “”
Si los pongo sin comillas no aparecen
Luciano 24 julio. 2008 - 15:31
con comilla o sin comillas es lo mismo 😛
De ninguna forma aparecen
jk 24 julio. 2008 - 15:39
Test:
void
player_play(void)
{
gchar *uri = NULL;
GString *prefix = g_string_new(“file://”);
gtk_tree_model_get(GTK_TREE_MODEL(playlist_store), &playlist_iter, 0, &uri, -1);
prefix = g_string_append(prefix, uri);
uri = prefix->str;
if(uri != NULL)
{
printf(“Play %s\n”, uri);
loop = g_main_loop_new(NULL, FALSE);
pipeline = gst_element_factory_make(“playbin”, “player”);
g_object_set(G_OBJECT(pipeline), “uri”, uri, NULL);
GstBus *bus;
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
gst_bus_add_watch(bus, bus_call, NULL);
gst_object_unref(bus);
gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING);
g_main_loop_run(loop);
}
g_string_free(prefix, TRUE);
}
jk 24 julio. 2008 - 15:40
Test #2:
void
player_play(void)
{
gchar *uri = NULL;
GString *prefix = g_string_new("file://");
gtk_tree_model_get(GTK_TREE_MODEL(playlist_store), &playlist_iter, 0, &uri, -1);
prefix = g_string_append(prefix, uri);
uri = prefix->str;
if(uri != NULL)
{
printf("Play %s\n", uri);
loop = g_main_loop_new(NULL, FALSE);
pipeline = gst_element_factory_make("playbin", "player");
g_object_set(G_OBJECT(pipeline), "uri", uri, NULL);
GstBus *bus;
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
gst_bus_add_watch(bus, bus_call, NULL);
gst_object_unref(bus);
gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING);
g_main_loop_run(loop);
}
g_string_free(prefix, TRUE);
}
jk 24 julio. 2008 - 15:47
En Test #2, en la lineas que preceden al IF se puede ver que el plugin no tradujo correctamente los simbolos de los punteros el “&” y el “->”, se muestran como “& amp;” y “& gt;” Te lo dejo como tarea. 😉
Excelente hack.
fernando 24 julio. 2008 - 16:03
Luciano:
No deberían aparecer. Ignora el preview del comentario más abajo, porque no muestra el coloreado de sintaxis.
Tenés que escribir directamente los tags de código, sin comillas, y adentro escribir el código:
php echo "Esto es php"; ?>
jk:
Gracias por las pruebas, voy a mirar por dónde ataco eso…
fernando 24 julio. 2008 - 16:17
ATENTOS: El plugin sigue sujeto a modificaciones todavía, así que todos estos comentarios pueden o no quedar con el formato indicado en el futuro…
Digamos que este post sirve como “sandbox” para seguir experimentando.
Son libres de seguir posteando código y encontrando errores.
Cuando se decida cómo va a quedar al final el plugin, y lleguemos a una versión “final”, se publicará el código.
fernando 24 julio. 2008 - 17:06
fernando 24 julio. 2008 - 17:37
Dedicado a jk:
zetta 24 julio. 2008 - 20:04
zetta 24 julio. 2008 - 20:05
Tu plugin no me quiere!!!
=(