131 lines
2.9 KiB
Lua
131 lines
2.9 KiB
Lua
#! /usr/bin/env lua
|
|
|
|
local basedir = ""
|
|
if arg[0]:find("[/\\]") then
|
|
basedir = arg[0]:gsub("(.*[/\\]).*$", "%1"):gsub("\\", "/")
|
|
end
|
|
if basedir == "" then basedir = "./" end
|
|
|
|
-- Required by load_strings()
|
|
function string.trim(s) -- luacheck: ignore
|
|
return s:gsub("^%s*(.-)%s*$", "%1")
|
|
end
|
|
|
|
dofile(basedir.."/../lib.lua")
|
|
|
|
local me = arg[0]:gsub(".*[/\\](.*)$", "%1")
|
|
|
|
local function err(fmt, ...)
|
|
io.stderr:write(("%s: %s\n"):format(me, fmt:format(...)))
|
|
os.exit(1)
|
|
end
|
|
|
|
local output, outfile, template
|
|
local catalogs = { }
|
|
|
|
local function usage()
|
|
print([[
|
|
Usage: ]]..me..[[ [OPTIONS] TEMPLATE CATALOG...
|
|
|
|
Update a catalog with new strings from a template.
|
|
|
|
Available options:
|
|
-h,--help Show this help screen and exit.
|
|
-o,--output X Set output file (default: stdout).
|
|
|
|
Messages in the template that are not on the catalog are added to the
|
|
catalog at the end.
|
|
|
|
This tool also checks messages that are in the catalog but not in the
|
|
template, and reports such lines. It's up to the user to remove such
|
|
lines, if so desired.
|
|
]])
|
|
os.exit(0)
|
|
end
|
|
|
|
local i = 1
|
|
|
|
while i <= #arg do
|
|
local a = arg[i]
|
|
if (a == "-h") or (a == "--help") then
|
|
usage()
|
|
elseif (a == "-o") or (a == "--output") then
|
|
i = i + 1
|
|
if i > #arg then
|
|
err("missing required argument to `%s'", a)
|
|
end
|
|
output = arg[i]
|
|
elseif a:sub(1, 1) ~= "-" then
|
|
if not template then
|
|
template = a
|
|
else
|
|
table.insert(catalogs, a)
|
|
end
|
|
else
|
|
err("unrecognized option `%s'", a)
|
|
end
|
|
i = i + 1
|
|
end
|
|
|
|
if not template then
|
|
err("no template specified")
|
|
elseif #catalogs == 0 then
|
|
err("no catalogs specified")
|
|
end
|
|
|
|
local f, e = io.open(template, "r")
|
|
if not f then
|
|
err("error opening template: %s", e)
|
|
end
|
|
|
|
local escapes = { ["\n"] = "\\n", ["="] = "\\=", ["\\"] = "\\\\", }
|
|
local function escape(s)
|
|
return s:gsub("[\\\n=]", escapes)
|
|
end
|
|
|
|
if output then
|
|
outfile, e = io.open(output, "w")
|
|
if not outfile then
|
|
err("error opening file for writing: %s", e)
|
|
end
|
|
end
|
|
|
|
local template_msgs = intllib.load_strings(template)
|
|
|
|
for _, file in ipairs(catalogs) do
|
|
print("Processing: "..file)
|
|
local catalog_msgs = intllib.load_strings(file)
|
|
local dirty_lines = { }
|
|
if catalog_msgs then
|
|
-- Add new entries from template.
|
|
for k in pairs(template_msgs) do
|
|
if not catalog_msgs[k] then
|
|
print("NEW: "..k)
|
|
table.insert(dirty_lines, escape(k).." =")
|
|
end
|
|
end
|
|
-- Check for old messages.
|
|
for k, v in pairs(catalog_msgs) do
|
|
if not template_msgs[k] then
|
|
print("OLD: "..k)
|
|
table.insert(dirty_lines, "OLD: "..escape(k).." = "..escape(v))
|
|
end
|
|
end
|
|
if #dirty_lines > 0 then
|
|
local outf
|
|
outf, e = io.open(file, "a+")
|
|
if outf then
|
|
outf:write("\n")
|
|
for _, line in ipairs(dirty_lines) do
|
|
outf:write(line)
|
|
outf:write("\n")
|
|
end
|
|
outf:close()
|
|
else
|
|
io.stderr:write(("%s: WARNING: cannot write: %s\n"):format(me, e))
|
|
end
|
|
end
|
|
else
|
|
io.stderr:write(("%s: WARNING: could not load catalog\n"):format(me))
|
|
end
|
|
end
|