61 lines
2.1 KiB
Python
61 lines
2.1 KiB
Python
#-*- coding:utf-8 -*-
|
|
import re
|
|
import os
|
|
|
|
__all__ = ['add_metaclass', 'wrap_css']
|
|
|
|
|
|
def add_metaclass(metaclass):
|
|
"""Class decorator for creating a class with a metaclass."""
|
|
def wrapper(cls):
|
|
orig_vars = cls.__dict__.copy()
|
|
slots = orig_vars.get('__slots__')
|
|
if slots is not None:
|
|
if isinstance(slots, str):
|
|
slots = [slots]
|
|
for slots_var in slots:
|
|
orig_vars.pop(slots_var)
|
|
orig_vars.pop('__dict__', None)
|
|
orig_vars.pop('__weakref__', None)
|
|
return metaclass(cls.__name__, cls.__bases__, orig_vars)
|
|
return wrapper
|
|
|
|
|
|
def wrap_css(orig_css, is_file=True, class_wrapper=None, new_cssfile_suffix=u'wrap'):
|
|
|
|
def process(content):
|
|
# clean the comments
|
|
regx = re.compile(r'/\*.*?\*/', re.DOTALL)
|
|
content = regx.sub(r'', content).strip()
|
|
# add wrappers to all the selectors except the first one
|
|
regx = re.compile(r'([^\r\n,{}]+)(,(?=[^}]*{)|\s*{)', re.DOTALL)
|
|
new_css = regx.sub(u'.{} \\1\\2'.format(class_wrapper), content)
|
|
return new_css
|
|
|
|
if is_file:
|
|
if not class_wrapper:
|
|
class_wrapper = os.path.splitext(os.path.basename(orig_css))[0]
|
|
new_cssfile = u'{css_name}_{suffix}.css'.format(
|
|
css_name=orig_css[:orig_css.rindex('.css')],
|
|
suffix=new_cssfile_suffix)
|
|
# if new css file exists, not process
|
|
# if input original css file doesn't exist, return the new css filename and class wrapper
|
|
# to make the subsequent process easy.
|
|
if os.path.exists(new_cssfile) or not os.path.exists(orig_css):
|
|
return new_cssfile, class_wrapper
|
|
result = ''
|
|
with open(orig_css, 'rb') as f:
|
|
try:
|
|
result = process(f.read().strip().decode('utf-8', 'ignore'))
|
|
except:
|
|
showInfo('error: ' + orig_css)
|
|
|
|
if result:
|
|
with open(new_cssfile, 'wb') as f:
|
|
f.write(result.encode('utf-8'))
|
|
return new_cssfile, class_wrapper
|
|
else:
|
|
# class_wrapper must be valid.
|
|
assert class_wrapper
|
|
return process(orig_css), class_wrapper
|