aboutsummaryrefslogtreecommitdiff
path: root/advtrains/poconvert.lua
diff options
context:
space:
mode:
Diffstat (limited to 'advtrains/poconvert.lua')
-rw-r--r--advtrains/poconvert.lua68
1 files changed, 47 insertions, 21 deletions
diff --git a/advtrains/poconvert.lua b/advtrains/poconvert.lua
index c7704f6..f44cbd1 100644
--- a/advtrains/poconvert.lua
+++ b/advtrains/poconvert.lua
@@ -59,14 +59,20 @@ end
local function readtoken(str, pos)
local _, epos, tok = string.find(str, [[^%s*(%S+)]], pos)
- if not epos then
+ if epos == nil then
return nil, pos
end
return tok, epos+1
end
+local function readcomment_add_flags(flags, s)
+ for flag in string.gmatch(s, ",%s*([^,]+)") do
+ flags[flag] = true
+ end
+end
+
local function readcomment_aux(str, pos)
- local _, epos, sval = string.find(str, "^\n*#%s*([^\n]*)", pos)
+ local _, epos, sval = string.find(str, "^\n*#([^\n]*)", pos)
if not epos then
return nil
end
@@ -76,10 +82,18 @@ end
local function readcomment(str, pos)
local st = {}
local nxt = pos
+ local flags = {}
while true do
local s, npos = readcomment_aux(str, nxt)
if not npos then
- return table.concat(st, "\n"), nxt
+ local t = {
+ comment = table.concat(st, "\n"),
+ flags = flags,
+ }
+ return t, nxt
+ end
+ if string.sub(s, 1, 1) == "," then
+ readcomment_add_flags(flags, s)
end
table.insert(st, s)
nxt = npos
@@ -90,24 +104,32 @@ local function readpo(str)
local st = {}
local pos = 1
while true do
- local tok
- local _, npos = readcomment(str, pos)
- tok, npos = readtoken(str, npos)
- if not tok then
- return st
+ local entry, nxt = readcomment(str, pos)
+ local msglines = 0
+ while true do
+ local tok, npos = readtoken(str, nxt)
+ if tok == nil or string.sub(tok, 1, 1) == "#" then
+ break
+ elseif string.sub(tok, 1, 3) ~= "msg" then
+ return error("Invalid token: " .. tok)
+ elseif entry[tok] ~= nil then
+ break
+ else
+ local value, npos = readstring(str, npos)
+ assert(value ~= nil, "No string provided for " .. tok)
+ entry[tok] = value
+ nxt = npos
+ msglines = msglines+1
+ end
end
- assert(tok == "msgid", "Invalid token: " .. tok)
- local orig, tr
- orig, npos = readstring(str, npos)
- assert(orig ~= nil, "Missing untranslated string")
- tok, npos = readtoken(str, npos)
- assert(tok == "msgstr", "Invalid token: " .. tok)
- tr, npos = readstring(str, npos)
- assert(tr ~= nil, "Missing translated string")
- if not (orig == "" or tr == "") then
- st[orig] = tr
+ if msglines == 0 then
+ return st
+ elseif entry.msgid ~= "" then
+ assert(entry.msgid ~= nil, "Missing untranslated string")
+ assert(entry.msgstr ~= nil, "Missing translated string")
+ table.insert(st, entry)
end
- pos = npos
+ pos = nxt
end
end
@@ -121,8 +143,12 @@ end
local function convert_po_string(textdomain, str)
local st = {string.format("# textdomain: %s", textdomain)}
- for k, v in pairs(readpo(str)) do
- table.insert(st, ("%s=%s"):format(escape_string(k), escape_string(v)))
+ for _, entry in ipairs(readpo(str)) do
+ local line = ("%s=%s"):format(escape_string(entry.msgid), escape_string(entry.msgstr))
+ if entry.flags.fuzzy then
+ line = "#" .. line
+ end
+ table.insert(st, line)
end
return table.concat(st, "\n")
end