hatemile 2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/CODE_OF_CONDUCT.md +46 -0
  3. data/Gemfile +9 -0
  4. data/LICENSE +202 -0
  5. data/Rakefile +64 -0
  6. data/hatemile.gemspec +37 -0
  7. data/lib/hatemile/accessible_association.rb +62 -0
  8. data/lib/hatemile/accessible_css.rb +43 -0
  9. data/lib/hatemile/accessible_display.rb +178 -0
  10. data/lib/hatemile/accessible_event.rb +95 -0
  11. data/lib/hatemile/accessible_form.rb +101 -0
  12. data/lib/hatemile/accessible_navigation.rb +82 -0
  13. data/lib/hatemile/helper.rb +58 -0
  14. data/lib/hatemile/implementation/accessible_association_implementation.rb +346 -0
  15. data/lib/hatemile/implementation/accessible_css_implementation.rb +772 -0
  16. data/lib/hatemile/implementation/accessible_display_implementation.rb +1362 -0
  17. data/lib/hatemile/implementation/accessible_event_implementation.rb +278 -0
  18. data/lib/hatemile/implementation/accessible_form_implementation.rb +386 -0
  19. data/lib/hatemile/implementation/accessible_navigation_implementation.rb +561 -0
  20. data/lib/hatemile/util/common_functions.rb +106 -0
  21. data/lib/hatemile/util/configure.rb +92 -0
  22. data/lib/hatemile/util/css/rcp/rcp_declaration.rb +77 -0
  23. data/lib/hatemile/util/css/rcp/rcp_parser.rb +115 -0
  24. data/lib/hatemile/util/css/rcp/rcp_rule.rb +86 -0
  25. data/lib/hatemile/util/css/style_sheet_declaration.rb +59 -0
  26. data/lib/hatemile/util/css/style_sheet_parser.rb +43 -0
  27. data/lib/hatemile/util/css/style_sheet_rule.rb +73 -0
  28. data/lib/hatemile/util/html/html_dom_element.rb +234 -0
  29. data/lib/hatemile/util/html/html_dom_node.rb +131 -0
  30. data/lib/hatemile/util/html/html_dom_parser.rb +150 -0
  31. data/lib/hatemile/util/html/html_dom_text_node.rb +43 -0
  32. data/lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb +302 -0
  33. data/lib/hatemile/util/html/nokogiri/nokogiri_html_dom_node.rb +112 -0
  34. data/lib/hatemile/util/html/nokogiri/nokogiri_html_dom_parser.rb +208 -0
  35. data/lib/hatemile/util/html/nokogiri/nokogiri_html_dom_text_node.rb +83 -0
  36. data/lib/hatemile/util/id_generator.rb +53 -0
  37. data/lib/js/common.js +98 -0
  38. data/lib/js/eventlistener.js +36 -0
  39. data/lib/js/include.js +292 -0
  40. data/lib/js/scriptlist_validation_fields.js +13 -0
  41. data/lib/js/validation.js +205 -0
  42. data/lib/locale/en-US.yml +388 -0
  43. data/lib/locale/pt-BR.yml +389 -0
  44. data/lib/skippers.xml +6 -0
  45. data/lib/symbols.xml +40 -0
  46. data/test/locale/en-US.yml +5 -0
  47. data/test/locale/pt-BR.yml +4 -0
  48. data/test/test_accessible_association_implementation.rb +258 -0
  49. data/test/test_accessible_css_implementation.rb +518 -0
  50. data/test/test_accessible_display_implementation.rb +873 -0
  51. data/test/test_accessible_form_implementation.rb +283 -0
  52. data/test/test_accessible_navigation_implementation.rb +228 -0
  53. data/test/test_common_functions.rb +128 -0
  54. data/test/test_configure.rb +73 -0
  55. data/test/test_nokogiri_html_dom_element.rb +586 -0
  56. data/test/test_nokogiri_html_dom_parser.rb +363 -0
  57. data/test/test_nokogiri_html_dom_text_node.rb +225 -0
  58. data/test/test_rcp_declaration.rb +103 -0
  59. data/test/test_rcp_parser.rb +86 -0
  60. data/test/test_rcp_rule.rb +89 -0
  61. metadata +199 -0
