143 lines
2.4 KiB
Lua
143 lines
2.4 KiB
Lua
|
#! /usr/bin/env 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
|
||
|
local inputs = { }
|
||
|
local lang
|
||
|
local author
|
||
|
|
||
|
local i = 1
|
||
|
|
||
|
local function usage()
|
||
|
print([[
|
||
|
Usage: ]]..me..[[ [OPTIONS] FILE...
|
||
|
|
||
|
Extract translatable strings from the given FILE(s).
|
||
|
|
||
|
Available options:
|
||
|
-h,--help Show this help screen and exit.
|
||
|
-o,--output X Set output file (default: stdout).
|
||
|
-a,--author X Set author.
|
||
|
-l,--lang X Set language name.
|
||
|
]])
|
||
|
os.exit(0)
|
||
|
end
|
||
|
|
||
|
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 == "-a") or (a == "--author") then
|
||
|
i = i + 1
|
||
|
if i > #arg then
|
||
|
err("missing required argument to `%s'", a)
|
||
|
end
|
||
|
author = arg[i]
|
||
|
elseif (a == "-l") or (a == "--lang") then
|
||
|
i = i + 1
|
||
|
if i > #arg then
|
||
|
err("missing required argument to `%s'", a)
|
||
|
end
|
||
|
lang = arg[i]
|
||
|
elseif a:sub(1, 1) ~= "-" then
|
||
|
table.insert(inputs, a)
|
||
|
else
|
||
|
err("unrecognized option `%s'", a)
|
||
|
end
|
||
|
i = i + 1
|
||
|
end
|
||
|
|
||
|
if #inputs == 0 then
|
||
|
err("no input files")
|
||
|
end
|
||
|
|
||
|
local outfile = io.stdout
|
||
|
|
||
|
local function printf(fmt, ...)
|
||
|
outfile:write(fmt:format(...))
|
||
|
end
|
||
|
|
||
|
if output then
|
||
|
local e
|
||
|
outfile, e = io.open(output, "w")
|
||
|
if not outfile then
|
||
|
err("error opening file for writing: %s", e)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if author or lang then
|
||
|
outfile:write("\n")
|
||
|
end
|
||
|
|
||
|
if lang then
|
||
|
printf("# Language: %s\n", lang)
|
||
|
end
|
||
|
|
||
|
if author then
|
||
|
printf("# Author: %s\n", author)
|
||
|
end
|
||
|
|
||
|
if author or lang then
|
||
|
outfile:write("\n")
|
||
|
end
|
||
|
|
||
|
local escapes = {
|
||
|
["\n"] = "\\n",
|
||
|
["="] = "\\=",
|
||
|
["\\"] = "\\\\",
|
||
|
}
|
||
|
|
||
|
local function escape(s)
|
||
|
return s:gsub("[\\\n=]", escapes)
|
||
|
end
|
||
|
|
||
|
local messages = { }
|
||
|
|
||
|
for _, file in ipairs(inputs) do
|
||
|
local infile, e = io.open(file, "r")
|
||
|
if infile then
|
||
|
for line in infile:lines() do
|
||
|
for s in line:gmatch('S%("([^"]*)"') do
|
||
|
table.insert(messages, s)
|
||
|
end
|
||
|
end
|
||
|
infile:close()
|
||
|
else
|
||
|
io.stderr:write(("%s: WARNING: error opening file: %s\n"):format(me, e))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
table.sort(messages)
|
||
|
|
||
|
local last_msg
|
||
|
|
||
|
for _, msg in ipairs(messages) do
|
||
|
if msg ~= last_msg then
|
||
|
printf("%s =\n", escape(msg))
|
||
|
end
|
||
|
last_msg = msg
|
||
|
end
|
||
|
|
||
|
if output then
|
||
|
outfile:close()
|
||
|
end
|
||
|
|
||
|
--[[
|
||
|
TESTS:
|
||
|
S("foo") S("bar")
|
||
|
S("bar")
|
||
|
S("foo")
|
||
|
]]
|