#!/usr/bin/env lua5.3 local function template(str, args) return (str:gsub("%%(%w+)%%", args)) end local function urldecode(s) return s:gsub('+',' ') :gsub('%%(%x%x)',function(x) return string.char(tonumber(x,16)) end) end local function parse_qs(s) local ix = 1 local res = {} while true do local _,next_ix,ek,ev = s:find("([^=]+)=([^&]*)&?",ix) if not ek then break end local k,v = urldecode(ek), urldecode(ev) res[k] = v ix = next_ix + 1 end return res end local function eprint(...) local s = {} for i = 1, select('#',...) do s[i] = tostring(select(i, ...)) end io.stderr:write(table.concat(s, "\t"), "\n") end local document_template do local template_file = assert(io.open"template.html") document_template = template_file:read"a" template_file:close() end local function load_dict(filename) local res = {} for line in io.lines(filename) do local word, pos, def = line:match "^(.-)\t(.-)\t(.-)$" if word then res[word] = {pos=pos, def=def, word=word} end end return res end local function format_def(found_word, entry) local defc if entry then defc = template("%word% %pos%. %def%", entry) else defc = "????" end return template( "%defc%%wi%", {defc=defc, wi=found_word} ) end local glossors = {} function glossors.sanila(text) local words = load_dict "sanila.tsv" local items = {} -- sanila morphology is easy enough for word in text:gmatch("%S+") do local stripped = word:match("^(.-)[.,]*$") local entry = words[stripped] table.insert(items, format_def(word, entry)) end return items end local function engloss(langue, text) local items = glossors[langue](text) return template([[
%text%
]], {text=table.concat(items, "\n")}) end local function enform() return [[
]] end local function response(content) print("Content-Type: text/html") print() print(template(document_template, {content=content})) end local function main() local text = nil local qs = os.getenv"QUERY_STRING" if qs then text = parse_qs(qs).q end if not text then response(enform()) else response(engloss('sanila', text)) end end main()