Mi nombre es Fernando Briano y soy programador.

{WP-Syntax Hackeado} Cómo mostrar código fuente en los comentarios[1]

Bueno, ¡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.");
}
ACTUALIZACIÓN: Este post, así como el anterior sirvieron de “Sandbox” para probar el plugin. Ya tuvo varias idas y venidas. Al final, después de tantas vueltas volvimos al tag <pre>.
¿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.

Feed de comentarios | Url para Trackbacks | Suscribirse a los posts por correo electrónico

21 comentarios en este post

  1. Avatar zetta 24 Julio. 2008 - 4:16 am Firefox 3.0.1 GNU/Linux

  2. Avatar zetta 24 Julio. 2008 - 4:17 am Firefox 3.0.1 GNU/Linux

    u_u damn!!

  3. Avatar fbt 24 Julio. 2008 - 4:29 am Konqueror 3.5 Debian GNU/Linux

    zetta!
    ¿Qué tocaste?
    😛


    echo "A mi me anda!";

  4. Avatar Luciano 24 Julio. 2008 - 12:10 pm Firefox 3.0.1 Windows XP

  5. Avatar Juan Funez | One Frag Left! 24 Julio. 2008 - 1:58 pm Firefox 1.5.0.7 Fedora 64 bits

    1,2, probando con codigo pascal:

    Write ("Hola, mundo!");
    Writeln ("¿funciona?");

  6. Avatar Juan Funez | One Frag Left! 24 Julio. 2008 - 2:13 pm Firefox 1.5.0.7 Fedora 64 bits


    cout<< "Anda la Osa!\n";

  7. Avatar Imzyos 24 Julio. 2008 - 2:18 pm Firefox 3.0 Windows XP


    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

  8. Avatar Pablo 24 Julio. 2008 - 2:37 pm Internet Explorer 7.0 Windows XP

    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.

  9. Avatar fernando 24 Julio. 2008 - 3:00 pm Debian IceWeasel 3.0.1 Debian GNU/Linux

    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…

  10. Avatar Luciano 24 Julio. 2008 - 3:30 pm Firefox 3.0.1 Windows XP

    Fernando, en mi post “en blanco” hay codigo adetnro, codigo en php.
    un simple echo
    Obviamente los tagos de

  11. Avatar Luciano 24 Julio. 2008 - 3:30 pm Firefox 3.0.1 Windows XP

    Ahora que veo
    Los tags “”
    Si los pongo sin comillas no aparecen

  12. Avatar Luciano 24 Julio. 2008 - 3:31 pm Firefox 3.0.1 Windows XP

    con comilla o sin comillas es lo mismo 😛
    De ninguna forma aparecen

  13. Avatar jk 24 Julio. 2008 - 3:39 pm Firefox 3.0 Linux Mint

    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);
    }

  14. Avatar jk 24 Julio. 2008 - 3:40 pm Firefox 3.0 Linux Mint

    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);
    }

  15. Avatar jk 24 Julio. 2008 - 3:47 pm Firefox 3.0 Linux Mint

    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.

  16. Avatar fernando 24 Julio. 2008 - 4:03 pm Debian IceWeasel 3.0.1 Debian GNU/Linux

    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…

  17. Avatar fernando 24 Julio. 2008 - 4:17 pm Debian IceWeasel 3.0.1 Debian GNU/Linux

    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.

  18. Avatar fernando 24 Julio. 2008 - 5:06 pm Debian IceWeasel 3.0.1 Debian GNU/Linux
    <?php
         echo "Parece que llegamos a un acuerdo, y vamos a cambiar todo de nuevo por pre en vez de code...";
    ?>
  19. Avatar fernando 24 Julio. 2008 - 5:37 pm Debian IceWeasel 3.0.1 Debian GNU/Linux

    Dedicado a jk:

    &puntero;
    estructura->nodo;
  20. Avatar zetta 24 Julio. 2008 - 8:04 pm Firefox 3.0.1 GNU/Linux
     
  21. Avatar zetta 24 Julio. 2008 - 8:05 pm Firefox 3.0.1 GNU/Linux

    Tu plugin no me quiere!!!
    =(

     

    Dejar un comentario

    Toasty!