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.

21 comentarios en este post

Feed de comentarios
  1. Avatar

    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

  2. Avatar

    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…

  3. Avatar

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

  4. Avatar

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

  5. Avatar

    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.

  6. Avatar

    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:


    jk:
    Gracias por las pruebas, voy a mirar por dónde ataco eso…

  7. Avatar

    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.

  8. Avatar

    fernando 24 julio. 2008 - 17:06

    <?php
         echo "Parece que llegamos a un acuerdo, y vamos a cambiar todo de nuevo por pre en vez de code...";
    ?>

Dejar un comentario

Toasty!