Object
@example `:comment_tag` option: String tag
path = "hello.rb" # content: # # TRANSLATORS: This is a comment to translators. # _("Hello") # # # This is a comment for programmers. # # TRANSLATORS: This is a comment to translators. # # This is also a comment to translators. # _("World") # # # This is a comment for programmers. # # This is also a comment for programmers # # because all lines don't start with "TRANSRATORS:". # _("Bye") options = {:comment_tag => "TRANSLATORS:"} parser = GetText::RubyParser.new(path, options) parser.parse # => [ # POEntry< # :msgid => "Hello", # :extracted_comment => # "TRANSLATORS: This is a comment to translators.", # >, # POEntry< # :msgid => "World", # :extracted_comment => # "TRANSLATORS: This is a comment to translators.\n" + # "This is also a comment to translators.", # >, # POEntry< # :msgid => "Bye", # :extracted_comment => nil, # >, # ]
@example `:comment_tag` option: nil tag
path = "hello.rb" # content: # # This is a comment to translators. # # This is also a comment for translators. # _("Hello") options = {:comment_tag => nil} parser = GetText::RubyParser.new(path, options) parser.parse # => [ # POEntry< # :msgid => "Hello", # :extracted_comment => # "This is a comment to translators.\n" + # " This is also a comment for translators.", # >, # ]
@param path [String] Ruby script path to be parsed @param options [Hash] Options @option options [String, nil] :comment_tag The tag to
detect comments to be extracted. The extracted comments are used to deliver messages to translators from programmers. If the tag is String and a line in a comment start with the tag, the line and the following lines are extracted. If the tag is nil, all comments are extracted.
# File lib/gettext/tools/parser/ruby.rb, line 202 def initialize(path, options={}) @path = path @options = options end
Parses Ruby script located at `path`.
This is a short cut method. It equals to `new(path, options).parse`.
@param (see initialize) @option (see initialize) @return (see parse) @see initialize @see parse
# File lib/gettext/tools/parser/ruby.rb, line 131 def parse(path, options={}) parser = new(path, options) parser.parse end
# File lib/gettext/tools/parser/ruby.rb, line 219 def detect_encoding(source) binary_source = source.dup.force_encoding("ASCII-8BIT") if /\A.*coding\s*[=:]\s*([[:alnum:]\-_]+)/ =~ binary_source $1.gsub(/-(?:unix|mac|dos)\z/, "") else nil end end
Extracts messages from @path.
@return [Array<POEntry>] Extracted messages
# File lib/gettext/tools/parser/ruby.rb, line 210 def parse source = IO.read(@path) encoding = detect_encoding(source) || source.encoding source.force_encoding(encoding) parse_source(source) end
# File lib/gettext/tools/parser/ruby.rb, line 228 def parse_source(source) po = [] file = StringIO.new(source) rl = RubyLexX.new rl.set_input(file) rl.skip_space = true #rl.readed_auto_clean_up = true po_entry = nil line_no = nil last_comment = "" reset_comment = false ignore_next_comma = false rl.parse do |tk| begin ignore_current_comma = ignore_next_comma ignore_next_comma = false case tk when RubyToken::TkIDENTIFIER, RubyToken::TkCONSTANT if store_po_entry(po, po_entry, line_no, last_comment) last_comment = "" end if ID.include?(tk.name) po_entry = POEntry.new(:normal) elsif PLURAL_ID.include?(tk.name) po_entry = POEntry.new(:plural) elsif MSGCTXT_ID.include?(tk.name) po_entry = POEntry.new(:msgctxt) elsif MSGCTXT_PLURAL_ID.include?(tk.name) po_entry = POEntry.new(:msgctxt_plural) else po_entry = nil end line_no = tk.line_no.to_s when RubyToken::TkSTRING, RubyToken::TkDSTRING po_entry.set_current_attribute tk.value if po_entry when RubyToken::TkPLUS, RubyToken::TkNL #do nothing when RubyToken::TkINTEGER ignore_next_comma = true when RubyToken::TkCOMMA unless ignore_current_comma po_entry.advance_to_next_attribute if po_entry end else if store_po_entry(po, po_entry, line_no, last_comment) po_entry = nil last_comment = "" end end rescue $stderr.print "\n\nError" $stderr.print " parsing #{@path}:#{tk.line_no}\n\t #{source.lines.to_a[tk.line_no - 1]}" if tk $stderr.print "\n #{$!.inspect} in\n" $stderr.print $!.backtrace.join("\n") $stderr.print "\n" exit 1 end case tk when RubyToken::TkCOMMENT_WITH_CONTENT last_comment = "" if reset_comment if last_comment.empty? comment1 = tk.value.lstrip if comment_to_be_extracted?(comment1) last_comment << comment1 end else last_comment += "\n" last_comment += tk.value end reset_comment = false when RubyToken::TkNL else reset_comment = true end end po end
Generated with the Darkfish Rdoc Generator 2.