2008-10-21 6 views
41

웹 사이트 배포 프로세스의 일부로 CSS를 축소 할 수있는 간단한 Python 스크립트를 찾고 있습니다. (파이썬은 서버에서 지원되는 유일한 스크립팅 언어이며 CSS Utils과 같은 본격적인 파서는이 프로젝트에 과도 함입니다.)CSS를 축소하기위한 Python 스크립트?

기본적으로 나는 CSS에 jsmin.py을 사용하고 싶습니다. 종속성이없는 단일 스크립트.

아이디어가 있으십니까?

답변

64

이것은 잠깐 보류되어있는 파이썬에 들어가기에 좋은 일처럼 보였다. 나는 이제까지 나의 최초의 파이썬 스크립트를 발표했다.

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

나는 이것이 작동한다고 믿고 최근 Safari, Opera 및 Firefox에서 잘 테스트한다. &/**/hacks 이외의 CSS 해킹을 깨뜨릴 것입니다! 많은 해킹이있는 경우 (또는 별도의 파일에 넣는 경우) minifier를 사용하지 마십시오.

내 파이썬에 대한 모든 정보가 감사하겠습니다. 제발 친절 하구만. 처음이야. :-)

+1

인덱스 -1을 사용하여 시퀀스의 마지막 요소를 나타낼 수 있습니다. 따라서 .insert() 대신 .append()를 사용하고 .reverse()를 피할 수 있습니다. 또한 len (lst)> 0 :가 일반적으로 lst : – recursive

+1

과 같이 수행되는 경우 도움말을 보내 주셔서 감사합니다. 나는 이것들과 몇 가지 다른 것들을 고쳤다. 파이썬은 정말 좋은 언어입니다. :-) – Borgar

+0

단순히 굉장합니다. 가장 중요한 부분은 지금 배포 스크립트의 일부가 될 것입니다! – Soviut

1

나는 어떤 준비된 python css minifier도 모르지만 당신이 말한 것처럼 CSS utils에는 옵션이 있습니다. 라이센스가 그것을 허용하는지 확인하고 확인한 후에는 소스 코드를 살펴보고 스스로 축소하는 부분을 잘라낼 수 있습니다. 그런 다음이 스크립트를 하나의 스크립트 및 스킬에 집어 넣으십시오! 됐어.

.../trunk/src/cssutils/script.py의 csscombine 함수는 361 행 (나 개정 1499를 체크 아웃 한) 주위를 축소하는 작업을 수행하는 것처럼 보입니다. "minify"라는 부울 함수 인수에 유의하십시오.

12

python에 사용할 수있는 YUI의 CSS 압축기 포트가 있습니다.

여기 PyPi에 자사의 프로젝트 페이지입니다 : http://pypi.python.org/pypi/cssmin/0.1.1

+0

불행히도 더 이상 유지 관리되지 않습니다. – Wtower

+2

** rCSSMin **은 다른 포트이며 유지 관리 된 것으로 보입니다 : https://github.com/ndparker/rcssmin – Brutus

1

도 매우 간단하고 사용하기 쉬운 API를 가지고 좋은 온라인 도구 cssminifier 있습니다. 나는 그 도구의 API에 CSS 파일 내용을 게시하고, minifed CSS를 반환하고 그것을 "style.min.css"파일에 저장하는 작은 파이썬 스크립트를 만들었습니다.

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

cssminifier 사이트에서 : http://cssminifier.com/python –

+0

«http »URL. cssminifier.com과 javascript-minifier.com의«https»urls는 잘 작동합니다. –

1

이 경우 누군가가이 질문에 착륙하고 장고를 사용 Django Compressor라고이 문제에 관해서는 일반적으로 사용되는 패키지가있다 : 그것은 멋지게 자동화 된 배포 스크립트에 통합 될 수있는 작은 코드가 있기 때문에 나는 그것을 좋아하지 :

링크 된 JavaScript 및 CSS를 단일 캐시 파일로 압축합니다.

  • JS/CSS는

  • 유연성을 템플릿에 속하지

  • 이 방법

  • 전체 테스트 스위트

1

얻을하지 않습니다년문서에서는 여러 압축기 및 컴파일러에 대한 링크를 찾을 수 있습니다. 이 목록에서 pyScss을 선택했으며 결과 CSS를 축소합니다. 당신은 단지 CSS 압축기가 필요한 경우

당신은 csscompressor을 시도 할 수 있습니다 : YUI의 CSS 압축기의

거의 정확한 포트. 원래의 모든 단위 테스트를 통과합니다.

보다 일반적인 도구는 css-html-prettify입니다 :

독립 비동기 단일 파일 크로스 플랫폼 유니 코드 준비 Python3 Prettifier 아름답게 웹용.

관련 문제