Jugando con python: CSSmin

Me gusta jugar.

Un día, se me ocurrió retomar mis juegos con python que había dejado por jugar con otras cosas. Pensé en hacer un editor de código pero era demasiado ambicioso para mi xD

Así que hice un script para minimizar css y aprender en el camino algo de python.

¿Qué no hay cosos hechos para minimizar CSS?
Sí, pero no hay nada como hacer algo tu mismo ñ_ñ.

Bueno, una noche saque a komodo Edit de su arena de juegos y “metimos las manos en la obra” :P .

El script debería no sólo minimizar CSS quitando saltos de línea y espacios sobrantes. Sino que debería incluir CSS que sean importados con la propiedad “@import”.

De esa forma puedo tener un archivo principal que importe todas las demás hojas de estilo y luego, al terminar, minimizar todo usando algo así como:

cssmin media/css/main.css

Y de un plumazo hacer un “merge” de todos los estilos.

Este script está pensado para ser usado en línea de comandos. Como trabajo en windows, era necesario un archivo “.bat” para poder usarlo en cualquier parte del árbol de carpetas.

cssmin.bat

@echo off
python d:\jos\bin\cssmin.py %*

En este caso mis scripts los pongo en una carpeta llamada bin, dentro de mi carpeta personal en la unidad d.

Para poder llamar a cssmin.bat en cualquier parte del árbol del sistema de windows, es necesario agregar la ruta completa donde está cssmin.bat a la variable “path” del sistema.

Agregando ruta de cssmin.bat a la variable path de windows

Para hacer esto hay que seguir los siguientes pasos.

  1. Click botón derecho sobre “MI PC” y elegir propiedades. Esto lanzara una ventana.
  2. En la ventana que fue lanzada, elegir la pestaña “Opciones Avanzadas” y luego pulsar el botón “variables de entorno”. Saltará una nueva ventana.
  3. En la ventana de titulo “variables de entorno” buscar en el listado “variables del sistema” la variable “path” y pulsar el botón “modificar”. Nos saltará otra ventana
  4. En la ventana para modificar la variable “path” en el campo “valor de variable”, copiaremos la ruta hasta la carpeta donde esta el cssmin.bat. No olvidando agregar un punto y coma “;” al final de nuestra ruta. Ya que cada ruta es separada por un “;”
  5. Luego es aceptar, aplicar, aceptar… etc, etc, etc.

Con esto deberíamos poder usar el cssmin.bat desde la consola.

CSSmin

CSSmin solo puede importar estilos que este declarados así: “@import url(css/blog.css)” <- sin comillas.
Otra cosa, los archivos css deben estar en UTF-8 y con salto de línea UNIX ... xD es que no he probado con otro tipos de archivos y así es como trabajo yo :P

Acá el código.

#!/usr/bin/env python
import sys
import re

info = “”"/** cssmin 0.1b por Jose Ayon **/”"”

def getname(path):
  “”"
  Devuelve una lista con el path y el nombre del archivo.
  “”"
  try:
    fname = fpath = path

    # obtenemos el nombre del archivo
    c = re.compile(‘/’)

    if(c.search(fname) != None):
      n = c.split(fname)
    else:
      n = fname.split(‘\\’)

    n.reverse()
    n = n[0]

    # optenemos el path hacia el archivo
    cpl = re.compile(n)
    p = cpl.sub(”,fpath)

    return [p,n]
  except:
    print ‘error getname’

