herbgobbler 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. data/bin/gobble +43 -0
  2. data/grammer/erb_grammer.treetop +256 -0
  3. data/lib/core/base_node.rb +29 -0
  4. data/lib/core/base_text_extractor.rb +19 -0
  5. data/lib/core/base_translation_store.rb +49 -0
  6. data/lib/core/core.rb +17 -0
  7. data/lib/core/double_quoted_text_node.rb +89 -0
  8. data/lib/core/erb_file.rb +159 -0
  9. data/lib/core/erb_string_non_text_content.rb +8 -0
  10. data/lib/core/i18n_key.rb +74 -0
  11. data/lib/core/ignorable_tag_node.rb +10 -0
  12. data/lib/core/method_call_node.rb +44 -0
  13. data/lib/core/node_processing.rb +26 -0
  14. data/lib/core/non_extracting_non_text_node.rb +8 -0
  15. data/lib/core/non_text_node.rb +32 -0
  16. data/lib/core/rails_text_extractor.rb +88 -0
  17. data/lib/core/rails_translation_store.rb +42 -0
  18. data/lib/core/text_extractor.rb +31 -0
  19. data/lib/core/text_node.rb +73 -0
  20. data/lib/herbgobbler.rb +7 -0
  21. data/lib/nodes/combindable_herb_non_text_node.rb +5 -0
  22. data/lib/nodes/herb_combined_node.rb +47 -0
  23. data/lib/nodes/herb_erb_text_call_node.rb +52 -0
  24. data/lib/nodes/herb_node_retaining_node.rb +37 -0
  25. data/lib/nodes/herb_node_retaining_non_text_node.rb +30 -0
  26. data/lib/nodes/herb_node_retaining_text_node.rb +107 -0
  27. data/lib/nodes/herb_non_text_node.rb +21 -0
  28. data/lib/nodes/herb_string_variable.rb +9 -0
  29. data/lib/nodes/herb_text_node.rb +23 -0
  30. data/lib/nodes/herb_white_space_text_node.rb +14 -0
  31. data/lib/nodes/nodes.rb +13 -0
  32. data/lib/nodes/rails_text_variable_node.rb +19 -0
  33. data/scripts/display_syntax_tree.rb +18 -0
  34. data/scripts/extract_text_from_erb.rb +12 -0
  35. data/scripts/extract_yml_from_erb.rb +12 -0
  36. data/scripts/rails_gobble_file.rb +37 -0
  37. data/scripts/save_result.rb +11 -0
  38. metadata +154 -0
