#!/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 })))