Skip to content

Commit

Permalink
merge
Browse files Browse the repository at this point in the history
  • Loading branch information
TheBits committed Feb 9, 2012
1 parent e47021b commit 81fe1b3
Show file tree
Hide file tree
Showing 4 changed files with 186 additions and 7 deletions.
10 changes: 5 additions & 5 deletions CSS-dict.txt
Expand Up @@ -20,17 +20,17 @@
<number> | <length> | <percentage>

<length> :
em | ex | ch | rem | vw | vh | vm |
px | cm | mm | in | pt | pc
.em | .ex | .ch | .rem | .vw | .vh | .vm |
.px | .cm | .mm | .in | .pt | .pc

<percentage> :
%
.%

<angle> :
deg | grad | rad | turn
.deg | .grad | .rad | .turn

<time> :
s | ms
.s | .ms

<url> :
url() // replace with cute snippet
Expand Down
11 changes: 9 additions & 2 deletions css_dict_driver.py
Expand Up @@ -49,9 +49,13 @@ def expand_values(parsed_dict, properties):
prop = properties.pop()
prop_find = '<{0}>'.format(prop)
for name, values in parsed_dict.items():
# todo: пересмотреть алгоритм
if prop_find in values:
values.remove(prop_find)
values |= parsed_dict[prop]
if prop in values:
values.remove(prop)
values |= set(p for p in parsed_dict[prop])
return expand_values(parsed_dict, properties)

def flat_dict(dict_):
Expand All @@ -64,16 +68,19 @@ def props_dict():
pd = parse_dict(read_file(CSS_DICT_FILENAME))
new_dict = {}
for k, val in pd.items():
v = (i for i in val if '<' not in i)
v = (i for i in val if '<' not in i and not i.startswith('.'))
new_dict[k] = (list(v),)
return new_dict

def flat_css_dict():
"""Возвращает список (свойство, возможное_значение)"""
pd = parse_dict(read_file(CSS_DICT_FILENAME))
all_pd = expand_values(pd, pd.keys())
return flat_dict(all_pd)

if __name__ == '__main__':
pd = parse_dict(read_file(CSS_DICT_FILENAME))
all_pd = expand_values(pd, pd.keys())
# print flat_dict(all_pd)
for p, v in flat_dict(all_pd):
if v in ('<number>', '<attr>') or p == 'top':
print p, v
3 changes: 3 additions & 0 deletions segmentation_test.py
Expand Up @@ -161,6 +161,9 @@ def test_11(self):
def test_12(self):
self.assertEqual(color_expand('abcdef'), '#ABCDEF')

class TemplateTest(unittest.TestCase):
pass


if __name__ == '__main__':
unittest.main()
169 changes: 169 additions & 0 deletions templates.py
@@ -0,0 +1,169 @@
# -*- coding: utf-8 -*-
import re

from css_dict_driver import flat_css_dict

# TODO заменить на css-dict
VENDOR_PROPERTY_PREFIXES = {
'box-shadow': (
'-webkit-box-shadow',
'-moz-box-shadow',
'-o-box-shadow',
'box-shadow',
),
'box-sizing': (
'-webkit-box-sizing',
'-moz-box-sizing',
'box-sizing',
),
'border-radius': (
'-webkit-border-radius',
'-moz-border-radius',
'border-radius',
),
'user-select': (
'-webkit-user-select',
'-moz-user-select',
'user-select',
),
'transform': (
'-webkit-transform',
'-moz-transform',
'-o-transform',
'transform',
),
'background-clip': (
'-webkit-background-clip',
'-moz-background-clip',
'background-clip',
),
'border-top-right-radius': (
'-webkit-border-top-right-radius',
'-moz-border-radius-topright',
'-o-border-top-right-radius',
'border-top-right-radius',
),
'border-top-left-radius': (
'-webkit-border-top-left-radius',
'-moz-border-radius-topleft',
'-o-border-top-left-radius',
'border-top-left-radius',
),
'border-bottom-right-radius': (
'-webkit-border-bottom-right-radius',
'-moz-border-radius-bottomright',
'-o-border-bottom-right-radius',
'border-bottom-right-radius',
),
'border-bottom-left-radius': (
'-webkit-border-bottom-left-radius',
'-moz-border-radius-bottomleft',
'-o-border-bottom-left-radius',
'border-bottom-left-radius',
),
}

ALL_CSS_DICT = flat_css_dict()
COLOR_PROPERTY = set(p for p, v in ALL_CSS_DICT if v == '<color>')
UNITS_PROPERTY = set(p for p, v in ALL_CSS_DICT if v.startswith('.'))

def align_prefix(prefix):
"""Если есть префиксы, сделать шаблон с правильными отступами"""
prefix_list = VENDOR_PROPERTY_PREFIXES.get(prefix, [])
if prefix_list:
# TODO: считать max_length при инициализации VENDOR_PROPERTY_PREFIXES
max_length = max(len(p) for p in prefix_list)
# TODO: сделать сортировку по размеру значений в prefix_list
return tuple((' '*(max_length-len(p))) + p for p in prefix_list)
return (prefix,)

def color_expand(color):
color = color.upper()
if len(color) == 1:
if color == '#':
color = ''
else:
color = color * 3
elif len(color) == 2:
if color[0] == '#':
color = color[1] * 3
else:
color = color * 3
elif len(color) == 3:
if color[0] == '#':
color = color[1:] * 3
else:
color = color
elif len(color) == 4:
if color[0] == '#':
color = color[1:]
else:
return color
elif len(color) == 6:
pass
elif len(color) == 7:
return color
else:
return color
return '#{0}'.format(color)

def length_expand(value):
m = re.search(r'([a-z%]+)$', value)
if m is not None:
UNITS = {'p': 'px', 'pe': '%', 'e': 'em'}
pre_unit = m.group(1)
unit = UNITS.get(pre_unit, pre_unit)
value = value[:-len(pre_unit)]
else:
if value:
unit = 'px'
else:
unit = ''
if '.' in value:
unit = 'em'
try:
# if value is 0
if not int(value):
unit = ''
except ValueError:
pass
return '{0}{1}'.format(value, unit)

def make_template(property_, value='', is_num=False, important=False, whitespace=' '):
if property_ in COLOR_PROPERTY:
value = color_expand(value)
elif property_ in UNITS_PROPERTY:
value = length_expand(value)
# print value, property_
property_ = align_prefix(property_)
car_template = '{0}:' + whitespace
if not value:
raw = car_template + '${{1}};${{0}}'
if important:
raw = car_template + '${{1}} !important;${{0}}'
# print raw, 'raw'
template_i = (raw.format(prop) for prop in property_)
else:
if value == '#':
raw = car_template + '{1}${{1}};'
else:
raw = car_template + '{1};${{0}}'
if important:
raw = car_template + '{1} !important;${{0}}'
# raw = '{0}: {1} ;${{0}}'
# print value, 'value'
# print raw, 'raw'
template_i = (raw.format(prop, value) for prop in property_)
return '\n'.join(template_i)

if __name__ == '__main__':
print make_template('box-shadow', '', False, True)

# TODO
# display: -moz-inline-box;
# display: inline-block;

# background-image: -webkit-linear-gradient(top,rgba(255,255,255,0.6),rgba(255,255,255,0));
# background-image: -moz-linear-gradient(top,rgba(255,255,255,0.6),rgba(255,255,255,0));
# background-image: -o-linear-gradient(top,rgba(255,255,255,0.6),rgba(255,255,255,0));
# background-image: linear-gradient(top,rgba(255,255,255,0.6),rgba(255,255,255,0));

0 comments on commit 81fe1b3

Please sign in to comment.