1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
# Copyright (C) 2004,2005 Masao Mutoh
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
#
# License: Ruby's or LGPL
#
# This library is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
require 'cgi'
require 'gettext'
module GetText
class GladeParser
extend GetText
bindtextdomain("gettext")
class << self
XML_RE = /<\?xml/
GLADE_RE = /glade-2.0.dtd/
def target?(file) # :nodoc:
return false unless File.extname(file) == ".glade"
data = File.read(file)
return false unless data.include?("<?xml")
return false unless data.include?("glade-2.0.dtd")
true
end
def parse(path, options={})
parser = new(path, options)
parser.parse
end
end
TARGET1 = /<property.*translatable="yes">(.*)/
TARGET2 = /(.*)<\/property>/
def initialize(path, options={})
@path = path
@options = options
end
def parse # :nodoc:
File.open(@path) do |file|
parse_source(file)
end
end
private
def parse_source(input) # :nodoc:
po = []
target = false
start_line_no = nil
val = nil
input.each_line.with_index do |line, i|
if TARGET1 =~ line
start_line_no = i + 1
val = $1 + "\n"
target = true
if TARGET2 =~ $1
val = $1
add_po_entry(po, val, start_line_no)
val = nil
target = false
end
elsif target
if TARGET2 =~ line
val << $1
add_po_entry(po, val, start_line_no)
val = nil
target = false
else
val << line
end
end
end
po
end
def add_po_entry(po, value, line_no) # :nodoc:
return if value.empty?
value = CGI.unescapeHTML(value)
value = value.gsub(/\n/, "\n")
po_entry = po.find do |entry|
entry.msgid == value
end
if po_entry.nil?
po_entry = POEntry.new(:normal)
po_entry.msgid = value
po << po_entry
end
po_entry.references << "#{@path}:#{line_no}"
end
end
end
|