123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- #! /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")
- ]]
|