Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » Обработка css

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

AZJIO



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мы тут в теме увлеклись парсером для css, уже третья страница пошла, так что пусть это будет отдельная тема.
 
Итак, вот мой css_tidy (сжатие/разжатие/коррекция) upload.ee, яндекс
 
   
 
Также при обсуждении я упомянул, что есть парсер jsBeautifier.js для AkelPad.
 
И доработанный питоновский код от TheBarmaley.
 
Добавлено:
TheBarmaley

Цитата:
допилить обработку (при разжатии) вложенных условных правил

регвырами это невозможно, так как число отступов это генерируемый элемент, но питон как программный язык должен уметь сделать посимвольный разбор. При открытии скобки добавляем переменную отступа, при закрытии вычитаем. В начало каждой строки вставляем вычисленный отступ.

Цитата:
должна быть определённая "дуракоустойчивость"

Это также закладывается как и с регвырами, например если я "открыл" кавычку и не нахожу закрывающую до конца строки, то сбрасываю флаг поиска закрывающей кавычки на конце строки. Разбор данной строки не происходит, так как непонятно где закончились кавычки и начался код. К тому же я в этой ситуации добавляю +1 к переменной Error, чтобы вывести сообщение о незакрытой кавычке. Можно было бы это сделать и для незакрытых скобок, так как я обрабатывал пример как раз-таки с отсутствующей скобкой и у меня просто последняя строка оказалась с отступом, что невозможно в нормальных условиях.
 
Кстати, неизвестно как ваш скрипт поведёт себя если я вставлю в текстовую строку операторы, например "путь_к_({;)}@'[:]/\::_файлу", в Linux многие операторы могут быть частью имени, в отличии от Windows, а сервера часто на Linux, хотя вряд ли такие пути будут использоваться. Возводить регвыр в культ устойчивости сомнительное утверждение.
 

Цитата:
спасибо, но как-нить в другой раз.. я про "скомпилировать". ещё и с этим разбираться - не-не, я против..))
мне б свой скриптик допилить бы и закрыть вопрос, и так уже неделю почти колупаюсь..))  

три раза ха, вы можете в том же PureBasic использовать регвыр, тупо перенеся регвыры в программный код, питон это тоже код питона. В данном случае даже не придётся ставить плаг питона в Notepad++.

Всего записей: 4559 | Зарегистр. 03-05-2006 | Отправлено: 18:01 04-09-2024 | Исправлено: AZJIO, 18:15 03-10-2024
TheBarmaley



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
первым буду, за мной не занимать!    


AZJIO
Цитата:
регвырами это невозможно, так как число отступов это генерируемый элемент, но питон как программный язык должен уметь сделать посимвольный разбор. При открытии скобки добавляем переменную отступа, при закрытии вычитаем. В начало каждой строки вставляем вычисленный отступ.
не буду спорить. лень.
а насчёт отступа у меня уже есть идейки. именно с применением "выров"..
вопчем, пока этот вопрос открыт, я не хочу до поры агакать/некать..

Цитата:
неизвестно как ваш скрипт поведёт себя если я вставлю в текстовую строку операторы, например "путь_к_({;)}@'[:]/\::_файлу", в Linux многие операторы могут быть частью имени, в отличии от Windows, а сервера часто на Linux, хотя вряд ли такие пути будут использоваться
ключевое выделил. мы ведь не голую "теорию" обсуждали, но вполне конкретную реализацию вполне конкретной задачи.
и универсального решения тоже быть не может, по определению. бо всегда найдётся тот самый "хитрый болт с левой резьбой"..)
..кстати, ты только что дал пример вполне конкретного регэкспа, может, когда и сгодится..  

Цитата:
Возводить регвыр в культ устойчивости сомнительное утверждение
так никто и не возводит. речь о подходящем (под задачу) методе, молиться на регэкспы смысла нет. равно как и на "линейность"..))

Цитата:
три раза ха, вы можете в том же PureBasic использовать регвыр, тупо перенеся регвыры в программный код, питон это тоже код питона.
да хоть четыре..) в смысле - ха.. я ж говорю - я НЕ работал с васиком, НЕ имею представления, как и что там делать.
соответссно - НЕ имею желание изучать некоего "сфероконя" только потому, что (может быть!) этот конь мне пригодится, для чего - хз..)

