csscss 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -1
- data/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +39 -0
- data/README.md +47 -12
- data/bin/csscss +0 -1
- data/csscss.gemspec +2 -3
- data/lib/csscss/cli.rb +10 -1
- data/lib/csscss/json_reporter.rb +17 -0
- data/lib/csscss/parser/background.rb +72 -0
- data/lib/csscss/parser/base.rb +13 -0
- data/lib/csscss/parser/border.rb +45 -0
- data/lib/csscss/parser/border_color.rb +41 -0
- data/lib/csscss/parser/border_side.rb +91 -0
- data/lib/csscss/parser/border_style.rb +41 -0
- data/lib/csscss/parser/border_width.rb +37 -0
- data/lib/csscss/parser/color.rb +53 -0
- data/lib/csscss/parser/common.rb +86 -0
- data/lib/csscss/parser/css.rb +88 -0
- data/lib/csscss/parser/font.rb +96 -0
- data/lib/csscss/parser/list_style.rb +44 -0
- data/lib/csscss/parser/margin.rb +32 -0
- data/lib/csscss/parser/multi_side_transformer.rb +47 -0
- data/lib/csscss/parser/outline.rb +45 -0
- data/lib/csscss/parser/padding.rb +32 -0
- data/lib/csscss/parslet_optimizations.rb +77 -0
- data/lib/csscss/redundancy_analyzer.rb +75 -8
- data/lib/csscss/reporter.rb +2 -4
- data/lib/csscss/types.rb +77 -2
- data/lib/csscss/version.rb +1 -1
- data/lib/csscss.rb +22 -1
- data/test/csscss/json_reporter_test.rb +34 -0
- data/test/csscss/parser/background_test.rb +57 -0
- data/test/csscss/parser/border_color_test.rb +30 -0
- data/test/csscss/parser/border_side_test.rb +44 -0
- data/test/csscss/parser/border_style_test.rb +30 -0
- data/test/csscss/parser/border_test.rb +31 -0
- data/test/csscss/parser/border_width_test.rb +30 -0
- data/test/csscss/parser/color_test.rb +51 -0
- data/test/csscss/parser/common_test.rb +130 -0
- data/test/csscss/parser/css_test.rb +133 -0
- data/test/csscss/parser/font_test.rb +43 -0
- data/test/csscss/parser/list_style_test.rb +28 -0
- data/test/csscss/parser/margin_test.rb +50 -0
- data/test/csscss/parser/outline_test.rb +26 -0
- data/test/csscss/parser/padding_test.rb +50 -0
- data/test/csscss/redundancy_analyzer_test.rb +126 -4
- data/test/csscss/reporter_test.rb +4 -2
- data/test/csscss/types_test.rb +73 -0
- data/test/just_parse.rb +8 -0
- data/test/test_helper.rb +49 -6
- metadata +61 -23
- data/.rspec.default +0 -1
data/lib/csscss/version.rb
CHANGED
data/lib/csscss.rb
CHANGED
@@ -1,11 +1,32 @@
|
|
1
1
|
require "stringio"
|
2
2
|
require "optparse"
|
3
|
+
require "json"
|
3
4
|
|
4
5
|
require "parslet"
|
5
|
-
require "
|
6
|
+
require "csscss/parslet_optimizations"
|
6
7
|
|
7
8
|
require "csscss/version"
|
8
9
|
require "csscss/cli"
|
9
10
|
require "csscss/types"
|
10
11
|
require "csscss/redundancy_analyzer"
|
11
12
|
require "csscss/reporter"
|
13
|
+
require "csscss/json_reporter"
|
14
|
+
|
15
|
+
require "csscss/parser/common"
|
16
|
+
require "csscss/parser/color"
|
17
|
+
require "csscss/parser/base"
|
18
|
+
require "csscss/parser/multi_side_transformer"
|
19
|
+
|
20
|
+
require "csscss/parser/css"
|
21
|
+
require "csscss/parser/background"
|
22
|
+
require "csscss/parser/list_style"
|
23
|
+
require "csscss/parser/margin"
|
24
|
+
require "csscss/parser/padding"
|
25
|
+
require "csscss/parser/border_width"
|
26
|
+
require "csscss/parser/border_color"
|
27
|
+
require "csscss/parser/border_style"
|
28
|
+
require "csscss/parser/border_side"
|
29
|
+
require "csscss/parser/border"
|
30
|
+
require "csscss/parser/outline"
|
31
|
+
require "csscss/parser/font"
|
32
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Csscss
|
4
|
+
describe JSONReporter do
|
5
|
+
include TypeHelpers
|
6
|
+
|
7
|
+
it "formats json result" do
|
8
|
+
reporter = JSONReporter.new({
|
9
|
+
[sel(".foo"), sel(".bar")] => [dec("width", "1px"), dec("border", "black")],
|
10
|
+
[sel("h1, h2"), sel(".foo"), sel(".baz")] => [dec("display", "none")],
|
11
|
+
[sel("h1, h2"), sel(".bar")] => [dec("position", "relative")]
|
12
|
+
})
|
13
|
+
|
14
|
+
expected = [
|
15
|
+
{
|
16
|
+
"selectors" => %w(.foo .bar),
|
17
|
+
"count" => 2,
|
18
|
+
"declarations" => ["width: 1px", "border: black"]
|
19
|
+
},
|
20
|
+
{
|
21
|
+
"selectors" => ["h1, h2", ".foo", ".baz"],
|
22
|
+
"count" => 1,
|
23
|
+
"declarations" => ["display: none"]
|
24
|
+
},
|
25
|
+
{
|
26
|
+
"selectors" => ["h1, h2", ".bar"],
|
27
|
+
"count" => 1,
|
28
|
+
"declarations" => ["position: relative"]
|
29
|
+
},
|
30
|
+
]
|
31
|
+
reporter.report.must_equal JSON.dump(expected)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Csscss::Parser
|
4
|
+
module Background
|
5
|
+
describe Background do
|
6
|
+
include CommonParserTests
|
7
|
+
|
8
|
+
before do
|
9
|
+
@parser = Parser.new
|
10
|
+
@trans = Transformer.new
|
11
|
+
end
|
12
|
+
|
13
|
+
it "parses position" do
|
14
|
+
@parser.bg_position.must_parse("10.2%")
|
15
|
+
@parser.bg_position.must_parse("left")
|
16
|
+
@parser.bg_position.must_parse("44em")
|
17
|
+
@parser.bg_position.must_parse("left 11%")
|
18
|
+
@parser.bg_position.must_parse("left bottom")
|
19
|
+
@parser.bg_position.must_parse("inherit")
|
20
|
+
@parser.bg_position.must_parse("bottom")
|
21
|
+
@parser.bg_position.wont_parse("bottom left")
|
22
|
+
@parser.bg_position.wont_parse("inherit bottom")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "converts shorthand rules to longhand" do
|
26
|
+
trans("rgb(111, 222, 333) none repeat-x scroll").must_equal([
|
27
|
+
dec("background-color", "rgb(111, 222, 333)"),
|
28
|
+
dec("background-image", "none"),
|
29
|
+
dec("background-repeat", "repeat-x"),
|
30
|
+
dec("background-attachment", "scroll")
|
31
|
+
])
|
32
|
+
|
33
|
+
trans("inherit none inherit 10% bottom").must_equal([
|
34
|
+
dec("background-color", "inherit"),
|
35
|
+
dec("background-image", "none"),
|
36
|
+
dec("background-repeat", "inherit"),
|
37
|
+
dec("background-position", "10% bottom")
|
38
|
+
])
|
39
|
+
|
40
|
+
trans("#fff url(http://foo.com/bar.jpg) bottom").must_equal([
|
41
|
+
dec("background-color", "#fff"),
|
42
|
+
dec("background-image", "url(http://foo.com/bar.jpg)"),
|
43
|
+
dec("background-position", "bottom")
|
44
|
+
])
|
45
|
+
|
46
|
+
trans("#fff").must_equal([dec("background-color", "#fff")])
|
47
|
+
trans("BLACK").must_equal([dec("background-color", "black")])
|
48
|
+
end
|
49
|
+
|
50
|
+
it "tries the parse and returns false if it doesn't work" do
|
51
|
+
@parser.try_parse("foo").must_equal(false)
|
52
|
+
parsed = @parser.try_parse("black")
|
53
|
+
parsed[:background][:bg_color].must_equal(color:{keyword:"black"})
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Csscss::Parser
|
4
|
+
module BorderColor
|
5
|
+
describe BorderColor 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("#fff transparent black rgb(1, 2, 3)").must_equal([
|
15
|
+
dec("border-top-color", "#fff"),
|
16
|
+
dec("border-right-color", "transparent"),
|
17
|
+
dec("border-bottom-color", "black"),
|
18
|
+
dec("border-left-color", "rgb(1, 2, 3)")
|
19
|
+
])
|
20
|
+
|
21
|
+
trans("#fff black").must_equal([
|
22
|
+
dec("border-top-color", "#fff"),
|
23
|
+
dec("border-right-color", "black"),
|
24
|
+
dec("border-bottom-color", "#fff"),
|
25
|
+
dec("border-left-color", "black")
|
26
|
+
])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Csscss::Parser
|
4
|
+
module BorderSide
|
5
|
+
describe self do
|
6
|
+
include CommonParserTests
|
7
|
+
|
8
|
+
before do
|
9
|
+
@parser = Parser.new("top")
|
10
|
+
end
|
11
|
+
|
12
|
+
def trans_top(s)
|
13
|
+
Transformer.new.apply(@parser.parse(s))
|
14
|
+
end
|
15
|
+
alias_method :trans, :trans_top
|
16
|
+
|
17
|
+
def trans_bottom(s)
|
18
|
+
Transformer.new.apply(Parser.new("bottom").parse(s))
|
19
|
+
end
|
20
|
+
|
21
|
+
it "converts shorthand rules to longhand" do
|
22
|
+
trans_top("thin").must_equal([
|
23
|
+
dec("border-top-width", "thin")
|
24
|
+
])
|
25
|
+
|
26
|
+
trans_bottom("rgb(1, 2, 3)").must_equal([
|
27
|
+
dec("border-bottom-color", "rgb(1, 2, 3)")
|
28
|
+
])
|
29
|
+
|
30
|
+
trans_top("thin solid #fff").must_equal([
|
31
|
+
dec("border-top-width", "thin"),
|
32
|
+
dec("border-top-style", "solid"),
|
33
|
+
dec("border-top-color", "#fff")
|
34
|
+
])
|
35
|
+
|
36
|
+
trans_bottom("thin solid #fff").must_equal([
|
37
|
+
dec("border-bottom-width", "thin"),
|
38
|
+
dec("border-bottom-style", "solid"),
|
39
|
+
dec("border-bottom-color", "#fff")
|
40
|
+
])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Csscss::Parser
|
4
|
+
module BorderStyle
|
5
|
+
describe BorderStyle 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("none dashed solid ridge").must_equal([
|
15
|
+
dec("border-top-style", "none"),
|
16
|
+
dec("border-right-style", "dashed"),
|
17
|
+
dec("border-bottom-style", "solid"),
|
18
|
+
dec("border-left-style", "ridge")
|
19
|
+
])
|
20
|
+
|
21
|
+
trans("none dashed").must_equal([
|
22
|
+
dec("border-top-style", "none"),
|
23
|
+
dec("border-right-style", "dashed"),
|
24
|
+
dec("border-bottom-style", "none"),
|
25
|
+
dec("border-left-style", "dashed")
|
26
|
+
])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -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,0 +1,30 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Csscss::Parser
|
4
|
+
module BorderWidth
|
5
|
+
describe BorderWidth 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("thin thick inherit 10em").must_equal([
|
15
|
+
dec("border-top-width", "thin"),
|
16
|
+
dec("border-right-width", "thick"),
|
17
|
+
dec("border-bottom-width", "inherit"),
|
18
|
+
dec("border-left-width", "10em")
|
19
|
+
])
|
20
|
+
|
21
|
+
trans("thin thick").must_equal([
|
22
|
+
dec("border-top-width", "thin"),
|
23
|
+
dec("border-right-width", "thick"),
|
24
|
+
dec("border-bottom-width", "thin"),
|
25
|
+
dec("border-left-width", "thick")
|
26
|
+
])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Csscss::Parser
|
4
|
+
describe Color do
|
5
|
+
class ColorTest
|
6
|
+
include Color
|
7
|
+
end
|
8
|
+
|
9
|
+
before { @parser = ColorTest.new }
|
10
|
+
|
11
|
+
describe "color" do
|
12
|
+
it "parses color" do
|
13
|
+
@parser.color.must_parse "rgb(123, 222, 444)"
|
14
|
+
@parser.color.must_parse "rgb(123%, 222%, 444%)"
|
15
|
+
@parser.color.must_parse "#ffffff"
|
16
|
+
@parser.color.must_parse "inherit"
|
17
|
+
@parser.color.must_parse "black"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "individual rules" do
|
22
|
+
it "parses rgb number color" do
|
23
|
+
@parser.rgb.must_parse "rgb(123, 222, 444)"
|
24
|
+
@parser.rgb.must_parse "rgb ( 123 , 222 , 444 ) "
|
25
|
+
@parser.rgb.wont_parse "rgb(1aa, 222, 444)"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "parses rgb percentage color" do
|
29
|
+
@parser.rgb.must_parse "rgb(123%, 222%, 444%)"
|
30
|
+
@parser.rgb.must_parse "rgb ( 123% , 222% , 444% ) "
|
31
|
+
@parser.rgb.wont_parse "rgb(1aa%, 222%, 444%)"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "parses hex colors" do
|
35
|
+
@parser.hexcolor.must_parse "#ffffff"
|
36
|
+
@parser.hexcolor.must_parse "#ffffff "
|
37
|
+
@parser.hexcolor.must_parse "#fff "
|
38
|
+
@parser.hexcolor.must_parse "#fFF123"
|
39
|
+
@parser.hexcolor.wont_parse "fFF123"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "parses keyword colors" do
|
43
|
+
@parser.color_keyword.must_parse "inherit"
|
44
|
+
@parser.color_keyword.must_parse "inherit "
|
45
|
+
|
46
|
+
@parser.color_keyword.must_parse "black"
|
47
|
+
@parser.color_keyword.must_parse "BLACK"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Csscss::Parser
|
4
|
+
describe Common do
|
5
|
+
class CommonTest
|
6
|
+
include Common
|
7
|
+
end
|
8
|
+
|
9
|
+
before { @parser = CommonTest.new }
|
10
|
+
|
11
|
+
describe "#stri" do
|
12
|
+
it "parses case insensitive strings" do
|
13
|
+
@parser.stri("a").must_parse "a"
|
14
|
+
@parser.stri("A").must_parse "a"
|
15
|
+
@parser.stri("A").wont_parse "b"
|
16
|
+
|
17
|
+
@parser.stri("This too shall pass").must_parse "this TOO shall PASS"
|
18
|
+
@parser.stri("[").must_parse "["
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#spaces" do
|
23
|
+
it "parses series of spaces" do
|
24
|
+
@parser.space.must_parse " "
|
25
|
+
@parser.space.must_parse " "
|
26
|
+
@parser.space.must_parse "\n"
|
27
|
+
@parser.space.wont_parse " a"
|
28
|
+
|
29
|
+
@parser.space.wont_parse ""
|
30
|
+
@parser.space?.must_parse ""
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#symbol" do
|
35
|
+
it "parses case insensitive characters followed by spaces" do
|
36
|
+
@parser.symbol("foo").must_parse "foo"
|
37
|
+
@parser.symbol("foo").must_parse "foo "
|
38
|
+
@parser.symbol("foo").must_parse "Foo "
|
39
|
+
@parser.symbol("foo").wont_parse " Foo "
|
40
|
+
end
|
41
|
+
|
42
|
+
it "optionally captures input" do
|
43
|
+
parsed = @parser.symbol("foo", :foo).parse("Foo ")
|
44
|
+
parsed[:foo].must_equal "Foo"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "between and helpers" do
|
49
|
+
it "parses characters surrounded" do
|
50
|
+
@parser.between("[", "]") { @parser.symbol("foo") }.must_parse "[foo]"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "parses input surrounded by parens" do
|
54
|
+
@parser.parens { @parser.symbol("foo") }.must_parse "(foo)"
|
55
|
+
@parser.parens { @parser.symbol("foo") }.must_parse "(FOo) "
|
56
|
+
@parser.parens { @parser.symbol("foo") }.must_parse "(FOo ) "
|
57
|
+
@parser.parens { @parser.symbol("food") }.wont_parse "(FOo"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "parses input surrounded by double quotes" do
|
61
|
+
@parser.double_quoted { @parser.symbol("foo") }.must_parse %("foo")
|
62
|
+
@parser.double_quoted { @parser.symbol("foo") }.must_parse %("FOo ")
|
63
|
+
@parser.double_quoted { @parser.symbol("foo") }.must_parse %("FOo " )
|
64
|
+
@parser.double_quoted { @parser.symbol("food") }.wont_parse %("FOo)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "parses input surrounded by single quotes" do
|
68
|
+
@parser.single_quoted { @parser.symbol('foo') }.must_parse %('foo')
|
69
|
+
@parser.single_quoted { @parser.symbol('foo') }.must_parse %('FOo ')
|
70
|
+
@parser.single_quoted { @parser.symbol('foo') }.must_parse %('FOo ' )
|
71
|
+
@parser.single_quoted { @parser.symbol('food') }.wont_parse %('FOo)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "number and numbers" do
|
76
|
+
it "parses single numbers" do
|
77
|
+
@parser.number.must_parse "1"
|
78
|
+
@parser.number.wont_parse "12"
|
79
|
+
@parser.number.wont_parse "a"
|
80
|
+
@parser.number.wont_parse "1 "
|
81
|
+
end
|
82
|
+
|
83
|
+
it "parses multiple numbers" do
|
84
|
+
@parser.numbers.must_parse "1"
|
85
|
+
@parser.numbers.must_parse "12"
|
86
|
+
@parser.numbers.wont_parse "12 "
|
87
|
+
@parser.numbers.wont_parse "1223a"
|
88
|
+
end
|
89
|
+
|
90
|
+
it "parses decimals" do
|
91
|
+
@parser.decimal.must_parse "1"
|
92
|
+
@parser.decimal.must_parse "12"
|
93
|
+
@parser.decimal.must_parse "12."
|
94
|
+
@parser.decimal.must_parse "12.0123"
|
95
|
+
@parser.decimal.wont_parse "1223a"
|
96
|
+
end
|
97
|
+
|
98
|
+
it "parses percentages" do
|
99
|
+
@parser.percent.must_parse "100%"
|
100
|
+
@parser.percent.must_parse "100% "
|
101
|
+
@parser.percent.must_parse "100.344%"
|
102
|
+
@parser.percent.wont_parse "100 %"
|
103
|
+
end
|
104
|
+
|
105
|
+
it "parses lengths" do
|
106
|
+
@parser.length.must_parse "123px"
|
107
|
+
@parser.length.must_parse "123EM"
|
108
|
+
@parser.length.must_parse "1.23Pt"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "url" do
|
113
|
+
it "parses http" do
|
114
|
+
@parser.http.must_parse "foo.jpg"
|
115
|
+
@parser.http.must_parse 'foo\(bar\).jpg'
|
116
|
+
@parser.http.must_parse 'http://foo\(bar\).jpg'
|
117
|
+
@parser.http.must_parse 'http://foo.com/baz/\(bar\).jpg'
|
118
|
+
end
|
119
|
+
|
120
|
+
it "parses urls" do
|
121
|
+
@parser.url.must_parse "url(foo.jpg)"
|
122
|
+
@parser.url.must_parse "url( foo.jpg )"
|
123
|
+
@parser.url.must_parse 'url("foo.jpg")'
|
124
|
+
@parser.url.must_parse "url('foo.jpg')"
|
125
|
+
@parser.url.must_parse "url('foo.jpg' )"
|
126
|
+
@parser.url.must_parse 'url(foo\(bar\).jpg)'
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Csscss::Parser
|
4
|
+
module Css
|
5
|
+
describe self do
|
6
|
+
include CommonParserTests::Helpers
|
7
|
+
include TypeHelpers
|
8
|
+
|
9
|
+
before do
|
10
|
+
@parser = Parser.new
|
11
|
+
@trans = Transformer.new
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "parsing" do
|
15
|
+
it "parses css" do
|
16
|
+
@parser.must_parse "h1 { display: none }"
|
17
|
+
@parser.must_parse "\nh1 { display: none; }"
|
18
|
+
@parser.must_parse %$
|
19
|
+
.bar { border: 1px solid black }
|
20
|
+
$
|
21
|
+
|
22
|
+
@parser.wont_parse ""
|
23
|
+
end
|
24
|
+
|
25
|
+
it "parses comments" do
|
26
|
+
@parser.css_space?.must_parse "/* foo */"
|
27
|
+
@parser.css_space?.must_parse %$
|
28
|
+
/* foo
|
29
|
+
* bar
|
30
|
+
*/
|
31
|
+
$
|
32
|
+
|
33
|
+
@parser.css_space?.must_parse %$
|
34
|
+
/* foo */
|
35
|
+
/* bar */
|
36
|
+
$
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "transforms css" do
|
41
|
+
css = %$
|
42
|
+
h1, h2 { display: none; position: relative; outline:none}
|
43
|
+
.foo { display: none; width: 1px }
|
44
|
+
.bar { border: 1px solid black }
|
45
|
+
.baz {
|
46
|
+
background-color: black;
|
47
|
+
background-style: solid
|
48
|
+
}
|
49
|
+
$
|
50
|
+
|
51
|
+
trans(css).must_equal([
|
52
|
+
rs(sel("h1, h2"), [dec("display", "none"), dec("position", "relative"), dec("outline", "none")]),
|
53
|
+
rs(sel(".foo"), [dec("display", "none"), dec("width", "1px")]),
|
54
|
+
rs(sel(".bar"), [dec("border", "1px solid black")]),
|
55
|
+
rs(sel(".baz"), [dec("background-color", "black"), dec("background-style", "solid")])
|
56
|
+
])
|
57
|
+
end
|
58
|
+
|
59
|
+
it "skips comments" do
|
60
|
+
css = %$
|
61
|
+
/* some comment
|
62
|
+
* foo
|
63
|
+
*/
|
64
|
+
.bar { border: 1px solid black /* sdflk */ }
|
65
|
+
.baz { background: white /* sdflk */ }
|
66
|
+
$
|
67
|
+
|
68
|
+
trans(css).must_equal([
|
69
|
+
rs(sel(".bar"), [dec("border", "1px solid black /* sdflk */")]),
|
70
|
+
rs(sel(".baz"), [dec("background", "white /* sdflk */")])
|
71
|
+
])
|
72
|
+
end
|
73
|
+
|
74
|
+
it "skips rules that are commented out" do
|
75
|
+
css = %$
|
76
|
+
/*
|
77
|
+
bar { border: 1px solid black }
|
78
|
+
*/
|
79
|
+
|
80
|
+
/* foo */
|
81
|
+
.baz {
|
82
|
+
background: white;
|
83
|
+
/* bar */
|
84
|
+
border: 1px;
|
85
|
+
}
|
86
|
+
$
|
87
|
+
|
88
|
+
trans(css).must_equal([
|
89
|
+
rs(sel(".baz"), [dec("background", "white"), dec("border", "1px")])
|
90
|
+
])
|
91
|
+
end
|
92
|
+
|
93
|
+
it "parses commented attributes" do
|
94
|
+
css = %$
|
95
|
+
.foo {
|
96
|
+
/*
|
97
|
+
some comment
|
98
|
+
*/
|
99
|
+
}
|
100
|
+
$
|
101
|
+
|
102
|
+
trans(css).must_equal([
|
103
|
+
rs(sel(".foo"), [])
|
104
|
+
])
|
105
|
+
end
|
106
|
+
|
107
|
+
it "recognizes media queries" do
|
108
|
+
css = %$
|
109
|
+
@media only screen {
|
110
|
+
/* some comment */
|
111
|
+
#foo {
|
112
|
+
background-color: black;
|
113
|
+
}
|
114
|
+
|
115
|
+
#bar {
|
116
|
+
display: none;
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
h1 {
|
121
|
+
outline: 1px;
|
122
|
+
}
|
123
|
+
$
|
124
|
+
|
125
|
+
trans(css).must_equal([
|
126
|
+
rs(sel("#foo"), [dec("background-color", "black")]),
|
127
|
+
rs(sel("#bar"), [dec("display", "none")]),
|
128
|
+
rs(sel("h1"), [dec("outline", "1px")])
|
129
|
+
])
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Csscss::Parser
|
4
|
+
module Font
|
5
|
+
describe self 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("10% Gill, 'Lucida Sans'").must_equal([
|
15
|
+
dec("font-size", "10%"),
|
16
|
+
dec("font-family", "Gill, 'Lucida Sans'")
|
17
|
+
])
|
18
|
+
|
19
|
+
trans("normal small-caps 100 10% / 33 Gill, Helvetica, \"Lucida Sans\", cursive").must_equal([
|
20
|
+
dec("font-style", "normal"),
|
21
|
+
dec("font-variant", "small-caps"),
|
22
|
+
dec("font-weight", "100"),
|
23
|
+
dec("font-size", "10%"),
|
24
|
+
dec("line-height", "33"),
|
25
|
+
dec("font-family", 'Gill, Helvetica, "Lucida Sans", cursive')
|
26
|
+
])
|
27
|
+
end
|
28
|
+
|
29
|
+
it "parses font family" do
|
30
|
+
@parser.font_family.must_parse("\"Lucida\"")
|
31
|
+
@parser.font_family.must_parse("\"Lucida Sans\"")
|
32
|
+
@parser.font_family.must_parse("Gill")
|
33
|
+
@parser.font_family.must_parse('Gill, Helvetica, "Lucida Sans", cursive')
|
34
|
+
end
|
35
|
+
|
36
|
+
it "ignores literal fonts" do
|
37
|
+
trans("caption").must_equal([])
|
38
|
+
trans("icon").must_equal([])
|
39
|
+
trans("menu").must_equal([])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Csscss::Parser
|
4
|
+
module ListStyle
|
5
|
+
describe ListStyle 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("circle outside url('foo.jpg')").must_equal([
|
15
|
+
dec("list-style-type", "circle"),
|
16
|
+
dec("list-style-position", "outside"),
|
17
|
+
dec("list-style-image", "url('foo.jpg')")
|
18
|
+
])
|
19
|
+
end
|
20
|
+
|
21
|
+
it "tries the parse and returns false if it doesn't work" do
|
22
|
+
@parser.try_parse("foo").must_equal(false)
|
23
|
+
parsed = @parser.try_parse("circle")
|
24
|
+
parsed[:list_style][:list_style_type].must_equal(type:"circle")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|