/
catalog-validator.rb
64 lines (57 loc) · 1.52 KB
/
catalog-validator.rb
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
load 'pdumpfs'
class CatalogValidator
def initialize (source_filename)
@source_filename = source_filename
@has_error = false
end
def read_file_with_numbering (filename)
content = ''
File.open(filename).each_with_index {|line, idx|
lineno = idx + 1
content << line.gsub(/\b_\(/, "_[#{lineno}](")
}
content
end
def collect_messages (content)
messages = []
while content.sub!(/\b_\[(\d+)\]\((".*?").*?\)/m, "")
lineno = $1.to_i
message = eval($2)
messages.push([lineno, message])
end
messages
end
def validate
$catalog_messages or return
content = read_file_with_numbering(@source_filename)
messages = collect_messages(content)
messages.each {|lineno, message|
translated_message = $catalog_messages[message]
if not translated_message
printf "%s:%d: %s\n", @source_filename, lineno, message.inspect
@has_error = true
elsif message.count("%") != translated_message.count("%")
printf "%s:%d: %s => # of %% mismatch.\n",
@source_filename, lineno, message.inspect, translated_message
@has_error = true
end
}
end
def ok?
not @has_error
end
end
if ARGV.length < 2
puts "usage: ruby catalog-validator.rb <catalog> <source...>"
exit
end
include GetText
catalog_file = ARGV.shift
load_catalog(catalog_file)
ok = true
ARGV.each {|source_file|
validator = CatalogValidator.new(source_file)
validator.validate
ok = (ok and validator.ok?)
}
if ok then exit else exit(1) end