Skip to content

Instantly share code, notes, and snippets.

@ai

ai/parsers.md Secret

Last active February 1, 2019 13:56
Show Gist options
  • Select an option

  • Save ai/65e23d9185c60d60c87f to your computer and use it in GitHub Desktop.

Select an option

Save ai/65e23d9185c60d60c87f to your computer and use it in GitHub Desktop.

1. «stylelint больше про пробельчики…»

Styline содержит много плагинов для работы с пробелами и стилем кода, но это не инструмент только для проверкаи стиля. В Stylelint 54 и 101 плагина не связаны с пробелами.

2. «Я считаю, что парсер не должен оставлять необходимости парсить что-то дополнительно»

Я понимаю, что у тебя более узкая задача — парсить станартный CSS 3. Но, если мы говорим про универсальный AST для CSS, то невозможно сделать парсер, после которого никогда не нужно будет ничего парсить. Например, в «CSS4» добавили «<=» токен в медиа-выражения. Полифилы — это стандартная задача для AST и тут всё равно придётся допарсивать самому.

Плюс, если мы говорим о PreCSS и других кастомных синтаксах — то там новых токенов будет ещё больше.

3. «Парсят разные части сами, как и большинство плагинов, что ненадежно… Универсальностью не пахнет, извини»

Критерий типов инструментов должен быть максимально простой и чёткий, чтобы мы не перерастали в бессмысленный терминологический спор, мешая пользователям нормально понять разницу между инструментами. Для «универсельного инструмента анализа AST» критерий должен быть близок к термину — то есть практическая возможность создать широкий класс инструментов.

Проблема в том, что можно бесконечно находить очередную функцию и обвинять другие инструменты, что они «не настоящие».

Например, парсер Rework и StyleCow не сохраняет пробелы — это очевидно мешает создать целый класс линтеров. Но у меня не подниметься язык говорить, что они не универсальный CSS инструмент.

С другой стороны, в PostCSS мы на практике поняли, что для создания линтеров очень важно иметь канал передачи сообщений от плагина к плагину. Без этого, опять же, нельзя легко создать много инструментов для линтеров (например, вывод ошибок прямо в браузер). Но точно так же, мне не придёт в голову называть все инструменты (наверянка твой будущий проект не имеет это пока) без этой фичи «не настоящими».

4. «то что он популярен и используется большим кол-вом вещей, которые дают удовлетворительный результат - факт»

Я понимаю, что у тебя другой вззгляд на AST. Но «Удовлетворительный» в отсылке ко всем инструментам — это было грубо и непрофессионально. Автопрефиксер или RTLCSS дают лучший результат в индустрии.

5. «Он же даже селекторы и значения не парсит, не говоря уже про другие детали ;)»

Я понимаю, что у тебя другой взгляд. Но нашего подхода имеются разумные причины. Клеймить его — непрофессиональное поведений.

Само собой, я согласен, что нужно парсить селекторы и значений. Но мы вынесли это в отдельные парсеры по серьёзным причинам. У PostCSS уже много плагинов, и любые изменения AST будут ломать совместимость. Поэтому, именно в рамках PostCSS, выгоднее провести эксперименты вне ядра, чтобы иметь возмоность ломать API.

У PostCSS есть идея, что AST должен иметь удобный API. И тут мы совсем не зря создали сторонние парсеры. Дело в том, что формат параметров директив и значений может быть очень любой. И даже если говорить о стандартных значениях, то там ещё интересный вопрос — как их правильно представить. Например, дерево postcss-value-parser оказалось не очень удобное.

Задача ещё сильно отягащается тем, что мы хотим узнать, что будет происходить в CSS-in-JS мире. Подключаемые парсеры для селекторов и значений, позволяют нам держать размер ядра небольшим, сохраняя возможность использовать PostCSS на клиенте без особых страданий.

6. «И тут мы, видимо, расходимся во мнениях. Но разве на это стоит обижаться?»

Я обижаюсь не на то, что ты говоришь, что у PostCSS неудобный для минификатора парсер.

Главная проблема PostCSS сейчас — то, что все думают только о примесях и препроцессорах. Поэтому я трачу очень много времени, объясняя, что PostCSS — это универсальный инструмент для изменения/анализа CSS.

Когда ты на WSD говоришь, что «нормального инструмента для изменения/анализа CSS нет» — ты говоришь очень спорное суждение. Пример твита, с которого всё началось, показывает, что люди действительно поняли, что PostCSS не является этим типом инструмента.

