diff options
Diffstat (limited to 'advtrains/poconvert.lua')
-rw-r--r-- | advtrains/poconvert.lua | 68 |
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 |