2008-10-21 18 views
41

Je suis à la recherche d'un script Python simple qui peut minimiser les CSS dans le cadre d'un processus de déploiement de site Web. (Python est le seul langage de script pris en charge sur le serveur et les analyseurs complets tels que CSS Utils sont trop performants pour ce projet).Script Python pour réduire les CSS?

Fondamentalement, je voudrais jsmin.py pour CSS. Un seul script sans dépendances.

Des idées?

Répondre

64

Cela m'a semblé une bonne tâche d'entrer dans python, qui était en attente depuis un moment. Je vous présente ici ma première script 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]) 

Je crois que cela fonctionne, et il teste la sortie bien sur récente Safari, Opera et Firefox. Il va casser les hacks CSS autres que le trait de soulignement &/**/hacks! N'utilisez pas un minifier si vous avez beaucoup de hacks (ou les mettez dans un fichier séparé).

Tout conseil sur mon python apprécié. S'il vous plaît soyez doux cependant, c'est ma première fois. :-)

+1

Vous pouvez utiliser l'index -1 pour désigner le dernier élément d'une séquence. Vous pouvez donc utiliser .append() au lieu de .insert(), et éviter le .reverse(). En outre, si len (lst)> 0: est généralement fait comme si lst: – recursive

+1

Merci pour les conseils. J'ai réparé ceux-ci et quelques autres choses. Python est une langue vraiment sympa. :-) – Borgar

+0

tout simplement génial. La meilleure partie est que cela va faire partie d'un script de déploiement maintenant! – Soviut

1

Je ne connais pas de minis python css, mais comme vous l'avez dit, les utilitaires css ont l'option. Après avoir vérifié et vérifié que la licence le permet, vous pouvez passer en revue le code source et extraire les parties qui se minifient. Puis coller ceci dans un seul script et voilà! Voilà. Pour commencer, la fonction csscombine dans .../trunk/src/cssutils/script.py semble faire le travail de minifier quelque part autour de la ligne 361 (j'ai vérifié la révision 1499). Notez l'argument de la fonction booléenne "minify".

12

Il existe un portage du compresseur CSS de YUI disponible pour python.

Voici la page du projet sur PyPI: http://pypi.python.org/pypi/cssmin/0.1.1

+0

Malheureusement, il n'est plus maintenu. – Wtower

+2

** rCSSMin ** est un autre port et semble maintenu: https://github.com/ndparker/rcssmin – Brutus

1

Il y a un bel outil en ligne cssminifier qui a également une API qui est assez simple et facile à utiliser. J'ai créé un petit script python qui enregistre le contenu du fichier CSS dans l'API de cet outil, renvoie le CSS minifed et l'enregistre dans un fichier "style.min.css". Je l'aime parce qu'il est un petit code qui peut être intégré bien dans un script de déploiement automatisé:

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

De cssminifier site: http://cssminifier.com/python –

+0

J'ai eu une erreur, en essayant d'envoyer des requêtes à «http »Urls. Les URL «https» de cssminifier.com et javascript-minifier.com fonctionnent correctement. –

1

quelqu'un En cas débarquèrent sur cette question et utilise Django, il y a un paquet couramment utilisé pour cette matière appelée Django Compressor :

Compresse le JavaScript ou CSS lié et incorporé dans un seul fichier mis en cache.

  • JS/CSS appartiennent dans les modèles

  • Flexibilité

  • Il ne reçoit pas de la manière

  • suite de tests complète

1

Dans le webassets docs vous pouvez trouver des liens vers plusieurs compresseurs et compilateurs. De cette liste j'ai choisi pyScss, qui minimise également le CSS résultant.

Si vous avez juste besoin d'un compresseur CSS, vous pouvez essayer csscompressor:

Port Presque exacte du compresseur YUI CSS. Passe toutes les unités unittests originales.

Un autre outil générique est css-html-prettify:

StandAlone Async seul fichier multi-plateforme Unicode prêt python3 Prettifier Beautifier pour le Web.