Script Python per minimizzare CSS? [chiuso]
-
03-07-2019 - |
Domanda
Sto cercando un semplice script Python in grado di minimizzare CSS come parte di un processo di distribuzione di un sito web. (Python è l'unico linguaggio di scripting supportato sul server e i parser completi come Utilità CSS sono eccessivi per questo progetto ).
Fondamentalmente mi piacerebbe jsmin.py per CSS. Un singolo script senza dipendenze.
Qualche idea?
Soluzione
Mi è sembrato un buon compito entrare in Python, che è in sospeso da un po '. Con la presente presento il mio primo script 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] )
Credo che funzioni, e l'output lo test bene su Safari, Opera e Firefox recenti. Romperà gli hack CSS diversi dal carattere di sottolineatura & amp; / ** / hack! Non utilizzare un minimizer se sono presenti molti hack (o inserirli in un file separato).
Tutti i suggerimenti sul mio pitone sono stati apprezzati. Per favore, sii gentile, è la prima volta. : -)
Altri suggerimenti
Esiste una porta per il compressore CSS di YUI disponibile per Python.
Ecco la sua pagina di progetto su PyPi: http://pypi.python.org/pypi/cssmin/0.1.1
Nel caso in cui qualcuno sia arrivato a questa domanda e stia usando Django, esiste un pacchetto comunemente usato per questa materia chiamato Django Compressor :
Comprime JavaScript o CSS collegati e incorporati in un singolo file memorizzato nella cache.
JS / CSS appartengono ai modelli
Flessibilità
Non si frappone
Suite di test completa
Non conosco minimizzatori di CSS Python già pronti, ma come hai detto, css utils ha l'opzione. Dopo aver verificato e verificato che la licenza lo consenta, è possibile passare attraverso il codice sorgente e tagliare da sé le parti che eseguono la minimizzazione. Quindi incollalo in una sola sceneggiatura e voilà! Ecco qua.
Come vantaggio iniziale, la funzione csscombine in ... / trunk / src / cssutils / script.py sembra fare il lavoro di minimizzazione da qualche parte intorno alla linea 361 (ho verificato la revisione 1499). Nota l'argomento della funzione booleana chiamato " minify " ;.
Esiste un simpatico strumento online cssminifier che ha anche un'API piuttosto semplice e facile da usare. Ho creato un piccolo script Python che pubblica il contenuto del file CSS nell'API di quello strumento, restituisce il CSS minimizzato e lo salva in un file "style.min.css". Mi piace perché è un piccolo codice che può essere ben integrato in uno script di distribuzione automatizzata:
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()
Nei webasset puoi trovare collegamenti a più compressori e compilatori. Da quell'elenco ho scelto pyScss , che minimizza anche il CSS risultante.
Se hai bisogno solo di un compressore CSS puoi provare csscompressor :
Porta quasi esatta di YUI CSS Compressor. Supera tutti gli unittest originali.
Uno strumento più generico è css-html-prettify :
StandAlone Async Python3 Prettifier Python3 multipiattaforma a file singolo per Unicode per il Web.