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. :-)
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
Merci pour les conseils. J'ai réparé ceux-ci et quelques autres choses. Python est une langue vraiment sympa. :-) – Borgar
tout simplement génial. La meilleure partie est que cela va faire partie d'un script de déploiement maintenant! – Soviut