Преставь себе на месте автора Sass, если бы я на конференции и в Твиттере говорил бы, что «нормального инструмента для CSS-прерпоцессинга нет».

7. «„черный пиар”, „ложь” вот к чему это все?»

Извини, если я тебя обидел — согласен, что они не очень хорошо подходят для описания. Я не вкладывал в эти слова эмоциональную окраску. Это не более, чем попытка сжать текст под ограничения длины Твиттера. Я использовал эти слова, только в прямом значении.

PostCSS — очевидно используется как парсер CSS и прекрасно (а не удовлетворительно) решает определённые задачи. Говорить, что такого инструмента нет — не правда, то есть ложь.

«Чёрный пиар» я использовал не в значении особознанного действия. А в том смысле, что пытаясь прорекламировать свой продукт, ты используешь неправильные способы очернения конкурементов. Говоришь, что «нормальных парсеров нет».

8.

Мне очень нравится твой проект и у тебя был отличный доклад. Меня именно смущает твоя агрессивная и эмоциональная позиция по поводу PostCSS (это нормально критиковать наш парсер, но говорить, что мы является универсальным AST-парсером и имеем только удовлетворительнеы плагины — неправда).

Мы же отлично проводили время и я не ищу конфронтации с тобой. Меня задевает только две вещи:

  1. Что сейчас слушатели конфы думают, что PostCSS — это про примеси, а не универсальный AST для создания любых CSS инструментов.
  2. Что твоя публичная позиция непрофессиональная и приводит к невыгодной всем конкуренции. Как, например, терминологический войне за то, какие именно функции должны быть в «нормальном» инструменте.
@SelenIT

SelenIT commented Dec 14, 2015

Copy link
Copy Markdown

Как невольный со-виновник драмы, чувствую потребность поучаствовать в возвращении темы в конструктивно-техническое русло.

Я понимаю, что у тебя более узкая задача — парсить станартный CSS 3. Но, если мы говорим про универсальный AST для CSS, то невозможно сделать парсер, после которого никогда не нужно будет ничего парсить. Например, в «CSS4» добавили «<=» токен в медиа-выражения.

Насколько я вчера понял по докладу, задача ставилась как раз «парсить по стандарту СSS вообще». И как раз мой первый вопрос к Роману был в том, что именно считать таким стандартом (что-то типа такого, совокупность текущих редакторских черновиков новейшего уровня, что-то другое).

Причем, насколько я понимаю, проблема-то актуальна даже для W3C, чей «официальный CSS-валидатор» тоже не в состоянии угнаться за меняющейся грамматикой языка (напр.). Так что парсер, который «официально» можно было бы считать референсным, будет необходим всем, включая разработчиков самих стандартов. Может — идея чисто в порядке мозгового штурма, простите если бредовая — есть смысл привлечь хотя бы к тестированию кого-то из рабочей группы CSS, того же Таба Аткинса?

@lahmatiy

Copy link
Copy Markdown

1. «stylelint больше про пробельчики…»

Styline содержит много плагинов для работы с пробелами и стилем кода, но это не инструмент только для проверкаи стиля.
В Stylelint 54 и 101 плагина не связаны с пробелами.

Полная фраза была:

я все таки говорил про другое качество и глубину анализа, stylelint больше про пробельчики...

Ты понял слишком буквально, под "пробельчиками" имел ввиду оформление, то есть code-style. В stylelint за редким исключением именно такие правила (я насчитал 4-5 правил не про стиль).

Говоря в докладе про отсутствие линтеров, я уточнял, что есть для code-style, но нет для семантики и структуры (слайд). Последняя категория для CSS отсутствует как класс. В задачи такого линтера может входить:

  • проверка на соотвествие спекам и их имлементациям в браузерах, структуры селекторов, @-правил и значений
  • расположение @-правил (пример, перед @import что-то кроме @charset или @import)
  • определение дублирований и мертвого кода
  • слишком сильный селектор, ненужность !important
    и т.д.

2. «Я считаю, что парсер не должен оставлять необходимости парсить что-то дополнительно»

Я понимаю, что у тебя более узкая задача — парсить станартный CSS 3. Но, если мы говорим про универсальный AST для CSS, то невозможно сделать парсер, после которого никогда не нужно будет ничего парсить. Например, в «CSS4» добавили «<=» токен в медиа-выражения. Полифилы — это стандартная задача для AST и тут всё равно придётся допарсивать самому.

