110 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | ||
| # (c) 2012 Sergey Mezentsev
 | ||
| import string
 | ||
| 
 | ||
| from itertools import chain, product, starmap
 | ||
| 
 | ||
| 
 | ||
| def parse_dict_json(raw_dict):
 | ||
|     result_dict = {}
 | ||
| 
 | ||
|     valuable = (i for i in raw_dict if 'name' in i and 'values' in i)
 | ||
| 
 | ||
|     def strip(s):
 | ||
|         return string.strip(s) if hasattr(string, 'strip') else s.strip()
 | ||
| 
 | ||
|     for i in valuable:
 | ||
|         name, values, default = i['name'], i['values'], i.get('default')
 | ||
|         names = name if isinstance(name, list) else map(strip, name.split(','))
 | ||
|         for n in names:
 | ||
|             assert n not in result_dict
 | ||
| 
 | ||
|             val = { 'values': values }
 | ||
| 
 | ||
|             if default is not None:
 | ||
|                 val['default'] = default
 | ||
| 
 | ||
|             if 'prefixes' in i:
 | ||
|                 val['prefixes'] = i['prefixes']
 | ||
|                 if 'no-unprefixed-property' in i:
 | ||
|                     val['no-unprefixed-property'] = i['no-unprefixed-property']
 | ||
|             else:
 | ||
|                 assert 'no-unprefixed-property' not in i
 | ||
| 
 | ||
|             result_dict[n] = val
 | ||
| 
 | ||
|     return result_dict
 | ||
| 
 | ||
| get_css_dict_cache = None
 | ||
| def get_css_dict():
 | ||
|     global get_css_dict_cache
 | ||
|     if get_css_dict_cache is not None:
 | ||
|         return get_css_dict_cache
 | ||
|     else:
 | ||
|         CSS_DICT_DIR = 'dictionaries'
 | ||
|         CSS_DICT_FILENAME = 'hayaku_CSS_dictionary.json'
 | ||
|         DICT_KEY = 'hayaku_CSS_dictionary'
 | ||
| 
 | ||
|         import json
 | ||
|         import os
 | ||
|         try:
 | ||
|             import sublime
 | ||
|             css_dict = sublime.load_settings(CSS_DICT_FILENAME).get(DICT_KEY)
 | ||
|             if css_dict is None:
 | ||
|                 import zipfile
 | ||
|                 zf = zipfile.ZipFile(os.path.dirname(os.path.realpath(__file__)))
 | ||
|                 f = zf.read('{0}/{1}'.format(CSS_DICT_DIR, CSS_DICT_FILENAME))
 | ||
|                 css_dict = json.loads(f.decode())[DICT_KEY]
 | ||
|         except ImportError:
 | ||
|             css_dict_path = os.path.join(CSS_DICT_DIR, CSS_DICT_FILENAME)
 | ||
|             css_dict = json.load(open(css_dict_path))[DICT_KEY]
 | ||
| 
 | ||
|         assert css_dict is not None
 | ||
|         get_css_dict_cache = parse_dict_json(css_dict)
 | ||
|         return get_css_dict_cache
 | ||
| 
 | ||
| def css_defaults(name, css_dict):
 | ||
|     """Находит первое значение по-умолчанию
 | ||
|     background -> #FFF
 | ||
|     color -> #FFF
 | ||
|     content -> ""
 | ||
|     """
 | ||
|     cur = css_dict.get(name) or css_dict.get(name[1:-1])
 | ||
|     if cur is None:
 | ||
|         return None
 | ||
|     default = cur.get('default')
 | ||
|     if default is not None:
 | ||
|         return default
 | ||
| 
 | ||
|     for v in cur['values']:
 | ||
|         if v.startswith('<') and v.endswith('>'):
 | ||
|             ret = css_defaults(v, css_dict)
 | ||
|             if ret is not None:
 | ||
|                 return ret
 | ||
| 
 | ||
| def css_flat(name, values=None, css_dict=None):
 | ||
|     """Все значения у свойства (по порядку)
 | ||
|     left -> [u'auto', u'<dimension>', u'<number>', u'<length>', u'.em', u'.ex',
 | ||
|             u'.vw', u'.vh', u'.vmin', u'.vmax', u'.ch', u'.rem', u'.px', u'.cm',
 | ||
|             u'.mm', u'.in', u'.pt', u'.pc', u'<percentage>', u'.%']
 | ||
|     """
 | ||
|     cur = css_dict.get(name) or css_dict.get(name[1:-1])
 | ||
|     if values is None:
 | ||
|         values = []
 | ||
|     if cur is None:
 | ||
|         return values
 | ||
|     for value in cur['values']:
 | ||
|         values.append(value)
 | ||
|         if value.startswith('<') and value.endswith('>'):
 | ||
|             values = css_flat(value, values, css_dict)
 | ||
|     return values
 | ||
| 
 | ||
| def css_flat_list(name, css_dict):
 | ||
|     """Возвращает список кортежей (свойство, возможное значение)
 | ||
|     left -> [(left, auto), (left, <integer>), (left, .px)...]
 | ||
|     """
 | ||
|     return list(product((name,), css_flat(name, css_dict=get_css_dict())))
 | ||
| 
 | ||
| def get_flat_css():
 | ||
|     return list(chain.from_iterable(starmap(css_flat_list, ((i, get_css_dict()) for i in get_css_dict()))))
 |