@@ -0,0 +1,107 @@
1
+ class HerbNodeRetainingTextNode < HerbNodeRetainingNode
2
+ include TextNode
3
+
4
+ def add_all( nodes )
5
+ nodes.each do |node|
6
+ self << node
7
+ end
8
+ end
9
+
10
+ def can_remove_starting_or_ending_html_tags?
11
+ if( find_first_non_whitespace_node.node_name == "html_start_tag" && find_last_non_whitespace_node.node_name == "html_end_tag" )
12
+ if( find_first_non_whitespace_node.tag_name.text_value == find_last_non_whitespace_node.tag_name.text_value )
13
+ true
14
+ else
15
+ false
16
+ end
17
+ elsif( find_last_non_whitespace_node.node_name == "html_start_tag" || find_first_non_whitespace_node.node_name == "html_end_tag" )
18
+ true
19
+ else
20
+ false
21
+ end
22
+
23
+ end
24
+
25
+ def break_out_start_and_end_tags
26
+ if( find_first_non_whitespace_node.node_name == "html_start_tag" && find_last_non_whitespace_node.node_name == "html_end_tag" )
27
+ ( can_remove_starting_or_ending_html_tags? )
28
+ start_tag = extract_leading_tag
29
+ end_tag = extract_trailing_tag
30
+ middle_tag = HerbNodeRetainingTextNode.new
31
+ middle_tag.add_all( nodes[start_tag.nodes.length..nodes.length - (end_tag.nodes.length + 1 ) ] )
32
+ [start_tag, middle_tag, end_tag]
33
+ elsif(find_last_non_whitespace_node.node_name == "html_start_tag")
34
+ end_tag = extract_trailing_tag
35
+ start_tag = HerbNodeRetainingTextNode.new
36
+ start_tag.add_all( nodes[0..nodes.length - (end_tag.nodes.length + 1 ) ] )
37
+ [start_tag, end_tag]
38
+ elsif(find_first_non_whitespace_node.node_name == "html_end_tag" )
39
+ start_tag = extract_leading_tag
40
+ end_tag = HerbNodeRetainingTextNode.new
41
+ end_tag.add_all( nodes[start_tag.nodes.length..nodes.length ] )
42
+ [start_tag, end_tag]
43
+ else
44
+ [self]
45
+ end
46
+ end
47
+
48
+
49
+ def extract_text( text_extractor, node_tree )
50
+ self.nodes.each do |node|
51
+ if( node.is_a?( MethodCallNode ) )
52
+ node.extract_text( text_extractor, node_tree, self.nodes )
53
+ else
54
+ node.extract_text( text_extractor, node_tree )
55
+ end
56
+ end
57
+ end
58
+
59
+ def can_be_combined?
60
+ true
61
+ end
62
+
63
+ def to_s
64
+ @text_value
65
+ end
66
+
67
+ def find_first_non_whitespace_node
68
+ nodes.each do |node|
69
+ return node unless node.text_value.strip.empty?
70
+ end
71
+ end
72
+
73
+ def find_last_non_whitespace_node
74
+ nodes.reverse.each do |node|
75
+ return node unless node.text_value.strip.empty?
76
+ end
77
+ end
78
+
79
+
80
+ private
81
+
82
+
83
+ def extract_leading_tag
84
+ node = find_first_non_whitespace_node
85
+ to_return = []
86
+ nodes.each do |current_node|
87
+ to_return << current_node
88
+ if( node == current_node )
89
+ return HerbNodeRetainingNonTextNode.create_from_nodes( to_return )
90
+ end
91
+ end
92
+ end
93
+
94
+ def extract_trailing_tag
95
+ node = find_last_non_whitespace_node
96
+ to_return = []
97
+ nodes.reverse.each do |current_node|
98
+ to_return << current_node
99
+ if( node == current_node )
100
+ return HerbNodeRetainingNonTextNode.create_from_nodes( to_return.reverse )
101
+ end
102
+ end
103
+
104
+ end
105
+
106
+
107
+ end
@@ -0,0 +1,21 @@
1
+ class HerbNonTextNode
2
+ include NonTextNode
3
+ attr_accessor :text_value
4
+ def initialize( text )
5
+ @text_value = text
6
+ end
7
+
8
+ def can_be_combined?
9
+ false
10
+ end
11
+
12
+ def node_name
13
+ "non_text_node"
14
+ end
15
+
16
+ def to_s
17
+ @text_value
18
+ end
19
+
20
+
21
+ end
@@ -0,0 +1,9 @@
1
+ class HerbStringVariable < Treetop::Runtime::SyntaxNode
2
+ include TextNode
3
+
4
+ def extract_text( text_extractor, node_tree )
5
+ text_extractor.add_variable( I18nKey.new( self.variable.text_value, get_key_hash(text_extractor, node_tree) ).to_s , self.variable.text_value )
6
+ end
7
+
8
+
9
+ end
@@ -0,0 +1,23 @@
1
+ class HerbTextNode
2
+ include TextNode
3
+ attr_accessor :text_value
4
+
5
+ def initialize( text, strip_whitespace = true )
6
+ @text_value = text
7
+ @strip_whitespace = strip_whitespace
8
+ end
9
+
10
+ def can_be_combined?
11
+ true
12
+ end
13
+
14
+ def strip_whitespace?
15
+ @strip_whitespace
16
+ end
17
+
18
+ def to_s
19
+ @text_value
20
+ end
21
+
22
+
23
+ end
@@ -0,0 +1,14 @@
1
+ class HerbWhiteSpaceTextNode < HerbTextNode
2
+
3
+ def extract_text( text_extractor, node_tree )
4
+ text_extractor.white_space( self )
5
+ end
6
+
7
+ def node_name
8
+ "herb_white_space_text_node"
9
+ end
10
+
11
+ def white_space?
12
+ true
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ require 'nodes/herb_text_node'
2
+ require 'nodes/herb_non_text_node'
3
+ require 'nodes/herb_white_space_text_node'
4
+ require 'nodes/herb_erb_text_call_node'
5
+ require 'nodes/herb_combined_node'
6
+ require 'nodes/herb_string_variable'
7
+ require 'nodes/combindable_herb_non_text_node'
8
+ require 'nodes/herb_node_retaining_node'
9
+ require 'nodes/herb_node_retaining_text_node'
10
+ require 'nodes/herb_node_retaining_node'
11
+ require 'nodes/herb_node_retaining_text_node'
12
+ require 'nodes/herb_node_retaining_non_text_node'
13
+ require 'nodes/rails_text_variable_node'
@@ -0,0 +1,19 @@
1
+ class RailsTextVariableNode
2
+ include TextNode
3
+
4
+ def initialize( key, value )
5
+ @key = key
6
+ @value = value
7
+ end
8
+
9
+ def text_value
10
+ "%{#{@key}}"
11
+ end
12
+
13
+ def to_s
14
+ ":#{@key} => (#{@value})"
15
+ end
16
+
17
+
18
+ end
19
+
@@ -0,0 +1,18 @@
1
+ require 'lib/herbgobbler'
2
+
3
+
4
+ file_name = ARGV.first
5
+ erb_file = ErbFile.load( file_name )
6
+ top_levels = erb_file.flatten_elements
7
+
8
+ puts "---------- Original ----------------"
9
+ puts File.read( file_name )
10
+ puts "---------- Un-Combined Syntax Tree -------------"
11
+ top_levels.each_with_index do |top_level, index|
12
+ puts "(#{index}): #{top_level.text_value}"
13
+ end
14
+ puts "---------- Combined Syntax Tree -------------"
15
+ erb_file.combine_nodes( erb_file.flatten_elements ).each do |element|
16
+ puts "`#{element.text_value}`(text=#{element.is_a?(TextNode)})(combindable=#{element.is_a?(NonTextNode) && element.can_be_combined?})(class=#{element.class})"
17
+ end
18
+
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ require 'lib/herbgobbler'
3
+
4
+ file_name = ARGV.first
5
+ text_extractor = RailsTextExtractor.new
6
+ erb_file = ErbFile.load( file_name )
7
+ erb_file.extract_text( text_extractor )
8
+
9
+ print erb_file.to_s
10
+
11
+
12
+
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ require 'lib/herbgobbler'
3
+
4
+ file_name = ARGV.first
5
+ rails_translation_store = RailsTranslationStore.new
6
+ text_extractor = RailsTextExtractor.new( rails_translation_store )
7
+ rails_translation_store.start_new_context( file_name.split('.').first )
8
+ erb_file = ErbFile.load( file_name )
9
+ erb_file.extract_text( text_extractor )
10
+
11
+ print rails_translation_store.serialize
12
+
@@ -0,0 +1,37 @@
1
+ require 'lib/herbgobbler'
2
+
3
+ def print_usage
4
+ puts "ruby scripts/rails_gobble_file.rb <rails_root> <relative_erb_file_path> <locale_file_name>"
5
+ end
6
+
7
+ # remove the file extension and the app/views/ so that
8
+ # when the context is set that rails will be able to find
9
+ # it through the default . key syntax
10
+ def convert_path_to_key_path( path )
11
+ path.split('.').first.gsub( "app/views/", '')
12
+ end
13
+
14
+ if ARGV.length < 3
15
+ print_usage()
16
+ else
17
+ rails_root = ARGV[0]
18
+ erb_file_path = ARGV[1]
19
+ locale_file_name = ARGV[2]
20
+ full_erb_file_path = "#{rails_root}/#{erb_file_path}"
21
+ full_yml_file_path = "#{rails_root}/config/locales/#{locale_file_name}"
22
+
23
+ rails_translation_store = RailsTranslationStore.new
24
+ text_extractor = RailsTextExtractor.new( rails_translation_store )
25
+ rails_translation_store.start_new_context( convert_path_to_key_path( erb_file_path ) )
26
+ erb_file = ErbFile.load( full_erb_file_path )
27
+ erb_file.extract_text( text_extractor )
28
+
29
+ File.open(full_erb_file_path, 'w') {|f| f.write(erb_file.to_s) }
30
+ puts "Wrote #{full_erb_file_path}"
31
+
32
+ File.open(full_yml_file_path, 'w') {|f| f.write(rails_translation_store.serialize) }
33
+ puts "Wrote #{full_yml_file_path}"
34
+ end
35
+
36
+
37
+
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ test_to_save = ARGV.first
4
+ test_name = test_to_save.split( '/' ).last
5
+
6
+ `ruby scripts/extract_text_from_erb.rb #{test_to_save} > tests/integration/result/erb/#{test_name}.result`
7
+
8
+ `ruby scripts/extract_yml_from_erb.rb #{test_to_save} > tests/integration/result/yml/#{test_name}.yml.result`
9
+
10
+ puts "Wrote: tests/integration/result/erb/#{test_name}.result"
11
+ puts "Wrote: tests/integration/result/yml/#{test_name}.yml.result"
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: herbgobbler
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Douglas Sellers
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-01-20 00:00:00 -08:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: bundler
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 19
30
+ segments:
31
+ - 1
32
+ - 0
33
+ - 2
34
+ version: 1.0.2
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: polyglot
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 17
46
+ segments:
47
+ - 0
48
+ - 3
49
+ - 1
50
+ version: 0.3.1
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: treetop
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 23
62
+ segments:
63
+ - 1
64
+ - 4
65
+ - 8
66
+ version: 1.4.8
67
+ type: :runtime
68
+ version_requirements: *id003
69
+ description: Allows english text extraction, for internationalization and localization, from Ruby on Rails ERB files
70
+ email: douglas.sellers@gmail.com
71
+ executables:
72
+ - gobble
73
+ extensions: []
74
+
75
+ extra_rdoc_files: []
76
+
77
+ files:
78
+ - bin/gobble
79
+ - lib/core/base_node.rb
80
+ - lib/core/base_text_extractor.rb
81
+ - lib/core/base_translation_store.rb
82
+ - lib/core/core.rb
83
+ - lib/core/double_quoted_text_node.rb
84
+ - lib/core/erb_file.rb
85
+ - lib/core/erb_string_non_text_content.rb
86
+ - lib/core/i18n_key.rb
87
+ - lib/core/ignorable_tag_node.rb
88
+ - lib/core/method_call_node.rb
89
+ - lib/core/node_processing.rb
90
+ - lib/core/non_extracting_non_text_node.rb
91
+ - lib/core/non_text_node.rb
92
+ - lib/core/rails_text_extractor.rb
93
+ - lib/core/rails_translation_store.rb
94
+ - lib/core/text_extractor.rb
95
+ - lib/core/text_node.rb
96
+ - lib/herbgobbler.rb
97
+ - lib/nodes/combindable_herb_non_text_node.rb
98
+ - lib/nodes/herb_combined_node.rb
99
+ - lib/nodes/herb_erb_text_call_node.rb
100
+ - lib/nodes/herb_node_retaining_node.rb
101
+ - lib/nodes/herb_node_retaining_non_text_node.rb
102
+ - lib/nodes/herb_node_retaining_text_node.rb
103
+ - lib/nodes/herb_non_text_node.rb
104
+ - lib/nodes/herb_string_variable.rb
105
+ - lib/nodes/herb_text_node.rb
106
+ - lib/nodes/herb_white_space_text_node.rb
107
+ - lib/nodes/nodes.rb
108
+ - lib/nodes/rails_text_variable_node.rb
109
+ - scripts/display_syntax_tree.rb
110
+ - scripts/extract_text_from_erb.rb
111
+ - scripts/extract_yml_from_erb.rb
112
+ - scripts/rails_gobble_file.rb
113
+ - scripts/save_result.rb
114
+ - grammer/erb_grammer.treetop
115
+ has_rdoc: true
116
+ homepage: https://github.com/douglasjsellers/herbgobbler
117
+ licenses: []
118
+
119
+ post_install_message:
120
+ rdoc_options: []
121
+
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ hash: 57
130
+ segments:
131
+ - 1
132
+ - 8
133
+ - 7
134
+ version: 1.8.7
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ none: false
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ hash: 21
141
+ segments:
142
+ - 1
143
+ - 3
144
+ - 7
145
+ version: 1.3.7
146
+ requirements: []
147
+
148
+ rubyforge_project:
149
+ rubygems_version: 1.4.2
150
+ signing_key:
151
+ specification_version: 3
152
+ summary: Allows english text extraction, for internationalization and localization, from Ruby on Rails ERB files
153
+ test_files: []
154
+