У нас разное мнение по поводу подхода к решению проблемы. Но на самом деле решение одно и то же, просто вы выносите парсеры в отдельные плагины, я считаю, что это должно быть частью самого парсера (его модулями).

Плюс, если мы говорим о PreCSS и других кастомных синтаксах — то там новых токенов будет ещё больше.

Основная задача получить парсер в первую очередь именно для CSS. Если что-то попало в спеку и было поддержано хотя бы одним браузером, значит имеет смысл расширить парсер, чтобы он поддерживал новую граматику. То есть имеет смысл парсить только то, что понимает хотя бы один браузер. Для неизвестного синтаксиса можно парсить либо по общим правилам, либо оставлять не пропарсеным. Дизайн CSS позволяет это в виду своего дизайна.

3. «Парсят разные части сами, как и большинство плагинов, что ненадежно… Универсальностью не пахнет, извини»

Критерий типов инструментов должен быть максимально простой и чёткий, чтобы мы не перерастали в бессмысленный терминологический спор, мешая пользователям нормально понять разницу между инструментами. Для «универсельного инструмента анализа AST» критерий должен быть близок к термину — то есть практическая возможность создать широкий класс инструментов.

Проблема в том, что можно бесконечно находить очередную функцию и обвинять другие инструменты, что они «не настоящие».

Например, парсер Rework и StyleCow не сохраняет пробелы — это очевидно мешает создать целый класс линтеров. Но у меня не подниметься язык говорить, что они не универсальный CSS инструмент.

Я считаю, что парсер, который не позволяет создать целый класс инструментов (в данном случае линтеров, а это важный класс), нельзя назвать универсальным. У разных парсеров разные цели, и в этом случае они специализированные. Но это мое мнение.

Никто не делал объективной классификации подобных инструментов. Поэтому оба наших мнения в оценке – субъективны.

С другой стороны, в PostCSS мы на практике поняли, что для создания линтеров очень важно иметь канал передачи сообщений от плагина к плагину. Без этого, опять же, нельзя легко создать много инструментов для линтеров (например, вывод ошибок прямо в браузер).
Но точно так же, мне не придёт в голову называть все инструменты (наверянка твой будущий проект не имеет это пока) без этой фичи «не настоящими».

Я уже не раз говорил тебе лично, почему PostCSS не подходит для задач, которые перед собой ставлю. В докладе про это было крайне мало, и только ради того, чтобы не было вопроса "почему не PostCSS?". Но все равно это был первый вопрос в секции вопросов :)

4. «то что он популярен и используется большим кол-вом вещей, которые дают удовлетворительный результат - факт»

Я понимаю, что у тебя другой вззгляд на AST. Но «Удовлетворительный» в отсылке ко всем инструментам —
это было грубо и непрофессионально. Автопрефиксер или RTLCSS дают лучший результат в индустрии.

Согласен с тобой, что не стоило так широко обобщать. Я не принижаю достоинств autoprefixer или rtlcss, это крутые штуки. Когда я писал про "удовлетворительный результат" я имел ввиду многие плагины, в код которых довелось заглянуть.

Лучший результат не означает, что все идеально или правильно. Сегодня clean-css лучший минификатор CSS, судя по синтетическим тестам и популярности. Он лучший, но у него, как и у всех минификаторов есть ошибки.

5. «Он же даже селекторы и значения не парсит, не говоря уже про другие детали ;)»

Я понимаю, что у тебя другой взгляд. Но нашего подхода имеются разумные причины. Клеймить его — непрофессиональное поведений.

Само собой, я согласен, что нужно парсить селекторы и значений. Но мы вынесли это в отдельные парсеры по серьёзным причинам.
У PostCSS уже много плагинов, и любые изменения AST будут ломать совместимость. Поэтому, именно в рамках PostCSS, выгоднее провести эксперименты вне ядра, чтобы иметь возмоность ломать API.

Если послушаешь мой ответ на первый вопрос после доклада – практически то же самое я и сказал ;)

У PostCSS есть идея, что AST должен иметь удобный API. И тут мы совсем не зря создали сторонние парсеры. Дело в том, что формат параметров директив и значений может быть очень любой. И даже если говорить о стандартных значениях, то там ещё интересный вопрос — как их правильно представить. Например, дерево postcss-value-parser оказалось не очень удобное.

Задача ещё сильно отягащается тем, что мы хотим узнать, что будет происходить в CSS-in-JS мире. Подключаемые парсеры для селекторов и значений, позволяют нам держать размер ядра небольшим, сохраняя возможность использовать PostCSS на клиенте без особых страданий.

