summaryrefslogtreecommitdiff
path: root/conlex.lua
diff options
context:
space:
mode:
authorubq323 <ubq323@ubq323.website>2024-11-05 18:55:43 +0000
committerubq323 <ubq323@ubq323.website>2024-11-05 18:55:43 +0000
commit0431089dd2bd506171d5cc22183d53c9b81f611e (patch)
tree0f04272e0d9c594145a88960cbfc74615c45bb00 /conlex.lua
initial
Diffstat (limited to 'conlex.lua')
-rwxr-xr-xconlex.lua116
1 files changed, 116 insertions, 0 deletions
diff --git a/conlex.lua b/conlex.lua
new file mode 100755
index 0000000..afee980
--- /dev/null
+++ b/conlex.lua
@@ -0,0 +1,116 @@
+#!/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("<b>%word%</b> <i>%pos%</i>. %def%", entry)
+ else
+ defc = "????"
+ end
+ return template(
+ "<word><def>%defc%</def><wi>%wi%</wi></word>",
+ {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([[
+ <section>%text%</section>
+ <section id=place></section>]], {text=table.concat(items, "\n")})
+end
+
+local function enform()
+ return [[
+<section>
+<form>
+ <textarea name=q></textarea>
+ <button>perform <i>conlation</i></button>
+</form>
+</section>]]
+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()
+