Código de GitHub a WordPress

Desde hace mucho tiempo he desarrollado distintos scripts para automatizar diversas tareas, lo que me ha fortalecido algunas habilidades como desarrollador. En una de las últimas pruebas que hice compartí la versión final del código en el blog y el resultado (http://sniffer.comparte.tips/geolocalizando-amigos-gracias-a-facebook-messenger/) me parece visualmente difícil de leer. En parte porque no tiene sintaxis resaltada y además porque un código en evolución sería complicado referenciarlo (o actualizarlo) en el blog.

Por este par de razones busqué como darle solución ya que pretendo compartir código fuente, no solo en mi cuenta de GitHub (https://github.com/SnifferNandez/), sino dar alguna explicación relacionada al código a través de este medio.

La solución fue un código que consulta algún código en internet y luego publica el código con la sintaxis para que sea resaltado según el lenguaje de programación. Para que funcione correctamente se debe instalar el plugin https://wordpress.org/plugins/syntaxhighlighter/ que será el encargado de darle el formato visual más adecuado al código, y el código que modifiqué será el encargado de traer desde una URL el código, que será guardado en una caché local de WordPress durante 13 días.

El código a usar en WordPress se compone de tres partes:

1) [CodeFromUrl=”URL donde está el código
2) lang=”Lenguaje de programación, como php, html, js, cshar, u otros”
3) opt=”Opciones permitidas por el plugin, como título o resaltar línea”]

Para ejemplificar, les comparto el código del plugin, para el cual usaré la siguiente línea:

[CodeFromUrl="https://raw.githubusercontent.com/SnifferNandez/GitHub-Code-Viewer-for-WordPress/master/github.php" lang="php" opt="highlight='80' title='GitHub Code viewer for WordPress, bug en la linea 80'"]

Que al ser procesada por el plugin de WordPress, da como resultado lo siguiente:

<?php
/*
Plugin Name: Code From Url
Version: 1.1
Description: Visit https://github.com/SnifferNandez/GitHub-Code-Viewer-for-WordPress for detailed instructions.
Author: Jared Barneck, modified by SnifferNandez
Author URI: http://sniffer.comparte.tips/
*/

class github {
  var $db;
  var $table;
  var $cache = array();

  function github() {
    global $wpdb;

    $this->db = $wpdb;
    $this->table = $this->db->prefix . "CodeAsUrl";
  }

  function install() {
    $result = $this->db->query("CREATE TABLE IF NOT EXISTS `{$this->table}` (
                               `id` int(10) unsigned NOT NULL auto_increment,
                               `url` text NOT NULL,
                               `code` text NOT NULL,
                               `updated` datetime NOT NULL default '0000-00-00 00:00:00',
                               PRIMARY KEY  (`id`)
                               )");
  }

  function uninstall() {
    $result = $this->db->query("DROP TABLE IF EXISTS `{$this->table}`");
  }

  function get_code($text='') {
    $pattern = '/(\[CodeFromUrl="[^"\']*"[ ]*(lang="[^"\']*")?[ ]*(opt="[^"]*")?\])/i';
    if (preg_match_all($pattern, $text, $matches)) {
      $urls = [];
      $i = 0;
      foreach($matches[0] as $match) {
        $urls[$i++] = trim(explode('"',$match)[1]);
      }
      $this->__loadCache($urls);
      $txtrans = array();
      foreach($matches[0] as $match) {
        $url = trim(explode('"',$match)[1]);
        $lang = explode('" lang="',$match);
        array_push($lang,"html");
        $lang = trim(explode('"',$lang[1])[0]);
        $options = explode('" opt="',$match);
        array_push($options,"");
        $options = trim(explode('"',$options[1])[0]);
        if (isset($this->cache[$url])) {
          $code = $this->cache[$url];
        } else {
          $code = wp_remote_fopen($url);
          // Trying to fix like https://github.com/Viper007Bond/syntaxhighlighter/issues/32
          //$code = str_replace('[', '[[', $code);
          //$code = str_replace(']', ']]', $code);
          //$corrections = array ('p' => '((((', ']' => ']]');
          $this->__setCache($url, $code);
        }
        $code = '[co'.'de lang="'.$lang.'" '.$options.']'.$code.'[/co'.'de]';
        $adjust = array($match => $code);
        $txtrans = array_merge($txtrans, $adjust);
      }
      $text = strtr($text,$txtrans);
    }
    return $text;
  }

  function __loadCache($urls) {
    $sql = $this->db->prepare( "SELECT * FROM $this->table WHERE url IN (%s)", implode('", "', $urls)); 
    $results = $this->db->get_results($sql, ARRAY_A);
    if ($results) {
      $old = array();
      foreach($results as $row) {
        if($row['updated'] < date('Y-m-d H:i:s', strtotime('-13 day'))) {
          $old&#91;&#93; = $row&#91;'id'&#93;;
        } else {
          $this->cache[$row['url']] = $row['code'];
        }
      }
      
      if($old) {
        $this->db->delete( $this->table, array( 'id' => implode(',', $old) ) );
      }
    }

    return true;
  }

  function __setCache($url, $code) {
    $this->db->insert( $this->table, array( 'url' => $url, 'code' => $code, 'updated' => date('Y-m-d H:i:s')));
  }
}

$github = new github();
register_activation_hook(__FILE__, array($github, 'install'));
register_deactivation_hook(__FILE__, array($github, 'uninstall'));
add_filter('the_content', array($github, 'get_code'), 7);
?>

El anterior código es muestra de un código resaltado por su sintaxis (de fácil lectura), sin embargo no logré entender dónde se origina la doble codificación que altera el código en la línea 80, en donde en lugar de mostrar [ y ] lo que se observa es &#91; y &#93;

Con este ajuste espero que los próximos scripts que pienso publicar y explicar por acá se puedan visualizar de una forma más cómoda. Además es posible que a alguien más le sirva este pequeño código para usarlo en su blog.

Published by

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *