tutorial soup library find_next_sibling python css compression minify

soup - Secuencia de comandos de Python para minificar CSS?



python soup find (6)

Estoy buscando un script simple de Python que pueda minificar el CSS como parte de un proceso de implementación del sitio web. (Python es el único lenguaje de scripting 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

¿Algunas ideas?


En caso de que alguien haya aterrizado en esta pregunta y esté usando Django, hay un paquete comúnmente usado para este asunto llamado Compresor Django :

Comprime JavaScript o CSS enlazado y en línea en un solo archivo en caché.

  • JS / CSS pertenecen a las plantillas

  • Flexibilidad

  • No se interpone en el camino

  • Suite de prueba completa


En los documentos de 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 todos los unittest originales.

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

StandAlone Async de un solo archivo multiplataforma compatible con Unicode Python3 Prettifier Beautifier para la Web.


Esta me pareció una buena tarea para entrar en Python, que ha estado pendiente por un tiempo. Presento mi primer guión python:

import sys, re css = open( sys.argv[1] , ''r'' ).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 funciona bien en los últimos Safari, Opera y Firefox. Rompe CSS hacks que no sean el guión bajo y / ** / hacks! No use un minificador si tiene muchos ataques (o póngalos en un archivo separado).

Cualquier consejo sobre mi pitón apreciado. Por favor, sé amable, es mi primera vez. :-)


Hay un buen cssminifier de herramientas en línea 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 minimizado y lo guarda en un archivo "style.min.css". Me gusta porque es un código pequeño que puede estar bien integrado en un script de implementación automatizado:

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()



No conozco ninguno de los minions de python css, 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 cortar las partes que lo minifican. Luego pega esto en un solo script y ¡voila! Ahí tienes.

Como una ventaja, 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".