Цитата:
В данном случае даже не придётся ставить плаг питона в Notepad++
он уже стоит. и работает. и я уже потратил время на его изучение и понял, что мне это подходит под мои задачи.
поэтому что-то ещё "тестить" я не вижу смысла, ну а коль сменится задача - вот тогда и буду менять и "инструмент", делов-то...)
 
Добавлено:

Цитата:
При открытии скобки добавляем переменную отступа, при закрытии вычитаем
..угу.. особенно - если учесть, что оная скобка запросто может быть и внутри камента..)
ненуачо, рубим же линейно, фигли нам анализ контекста...)) который как раз регэкспами и делается..)


----------
..the one of.. ··· ..sam-&-pol..

Всего записей: 17806 | Зарегистр. 07-06-2006 | Отправлено: 20:07 04-09-2024
AZJIO



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheBarmaley

Цитата:
запросто может быть и внутри камента

да, но если делать посимвольный разбор, то когда мы идём от начала файла по символам, то при попадании на комент, тупо запускаем цикл поиска конца комента. Как и любой анализатор будь то Scintilla или браузер, он также столкнувшись с коментом ищет его окончания и если его не будет, то весь код уйдёт в комент, так что дуракоустойчивость не сработает. Нашли завершение комента, выпрыгиваем из цикла поиска и продолжаем внешний цикл перебора символов. В данном случае мы пропускаем комент, неважно что в нём было. Аналогично и с кавычками. Но опять же можно попробовать как поведёт себя анализатор Scintilla/браузер на сбойном коде, возможно перенос строки не будет являться сбросом кавычек, если так, то нам опять нет смысла применять дуракоусточивость, если сам браузер это не применяет. В HTML тоже незакрытый тег может до конца файла применить его свойство, например если забыл закрыть жирный текст, то весь текст от открытия тега до конца документа жирный и сразу понятно где забыл закрыть (с css не проверял).
 
В итоге я лишь предложил, если проще на регвыр, то оставить его, но часть вещей можно сделать на посимвольном разборе. То есть прошёлся по тексту, получил итоговый, а потом обработал регвыром, или наоборот, одно другому не мешает.
 
Погугли "Лексический анализатор синтаксиса на python". По факту придётся вникать в сам язык. Я на нём мало практиковался и анализатор точно не делал, поэтому подсказать не могу, а по PureBasic могу всё подсказать, хоть регвыр дать в виде готового кода, хоть посимвольный анализатор.
 
Что-то мне по запросу попадается токенезаторы ))), суть в следующем: код разбивается по элементам кода в массив, то есть класс как слово, комментарии как блок, строки в кавычках, строки в апострофах, операторы {}()[];:  и т.д. потом пробегаясь по элементам и составляя их в последовательность мы можем вставить перед ним или после него пробелы, табуляции, переносы строк. Вот пример регвыр токенизатора, который я оптимизировал для PureBasic. Суть в том, что когда мы соединим элементы массива мы получим исходный код в оригинале. А в массиве он разделён на логические участки кода.

Всего записей: 4559 | Зарегистр. 03-05-2006 | Отправлено: 20:32 04-09-2024 | Исправлено: AZJIO, 21:01 04-09-2024
TheBarmaley



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AZJIO
Цитата:
....где забыл закрыть (с css не проверял).  
та же фигня. с незакрытыми (или косячными "завершениями" иногда сложно бороться - код (вроде как)) работает нормально, но появляются непонятки в неожиданных местах - особенно, если накосячено с вложенными условиями..
 
и здесь уже нужен анализатор посерьёзнее* чем для задачки сжать/разжать, самое простое - проверить код на сайтах-валидаторах.
во всяком случае, после прогона через валидатор в3с ошибки (практически) всегда становятся "видимыми".
 
* поэтому я даже не хочу лезть в эти глубины и "грызть гранит" теории, не нужно это в "локальном исполнении", проще онлайн..)
 
по остальному - без комментариев. не хочу вдаваться в детали, под начальную задачку оно никаким боком не нужно.
что до обработки "поблочно" - ну так "регвыр" фактически те же яйца - маска ведь проверяется построчно (или по границам "от" "до")..

