site_validator 1.2.4 → 1.2.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 32a053ebce20b5c4418081aaa143b7e478609cb0
4
- data.tar.gz: 989bbc163d005228eb7b5ee4312141c82e5209f1
3
+ metadata.gz: f105d17ef7988b25bce51050e6a105274aa6d932
4
+ data.tar.gz: a3dbd8a3c79709d8a361efb93f4c7e5cd3061378
5
5
  SHA512:
6
- metadata.gz: 22985cd501a54c8ab39fd87355f27e236e6dcc70a4077bff917af8cf5ebd8e12193778e0f255427b107ea05531a79c0844dc098da7547a6cf2621a92af03b82d
7
- data.tar.gz: 3804eb122b8e7680ce0e34c36e284a1ccc4d6e158eee7d7b48440f7ecb076666d7ed2278bd1af7e25e541ed9066e685dad5e895a92623641edcd106e6c42f0a4
6
+ metadata.gz: 493c0530a53153b7c390ad05c0407d9c1f114f0afacddce3dac27fedfbc3c57c2f544dbd2980d6582830d33062ed9e95bcdd5390657b461769cf52b142ff349a
7
+ data.tar.gz: 7b19c35d266d833da7787dd0ece2eba65074ea1b8c86e1836f70616cccf215e626a9fd09fbb39864abfc56883e2c033094a458e6b572b2343d157fa5dbadc2c8
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  ###Site Validator Gem [![travis build status](https://secure.travis-ci.org/jaimeiniesta/site_validator.png?branch=master)](http://travis-ci.org/jaimeiniesta/site_validator)
2
2
 
