【问题标题】:What is the pythonic way to implement a css parser/replacer实现css解析器/替换器的pythonic方法是什么
【发布时间】:2012-07-20 11:56:18
【问题描述】:

我想实现一个脚本来读取 CSS 文件并对其进行有意义的更改(添加/删除/替换行/单词等)。基本逻辑是实现 RTL(从右到左)转换。

我可以想到很多方法:

  • 文件阅读器 - 读取一行,分析它并对其进行必要的更改。
  • 两阶段扫描 - 在内存中创建模型,扫描并更改它,将模型保存为文本。
  • 正则表达式 - 这可能非常困难,因为其中一些可能非常复杂。

基本上我想知道的是,这些或其他方法中的哪一个将是 python 的方式来做到这一点?对于这种操作,您认为我应该熟悉哪些相关库?

编辑: 需要注意的是,这是一个“通过这个可用的项目学习 python”的项目,所以我不熟悉你在这里提到的大多数库。

【问题讨论】:

  • nedbatchelder.com/text/python-parsers.html 对 Python 语言解析工具的状态进行了很好的调查。我最好的(非分析性)猜测是 CSS 是一种上下文无关(非常规)语言,因此只能使用有状态解析器正确变形。
  • 您是否尝试过 Python 中现有的 CSS 解析器,例如 cssutils
  • 是否要保留格式、cmets 等?
  • 首先可能很重要的一点是,这是一个“通过这个可用的项目学习 python”的项目,所以我对你上面提到的大多数事情都不熟悉(我会在主帖也是)。通过查看 cssutils 页面和示例,它似乎属于我提到的第二种方法。我肯定会研究它,但仍然是一个问题,如果这实际上是这种情况下最好的 python 实践?
  • 格式化对我来说非常灵活,目前还不是 100% 必须...

标签: python


【解决方案1】:

如果您想要“快速而肮脏”的东西,有很多有趣的方法可以做到这一点。 (如你所说:逐行、正则表达式……)

但是,如果您想“正确”地执行此操作(对所有类型的输入都正确),您将需要一个基于官方 CSS tokenization and grammar 的真正解析器。在 Python 中有cssutilstinycss。 (免责声明:我是 tinycss 的作者。)如果你想学习,我喜欢认为tinycss’s source code 简单易学:)

【讨论】:

  • 很想听听您关于这两种解析器工具之间的区别。也许以回答“为什么在 cssutils 已经存在时创建 tinycss?”的形式?
  • arikg: 就是这样:exyr.org/2012/tinycss-css-parser 简而言之,主要是cssutils不容易扩展新语法。
  • 我刚刚尝试使用 tinycss 执行此操作,但写回 css 文件一点也不简单。我可以用一些手写代码写出规则,但它会丢失所有 cmets 和所有 tinycss 实际上并没有像 @media 那样解析的东西......
  • 是的,tinycss 不包含适当的序列化程序。我建议改用github.com/SimonSapin/tinycss2,确实如此。
猜你喜欢
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多