----------
..the one of.. ··· ..sam-&-pol..

Всего записей: 17806 | Зарегистр. 07-06-2006 | Отправлено: 03:10 05-09-2024
AZJIO



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добавил компиляцию в Linux

Всего записей: 4559 | Зарегистр. 03-05-2006 | Отправлено: 17:24 06-09-2024
AZJIO



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обновил свой парсер, ссылка в шапке.
Объединил сжатие и разжатие/коррекция в один css_tidy.exe.
ком-строка "флаг путь_исходный путь_назначения". По умолчанию коррекция, но если флаг 1, то сжатие. К сжатию может быть добавлен флаг 128, чтобы не удалять комментарии. Подробнее в Readme.txt.

Всего записей: 4559 | Зарегистр. 03-05-2006 | Отправлено: 07:27 20-09-2024 | Исправлено: AZJIO, 07:28 20-09-2024
TheBarmaley



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AZJIO
Цитата:
Обновил
попробовал х86: чего-то он не алё.. как ни тыкал, как не менял флаги - не хочет выходной файл создавать..
т.е. независимо от комстроки/флагов - диалоги открытия/сохранения есть, а вот самого результата (файла) нифига нету.
чяднт?

----------
..the one of.. ··· ..sam-&-pol..

Всего записей: 17806 | Зарегистр. 07-06-2006 | Отправлено: 06:19 22-09-2024
AZJIO



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheBarmaley
Исправил, перекачай.
У меня была проверка существования файла назначения, и я преобразовывал в существующий файл и проблем не было, а в несуществующий завершался отменой, так как файл не существует. Теперь нормально. Но  всё же сделал проверку папки, куда помещается результат, если папки нет, то завершение проги,  но сам код пытается её создать.
 
Для AkelPad вот команды для меню:

Код:
"css_tidy_gui" Exec(`"%a\AkelFiles\Tools\css_tidy.exe" 512 "%f" "%f"`) Icon("%a\AkelFiles\Tools\css_tidy.exe")
"css_tidy_сжатие" Exec(`"%a\AkelFiles\Tools\css_tidy.exe" 1 "%f" "%f"`) Icon("%a\AkelFiles\Tools\css_tidy.exe")
"css_tidy_коррекция" Exec(`"%a\AkelFiles\Tools\css_tidy.exe" 0 "%f" "%f"`) Icon("%a\AkelFiles\Tools\css_tidy.exe")

но это команды для эксперимента, так как они преобразуют в тот же файл.
 
Перезалил, добавлен флаг 512 - открыть GUI для изменения настроек преобразования.

Всего записей: 4559 | Зарегистр. 03-05-2006 | Отправлено: 09:34 22-09-2024 | Исправлено: AZJIO, 10:43 22-09-2024
TheBarmaley



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AZJIO
Цитата:
Исправил
угу. теперь норм. по шустрости - тоже норм, "на глаз" ему без разницы размер исходника..
особо не гонял, но проверил на проблемки с поеданием пробелов - вроде норм, энд/ор промеж )( на месте, +/- в калк() тоже..)
 
ну и по сжатию. сравнил пожатое тиди и текущей версией питоновского форка - форк даже с каментами сжал чуть лучше.
различия на большом объёме "кирпича" особо не стал искать, но на 412к исходного получил разницу в +300 байт не в пользу тиди..
т.е. после питона = 395964, после тиди = 396211. причём, это с учётом "лишних" 54 байтов каментов в обработанном скриптом.
хотя, повторюсь, по шустрости ехешник вне конкуренции..))
 
причина разницы - да хз, непожатый уже был обработан скриптом, т.ч. всякие конверсии нулей и цветов тут роли уже не сыграли.
а вот неудалённые пробелы перед ! - вполне (их там набралось почти на всю разницу (аж 288 байт)). остальное не стал искать, нудно..
понятно, это копейки, в общем-то, но я бы в алгоритм тиди снос пробелов перед !импортантами всё же добавил бы..

----------
..the one of.. ··· ..sam-&-pol..

