herbgobbler 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|