Skip to content

Commit 999eb2d

Browse files
committed
Implements border parsing
This doesn't interpret "border" properties as "border-top", "border-bottom", etc. This parses them directly to the bottom level of "border-top-width", "border-top-style", etc. That might come back to bite me, but going to give it a shot and see how far it goes
1 parent 130ba50 commit 999eb2d

File tree

6 files changed

+96
-12
lines changed

6 files changed

+96
-12
lines changed

lib/csscss.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@
2525
require "csscss/parser/border_color"
2626
require "csscss/parser/border_style"
2727
require "csscss/parser/border_side"
28+
require "csscss/parser/border"
2829

lib/csscss/parser/border.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
module Csscss
2+
module Parser
3+
module Border
4+
extend Parser::Base
5+
6+
class Parser < Parslet::Parser
7+
include Color
8+
9+
rule(:border_side) { BorderSide::Parser.new(:top).border_side_anonymous }
10+
11+
rule(:border) {
12+
(
13+
symbol("inherit") >> eof |
14+
border_side.maybe.as(:side)
15+
).as(:border)
16+
}
17+
18+
root(:border)
19+
end
20+
21+
class Transformer < Parslet::Transform
22+
extend Color::Transformer
23+
extend Color::PlainColorValue
24+
extend BorderSide::Transformer::Helpers
25+
26+
rule(border: simple(:inherit)) {[]}
27+
rule(border: {
28+
side: {
29+
width:simple(:width),
30+
style:simple(:style),
31+
color:simple(:color)
32+
}
33+
}) {|context|
34+
[].tap do |declarations|
35+
[:top, :right, :bottom, :left].each do |side|
36+
declarations << transform_side(side, context)
37+
end
38+
39+
declarations.flatten!
40+
end
41+
}
42+
end
43+
end
44+
end
45+
end

lib/csscss/parser/border_color.rb

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,12 @@ class Transformer < Parslet::Transform
2828
@property = :border_color
2929
extend MultiSideTransformer
3030
extend Color::Transformer
31+
extend Color::PlainColorValue
3132

3233
class << self
3334
def side_declaration(side, value)
3435
Declaration.from_parser("border-#{side}-color", value)
3536
end
36-
37-
def transform_color(context)
38-
context[:value]
39-
end
4037
end
4138
end
4239
end

lib/csscss/parser/border_side.rb

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@ def initialize(side)
1515
rule(:border_style) { BorderStyle::Parser.new.border_style_side }
1616
rule(:border_color) { BorderColor::Parser.new.border_color_side }
1717

18+
rule(:border_side_anonymous) {
19+
border_width.maybe.as(:width) >>
20+
border_style.maybe.as(:style) >>
21+
border_color.maybe.as(:color)
22+
}
23+
1824
rule(:border_side) {
1925
(
20-
symbol("inherit") >> eof | (
21-
border_width.maybe.as(:width) >>
22-
border_style.maybe.as(:style) >>
23-
border_color.maybe.as(:color)
24-
).as(side)
26+
symbol("inherit") >> eof |
27+
border_side_anonymous.as(side)
2528
).as(:border_side)
2629
}
2730

@@ -30,8 +33,9 @@ def initialize(side)
3033

3134
class Transformer < Parslet::Transform
3235
extend Color::Transformer
36+
extend Color::PlainColorValue
3337

34-
class << self
38+
module Helpers
3539
def transform_top(context); transform_side("top", context); end
3640
def transform_right(context); transform_side("right", context); end
3741
def transform_bottom(context); transform_side("bottom", context); end
@@ -45,10 +49,11 @@ def transform_side(side, context)
4549
[].tap do |declarations|
4650
declarations << Declaration.from_parser("border-#{side}-width", width) if width
4751
declarations << Declaration.from_parser("border-#{side}-style", style) if style
48-
declarations << Declaration.from_parser("border-#{side}-color", color.value) if color
52+
declarations << Declaration.from_parser("border-#{side}-color", color) if color
4953
end
5054
end
5155
end
56+
extend Helpers
5257

5358
rule(border_side: simple(:inherit)) {[]}
5459

@@ -61,7 +66,6 @@ def transform_side(side, context)
6166
}
6267
}, &method("transform_#{side}"))
6368
end
64-
6569
end
6670
end
6771
end

lib/csscss/parser/color.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ def transform_color(context)
4242
end
4343
end
4444
end
45+
46+
module PlainColorValue
47+
def transform_color(context)
48+
context[:value]
49+
end
50+
end
4551
end
4652
end
4753
end

test/csscss/parser/border_test.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
require "test_helper"
2+
3+
module Csscss::Parser
4+
module Border
5+
describe Border do
6+
include CommonParserTests
7+
8+
before do
9+
@parser = Parser.new
10+
@trans = Transformer.new
11+
end
12+
13+
it "converts shorthand rules to longhand" do
14+
trans("1px solid #fff").must_equal([
15+
dec("border-top-width", "1px"),
16+
dec("border-top-style", "solid"),
17+
dec("border-top-color", "#fff"),
18+
dec("border-right-width", "1px"),
19+
dec("border-right-style", "solid"),
20+
dec("border-right-color", "#fff"),
21+
dec("border-bottom-width", "1px"),
22+
dec("border-bottom-style", "solid"),
23+
dec("border-bottom-color", "#fff"),
24+
dec("border-left-width", "1px"),
25+
dec("border-left-style", "solid"),
26+
dec("border-left-color", "#fff")
27+
])
28+
end
29+
end
30+
end
31+
end

0 commit comments

Comments
 (0)