def read(path):
  “”"Lee un archivo y retorna el contenido”"”
  try:
    f = open(path,’r')
    r = f.read()
    f.close()
    return r
  except:
    print ‘error read’

def clean(string):
  “”"
  Limpia de comentarios saltos de linea y espacios sobrantes en la cadena.
  Borra tambien los import css. Retorna la cadena “limpia” :)
  “”"
  #try:
  # quitando elementos sobrantes
  comment = ‘\/\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/’ # /* comentarios */
  imports = ‘@import url\(.+\);’ # imports css

  # compile search, al compilar el patron de busqueda se aumenta el rendimiento
  cls = re.compile(‘\n|\t|’+comment+’|'+imports) # saltos de linea, tabs, comentarios e imports
  keys = re.compile(‘{\s+’) # espacios luego de las llaves de apertura llaves
  comas = re.compile(‘;\s+’) # espacios luego de las comas

  lineas = cls.sub(”,string)
  lineas = keys.sub(‘{‘,lineas)
  lineas = comas.sub(‘;’,lineas)

  return lineas
  #except:
  #print “error clean”

def cssmin(path):
  “”"
  cssmin(path) -> void:
  argumento path, string, path al archivo css a minimizar

  Crea una copia del original siguiendo la siguiente estructura
  “src.file.css”.

  No se crea copia de los archivos css importados en el archivo css actual.

  Lee el contenido buscando imports css.
  Luego incluye el contenido de estos archivos al archivo css actual y escribe comentarios de los
  imports css para poder reconstruir el con sus imports sin necesidad de editar el archivo
  original
  “”"
  #try:
  # obtenemos el nombre y el path del archivo
  fopt = getname(path)
  fpath = fopt[0] # path
  fname = fopt[1] # nombre

  # abrimos archivo actual y extraemos su contenidos
  f = open(path,’U')
  completo = f.read()
  f.close()

  # obteniendo todos los paths css incluidos en el archivo actual
  paths = re.findall(‘@import url\((.+)\);’,completo)

  # creamos archivo minimizado
  w = open(fpath + ‘min.’ + fname,’w')
  w.writelines(info+’\n’) # info de cssmin

  # volcando el contenido de cada archivo importado y del archivo actual
  for i in paths:
    w.writelines(“/*** @import url(‘”+ i +”‘); ***/\n”) # escribiendo referencia
    w.writelines(clean(read(fpath +i))+’\n’) # volcando datos

  # volcando archivo actual
  w.writelines(“/*** “+ fname +” ***/\n”)
  w.writelines(clean(completo))
  w.close()
  #except:
  #print ‘error cssmin’

def main(argv):
  argv.pop(0)
  if(len(argv)>1):
    for i in argv:
      print i
      cssmin(i)
  else:
    cssmin(argv[0])

if(len(sys.argv) > 1):
  main(sys.argv)
else:
  print ‘Debes indicar el nombre del archivo’

Este script es superArchiMulti_mejorable, pero funciona hasta ahora y le haré mejoras. Ahora quiero que no solo minimice CSS sino que también lo haga con javascript. Que pueda hacer "merge" de dos o más hojas de estilo sin depender de los "@import". Que pueda buscar más formas de escribir "@import" en css y que no dependa de la codificación o el salto de línea :P .

En la actualidad hay sin fin de herramientas que hacen este tipo de cosas pero como ya dije, no hay nada como jugar un rato y hacer algo tu mismo.

Por cierto, para que esto funcione (si alguien se anima a usarlo) deben tener python 2.5 o superior instalado en windows. aunque creo que no estoy seguro si funciona en python 3 :P

Saludos.

Lo que me gusta de ti: Sublime Text

Sublime Text
sublime_1

Es un editor hecho en python con soporte para muchos lenguajes de programación. Tiene inserción de código, snippets a lo textmate. Tiene multiselección y multiedición, por llamar de alguna manera la capacidad de elegir múltiples partes del documento y editarlos al mismo tiempo.

¿Qué me gusta de Sublime Text? Pues me gusta su buen rendimiento a la hora de combinar multiselección, snippets y multiedición. Su rendimiento en estas áreas es superior, según yo, a intype y a E-text Editor.

Sublime text incorpora además un mapa del código.

Sublime multiselección

Es muy útil para poder recorrer todo el documento arrastrando un cuadro sobre el mapa que representa el espacio visual que tenemos sobre nuestro “gigante” documento. Muy útil.

También me gusta lo fácil de cambiar de layout o presentación de documentos en el editor.

mapa de codigo

Sublime text es un buen editor, es de pago, y tiene buenas “cosas”. No he llegado a usarlo por completo y me gustaría ver su evolución. Ciertamente es una buena alternativa.

Las demás características están en la home de este editor.

Saludos!

Lo que me gusta de ti: Notepad++

No se ustedes pero yo sueño a veces con un editor perfecto. Con todo lo que necesito para trabajar a gusto. Sin embargo eso está lejos de ser real, así que en mi gran manía de coleccionar editores de texto he terminado con media docena, sino es más o menos, de editores que uso constantemente a la hora de trabajar.

Por eso he de declarar a mis amigos editores de texto lo que me gusta de ellos y de porque los necesito ( si ya se, es extraño U_U )

Iniciemos con el primer editor que usé.

Notepad++

Notepad++

Editor de texto plano con coloreado de una buena cantidad de lenguajes de programación (muchas que ni había oído mencionar) y con un fuerte arsenal de plugins que extienden su funcionamiento. Ahora está en la versión 5.4.5, corre bajo Windows y es gratuito.

Es ligero, no consume muchos recursos y se comporta bien con gran cantidad de código (hasta donde lo he usado :P ).

Notepad++ ofrece una de las mejores formas de plegar bloques de código que he visto hasta ahora en un editor. Puede hacerlo hasta 8 niveles usando combinaciones de las teclas Alt + número de nivel para plegar y Alt + Shift + número de nivel para desplegar. Siendo esto muy cómodo cuando se tiene un archivo con muchas funciones o niveles de indentación.

folding

Me agrada también lo simple que es cambiar de codificación y el tipo de salto de línea de un archivo.

cambiar codificacion en notepad++

Las vistas múltiples de un mismo archivo son útiles cuando tienes que trabajar en partes distantes de un mismo archivo.

vistas multiples

Aunque también puedo usar Ctrl + F2 para crear marcas en líneas determinadas para luego saltar entre marca y marca ñ_ñ usando sólo F2 para avanzar o Shift + F2 para retroceder en las marcas.

La sincronización de las vistas múltiples, sea en vertical o en horizontal son útiles cuando comparas la vieja versión de un archivo con la más actual o tratas de resolver algún conflicto con el SVN :P

vistas multiples sincornizadas

Y por último, me gusta lo “sencillo” que puede ser integrar notepad++ con algún script u aplicación usando el menú ejecutar, teniendo la opción de asignar un atajo desde el teclado o usando un plugin para jugar con la consola integrada con notepad++.

Ejecutar desde notepad++

Yo lo tengo integrado con jslint y así tengo otra forma de validar el javascript :P

jslint integrado con notepad++

En resumen, uso notepad++ cuando quiero tener orden en un mar de código incontrolable y sin tener que gastar muchos recursos en el proceso.

Lo que extraño en notepad++ es la falta de inserción de fragmentos de código a lo textmate, intype, e-texteditor o sublime text, hasta netbeans lo tiene. U_U Antes existía un plugin para notepad++ llamado quicktext que hacia eso pero debido a cambios en notepad++ el plugin es incompatible con versiones actuales, hasta donde se.

Recomiendo altamente notepad++ es un gran editor para windows.

Espero poder hablar sobre los muy útiles editores con inserción de fragmentos de código, que son una delicia xD

Saludos.

Jazmín otra vez

Ya van casi dos años desde que Jazmín llego a casa. Casi dos años de aprender, crecer y jugar, me divertí mucho, y Jazmín también creció.

Jazmin en el parque y su auto

¿Qué sabe ahora Jazmín?

Jaz ahora sabe muchas cosas. Aprendió que existen formas simples de comunicación usando el menor esfuerzo. U_U Ella prefiere señalar y decir "HUMMM" para obtener cosas. Sabe pedir para ir al baño (con señas). Sabe pedir "agüita" (con señas aunque también sabe decirlo). Sabe decir "Paaa!! Sal de la compu y déjame ver mi televisión o te saco a tirones!!!" (Con señas).

Consejo para padres primerizos. Los bebés no hablaran a menos que lo crean necesario. Si les damos las "cosas" por el llanto o por los gestos o señas ellos entenderán que la forma correcta de comunicarse es con llanto, gestos o señas. Esto en teoría es fácil, pero en la práctica tendremos que luchar con el corazón de "padre" que se encoje con la carita de nuestro bebé pidiendo el teclado de tu computadora para practicar golpes de karate en el.

Jazmín y la típica cara rompe corazones U_U

Luz y yo estamos trabajando con Jaz para que deje de usar señas y empiece a hablar para comunicarse.

Jazmín caminó antes de cumplir su primer añito. Tengo la fiesta en video en mi compu. Son 2 horas y no sé como cortar secciones de video para mostrarla xD. Pero en su lugar tengo un video de ella jugando en el parque del pueblo donde vivimos ñ_ñ y adjunte la canción favorita de Jazmín "Rompe la piñata".

Esta canción, "Rompe la piñata", tiene un poder sobre Jazmín que es sorprendente. Ella tiene el sueño pesado, pero si escucha las primeras notas de esta canción, ella salta de su sueño, se levanta, baila hasta donde puede, se cae y se duerme. Justo cuando edite este vídeo ella se levanto y me miro con cara de sueño mientras movía la cabeza siguiendo el ritmo de la cancioncita. He de agregar que estoy cansado de esta canción.

Jaz tiene un gran sentido del humor. Sé que los niños ríen, ríen y ríen, más que los adultos, bueno la mayoría de niños. Pero Jaz después de aprender a decir papá y mamá aprendió a hacer bromas. Invierte a propósito nuestros nombres, sobretodo conmigo, y me llama mamá, acto seguido se carcajea junto con su mamá (osea Luz). Parece que le causa gracia mis intentos de explicarle porque no es bueno llamar a papá mamá y los daños a la hombría de alguien que ha visto Tengen Toppa Gurren-Lagann. U_U

Bueno, eso es todo lo que puedo reportar hoy. Tengo sueño y frío. Luego volveré con más diversión. ñ_ñ

Saludos y gracias a todos los que están pendientes de Jaz de Luz y de mi, Joz.

Somos felices

Ubuntu: Descargar paquetes y dependencias desde windows con wapt-get

Buscando como instalar cosas en mi pc con ubuntu 9.04 sin interné encontré wapt-get, un proyecto que te permite buscar y descargar paquetes de ubuntu y sus dependencias desde windows, para luego instalarlos en la pc con ubuntu sin conexión.

wapt-get usa un source.list, que es un archivo de texto plano con una lista de servidores de donde poder descargar los paquetes. Fácil podemos copiar el source.list de nuestro ubuntu y reemplazarlo por el del wapt-get, teniendo cuidado de comentar las lineas que inicien con “deb-src” que producen un error en wapt-get.

Ahora he descargado un programa y sus dependencias y solo me queda ver si puedo instalar el programa en mi ubuntu.

Saludos.

PD: Pronto noticias sobre Jaz, y a volver a dar uso de este blog :P

800 Brushes/pinceles para Photoshop

Joz y Photoshop

A pesar de ser una esfera azul de un mundo de colores mis encuentros con Photoshop son muy pocos, casi nulos, U_U aún hoy para hacer cualquier gráfica prefiero mil veces Flash a Photoshop.

Pero en estas últimas semanas, he usado photoshop casi todos los días y gracias a la ayuda de una buena amiga y a los consejos de mi amigo Pley encontré una colección de brushes para photoshop. Una colección de más de 800 brushes!!! @_@

Solo descargue las que necesitaba. Pero seamos realistas, mientras más, mejor. Verdad Pley? xD

Jazmín, Un año y un poco más después.

El tiempo pasa volando, la indefensa bebé que sostuve con mucha torpeza en mis brazos ahora ya no es tan indefensa. La niñita que parecía quebrarse con cualquier movimiento brusco al cambiarle la ropita, ha intentado quebrar algunas cosas con gran insistencia, sobre todo el monitor y el teclado de la computadora. Sin duda, el tiempo pasa rápido y hay que disfrutar de Jazmín lo más que se pueda. xD

|Read the Rest of the Entry…

Jazmín, cinco meses después.

Ya han pasado cinco meses desde aquella noche en la que Luz y yo pasamos (ella más que yo) la noche más difícil de nuestras vidas, hasta ahora.

FELICES CINCO MESES JAZ!!

Hace cinco meses nació Jazmín ( y no se dice Yazmín, sino Jazmín ¬¬ ).

Ella a aprendido muchas cosas, arañar, escupir sacar la lengua, no llorar con la boca muy abierta y con babita en ella porque puede ser peligroso, que los adultos hablan muy chistoso cuando la ven, que su sonrisa no se regala así nada más, tiene un precio.

Aprendió que el usar una espada le hace más c00l.

Le divierten las espadas

Jaz no suele reír ante la cámara, pero cuando se sintió con poder al sostener su xklibur su rostro se ilumino, eso y el que Luz me estuviera hincando con la espada le hizo reír. ¬¬


|Read the Rest of the Entry…

meme: Una mirada a tu escritorio.

El buen Daniel, me paso este meme que consiste en explicar como hiciste para personalizar el escritorio del lugar donde paso casi el 30% de mi vida. El computador.

Escritorio

En mi escritorio tengo todo lo común:

Antes usaba Virtual Dimensión un administrador de escritorios que daba a windows la capacidad de tener 4 escritorios, como en linux ñ_ñ. U_U pero eso ya paso.

Me gusta tener el escritorio lo más libre de iconos y archivos, el menú inicio de windows lo tengo oculto y rara vez lo necesito, y como dice Yari.

¿Porqué no habría de tomarme un tiempo para colocar nuevos iconos, modificar su posición e instalar algunos programas para darle más “eye-candy”? La respuesta es muy sencilla: no veo mi escritorio.

Y en general trato de configurar el escritorio y el theme del windows para que den el mayor descanso a mis ojos. Eso, busco comodidad… ñ_ñ

Y ese fue mi escritorio.. que tuve que limpiar, arreglar y poner presentable, como dicen en mi tierra, “para el ojo del compadre”.

Un saludo y doy por pagados mis pecados.. digo memes… ¿verdad?

El pistolero y yo

Y si te apunta con su revolver ¿Que harías?

Era una noche común sin nada sobresaliente. Camine como siempre desde mi trabajo hasta el paradero del bus, como unos 15 minutos a pie. Esperé la linea de siempre, El Orión, que como siempre a esas horas estaba rebosando de gente. :S

Me colgué del bus y trepe quedando muy incomodo entre la puerta trasera del bus y la gente.

En el forcejeo, porque más gente seguía subiendo al bus @_@. Veo que un tipo que estaba a mi lado tenía mucho campo reservado para el solo. Estaba ocupando las dos filas del pasadizo del bus impidiendo que alguien pase, para el fondo.

Estaba tan apretado entre unas señoritas y el tipo este, que no tenía donde moverme, me empujaban y como consecuencia yo empujaba al tipo. Con todas mis fuerzas trataba de aferrarme de la baranda del bus pero el chofer (conductor) estaba jugando con el bus, así que aceleraba y frenaba precipitadamente, empeorando la comodidad xD ausente.

El tipo me empujo con su mano, completamente ofuscado, grito, “no me empujes!!!!”. Yo le mire, y vi todo el espacio que tenía para moverse, y pensé…

“El bus esta lleno. Este individuo tiene reservado para si un lugar donde cuatro personas podrían estar comodamente para él solo, no se quiere mover, yo estoy luchando por mi vida, y le molesta que le empuje cuando el maldito bus esta haciendo piques en plena Av. La Marina!!!!”

Me contuve, y le dije con una sonrisa, “No le estoy empujando señor”.

Luego empece a maquinar, “si me dice algo más, le diré esto, esto y esto otro” planeaba como dejarlo en ridículo, levantar pueblo en el bus, y mover a las personas contra el… atacarlo y desahogar la frustración de toda mi vida sobre aquel tipo… cuando un pensamiento cruzo mi mente.

“Y si saca su revolver y te apunta a la cabeza, ¿Que harías?”

Respondí a este pensamiento, “Nada, me quedaría quieto, le ignoraría y me reiría burlonamente”. Pero desistí de atacarle verbalmente.

Claro el tipo siguió fastidiandome, una señora se levanto y le cedió un asiento, él se sentó, pude acomodar mi humanidad en ese espacio, y las señoritas también. Al tipo le dio calor, pues estaba con una chaqueta muy gruesa. El tipo se fastidio del calor… Me miro y me dijo con voz de hombre amargado… “siéntate!”… yo me senté y no dije nada. El tipo se sacó la casaca, cuando todos los que estábamos en la parte de atrás nos quedamos helados.

Entre el pantalón y el polo del tipo estaba un revolver de mago marrón… @_@?

Al rato el tipo bajo y algunas personas empezaron a murmurar… y es que es extraño que alguien ande por allí enseñando su revolver.

He preguntado a unos amigos que tienen parientes y conocidos que son policías y guardias de seguridad y todos me dijeron que a ellos no les gusta llevar el arma tan a la vista y de esa forma, si el arma no tienen funda la esconden de la vista de los civiles..

El punto esta en que supe antes de ver el revolver que el tipo tenía un revolver, e imagine la situación. Esto no es más que un caso de gracia por parte de Dios y de su conocimiento. No veo otra respuesta más razonable.

Gracias a Dios que a pesar de no ser alguien “correcto” para con él, me cuida a pesar de todo… Gracias, muchas gracias públicas :)

Cuando llegué a casa Jazmín me estaba esperando con un gran abrazo y un paseame por toda la casa escrito en su rostro. ñ_ñ