Skip to content

Commit 8e5d2d5

Browse files
committed
Restructuring the css parser. Unfortunately it has the same perf
1 parent 3486133 commit 8e5d2d5

File tree

2 files changed

+27
-25
lines changed

2 files changed

+27
-25
lines changed

lib/csscss/parser/css.rb

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,51 +21,52 @@ class Parser < Parslet::Parser
2121
}
2222

2323
rule(:attribute) {
24-
css_space? >>
2524
match["^:{}"].repeat(1).as(:property) >>
2625
str(":") >>
27-
css_space? >>
28-
match["^;}"].repeat(1).as(:value)
29-
}
30-
31-
rule(:attributes) {
32-
attribute >>
26+
match["^;}"].repeat(1).as(:value) >>
3327
str(";").maybe >>
34-
css_space?
28+
space?
3529
}
3630

3731
rule(:ruleset) {
3832
(
39-
css_space? >>
4033
match["^{}"].repeat(1).as(:selector) >>
4134
str("{") >>
42-
attributes.repeat(0).as(:properties) >>
43-
css_space? >>
35+
space? >>
36+
(comment | attribute).repeat(0).as(:properties) >>
4437
str("}") >>
45-
css_space?
38+
space?
4639
).as(:ruleset)
4740
}
4841

4942
rule(:nested_ruleset) {
50-
css_space? >>
51-
str("@") >>
52-
match["^{}"].repeat(1) >>
53-
str("{") >>
54-
ruleset.repeat(0) >>
55-
css_space? >>
56-
str("}") >>
57-
css_space?
43+
(
44+
str("@") >>
45+
match["^{}"].repeat(1) >>
46+
str("{") >>
47+
(comment | ruleset).repeat(0) >>
48+
str("}") >>
49+
space?
50+
).as(:nested_ruleset)
51+
}
52+
53+
#rule(:blocks) { (nested_ruleset.as(:nested) | ruleset).repeat(0).as(:blocks) }
54+
rule(:blocks) {
55+
space? >> (comment.as(:comment) | nested_ruleset | ruleset).repeat(1).as(:blocks) >> space?
5856
}
5957

60-
rule(:blocks) { (nested_ruleset.as(:nested) | ruleset).repeat(0).as(:blocks) }
6158
root(:blocks)
6259
end
6360

6461
class Transformer < Parslet::Transform
65-
rule(nested: sequence(:rulesets)) {
62+
rule(nested_ruleset: sequence(:rulesets)) {
6663
rulesets
6764
}
6865

66+
rule(comment: simple(:comment)) {
67+
[]
68+
}
69+
6970
rule(ruleset: {
7071
selector: simple(:selector),
7172
properties: sequence(:properties)
@@ -80,8 +81,8 @@ class Transformer < Parslet::Transform
8081
Declaration.from_parser(property, value)
8182
}
8283

83-
rule(blocks: subtree(:rulesets)) {
84-
rulesets.flatten
84+
rule(blocks: subtree(:rulesets)) {|context|
85+
context[:rulesets].flatten
8586
}
8687
end
8788
end

test/csscss/parser/css_test.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ module Css
1313

1414
describe "parsing" do
1515
it "parses css" do
16-
@parser.must_parse ""
1716
@parser.must_parse "h1 { display: none }"
1817
@parser.must_parse "\nh1 { display: none; }"
1918
@parser.must_parse %$
2019
.bar { border: 1px solid black }
2120
$
21+
22+
@parser.wont_parse ""
2223
end
2324

2425
it "parses comments" do

0 commit comments

Comments
 (0)