File: glade.rb

package info (click to toggle)
ruby-gettext 3.3.3-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 6,424 kB
  • sloc: ruby: 9,643; makefile: 8
file content (109 lines) | stat: -rw-r--r-- 2,406 bytes parent folder | download | duplicates (5)
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
108
109
# -*- coding: utf-8 -*-

=begin
  parser/glade.rb - parser for Glade-2

  Copyright (C) 2013       Kouhei Sutou <kou@clear-code.com>
  Copyright (C) 2004,2005  Masao Mutoh

  You may redistribute it and/or modify it under the same
  license terms as Ruby or LGPL.
=end

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:
        data = IO.readlines(file)
        if XML_RE =~ data[0] and GLADE_RE =~ data[1]
          true
        else
          if File.extname(file) == '.glade'
            raise _("`%{file}' is not glade-2.0 format.") % {:file => file}
          end
          false
        end
      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:
      targets = []
      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_target(val, start_line_no, targets)
            val = nil
            target = false
          end
        elsif target
          if TARGET2 =~ line
            val << $1
            add_target(val, start_line_no, targets)
            val = nil
            target = false
          else
            val << line
          end
        end
      end
      targets
    end

    def add_target(val, line_no, targets) # :nodoc:
      return unless val.size > 0
      assoc_data = targets.assoc(val)
      val = CGI.unescapeHTML(val)
      if assoc_data
        targets[targets.index(assoc_data)] = assoc_data << "#{@path}:#{line_no}"
      else
        targets << [val.gsub(/\n/, '\n'), "#{@path}:#{line_no}"]
      end
      targets
    end
  end
end

if __FILE__ == $0
  # ex) ruby glade.rb foo.glade  bar.glade
  ARGV.each do |file|
    p GetText::GladeParser.parse(file)
  end
end