miércoles, 2 de diciembre de 2009

Coloreado de codigo fuente para blog en linux

Luego de escribir mi ultimo post buscando una herramienta que permita el coloreado de código fuente para nuestros blogs, y teniendo en cuenta que recomendé usar Windows Live Writer con el Plugin CodeSnnipet (Todo esto en entorno windows), quede en la tentativa de ofrecerles una solución del mismo tipo pero usando herramientas de linux, además de que en lo personal acostumbro a utilizar linux en el 70 por ciento de las tareas que realizo.

Ok, para nuestra buena suerte existe vim en el cual podemos editar nuestros archivos fuente sin ningun problema y que además de todo ofrece una herramienta que traduce todo el código fuente que estemos editando en código html directamente con la opción ":TOhtml" la cual nos arroja un resultado mas que suficiente para poder trabajar.

Para nuestro ejemplo utilizaremos un código bastante sencillo en php como el que muestro a continuacion:
<?php
function saludar{
echo "Hola a todos!!!";
}
?>

Este código lo estamos editando en vim con el nombre de prueba1.php, cuando ya lo tengamos escrito escribiremos ":TOhtml" en la linea de comandos de vim y nos mostrara el siguiente codigo
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>~/temporal/prueba1.php.html</title>
<meta name="Generator" content="Vim/7.2">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body bgcolor="#ffffff" text="#000000"><font face="monospace">
<font color="#ff40ff">&lt;?php</font><br>
<font color="#ff40ff">function</font>&nbsp;saludar<font color="#ff40ff">(){</font><br>
&nbsp;&nbsp;<font color="#ff40ff">echo</font>&nbsp;&quot;<font color="#ff6060">Hola a todos!!!</font>&quot;;<br>
<font color="#ff40ff">}</font><br>
<font color="#ff40ff">?&gt;</font><br>
</font></body>
</html>

Ahora tienen que retirar algunas lineas osea las 8 o 9 primeras dependiendo es decir retiran las lineas hasta la etiqueta que diga al final:
<span style="font-family:monospace;">
tambien deben retirar esa etiqueta, después van al final del archivo y retiran lo siguiente:
</font></body></html>
Luego de ello deben remover todas las etiquetas "<br>" del código, una forma rápida para ello es si es que todavía están en vim (para hacer esto podrían usar cualquier otro editor gedit por ejemplo), usen la siguiente opción en la linea de comandos de vim ":%s/nt><br>/nt>/g" esta sentencia retirara esas etiquetas por ustedes y listo lo que les queda es en si el código ya formateado y coloreado

Ahora lo siguiente es poner este código en una capa para que pueda contenerlo, la capa la pueden crear ustedes con las etiquetas <div> y asignándole un estilo a la misma pero yo ya les hice el trabajo, tome prestado la capa que genera el CodeSnippet y le hice algunas modificaciones para que puedan usarlo, el código de las capas es el siguiente, casi al final de ese código dejo una marca para que sepan donde pegar el código generado con el vim:
<div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;line-height:12pt;background-color:#ffffff;width:97.5%;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;margin:20px 0 10px;padding:4px;" id="Wrapper"><div style="text-align:left;line-height:12pt;background-color:#ffffff;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0;" id="Snippet"><pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:12pt;overflow:visible;border-style:none;margin:0;padding:0;">AQUI INSERTEN EL CODIGOOOOO!!!!</pre></div></div>
y listo el código resultante lo pegan directamente en su editor de posts.

El código final que obtenemos lo probé tanto en Blogger como en Wordpress y funcionan bastante bien además de que el vim tiene coloreado de código para la mayoría de los lenguajes conocidos.

Como prueba final les dejo este código de un programa simple opengl con c++.
/* 
* File: main.cpp
* Author: yosel
*
* Created on 24 de noviembre de 2009, 10:49 PM
*/

#ifdef WIN32
#include <windows.h>
#endif
#ifdef __APPLE__
#include <OpenGL/gl.h>
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif

#include <unistd.h>
#include "sphere.h"

float * pos;
TSphere * sphere = NULL;

void initgl(){
glEnable(GL_DEPTH_TEST);
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,1.0,1.0,100.0);
// Proyección perspectiva. El ángulo de visualización es de 60 grados, la razón ancho/alto es 1 (son inguales), la distanciamínima es z=1.0, y la distancia máxima es z=100.0
sphere = new TSphere(5,0.1);
glMatrixMode(GL_MODELVIEW);
gluLookAt(3,3,14,0,0,0,0,1,0);
}

void display(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glutWireCube(10);
glPushMatrix();
glColor3f(0.0,0.0,1.0);
pos = sphere->getPosv();
glTranslatef(pos[0],pos[1],pos[2]);
glutSolidSphere(1,10,10);
glPopMatrix();
glFlush();
}

void idle(void){
sphere->test();
usleep(33);
glutPostRedisplay();
}

int main(int argc, char ** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowPosition(20,20);
glutInitWindowSize(500,500);
glutCreateWindow(argv[0]);
initgl();
glutDisplayFunc(display);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}

PD: Olvide comentarles que todo este post lo escribi siguiendo el metodo que estamos comentando

Saludos y hasta la proxima