Всего записей: 17806 | Зарегистр. 07-06-2006 | Отправлено: 21:49 22-09-2024
AZJIO



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheBarmaley
Обновление
Адаптация для Linux
Исправление для "}", устранён лишний перенос при повторном использовании коррекции.
Добавлено манипуляция с предшествующим пробелом для !important
Добавлена иконка
Добавлены флаги в общий флаг, чтобы использовать их в ком-строке.

Всего записей: 4559 | Зарегистр. 03-05-2006 | Отправлено: 10:23 23-09-2024 | Исправлено: AZJIO, 10:27 23-09-2024
TheBarmaley



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AZJIO
Цитата:
Обновление
проверил на том же "большом" цсс - норм, теперь тиди (без учёта каментов) практически сравнялся со скриптом..))
разница +13 байт в тиди осталась (395923 > 395964-54), но это уже на уровне "статпогрешности", не стал искать причину..
вопчем, теперь тиди вне конкуренции по компрессии (за счёт скорости))..  

----------
..the one of.. ··· ..sam-&-pol..

Всего записей: 17806 | Зарегистр. 07-06-2006 | Отправлено: 11:46 23-09-2024
AZJIO



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheBarmaley
Обратил внимание что после строки начинающееся с тире, например -webkit следующая строка идёт с добавленным отступом (в оригинале с сайта). Сравнил оригинал 150кб с обработанным. Сделал доводку методом замены, например в оригинале последний параметр с ";" из-за чего трудно отслеживать, а когда подгоняешь, то мусор убирается и выявляются больше полезных отличий. Замена регвыром ;(\n\t*\}) на \1, чтобы удалить ";". Также пробельные отступы заменил на табуляцию.
 
Ты тоже можешь сравнить заменив "{" и "}" на сами себя с переносом строки, тогда это не будет одной строкой и WinMerge покажет места где можно сделать доводку.
Мне сейчас единственное что можно улучшить - сделать для скобок правило: если пробел, то он может быть полезным, а если перенос, то удалить его. И ещё правило просмотра вперёд, если после скобки и пробела идёт ";", то пробел можно удалить, а если иное, то это может быть полезный пробел.
 
rgb(0,0,0) - минимальная длина 10 символов
#000000 или #000 - длина 4-7 символов
так что если додавливать байты, то можно и тут на каждом цвете по 3-6 символов выйграть.

Всего записей: 4559 | Зарегистр. 03-05-2006 | Отправлено: 12:49 23-09-2024 | Исправлено: AZJIO, 13:21 23-09-2024
TheBarmaley



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AZJIO
Цитата:
после строки начинающееся с тире, например -webkit следующая строка идёт с добавленным отступом
смотря где оно - если внутри правила - отсуп = хрень, это обычная декларация (напр., трансформ = -моз-/-вебкит-трансформ).
а если в селекторе - то должно стоять ещё и двоеточие перед -моз/-вебкит - это нестандартные псевдо-элементы.
во втором случае должны быть правила внутри {} после нестандарта и вот только тогда - да, должен быть отступ..

Цитата:
можешь сравнить заменив  
угу, тоже была такая мысля, но пока не проверял плотно разницу между скриптом и тиди..
 
про "додавливание" - вопрос интересный, где-то (если дезигнер любитель ргб)) будет выигрыш, но в основном - вопрос спорный.
хз как/кому, но я, к примеру, изначально привык в хекс-колорах делать, так проще.. и, опять же, стараюсь в 3 буквы уложиться..)
ну и таки да - кроме* голого ргб есть ведь ещё и ргба и прочие смук/хлс, их тоже можно в восьми/четырёхзнак переводить..  
 
* ...а шоб уж совсем заморочиться - а ещё есть "натурные" названия цветов (блэк/ред и т.д.) - но тут без таблицы перегона уже никак..))

----------
..the one of.. ··· ..sam-&-pol..

Всего записей: 17806 | Зарегистр. 07-06-2006 | Отправлено: 19:19 23-09-2024
AZJIO



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheBarmaley
Добавлен флаг 16 - Преобразовать rgb(x,x,x) в #hex
 

Цитата:
стараюсь в 3 буквы уложиться

поддержано, то есть rgb(51, 51, 51) преобразуется в #333 и т.д.
 
