49 votes

Un script Python pour minifier les CSS?

Je recherche un script Python simple capable de réduire la 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 des analyseurs syntaxiques complets tels que CSS Utils sont excessifs pour ce projet).

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

Des idées?

73voto

Borgar Points 12493

Cela semblait être une bonne tâche pour moi de le faire en python, qui a été en attente pendant un certain temps. Par la présente, je vous présente mon tout premier 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 la sortie du test de beaux récente de Safari, Opera et Firefox. Il va se casser les hacks CSS autres que le trait de soulignement & /**/ hacks! Ne pas utiliser un minifier si vous avez beaucoup de hacks de passe (ou les mettre dans un fichier séparé).

Des conseils sur mon python apprécié. Soyez doux bien, c'est ma première fois. :-)

13voto

Gregor Müllegger Points 2957

Un port du compresseur CSS de YUI est disponible pour python.

Voici la page de son projet sur PyPi: http://pypi.python.org/pypi/cssmin/0.1.1

1voto

Jeffrey Martinez Points 1408

Je ne sais pas du tout prêt à python, css minifiers, mais comme vous l'avez dit css utils a la possibilité. Après vérification et vérifier que la licence le permet, vous pourriez passer par le code source et coupez les portions qui ne les minifying vous-même. Puis coller ceci dans un seul script et le tour est joué! Là vous allez.

En tant que head start, le csscombine fonction dans .../trunk/src/cssutils/script.py semble faire le travail de minifying quelque part autour de la ligne 361 (j'ai vérifié révision 1499). Remarque la fonction booléenne argument appelé "rapetisser".

0voto

kracekumar Points 2653

C'est peut-être celui que vous attendez http://sandbox.pocoo.org/clevercss/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X