Cosas que he aprendido al montar el blog (II) Extraer contenido externo
Buscando plugins sobre github, encontre solamente uno que se supone que embebía
el contenido, pero no te embebía ni repositorios, ni ficheros ni carpetas.
Así que decidí ponerme a ello y así fue como creé el plugin githubin:
https://lrdb.baal.host/plugin-github-en-wordpress-githubin/
Lo que hace a fin de cuentas es:
1-(CURL) Toma el contenido de la url de github que le hemos pasado haciendo uso de curl, y forzándolo a que devuelva el contenido en verisón móvil.
>Ejemplo de curl en el script:
$useragent = "Mozilla/5.0 (Linux; Android 4.4.".rand(1,4)."; C2105 Build/15.3.A.1.14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36"; $url="https://github.com/chromium/chromium"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_USERAGENT, $useragent); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); $content = curl_exec($ch); curl_close($ch);
Ahora en $content tendremos el contenido de la url
2-(PREG_REPLACE) Después extrae el contenido en base al tipo de link, es decir, si el link es del repositorio forzará a que le de la url del listado de ficheros del repositorio, y eliminará el contenido innecesario (las cabeceras y pie de la web). Después también reemplaza links relativos y alguna otra etiqueta.
preg_replace es la función que usaremos para esta misión. Realmente es algo muy útil; permite remplazar texto en base a distintos patrones en una sola línea de código.
Y no es algo único de php; preg_replace usa como argumento la expresión de patrones regex (regular expression) que es usada en muchos lenguajes (java,javascript,c#,php) y en herramientas de linux como grep o sed de búsqueda y reemplazo de texto.
Estos patrones que le pasamos como argumento son lo que tenemos que construir para por ejemplo, que busque «perro» y lo reemplace por «gato»:
echo preg_replace(‘/perro/imu’,’gato’,’el perro ladraba fuerte’);
Que dará como resultado: «el gato ladraba fuerte»
/imu son las opciones del patrón:
i:insensitive (indiferente si es mayúscula o minúscula)
m:multiline(permite buscar en otras línea)
u:unicode(buscamos en formato unicode)
>Lo que nos va a salvar realmente la vida:
Cualquiera de estas dos webs nos sirven. Son para probar las expresiones que estamos construyendo al instante y mostrándonos detalladamente qué hacen y si tienen errores.
Esto nos ahorrará horas de trabajo. De haber conocido esas webs antes, habría aprendido regex mucho antes para usarlo en scripts de linux.
Ejemplos de preg_replace en el script:
if( isset($atts["disable_images"]) && $atts["disable_images"]!='false' ) $content_githubin=preg_replace('/<img [\s\S]*?>/imu','',$content_githubin);
Si hemos deshabilitado las imágenes le pedimos que las elimine con el filtro /<img [\s\S]*?>/imu
Busca todo lo que sea <img………> y lo quita. Para decirle que sea cualquier contenido entre «<img» y «>» vemos que he usado [\s\S]*? Ésto lo que hace es buscar ese contenido hasta encontrar >:
\s: busca espacios en blanco,líneas nuevas o tabulados
\S: busca cualquier caracter visible
Al ponerlos entre corchetes [\s\S] le decimos que busque una u otra. Después le ponemos * para que busque todas las que sean hasta llegar a «>» y por último el «?» es para que se quede con la primera coincidencia de nuestro patrón, no con la última. De lo contrario podría coger el «>» del último «<img» que encontrase.
//convertimos los h1 y h2 y h3 en <b> para controlar el color en temas oscuros y reducir el tamaño: $content_githubin=preg_replace('/<h[1-3]>/imu','<b>',$content_githubin); $content_githubin=preg_replace('/<\/h[1-3]>/imu','</b>',$content_githubin);
/<h[1-3]>/imu busca cualquier <h que siga con 1>,2> o 3> <h1>,<h2> o <h3>
//reemplazamos links del repositorio con la ruta absoluta: $replaceto='href="https://github.com/'.$gitacc.'/'; $content_githubin=preg_replace('/href="\/'.$gitacc.'\//imu',$replaceto,$content_githubin);
Links relativos que antes eran del formato /nombrerepositorio/fichero.c los cambiamos a absolutos http://url/nombrerepositorio/fichero.c