@@ -0,0 +1,106 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ ##
14
+ # The Hatemile module contains the interfaces with the acessibility solutions.
15
+ module Hatemile
16
+ ##
17
+ # The Hatemile::Util module contains the utilities of library.
18
+ module Util
19
+ ##
20
+ # The CommonFunctions module contains the used methods by HaTeMiLe classes.
21
+ module CommonFunctions
22
+ ##
23
+ # The name of attribute for not modify the elements.
24
+ DATA_IGNORE = 'data-ignoreaccessibilityfix'.freeze
25
+
26
+ ##
27
+ # Copy a list of attributes of a element for other element.
28
+ #
29
+ # @param element1 [Hatemile::Util::Html::HTMLDOMElement] The element that
30
+ # have attributes copied.
31
+ # @param element2 [Hatemile::Util::Html::HTMLDOMElement] The element that
32
+ # copy the attributes.
33
+ # @param attributes [Array<String>] The list of attributes that will be
34
+ # copied.
35
+ # @return [void]
36
+ def self.set_list_attributes(element1, element2, attributes)
37
+ attributes.each do |attribute|
38
+ if element1.has_attribute?(attribute)
39
+ element2.set_attribute(attribute, element1.get_attribute(attribute))
40
+ end
41
+ end
42
+ end
43
+
44
+ ##
45
+ # Increase a item in a HTML list.
46
+ #
47
+ # @param list [String] The list.
48
+ # @param string_to_increase [String] The value of item.
49
+ # @return [String] The HTML list with the item added, if the item not was
50
+ # contained in list.
51
+ def self.increase_in_list(list, string_to_increase)
52
+ if !list.nil? &&
53
+ !list.empty? &&
54
+ !string_to_increase.nil? &&
55
+ !string_to_increase.empty?
56
+ return list if in_list?(list, string_to_increase)
57
+ return "#{list} #{string_to_increase}"
58
+ elsif !list.nil? && !list.empty?
59
+ return list
60
+ end
61
+ string_to_increase
62
+ end
63
+
64
+ ##
65
+ # Verify if the list contains the item.
66
+ #
67
+ # @param list [String] The list.
68
+ # @param string_to_search [String] The value of item.
69
+ # @return [Boolean] True if the list contains the item or false is not
70
+ # contains.
71
+ def self.in_list?(list, string_to_search)
72
+ if !list.nil? &&
73
+ !list.empty? &&
74
+ !string_to_search.nil? &&
75
+ !string_to_search.empty?
76
+ elements = list.split(/[ \n\t\r]+/)
77
+ elements.each do |element|
78
+ return true if element == string_to_search
79
+ end
80
+ end
81
+ false
82
+ end
83
+
84
+ ##
85
+ # Check that the element can be manipulated by HaTeMiLe.
86
+ #
87
+ # @param element [Hatemile::Util::Html::HTMLDOMElement] The element.
88
+ # @return [Boolean] True if element can be manipulated or false if element
89
+ # cannot be manipulated.
90
+ def self.is_valid_element?(element)
91
+ return false if element.has_attribute?(DATA_IGNORE)
92
+
93
+ parent_element = element.get_parent_element
94
+
95
+ return true if parent_element.nil?
96
+
97
+ tag_name = parent_element.get_tag_name
98
+ if (tag_name != 'BODY') && (tag_name != 'HTML')
99
+ return is_valid_element?(parent_element)
100
+ end
101
+
102
+ true
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,92 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ require 'yaml'
14
+ require File.join(File.dirname(File.dirname(__FILE__)), 'helper')
15
+
16
+ ##
17
+ # The Hatemile module contains the interfaces with the acessibility solutions.
18
+ module Hatemile
19
+ ##
20
+ # The Hatemile::Util module contains the utilities of library.
21
+ module Util
22
+ ##
23
+ # The Configure class contains the configuration of HaTeMiLe.
24
+ class Configure
25
+ ##
26
+ # Initializes a new object that contains the configuration of HaTeMiLe.
27
+ #
28
+ # @param files_name [Array<String>] The path of files.
29
+ # @param locales [Array<Symbol>] The locales.
30
+ def initialize(files_name = nil, locales = [:'en-US'])
31
+ Hatemile::Helper.require_valid_type(files_name, Array)
32
+ Hatemile::Helper.require_valid_type(files_name, Array)
33
+
34
+ if files_name.nil?
35
+ pattern = File.join(
36
+ File.dirname(File.dirname(File.dirname(__FILE__))),
37
+ 'locale',
38
+ '*.yml'
39
+ )
40
+ files_name = Dir.glob(pattern)
41
+ end
42
+ @locales = locales
43
+ @parameters = {}
44
+ files_name.each do |file_name|
45
+ @parameters = @parameters.merge(YAML.load_file(file_name))
46
+ end
47
+ end
48
+
49
+ ##
50
+ # Returns the parameters of configuration.
51
+ #
52
+ # @return [Hash] The parameters of configuration.
53
+ def get_parameters
54
+ clone_parameters = {}
55
+ @locales.each do |locale|
56
+ clone_parameters = @parameters[locale.to_s]['hatemile'].merge(
57
+ clone_parameters
58
+ )
59
+ end
60
+ clone_parameters
61
+ end
62
+
63
+ ##
64
+ # Check that the configuration has an parameter.
65
+ #
66
+ # @param parameter [String] The parameter.
67
+ # @return [Boolean] True if the configuration has the parameter or false
68
+ # if the configuration not has the parameter.
69
+ def has_parameter?(parameter)
70
+ @locales.each do |locale|
71
+ return true if @parameters[locale.to_s]['hatemile'].key?(parameter)
72
+ end
73
+ false
74
+ end
75
+
76
+ ##
77
+ # Returns the value of a parameter of configuration.
78
+ #
79
+ # @param parameter [String] The parameter.
80
+ # @return [String] The value of the parameter.
81
+ def get_parameter(parameter)
82
+ @locales.each do |locale|
83
+ next if @locales.last == locale
84
+
85
+ value = @parameters[locale.to_s]['hatemile'].fetch(parameter, nil)
86
+ return value unless value.nil?
87
+ end
88
+ @parameters[@locales.last.to_s]['hatemile'].fetch(parameter)
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,77 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ require File.join(
14
+ File.dirname(File.dirname(File.dirname(File.dirname(__FILE__)))),
15
+ 'helper'
16
+ )
17
+ require File.join(
18
+ File.dirname(File.dirname(__FILE__)),
19
+ 'style_sheet_declaration'
20
+ )
21
+
22
+ ##
23
+ # The Hatemile module contains the interfaces with the acessibility solutions.
24
+ module Hatemile
25
+ ##
26
+ # The Hatemile::Util module contains the utilities of library.
27
+ module Util
28
+ ##
29
+ # The Hatemile::Util::Css module contains the interfaces of CSS handles.
30
+ module Css
31
+ ##
32
+ # The Hatemile::Util::Css::Rcp module contains the implementation of CSS
33
+ # handles for Ruby CSS Parser library.
34
+ module Rcp
35
+ ##
36
+ # The RCPDeclaration class is official implementation of
37
+ # Hatemile::Util::Css::StyleSheetDeclaration for Ruby CSS Parser.
38
+ class RCPDeclaration < Hatemile::Util::Css::StyleSheetDeclaration
39
+ public_class_method :new
40
+
41
+ ##
42
+ # Initializes a new object that encapsulate the Ruby CSS Parser
43
+ # declaration.
44
+ #
45
+ # @param property_name [String] The property name of declaration.
46
+ # @param value [String] The value of declaration.
47
+ def initialize(property_name, value)
48
+ Hatemile::Helper.require_not_nil(property_name, value)
49
+ Hatemile::Helper.require_valid_type(property_name, String)
50
+ Hatemile::Helper.require_valid_type(value, String)
51
+
52
+ @property_name = property_name
53
+ @value = value
54
+ end
55
+
56
+ ##
57
+ # @see Hatemile::Util::Css::StyleSheetDeclaration#get_value
58
+ def get_value
59
+ @value
60
+ end
61
+
62
+ ##
63
+ # @see Hatemile::Util::Css::StyleSheetDeclaration#get_values
64
+ def get_values
65
+ get_value.split(/[ \n\t\r]+/)
66
+ end
67
+
68
+ ##
69
+ # @see Hatemile::Util::Css::StyleSheetDeclaration#get_property
70
+ def get_property
71
+ @property_name
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,115 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ require 'css_parser'
14
+ require 'uri'
15
+ require File.join(
16
+ File.dirname(File.dirname(File.dirname(File.dirname(__FILE__)))),
17
+ 'helper'
18
+ )
19
+ require File.join(File.dirname(File.dirname(__FILE__)), 'style_sheet_parser')
20
+ require File.join(File.dirname(__FILE__), 'rcp_rule')
21
+
22
+ ##
23
+ # The Hatemile module contains the interfaces with the acessibility solutions.
24
+ module Hatemile
25
+ ##
26
+ # The Hatemile::Util module contains the utilities of library.
27
+ module Util
28
+ ##
29
+ # The Hatemile::Util::Css module contains the interfaces of CSS handles.
30
+ module Css
31
+ ##
32
+ # The Hatemile::Util::Css::Rcp module contains the implementation of CSS
33
+ # handles for Ruby CSS Parser library.
34
+ module Rcp
35
+ ##
36
+ # The RCPParser class is official implementation of
37
+ # Hatemile::Util::Css::StyleSheetParser for Ruby CSS Parser.
38
+ class RCPParser < Hatemile::Util::Css::StyleSheetParser
39
+ include CssParser
40
+ public_class_method :new
41
+
42
+ protected
43
+
44
+ ##
45
+ # Load the stylesheets of page.
46
+ #
47
+ # @param html_parser [Hatemile::Util::Html::HTMLDOMParser] The HTML
48
+ # parser.
49
+ # @param current_url [String] The current URL of page.
50
+ def load_stylesheets(html_parser, current_url)
51
+ elements = html_parser.find(
52
+ 'style,link[rel="stylesheet"]'
53
+ ).list_results
54
+ elements.each do |element|
55
+ if element.get_tag_name == 'STYLE'
56
+ @css_parser.load_string!(element.get_text_content)
57
+ else
58
+ @css_parser.load_uri!(
59
+ URI.join(current_url, element.get_attribute('href'))
60
+ )
61
+ end
62
+ end
63
+ end
64
+
65
+ public
66
+
67
+ ##
68
+ # Initializes a new object that encapsulate the Ruby CSS Parser.
69
+ #
70
+ # @param css_or_hp [String, Hatemile::Util::Html::HTMLDOMParser] The
71
+ # HTML parser or CSS code of page.
72
+ # @param current_url [String] The current URL of page.
73
+ def initialize(css_or_hp, current_url = nil)
74
+ Hatemile::Helper.require_not_nil(css_or_hp)
75
+ Hatemile::Helper.require_valid_type(
76
+ css_or_hp,
77
+ Hatemile::Util::Html::HTMLDOMParser,
78
+ String
79
+ )
80
+ Hatemile::Helper.require_valid_type(current_url, String)
81
+
82
+ @css_parser = CssParser::Parser.new
83
+ if css_or_hp.is_a?(String)
84
+ @css_parser.load_string!(css_or_hp)
85
+ else
86
+ load_stylesheets(css_or_hp, current_url)
87
+ end
88
+ end
89
+
90
+ ##
91
+ # @see Hatemile::Util::Css::StyleSheetParser#get_rules
92
+ def get_rules(properties = nil)
93
+ rules = []
94
+ @css_parser.each_rule_set do |rule|
95
+ auxiliar_rule = RCPRule.new(rule)
96
+
97
+ if properties.nil?
98
+ rules.push(auxiliar_rule)
99
+ next
100
+ end
101
+
102
+ properties.each do |property_name|
103
+ if auxiliar_rule.has_property?(property_name)
104
+ rules.push(auxiliar_rule)
105
+ break
106
+ end
107
+ end
108
+ end
109
+ rules
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,86 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ require File.join(
14
+ File.dirname(File.dirname(File.dirname(File.dirname(__FILE__)))),
15
+ 'helper'
16
+ )
17
+ require File.join(File.dirname(File.dirname(__FILE__)), 'style_sheet_rule')
18
+ require File.join(File.dirname(__FILE__), 'rcp_declaration')
19
+
20
+ ##
21
+ # The Hatemile module contains the interfaces with the acessibility solutions.
22
+ module Hatemile
23
+ ##
24
+ # The Hatemile::Util module contains the utilities of library.
25
+ module Util
26
+ ##
27
+ # The Hatemile::Util::Css module contains the interfaces of CSS handles.
28
+ module Css
29
+ ##
30
+ # The Hatemile::Util::Css::Rcp module contains the implementation of CSS
31
+ # handles for Ruby CSS Parser library.
32
+ module Rcp
33
+ ##
34
+ # The RCPRule class is official implementation of
35
+ # Hatemile::Util::Css::StyleSheetRule for Ruby CSS Parser.
36
+ class RCPRule < Hatemile::Util::Css::StyleSheetRule
37
+ public_class_method :new
38
+
39
+ ##
40
+ # Initializes a new object that encapsulate the Ruby CSS Parser rule.
41
+ #
42
+ # @param rule [CssParser::RuleSet] The Ruby CSS Parser rule.
43
+ def initialize(rule)
44
+ Hatemile::Helper.require_not_nil(rule)
45
+ Hatemile::Helper.require_valid_type(rule, CssParser::RuleSet)
46
+
47
+ @rule = rule
48
+ end
49
+
50
+ ##
51
+ # @see Hatemile::Util::Css::StyleSheetRule#has_property?
52
+ def has_property?(property_name)
53
+ @rule.each_declaration do |property, _value, _important|
54
+ return true if property == property_name
55
+ end
56
+ false
57
+ end
58
+
59
+ ##
60
+ # @see Hatemile::Util::Css::StyleSheetRule#has_declarations?
61
+ def has_declarations?
62
+ true
63
+ end
64
+
65
+ ##
66
+ # @see Hatemile::Util::Css::StyleSheetRule#get_declarations
67
+ def get_declarations(property_name)
68
+ declarations = []
69
+ @rule.each_declaration do |property, value, _important|
70
+ if property == property_name
71
+ declarations.push(RCPDeclaration.new(property, value))
72
+ end
73
+ end
74
+ declarations
75
+ end
76
+
77
+ ##
78
+ # @see Hatemile::Util::Css::StyleSheetRule#get_selector
79
+ def get_selector
80
+ @rule.selectors.join(', ')
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end