aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/gems/gettext-2.1.0/src
diff options
context:
space:
mode:
authorRobin Houston <robin@lenny.robin>2011-06-09 12:54:05 +0100
committerRobin Houston <robin@lenny.robin>2011-06-09 12:54:05 +0100
commit4d077dc48fb0589dbf401a131d524b23ab0d2258 (patch)
tree680b12febc448827ee937039d38e97020b4c5df9 /vendor/gems/gettext-2.1.0/src
parentcb67f4d0ef9feae96a90ea5bba63c939268b1224 (diff)
Bundle the locale and gettext gems
Diffstat (limited to 'vendor/gems/gettext-2.1.0/src')
-rw-r--r--vendor/gems/gettext-2.1.0/src/poparser.ry217
1 files changed, 217 insertions, 0 deletions
diff --git a/vendor/gems/gettext-2.1.0/src/poparser.ry b/vendor/gems/gettext-2.1.0/src/poparser.ry
new file mode 100644
index 000000000..0af77a263
--- /dev/null
+++ b/vendor/gems/gettext-2.1.0/src/poparser.ry
@@ -0,0 +1,217 @@
+#
+# poparser.ry - ruby version of msgfmt
+#
+# Copyright (C) 2002-2008 Masao Mutoh <mutomasa at gmail.com>
+#
+# You may redistribute it and/or modify it under the same
+# license terms as Ruby.
+
+class GetText::PoParser
+ token COMMENT MSGID MSGCTXT MSGID_PLURAL MSGSTR STRING PLURAL_NUM
+
+ rule
+
+ msgfmt
+ : /* empty */
+ | msgfmt comment
+ | msgfmt msgctxt
+ | msgfmt message
+ ;
+
+ msgctxt
+ : MSGCTXT string_list
+ {
+ @msgctxt = unescape(val[1]) + "\004"
+ }
+ ;
+
+ message
+ : single_message
+ | plural_message
+ ;
+
+ single_message
+ : MSGID string_list MSGSTR string_list
+ {
+ if @fuzzy and $ignore_fuzzy
+ if val[1] != ""
+ $stderr.print _("Warning: fuzzy message was ignored.\n")
+ $stderr.print " #{@po_file}: msgid '#{val[1]}'\n"
+ else
+ on_message('', unescape(val[3]))
+ end
+ @fuzzy = false
+ else
+ on_message(@msgctxt + unescape(val[1]), unescape(val[3]))
+ end
+ result = ""
+ }
+
+ plural_message
+ : MSGID string_list MSGID_PLURAL string_list msgstr_plural
+ {
+ if @fuzzy and $ignore_fuzzy
+ if val[1] != ""
+ $stderr.print _("Warning: fuzzy message was ignored.\n")
+ $stderr.print "msgid = '#{val[1]}\n"
+ else
+ on_message('', unescape(val[3]))
+ end
+ @fuzzy = false
+ else
+ on_message(@msgctxt + unescape(val[1]) + "\000" + unescape(val[3]), unescape(val[4]))
+ end
+ result = ""
+ }
+ ;
+
+ msgstr_plural
+ : msgstr_plural msgstr_plural_line
+ {
+ if val[0].size > 0
+ result = val[0] + "\000" + val[1]
+ else
+ result = ""
+ end
+ }
+ | msgstr_plural_line
+ ;
+
+ msgstr_plural_line
+ : MSGSTR PLURAL_NUM string_list
+ {
+ result = val[2]
+ }
+ ;
+
+ comment
+ : COMMENT
+ {
+ on_comment(val[0])
+ }
+ #| COMMENT
+ #;
+
+ string_list
+ : string_list STRING
+ {
+ result = val.delete_if{|item| item == ""}.join
+ }
+ | STRING
+ {
+ result = val[0]
+ }
+ ;
+end
+
+---- inner
+ include GetText
+ GetText.bindtextdomain("rgettext")
+
+ def unescape(orig)
+ ret = orig.gsub(/\\n/, "\n")
+ ret.gsub!(/\\t/, "\t")
+ ret.gsub!(/\\r/, "\r")
+ ret.gsub!(/\\"/, "\"")
+ ret
+ end
+
+ def parse(str, data, ignore_fuzzy = true)
+ @comments = []
+ @data = data
+ @fuzzy = false
+ @msgctxt = ""
+ $ignore_fuzzy = ignore_fuzzy
+
+ str.strip!
+ @q = []
+ until str.empty? do
+ case str
+ when /\A\s+/
+ str = $'
+ when /\Amsgctxt/
+ @q.push [:MSGCTXT, $&]
+ str = $'
+ when /\Amsgid_plural/
+ @q.push [:MSGID_PLURAL, $&]
+ str = $'
+ when /\Amsgid/
+ @q.push [:MSGID, $&]
+ str = $'
+ when /\Amsgstr/
+ @q.push [:MSGSTR, $&]
+ str = $'
+ when /\A\[(\d+)\]/
+ @q.push [:PLURAL_NUM, $1]
+ str = $'
+ when /\A\#~(.*)/
+ $stderr.print _("Warning: obsolete msgid exists.\n")
+ $stderr.print " #{$&}\n"
+ @q.push [:COMMENT, $&]
+ str = $'
+ when /\A\#(.*)/
+ @q.push [:COMMENT, $&]
+ str = $'
+ when /\A\"(.*)\"/
+ @q.push [:STRING, $1]
+ str = $'
+ else
+ #c = str[0,1]
+ #@q.push [:STRING, c]
+ str = str[1..-1]
+ end
+ end
+ @q.push [false, '$end']
+ if $DEBUG
+ @q.each do |a,b|
+ puts "[#{a}, #{b}]"
+ end
+ end
+ @yydebug = true if $DEBUG
+ do_parse
+
+ if @comments.size > 0
+ @data.set_comment(:last, @comments.join("\n"))
+ end
+ @data
+ end
+
+ def next_token
+ @q.shift
+ end
+
+ def on_message(msgid, msgstr)
+ if msgstr.size > 0
+ @data[msgid] = msgstr
+ @data.set_comment(msgid, @comments.join("\n"))
+ end
+ @comments.clear
+ @msgctxt = ""
+ end
+
+ def on_comment(comment)
+ @fuzzy = true if (/fuzzy/ =~ comment)
+ @comments << comment
+ end
+
+ def parse_file(po_file, data, ignore_fuzzy = true)
+ args = [ po_file ]
+ # In Ruby 1.9, we must detect proper encoding of a PO file.
+ if String.instance_methods.include?(:encode)
+ encoding = detect_file_encoding(po_file)
+ args << "r:#{encoding}"
+ end
+ @po_file = po_file
+ parse(File.open(*args) {|io| io.read }, data, ignore_fuzzy)
+ end
+
+ def detect_file_encoding(po_file)
+ open(po_file, :encoding => 'ASCII-8BIT') do |input|
+ input.lines.each do |line|
+ return Encoding.find($1) if %r["Content-Type:.*\scharset=(.*)\\n"] =~ line
+ end
+ end
+ Encoding.default_external
+ end
+ private :detect_file_encoding
+---- footer