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.
- data/bin/gobble +43 -0
- data/grammer/erb_grammer.treetop +256 -0
- data/lib/core/base_node.rb +29 -0
- data/lib/core/base_text_extractor.rb +19 -0
- data/lib/core/base_translation_store.rb +49 -0
- data/lib/core/core.rb +17 -0
- data/lib/core/double_quoted_text_node.rb +89 -0
- data/lib/core/erb_file.rb +159 -0
- data/lib/core/erb_string_non_text_content.rb +8 -0
- data/lib/core/i18n_key.rb +74 -0
- data/lib/core/ignorable_tag_node.rb +10 -0
- data/lib/core/method_call_node.rb +44 -0
- data/lib/core/node_processing.rb +26 -0
- data/lib/core/non_extracting_non_text_node.rb +8 -0
- data/lib/core/non_text_node.rb +32 -0
- data/lib/core/rails_text_extractor.rb +88 -0
- data/lib/core/rails_translation_store.rb +42 -0
- data/lib/core/text_extractor.rb +31 -0
- data/lib/core/text_node.rb +73 -0
- data/lib/herbgobbler.rb +7 -0
- data/lib/nodes/combindable_herb_non_text_node.rb +5 -0
- data/lib/nodes/herb_combined_node.rb +47 -0
- data/lib/nodes/herb_erb_text_call_node.rb +52 -0
- data/lib/nodes/herb_node_retaining_node.rb +37 -0
- data/lib/nodes/herb_node_retaining_non_text_node.rb +30 -0
- data/lib/nodes/herb_node_retaining_text_node.rb +107 -0
- data/lib/nodes/herb_non_text_node.rb +21 -0
- data/lib/nodes/herb_string_variable.rb +9 -0
- data/lib/nodes/herb_text_node.rb +23 -0
- data/lib/nodes/herb_white_space_text_node.rb +14 -0
- data/lib/nodes/nodes.rb +13 -0
- data/lib/nodes/rails_text_variable_node.rb +19 -0
- data/scripts/display_syntax_tree.rb +18 -0
- data/scripts/extract_text_from_erb.rb +12 -0
- data/scripts/extract_yml_from_erb.rb +12 -0
- data/scripts/rails_gobble_file.rb +37 -0
- data/scripts/save_result.rb +11 -0
- 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
|
data/lib/nodes/nodes.rb
ADDED
@@ -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,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
|
+
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
|
+
|