Pergunta

Eu estou procurando um simples Python script que pode apoucar CSS como parte de um processo de implantação de web-site. (Python é a linguagem única script suportado nos analisadores de servidores e full-blown como CSS Utils são um exagero para este projecto ).

Basicamente eu gostaria jsmin.py para CSS. Um único script sem dependências.

Todas as idéias?

Foi útil?

Solução

Esta parecia ser uma tarefa boa para mim para entrar em python, que está pendente há algum tempo. Junto apresento o meu primeiro script python sempre:

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

Eu acredito que isso funcione, e sua saída será testa bem em recente Safari, Opera e Firefox. Ele vai quebrar outros que o sublinhado & / ** / hacks hacks CSS! Não use um minifier se você tem um monte de hacks acontecendo (ou colocá-los em um arquivo separado).

Todas as dicas sobre o meu python apreciado. Por favor, seja gentil, porém, é minha primeira vez. : -)

Outras dicas

Há um porto de compressor CSS YUI disponível para python.

Aqui está a sua página do projeto no PyPI: http://pypi.python.org/pypi/cssmin/0.1.1

No caso de alguém pousou sobre esta questão e está usando Django, há um pacote comumente utilizado para este assunto chamado Django Compressor :

Compressas ligada e em linha JavaScript ou CSS em um único arquivo em cache.

  • JS / CSS pertencem ao templates

  • Flexibilidade

  • Não ficar no caminho

  • suíte de testes completa

Eu não sei de nenhum minifiers python css feitos prontos, mas como você disse utils CSS tem a opção. Depois de verificar e verificar se a licença permitir, você poderia ir através do código-fonte e cortar fora as partes que o mesmo minifying. Em seguida, manter isso em um único script e voila! Lá vai você.

Como um ponto de partida, a função csscombine em ... / trunk / src / cssutils / script.py parece estar a fazer o trabalho de minifying em algum lugar em torno da linha 361 (eu verifiquei revisão 1499). Observe o argumento função booleana chamada "apoucar".

Há uma ferramenta on-line agradável cssminifier que tem também uma API que é bastante simples e fácil de usar. Eu fiz um pequeno script Python que mensagens o conteúdo do arquivo CSS a API dessa ferramenta, retorna o CSS minifed e salva-lo em um arquivo "style.min.css". Eu gosto dele porque ele é um pequeno código que pode ser bem integrado em um script de implantação automatizada:

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

Na webassets docs você pode encontrar links para vários compressores e compiladores. A partir dessa lista que escolhi pyScss , que também minifies o CSS resultante.

Se você precisa apenas de um compressor CSS você pode tentar csscompressor :

porta Quase exata do YUI CSS Compressor. Passa todos os UnitTests originais.

A ferramenta mais genérica é css-html-embelezar :

StandAlone Async de arquivo único multi-plataforma Unicode-pronto Python3 prettifier Beautifier para a Web.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top