首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby:解析纯文本的结构化块

Ruby:解析纯文本的结构化块
EN

Stack Overflow用户
提问于 2013-01-07 21:03:35
回答 2查看 347关注 0票数 0

我正在为CSS文件编写一个简单的ruby解析器,我有点困惑于如何将CSS块(即选择器和紧随其后的花括号之间的所有内容)作为ruby对象,在其上执行我的黑暗和肮脏的魔法。

理想情况下,我希望得到每个属性/值和选择器的ruby散列。有没有什么清晰易懂的方法可以做到这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-07 22:37:21

正如评论中提到的,除了有趣的练习之外,自己去做是愚蠢的。我将css文件读入一个字符串,然后用正则表达式扫描它。

Ruby - Convert File to String

http://www.ruby-doc.org/core-1.9.3/String.html#method-i-scan

用于测试正则表达式:http://rubular.com/

票数 1
EN

Stack Overflow用户

发布于 2015-07-13 20:17:09

每个人都应该写一个解析器。

这应该会让你开始..。

代码语言:javascript
复制
require 'parslet'
require 'ostruct'
require 'pp'

class Parser < Parslet::Parser
  rule(:opencurl)   { str('{') }
  rule(:closecurl)  { str('}') }
  rule(:space)      { str(' ') }
  rule(:space?)     { space.maybe }
  rule(:comma)      { str(',') }
  rule(:semi)       { str(';') }
  rule(:colon)      { str(':') }
  rule(:eol)        { str("\r").maybe >> str("\n") }
  rule(:eol?)       { eol.maybe }
  rule(:indent?)    { str(" ").repeat(0) }
  rule(:ws?)        {indent? >> eol? >> indent?}

  rule(:value)      { (semi.absent? >> any).repeat(1).as(:value) } #cheating

  rule(:word)       { match['a-zA-Z0-9'].repeat(1) }
  rule(:property)   { (word >> (str("-") >> word).repeat(0)).as(:property) }
  rule(:setting)    { (indent? >> property >> colon >> indent? >> value >> semi  >> eol?) }
  rule(:body?)      { setting.repeat(0).as(:body) }
  rule(:block)      { opencurl >> ws? >> body? >> ws? >> closecurl >> ws? }
  rule(:selector_expression)   { (opencurl.absent? >> any).repeat(1) } #cheating
  rule(:scope)      { ws? >> selector_expression.as("selector") >> indent? >> block.as(:settings) }

  rule(:css?)       { (eol.repeat(0) >> scope).repeat(0) } 
  root(:css?)
end  

class MyTransform < Parslet::Transform
  rule(:property => simple(:p), :value => simple(:v)) { OpenStruct.new(p:p,v:v) }
  rule(:body => sequence(:b)) { b.each_with_object({}){|i,o| o[i.p] = i.v} }
end 

css = <<-css
  h2{ background-image: url(abc);}
  #bob { 
  background-image: url(abc);
  background-color: red;
}
css

par = Parser.new.parse(css)
tar = MyTransform.new.apply(par) 
pp tar

输出:

代码语言:javascript
复制
[{"selector"=>"h2", :settings=>{"background-image"=>"url(abc)"}},
 {"selector"=>"#bob ",
  :settings=>
   {"background-image"=>"url(abc)", "background-color"=>"red"}}]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14196565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档