Я это понимал и раньше. Тут никаких противоречий с тем, что я говорил.

6. «И тут мы, видимо, расходимся во мнениях. Но разве на это стоит обижаться?»

Я обижаюсь не на то, что ты говоришь, что у PostCSS неудобный для минификатора парсер.

Главная проблема PostCSS сейчас — то, что все думают только о примесях и препроцессорах. Поэтому я трачу очень много времени, объясняя, что PostCSS — это универсальный инструмент для изменения/анализа CSS.

Когда ты на WSD говоришь, что «нормального инструмента для изменения/анализа CSS нет» — ты говоришь очень спорное суждение.

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

Перечитав оригинальный твит, понял, что цитата не совсем верная – думаю, проблема твитера с ограничением на длину сообщения.

Была обозначена общая проблема – нехватка инструментов. PostCSS больше про модификацию, здесь про это речи не было. Причинно-следственную связь ты уже додумал.

На WSD было вот и вот. На первом слайде, возможно чуть больше "драматизма" чем нужно, а на втором единственный спорный пункт про анализ. Это достаточно размытое определение, как видно мы разные вещи под этим понимаем. Что касается остальных пунктов, у меня пока сомнений нет.

Преставь себе на месте автора Sass, если бы я на конференции и в Твиттере говорил бы,
что «нормального инструмента для CSS-прерпоцессинга нет».

7. «„черный пиар”, „ложь” вот к чему это все?»

Извини, если я тебя обидел — согласен, что они не очень хорошо подходят для описания. Я не вкладывал в эти слова эмоциональную окраску.
Это не более, чем попытка сжать текст под ограничения длины Твиттера. Я использовал эти слова, только в прямом значении.

PostCSS — очевидно используется как парсер CSS и прекрасно (а не удовлетворительно) решает определённые задачи.
Говорить, что такого инструмента нет — не правда, то есть ложь.

Уже писал об этом выше чего "нет". Сначала нужно определиться какого "такого", а потом обвинять во лжи.

«Чёрный пиар» я использовал не в значении особознанного действия. А в том смысле, что пытаясь прорекламировать свой продукт, ты используешь неправильные способы очернения конкурементов. Говоришь, что «нормальных парсеров нет».

Додумываешь, смотри слайд и следующий слайд.

"Нет детального парсера" – никоим образом не очерняет PostCSS. PostCSS не парсит селекторы и значения, компенсируя это дополнительными парсерами, как ты сам писал. Но эти парсеры не дают достаточно деталей, не работают с source maps и т.д.

К слову, казалось бы парсер gonzales дает детальное AST, но в нем тоже недостаточно информации. Плюс оно организовано не удобно и не всегда правильно, сам парсер не эффективен (медленный и потребляем много памяти) и без source maps и т.п. Были попытки это исправить, но оказалось, что проще написать парсер с нуля.

8.

Мне очень нравится твой проект и у тебя был отличный доклад. Меня именно смущает твоя агрессивная и эмоциональная позиция по поводу PostCSS (это нормально критиковать наш парсер, но говорить, что мы является универсальным AST-парсером и имеем только удовлетворительнеы плагины — неправда).

Немного странно, что у тебя сложилось мнение об "агрессивной и эмоциональной позиции". Возможно это издержки виртуального общения. И то, что цитата не совсем точная и вырвана из контекста, как следствие разное восприятие. Я уже говорил тебе "критику" в личных встречах, и ожидал, что ты нормально отнесешься к сарказму в твитах. Видимо не угадал. Ты воспринял все слишком серьезно и близко к сердцу.

Свою оценку PostCSS

Мы же отлично проводили время и я не ищу конфронтации с тобой. Меня задевает только две вещи:

  1. Что сейчас слушатели конфы думают, что PostCSS — это про примеси, а не универсальный AST для создания любых CSS инструментов.

Я бы не стал додумывать, кто о чем подумал. Мой интерес академический, и в докладе я пытался поднять общие глобальные проблемы. У меня не было цели что либо "продавать", даже csso (у него еще много проблем), не говоря уже PostCSS.

  1. Что твоя публичная позиция непрофессиональная и приводит к невыгодной всем конкуренции. Как, например, терминологический войне за то, какие именно функции должны быть в «нормальном» инструменте.

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

@SelenIT

SelenIT commented Dec 22, 2015

Copy link
Copy Markdown

Кстати, верно ли я понимаю, что CSSWG считает «наилучшим приближением к референсному парсеру» CSSOM.js?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment