Skip to content

Commit 2dc89c9

Browse files
committed
Re-support class based xgettext parser add API
GitHub: fix mutoh#10 Suggested by Michael Grosser. Thanks!!!
1 parent e7b9d7c commit 2dc89c9

2 files changed

Lines changed: 57 additions & 4 deletions

File tree

lib/gettext/tools/xgettext.rb

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,23 @@ class << self
3131
def run(*arguments)
3232
new.run(*arguments)
3333
end
34+
35+
# Adds a parser to the default parser list.
36+
#
37+
# @param (see #add_parser)
38+
# @return [void]
39+
#
40+
# @see #add_parser
41+
def add_parser(parser)
42+
@@default_parsers.unshift(parser)
43+
end
3444
end
3545

3646
include GetText
3747

3848
bindtextdomain("rgettext")
3949

50+
# @api private
4051
@@default_parsers = []
4152
builtin_parser_info_list = [
4253
["glade", "GladeParser"],
@@ -66,10 +77,10 @@ def initialize #:nodoc:
6677
@copyright_holder = nil
6778
end
6879

69-
# How to add your option parser
7080
# The option parser module requires to have target?(file) and
7181
# parser(file, ary) method.
7282
#
83+
# @example How to add your option parser
7384
# require "gettext/tools/xgettext"
7485
# module FooParser
7586
# module_function
@@ -109,8 +120,14 @@ def initialize #:nodoc:
109120
# end
110121
#
111122
# GetText::XGetText.add_parser(FooParser)
112-
def add_parser(klass)
113-
@parsers.insert(0, klass)
123+
#
124+
# @param [#target?, #parse] parser
125+
# It parses target file and extracts translate target messages from the
126+
# target file. If there are multiple target files, parser.parse is
127+
# called multiple times.
128+
# @return [void]
129+
def add_parser(parser)
130+
@parsers.insert(0, parser)
114131
end
115132

116133
def generate_pot_header # :nodoc:
@@ -156,7 +173,8 @@ def parse(paths) # :nodoc:
156173
@parsers.each do |klass|
157174
next unless klass.target?(path)
158175

159-
if klass.method(:parse).arity == 1
176+
parse_method = klass.method(:parse)
177+
if parse_method.arity == 1 or parse_method.arity == -1
160178
targets = klass.parse(path)
161179
else
162180
# For backward compatibility

test/tools/test_xgettext.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,41 @@ def test_copyright_holder
119119
end
120120
end
121121

122+
class TestAddParser < self
123+
setup
124+
def setup_default_parsers
125+
@default_parsers = default_parsers.dup
126+
end
127+
128+
teardown
129+
def teardown_default_parsers
130+
default_parsers.replace(@default_parsers)
131+
end
132+
133+
def test_class_method
134+
GetText::Tools::XGetText.add_parser(mock_html_parser)
135+
xgettext = GetText::Tools::XGetText.new
136+
xgettext.parse(["index.html"])
137+
end
138+
139+
def test_instance_method
140+
@xgettext.add_parser(mock_html_parser)
141+
@xgettext.parse(["index.html"])
142+
end
143+
144+
private
145+
def default_parsers
146+
GetText::Tools::XGetText.module_eval("@@default_parsers")
147+
end
148+
149+
def mock_html_parser
150+
html_parser = Object.new
151+
mock(html_parser).target?("index.html") {true}
152+
mock(html_parser).parse("index.html") {[]}
153+
html_parser
154+
end
155+
end
156+
122157
private
123158
def header(options=nil)
124159
options ||= {}

0 commit comments

Comments
 (0)