2008-10-21 33 views
41

Tôi đang tìm một tập lệnh Python đơn giản có thể rút gọn CSS như là một phần của quy trình triển khai trang web. (Python là ngôn ngữ kịch bản duy nhất được hỗ trợ trên máy chủ và các trình phân tích cú pháp toàn diện như CSS Utils là quá mức cần thiết cho dự án này).Tập lệnh Python để rút gọn CSS?

Về cơ bản tôi muốn jsmin.py cho CSS. Một kịch bản đơn không có phụ thuộc.

Bất kỳ ý tưởng nào?

Trả lời

64

Điều này có vẻ như một nhiệm vụ tốt để tôi vào được python, đã được chờ trong một thời gian. Tôi xin trình bày kịch bản python đầu tiên của tôi:

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

Tôi tin rằng điều này có hiệu quả và thử nghiệm tốt trên Safari, Opera và Firefox gần đây. Nó sẽ phá vỡ hacks CSS khác với gạch dưới &/**/hacks! Không sử dụng một minifier nếu bạn có rất nhiều hacks đang diễn ra (hoặc đặt chúng trong một tập tin riêng biệt).

Mọi mẹo trên trăn của tôi được đánh giá cao. Xin hãy nhẹ nhàng, đây là lần đầu tiên của tôi. :-)

+1

Bạn có thể sử dụng chỉ mục -1 để tham chiếu phần tử cuối cùng trong chuỗi. Vì vậy, bạn có thể sử dụng .append() thay vì .insert(), và tránh .reverse(). Ngoài ra, nếu len (lst)> 0: thường được thực hiện như thể lst: – recursive

+1

Cảm ơn lời khuyên. Tôi đã sửa những thứ này và một số thứ khác. Python là một ngôn ngữ thực sự tốt đẹp. :-) – Borgar

+0

đơn giản là tuyệt vời. Phần tốt nhất là điều này sẽ là một phần của một kịch bản triển khai ngay bây giờ! – Soviut

1

Tôi không biết về bất kỳ bộ biên dịch css trùn nào đã sẵn sàng, nhưng như bạn đã nói utss css có tùy chọn. Sau khi kiểm tra và xác minh rằng giấy phép cho phép, bạn có thể đi qua mã nguồn và tìm ra các phần làm giảm thiểu chính mình. Sau đó, dính điều này trong một kịch bản duy nhất và thì đấy! Có bạn đi.

Là khởi đầu, chức năng csscombine trong .../trunk/src/cssutils/script.py dường như làm công việc thu nhỏ một nơi nào đó quanh dòng 361 (tôi đã kiểm tra bản sửa đổi 1499). Lưu ý đối số hàm boolean được gọi là "minify".

12

Có một cổng của máy nén CSS của YUI có sẵn cho python.

Đây là trang dự án của mình trên PyPi: http://pypi.python.org/pypi/cssmin/0.1.1

+0

Thật không may không còn được duy trì. – Wtower

+2

** rCSSMin ** là một cổng khác và dường như được duy trì: https://github.com/ndparker/rcssmin – Brutus

1

Có một trực tuyến công cụ tốt đẹp cssminifier mà cũng có một API mà là khá đơn giản và dễ sử dụng. Tôi đã tạo một tập lệnh python nhỏ để đăng nội dung tệp CSS lên API của công cụ đó, trả về tệp CSS nhỏ gọn và lưu nó vào tệp "style.min.css". Tôi thích nó vì nó là một mã nhỏ có thể được tích hợp độc đáo trong một kịch bản triển khai tự động:

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

Từ trang web cssminifier: http://cssminifier.com/python –

+0

Tôi gặp lỗi, cố gắng gửi yêu cầu tới «http »Url. «Https» url của cssminifier.com và javascript-minifier.com hoạt động tốt. –

1

Trong trường hợp ai đó đã đổ bộ lên câu hỏi này và đang sử dụng Django, có một gói thường được sử dụng cho vấn đề này được gọi là Django Compressor :

Nén JavaScript và CSS được liên kết và nội dòng vào một tệp được lưu trong bộ nhớ cache duy nhất.

  • JS/CSS thuộc về các mẫu

  • linh hoạt

  • Nó không nhận được trong cách

  • Full kiểm tra bộ

1

Trong webassets tài liệu bạn có thể tìm thấy liên kết đến nhiều máy nén và trình biên dịch. Từ danh sách đó tôi đã chọn pyScss, cũng giảm thiểu CSS kết quả.

Nếu bạn cần chỉ là một máy nén CSS bạn có thể thử csscompressor:

cổng Hầu như chính xác của YUI CSS Compressor. Vượt qua tất cả các khoản tiền gửi ban đầu.

Một công cụ chung chung hơn là css-html-prettify:

độc Async single-file cross-platform Unicode-ready Python3 Prettifier beautifier cho Web.

Các vấn đề liên quan