summaryrefslogtreecommitdiff
path: root/amaryllis.cgi
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2022-12-19 02:38:48 -0600
committersanine <sanine.not@pm.me>2022-12-19 02:38:48 -0600
commitfab85f8d639c8b7792775d02a2d3fe22fe96befd (patch)
treee04fb110a297be8d29b6f4f7562692096f80eb5f /amaryllis.cgi
initial commit
Diffstat (limited to 'amaryllis.cgi')
-rwxr-xr-xamaryllis.cgi210
1 files changed, 210 insertions, 0 deletions
diff --git a/amaryllis.cgi b/amaryllis.cgi
new file mode 100755
index 0000000..83b6e4f
--- /dev/null
+++ b/amaryllis.cgi
@@ -0,0 +1,210 @@
+#!/usr/bin/lua5.1
+
+local marigold = require 'marigold'
+local lang = require 'language'
+
+local h = marigold.h
+local metavars = marigold.get_metavars()
+local settings = marigold.decode_query(metavars.query_string or '')
+
+settings.seed = tonumber(settings.seed) or os.time()
+math.randomseed(settings.seed)
+
+settings.phonemes = settings.phonemes or [[
+C=mnbdTLshzwrly
+V=aeiou
+T=1324
+]]
+
+settings.syllables = settings.syllables or [[
+CVT
+CVTl
+CVTn
+]]
+
+settings.orthography = settings.orthography or [[
+T=th
+L=lh
+z=zh
+(%V)1=%1́
+(%V)2=%1%1́
+(%V)3=%1
+(%V)4=%1́%1
+]]
+
+settings.phonemes_decay = settings.phonemes_decay or 'Q'
+settings.syllables_decay = settings.syllables_decay or 'Q'
+
+settings.len_min = settings.len_min or "1"
+settings.len_max = settings.len_max or "3"
+settings.count = settings.count or "20"
+
+
+local distributions = {
+ U=lang.uniform,
+ Q=lang.quadratic,
+}
+
+local p_dist = distributions[settings.phonemes_decay]
+local s_dist = distributions[settings.syllables_decay]
+
+
+local l = lang.Language(
+ settings.phonemes,
+ settings.syllables,
+ settings.orthography,
+ tonumber(settings.len_min),
+ tonumber(settings.len_max),
+ p_dist,
+ s_dist
+)
+
+
+local syllable_html = {}
+for i=1,tonumber(settings.count) do
+ table.insert(
+ syllable_html,
+ h('li', l:romanize(l:word()))
+ )
+end
+syllable_html = h('ol', syllable_html)
+
+
+function radiobutton(label, name, value, checked)
+ local radio = h('input', {
+ type="radio",
+ name=name,
+ id = name .. value,
+ value = value,
+ checked = (checked and "true") or nil
+ })
+ local lbl = {}
+ lbl['for'] = name .. value
+ local label = h('label', label, lbl)
+
+ return h('div', { radio, label })
+end
+
+
+function textarea(name, text, decay)
+ local children = { class="noborder",
+ h('legend', name),
+ h('textarea', text, { name=name, rows="6", spellcheck="false" }),
+ }
+
+ if decay then table.insert(children, h('fieldset', {
+ h('legend', name .. ' decay'),
+ radiobutton("uniform", name .. '_decay', 'U', settings[name .. '_decay'] == 'U'),
+ radiobutton("quadratic", name .. '_decay', 'Q', settings[name .. '_decay'] == 'Q'),
+ })
+ ) end
+
+ return h('fieldset', children)
+end
+
+
+local form = h('form', {
+ h('label', 'seed', {
+ h('input', { name="seed", type="number", value=tostring(settings.seed) }),
+ }),
+
+ h('input', { value="update", type="Submit" } ),
+
+ h('br'),
+ h('div', { class="form-flex",
+ textarea('phonemes', settings.phonemes, true),
+ textarea('syllables', settings.syllables, true),
+ textarea('orthography', settings.orthography, false),
+ }),
+ h('br'),
+
+ h('label', 'min syllables', {
+ h('input', { name="len_min", type="number", min="1", value=settings.len_min }),
+ }),
+ h('br'),
+ h('label', 'max syllables', {
+ h('input', { name="len_max", type="number", min="1", value=settings.len_max }),
+ }),
+ h('br'),
+ h('label', '# to generate', {
+ h('input', { name="count", type="number", min="1", value=settings.count }),
+ }),
+
+ h('input', { value="update", type="Submit" } ),
+})
+
+
+local body = h('body', { h('div', { id="content",
+ h('a', '<- projects', { href='https://sanine.net/projects/' }),
+ h('br'), h('br'),
+ form,
+ h('hr'),
+ syllable_html,
+ h('a', 'hello there c:', { href="#" }),
+})})
+
+
+local head = h('head', {
+ h('meta', { charset="utf-8" }),
+ h('meta', { name="viewport", content="width=device-width, initial-scale=1" }),
+ h('title', 'amaryllis | sanine.net'),
+ h('style', [[
+
+ :root {
+ --light: #eee;
+ --dark: #1c1c1c;
+ --highlight: #f5ae2e;
+ }
+
+ body {
+ color: var(--light);
+ background: var(--dark);
+ font: 1.3em monospace;
+ text-size-adjust: auto;
+ }
+
+ #content {
+ max-width: 40em;
+ margin: auto;
+ }
+
+ .noborder {
+ border: none;
+ padding: 0px;
+ }
+
+ a {
+ color: var(--highlight);
+ }
+
+ a:hover {
+ color: var(--dark);
+ background: var(--highlight);
+ text-decoration: none;
+ }
+
+ .form-flex {
+ display: flex;
+ flex-wrap: wrap;
+ wrap: 100%;
+ }
+
+ textarea {
+ color: var(--light);
+ background: #191919;
+ border: 1px solid var(--highlight);
+ }
+
+ input {
+ font-family: monospace;
+ color: var(--highlight);
+ background: var(--dark);
+ border: 1px solid var(--highlight);
+ }
+ ]]
+ ),
+})
+
+
+print('Content-type: text/html\n')
+print(marigold.html(h('html', { head, body })))