Frage

Ich bin auf der Suche nach einem einfachen Python-Skript, das CSS als Teil eines Web-Site-Bereitstellungsprozesses minify kann. (Python ist die einzige auf dem Server und ausgewachsenen Parser unterstützten Skriptsprache wie CSS Utils sind viel des Guten für dieses Projekt ).

Im Grunde würde Ich mag jsmin.py für CSS. Ein einziges Skript ohne Abhängigkeiten.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Dies schien wie eine gute Aufgabe für mich in Python zu erhalten, die für eine Weile anhängig ist. Ich hiermit meinen ersten Python-Skript vor:

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] ) 

Ich glaube, dies funktioniert, und Ausgabe testet es gut auf den letzten Safari, Opera und Firefox. Es wird CSS-Hacks andere als der Unterstreichungs & / ** / Hacks brechen! Verwenden Sie keine minifier verwenden, wenn Sie eine Menge Hacks los (oder sie in einer separaten Datei setzen).

Irgendwelche Tipps auf meinem Python geschätzt. Bitte obwohl sanft, es ist mein erstes Mal. : -)

Andere Tipps

Es ist eine Portierung von CSS Kompressor YUI für Python zur Verfügung.

Hier ist die Projektseite auf PyPI: http://pypi.python.org/pypi/cssmin/0.1.1

Falls jemand landete auf dieser Frage und wird mit Django, es ist ein häufig verwendetes Paket für diese Angelegenheit genannt Django Compressor :

  

Komprimiert verknüpft und Inline JavaScript oder CSS in einem einzigen Cache gespeicherten Datei.

     
      
  • JS / CSS gehören in den Vorlagen

  •   
  • Flexibilität

  •   
  • Es wird nicht in der Art und Weise

  •   
  • Volltestsuite

  •   

Ich weiß nicht, von irgendwelchen bereit Python CSS minifiers gemacht, aber wie Sie gesagt haben CSS-utils die Option hat. Nach der Überprüfung und Verifizierung, dass die Lizenz für es erlaubt, können Sie den Quellcode durchlaufen und schnippeln die Teile heraus, dass die Verkleinerungs selbst zu tun. Dann halten diese in einem einzigen Skript und voila! Dort gehen Sie.

Als ein Vorsprung, die csscombine Funktion in ... / trunk / src / cssutils / script.py scheint um die Linie 361 die Arbeit von minifying irgendwo zu tun (mir ausgecheckt Revision 1499). Beachten Sie die Boolesche Funktion Argument namens "minify".

Es gibt ein schönes Online-Tool cssminifier die auch eine API hat, die ziemlich einfach und leicht zu bedienen ist. Ich habe ein kleines Python-Skript, das die CSS-Datei Inhalt dieses Werkzeug API, gibt die minifed CSS und speichert sie in einer Datei „style.min.css“ postet. Ich mag es, weil es ein kleiner Code, der in einem automatisierten Deployment-Skript integriert wird gut kann:

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

In der Webassets docs können Sie Links zu mehreren finden Kompressoren und Compiler. Aus dieser Liste habe ich pyScss gewählt, die auch die resultierenden CSS minifies.

Wenn Sie nur einen CSS-Kompressor benötigen, können Sie versuchen, csscompressor :

  

Fast genau Hafen von YUI CSS Compressor. Pässe alle ursprünglichen Unittests.

Ein generisches Werkzeug ist CSS-html-verschönern :

  

Standalone Async Single-File-Cross-Plattform-Unicode-ready Python3 Prettifier Beautifier für das Web.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top