3
- site_validator is the free, open source version of the popular [Site Validator app](https://sitevalidator.com).
3
+ site_validator is the free, open source version of the [Site Validator app](https://sitevalidator.com).
4
4
 
5
- Just pass it your site's URL and it will crawl it and validate its HTML for you, generating a comprehensive report of all errors found.
5
+ Just pass it your site's URL and it will crawl its internal links and validate their HTML for you, generating a comprehensive validation report (see [an example](http://sitevalidator.com/gem/report.html)).
6
6
 
7
7
  [![site_validator screencast](https://dl.dropboxusercontent.com/u/2268180/sitevalidator_gem_video.png)](https://sitevalidator.com/video_gem?autoplay=true)
8
8
 
@@ -2,9 +2,10 @@
2
2
 
3
3
  module SiteValidator
4
4
  ##
5
- # A message holds a message_id, a line, a text and a type
5
+ # A message holds a message_id, a line, a text a type
6
+ # and a source (for the code snippet)
6
7
  #
7
8
  # See the W3C message explanation list on
8
9
  # http://validator.w3.org/docs/errors.html
9
- Message = Struct.new(:message_id, :line, :text, :type)
10
- end
10
+ Message = Struct.new(:message_id, :line, :col, :text, :type, :source, :explanation)
11
+ end
@@ -35,7 +35,7 @@ module SiteValidator
35
35
  @errors ||= validations.errors
36
36
  .select {|e| e.message_id && !e.message_id.empty?}
37
37
  .map do |e|
38
- SiteValidator::Message.new(e.message_id, e.line, e.message, :error)
38
+ SiteValidator::Message.new(e.message_id, e.line, e.col, e.message, :error, e.source, prepare_w3c_explanation(e))
39
39
  end
40
40
  rescue Exception => e
41
41
  @exception = e.to_s
@@ -50,7 +50,7 @@ module SiteValidator
50
50
  @warnings ||= validations.warnings
51
51
  .select {|w| w.message_id && !w.message_id.empty?}
52
52
  .map do |w|
53
- SiteValidator::Message.new(w.message_id, w.line, w.message, :warning)
53
+ SiteValidator::Message.new(w.message_id, w.line, w.col, w.message, :warning, w.source, prepare_w3c_explanation(w))
54
54
  end
55
55
  rescue Exception => e
56
56
  @exception = e.to_s
@@ -70,5 +70,19 @@ module SiteValidator
70
70
  def markup_validator
71
71
  @markup_validator ||= MarkupValidator.new(:validator_uri => ENV['W3C_MARKUP_VALIDATOR_URI'] || 'http://validator.w3.org/check')
72
72
  end
73
+
74
+ ##
75
+ # Fixes the link to give feedback to the W3C
76
+ def prepare_w3c_explanation(message)
77
+ explanation = message.explanation
78
+
79
+ if explanation
80
+ explanation.strip!
81
+ explanation.gsub!("our feedback channels", "the W3C feedback channels")
82
+ explanation.gsub!("feedback.html", "http://validator.w3.org/feedback.html")
83
+ end
84
+
85
+ explanation
86
+ end
73
87
  end
74
- end
88
+ end
@@ -1,534 +1,258 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
- <meta charset=utf-8>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+
5
7
  <title>Site Validator report for <%= @url %></title>
6
- <style type="text/css">
7
- /* Bootstrap 1.4.0 */
8
- html,body{margin:0;padding:0;}
9
- h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,cite,code,del,dfn,em,img,q,s,samp,small,strike,strong,sub,sup,tt,var,dd,dl,dt,li,ol,ul,fieldset,form,label,legend,button,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;font-weight:normal;font-style:normal;font-size:100%;line-height:1;font-family:inherit;}
10
- table{border-collapse:collapse;border-spacing:0;}
11
- ol,ul{list-style:none;}
12
- q:before,q:after,blockquote:before,blockquote:after{content:"";}
13
- html{overflow-y:scroll;font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
14
- a:focus{outline:thin dotted;}
15
- a:hover,a:active{outline:0;}
16
- article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
17
- audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
18
- audio:not([controls]){display:none;}
19
- sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}
20
- sup{top:-0.5em;}
21
- sub{bottom:-0.25em;}
22
- img{border:0;-ms-interpolation-mode:bicubic;}
23
- button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;}
24
- button,input{line-height:normal;*overflow:visible;}
25
- button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}
26
- button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
27
- input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
28
- input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}
29
- textarea{overflow:auto;vertical-align:top;}
30
- body{background-color:#ffffff;margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;color:#404040;}
31
- .container{width:940px;margin-left:auto;margin-right:auto;zoom:1;}.container:before,.container:after{display:table;content:"";zoom:1;}
32
- .container:after{clear:both;}
33
- .container-fluid{position:relative;min-width:940px;padding-left:20px;padding-right:20px;zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";zoom:1;}
34
- .container-fluid:after{clear:both;}
35
- .container-fluid>.sidebar{position:absolute;top:0;left:20px;width:220px;}
36
- .container-fluid>.content{margin-left:240px;}
37
- a{color:#0069d6;text-decoration:none;line-height:inherit;font-weight:inherit;}a:hover{color:#00438a;text-decoration:underline;}
38
- .pull-right{float:right;}
39
- .pull-left{float:left;}
40
- .hide{display:none;}
41
- .show{display:block;}
42
- .row{zoom:1;margin-left:-20px;}.row:before,.row:after{display:table;content:"";zoom:1;}
43
- .row:after{clear:both;}
44
- .row>[class*="span"]{display:inline;float:left;margin-left:20px;}
45
- .span1{width:40px;}
46
- .span2{width:100px;}
47
- .span3{width:160px;}
48
- .span4{width:220px;}
49
- .span5{width:280px;}
50
- .span6{width:340px;}
51
- .span7{width:400px;}
52
- .span8{width:460px;}
53
- .span9{width:520px;}
54
- .span10{width:580px;}
55
- .span11{width:640px;}
56
- .span12{width:700px;}
57
- .span13{width:760px;}
58
- .span14{width:820px;}
59
- .span15{width:880px;}
60
- .span16{width:940px;}
61
- .span17{width:1000px;}
62
- .span18{width:1060px;}
63
- .span19{width:1120px;}
64
- .span20{width:1180px;}
65
- .span21{width:1240px;}
66
- .span22{width:1300px;}
67
- .span23{width:1360px;}
68
- .span24{width:1420px;}
69
- .row >.offset1{margin-left:80px;}
70
- .row >.offset2{margin-left:140px;}
71
- .row >.offset3{margin-left:200px;}
72
- .row >.offset4{margin-left:260px;}
73
- .row >.offset5{margin-left:320px;}
74
- .row >.offset6{margin-left:380px;}
75
- .row >.offset7{margin-left:440px;}
76
- .row >.offset8{margin-left:500px;}
77
- .row >.offset9{margin-left:560px;}
78
- .row >.offset10{margin-left:620px;}
79
- .row >.offset11{margin-left:680px;}
80
- .row >.offset12{margin-left:740px;}
81
- .span-one-third{width:300px;}
82
- .span-two-thirds{width:620px;}
83
- .offset-one-third{margin-left:340px;}
84
- .offset-two-thirds{margin-left:660px;}
85
- p{font-size:13px;font-weight:normal;line-height:18px;margin-bottom:9px;}p small{font-size:11px;color:#bfbfbf;}
86
- h1,h2,h3,h4,h5,h6{font-weight:bold;color:#404040;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#bfbfbf;}
87
- h1{margin-bottom:18px;font-size:30px;line-height:36px;}h1 small{font-size:18px;}
88
- h2{font-size:24px;line-height:36px;}h2 small{font-size:14px;}
89
- h3,h4,h5,h6{line-height:36px;}
90
- h3{font-size:18px;}h3 small{font-size:14px;}
91
- h4{font-size:16px;}h4 small{font-size:12px;}
92
- h5{font-size:14px;}
93
- h6{font-size:13px;color:#bfbfbf;text-transform:uppercase;}
94
- ul,ol{margin:0 0 18px 25px;}
95
- ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
96
- ul{list-style:disc;}
97
- ol{list-style:decimal;}
98
- li{line-height:18px;color:#808080;}
99
- ul.unstyled{list-style:none;margin-left:0;}
100
- dl{margin-bottom:18px;}dl dt,dl dd{line-height:18px;}
101
- dl dt{font-weight:bold;}
102
- dl dd{margin-left:9px;}
103
- hr{margin:20px 0 19px;border:0;border-bottom:1px solid #eee;}
104
- strong{font-style:inherit;font-weight:bold;}
105
- em{font-style:italic;font-weight:inherit;line-height:inherit;}
106
- .muted{color:#bfbfbf;}
107
- blockquote{margin-bottom:18px;border-left:5px solid #eee;padding-left:15px;}blockquote p{font-size:14px;font-weight:300;line-height:18px;margin-bottom:0;}
108
- blockquote small{display:block;font-size:12px;font-weight:300;line-height:18px;color:#bfbfbf;}blockquote small:before{content:'\2014 \00A0';}
109
- address{display:block;line-height:18px;margin-bottom:18px;}
110
- code,pre{padding:0 3px 2px;font-family:Monaco, Andale Mono, Courier New, monospace;font-size:12px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
111
- code{background-color:#fee9cc;color:rgba(0, 0, 0, 0.75);padding:1px 3px;}
112
- pre{background-color:#f5f5f5;display:block;padding:8.5px;margin:0 0 18px;line-height:18px;font-size:12px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;white-space:pre;white-space:pre-wrap;word-wrap:break-word;}
113
- form{margin-bottom:18px;}
114
- fieldset{margin-bottom:18px;padding-top:18px;}fieldset legend{display:block;padding-left:150px;font-size:19.5px;line-height:1;color:#404040;*padding:0 0 5px 145px;*line-height:1.5;}
115
- form .clearfix{margin-bottom:18px;zoom:1;}form .clearfix:before,form .clearfix:after{display:table;content:"";zoom:1;}
116
- form .clearfix:after{clear:both;}
117
- label,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:normal;}
118
- label{padding-top:6px;font-size:13px;line-height:18px;float:left;width:130px;text-align:right;color:#404040;}
119
- form .input{margin-left:150px;}
120
- input[type=checkbox],input[type=radio]{cursor:pointer;}
121
- input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;font-size:13px;line-height:18px;color:#808080;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
122
- select{padding:initial;}
123
- input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:none;}
124
- input[type=file]{background-color:#ffffff;padding:initial;border:initial;line-height:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
125
- input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;}
126
- select,input[type=file]{height:27px;*height:auto;line-height:27px;*margin-top:4px;}
127
- select[multiple]{height:inherit;background-color:#ffffff;}
128
- textarea{height:auto;}
129
- .uneditable-input{background-color:#ffffff;display:block;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
130
- :-moz-placeholder{color:#bfbfbf;}
131
- ::-webkit-input-placeholder{color:#bfbfbf;}
132
- input,textarea{-webkit-transform-style:preserve-3d;-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);}
133
- input:focus,textarea:focus{outline:0;border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);}
134
- input[type=file]:focus,input[type=checkbox]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:1px dotted #666;}
135
- form .clearfix.error>label,form .clearfix.error .help-block,form .clearfix.error .help-inline{color:#b94a48;}
136
- form .clearfix.error input,form .clearfix.error textarea{color:#b94a48;border-color:#ee5f5b;}form .clearfix.error input:focus,form .clearfix.error textarea:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
137
- form .clearfix.error .input-prepend .add-on,form .clearfix.error .input-append .add-on{color:#b94a48;background-color:#fce6e6;border-color:#b94a48;}
138
- form .clearfix.warning>label,form .clearfix.warning .help-block,form .clearfix.warning .help-inline{color:#c09853;}
139
- form .clearfix.warning input,form .clearfix.warning textarea{color:#c09853;border-color:#ccae64;}form .clearfix.warning input:focus,form .clearfix.warning textarea:focus{border-color:#be9a3f;-webkit-box-shadow:0 0 6px #e5d6b1;-moz-box-shadow:0 0 6px #e5d6b1;box-shadow:0 0 6px #e5d6b1;}
140
- form .clearfix.warning .input-prepend .add-on,form .clearfix.warning .input-append .add-on{color:#c09853;background-color:#d2b877;border-color:#c09853;}
141
- form .clearfix.success>label,form .clearfix.success .help-block,form .clearfix.success .help-inline{color:#468847;}
142
- form .clearfix.success input,form .clearfix.success textarea{color:#468847;border-color:#57a957;}form .clearfix.success input:focus,form .clearfix.success textarea:focus{border-color:#458845;-webkit-box-shadow:0 0 6px #9acc9a;-moz-box-shadow:0 0 6px #9acc9a;box-shadow:0 0 6px #9acc9a;}
143
- form .clearfix.success .input-prepend .add-on,form .clearfix.success .input-append .add-on{color:#468847;background-color:#bcddbc;border-color:#468847;}
144
- .input-mini,input.mini,textarea.mini,select.mini{width:60px;}
145
- .input-small,input.small,textarea.small,select.small{width:90px;}
146
- .input-medium,input.medium,textarea.medium,select.medium{width:150px;}
147
- .input-large,input.large,textarea.large,select.large{width:210px;}
148
- .input-xlarge,input.xlarge,textarea.xlarge,select.xlarge{width:270px;}
149
- .input-xxlarge,input.xxlarge,textarea.xxlarge,select.xxlarge{width:530px;}
150
- textarea.xxlarge{overflow-y:auto;}
151
- input.span1,textarea.span1{display:inline-block;float:none;width:30px;margin-left:0;}
152
- input.span2,textarea.span2{display:inline-block;float:none;width:90px;margin-left:0;}
153
- input.span3,textarea.span3{display:inline-block;float:none;width:150px;margin-left:0;}
154
- input.span4,textarea.span4{display:inline-block;float:none;width:210px;margin-left:0;}
155
- input.span5,textarea.span5{display:inline-block;float:none;width:270px;margin-left:0;}
156
- input.span6,textarea.span6{display:inline-block;float:none;width:330px;margin-left:0;}
157
- input.span7,textarea.span7{display:inline-block;float:none;width:390px;margin-left:0;}
158
- input.span8,textarea.span8{display:inline-block;float:none;width:450px;margin-left:0;}
159
- input.span9,textarea.span9{display:inline-block;float:none;width:510px;margin-left:0;}
160
- input.span10,textarea.span10{display:inline-block;float:none;width:570px;margin-left:0;}
161
- input.span11,textarea.span11{display:inline-block;float:none;width:630px;margin-left:0;}
162
- input.span12,textarea.span12{display:inline-block;float:none;width:690px;margin-left:0;}
163
- input.span13,textarea.span13{display:inline-block;float:none;width:750px;margin-left:0;}
164
- input.span14,textarea.span14{display:inline-block;float:none;width:810px;margin-left:0;}
165
- input.span15,textarea.span15{display:inline-block;float:none;width:870px;margin-left:0;}
166
- input.span16,textarea.span16{display:inline-block;float:none;width:930px;margin-left:0;}
167
- input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;}
168
- .actions{background:#f5f5f5;margin-top:18px;margin-bottom:18px;padding:17px 20px 18px 150px;border-top:1px solid #ddd;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;}.actions .secondary-action{float:right;}.actions .secondary-action a{line-height:30px;}.actions .secondary-action a:hover{text-decoration:underline;}
169
- .help-inline,.help-block{font-size:13px;line-height:18px;color:#bfbfbf;}
170
- .help-inline{padding-left:5px;*position:relative;*top:-5px;}
171
- .help-block{display:block;max-width:600px;}
172
- .inline-inputs{color:#808080;}.inline-inputs span{padding:0 2px 0 1px;}
173
- .input-prepend input,.input-append input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
174
- .input-prepend .add-on,.input-append .add-on{position:relative;background:#f5f5f5;border:1px solid #ccc;z-index:2;float:left;display:block;width:auto;min-width:16px;height:18px;padding:4px 4px 4px 5px;margin-right:-1px;font-weight:normal;line-height:18px;color:#bfbfbf;text-align:center;text-shadow:0 1px 0 #ffffff;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
175
- .input-prepend .active,.input-append .active{background:#a9dba9;border-color:#46a546;}
176
- .input-prepend .add-on{*margin-top:1px;}
177
- .input-append input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
178
- .input-append .add-on{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;margin-right:0;margin-left:-1px;}
179
- .inputs-list{margin:0 0 5px;width:100%;}.inputs-list li{display:block;padding:0;width:100%;}
180
- .inputs-list label{display:block;float:none;width:auto;padding:0;margin-left:20px;line-height:18px;text-align:left;white-space:normal;}.inputs-list label strong{color:#808080;}
181
- .inputs-list label small{font-size:11px;font-weight:normal;}
182
- .inputs-list .inputs-list{margin-left:25px;margin-bottom:10px;padding-top:0;}
183
- .inputs-list:first-child{padding-top:6px;}
184
- .inputs-list li+li{padding-top:2px;}
185
- .inputs-list input[type=radio],.inputs-list input[type=checkbox]{margin-bottom:0;margin-left:-20px;float:left;}
186
- .form-stacked{padding-left:20px;}.form-stacked fieldset{padding-top:9px;}
187
- .form-stacked legend{padding-left:0;}
188
- .form-stacked label{display:block;float:none;width:auto;font-weight:bold;text-align:left;line-height:20px;padding-top:0;}
189
- .form-stacked .clearfix{margin-bottom:9px;}.form-stacked .clearfix div.input{margin-left:0;}
190
- .form-stacked .inputs-list{margin-bottom:0;}.form-stacked .inputs-list li{padding-top:0;}.form-stacked .inputs-list li label{font-weight:normal;padding-top:0;}
191
- .form-stacked div.clearfix.error{padding-top:10px;padding-bottom:10px;padding-left:10px;margin-top:0;margin-left:-10px;}
192
- .form-stacked .actions{margin-left:-20px;padding-left:20px;}
193
- table{width:100%;margin-bottom:18px;padding:0;font-size:13px;border-collapse:collapse;}table th,table td{padding:10px 10px 9px;line-height:18px;text-align:left;}
194
- table th{padding-top:9px;font-weight:bold;vertical-align:middle;}
195
- table td{vertical-align:top;border-top:1px solid #ddd;}
196
- table tbody th{border-top:1px solid #ddd;vertical-align:top;}
197
- .condensed-table th,.condensed-table td{padding:5px 5px 4px;}
198
- .bordered-table{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.bordered-table th+th,.bordered-table td+td,.bordered-table th+td{border-left:1px solid #ddd;}
199
- .bordered-table thead tr:first-child th:first-child,.bordered-table tbody tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;}
200
- .bordered-table thead tr:first-child th:last-child,.bordered-table tbody tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;}
201
- .bordered-table tbody tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;}
202
- .bordered-table tbody tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;}
203
- table .span1{width:20px;}
204
- table .span2{width:60px;}
205
- table .span3{width:100px;}
206
- table .span4{width:140px;}
207
- table .span5{width:180px;}
208
- table .span6{width:220px;}
209
- table .span7{width:260px;}
210
- table .span8{width:300px;}
211
- table .span9{width:340px;}
212
- table .span10{width:380px;}
213
- table .span11{width:420px;}
214
- table .span12{width:460px;}
215
- table .span13{width:500px;}
216
- table .span14{width:540px;}
217
- table .span15{width:580px;}
218
- table .span16{width:620px;}
219
- .zebra-striped tbody tr:nth-child(odd) td,.zebra-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
220
- .zebra-striped tbody tr:hover td,.zebra-striped tbody tr:hover th{background-color:#f5f5f5;}
221
- table .header{cursor:pointer;}table .header:after{content:"";float:right;margin-top:7px;border-width:0 4px 4px;border-style:solid;border-color:#000 transparent;visibility:hidden;}
222
- table .headerSortUp,table .headerSortDown{background-color:rgba(141, 192, 219, 0.25);text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);}
223
- table .header:hover:after{visibility:visible;}
224
- table .headerSortDown:after,table .headerSortDown:hover:after{visibility:visible;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;}
225
- table .headerSortUp:after{border-bottom:none;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000;visibility:visible;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;}
226
- table .blue{color:#049cdb;border-bottom-color:#049cdb;}
227
- table .headerSortUp.blue,table .headerSortDown.blue{background-color:#ade6fe;}
228
- table .green{color:#46a546;border-bottom-color:#46a546;}
229
- table .headerSortUp.green,table .headerSortDown.green{background-color:#cdeacd;}
230
- table .red{color:#9d261d;border-bottom-color:#9d261d;}
231
- table .headerSortUp.red,table .headerSortDown.red{background-color:#f4c8c5;}
232
- table .yellow{color:#ffc40d;border-bottom-color:#ffc40d;}
233
- table .headerSortUp.yellow,table .headerSortDown.yellow{background-color:#fff6d9;}
234
- table .orange{color:#f89406;border-bottom-color:#f89406;}
235
- table .headerSortUp.orange,table .headerSortDown.orange{background-color:#fee9cc;}
236
- table .purple{color:#7a43b6;border-bottom-color:#7a43b6;}
237
- table .headerSortUp.purple,table .headerSortDown.purple{background-color:#e2d5f0;}
238
- .topbar{height:40px;position:fixed;top:0;left:0;right:0;z-index:10000;overflow:visible;}.topbar a{color:#bfbfbf;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
239
- .topbar h3 a:hover,.topbar .brand:hover,.topbar ul .active>a{background-color:#333;background-color:rgba(255, 255, 255, 0.05);color:#ffffff;text-decoration:none;}
240
- .topbar h3{position:relative;}
241
- .topbar h3 a,.topbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;color:#ffffff;font-size:20px;font-weight:200;line-height:1;}
242
- .topbar p{margin:0;line-height:40px;}.topbar p a:hover{background-color:transparent;color:#ffffff;}
243
- .topbar form{float:left;margin:5px 0 0 0;position:relative;filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;}
244
- .topbar form.pull-right{float:right;}
245
- .topbar input{background-color:#444;background-color:rgba(255, 255, 255, 0.3);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:normal;font-weight:13px;line-height:1;padding:4px 9px;color:#ffffff;color:rgba(255, 255, 255, 0.75);border:1px solid #111;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-webkit-transform-style:preserve-3d;-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.topbar input:-moz-placeholder{color:#e6e6e6;}
246
- .topbar input::-webkit-input-placeholder{color:#e6e6e6;}
247
- .topbar input:hover{background-color:#bfbfbf;background-color:rgba(255, 255, 255, 0.5);color:#ffffff;}
248
- .topbar input:focus,.topbar input.focused{outline:0;background-color:#ffffff;color:#404040;text-shadow:0 1px 0 #ffffff;border:0;padding:5px 10px;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);}
249
- .topbar-inner,.topbar .fill{background-color:#222;background-color:#222222;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);}
250
- .topbar div>ul,.nav{display:block;float:left;margin:0 10px 0 0;position:relative;left:0;}.topbar div>ul>li,.nav>li{display:block;float:left;}
251
- .topbar div>ul a,.nav a{display:block;float:none;padding:10px 10px 11px;line-height:19px;text-decoration:none;}.topbar div>ul a:hover,.nav a:hover{color:#ffffff;text-decoration:none;}
252
- .topbar div>ul .active>a,.nav .active>a{background-color:#222;background-color:rgba(0, 0, 0, 0.5);}
253
- .topbar div>ul.secondary-nav,.nav.secondary-nav{float:right;margin-left:10px;margin-right:0;}.topbar div>ul.secondary-nav .menu-dropdown,.nav.secondary-nav .menu-dropdown,.topbar div>ul.secondary-nav .dropdown-menu,.nav.secondary-nav .dropdown-menu{right:0;border:0;}
254
- .topbar div>ul a.menu:hover,.nav a.menu:hover,.topbar div>ul li.open .menu,.nav li.open .menu,.topbar div>ul .dropdown-toggle:hover,.nav .dropdown-toggle:hover,.topbar div>ul .dropdown.open .dropdown-toggle,.nav .dropdown.open .dropdown-toggle{background:#444;background:rgba(255, 255, 255, 0.05);}
255
- .topbar div>ul .menu-dropdown,.nav .menu-dropdown,.topbar div>ul .dropdown-menu,.nav .dropdown-menu{background-color:#333;}.topbar div>ul .menu-dropdown a.menu,.nav .menu-dropdown a.menu,.topbar div>ul .dropdown-menu a.menu,.nav .dropdown-menu a.menu,.topbar div>ul .menu-dropdown .dropdown-toggle,.nav .menu-dropdown .dropdown-toggle,.topbar div>ul .dropdown-menu .dropdown-toggle,.nav .dropdown-menu .dropdown-toggle{color:#ffffff;}.topbar div>ul .menu-dropdown a.menu.open,.nav .menu-dropdown a.menu.open,.topbar div>ul .dropdown-menu a.menu.open,.nav .dropdown-menu a.menu.open,.topbar div>ul .menu-dropdown .dropdown-toggle.open,.nav .menu-dropdown .dropdown-toggle.open,.topbar div>ul .dropdown-menu .dropdown-toggle.open,.nav .dropdown-menu .dropdown-toggle.open{background:#444;background:rgba(255, 255, 255, 0.05);}
256
- .topbar div>ul .menu-dropdown li a,.nav .menu-dropdown li a,.topbar div>ul .dropdown-menu li a,.nav .dropdown-menu li a{color:#999;text-shadow:0 1px 0 rgba(0, 0, 0, 0.5);}.topbar div>ul .menu-dropdown li a:hover,.nav .menu-dropdown li a:hover,.topbar div>ul .dropdown-menu li a:hover,.nav .dropdown-menu li a:hover{background-color:#191919;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));background-image:-moz-linear-gradient(top, #292929, #191919);background-image:-ms-linear-gradient(top, #292929, #191919);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));background-image:-webkit-linear-gradient(top, #292929, #191919);background-image:-o-linear-gradient(top, #292929, #191919);background-image:linear-gradient(top, #292929, #191919);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);color:#ffffff;}
257
- .topbar div>ul .menu-dropdown .active a,.nav .menu-dropdown .active a,.topbar div>ul .dropdown-menu .active a,.nav .dropdown-menu .active a{color:#ffffff;}
258
- .topbar div>ul .menu-dropdown .divider,.nav .menu-dropdown .divider,.topbar div>ul .dropdown-menu .divider,.nav .dropdown-menu .divider{background-color:#222;border-color:#444;}
259
- .topbar ul .menu-dropdown li a,.topbar ul .dropdown-menu li a{padding:4px 15px;}
260
- li.menu,.dropdown{position:relative;}
261
- a.menu:after,.dropdown-toggle:after{width:0;height:0;display:inline-block;content:"&darr;";text-indent:-99999px;vertical-align:top;margin-top:8px;margin-left:4px;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #ffffff;filter:alpha(opacity=50);-khtml-opacity:0.5;-moz-opacity:0.5;opacity:0.5;}
262
- .menu-dropdown,.dropdown-menu{background-color:#ffffff;float:left;display:none;position:absolute;top:40px;z-index:900;min-width:160px;max-width:220px;_width:160px;margin-left:0;margin-right:0;padding:6px 0;zoom:1;border-color:#999;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:0 1px 1px;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.menu-dropdown li,.dropdown-menu li{float:none;display:block;background-color:none;}
263
- .menu-dropdown .divider,.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#eee;border-bottom:1px solid #ffffff;}
264
- .topbar .dropdown-menu a,.dropdown-menu a{display:block;padding:4px 15px;clear:both;font-weight:normal;line-height:18px;color:#808080;text-shadow:0 1px 0 #ffffff;}.topbar .dropdown-menu a:hover,.dropdown-menu a:hover,.topbar .dropdown-menu a.hover,.dropdown-menu a.hover{background-color:#dddddd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));background-image:-moz-linear-gradient(top, #eeeeee, #dddddd);background-image:-ms-linear-gradient(top, #eeeeee, #dddddd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(top, #eeeeee, #dddddd);background-image:-o-linear-gradient(top, #eeeeee, #dddddd);background-image:linear-gradient(top, #eeeeee, #dddddd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);color:#404040;text-decoration:none;-webkit-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);}
265
- .open .menu,.dropdown.open .menu,.open .dropdown-toggle,.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}
266
- .open .menu-dropdown,.dropdown.open .menu-dropdown,.open .dropdown-menu,.dropdown.open .dropdown-menu{display:block;}
267
- .tabs,.pills{margin:0 0 18px;padding:0;list-style:none;zoom:1;}.tabs:before,.pills:before,.tabs:after,.pills:after{display:table;content:"";zoom:1;}
268
- .tabs:after,.pills:after{clear:both;}
269
- .tabs>li,.pills>li{float:left;}.tabs>li>a,.pills>li>a{display:block;}
270
- .tabs{border-color:#ddd;border-style:solid;border-width:0 0 1px;}.tabs>li{position:relative;margin-bottom:-1px;}.tabs>li>a{padding:0 15px;margin-right:2px;line-height:34px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.tabs>li>a:hover{text-decoration:none;background-color:#eee;border-color:#eee #eee #ddd;}
271
- .tabs .active>a,.tabs .active>a:hover{color:#808080;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
272
- .tabs .menu-dropdown,.tabs .dropdown-menu{top:35px;border-width:1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
273
- .tabs a.menu:after,.tabs .dropdown-toggle:after{border-top-color:#999;margin-top:15px;margin-left:5px;}
274
- .tabs li.open.menu .menu,.tabs .open.dropdown .dropdown-toggle{border-color:#999;}
275
- .tabs li.open a.menu:after,.tabs .dropdown.open .dropdown-toggle:after{border-top-color:#555;}
276
- .pills a{margin:5px 3px 5px 0;padding:0 15px;line-height:30px;text-shadow:0 1px 1px #ffffff;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}.pills a:hover{color:#ffffff;text-decoration:none;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);background-color:#00438a;}
277
- .pills .active a{color:#ffffff;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);background-color:#0069d6;}
278
- .pills-vertical>li{float:none;}
279
- .tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
280
- .tab-content>.active,.pill-content>.active{display:block;}
281
- .breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#f5f5f5;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;}
282
- .breadcrumb .divider{padding:0 5px;color:#bfbfbf;}
283
- .breadcrumb .active a{color:#404040;}
284
- .hero-unit{background-color:#f5f5f5;margin-bottom:30px;padding:60px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;}
285
- .hero-unit p{font-size:18px;font-weight:200;line-height:27px;}
286
- footer{margin-top:17px;padding-top:17px;border-top:1px solid #eee;}
287
- .page-header{margin-bottom:17px;border-bottom:1px solid #ddd;-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}.page-header h1{margin-bottom:8px;}
288
- .btn.danger,.alert-message.danger,.btn.danger:hover,.alert-message.danger:hover,.btn.error,.alert-message.error,.btn.error:hover,.alert-message.error:hover,.btn.success,.alert-message.success,.btn.success:hover,.alert-message.success:hover,.btn.info,.alert-message.info,.btn.info:hover,.alert-message.info:hover{color:#ffffff;}
289
- .btn .close,.alert-message .close{font-family:Arial,sans-serif;line-height:18px;}
290
- .btn.danger,.alert-message.danger,.btn.error,.alert-message.error{background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
291
- .btn.success,.alert-message.success{background-color:#57a957;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#57a957 #57a957 #3d773d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
292
- .btn.info,.alert-message.info{background-color:#339bb9;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#339bb9 #339bb9 #22697d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
293
- .btn{cursor:pointer;display:inline-block;background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);padding:5px 14px 6px;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);color:#333;font-size:13px;line-height:normal;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-webkit-transform-style:preserve-3d;-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all;}.btn:hover{background-position:0 -15px;color:#333;text-decoration:none;}
294
- .btn:focus{outline:1px dotted #666;}
295
- .btn.primary{color:#ffffff;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
296
- .btn.active,.btn :active{-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);}
297
- .btn.disabled{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
298
- .btn[disabled]{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
299
- .btn.large{font-size:15px;line-height:normal;padding:9px 14px 9px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
300
- .btn.small{padding:7px 9px 7px;font-size:11px;}
301
- :root .alert-message,:root .btn{border-radius:0 \0;}
302
- button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0;}
303
- .close{float:right;color:#000000;font-size:20px;font-weight:bold;line-height:13.5px;text-shadow:0 1px 0 #ffffff;filter:alpha(opacity=25);-khtml-opacity:0.25;-moz-opacity:0.25;opacity:0.25;}.close:hover{color:#000000;text-decoration:none;filter:alpha(opacity=40);-khtml-opacity:0.4;-moz-opacity:0.4;opacity:0.4;}
304
- .alert-message{position:relative;padding:7px 15px;margin-bottom:18px;color:#404040;background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);}.alert-message .close{margin-top:1px;*margin-top:0;}
305
- .alert-message a{font-weight:bold;color:#404040;}
306
- .alert-message.danger p a,.alert-message.error p a,.alert-message.success p a,.alert-message.info p a{color:#ffffff;}
307
- .alert-message h5{line-height:18px;}
308
- .alert-message p{margin-bottom:0;}
309
- .alert-message div{margin-top:5px;margin-bottom:2px;line-height:28px;}
310
- .alert-message .btn{-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);}
311
- .alert-message.block-message{background-image:none;background-color:#fdf5d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);padding:14px;border-color:#fceec1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}.alert-message.block-message ul,.alert-message.block-message p{margin-right:30px;}
312
- .alert-message.block-message ul{margin-bottom:0;}
313
- .alert-message.block-message li{color:#404040;}
314
- .alert-message.block-message .alert-actions{margin-top:5px;}
315
- .alert-message.block-message.error,.alert-message.block-message.success,.alert-message.block-message.info{color:#404040;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
316
- .alert-message.block-message.error{background-color:#fddfde;border-color:#fbc7c6;}
317
- .alert-message.block-message.success{background-color:#d1eed1;border-color:#bfe7bf;}
318
- .alert-message.block-message.info{background-color:#ddf4fb;border-color:#c6edf9;}
319
- .alert-message.block-message.danger p a,.alert-message.block-message.error p a,.alert-message.block-message.success p a,.alert-message.block-message.info p a{color:#404040;}
320
- .pagination{height:36px;margin:18px 0;}.pagination ul{float:left;margin:0;border:1px solid #ddd;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
321
- .pagination li{display:inline;}
322
- .pagination a{float:left;padding:0 14px;line-height:34px;border-right:1px solid;border-right-color:#ddd;border-right-color:rgba(0, 0, 0, 0.15);*border-right-color:#ddd;text-decoration:none;}
323
- .pagination a:hover,.pagination .active a{background-color:#c7eefe;}
324
- .pagination .disabled a,.pagination .disabled a:hover{background-color:transparent;color:#bfbfbf;}
325
- .pagination .next a{border:0;}
326
- .well{background-color:#f5f5f5;margin-bottom:20px;padding:19px;min-height:20px;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
327
- .modal-backdrop{background-color:#000000;position:fixed;top:0;left:0;right:0;bottom:0;z-index:10000;}.modal-backdrop.fade{opacity:0;}
328
- .modal-backdrop,.modal-backdrop.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}
329
- .modal{position:fixed;top:50%;left:50%;z-index:11000;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal .close{margin-top:7px;}
330
- .modal.fade{-webkit-transform-style:preserve-3d;-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
331
- .modal.fade.in{top:50%;}
332
- .modal-header{border-bottom:1px solid #eee;padding:5px 15px;}
333
- .modal-body{padding:15px;}
334
- .modal-body form{margin-bottom:0;}
335
- .modal-footer{background-color:#f5f5f5;padding:14px 15px 15px;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;zoom:1;margin-bottom:0;}.modal-footer:before,.modal-footer:after{display:table;content:"";zoom:1;}
336
- .modal-footer:after{clear:both;}
337
- .modal-footer .btn{float:right;margin-left:5px;}
338
- .modal .popover,.modal .twipsy{z-index:12000;}
339
- .twipsy{display:block;position:absolute;visibility:visible;padding:5px;font-size:11px;z-index:1000;filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}.twipsy.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}
340
- .twipsy.above .twipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
341
- .twipsy.left .twipsy-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
342
- .twipsy.below .twipsy-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
343
- .twipsy.right .twipsy-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
344
- .twipsy-inner{padding:3px 8px;background-color:#000000;color:white;text-align:center;max-width:200px;text-decoration:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
345
- .twipsy-arrow{position:absolute;width:0;height:0;}
346
- .popover{position:absolute;top:0;left:0;z-index:1000;padding:5px;display:none;}.popover.above .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
347
- .popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
348
- .popover.below .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
349
- .popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
350
- .popover .arrow{position:absolute;width:0;height:0;}
351
- .popover .inner{background:#000000;background:rgba(0, 0, 0, 0.8);padding:3px;overflow:hidden;width:280px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);}
352
- .popover .title{background-color:#f5f5f5;padding:9px 15px;line-height:1;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;border-bottom:1px solid #eee;}
353
- .popover .content{background-color:#ffffff;padding:14px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover .content p,.popover .content ul,.popover .content ol{margin-bottom:0;}
354
- .fade{-webkit-transform-style:preserve-3d;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;}
355
- .label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;white-space:nowrap;background-color:#bfbfbf;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.label.important{background-color:#c43c35;}
356
- .label.warning{background-color:#f89406;}
357
- .label.success{background-color:#46a546;}
358
- .label.notice{background-color:#62cffc;}
359
- .media-grid{margin-left:-20px;margin-bottom:0;zoom:1;}.media-grid:before,.media-grid:after{display:table;content:"";zoom:1;}
360
- .media-grid:after{clear:both;}
361
- .media-grid li{display:inline;}
362
- .media-grid a{float:left;padding:4px;margin:0 0 18px 20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}.media-grid a img{display:block;}
363
- .media-grid a:hover{border-color:#0069d6;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
364
- </style>
365
8
 
9
+ <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
366
10
  <style type="text/css">
367
- /* Override some defaults */
368
- html, body {
369
- background-color: #eee;
370
- }
11
+ /*
12
+ * Style tweaks from http://getbootstrap.com/examples/offcanvas/offcanvas.css
13
+ * --------------------------------------------------
14
+ */
371
15
  body {
372
- padding-top: 40px; /* 40px to make the container go all the way to the bottom of the topbar */
16
+ padding-top: 70px;
373
17
  }
374
- .container > footer p {
375
- text-align: center; /* center align it with the container */
376
- }
377
- .container {
378
- width: 820px; /* downsize our container to make the content feel a bit tighter and more cohesive. NOTE: this removes two full columns from the grid, meaning you only go to 14 columns and not 16. */
18
+ footer {
19
+ padding-left: 15px;
20
+ padding-right: 15px;
379
21
  }
380
22
 
381
- /* The white background content wrapper */
382
- .content {
383
- background-color: #fff;
384
- padding: 20px;
385
- margin: 0 -20px; /* negative indent the amount of the padding to maintain the grid system */
386
- -webkit-border-radius: 0 0 6px 6px;
387
- -moz-border-radius: 0 0 6px 6px;
388
- border-radius: 0 0 6px 6px;
389
- -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15);
390
- -moz-box-shadow: 0 1px 2px rgba(0,0,0,.15);
391
- box-shadow: 0 1px 2px rgba(0,0,0,.15);
392
- }
23
+ /*
24
+ * Off Canvas
25
+ * --------------------------------------------------
26
+ */
27
+ @media screen and (max-width: 768px) {
28
+ .row-offcanvas {
29
+ position: relative;
30
+ -webkit-transition: all 0.25s ease-out;
31
+ -moz-transition: all 0.25s ease-out;
32
+ transition: all 0.25s ease-out;
33
+ }
34
+
35
+ .row-offcanvas-right
36
+ .sidebar-offcanvas {
37
+ right: -50%; /* 6 columns */
38
+ }
39
+
40
+ .row-offcanvas-left
41
+ .sidebar-offcanvas {
42
+ left: -50%; /* 6 columns */
43
+ }
393
44
 
394
- /* Page header tweaks */
395
- .page-header {
396
- background-color: #f5f5f5;
397
- padding: 20px 20px 10px;
398
- margin: -20px -20px 20px;
45
+ .row-offcanvas-right.active {
46
+ right: 50%; /* 6 columns */
47
+ }
48
+
49
+ .row-offcanvas-left.active {
50
+ left: 50%; /* 6 columns */
51
+ }
52
+
53
+ .sidebar-offcanvas {
54
+ position: absolute;
55
+ top: 0;
56
+ width: 50%; /* 6 columns */
57
+ }
399
58
  }
59
+ </style>
60
+
61
+ <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
62
+ <!--[if lt IE 9]>
63
+ <script src="http://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6.2/html5shiv.js"></script>
64
+ <script src="http://cdnjs.cloudflare.com/ajax/libs/respond.js/1.3.0/respond.js"></script>
65
+ <![endif]-->
66
+
67
+ <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css">
68
+
69
+ <link rel="stylesheet" href="https://sitevalidator.com/cdn/highlightjs/7.3/styles/default.min.css">
70
+
71
+ <style type="text/css">
72
+
73
+ h1 { margin-top: 0px; margin-bottom: 15px; }
74
+
75
+ a.navbar-brand { color: #FFF !important; }
76
+
77
+ footer { margin-top: 10px; font-weight: bold; font-size: 0.95em; }
400
78
 
401
- /* Give a quick and non-cross-browser friendly divider */
402
- .content .span4 {
403
- margin-left: 0;
404
- padding-left: 19px;
405
- border-left: 1px solid #eee;
79
+ /* Tabs */
80
+ .tab-content {
81
+ border: 1px solid #ddd;
82
+ border-top: 0px;
83
+ padding: 10px;
406
84
  }
407
85
 
408
- .topbar .btn {
409
- border: 0;
86
+ .nav-tabs {
87
+ margin-bottom: 0;
410
88
  }
411
89
 
90
+ /* Explanations */
91
+ .w3c_explanation { border: 1px solid #ddd; background-color: #ffe; padding: 10px; margin: 5px 5px 25px 5px; font-size: 0.8em; }
92
+ .helpwanted { float: right; font-size: 2em; }
93
+ .coordinates { float: right; margin: 10px; background-color: #fff; color: #333; border: 1px solid #aaa;}
94
+
412
95
  </style>
413
96
  </head>
97
+
414
98
  <body>
415
- <div class="topbar">
416
- <div class="fill">
417
- <div class="container">
418
- <a class="brand" href="http://sitevalidator.com"><strong>Site Validator</strong></a>
419
- <ul class="nav" data-dropdown="dropdown" >
420
- <li><a href="http://sitevalidator.com/faqs">FAQs</a></li>
99
+
100
+ <div class="navbar navbar-fixed-top navbar-inverse" role="navigation">
101
+ <div class="container">
102
+ <div class="navbar-header">
103
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
104
+ <span class="icon-bar"></span>
105
+ <span class="icon-bar"></span>
106
+ <span class="icon-bar"></span>
107
+ </button>
108
+ <a class="navbar-brand" href="https://sitevalidator.com">Site Validator</a>
109
+ </div>
110
+ <div class="collapse navbar-collapse">
111
+ <ul class="nav navbar-nav">
421
112
  <li><a href="http://sitevalidator.com/plans-and-pricing">Plans and pricing</a></li>
422
- <li><a href="http://sitevalidator.com/contact">Contact</a></li>
113
+ <li><a href="https://sitevalidator.com/faqs">FAQs</a></li>
114
+ <li><a href="mailto:support@sitevalidator.com">Contact</a></li>
423
115
  </ul>
424
- </div>
425
- </div>
426
- </div>
116
+ </div><!-- /.nav-collapse -->
117
+ </div><!-- /.container -->
118
+ </div><!-- /.navbar -->
427
119
 
428
120
  <div class="container">
429
- <div class="content">
430
- <h1>MARKUP VALIDATION FOR <a href='<%= @url %>'><%= @url %></a></h1>
431
-
432
- <h2>SITEMAP SUMMARY</h2>
433
- <p>TOTAL: <%= errors.length %> errors, <%= warnings.length %> warnings.</p>
434
-
435
- <% if errors.length > 0 %>
436
- <h2>POPULAR ERRORS</h2>
437
- <ul>
438
- <% errors.group_by {|e| e.message_id}.sort_by {|m,e| e.length}.reverse.each do |message_id, errors| %>
439
- <% if message_id == 'html5' %>
440
- <li><%= errors.length %> HTML5 errors found</li>
441
- <li>
442
- <ul>
443
- <% errors.select{|e| e.message_id == 'html5'}
444
- .group_by {|e| e.text}
445
- .sort_by {|m,e| e.length}
446
- .reverse.each do |text, errors| %>
447
- <li><%= errors.length %> times: <strong><%= CGI::escapeHTML(text) %></strong></li>
121
+
122
+ <h1>Site validation for <a href='<%= @url %>'><%= @url %></a></h1>
123
+
124
+ <ul class="nav nav-tabs">
125
+ <li class="active"><a href="#urls">List of URLs</a></li>
126
+ <li><a href="#errors"><%= errors.length %> HTML errors</a></li>
127
+ <li><a href="#warnings"><%= warnings.length %> HTML warnings</a></li>
128
+ </ul>
129
+
130
+ <div class="tab-content">
131
+ <div class="tab-pane active" id="urls">
132
+ <% processed_pages = pages.select{|p| !p.exception} %>
133
+ <% if processed_pages.size > 0 %>
134
+ <div class="accordion">
135
+ <% processed_pages.each do |page| %>
136
+ <h3>
137
+ <%= page.url %>
138
+ <div class="pull-right">
139
+ <span class="label label-danger"><%= "#{page.errors.length} ERRORS" %></span>
140
+ <span class="label label-warning"><%= "#{page.warnings.length} WARNINGS" %></span>
141
+ </div>
142
+ </h3>
143
+
144
+ <div style="padding:10px;">
145
+ <div class="accordion">
146
+ <% page.errors.sort_by {|e| e.line.to_i}.each do |error| %>
147
+ <h3>
148
+ <span class="label label-danger">ERROR</span>
149
+ <%= CGI::escapeHTML(error.text.capitalize) %>
150
+ </h3>
151
+
152
+ <div>
153
+ <% if error.line && error.col %>
154
+ <span class="coordinates label">
155
+ LINE <%= error.line %>, COL <%= error.col %>
156
+ </span>
157
+ <% end %>
158
+
159
+ <% if error.source && error.source.strip.length > 0 %>
160
+ <pre><code class="html"><%= error.source.strip %></code></pre>
161
+ <% end %>
162
+
163
+ <% if error.explanation && error.explanation.strip.length > 0 %>
164
+ <div class="w3c_explanation"><%= error.explanation.strip %></div>
165
+ <% end %>
166
+ </div>
167
+ <% end %>
168
+
169
+ <% page.warnings.sort_by {|w| w.line.to_i}.each do |warning| %>
170
+ <h3>
171
+ <span class="label label-warning">WARNING</span>
172
+ <%= CGI::escapeHTML(warning.text.capitalize) %>
173
+ </h3>
174
+
175
+ <div>
176
+ <% if warning.line && warning.col %>
177
+ <span class="coordinates label">
178
+ LINE <%= warning.line %>, COL <%= warning.col %>
179
+ </span>
180
+ <% end %>
181
+
182
+ <% if warning.source && warning.source.strip.length > 0 %>
183
+ <pre><code class="html"><%= warning.source.strip %></code></pre>
184
+ <% end %>
185
+
186
+ <% if warning.explanation && warning.explanation.strip.length > 0 %>
187
+ <div class="w3c_explanation"><%= warning.explanation.strip %></div>
188
+ <% end %>
189
+ </div>
190
+ <% end %>
191
+ </div>
192
+ </div>
193
+ <% end %>
194
+ </div>
195
+ <% end %>
196
+ </div>
197
+
198
+ <div class="tab-pane" id="errors">
199
+ <% if errors.length > 0 %>
200
+ <div class="accordion">
201
+ <% errors.group_by {|e| e.text}.sort_by {|t, e| e.length}.reverse.each do |text, errors| %>
202
+ <h3><span class="label label-danger"><%= errors.length %></span> <%= CGI::escapeHTML(text.capitalize) %></h3>
203
+ <div>
204
+ <% if errors.first.explanation && errors.first.explanation.strip.length > 0 %>
205
+ <div class="w3c_explanation"><%= errors.first.explanation.strip %></div>
448
206
  <% end %>
449
- </ul>
450
- </li>
451
- <% elsif message_id %>
452
- <li>error <a href="http://validator.w3.org/docs/errors.html#ve-<%= message_id %>"><%= message_id %></a>
453
- happens <%= errors.length %> times</li>
207
+ </div>
454
208
  <% end %>
209
+ </div>
455
210
  <% end %>
456
- </ul>
457
- <% end %>
458
-
459
- <% if warnings.length > 0 %>
460
- <h2>POPULAR WARNINGS</h2>
461
- <ul>
462
- <% warnings.group_by {|w| w.message_id}.sort_by {|m,w| w.length}.reverse.each do |message_id, warnings| %>
463
- <% if message_id == 'html5' %>
464
- <li><%= warnings.length %> HTML5 warnings found</li>
465
- <li>
466
- <ul>
467
- <% warnings.select{|w| w.message_id == 'html5'}
468
- .group_by {|w| w.text}
469
- .sort_by {|m,w| w.length}
470
- .reverse.each do |text, warnings| %>
471
- <li><%= warnings.length %> times: <strong><%= CGI::escapeHTML(text) %></strong></li>
211
+ </div>
212
+
213
+ <div class="tab-pane" id="warnings">
214
+ <% if warnings.length > 0 %>
215
+ <div class="accordion">
216
+ <% warnings.group_by {|w| w.text}.sort_by {|t, w| w.length}.reverse.each do |text, warnings| %>
217
+ <h3><span class="label label-warning"><%= warnings.length %></span> <%= CGI::escapeHTML(text.capitalize) %></h3>
218
+ <div>
219
+ <% if warnings.first.explanation && warnings.first.explanation.strip.length > 0 %>
220
+ <div class="w3c_explanation"><%= warnings.first.explanation.strip %></div>
472
221
  <% end %>
473
- </ul>
474
- </li>
475
- <% elsif message_id %>
476
- <li>warning <a href="http://validator.w3.org/docs/errors.html#ve-<%= message_id %>"><%= message_id %></a>
477
- found <%= warnings.length %> times</li>
222
+ </div>
478
223
  <% end %>
479
- <% end %>
480
- </ul>
481
- <% end %>
482
-
483
- <% processed_pages = pages.select{|p| !p.exception} %>
484
- <% if processed_pages.size > 0 %>
485
- <h2>DETAILS PER PAGE</h2>
486
- <% processed_pages.each do |page| %>
487
- <div class='page'>
488
- <h3><a href='<%= page.url %>'><%= page.url %></a></h3>
489
- <p class='page_summary'>
490
- <%= "#{page.errors.length} errors, #{page.warnings.length} warnings" %>
491
- </p>
492
-
493
- <ul class="page_errors">
494
- <% page.errors.sort_by {|e| e.line.to_i}.each do |error| %>
495
- <li>
496
- <% if error.message_id == 'html5' %>
497
- HTML5 error on line <%= error.line %>:
498
- <% else %>
499
- Error <a href="http://validator.w3.org/docs/errors.html#ve-<%= error.message_id %>"><%= error.message_id %></a>
500
- on line <%= error.line %>:
501
- <% end %>
502
-
503
- <%= CGI::escapeHTML(error.text) %>
504
- </li>
505
- <% end %>
506
- </ul>
507
-
508
- <ul class="page_warnings">
509
- <% page.warnings.sort_by {|w| w.line.to_i}.each do |warning| %>
510
- <li>
511
- <% if warning.message_id == 'html5' %>
512
- HTML5 warning on line <%= warning.line %>:
513
- <% else %>
514
- Warning <a href="http://validator.w3.org/docs/errors.html#ve-<%= warning.message_id %>"><%= warning.message_id %></a>
515
- on line <%= warning.line %>:
516
- <% end %>
517
-
518
- <%= CGI::escapeHTML(warning.text) %>
519
- </li>
520
- <% end %>
521
- </ul>
522
224
  </div>
523
225
  <% end %>
524
- <% end %>
525
-
526
- <footer>
527
- <p>This markup validation report has been generated using the <a href="https://github.com/jaimeiniesta/site_validator">SiteValidator</a> gem.</p>
528
- <p>You can also find an online version that lets you store the results and re-check the URLs later, at <a href="http://sitevalidator.com">sitevalidator.com</a>.</p>
529
- <p><strong>SiteValidator</strong> is a lovely site-wide markup validator. We're not associated with the W3C but we love it!</p>
530
- </footer>
226
+ </div>
531
227
  </div>
228
+
229
+ <footer class="well well-lg">
230
+ <p>This site validation report has been generated using the free, open source <a href="http://gem.sitevalidator.com">Site Validator ruby gem</a>.</p>
231
+ <p>For deep link crawling, HTML+CSS validation, storage of results and team collaborations, you can use the <a href="https://sitevalidator.com">Site Validator app</a>.</p>
232
+ <p class="small">We're independent, not associated with the W3C.</p>
233
+ </footer>
234
+
532
235
  </div>
236
+
237
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
238
+ <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
239
+ <script type="text/javascript">
240
+ $('.accordion').accordion({active: 'false', heightStyle: 'content' });
241
+ </script>
242
+
243
+ <script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
244
+
245
+ <script type="text/javascript">
246
+ $('.nav-tabs a').click(function (e) {
247
+ e.preventDefault();
248
+ $(this).tab('show');
249
+ })
250
+ </script>
251
+
252
+ <script src="https://sitevalidator.com/cdn/highlightjs/7.3/highlight.min.js"></script>
253
+ <script type="text/javascript">
254
+ hljs.initHighlightingOnLoad();
255
+ </script>
256
+
533
257
  </body>
534
258
  </html>
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  module SiteValidator
4
- VERSION = "1.2.4"
4
+ VERSION = "1.2.5"
5
5
  end
data/spec/message_spec.rb CHANGED
@@ -5,13 +5,19 @@ require_relative 'spec_helper'
5
5
  describe SiteValidator::Message do
6
6
  before(:each) do
7
7
  @error_message = SiteValidator::Message.new('25',
8
- 100,
9
- message_text('25'),
10
- :error)
8
+ 100,
9
+ 20,
10
+ message_text('25'),
11
+ :error,
12
+ 'a code snippet',
13
+ 'an explanation')
11
14
  @warning_message = SiteValidator::Message.new('25',
12
- 100,
13
- message_text('25'),
14
- :warning)
15
+ 100,
16
+ 20,
17
+ message_text('25'),
18
+ :warning,
19
+ 'a code snippet',
20
+ 'an explanation')
15
21
  end
16
22
 
17
23
  it "should have a message_id" do
@@ -22,12 +28,26 @@ describe SiteValidator::Message do
22
28
  @error_message.line.should == 100
23
29
  end
24
30
 
31
+ it "should have a col" do
32
+ @error_message.col.should == 20
33
+ end
34
+
25
35
  it "should have a text" do
26
36
  @error_message.text.should == message_text('25')
27
37
  end
28
38
 
29
39
  it "should have a type" do
30
- @error_message.type == :error
31
- @warning_message.type == :warning
40
+ @error_message.type.should == :error
41
+ @warning_message.type.should == :warning
42
+ end
43
+
44
+ it "should have a source" do
45
+ @error_message.source.should == 'a code snippet'
46
+ @warning_message.source.should == 'a code snippet'
47
+ end
48
+
49
+ it "should have an explanation" do
50
+ @error_message.explanation.should == 'an explanation'
51
+ @warning_message.explanation.should == 'an explanation'
32
52
  end
33
- end
53
+ end
@@ -6,14 +6,14 @@ module SiteValidator
6
6
  @errors, @warnings = [], []
7
7
  end
8
8
 
9
- def add_error(message_id, line, message)
10
- @errors << SiteValidator::MockedMessage.new(message_id, line, message)
9
+ def add_error(message_id, line, col, message, source, explanation)
10
+ @errors << SiteValidator::MockedMessage.new(message_id, line, col, message, source, explanation)
11
11
  end
12
12
 
13
- def add_warning(message_id, line, message)
14
- @warnings << SiteValidator::MockedMessage.new(message_id, line, message)
13
+ def add_warning(message_id, line, col, message, source, explanation)
14
+ @warnings << SiteValidator::MockedMessage.new(message_id, line, col, message, source, explanation)
15
15
  end
16
16
  end
17
17
 
18
- MockedMessage = Struct.new(:message_id, :line, :message)
19
- end
18
+ MockedMessage = Struct.new(:message_id, :line, :col, :message, :source, :explanation)
19
+ end
data/spec/page_spec.rb CHANGED
@@ -50,18 +50,27 @@ describe SiteValidator::Page do
50
50
 
51
51
  @page.errors[0].message_id.should == '25'
52
52
  @page.errors[0].line.should == '92'
53
+ @page.errors[0].col.should == '22'
53
54
  @page.errors[0].text.should == message_text('25')
54
55
  @page.errors[0].type.should == :error
56
+ @page.errors[0].source.should == 'a code snippet for line 92'
57
+ @page.errors[0].explanation.should == 'an explanation for error 25'
55
58
 
56
59
  @page.errors[1].message_id.should == '325'
57
60
  @page.errors[1].line.should == '92'
61
+ @page.errors[1].col.should == '22'
58
62
  @page.errors[1].text.should == message_text('325')
59
63
  @page.errors[1].type.should == :error
64
+ @page.errors[1].source.should == 'another code snippet for line 92'
65
+ @page.errors[1].explanation.should == 'an explanation for error 325'
60
66
 
61
67
  @page.errors[2].message_id.should == '325'
62
68
  @page.errors[2].line.should == '224'
69
+ @page.errors[2].col.should == '17'
63
70
  @page.errors[2].text.should == message_text('325')
64
71
  @page.errors[2].type.should == :error
72
+ @page.errors[2].source.should == 'another code snippet for line 325'
73
+ @page.errors[2].explanation.should == 'an explanation for error 325'
65
74
  end
66
75
 
67
76
  it "should get its validation warnings from the W3C" do
@@ -73,18 +82,27 @@ describe SiteValidator::Page do
73
82
 
74
83
  @page.warnings[0].message_id.should == '338'
75
84
  @page.warnings[0].line.should == '92'
85
+ @page.warnings[0].col.should == '22'
76
86
  @page.warnings[0].text.should == message_text('338')
77
87
  @page.warnings[0].type.should == :warning
88
+ @page.warnings[0].source.should == 'a code snippet for line 338'
89
+ @page.warnings[0].explanation.should == 'an explanation for warning 338'
78
90
 
79
91
  @page.warnings[1].message_id.should == '247'
80
92
  @page.warnings[1].line.should == '112'
93
+ @page.warnings[1].col.should == '18'
81
94
  @page.warnings[1].text.should == message_text('247')
82
95
  @page.warnings[1].type.should == :warning
96
+ @page.warnings[1].source.should == 'another code snippet for line 247'
97
+ @page.warnings[1].explanation.should == 'an explanation for warning 247'
83
98
 
84
99
  @page.warnings[2].message_id.should == '247'
85
100
  @page.warnings[2].line.should == '202'
101
+ @page.warnings[2].col.should == '47'
86
102
  @page.warnings[2].text.should == message_text('247')
87
103
  @page.warnings[2].type.should == :warning
104
+ @page.warnings[2].source.should == 'another code snippet for line 247'
105
+ @page.warnings[2].explanation.should == 'an explanation for warning 247'
88
106
  end
89
107
 
90
108
  it "should recover from timeouts when checking for errors" do
@@ -111,9 +129,9 @@ describe SiteValidator::Page do
111
129
 
112
130
  it "should not record empty errors returned by the validator" do
113
131
  mocked_validator = SiteValidator::MockedValidator.new
114
- mocked_validator.add_error('25', '92', message_text('25'))
115
- mocked_validator.add_error('', '', '')
116
- mocked_validator.add_error(nil, nil, nil)
132
+ mocked_validator.add_error('25', '92', '22', message_text('25'), 'code snippet', 'an explanation')
133
+ mocked_validator.add_error('', '', '', '', '', '')
134
+ mocked_validator.add_error(nil, nil, nil, nil, nil, nil)
117
135
  MarkupValidator.any_instance
118
136
  .stubs(:validate_uri)
119
137
  .with('http://example.com/emptyerrors')
@@ -125,9 +143,9 @@ describe SiteValidator::Page do
125
143
 
126
144
  it "should not record empty warnings returned by the validator" do
127
145
  mocked_validator = SiteValidator::MockedValidator.new
128
- mocked_validator.add_warning('25', '92', message_text('25'))
129
- mocked_validator.add_warning('', '', '')
130
- mocked_validator.add_warning(nil, nil, nil)
146
+ mocked_validator.add_warning('25', '92', '22', message_text('25'), 'code snippet', 'an explanation')
147
+ mocked_validator.add_warning('', '', '', '', '', '')
148
+ mocked_validator.add_warning(nil, nil, nil, nil, nil, nil)
131
149
  MarkupValidator.any_instance
132
150
  .stubs(:validate_uri)
133
151
  .with('http://example.com/emptyerrors')
data/spec/spec_helper.rb CHANGED
@@ -37,15 +37,15 @@ def stubbed_validator_results(with_errors=true, with_warnings=true)
37
37
  fake_validator = SiteValidator::MockedValidator.new
38
38
 
39
39
  if with_errors
40
- fake_validator.add_error('25', '92', message_text('25'))
41
- fake_validator.add_error('325', '92', message_text('325'))
42
- fake_validator.add_error('325', '224', message_text('325'))
40
+ fake_validator.add_error('25', '92', '22', message_text('25'), 'a code snippet for line 92', 'an explanation for error 25')
41
+ fake_validator.add_error('325', '92', '22', message_text('325'), 'another code snippet for line 92', 'an explanation for error 325')
42
+ fake_validator.add_error('325', '224', '17', message_text('325'), 'another code snippet for line 325', 'an explanation for error 325')
43
43
  end
44
44
 
45
45
  if with_warnings
46
- fake_validator.add_warning('338', '92', message_text('338'))
47
- fake_validator.add_warning('247', '112', message_text('247'))
48
- fake_validator.add_warning('247', '202', message_text('247'))
46
+ fake_validator.add_warning('338', '92', '22', message_text('338'), 'a code snippet for line 338', 'an explanation for warning 338')
47
+ fake_validator.add_warning('247', '112', '18', message_text('247'), 'another code snippet for line 247', 'an explanation for warning 247')
48
+ fake_validator.add_warning('247', '202', '47', message_text('247'), 'another code snippet for line 247', 'an explanation for warning 247')
49
49
  end
50
50
 
51
51
  fake_validator
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: site_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4
4
+ version: 1.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jaime Iniesta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-23 00:00:00.000000000 Z
11
+ date: 2013-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: w3c_validators