fdlint 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +8 -0
- data/Gemfile.lock +14 -0
- data/README.md +68 -0
- data/Rakefile +92 -0
- data/bin/fdlint +17 -0
- data/lib/base_parser.rb +143 -0
- data/lib/cmd_runner.rb +145 -0
- data/lib/context.rb +31 -0
- data/lib/css/parser.rb +186 -0
- data/lib/css/reader.rb +30 -0
- data/lib/css/rule/check_compression_rule.rb +48 -0
- data/lib/css/rule/checklist.rb +45 -0
- data/lib/css/struct.rb +111 -0
- data/lib/encoding_error.rb +6 -0
- data/lib/file_validator.rb +38 -0
- data/lib/helper/code_type.rb +50 -0
- data/lib/helper/color_string.rb +44 -0
- data/lib/helper/file_reader.rb +22 -0
- data/lib/helper/strenc.rb +65 -0
- data/lib/html/parser.rb +212 -0
- data/lib/html/query.rb +96 -0
- data/lib/html/rule/check_tag_rule.rb +80 -0
- data/lib/html/struct.rb +291 -0
- data/lib/js/expr/expr.rb +66 -0
- data/lib/js/expr/left_hand.rb +63 -0
- data/lib/js/expr/operate.rb +92 -0
- data/lib/js/expr/primary.rb +166 -0
- data/lib/js/parser.rb +116 -0
- data/lib/js/rule/all.rb +35 -0
- data/lib/js/rule/checklist.rb +41 -0
- data/lib/js/rule/file_checker.rb +42 -0
- data/lib/js/rule/helper.rb +96 -0
- data/lib/js/rule/no_global.rb +87 -0
- data/lib/js/stat/if.rb +25 -0
- data/lib/js/stat/iter.rb +85 -0
- data/lib/js/stat/stat.rb +117 -0
- data/lib/js/stat/switch.rb +65 -0
- data/lib/js/stat/try.rb +28 -0
- data/lib/js/stat/var.rb +40 -0
- data/lib/js/struct.rb +248 -0
- data/lib/log_entry.rb +49 -0
- data/lib/node.rb +28 -0
- data/lib/parse_error.rb +13 -0
- data/lib/parser_visitable.rb +138 -0
- data/lib/position_info.rb +46 -0
- data/lib/printer/base_printer.rb +24 -0
- data/lib/printer/console_printer.rb +66 -0
- data/lib/printer/nocolor_printer.rb +27 -0
- data/lib/printer/vim_printer.rb +19 -0
- data/lib/rule.rb +241 -0
- data/lib/rule_helper.rb +14 -0
- data/lib/runner.rb +225 -0
- data/rules.d/css.rule +127 -0
- data/rules.d/html.dtd.rule +22 -0
- data/rules.d/html.prop.rule +51 -0
- data/rules.d/html.tag.rule +136 -0
- data/rules.d/js.file.rule +13 -0
- data/rules.d/js.jquery.rule +56 -0
- data/rules.d/js.mergefile.rule +71 -0
- data/rules.d/js.rule +84 -0
- data/test/all_tests.rb +84 -0
- data/test/cli/cli_test.rb +70 -0
- data/test/cli/log_level_test.rb +51 -0
- data/test/cli/output_format_test.rb +47 -0
- data/test/cli/type_test.rb +77 -0
- data/test/css/mac_line_end_support_test.rb +38 -0
- data/test/css/parser_test.rb +276 -0
- data/test/css/rule/check_encoding_test.rb +66 -0
- data/test/css/rule/check_list_rule_test.rb +167 -0
- data/test/css/rule/compression_test.rb +53 -0
- data/test/css/rule/file_name_test.rb +76 -0
- data/test/fixtures/css/broken.css +4 -0
- data/test/fixtures/css/cbu/36.css +52 -0
- data/test/fixtures/css/cbu/china_top.css +324 -0
- data/test/fixtures/css/cbu/default-merge.css +3 -0
- data/test/fixtures/css/cbu/default.css +13 -0
- data/test/fixtures/css/cbu/diy-merge.css +25 -0
- data/test/fixtures/css/cbu/fns-v1.css +27 -0
- data/test/fixtures/css/cbu/index_v0.1.css +12 -0
- data/test/fixtures/css/cbu/merge.css +11 -0
- data/test/fixtures/css/cbu/min.css +2 -0
- data/test/fixtures/css/cbu/my_home_admin.css +126 -0
- data/test/fixtures/css/cbu/nav.css +95 -0
- data/test/fixtures/css/cbu/pic_list.css +386 -0
- data/test/fixtures/css/cbu/quote-edit.css +18 -0
- data/test/fixtures/css/cbu/selloffer.shopwindow.css +1 -0
- data/test/fixtures/css/cbu/v1.css +9 -0
- data/test/fixtures/css/css3.css +30 -0
- data/test/fixtures/css/empty-min.css +0 -0
- data/test/fixtures/css/empty.css +0 -0
- data/test/fixtures/css/font-family.css +4 -0
- data/test/fixtures/css/gb-good.css +14 -0
- data/test/fixtures/css/gb_using_star.css +4 -0
- data/test/fixtures/css/import.css +18 -0
- data/test/fixtures/css/mac-line-sep-err-min.css +1 -0
- data/test/fixtures/css/mac-line-sep-err.css +1 -0
- data/test/fixtures/css/mac-line-sep-good-min.css +1 -0
- data/test/fixtures/css/mac-line-sep-good.css +1 -0
- data/test/fixtures/css/multi-encoding-in-a-file.css +0 -0
- data/test/fixtures/css/simple.css +1 -0
- data/test/fixtures/css/using_expr.css +8 -0
- data/test/fixtures/css/using_hack.css +21 -0
- data/test/fixtures/css/using_id.css +1 -0
- data/test/fixtures/css/using_star.css +4 -0
- data/test/fixtures/css/utf8_good.css +6 -0
- data/test/fixtures/css/utf8_good_declaring_charset.css +7 -0
- data/test/fixtures/css/utf8_using_star.css +5 -0
- data/test/fixtures/html/1-1.html +120 -0
- data/test/fixtures/html/1-2.html +120 -0
- data/test/fixtures/html/cms.html +373 -0
- data/test/fixtures/html/css_out_of_head.html +9 -0
- data/test/fixtures/html/fdev-template.html +22 -0
- data/test/fixtures/html/google.com.html +33 -0
- data/test/fixtures/html/mixed_log_levels.html +4 -0
- data/test/fixtures/html/mixed_types.html +13 -0
- data/test/fixtures/html/no_dtd.html +6 -0
- data/test/fixtures/html/readme.html +94 -0
- data/test/fixtures/html/review.board.html +163 -0
- data/test/fixtures/html/syntax_err.html +3 -0
- data/test/fixtures/html/train/detail/345/233/276/346/226/207/347/273/223/345/220/210.html +208 -0
- data/test/fixtures/html/train/detail/347/232/204Flash.html +212 -0
- data/test/fixtures/html/train/detail/347/232/204Vedio.html +212 -0
- data/test/fixtures/html/train/index.html +37 -0
- data/test/fixtures/html/train/test.html +1 -0
- data/test/fixtures/html/train//344/277/256/346/224/271/344/270/200/347/272/247/345/210/206/347/261/273.html +112 -0
- data/test/fixtures/html/train//344/277/256/346/224/271/345/255/220/345/210/206/347/261/273.html +108 -0
- data/test/fixtures/html/train//344/277/256/346/224/271/350/257/276/347/250/213.html +195 -0
- data/test/fixtures/html/train//345/215/232/345/256/242/350/256/276/347/275/256.html +142 -0
- data/test/fixtures/html/train//346/265/217/350/247/210/350/256/260/345/275/225.html +191 -0
- data/test/fixtures/html/train//346/267/273/345/212/240/344/270/200/347/272/247/345/210/206/347/261/273.html +113 -0
- data/test/fixtures/html/train//346/267/273/345/212/240/345/255/220/345/210/206/347/261/273.html +112 -0
- data/test/fixtures/html/train//346/267/273/345/212/240/350/257/276/347/250/213.html +195 -0
- data/test/fixtures/html/train//347/231/273/345/275/225.html +20 -0
- data/test/fixtures/html/train//347/256/241/347/220/206/345/210/206/347/261/273.html +210 -0
- data/test/fixtures/html/train//347/256/241/347/220/206/345/217/215/351/246/210.html +222 -0
- data/test/fixtures/html/train//347/256/241/347/220/206/350/257/276/347/250/213.html +284 -0
- data/test/fixtures/html/train//347/256/241/347/220/206/350/264/246/346/210/267.html +107 -0
- data/test/fixtures/html/train//347/275/221/344/270/212/345/237/271/350/256/255home/351/241/265.html +354 -0
- data/test/fixtures/html/train//347/275/221/345/225/206/345/237/271/350/256/255list/351/241/265.html +255 -0
- data/test/fixtures/html/train//350/256/276/347/275/256/351/246/226/351/241/265/346/216/250/350/215/220.html +168 -0
- data/test/fixtures/html/train//350/257/264/346/230/216.txt +3 -0
- data/test/fixtures/html/train//351/246/226/351/241/265/345/271/277/345/221/212/350/256/276/347/275/256.html +297 -0
- data/test/fixtures/html/unescaped.html +2 -0
- data/test/fixtures/html/view.vm +916 -0
- data/test/fixtures/js/jquery-1.7.js +9300 -0
- data/test/fixtures/js/scope-test.js +22 -0
- data/test/helper.rb +41 -0
- data/test/html/mixed_type_test.rb +35 -0
- data/test/html/parser/parse_comment_test.rb +47 -0
- data/test/html/parser/parse_dtd_test.rb +46 -0
- data/test/html/parser/parse_script_tag_test.rb +55 -0
- data/test/html/parser/parse_with_auto_close_tag_test.rb +41 -0
- data/test/html/parser/parse_with_diff_case_test.rb +38 -0
- data/test/html/parser/parse_with_emtpy_test.rb +22 -0
- data/test/html/parser/parse_with_multi_children_test.rb +27 -0
- data/test/html/parser/parse_with_multi_line_test.rb +41 -0
- data/test/html/parser/parse_with_prop_test.rb +88 -0
- data/test/html/parser/parse_with_script_tag_test.rb +26 -0
- data/test/html/parser/parse_with_selfclosing_test.rb +39 -0
- data/test/html/parser/parse_with_simple_tag_test.rb +44 -0
- data/test/html/parser/parse_with_simple_tree_test.rb +40 -0
- data/test/html/parser/parse_with_style_tag_test.rb +22 -0
- data/test/html/parser/parse_with_text_test.rb +45 -0
- data/test/html/parser_test.rb +52 -0
- data/test/html/query_test.rb +52 -0
- data/test/html/rule/check_block_level_element_test.rb +52 -0
- data/test/html/rule/check_button_test.rb +45 -0
- data/test/html/rule/check_class_count_test.rb +36 -0
- data/test/html/rule/check_css_in_head_test.rb +53 -0
- data/test/html/rule/check_dtd_test.rb +46 -0
- data/test/html/rule/check_form_element_name_test.rb +49 -0
- data/test/html/rule/check_head_contain_meta_and_title_test.rb +52 -0
- data/test/html/rule/check_html_template_test.rb +103 -0
- data/test/html/rule/check_hyperlink_with_target_test.rb +40 -0
- data/test/html/rule/check_hyperlink_with_title_test.rb +43 -0
- data/test/html/rule/check_id_n_class_downcase_test.rb +40 -0
- data/test/html/rule/check_img_with_alt_prop_test.rb +33 -0
- data/test/html/rule/check_no_import_css_test.rb +36 -0
- data/test/html/rule/check_prop_have_value_test.rb +32 -0
- data/test/html/rule/check_prop_seperator_test.rb +32 -0
- data/test/html/rule/check_style_prop_test.rb +30 -0
- data/test/html/rule/check_tag_closed_test.rb +59 -0
- data/test/html/rule/check_tag_downcase_test.rb +51 -0
- data/test/html/rule/check_unescape_char_test.rb +35 -0
- data/test/html/rule/check_unique_import_test.rb +56 -0
- data/test/html/rule_test.rb +62 -0
- data/test/js/expr/expr.rb +57 -0
- data/test/js/expr/left_hand.rb +25 -0
- data/test/js/expr/operate.rb +145 -0
- data/test/js/expr/primary.rb +89 -0
- data/test/js/parser_test.rb +98 -0
- data/test/js/rule/alert_check_test.rb +37 -0
- data/test/js/rule/all_test.rb +23 -0
- data/test/js/rule/base_test.rb +34 -0
- data/test/js/rule/file_checker_test.rb +131 -0
- data/test/js/rule/jq_check_test.rb +90 -0
- data/test/js/rule/nest_try_catch_test.rb +71 -0
- data/test/js/rule/new_object_and_new_array_test.rb +38 -0
- data/test/js/rule/no_eval_test.rb +34 -0
- data/test/js/rule/no_global_test.rb +88 -0
- data/test/js/rule/private_method_check_test.rb +58 -0
- data/test/js/rule/semicolon_test.rb +63 -0
- data/test/js/rule/stat_if_with_brace_test.rb +68 -0
- data/test/js/rule/stat_if_with_muti_else_test.rb +68 -0
- data/test/js/rule/use_strict_equal_test.rb +44 -0
- data/test/js/rule_test.rb +47 -0
- data/test/js/stat/if.rb +26 -0
- data/test/js/stat/iter.rb +115 -0
- data/test/js/stat/stat.rb +91 -0
- data/test/js/stat/switch.rb +37 -0
- data/test/js/stat/try.rb +32 -0
- data/test/js/stat/var.rb +38 -0
- data/test/parser_visitable_test.rb +102 -0
- data/test/position_info_test.rb +66 -0
- data/test/rule_dsl/dsl_basic_test.rb +91 -0
- data/test/rule_dsl/importing_test.rb +48 -0
- data/test/runner/log_level_test.rb +58 -0
- metadata +317 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative '../helper'
|
|
4
|
+
|
|
5
|
+
require 'css/parser'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
module XRayTest
|
|
9
|
+
module CSS
|
|
10
|
+
class ParserTest < Test::Unit::TestCase
|
|
11
|
+
ParseError = XRay::ParseError
|
|
12
|
+
include XRay::CSS
|
|
13
|
+
|
|
14
|
+
def test_parse_stylesheet_empty
|
|
15
|
+
css = " \n "
|
|
16
|
+
sheet = parse_css css
|
|
17
|
+
assert_equal 0, sheet.statements.size
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_parse_directive
|
|
21
|
+
css = '
|
|
22
|
+
@import "subs.css";
|
|
23
|
+
@import "print-main.css" print;
|
|
24
|
+
@-moz-border-radius print {
|
|
25
|
+
body { font-size: 10pt }
|
|
26
|
+
}
|
|
27
|
+
h1 { color: blue }
|
|
28
|
+
|
|
29
|
+
@import url(http://style.china.alibaba.com/css/fdevlib2/grid/grid-min.css);
|
|
30
|
+
'
|
|
31
|
+
sheet = parse_css css
|
|
32
|
+
|
|
33
|
+
at_rules = sheet.at_rules
|
|
34
|
+
assert_equal 4, at_rules.size
|
|
35
|
+
|
|
36
|
+
assert_equal 'import', at_rules[1].keyword.text
|
|
37
|
+
assert_equal '"print-main.css" print', at_rules[1].expression.text
|
|
38
|
+
assert_equal '-moz-border-radius', at_rules[2].keyword.text
|
|
39
|
+
assert_equal 'url(http://style.china.alibaba.com/css/fdevlib2/grid/grid-min.css)',
|
|
40
|
+
at_rules[3].expression.text
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_parse_ruleset
|
|
44
|
+
css = '
|
|
45
|
+
a { font-size: 12px }
|
|
46
|
+
{ color: #fff } /* no selector */
|
|
47
|
+
'
|
|
48
|
+
|
|
49
|
+
sheet = parse_css css
|
|
50
|
+
rs = sheet.rulesets
|
|
51
|
+
assert_equal 2, rs.size
|
|
52
|
+
|
|
53
|
+
assert_equal 'a', rs[0].selector.text
|
|
54
|
+
assert_equal nil, rs[1].selector
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_parse_selector
|
|
58
|
+
css = '
|
|
59
|
+
div, #header .mypart, .div ul li {
|
|
60
|
+
font-size: 12px;
|
|
61
|
+
}
|
|
62
|
+
ul, body a, .part ul:first {
|
|
63
|
+
background: #f00;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
a[name="helloworld"], a {
|
|
67
|
+
color: #fff;
|
|
68
|
+
}
|
|
69
|
+
'
|
|
70
|
+
|
|
71
|
+
sheet = parse_css css
|
|
72
|
+
rs = sheet.rulesets
|
|
73
|
+
assert_equal 3, rs.length
|
|
74
|
+
|
|
75
|
+
assert_equal 'div, #header .mypart, .div ul li', rs[0].selector.text
|
|
76
|
+
assert_equal 3, rs[0].selector.simple_selectors.length
|
|
77
|
+
|
|
78
|
+
assert_equal 'ul, body a, .part ul:first', rs[1].selector.text
|
|
79
|
+
|
|
80
|
+
assert_equal 'a[name="helloworld"]', rs[2].selector.simple_selectors[0].text
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_parse_declarations
|
|
84
|
+
css = '
|
|
85
|
+
body {
|
|
86
|
+
;;
|
|
87
|
+
color: #333;
|
|
88
|
+
;
|
|
89
|
+
font-size: 12px
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
a:hover {
|
|
93
|
+
color: #ff7300
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
#content {
|
|
97
|
+
font-size: 12px;
|
|
98
|
+
width: 952px;
|
|
99
|
+
background: #ffffff url(img/bg.png) no-repeat left top;
|
|
100
|
+
}
|
|
101
|
+
'
|
|
102
|
+
|
|
103
|
+
sheet = parse_css css
|
|
104
|
+
rs = sheet.rulesets
|
|
105
|
+
assert_equal 3, rs.size
|
|
106
|
+
|
|
107
|
+
decs = rs[0].declarations
|
|
108
|
+
assert_equal 2, decs.size
|
|
109
|
+
assert_equal 'color', decs[0].property.text
|
|
110
|
+
assert_equal '#333', decs[0].value.text
|
|
111
|
+
assert_equal 'font-size', decs[1].property.text
|
|
112
|
+
assert_equal '12px', decs[1].value.text
|
|
113
|
+
|
|
114
|
+
assert_equal 1, rs[1].declarations.size
|
|
115
|
+
|
|
116
|
+
decs = rs[2].declarations
|
|
117
|
+
assert_equal 3, decs.size
|
|
118
|
+
assert_equal 'font-size', decs[0].property.text
|
|
119
|
+
assert_equal '12px', decs[0].value.text
|
|
120
|
+
assert_equal 'width', decs[1].property.text
|
|
121
|
+
assert_equal '952px', decs[1].value.text
|
|
122
|
+
assert_equal '#ffffff url(img/bg.png) no-repeat left top', decs[2].value.text
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def test_parse_property
|
|
126
|
+
css = %q[
|
|
127
|
+
body {
|
|
128
|
+
color: #f00;
|
|
129
|
+
_color: #0ff;
|
|
130
|
+
*font-size: 12px;
|
|
131
|
+
background: '';
|
|
132
|
+
-moz-border-radius: ''
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
sheet = parse_css css
|
|
137
|
+
decs = sheet.rulesets[0].declarations
|
|
138
|
+
assert_equal 'color', decs[0].property.text
|
|
139
|
+
assert_equal '_color', decs[1].property.text
|
|
140
|
+
assert_equal '*font-size', decs[2].property.text
|
|
141
|
+
assert_equal 'background', decs[3].property.text
|
|
142
|
+
assert_equal '-moz-border-radius', decs[4].property.text
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def test_parse_value
|
|
146
|
+
css = %q[
|
|
147
|
+
div ul>li:first {
|
|
148
|
+
content: '{123}hello"';
|
|
149
|
+
background: url("http://alibaba.com/{123}456");
|
|
150
|
+
font-family: "Lucida Sans", Arial, "\6587\6CC9\9A7F\5FAE\7C73\9ED1";
|
|
151
|
+
font-size: ' ';
|
|
152
|
+
content: ''
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
|
|
156
|
+
sheet = parse_css css
|
|
157
|
+
rs = sheet.rulesets[0]
|
|
158
|
+
decs = rs.declarations
|
|
159
|
+
|
|
160
|
+
assert_equal 'div ul>li:first', rs.selector.text
|
|
161
|
+
assert_equal %q/'{123}hello"'/, decs[0].value.text
|
|
162
|
+
assert_equal 'url("http://alibaba.com/{123}456")', decs[1].value.text
|
|
163
|
+
assert_equal '"Lucida Sans", Arial, "\6587\6CC9\9A7F\5FAE\7C73\9ED1"',
|
|
164
|
+
decs[2].value.text
|
|
165
|
+
assert_equal "' '", decs[3].value.text
|
|
166
|
+
assert_equal "''", decs[4].value.text
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def test_parse_stylesheet_broken_01
|
|
170
|
+
css = 'body {'
|
|
171
|
+
|
|
172
|
+
assert_raise(ParseError) {
|
|
173
|
+
parse_css css
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
begin
|
|
177
|
+
parse_css css
|
|
178
|
+
rescue ParseError => e
|
|
179
|
+
pos = e.position
|
|
180
|
+
assert_equal 1, pos.row
|
|
181
|
+
assert_equal 7, pos.column
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def test_parse_comment
|
|
186
|
+
css = '
|
|
187
|
+
/**
|
|
188
|
+
* this is comment
|
|
189
|
+
*/
|
|
190
|
+
body {
|
|
191
|
+
font-size: 12px;
|
|
192
|
+
/**/
|
|
193
|
+
/**这个是中文注释*/
|
|
194
|
+
}
|
|
195
|
+
/*this is comment 2*/
|
|
196
|
+
|
|
197
|
+
a { font-size: 14px; }
|
|
198
|
+
'
|
|
199
|
+
|
|
200
|
+
parser = create_parser css
|
|
201
|
+
parser.parse_stylesheet
|
|
202
|
+
|
|
203
|
+
comments = parser.comments
|
|
204
|
+
assert_equal 4, comments.size
|
|
205
|
+
assert_equal '/**这个是中文注释*/', comments[2].text
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def test_parse_stylesheet_css3
|
|
209
|
+
css = <<END
|
|
210
|
+
@charset: "utf-8";
|
|
211
|
+
|
|
212
|
+
/** animation **/
|
|
213
|
+
@-webkit-keyframes greenPulse {
|
|
214
|
+
from { background-color: #749a02; -webkit-box-shadow: 0 0 9px #333; }
|
|
215
|
+
50% { background-color: #91bd09; -webkit-box-shadow: 0 0 18px #91bd09; }
|
|
216
|
+
to { background-color: #749a02; -webkit-box-shadow: 0 0 9px #333; }
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.green.button {
|
|
220
|
+
-webkit-animation-name: greenPulse;
|
|
221
|
+
-webkit-animation-duration: 2s;
|
|
222
|
+
-webkit-animation-iteration-count: infinite;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** media query import **/
|
|
226
|
+
@import url(color.css) screen and (color);
|
|
227
|
+
|
|
228
|
+
/** media query **/
|
|
229
|
+
@media all and (min-width:500px) {
|
|
230
|
+
.big {
|
|
231
|
+
font-size:120%;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
@media screen and (color), projection and (color) {
|
|
236
|
+
.big {
|
|
237
|
+
font-size:120%;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
END
|
|
241
|
+
sheet = parse_css css
|
|
242
|
+
assert_equal 6, sheet.statements.size
|
|
243
|
+
rule = sheet.at_rules[1]
|
|
244
|
+
|
|
245
|
+
assert_equal '-webkit-keyframes', rule.keyword.text
|
|
246
|
+
rs = rule.block.rulesets
|
|
247
|
+
assert_equal 3, rs.size
|
|
248
|
+
|
|
249
|
+
assert_equal '50%', rs[1].selector.text
|
|
250
|
+
assert_equal '-webkit-box-shadow', rs[1].declarations[1].property.text
|
|
251
|
+
assert_equal '0 0 18px #91bd09', rs[1].declarations[1].value.text
|
|
252
|
+
|
|
253
|
+
rule = sheet.at_rules.last
|
|
254
|
+
assert_equal 'screen and (color), projection and (color)', rule.expression.text
|
|
255
|
+
|
|
256
|
+
rs = rule.block.rulesets[0]
|
|
257
|
+
assert_equal '.big', rs.selector.text
|
|
258
|
+
assert_equal 'font-size: 120%', rs.declarations[0].text
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
private
|
|
262
|
+
|
|
263
|
+
def create_parser(css)
|
|
264
|
+
Parser.new css, XRayTest::Logger.new
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def parse_css(css, name = 'stylesheet')
|
|
268
|
+
parser = create_parser css
|
|
269
|
+
parser.send "parse_#{name}"
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative '../../helper'
|
|
4
|
+
|
|
5
|
+
require 'node'
|
|
6
|
+
require 'css/struct'
|
|
7
|
+
require 'css/rule/checklist'
|
|
8
|
+
|
|
9
|
+
module XRayTest
|
|
10
|
+
module CSS
|
|
11
|
+
module Rule
|
|
12
|
+
|
|
13
|
+
class CheckEncodingTest < Test::Unit::TestCase
|
|
14
|
+
|
|
15
|
+
def setup
|
|
16
|
+
@runner = XRay::Runner.new :encoding => 'gb2312'
|
|
17
|
+
@expect_err = XRay::LogEntry.new("File can't be read as gb2312 charset", :fatal)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_check_utf8_file_well_written
|
|
21
|
+
check_file "#{FIXTURE_PATH}/css/utf8_good.css" do |results|
|
|
22
|
+
assert !has_encoding_error?(results), "如果没有指定css文件的编码,utf-8也是合法的"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_check_utf8_file_with_errors
|
|
27
|
+
check_file "#{FIXTURE_PATH}/css/utf8_using_star.css" do |results|
|
|
28
|
+
assert !has_encoding_error?(results), "如果没有指定css文件的编码,utf-8也是合法的"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_check_utf8_file_with_charset_declaraction
|
|
33
|
+
check_file "#{FIXTURE_PATH}/css/utf8_good_declaring_charset.css" do |results|
|
|
34
|
+
assert !has_encoding_error?(results), "带有@charset声明的文件应该可以被正确读取"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_check_gb2312_file_well_written
|
|
39
|
+
check_file "#{FIXTURE_PATH}/css/gb-good.css" do |results|
|
|
40
|
+
assert !has_encoding_error?(results), "GB2312的文件应该可以被正常读取"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_check_gb2312_file_with_errors
|
|
45
|
+
check_file "#{FIXTURE_PATH}/css/gb_using_star.css" do |results|
|
|
46
|
+
assert !has_encoding_error?(results), "GB2312的文件应该可以被正常读取"
|
|
47
|
+
assert results.any? { |r| r.message.include? '禁止使用星号选择符' }
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
def check_file( file )
|
|
53
|
+
results = @runner.check_css_file file
|
|
54
|
+
yield results
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def has_encoding_error?( results )
|
|
58
|
+
results.include? @expect_err
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative '../../helper'
|
|
4
|
+
|
|
5
|
+
require 'node'
|
|
6
|
+
require 'css/struct'
|
|
7
|
+
require 'css/rule/checklist'
|
|
8
|
+
|
|
9
|
+
module XRayTest
|
|
10
|
+
module CSS
|
|
11
|
+
module Rule
|
|
12
|
+
|
|
13
|
+
class CheckListRuleTest < Test::Unit::TestCase
|
|
14
|
+
|
|
15
|
+
include XRay::CSS, XRay::CSS::Rule, XRay::Rule, XRay::Context
|
|
16
|
+
|
|
17
|
+
Node = XRay::Node
|
|
18
|
+
XRay::Rule.import_all
|
|
19
|
+
|
|
20
|
+
def setup
|
|
21
|
+
self.scope = :page
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# selector
|
|
25
|
+
|
|
26
|
+
def test_check_selector_with_id
|
|
27
|
+
|
|
28
|
+
selector = Node.new '#mydiv a'
|
|
29
|
+
message, level = check_selector_with_id selector
|
|
30
|
+
|
|
31
|
+
assert_equal :error, level
|
|
32
|
+
|
|
33
|
+
selector = Node.new 'ul #mydiv dt'
|
|
34
|
+
ret = check_selector_with_id selector
|
|
35
|
+
assert_not_nil ret
|
|
36
|
+
|
|
37
|
+
selector = Node.new '.guide-part ul li'
|
|
38
|
+
ret = check_selector_with_id selector
|
|
39
|
+
assert_nil ret
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_check_selector_with_global_tag
|
|
43
|
+
selector = Node.new 'a'
|
|
44
|
+
message, level = check_selector_with_global_tag selector
|
|
45
|
+
|
|
46
|
+
assert_equal :error, level
|
|
47
|
+
|
|
48
|
+
selector = Node.new 'body'
|
|
49
|
+
message, level = check_selector_with_global_tag selector
|
|
50
|
+
|
|
51
|
+
assert_equal :error, level
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_check_selector_level
|
|
55
|
+
selector = Node.new '.mypart .mysubpart ul li a'
|
|
56
|
+
message, level = check_selector_level selector
|
|
57
|
+
|
|
58
|
+
assert_equal :error, level
|
|
59
|
+
|
|
60
|
+
selector = Node.new '.mypart ul li a'
|
|
61
|
+
ret = check_selector_level selector
|
|
62
|
+
assert_nil ret
|
|
63
|
+
|
|
64
|
+
selector = Node.new 'html>div.mypart ul li a'
|
|
65
|
+
message, level = check_selector_level selector
|
|
66
|
+
assert_equal :error, level
|
|
67
|
+
|
|
68
|
+
selector = Node.new 'div.mypart ul li a'
|
|
69
|
+
ret = check_selector_level selector
|
|
70
|
+
assert_nil ret
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_check_selector_with_star
|
|
74
|
+
selector = Node.new '* html'
|
|
75
|
+
message, level = check_selector_with_star selector
|
|
76
|
+
|
|
77
|
+
assert_equal :error, level
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_check_declarations_sequence
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# declaration
|
|
85
|
+
|
|
86
|
+
def test_check_good_declaration_font
|
|
87
|
+
sel = Node.new 'font'
|
|
88
|
+
expr = Node.new 'Arial'
|
|
89
|
+
dec = Declaration.new(sel, expr)
|
|
90
|
+
|
|
91
|
+
message, level = check_declaration_font dec
|
|
92
|
+
assert_equal nil, level
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test_check_declaration_font
|
|
96
|
+
sel = Node.new 'font'
|
|
97
|
+
expr = Node.new '宋体'
|
|
98
|
+
dec = Declaration.new(sel, expr)
|
|
99
|
+
|
|
100
|
+
message, level = check_declaration_font dec
|
|
101
|
+
assert_equal :error, level
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def test_check_redefine_a_hover_color
|
|
105
|
+
selector = Node.new 'a:hover'
|
|
106
|
+
|
|
107
|
+
prop = Node.new 'color'
|
|
108
|
+
expr = Node.new '#f00'
|
|
109
|
+
dec = Declaration.new(prop, expr)
|
|
110
|
+
|
|
111
|
+
ruleset = RuleSet.new(selector, [dec])
|
|
112
|
+
|
|
113
|
+
message, level = check_ruleset_redefine_a_hover_color ruleset
|
|
114
|
+
assert_equal :error, level
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def test_check_redefine_lib_css
|
|
118
|
+
selector = Node.new '.fd-hide'
|
|
119
|
+
message, level = check_selector_redefine_lib_css selector
|
|
120
|
+
assert_equal :error, level
|
|
121
|
+
|
|
122
|
+
@scope = :lib
|
|
123
|
+
ret = check_selector_redefine_lib_css selector
|
|
124
|
+
assert_nil ret
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def test_check_property_hack
|
|
128
|
+
props = %w(_background +font-size *color)
|
|
129
|
+
props.each do |prop|
|
|
130
|
+
prop = Node.new prop
|
|
131
|
+
message, level = check_property_hack prop
|
|
132
|
+
assert_equal :error, level
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def test_check_property_slash_hack
|
|
137
|
+
prop = Node.new 'd\isplay'
|
|
138
|
+
message, level = check_property_hack prop
|
|
139
|
+
assert_equal :error, level
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def test_check_selector_using_hack
|
|
143
|
+
selector = Node.new 'html*'
|
|
144
|
+
message, level = check_selector_using_hack selector
|
|
145
|
+
assert_equal :error, level
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def test_check_value_use_css_expression
|
|
149
|
+
expr = Node.new 'expression(onfocus=this.blur())'
|
|
150
|
+
message, level = check_value_use_css_expression expr
|
|
151
|
+
assert_equal :error, level
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def test_check_value_use_hack
|
|
155
|
+
exprs = %w(9px\0 #000\9)
|
|
156
|
+
exprs.each do |expr|
|
|
157
|
+
expr = Node.new expr
|
|
158
|
+
message, level = check_value_use_hack expr
|
|
159
|
+
assert_equal :error, level
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require_relative '../../helper'
|
|
3
|
+
|
|
4
|
+
require 'file_validator'
|
|
5
|
+
require 'css/rule/check_compression_rule'
|
|
6
|
+
|
|
7
|
+
module XRayTest
|
|
8
|
+
module CSS
|
|
9
|
+
module Rule
|
|
10
|
+
|
|
11
|
+
class CompressionTest < Test::Unit::TestCase
|
|
12
|
+
|
|
13
|
+
def setup
|
|
14
|
+
@validator = XRay::FileValidator.new( :encoding => 'gb2312' )
|
|
15
|
+
@validator.add_validator XRay::CSS::Rule::CompressionChecker.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_source_file_with_min
|
|
19
|
+
file = "#{FIXTURE_PATH}/css/empty.css"
|
|
20
|
+
results = @validator.check file
|
|
21
|
+
|
|
22
|
+
assert results.empty?, "同目录下有min文件,测试应通过"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_source_file_without_min
|
|
26
|
+
file = "#{FIXTURE_PATH}/css/import.css"
|
|
27
|
+
results = @validator.check file
|
|
28
|
+
|
|
29
|
+
expect_err = XRay::LogEntry.new('发布上线的文件需要压缩,命名规则如a.js->a-min.js,且两者在同一目录下', :error)
|
|
30
|
+
assert_equal [expect_err], results, "同目录下没有对应的min文件,测试不应通过"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_merge_file
|
|
34
|
+
file = 'merge.css'
|
|
35
|
+
results = @validator.check file
|
|
36
|
+
|
|
37
|
+
assert results.empty?, "merge文件不需要被压缩"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_min_file
|
|
41
|
+
file = 'test-min.css'
|
|
42
|
+
results = @validator.check file
|
|
43
|
+
|
|
44
|
+
assert results.empty?, "本身已经被压缩,不需要再检查"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative '../../helper'
|
|
4
|
+
|
|
5
|
+
require 'node'
|
|
6
|
+
require 'css/struct'
|
|
7
|
+
require 'css/rule/checklist'
|
|
8
|
+
|
|
9
|
+
module XRayTest
|
|
10
|
+
module CSS
|
|
11
|
+
module Rule
|
|
12
|
+
|
|
13
|
+
class CheckFileNameTest < Test::Unit::TestCase
|
|
14
|
+
|
|
15
|
+
include XRay::Rule
|
|
16
|
+
|
|
17
|
+
def setup
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_file_name_with_ad
|
|
21
|
+
check 'css/ad.css' do |results|
|
|
22
|
+
expect_err = ["路径和文件名中不应该出现ad", :error]
|
|
23
|
+
assert_equal [expect_err], results, "文件名中不应出现ad"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_path_name_with_ad
|
|
28
|
+
check "/css/adver/test.css" do |results|
|
|
29
|
+
expect_err = ["路径和文件名中不应该出现ad", :error]
|
|
30
|
+
assert_equal [expect_err], results, "文件路径中不应出现ad"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_file_name_without_ad
|
|
35
|
+
check 'not-exsiting-file.css' do |results|
|
|
36
|
+
assert results.empty?, "文件名中不应出现ad,包括路径"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_file_name_with_underscore
|
|
41
|
+
check 'not_exsiting_file.css' do |results|
|
|
42
|
+
expect_err = ["文件名中单词的分隔符应该使用中横线“-”", :error]
|
|
43
|
+
assert_equal [expect_err], results, "文件名中单词的分隔符应该使用中横线“-”"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_file_name_with_upcase
|
|
48
|
+
check 'someFile.css' do |results|
|
|
49
|
+
expect_err = ["文件夹和文件命名必须用小写字母", :error]
|
|
50
|
+
assert_equal [expect_err], results, "文件夹和文件命名必须用小写字母"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_dir_name_with_minus
|
|
55
|
+
check 'test-post-offer/main.css' do |results|
|
|
56
|
+
expect_err = ["文件夹只有需要版本区分时才可用中横线分隔,如fdev-v3", :error]
|
|
57
|
+
assert_equal [expect_err], results, "文件夹只有需要版本区分时才可用中横线分隔"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_dir_name_with_version_minus
|
|
62
|
+
check 'test-2/main.css' do |results|
|
|
63
|
+
assert results.empty?, "目录名字中带有版本号时可以用中横线"
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
protected
|
|
68
|
+
def check(file, &block)
|
|
69
|
+
yield check_css_file(file)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ����:���Ϸ���
|
|
3
|
+
*
|
|
4
|
+
* @author qijun.weiqj
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* company-name
|
|
9
|
+
*/
|
|
10
|
+
.skin-topbanner {
|
|
11
|
+
background: #fddde2 url(http://img.china.alibaba.com/images/app/winport/layout/diybackground/style/temp36/topbaner.jpg);
|
|
12
|
+
}
|
|
13
|
+
.wp-company-name .chinaname, .wp-company-name .chinaname:hover {
|
|
14
|
+
color: #990033;
|
|
15
|
+
}
|
|
16
|
+
.wp-company-name .enname, .wp-company-name .enname:hover {
|
|
17
|
+
color: #a23a5c;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* top-nav
|
|
22
|
+
*/
|
|
23
|
+
.wp-top-nav {
|
|
24
|
+
border-top: 1px solid #fff;
|
|
25
|
+
border-bottom: 1px solid #fff;
|
|
26
|
+
background: #d51d5d url(http://img.china.alibaba.com/images/app/winport/layout/diybackground/style/temp36/header_menu.gif) repeat-x left top;
|
|
27
|
+
}
|
|
28
|
+
.wp-top-nav li a,
|
|
29
|
+
.wp-top-nav li a:hover {
|
|
30
|
+
color: #fff;
|
|
31
|
+
}
|
|
32
|
+
.wp-top-nav li.selected a,
|
|
33
|
+
.wp-top-nav li.selected a:hover {
|
|
34
|
+
background: url(http://img.china.alibaba.com/images/app/winport/layout/diybackground/style/temp36/header_menu_check.png) no-repeat left top;
|
|
35
|
+
_background: none;
|
|
36
|
+
_filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://img.china.alibaba.com/images/app/winport/layout/diybackground/style/temp36/header_menu_check.png,sizingMethod=scale);
|
|
37
|
+
color: #c20606;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* mod
|
|
43
|
+
*/
|
|
44
|
+
.mod .m-body {
|
|
45
|
+
border: 1px solid #ffe4e4;
|
|
46
|
+
}
|
|
47
|
+
.mod .m-header {
|
|
48
|
+
background: #333 url(http://img.china.alibaba.com/images/app/winport/layout/diybackground/style/temp36/body_cont_title.gif) repeat-x left top;
|
|
49
|
+
color: #fff;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|