Честно говоря, я понимаю закрытия отлично кроме, я никогда не соглашался с тем, что точно является вещью, которая является "закрытием" и что является так "закрытием" об этом. Я рекомендую бросить искать любую логику позади выбора термина.
Так или иначе, вот мое объяснение:
def foo():
x = 3
def bar():
print x
x = 5
return bar
bar = foo()
bar() # print 5
идея ключа А здесь состоит в том, что функциональный объект, возвращенный из нечто, сохраняет рычаг к локальному var 'x' даже при том, что 'x' вышел из объема и должен быть более не существующим. Этот рычаг к самому var, не только значение, которое var имел в то время, поэтому когда панель называют, это печатает 5, не 3.
Также быть ясным, что Python 2.x ограничил закрытие: нет никакого способа, которым я могу изменить 'x' в 'панели', потому что запись 'x = bla' объявила бы локальный 'x' в панели, не присвоилась бы к 'x' нечто. Это - побочный эффект assignment=declaration Python. Для обхождения этого Python 3.0 представляет нелокальное ключевое слово:
def foo():
x = 3
def bar():
print x
def ack():
nonlocal x
x = 7
x = 5
return (bar, ack)
bar, ack = foo()
ack() # modify x of the call to foo
bar() # print 7
Это должно помочь вам начать:
#!/usr/bin/env python
import cssutils
PATH_TO_CSS_FILE = 'old_huge_css_file.css'
LAYOUT = ('display', 'width', 'height', 'margin', 'padding',
'position', 'top', 'left', 'bottom', 'right')
COLOR = ('color', 'background', 'border', 'background-color')
FONTS = ('font', 'font-size')
def strip_styles(infile_path, outfile_path, properties_to_keep):
stylesheet = cssutils.parseFile(infile_path)
for rule in stylesheet:
if not rule.type == rule.STYLE_RULE:
continue
[ rule.style.removeProperty(p) for p in rule.style.keys()
if not p in properties_to_keep ]
f = open(outfile_path, 'w')
f.write(stylesheet.cssText)
f.close()
segments = (
('layout.css', LAYOUT),
('color.css', COLOR),
('fonts.css', FONTS),
)
for segment in segments:
strip_styles(PATH_TO_CSS_FILE, *segment)
Вам понадобится CssUtils
И, очевидно, я не заполнил кортежи в начале всеми возможными свойствами css. Я оставлю это в качестве упражнения читателю
примечание : все комментарии будут оставлены в таблице стилей, даже если многие из них не будут относиться к разделенным стилям.
Кроме того, все стили не перечислены в переменных LAYOUT
, COLOR
и FONTS
вверху будет отфильтрована.
Вы можете легко изменить функцию strip_styles
, чтобы отфильтровать стили в этих трех переменных, чтобы создать 4-ю таблицу стилей, содержащую все разное. свойства, если вам нравится
Брось свой. Правильный CSS не должен быть очень сложным для синтаксического анализа.
}
{
, - это селектор {
по ;
, чтобы получить каждое отдельное правило для каждого селектора Полу-псевдо-код VB.NET ...
Dim CssFile as String = System.IO.File.ReadAllText("MyFile.css")
Dim CssRules as String() = CssFile.Split("}")
For Each Rule as String in CssRules
Dim Selector as String = Rule.Substring(0, Rule.IndexOf("{")).Trim();
Dim Styles as String() = Rule.Substring(Rule.IndexOf("{") + 1).Trim().Split(";");
For Each Style as String in Styles
If Style.StartsWith("font") Then
' Build your files... yada, yada, yada
End If
Next
Next
I don't know of any methods that will separate out your css automatically, but the Blueprint CSS framework has this already broken out for you & in times past I've just plugged in my styles where needed & it took care of all the misc browser differences.
www.blueprintcss.org
Похоже на полезный инструмент, я думал, что он уже существует, но ничего не нашел.
Я думаю, вам, вероятно, нужно будет его создать. Для этого вы, вероятно, можете использовать одну из многих существующих библиотек или программ синтаксического анализатора CSS.
Быстрый поиск обнаруживает несколько библиотек в .NET, Java, Ruby и т. Д. На StackOverflow есть даже вопросы по этому поводу.
1149554]
За последние месяцы я сделал два больших проекта с несколькими стилями.
В одном случае на странице были разные цвета и стили. В другом случае некоторые цвета и изображения были другими для целевых групп.
Я создал таблицу стилей main.css , которая содержала позиционирование, шрифты по умолчанию, интервалы и все остальное, что вы ожидаете от таблицы стилей. Затем для каждой целевой группы я создал дополнительную таблицу стилей, содержащую определенные цвета, шрифты и (фоновые) изображения.
В вашем случае, создавая структуру, я бы, по крайней мере, предложил следующие компоненты:
Следует помнить о количестве HTTP-запросов, которые вы делаете, вызывая другие таблицы стилей. По возможности используйте как можно меньше таблиц стилей.
Следует помнить о количестве HTTP-запросов, которые вы делаете, вызывая другие таблицы стилей. По возможности используйте как можно меньше таблиц стилей.
Следует помнить о количестве HTTP-запросов, которые вы делаете, вызывая другие таблицы стилей. По возможности используйте как можно меньше таблиц стилей.
Вот как бы я это сделал:
Для шага 2, вы можете сэкономить много времени, используя поиск / замену в редакторе, таком как Notepad ++. Например, в layout.css вы можете выполнить поиск по регулярному выражению для ^. * Background:. + $
и ничего не заменить. (Затем в конце удалите все пустые строки.)
Теоретически вы сможете уменьшить это количество до пары регулярных выражений на файл, но Notepad ++, похоже, не любит вертикальную черту или круглые скобки в этом отношении. ^. * Background (-color | -image)?:. + $
должно работать, но это не так.
Это не программно, но TBH к тому времени, когда вы написали ваш собственный код, чтобы делать то, что вы
У вас есть grep в командной строке? Вы заботитесь о комментариях в выводе? Можете ли вы сделать первый проход, чтобы очистить форматирование? Например, в выбранном вами редакторе убедитесь, что за {
, }
и ;
следует новая строка. Тогда это может вас закрыть:
grep -i '[{]\|[}]\|background\|border\|color' source.css > color.css
grep -i '[{]\|[}]\|font\|letter\|line-height' source.css > font.css
grep -v 'background\|border\|color\|font\|letter\|line-height' source.css > layout.css
Вам придется внести изменения, если вы не хотите использовать какие-либо из следующих тегов в layout.css: outline - *
, text- *
, пробел
, межсловный интервал
. Это если ваш CSS использует их. Я бы также быстро посмотрел, какие теги вы на самом деле используете. Например,
grep -v '[{]\|[}]' test2.css | sed -e 's/:.*$//g' | sort -u
Действительно легко создать собственный сценарий. Здесь библиотека для css на Ruby, я уверен, что вы сможете найти ее на любой платформе, которую используете
Самая простая часть - это синтаксический анализ CSS. Сложная часть - это классификация различных директив CSS и предвидение сокращенных селекторов CSS.
CSSTidy может быть билетом с некоторыми изменениями. Он не только анализирует CSS, но и по возможности объединяет свойства CSS:
* Split the entire file by }
* In each of those, what comes before the { is the selector
* Split what comes after { by ; to get each individual rule for each selector
* Evaluate each rule and build your files accordingly
Задумывались ли вы об использовании программы, которая позаботится о CSS, вместо того, чтобы вручную просматривать и редактировать все это самостоятельно? Недавно я начал использовать стилизатор , и я впечатлен всеми функциями, которые он имеет (даже в бесплатной версии). Хотя, насколько я могу судить, он не разделит файлы CSS так, как вы хотите.