смук и прочее редко встречаю, rgba содержит дробную часть, причём высокой точности, и скорее всего преобразовать в #rrggbbaa не получится. Нашёл онлайн конверторы, которые возвращают #rrggbbaa, но будет ли это работать? Последний параметр от 0.00 до 0.999 в каком то смысле это процент, который возвращает диапазон 00-FF

Всего записей: 4559 | Зарегистр. 03-05-2006 | Отправлено: 03:28 24-09-2024 | Исправлено: AZJIO, 05:10 24-09-2024
TheBarmaley



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
..на всякий случай - к вопросу о "ловле копеек" и "додавливании байтов"..  
 
вопчем, на том же самом 400к-цсс после прохода текущей версией стало меньше ещё на 186 байт: 395778 вместо 395964..
естессно, это с теми же самыми "лишними" 54 байтами каментов..)
 
больше, видимо, из этого файлика уже ничего не отжать (кроме каментов, понятно), только ручной зачисткой "говнокода"..)))

----------
..the one of.. ··· ..sam-&-pol..

Всего записей: 17806 | Зарегистр. 07-06-2006 | Отправлено: 23:35 30-09-2024
TheBarmaley



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
..ещё чуток подрихтовал скрипт-минимаксер цсс..  
 
запустил, было, в "прод", но столкнулся со шнягой - парочка литералов попортилась - у меня это были "контент:....." с запятыми..
пришлось допилить обработчик, чтобы совсем исключить литералы из процесса (потом они возвращаются "как-есть" на место).
 
заодно теперь гарантируется сохранность "хитросделанных" путей в литеральных урлах:
Цитата:
например "путь_к_({;)}@'[:]/\::_файлу",
пример подобной "колбасы" (ещё и с пробелами)) добавил в тестовый цсс (в комплекте со скриптом), всё ровно вроде..))

----------
..the one of.. ··· ..sam-&-pol..

Всего записей: 17806 | Зарегистр. 07-06-2006 | Отправлено: 09:01 04-10-2024
TheBarmaley



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
продублирую здесь - ещё немножко подправил код скрипта минимаксера..
 
теперь и в импорт-урлах правильно обрабатываются ссылки с ";", недосмотрел вчера..)
осталась одна проблемка (не баг, но "фича")) - не получается одинаково "феншуйный" вывод при разных настройках..
впрочем, оно и по логике так и должно быть, универсального набора параметров на все случаи всё равно нет и не будет..
 
в частности - нереально предусмотреть ВСЕ моменты при обработке комментариев, там ведь всё что угодно может быть..)
ну да, можно усложнить код и сохранять текстовые каменты "эз-из", но как по мне - не айс это, гемор есть, а смысл околонулевой..

----------
..the one of.. ··· ..sam-&-pol..

Всего записей: 17806 | Зарегистр. 07-06-2006 | Отправлено: 12:57 05-10-2024
TheBarmaley



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
продублирую - ещё подшаманил код минимаксера..
 
вроде как совсем решил "болячку" с кривыми "ёлочками" в многоэтажных правилах, теперь ровно независимо от "этажности"..))
 
попутно по теме - в качестве ещё одной точки "боротьбы за копейки" сделал опции удаления "screen" в @media + конверт "or" в ","..
ну и под новые цсс - мах/мин-шир/выс в ш/в <=> + диапазоном (если возможно). тоже опция - не работает на старых браузерах..
 
Добавлено:
..насчёт:
Цитата:
мах/мин-шир/выс в ш/в <=> + диапазоном (если возможно).
например:
Цитата:
@media only screen and (max-width: 360px) and (orientation: portrait) or (max-height: 360px) and (orientation: landscape)
станет в компрессоре:
@media(width<=360px)and (orientation:portrait),(height<=360px)and (orientation:landscape)
или вот такое:
Цитата:
@media only screen and (min-width: 320px) and (max-width: 760px) and (orientation: landscape)
станет существенно короче:
@media(320px<=width<=760px)and (orientation:landscape)
..правда, в совсем древних движках рэндж не поддерживается, но это уже на совести стилеписца будет ..)))

----------
..the one of.. ··· ..sam-&-pol..

Всего записей: 17806 | Зарегистр. 07-06-2006 | Отправлено: 13:18 31-10-2024
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » Обработка css


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru