Question

Je recherche un script Python simple permettant de réduire le 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 utilitaires CSS sont saturés pour ce projet. ).

En gros, je voudrais jsmin.py pour CSS. Un seul script sans dépendance.

Des idées?

Était-ce utile?

La solution

Cela me semblait une bonne tâche pour entrer dans python, qui est en attente depuis un moment. Je présente par la présente mon tout premier 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] ) 

Je pense que cela fonctionne et que les résultats sont bons sur les récents Safari, Opera et Firefox. Cela corrigera les piratages CSS autres que le trait de soulignement & amp; / ** / hacks! N'utilisez pas de minifier si vous avez beaucoup de piratages (ou mettez-les dans un fichier séparé).

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

Autres conseils

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

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

Au cas où quelqu'un tomberait sur cette question et utiliserait Django, il existe un package couramment utilisé à cet effet appelé Django Compressor :

  

Compresse JavaScript ou CSS lié et intégré dans un seul fichier mis en cache.

     
      
  • JS / CSS appartiennent aux modèles

  •   
  • Flexibilité

  •   
  • Cela ne vous gênera pas

  •   
  • Suite de tests complète

  •   

Je ne connais pas de minificateurs css prêts à l'emploi, mais comme vous l'avez dit, css utils a l'option. Après avoir vérifié et vérifié que la licence le permet, vous pouvez parcourir le code source et extraire les parties qui effectuent la minification vous-même. Puis collez ceci dans un seul script et le tour est joué! Voilà.

Comme point de départ, la fonction csscombine dans ... / trunk / src / cssutils / script.py semble effectuer le travail de minimisation quelque part autour de la ligne 361 (j'ai vérifié la révision 1499). Notez l'argument de la fonction booléenne appelé "minify".

Il existe un bel outil en ligne, cssminifier , qui possède également une API assez simple et facile à utiliser. J'ai créé un petit script python qui publie le contenu du fichier CSS sur l'API de cet outil, renvoie le CSS minifé et l'enregistre dans un fichier "style.min.css". J'aime ça parce que c'est un petit code qui peut être bien intégré 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()

Dans les Webassets , vous pouvez trouver des liens vers plusieurs sites. compresseurs et compilateurs. Dans cette liste, j'ai choisi pyScss , ce qui minimise également le code CSS résultant.

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

  

Port presque exact de YUI CSS Compressor. Passe tous les tests initiaux.

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

  

Autonome Async mono-fichier multi-plates-formes, compatible avec Unicode, destiné au Web.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top