Могу ли я использовать Perl Parse :: RecDescent для анализа файла на месте? - PullRequest
0 голосов
/ 07 июля 2019

Я хочу написать простой «препроцессор» CSS, который закомментирует конструкции в файлах CSS на основе файла конфигурации пользовательского ввода.Цель состоит в том, чтобы автоматизировать такие действия, как «закомментировать все свойства ABC, которые применяются к элементам XYZ».

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

Существует несколько парсеров CSS на Perl:

https://metacpan.org/pod/CSS (тяжелый и облегченный)

https://metacpan.org/pod/CSS::Simple

но они не сохраняют структуру и / или комментарии.

Я думал о написании своего собственного анализатора Parse :: RecDescent (и в CSS :: Parse :: есть много кодаТяжело ссылаться!) Но часть, которую я не могу понять, это как сохранить существующий текст во время разбора.Я надеялся вернуть строки реального содержимого через шаблоны, но Parse :: RecDescent, похоже, отбрасывает такие вещи, как пробелы и переводы строк, и вместо этого возвращает ссылки на биты и фрагменты содержимого.

Есть ли способполучить Parse :: RecDescent для сохранения фактического строкового содержимого, включая пробелы и переводы строк (и комментарии ??), в процессе производства?

У меня нет кода для обменапотому что у меня пока нет ни одной идеи оторваться от земли.:( Но вот несколько примеров CSS, которые мне нужно проанализировать:

/* ====================================
 * <prelreqs>
 */
*[class~="taskreq-d/prelreqs"] > * {
  margin-left: 2em;  // TO-DO - check
}

*[scale="90"]  {        font-size: 90%; }
*[scale="100"] {        font-size: 100%; }
*[scale="110"] {        font-size: 110%; }

@media print{
  /* page style stuff */
  :root{
      /* White page */
      border: 1px solid #c6c6c6;
      background-color:white;
}}
@page table-of-contents {
      @top-left      { content: none; }
      @top-center    { content: none; }
}
@page table-of-contents:left {
      @top-left {
          content: string(toc-header) " | " counter(page, lower-roman);
      }
}
...