Pregunta

Estoy buscando un script Python simple que pueda minimizar CSS como parte de un proceso de implementación del sitio web. (Python es el único lenguaje de secuencias de comandos admitido en el servidor y los analizadores completos como CSS Utils son excesivos para este proyecto ).

Básicamente me gustaría jsmin.py para CSS. Un solo script sin dependencias.

¿Alguna idea?

¿Fue útil?

Solución

Esto me pareció una buena tarea entrar a Python, que ha estado pendiente por un tiempo. Por la presente presento mi primer script de Python:

import sys, re

with open( sys.argv[1] , 'r' ) as f:
    css = f.read()

# remove comments - this will break a lot of hacks :-P
css = re.sub( r'\s*/\*\s*\*/', "$HACK1$", css ) # preserve IE<6 comment hack
css = re.sub( r'/\*[\s\S]*?\*/', "", css )
css = css.replace( "$HACK1$", '/**/' ) # preserve IE<6 comment hack

# url() doesn't need quotes
css = re.sub( r'url\((["\'])([^)]*)\1\)', r'url(\2)', css )

# spaces may be safely collapsed as generated content will collapse them anyway
css = re.sub( r'\s+', ' ', css )

# shorten collapsable colors: #aabbcc to #abc
css = re.sub( r'#([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3(\s|;)', r'#\1\2\3\4', css )

# fragment values can loose zeros
css = re.sub( r':\s*0(\.\d+([cm]m|e[mx]|in|p[ctx]))\s*;', r':\1;', css )

for rule in re.findall( r'([^{]+){([^}]*)}', css ):

    # we don't need spaces around operators
    selectors = [re.sub( r'(?<=[\[\(>+=])\s+|\s+(?=[=~^$*|>+\]\)])', r'', selector.strip() ) for selector in rule[0].split( ',' )]

    # order is important, but we still want to discard repetitions
    properties = {}
    porder = []
    for prop in re.findall( '(.*?):(.*?)(;|$)', rule[1] ):
        key = prop[0].strip().lower()
        if key not in porder: porder.append( key )
        properties[ key ] = prop[1].strip()

    # output rule if it contains any declarations
    if properties:
        print "%s{%s}" % ( ','.join( selectors ), ''.join(['%s:%s;' % (key, properties[key]) for key in porder])[:-1] ) 

Creo que esto funciona, y la salida se prueba bien en Safari, Opera y Firefox recientes. Romperá los hacks CSS que no sean el guión bajo & amp; / ** / hacks! No use un minificador si tiene muchos hacks en curso (o los coloca en un archivo separado).

Cualquier consejo sobre mi python apreciado. Por favor, sé gentil, es mi primera vez. :-)

Otros consejos

Hay un puerto del compresor CSS de YUI disponible para python.

Aquí está su página de proyecto en PyPi: http://pypi.python.org/pypi/cssmin/0.1.1

En caso de que alguien aterrice en esta pregunta y esté usando Django, hay un paquete de uso común para este asunto llamado Compresor Django :

  

Comprime JavaScript o CSS vinculados e integrados en un solo archivo en caché.

     
      
  • JS / CSS pertenecen a las plantillas

  •   
  • Flexibilidad

  •   
  • No se interpone en el camino

  •   
  • Conjunto completo de pruebas

  •   

No conozco ningún minificador Python css listo, pero como dijiste, css utils tiene la opción. Después de verificar y verificar que la licencia lo permite, puede revisar el código fuente y recortar las porciones que hacen la minificación usted mismo. ¡Entonces pegue esto en un solo guión y listo! Ahí tienes.

Como punto de partida, la función csscombine en ... / trunk / src / cssutils / script.py parece hacer el trabajo de minificar en algún lugar alrededor de la línea 361 (revisé la revisión 1499). Tenga en cuenta el argumento de la función booleana llamado "minify".

Hay una buena herramienta en línea cssminifier que también tiene una API que es bastante simple y fácil de usar. Hice un pequeño script de Python que publica el contenido del archivo CSS en la API de esa herramienta, devuelve el CSS minifed y lo guarda en un archivo " style.min.css " ;. Me gusta porque es un código pequeño que puede integrarse muy bien en una secuencia de comandos de implementación automatizada:

import requests
f = open("style.css", "r")
css_text = f.read()
f.close()
r = requests.post("http://cssminifier.com/raw", data={"input":css_text})
css_minified = r.text
f2 = open("style.min.css", "w")
f2.write(css_minified)
f2.close()

En los webassets puede encontrar enlaces a múltiples compresores y compiladores. De esa lista he elegido pyScss , que también minimiza el CSS resultante.

Si solo necesita un compresor CSS, puede probar csscompressor :

  

Puerto casi exacto de YUI CSS Compressor. Pasa todas las pruebas unitarias originales.

Una herramienta más genérica es css-html-prettify :

  

StandAlone Async multiplataforma multiplataforma listo para Unicode Python3 Prettifier Beautifier para la Web.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top