Wiktionary
thwiktionary
https://th.wiktionary.org/wiki/%E0%B8%A7%E0%B8%B4%E0%B8%81%E0%B8%B4%E0%B8%9E%E0%B8%88%E0%B8%99%E0%B8%B2%E0%B8%99%E0%B8%B8%E0%B8%81%E0%B8%A3%E0%B8%A1:%E0%B8%AB%E0%B8%99%E0%B9%89%E0%B8%B2%E0%B8%AB%E0%B8%A5%E0%B8%B1%E0%B8%81
MediaWiki 1.45.0-wmf.9
case-sensitive
สื่อ
พิเศษ
พูดคุย
ผู้ใช้
คุยกับผู้ใช้
วิกิพจนานุกรม
คุยเรื่องวิกิพจนานุกรม
ไฟล์
คุยเรื่องไฟล์
มีเดียวิกิ
คุยเรื่องมีเดียวิกิ
แม่แบบ
คุยเรื่องแม่แบบ
วิธีใช้
คุยเรื่องวิธีใช้
หมวดหมู่
คุยเรื่องหมวดหมู่
ภาคผนวก
คุยเรื่องภาคผนวก
ดัชนี
คุยเรื่องดัชนี
สัมผัส
คุยเรื่องสัมผัส
อรรถาภิธาน
คุยเรื่องอรรถาภิธาน
TimedText
TimedText talk
มอดูล
คุยเรื่องมอดูล
เลื้อยคลาน
0
44164
4755972
1566683
2025-07-10T15:11:27Z
Jamnanja
16523
/* ภาษาไทย */เพิ่ม คำพ้องความ
4755972
wikitext
text/x-wiki
== ภาษาไทย ==
=== รากศัพท์ ===
{{com|th|เลื้อย|คลาน}}
=== การออกเสียง ===
{{th-pron|เลื้อย-คฺลาน}}
=== คำนาม ===
{{th-noun}}
# [[สัตว์]][[เลือดเย็น]][[จำพวก]][[ที่]][[ผิวหนัง]][[มี]][[เกล็ด]][[ปกคลุม]] [[หายใจ]][[ด้วย]][[ปอด]][[อย่าง]][[จิ้งจก]] [[จิ้งเหลน]] [[จระเข้]] [[เต่า]] [[งู]] [[ส่วน]][[มาก]][[วางไข่]] [[หลาย]][[ชนิด]][[ออกลูก]][[เป็น]][[ตัว]] [[ลูก]][[อ่อน]]มี[[ลักษณะ]]อย่าง[[พ่อ]][[แม่]] [[เรียก]][[ว่า]] สัตว์เลื้อยคลาน, [[เดิม]]เรียกว่า สัตว์[[เสือก]]คลาน
==== คำพ้องความ ====
* [[สรีสฤบ]]
=== คำกริยา ===
{{th-verb}}
# [[เลื้อย]][[หรือ]][[คลาน]][[ไป]]อย่างสัตว์เลื้อยคลาน
[[หมวดหมู่:คำประสมพ้องความภาษาไทย]]
ha0bkdnfg2kkq4ryqjctzltdi6maenp
มอดูล:de-headword
828
141377
4755937
4358505
2025-07-10T12:36:40Z
Octahedron80
267
4755937
Scribunto
text/plain
local export = {}
local pos_functions = {}
local lang = require("Module:languages").getByCode("de")
local legal_gender = {
["m"] = true,
["f"] = true,
["n"] = true,
["p"] = true,
}
local gender_names = {
["m"] = "เพศชาย",
["f"] = "เพศหญิง",
["n"] = "เพศกลาง",
}
local legal_verb_classes = {
["1"] = true,
["2"] = true,
["3"] = true,
["4"] = true,
["5"] = true,
["6"] = true,
["7"] = true,
}
local function ine(val)
if val == "" then return nil else return val end
end
local function glossary_link(entry, text)
text = text or entry
return "[[ภาคผนวก:อภิธานศัพท์#" .. entry .. "|" .. text .. "]]"
end
local function track(page)
require("Module:debug").track("de-headword/" .. page)
return true
end
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
local args = frame:getParent().args
PAGENAME = mw.title.getCurrentTitle().text
local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
-- หมวดหมู่เป็นภาษาไทย
local poscat_th = require("Module:th-utilities").th_pos(poscat)
local class = frame.args[2]; if class == "" then class = nil end
local data = {lang = lang, pos_category = poscat_th, categories = {}, heads = {}, genders = {}, inflections = {}}
if pos_functions[poscat_th] then
pos_functions[poscat_th](class, args, data)
end
return
require("Module:headword").full_headword(data)
end
local function old_adjectives(class, args, data)
track("de-adj-old")
local params = {
[1] = {list = "comp"},
[2] = {list = "sup"},
["head"] = {list = true},
}
local args = require("Module:parameters").process(args, params)
data.heads = args["head"]
if args[1][1] == "-" then
table.insert(data.inflections, {label = "เปรียบเทียบไม่ได้"})
table.insert(data.categories, "คำคุณศัพท์เปรียบเทียบไม่ได้ภาษาเยอรมัน")
return
end
if #args[1] > 0 then
for i, form in ipairs(args[1]) do
args[1][i] = {term = (form == "er" and PAGENAME .. "er" or form),
accel = {form = "ขั้นกว่า"}}
end
else
args[1] = {request = true}
track("de-adj lacking comparative")
end
args[1].label = glossary_link("ขั้นกว่า")
table.insert(data.inflections, args[1])
if #args[2] > 0 then
for i, form in ipairs(args[2]) do
args[2][i] = {
term = "am [[" .. ((form == "st" or form == "sten") and PAGENAME .. "sten" or (form == "est" or form == "esten") and PAGENAME .. "esten" or form) .. "]]",
accel = {form = "ขั้นสุด"}}
end
else
args[2] = {request = true}
track("de-adj lacking superlative")
end
args[2].label = glossary_link("ขั้นสุด")
table.insert(data.inflections, args[2])
end
pos_functions["คำคุณศัพท์"] = function(class, args, data, proper)
-- Compatibility with old calling convention, either if old= is given or any arg no longer supported is given.
if ine(args.old) or ine(args[2]) or ine(args.comp1) or ine(args.comp2) or ine(args.comp3) or
ine(args.sup1) or ine(args.sup2) or ine(args.sup3) or args[1] == "-" then
return old_adjectives(class, args, data)
else
-- Remove this code once we convert to the new format.
track("de-adj-need-old")
end
local alternant_multiword_spec = require("Module:de-adjective").do_generate_forms(args, nil, "from headword")
data.heads = alternant_multiword_spec.args.head
data.id = alternant_multiword_spec.args.id
data.sort = alternant_multiword_spec.args.sort
local function do_adj_form(slot, label, should_be_present, accel_form)
local forms = alternant_multiword_spec.forms[slot]
local retval
if not forms then
if not should_be_present then
return
end
retval = {label = "ไม่มี" .. label}
else
retval = {label = label, accel = accel_form and {form = accel_form} or nil}
local prev_footnotes
for _, form in ipairs(forms) do
local footnotes = form.footnotes
if footnotes and prev_footnotes and require("Module:table").deepEquals(footnotes, prev_footnotes) then
footnotes = nil
end
prev_footnotes = form.footnotes
local quals, refs = require("Module:inflection utilities").fetch_headword_qualifiers_and_references(footnotes)
local term = form.form
table.insert(retval, {term = term, q = quals, refs = refs, genders = genders})
end
end
table.insert(data.inflections, retval)
end
if alternant_multiword_spec.props.indecl then
table.insert(data.inflections, {label = glossary_link("ผันรูปไม่ได้")})
if alternant_multiword_spec.props.predonly then
table.insert(data.inflections, {label = "predicative only"})
elseif alternant_multiword_spec.props.nopred then
table.insert(data.inflections, {label = "no predicative form"})
end
else
if alternant_multiword_spec.props.nopred then
table.insert(data.inflections, {label = "no predicative form"})
end
do_adj_form("str_nom_m", "strong nominative masculine singular", true)
local should_comp_sup =
alternant_multiword_spec.forms.comp_pred or alternant_multiword_spec.forms.sup_pred or
alternant_multiword_spec.forms.comp_str_nom_m or alternant_multiword_spec.forms.sup_str_nom_m
if not should_comp_sup then
table.insert(data.inflections, {label = "เปรียบเทียบไม่ได้"})
else
-- If there is no predicative comparative, but there is an attributive comparative, include it;
-- otherwise, include the predicative comparative (if any). If there is no comparative but a superlative,
-- this will display "no comparative".
if not alternant_multiword_spec.forms.comp_pred and alternant_multiword_spec.forms.comp_str_nom_m then
do_adj_form("comp_str_nom_m", "strong comparative nominative masculine singular", true)
else
do_adj_form("comp_pred", glossary_link("ขั้นกว่า"), true, "comparative")
end
-- Same as above, for the superlative.
if not alternant_multiword_spec.forms.sup_pred and alternant_multiword_spec.forms.sup_str_nom_m then
do_adj_form("sup_str_nom_m", "strong superlative nominative masculine singular", true)
else
do_adj_form("sup_pred", glossary_link("ขั้นสุด"), true, "superlative")
end
end
end
-- Add categories.
for _, cat in ipairs(alternant_multiword_spec.categories) do
table.insert(data.categories, cat)
end
-- Use the "linked" form of the lemma as the head if no head= explicitly given.
data.no_redundant_head_cat = true -- always set since we have a different lemma linking algorithm from [[Module:headword]].
if #data.heads == 0 then
data.heads = {}
local lemmas = alternant_multiword_spec.forms.the_lemma or {}
for _, lemma_obj in ipairs(lemmas) do
local head = alternant_multiword_spec.args.nolinkhead and lemma_obj.form or
require("Module:headword utilities").add_lemma_links(lemma_obj.form, alternant_multiword_spec.args.splithyph)
local quals, refs = require("Module:inflection utilities").fetch_headword_qualifiers_and_references(lemma_obj.footnotes)
table.insert(data.heads, {term = head, q = quals, refs = refs})
end
end
end
local function old_nouns(class, args, data)
track("de-noun-old")
local params = {
[1] = {list = "g", default = "?"},
[2] = {list = "gen"},
[3] = {list = "pl"},
[4] = {list = "dim"},
["head"] = {list = true},
["m"] = {list = true},
["f"] = {list = true},
["old"] = {type = "boolean"},
}
local args = require("Module:parameters").process(args, params)
data.heads = args["head"]
-- Gender
for _, g in ipairs(args[1]) do
if legal_gender[g] then
table.insert(data.genders, g)
if g == "p" then
table.insert(data.categories, "คำนามพหูพจน์เท่านั้นภาษาเยอรมัน")
else
table.insert(data.categories, "คำนาม" .. gender_names[g] .. "ภาษาเยอรมัน")
end
else
if g == "m-s" or g == "f-s" or g == "n-s" or g == "m-p" or g == "f-p" or g == "n-p" then
require("Module:debug").track("de-headword/genders")
end
table.insert(data.genders, "?")
end
end
if args[1][1] ~= "p" then
-- Genitive
if not args[2][1] then
if args[1][1] == "m" or args[1][1] == "n" then
table.insert(args[2], PAGENAME .. "s")
else
table.insert(args[2], PAGENAME)
end
end
for i, form in ipairs(args[2]) do
args[2][i] = {term = form}
end
args[2].accel = {form = "gen|s"}
args[2].label = "สัมพันธการก"
table.insert(data.inflections, args[2])
-- Plural
if not args[3][1] and data.pos_category == "คำนาม" then
table.insert(args[3], PAGENAME .. "en")
end
if args[3][1] == "-" then
table.insert(data.inflections, {label = "ไม่มีพหูพจน์"})
table.insert(data.categories, "คำนามนับไม่ได้ภาษาเยอรมัน")
elseif #args[3] > 0 then
for i, form in ipairs(args[3]) do
args[3][i] = {term = form}
end
args[3].accel = {form = "p"}
args[3].label = "พหูพจน์"
table.insert(data.inflections, args[3])
end
end
-- Diminutive
if #args[4] > 0 then
for i, form in ipairs(args[4]) do
args[4][i] = {term = form, genders = {"n"}}
end
args[4].accel = {form = "ตัวบอกความเล็ก", gender = "n"}
args[4].label = "ตัวบอกความเล็ก"
table.insert(data.inflections, args[4])
end
-- Other gender
if #args.f > 0 then
args.f.label = "เพศหญิง"
if args.f[1] == "in" then
args.f[1] = PAGENAME .. "in"
end
if args.f[1] == PAGENAME .. "in" then
args.f.accel = {form = "เพศหญิง", gender = "f"}
args.f.label = "เพศหญิง"
end
table.insert(data.inflections, args.f)
end
if #args.m > 0 then
args.m.label = "เพศชาย"
table.insert(data.inflections, args.m)
end
end
pos_functions["คำนาม"] = function(class, args, data, proper)
-- Compatibility with old calling convention, either if old= is given or any arg no longer supported is given.
if ine(args.old) or ine(args[2]) or ine(args[3]) or ine(args[4]) or ine(args.g1) or ine(args.g2) or ine(args.g3) or
ine(args.gen1) or ine(args.gen2) or ine(args.gen3) or ine(args.pl1) or ine(args.pl2) or ine(args.pl3) then
return old_nouns(class, args, data)
end
local m_de_noun = require("Module:de-noun")
local alternant_multiword_spec = m_de_noun.do_generate_forms(args, nil, "from headword", proper)
data.heads = alternant_multiword_spec.args.head
data.genders = alternant_multiword_spec.genders
data.id = alternant_multiword_spec.args.id
data.sort = alternant_multiword_spec.args.sort
if not proper then
data.pos_category = alternant_multiword_spec.pos
if alternant_multiword_spec.pos == "ปัจจัย" then
table.insert(data.categories, "ปัจจัยสร้างคำนามภาษาเยอรมัน")
end
end
local function get_nom_articles(alternant_multiword_spec)
local articles = {}
local m_table = require("Module:table")
if alternant_multiword_spec.number == "pl" then
m_table.insertIfNot(articles, "[[die]]")
else
for _, gender in ipairs(alternant_multiword_spec.genders) do
if gender.spec == "m" then
m_table.insertIfNot(articles, "[[der]]")
elseif gender.spec == "f" then
m_table.insertIfNot(articles, "[[die]]")
elseif gender.spec == "n" then
m_table.insertIfNot(articles, "[[das]]")
else
error("Internal error: Unrecognized gender '" .. gender.spec .. "'")
end
end
end
return table.concat(articles, "/")
end
local function get_gen_s_articles(alternant_multiword_spec)
local articles = {}
local m_table = require("Module:table")
if alternant_multiword_spec.number == "pl" then
error("Internal error: Should not be called on plural-only nouns")
else
for _, gender in ipairs(alternant_multiword_spec.genders) do
if gender.spec == "m" or gender.spec == "n" then
m_table.insertIfNot(articles, "[[des]]")
elseif gender.spec == "f" then
m_table.insertIfNot(articles, "[[der]]")
else
error("Internal error: Unrecognized gender '" .. gender.spec .. "'")
end
end
end
return table.concat(articles, "/")
end
local function do_noun_form(slot, label, should_be_present, accel_form, genders, prefix)
local forms = alternant_multiword_spec.forms[slot]
local retval
if not forms then
if not should_be_present then
return
end
retval = {label = "ไม่มี" .. label}
else
retval = {label = label, accel = accel_form and {form = accel_form} or nil}
local prev_footnotes
for _, form in ipairs(forms) do
local footnotes = form.footnotes
if footnotes and prev_footnotes and require("Module:table").deepEquals(footnotes, prev_footnotes) then
footnotes = nil
end
prev_footnotes = form.footnotes
local quals, refs = require("Module:inflection utilities").fetch_headword_qualifiers_and_references(footnotes)
local term = form.form
if prefix then
if not term:find("[%[%]]") then
term = "[[" .. term .. "]]"
end
term = prefix .. " " .. term
end
table.insert(retval, {term = term, q = quals, refs = refs, genders = genders})
end
end
table.insert(data.inflections, retval)
end
if proper then
table.insert(data.inflections, {label = glossary_link("คำวิสามานยนาม")})
end
local decl_types = alternant_multiword_spec.decl_type
if decl_types and #decl_types > 0 then
local decl_descs = {}
for _, decl_type in ipairs(decl_types) do
table.insert(decl_descs, glossary_link("การผันรูป" .. decl_type, decl_type))
end
table.insert(data.inflections, {label = table.concat(decl_descs, " หรือ ")})
end
local overall_adj = alternant_multiword_spec.props.overall_adj
local article = alternant_multiword_spec.props.article
local surname = alternant_multiword_spec.props.surname
local langname = alternant_multiword_spec.props.langname
local saw_f = false
local saw_mn = false
for _, gender in ipairs(alternant_multiword_spec.genders) do
if gender.spec == "f" then
saw_f = true
elseif gender.spec == "m" or gender.spec == "n" then
saw_mn = true
end
end
local fem_sg_only = not saw_mn and alternant_multiword_spec.number ~= "pl"
if not alternant_multiword_spec.first_noun and alternant_multiword_spec.first_adj then
table.insert(data.inflections, {label = "เชิงคุณศัพท์"})
end
if surname then
table.insert(data.inflections, {label = "นามสกุล"})
end
if langname then
table.insert(data.inflections, {label = "ชื่อภาษา"})
end
if alternant_multiword_spec.number == "pl" then
table.insert(data.inflections, {label = glossary_link("พหูพจน์เท่านั้น")})
end
if article then
table.insert(data.inflections, {label = "โดยปกติชี้เฉพาะ"})
end
if alternant_multiword_spec.number == "pl" then
if overall_adj then
do_noun_form("wk_nom_p", "พหูพจน์ชี้เฉพาะ", true, nil, nil, "[[die]]")
end
elseif surname then
do_noun_form("gen_m_s", "สัมพันธการกเพศชาย", true)
do_noun_form("gen_f_s", "สัมพันธการกเพศหญิง", true)
do_noun_form("nom_p", "พหูพจน์", true)
elseif langname then
do_noun_form("gen_s", "สัมพันธการก", true)
do_noun_form("nom_s_alt", "กรรตุการกแบบอื่น (ใช้กับคำกำกับนามชี้เฉพาะ)", true)
do_noun_form("gen_s_alt", "สัมพันธการกแบบอื่น", true)
-- There should be no plural; this will trigger the display of 'no plural'.
do_noun_form("nom_p", "พหูพจน์", true)
elseif overall_adj then
if article then
if not fem_sg_only then
do_noun_form("wk_nom_s", "กรรตุการกชี้เฉพาะ", true, nil, nil, get_nom_articles(alternant_multiword_spec))
end
do_noun_form("wk_gen_s", "สัมพันธการกชี้เฉพาะ", true, nil, nil, get_gen_s_articles(alternant_multiword_spec))
do_noun_form("wk_nom_p", "พหูพจน์ชี้เฉพาะ", not proper, nil, nil, "[[die]]")
else
do_noun_form("wk_nom_s", "กรรตุการกชี้เฉพาะ", true, nil, nil, get_nom_articles(alternant_multiword_spec))
do_noun_form("str_gen_s", "สัมพันธการก", true, nil, nil, not saw_f and "([[des]])" or nil)
if saw_f then
do_noun_form("wk_gen_s", "สัมพันธการกชี้เฉพาะ", true, nil, nil, get_gen_s_articles(alternant_multiword_spec))
end
do_noun_form("str_nom_p", "พหูพจน์", not proper)
do_noun_form("wk_nom_p", "พหูพจน์ชี้เฉพาะ", nil, nil, nil, "[[die]]")
end
else
if article then
do_noun_form("gen_s", "สัมพันธการกชี้เฉพาะ", true, nil, nil, get_gen_s_articles(alternant_multiword_spec))
do_noun_form("nom_p", "พหูพจน์ชี้เฉพาะ", not proper, nil, nil, "[[die]]")
else
do_noun_form("gen_s", "สัมพันธการก", true)
do_noun_form("nom_p", "พหูพจน์", not proper)
end
end
-- FIXME: Should we include the article in the singular equivalent if .article is given? I have no examples to go by.
do_noun_form("sg", "เอกพจน์")
do_noun_form("dim", "ตัวบอกความเล็ก", nil, "ตัวบอกความเล็ก", {"n"}, article and "[[das]]" or nil)
do_noun_form("m", "เพศชาย", nil, nil, nil, article and "[[der]]" or nil)
do_noun_form("f", "เพศหญิง", nil, "เพศหญิง", nil, article and "[[die]]" or nil)
do_noun_form("n", "เพศกลาง", nil, "เพศกลาง", nil, article and "[[das]]" or nil)
-- Add categories.
for _, cat in ipairs(alternant_multiword_spec.categories) do
table.insert(data.categories, cat)
end
-- Use the "linked" form of the lemma as the head if no head= explicitly given.
data.no_redundant_head_cat = true -- always set since we have a different lemma linking algorithm from [[Module:headword]].
if #data.heads == 0 then
data.heads = {}
local lemmas = m_de_noun.get_lemmas(alternant_multiword_spec, "linked variant")
for _, lemma_obj in ipairs(lemmas) do
local head = alternant_multiword_spec.args.nolinkhead and lemma_obj.form or
require("Module:headword utilities").add_lemma_links(lemma_obj.form, alternant_multiword_spec.args.splithyph)
if article and (not overall_adj or fem_sg_only) then
head = get_nom_articles(alternant_multiword_spec) .. " " .. head
end
local quals, refs = require("Module:inflection utilities").fetch_headword_qualifiers_and_references(lemma_obj.footnotes)
table.insert(data.heads, {term = head, q = quals, refs = refs})
end
end
end
pos_functions["คำวิสามานยนาม"] = function(class, args, data)
return pos_functions["คำนาม"](class, args, data, "คำวิสามานยนาม")
end
pos_functions["คำกริยา"] = function(class, args, data)
if args[2] then -- old-style
local params = {
[1] = {list = "pres", required = true},
["pres_qual"] = {list = "pres\1_qual", allow_holes = true},
[2] = {list = "past", required = true},
["past_qual"] = {list = "past\1_qual", allow_holes = true},
[3] = {list = "pp", required = true},
["pp_qual"] = {list = "pp\1_qual", allow_holes = true},
[4] = {list = "pastsubj"},
["pastsubj_qual"] = {list = "pastsubj\1_qual", allow_holes = true},
["aux"] = {list = true},
["aux_qual"] = {list = "aux\1_qual", allow_holes = true},
["head"] = {list = true},
["class"] = {list = true},
}
local args = require("Module:parameters").process(args, params)
data.heads = args["head"]
local function collect_forms(label, accel_form, forms, qualifiers)
if forms[1] == "-" then
return {label = "ไม่มี" .. label}
else
local into_table = accel_form and {label = label, accel = {form = accel_form}} or {label = label}
for i, form in ipairs(forms) do
table.insert(into_table, {term = form, q = qualifiers[i] and {qualifiers[i]} or nil})
end
return into_table
end
end
if #args.class > 0 then
local class_descs, cats = require("Module:de-verb").process_verb_classes(args.class)
for _, cats in ipairs(cats) do
table.insert(data.categories, cats)
end
table.insert(data.inflections, {label = require("Module:table").serialCommaJoin(class_descs, {conj = "หรือ"})})
end
table.insert(data.inflections, collect_forms("บุรุษที่สามเอกพจน์ปัจจุบันกาล", "3|s|pres", args[1], args.pres_qual))
table.insert(data.inflections, collect_forms("อดีตกาล", "1//3|s|pret", args[2], args.past_qual))
table.insert(data.inflections, collect_forms("รูปกริยาขยายอดีตกาล", "perf|part", args[3], args.pp_qual))
if #args[4] > 0 then
table.insert(data.inflections, collect_forms("มาลาสมมุติอดีตกาล", "1//3|s|sub|II", args[4], args.pastsubj_qual))
end
if #args.aux > 0 then
table.insert(data.inflections, collect_forms("คำกริยานุเคราะห์", nil, args.aux, args.aux_qual))
end
return
end
local function get_headword_inflection(forms, label, accel_form)
if forms then
local inflection = accel_form and {label = label, accel = {form = accel_form}} or {label = label}
for _, form in ipairs(forms) do
local qualifiers
if form.footnotes then
qualifiers = {}
for _, footnote in ipairs(form.footnotes) do
footnote = footnote:gsub("^%[(.*)%]$", "%1")
table.insert(qualifiers, footnote)
end
end
table.insert(inflection, {term = form.form, q = qualifiers})
end
return inflection
elseif label then
return {label = "ไม่มี" .. label}
else
return {}
end
end
local alternant_multiword_spec = require("Module:de-verb").do_generate_forms(args, "from headword")
for _, cat in ipairs(alternant_multiword_spec.categories) do
table.insert(data.categories, cat)
end
table.insert(data.inflections, {label = table.concat(alternant_multiword_spec.verb_types, " หรือ ")})
if #data.heads == 0 then
data.no_redundant_head_cat = true
for _, head in ipairs(alternant_multiword_spec.forms.infinitive_linked) do
table.insert(data.heads, head.form)
end
end
table.insert(data.inflections, get_headword_inflection(alternant_multiword_spec.forms.pres_3s,
"บุรุษที่สามเอกพจน์ปัจจุบันกาล", "3|s|pres"))
local pret_3s = alternant_multiword_spec.forms.pret_3s
table.insert(data.inflections, get_headword_inflection(pret_3s, "อดีตกาล", "1//3|s|pret"))
table.insert(data.inflections, get_headword_inflection(alternant_multiword_spec.forms.perf_part,
"รูปกริยาขยายอดีตกาล", "perf|part"))
-- See if we need the past subjunctive, i.e. there exist past subjunctive forms whose stem is not the
-- same as some past tense form. To facilitate comparison, we truncate final -e in both preterite 3s
-- and past subjunctive 3s, to handle cases like subjunctive 'ginge aus' vs. preterite 'ging aus'.
-- We need to compare 3s forms (and not e.g. 3p forms, where the issue with truncating -e doesn't
-- occur) so we work correctly with impersonal verbs.
local need_past_subj
local truncated_pret_3s_forms = {}
if pret_3s then
for _, form in ipairs(pret_3s) do
local truncated_form = form.form:gsub("e$", ""):gsub("e ", " ") -- discard 2nd retval
table.insert(truncated_pret_3s_forms, truncated_form)
end
end
local subii_3s = alternant_multiword_spec.forms.subii_3s
local truncated_subii_3s_forms = {}
if subii_3s then
for _, form in ipairs(subii_3s) do
local truncated_form = form.form:gsub("e$", ""):gsub("e ", " ") -- discard 2nd retval
table.insert(truncated_subii_3s_forms, truncated_form)
end
end
for _, past_subj_form in ipairs(truncated_subii_3s_forms) do
local saw_same = false
for _, pret_3s_form in ipairs(truncated_pret_3s_forms) do
if past_subj_form == pret_3s_form then
saw_same = true
break
end
end
if not saw_same then
need_past_subj = true
break
end
end
if need_past_subj then
table.insert(data.inflections, get_headword_inflection(subii_3s, "มาลาสมมุติอดีตกาล", "1//3|s|sub|II"))
end
local auxes = alternant_multiword_spec.forms.aux
table.insert(data.inflections, get_headword_inflection(auxes, "คำกริยานุเคราะห์"))
end
return export
r83aamcniqslmn7geivhobryghvc7bm
ผู้ใช้:Suban Kampaeng
2
220789
4755977
986281
2025-07-11T07:30:26Z
CommonsDelinker
136
Removing [[:c:File:SubanKampaengLife2017.jpg|SubanKampaengLife2017.jpg]], it has been deleted from Commons by [[:c:User:Túrelio|Túrelio]] because: [[:c:COM:CSD#F10|CSD F10]] (personal photos by non-contributors) promotional.
4755977
wikitext
text/x-wiki
[ชื่อ]'''นายสุบรรณ์ คำแพง'''
[เกิด] จ.สุรินทร์ Surin,TH.
[อาชีพ] '''Engineer'''
[ที่ทำงาน] Palm Garden Hotel. Pattaya City TH.
โรงแรมปาล์มการ์เด้นพัทยา เมืองพัทยา จ.ชลบุรี
'''Welcome to my Webblog
'''
[https://suban2008.blogspot.com SubanBlog]
'''○ชีวิต ศรัทธา ความหวังและกำลังใจ○'''
Click:Here:
https://suban2008.blogspot.com
phxd39eozdva1dr4c7a7421a4ckqbv4
แม่แบบ:de-zu-infinitive of
10
288816
4755945
1199098
2025-07-10T12:41:36Z
Octahedron80
267
4755945
wikitext
text/x-wiki
<span class='use-with-mention'>รูปกริยากลาง zu ของ <!--
--><span class='mention'>{{#if:{{{2|}}}
|[[{{{1}}}#ภาษาเยอรมัน|{{{2}}}]]
|[[{{{1}}}#ภาษาเยอรมัน|{{{1}}}]]
}}<!--
--></span></span><!--
--><includeonly>[[หมวดหมู่:รูปกริยากลาง zu ภาษาเยอรมัน]]</includeonly><!--
--><noinclude>[[หมวดหมู่:แม่แบบภาษาเยอรมัน]]</noinclude>
fwmkp32lcysbyy9i2doa3jvg3l1mw8e
มอดูล:de-verb
828
293778
4755936
4358507
2025-07-10T12:35:25Z
Octahedron80
267
4755936
Scribunto
text/plain
local export = {}
--[=[
Authorship: Ben Wing <benwing2>
]=]
--[=[
TERMINOLOGY:
-- "slot" = A particular combination of tense/mood/person/number/etc.
Example slot names for verbs are "pres_1s" (present first singular) and
"subc_subii_3p" (subordinate-clause subjunctive II third plural).
Each slot is filled with zero or more forms.
-- "form" = The conjugated German form representing the value of a given slot.
-- "lemma" = The dictionary form of a given German term. For German, always the infinitive.
]=]
--[=[
FIXME:
1. Handle fensterln. (DONE)
2. Handle spie- past tense of speien. (DONE)
3. Make sure rathen, verheirathen work. (DONE)
4. Modify einfix to better handle managen, framen. (DONE)
5. Use variant codes so variant imperatives with and without -e match up in conjoined verbs e.g. [[ausschneiden und einfügen]].
6. In conjoined verbs e.g. [[ausschneiden und einfügen]], don't repeat auxiliaries.
--]=]
local lang = require("Module:languages").getByCode("de")
local m_string_utilities = require("Module:string utilities")
local m_links = require("Module:links")
local m_table = require("Module:table")
local iut = require("Module:inflection utilities")
local rfind = mw.ustring.find
local rmatch = mw.ustring.match
local rsplit = mw.text.split
local function link_term(term, face)
return m_links.full_link({ lang = lang, term = term }, face)
end
local vowel = "aeiouyäëïöüÿáéíóúýàèìòùỳâêîôûŷãẽĩõũỹ"
local vowel_c = "[" .. vowel .. "]"
local not_vowel_c = "[^" .. vowel .. "]"
local function ends_in_dt(stem)
return stem:find("[dt]h?$")
end
local inseparable_prefixes = {
"be", "emp", "ent", "er", "ge", "miss", "miß", "ver", "zer",
-- can also be separable
"durch", "hinter", "über", "um", "unter", "voll", "wider", "wieder",
}
local wuerde = link_term("würde", "term")
local past_subjunctive_single_word_preferred = m_table.listToSet {
"haben", "sein", "können", "müssen", "dürfen", "mögen", "sollen", "wollen", "werden"
}
local past_subjunctive_single_word_preferred_footnote = "[แนะนำให้ใช้, เลี่ยงรูปประกอบ " .. wuerde .. "]"
local past_subjunctive_single_word_often_used = m_table.listToSet {
"bleiben", "brauchen", "bringen", "fallen", "finden", "geben", "gehen", "halten", "heißen", "heissen",
"kommen", "laufen", "lassen", "liegen", "nehmen", "sehen", "stehen", "tun", "thun", "wissen"
}
local past_subjunctive_single_word_often_used_footnote = "[พบได้ทั้งรูปนี้และรูปประกอบ " .. wuerde .. "]"
local past_subjunctive_single_word_rare_footnote = "[พบได้น้อยมากยกเว้นในบริบทที่เป็นทางการมาก, แนะนำให้ใช้รูปประกอบ " .. wuerde .. "]"
local schst_footnote = "[ใช้ได้ในลักษณะเป็นทางการในออสเตรีย, ใช้ในภาษาปากในทุกพื้นที่ที่พูดภาษาเยอรมัน]"
local all_persons_numbers = {
["1s"] = "1|s",
["2s"] = "2|s",
["3s"] = "3|s",
["1p"] = "1|p",
["2p"] = "2|p",
["3p"] = "3|p",
}
local person_number_list = { "1s", "2s", "3s", "1p", "2p", "3p", }
local persnum_to_index = {}
for k, v in pairs(person_number_list) do
persnum_to_index[v] = k
end
local imp_person_number_list = { "2s", "2p", }
local verb_slots_basic = {
{"infinitive", "inf"},
{"infinitive_linked", "inf"},
{"pres_part", "pres|part"},
{"perf_part", "perf|part"},
{"zu_infinitive", "zu"}, -- will be handled specially by [[Module:accel/de]]
{"aux", "-"},
}
local verb_slots_subordinate_clause = {
}
local verb_slots_composed = {
}
-- Add entries for a slot with person/number variants.
-- `verb_slots` is the table to add to.
-- `slot_prefix` is the prefix of the slot, typically specifying the tense/aspect.
-- `tag_suffix` is the set of inflection tags to add after the person/number tags,
-- or "-" to use "-" as the inflection tags (which indicates that no accelerator entry
-- should be generated).
local function add_slot_personal(verb_slots, slot_prefix, tag_suffix)
for persnum, persnum_tag in pairs(all_persons_numbers) do
local slot = slot_prefix .. "_" .. persnum
if tag_suffix == "-" then
table.insert(verb_slots, {slot, "-"})
else
table.insert(verb_slots, {slot, persnum_tag .. "|" .. tag_suffix})
end
end
end
add_slot_personal(verb_slots_basic, "pres", "pres")
add_slot_personal(verb_slots_basic, "subi", "sub|I")
add_slot_personal(verb_slots_basic, "pret", "pret")
add_slot_personal(verb_slots_basic, "subii", "sub|II")
table.insert(verb_slots_basic, {"imp_2s", "s|imp"})
table.insert(verb_slots_basic, {"imp_2p", "p|imp"})
add_slot_personal(verb_slots_subordinate_clause, "subc_pres", "dep|pres")
add_slot_personal(verb_slots_subordinate_clause, "subc_subi", "dep|sub|I")
add_slot_personal(verb_slots_subordinate_clause, "subc_pret", "dep|pret")
add_slot_personal(verb_slots_subordinate_clause, "subc_subii", "dep|sub|II")
add_slot_personal(verb_slots_composed, "perf_ind", "-")
add_slot_personal(verb_slots_composed, "perf_sub", "-")
add_slot_personal(verb_slots_composed, "plup_ind", "-")
add_slot_personal(verb_slots_composed, "plup_sub", "-")
table.insert(verb_slots_composed, {"futi_inf", "-"})
add_slot_personal(verb_slots_composed, "futi_subi", "-")
add_slot_personal(verb_slots_composed, "futi_ind", "-")
add_slot_personal(verb_slots_composed, "futi_subii", "-")
table.insert(verb_slots_composed, {"futii_inf", "-"})
add_slot_personal(verb_slots_composed, "futii_subi", "-")
add_slot_personal(verb_slots_composed, "futii_ind", "-")
add_slot_personal(verb_slots_composed, "futii_subii", "-")
local all_verb_slots = {}
for _, slot_and_accel in ipairs(verb_slots_basic) do
table.insert(all_verb_slots, slot_and_accel)
end
for _, slot_and_accel in ipairs(verb_slots_subordinate_clause) do
table.insert(all_verb_slots, slot_and_accel)
end
for _, slot_and_accel in ipairs(verb_slots_composed) do
table.insert(all_verb_slots, slot_and_accel)
end
local pronouns = { "ich", "du", "er", "wir", "ihr", "sie", }
irreg_verbs = {
["haben"] = {
["pres"] = { "habe", "hast", "hat", "haben", "habt", "haben", },
["pret"] = { "hatte", "hattest", "hatte", "hatten", "hattet", "hatten", },
["subi"] = { "habe", "habest", "habe", "haben", "habet", "haben", },
["subii"] = { "hätte", "hättest", "hätte", "hätten", "hättet", "hätten", },
["imp"] = { {"hab", "habe"}, "habt", },
["presp"] = "habend",
["pp"] = "habt",
},
["sein"] = {
["pres"] = { "bin", "bist", "ist", "sind", "seid", "sind", },
["pret"] = { "war", "warst", "war", "waren", "wart", "waren", },
["subi"] = { "sei", {"seist", "seiest"}, "sei", "seien", "seiet", "seien", },
["subii"] = { "wäre", {"wärst", "wärest"}, "wäre", "wären", {"wärt", "wäret"}, "wären", },
["imp"] = { "sei", "seid", },
["presp"] = "seiend",
["pp"] = "wesen",
},
["tun"] = {
["pres"] = { "tue", "tust", "tut", "tun", "tut", "tun", },
["pret"] = { "tat", {"tatest", "tatst"}, "tat", "taten", "tatet", "taten", },
["subi"] = { "tue", "tuest", "tue", "tuen", "tuet", "tuen", },
["subii"] = { "täte", "tätest", "täte", "täten", "tätet", "täten", },
["imp"] = { {"tu", "tue"}, "tut", },
["presp"] = "tuend",
["pp"] = "tan",
},
-- FIXME, maybe we should construct this automatically from "tun".
["thun"] = {
["pres"] = { "thue", "thust", "thut", "thun", "thut", "thun", },
["pret"] = { "that", {"thatest", "thatst"}, "that", "thaten", "thatet", "thaten", },
["subi"] = { "thue", "thuest", "thue", "thuen", "thuet", "thuen", },
["subii"] = { "thäte", "thätest", "thäte", "thäten", "thätet", "thäten", },
["imp"] = { {"thu", "thue"}, "thut", },
["presp"] = "thuend",
["pp"] = "than",
},
["werden"] = {
["pres"] = { "werde", "wirst", "wird", "werden", "werdet", "werden", },
["pret"] = {
{"wurde", {form = "ward", footnotes = {"[โบราณ]"}}},
{"wurdest", {form = "wardst", footnotes = {"[โบราณ]"}}},
{"wurde", {form = "ward", footnotes = {"[โบราณ]"}}},
"wurden",
"wurdet",
"wurden",
},
["subi"] = { "werde", "werdest", "werde", "werden", "werdet", "werden", },
["subii"] = { "würde", "würdest", "würde", "würden", "würdet", "würden", },
["imp"] = { {"werd", "werde"}, "werdet", },
["presp"] = "werdend",
["pp"] = "worden",
},
}
local sein_forms = {
["sein"] = {"mein", "dein", "sein", "unser", "euer", "ihr"},
["seine"] = {"meine", "deine", "seine", "unsere", "eure", "ihre"},
["seinen"] = {"meinen", "deinen", "seinen", "unseren", "euren", "ihren"},
["seinem"] = {"meinem", "deinem", "seinem", "unserem", "eurem", "ihrem"},
["seiner"] = {"meiner", "deiner", "seiner", "unserer", "eurer", "ihrer"},
["seines"] = {"meines", "deines", "seines", "unseses", "eures", "ihres"},
}
local sich_forms = {
["accpron"] = {"mich", "dich", "sich", "uns", "euch", "sich"},
["datpron"] = {"mir", "dir", "sich", "uns", "euch", "sich"},
}
local function skip_slot(base, slot)
if not slot:find("[123]") then
-- Don't skip non-personal slots.
return false
end
if base.nofinite then
return true
end
if base.nosplitprefix then
-- Verbs that don't allow split prefixes, e.g. [[voreinstellen]], don't have forms where the prefix is
-- split from the main verb, including the present, preterite, subjunctive I and II and imperative (but
-- not the subordinate clause equivalents).
return slot:find("^pre[st]") or slot:find("^subi") or slot:find("^imp_")
end
if base.only3s and not slot:find("3s") or
base.only3sp and not slot:find("3[sp]") then
return true
end
return false
end
local function strip_spaces(text)
return text:gsub("^%s*(.-)%s*", "%1")
end
local function escape_sein_sich_indicators(arg1)
if not arg1:find("pron>") then
return arg1
end
local segments = iut.parse_balanced_segment_run(arg1, "<", ">")
-- Loop over every other segment. The even-numbered segments are angle-bracket specs while
-- the odd-numbered segments are the text between them.
for i = 2, #segments - 1, 2 do
if segments[i] == "<accpron>" then
segments[i] = "⦃⦃accpron⦄⦄"
elseif segments[i] == "<datpron>" then
segments[i] = "⦃⦃datpron⦄⦄"
elseif segments[i] == "<pron>" then
segments[i] = "⦃⦃pron⦄⦄"
end
end
return table.concat(segments)
end
local function undo_escape_form(form)
-- assign to var to throw away second value
local newform = form:gsub("⦃⦃", "<"):gsub("⦄⦄", ">")
return newform
end
local function remove_sein_sich_indicators(form)
-- assign to var to throw away second value
local newform = form:gsub("⦃⦃.-⦄⦄", "")
return newform
end
local function replace_sein_sich_indicators(slot, form)
if not form:find("⦃") then
return form
end
local persnum = slot:match("^.*_([123][sp])$")
local index
if persnum then
index = persnum_to_index[persnum]
else
index = 3
end
form = form:gsub("sich(%]*)⦃⦃accpron⦄⦄", function(brackets)
return sich_forms.accpron[index] .. brackets
end)
form = form:gsub("sich(%]*)⦃⦃datpron⦄⦄", function(brackets)
return sich_forms.datpron[index] .. brackets
end)
form = form:gsub("(seine?[mnrs]?)(%]*)⦃⦃pron⦄⦄", function(sein_form, brackets)
if sein_forms[sein_form] then
return sein_forms[sein_form][index] .. brackets
else
error("Unrecognized sein-form '" .. sein_form .. "' in slot " .. slot .. ": " .. undo_escape_form(form))
end
end)
form = form:gsub("sein%]%](e?[mnrs]?)⦃⦃pron⦄⦄", function(sein_ending, brackets)
local sein_form = "sein" .. sein_ending
if sein_forms[sein_form] then
return sein_forms["sein"][index] .. "|" .. sein_forms[sein_form][index] .. "]]"
else
error("Unrecognized sein-form '" .. sein_form .. "' in slot " .. slot .. ": " .. undo_escape_form(form))
end
end)
if form:find("⦃⦃") or form:find("⦄⦄") then
error("Unrecognized pronoun substitution in slot " .. slot .. ": " .. undo_escape_form(form))
end
return form
end
local function combine_stem_ending(slot, stem, ending)
local ending_with_pound = ending .. "#"
if ending_with_pound:find("^st[ #]") then
if rfind(stem, "[sxzß]$") then
ending = ending:gsub("^s", "")
elseif stem:find("st$") then
-- bersten
ending = ending:gsub("^st", "")
end
elseif ending_with_pound:find("^t[ #]") and stem:find("th?$") then
ending = ending:gsub("^t", "")
end
return replace_sein_sich_indicators(slot, stem .. ending)
end
local function add(base, slot, stems, endings, footnotes)
if skip_slot(base, slot) then
return
end
local function do_combine_stem_ending(stem, ending)
return combine_stem_ending(slot, stem, ending)
end
iut.add_forms(base.forms, slot, stems, endings, do_combine_stem_ending, nil, nil,
iut.combine_footnotes(footnotes, base.all_footnotes))
end
local function add_multi(base, slot, stems_and_endings, footnotes)
if skip_slot(base, slot) then
return
end
local function do_combine_stem_ending(stem, ending)
return combine_stem_ending(slot, stem, ending)
end
iut.add_multiple_forms(base.forms, slot, stems_and_endings, do_combine_stem_ending, nil, nil,
iut.combine_footnotes(footnotes, base.all_footnotes))
end
local function add3(base, slot, stems1, stems2, endings, footnotes)
return add_multi(base, slot, {stems1, stems2, endings})
end
local function add4(base, slot, stems1, stems2, stems3, endings, footnotes)
return add_multi(base, slot, {stems1, stems2, stems3, endings})
end
local function add5(base, slot, stems1, stems2, stems3, stems4, endings, footnotes)
return add_multi(base, slot, {stems1, stems2, stems3, stems4, endings})
end
local function get_subii_note(base)
if base.from_headword then
-- don't include autogenerated note if from_headword, so it doesn't end up in the headword qualifiers
return nil
end
if past_subjunctive_single_word_preferred[base.base_verb] then
return {past_subjunctive_single_word_preferred_footnote}
elseif past_subjunctive_single_word_often_used[base.base_verb] then
return {past_subjunctive_single_word_often_used_footnote}
end
return {past_subjunctive_single_word_rare_footnote}
end
local function add_zu_infinitive(base)
if base.any_pre_pref then
local zu
if base.pre_pref == "" or base.pre_pref:find(" $") then
zu = "zu "
else
zu = "zu"
end
add(base, "zu_infinitive", base.pre_pref .. zu, base.bare_infinitive)
end
end
local function add_present(base, pretpres)
local stems = base.infstem
local stems23 = base.pres_23 or stems
local function doadd(slot_pref, form_pref)
-- Do forms based off the infinitive stem.
for _, stemform in ipairs(stems) do
local prefixed_stem = form_pref .. stemform.form
local syncopated_stem = base.unstressed_el_er and prefixed_stem:gsub("e([lr])$", "%1")
local function addit(slot, stem, ending, footnotes)
add(base, slot_pref .. slot, stem, ending .. (slot_pref == "" and base.post_pref or ""),
iut.combine_footnotes(footnotes, stemform.footnotes))
end
-- first singular present indicative
if not pretpres then -- pres_1s for preterite-present verbs used pres23 stem
if base.unstressed_el_er then
addit("pres_1s", syncopated_stem, "e")
addit("pres_1s", prefixed_stem, "e")
addit("pres_1s", prefixed_stem, "")
else
addit("pres_1s", prefixed_stem, "e")
end
end
-- plural present indicative
local e_in_2p = ends_in_dt(prefixed_stem) or base.unstressed_e_infix
if e_in_2p then
addit("pres_2p", prefixed_stem, "et")
else
addit("pres_2p", prefixed_stem, "t")
end
if base.unstressed_el_er or base.unstressed_erl then
addit("pres_1p", prefixed_stem, "n")
addit("pres_3p", prefixed_stem, "n")
else
addit("pres_1p", prefixed_stem, "en")
addit("pres_3p", prefixed_stem, "en")
end
-- subjunctive I
addit("subi_1s", prefixed_stem, "e")
addit("subi_2s", prefixed_stem, "est")
addit("subi_3s", prefixed_stem, "e")
addit("subi_2p", prefixed_stem, "et")
if base.unstressed_el_er then
addit("subi_1s", syncopated_stem, "e")
addit("subi_2s", syncopated_stem, "est")
addit("subi_3s", syncopated_stem, "e")
addit("subi_2p", syncopated_stem, "et")
end
if base.unstressed_el_er then
addit("subi_1p", prefixed_stem, "n")
addit("subi_3p", prefixed_stem, "n")
else
addit("subi_1p", prefixed_stem, "en")
addit("subi_3p", prefixed_stem, "en")
end
-- imperative plural; most preterite-present verbs don't have it, and [[wissen]] is handled below
if slot_pref == "" and not pretpres then
if e_in_2p then
addit("imp_2p", prefixed_stem, "et")
else
addit("imp_2p", prefixed_stem, "t")
end
end
end
-- Do forms based off of pres23 stem (also includes pres_1sg in preterite-present verbs).
for _, stem23form in ipairs(stems23) do
local prefixed_stem23 = form_pref .. stem23form.form
local function addit(slot, stem, ending, footnotes)
add(base, slot_pref .. slot, stem, ending .. (slot_pref == "" and base.post_pref or ""),
iut.combine_footnotes(footnotes, stem23form.footnotes))
end
if pretpres then
-- Totally different code for preterite-present singular and imperative.
addit("pres_1s", prefixed_stem23, "")
addit("pres_2s", prefixed_stem23, "st")
addit("pres_3s", prefixed_stem23, "")
if slot_pref == "" and base.base_verb == "wissen" then
-- Only [[wissen]] among the preterite-present verbs has an imperative.
addit("imp_2s", "wiss", "e")
-- dewikt mentions 'wisset' as an alternative, but not in Duden
addit("imp_2p", "wiss", "t")
end
else
-- Normal code path.
local stem23_is_same_as_stem
for _, stemform in ipairs(stems) do
if stemform.form == stem23form.form then
stem23_is_same_as_stem = true
break
end
end
-- present 2/3 singular
local e_in_23s = base.unstressed_e_infix or stem23_is_same_as_stem and ends_in_dt(prefixed_stem23)
if e_in_23s then
addit("pres_2s", prefixed_stem23, "est")
addit("pres_3s", prefixed_stem23, "et")
else
addit("pres_2s", prefixed_stem23, "st")
if prefixed_stem23:find("sch$") then
addit("pres_2s", prefixed_stem23, "t",
not base.from_headword and {schst_footnote} or nil)
end
addit("pres_3s", prefixed_stem23, "t")
end
-- imperative singular; this may or may not be based off the pres23 stem
-- Specifically, if the pres23 stem is different from the infinitive stem and does not have an ä or ö
-- in it ([[fahren]], er [[fährt]] but imperative [[fahr]]/[[fahre]]; [[stoßen]], er [[stößt]] but
-- imperative [[stoß]]/[[stoße]]), use it. Don't add -e unless '.longimp' is given (for [[sehen]], with
-- imperatives [[sieh]] and [[siehe]]; but normally [[geben]] with imperative only [[gib]], similarly
-- for [[treten]], [[gelten]], [[bergen]], [[etc.]]). In all other cases, use the infinitive stem, and
-- under normal circumstances include two variants, without -e and with -e. We include only the variant
-- with -e if '.e' is given ([[atmen]], [[zeichnen]], etc.), and we include only the variant without -e
-- if '.shortimp' is given (unclear if this is needed for any verb).
if slot_pref == "" then
if not rfind(prefixed_stem23, "[äö]") and not stem23_is_same_as_stem then
addit("imp_2s", prefixed_stem23, "")
if base.longimp then
addit("imp_2s", prefixed_stem23, "e")
end
else
assert(form_pref == "")
for _, stemform in ipairs(stems) do
local function addimp(stem, ending)
add(base, "imp_2s", stem, ending .. base.post_pref, stemform.footnotes)
end
local stem = stemform.form
if base.unstressed_el_er then
local syncopated_stem = stem:gsub("e([lr])$", "%1")
addimp(syncopated_stem, "e")
end
if base.unstressed_e_infix then
addimp(stem, "e")
elseif base.shortimp then
addimp(stem, "")
else
addimp(stem, "")
addimp(stem, "e")
end
end
end
end
end
end
end
-- Do the basic forms
doadd("", "")
-- Also do the subordinate clause forms if any alternants have a prefix.
if base.any_pre_pref then
doadd("subc_", base.pre_pref)
end
-- Do the miscellaneous non-finite forms
add3(base, "pres_part", base.pre_pref, base.bare_infinitive, "d")
add_zu_infinitive(base)
end
-- Add the past forms and/or subjunctive II forms. `is_past` should be true if we're conjugating the past tense
-- (not the past subjunctive), in which case the stems in `stem` should be the actual 1s/3s forms, ending in -te
-- or -de if weak. If `is_past` is false, we're conjugating the past subjunctive. In that case, the stems passed
-- in should include -e if that needs to be preserved in all forms (specifically, for [[spie]] past of [[speien]];
-- syncopated #'spist' is not allowed). (In practice, we chop off the final -e of explicitly user-specified past
-- subjunctive forms and otherwise pass in the actual past tense. This means that user-specified past subjunctives
-- in -te (e.g. [[brächte]]) will be passed in as 'brächt' but past subjunctives defaulted from the past tense
-- will be passed in e.g. as 'lachte'. This works because for stems in -t and -d, the result is the same.)
local function add_past_or_subii(base, slot_pref, stems, is_past)
local function doadd(full_slot_pref, form_pref)
for _, stemform in ipairs(stems) do
local prefixed_stem = form_pref .. stemform.form
local ends_in_e = prefixed_stem:find("e$")
-- Normally, the weak past tense ends in -te and the strong past does not end in -e. An exception is
-- [[spie]] (past tense of [[speien]]), which will be treated as weak (superseded spellings like
-- 'spieen' will not be generated).
local is_strong = is_past and not ends_in_e
prefixed_stem = prefixed_stem:gsub("e$", "")
local stem_ends_in_dt = ends_in_dt(prefixed_stem)
local function addit(slot, ending, footnotes)
local subii_footnotes
if full_slot_pref:find("subii") then
subii_footnotes = get_subii_note(base)
end
add(base, full_slot_pref .. slot, prefixed_stem, ending .. (full_slot_pref == slot_pref and base.post_pref or ""),
iut.combine_footnotes(subii_footnotes, iut.combine_footnotes(footnotes, stemform.footnotes)))
end
if is_strong then
addit("1s", "")
addit("3s", "")
if not stem_ends_in_dt then
if rfind(prefixed_stem, "[sxzß]$") then
addit("2s", "est")
end
addit("2s", "st")
addit("2p", "t")
else
-- bitten -> batest or batst, similarly for laden, raten, etc.
addit("2s", "est")
if not prefixed_stem:find("st$") then
-- bersten
addit("2s", "st")
end
addit("2p", "et")
end
else
-- Weak past and past subjunctive have same endings when ending in -d or -t (always the case for weak past).
addit("1s", "e")
addit("3s", "e")
if not stem_ends_in_dt and not ends_in_e then
addit("2s", "est") -- more formal; FIXME: should we footnote this?
addit("2p", "et") -- more formal; FIXME: should we footnote this?
addit("2s", "st")
addit("2p", "t")
else
addit("2s", "est")
addit("2p", "et")
end
end
-- Both pasts, as well as past subjunctive, have same endings in 1p and 3p.
addit("1p", "en")
addit("3p", "en")
end
end
-- Do the basic forms
doadd(slot_pref, "")
-- Also do the subordinate clause forms if any alternants have a prefix.
if base.any_pre_pref then
doadd("subc_" .. slot_pref, base.pre_pref)
end
end
local conjs = {}
local conjprops = {}
conjs["normal"] = function(base)
add_present(base)
add_past_or_subii(base, "pret_", base.past, "past")
add_past_or_subii(base, "subii_", base.past_sub or base.past)
end
conjs["pretpres"] = function(base)
add_present(base, "pretpres")
add_past_or_subii(base, "pret_", base.past, "past")
add_past_or_subii(base, "subii_", base.past_sub or base.past)
end
conjs["irreg"] = function(base)
local function doadd(slot_pref)
local function addit(slot, forms, footnotes)
if slot_pref == "" then
add3(base, slot, base.insep_prefix, forms, base.post_pref, footnotes)
else
add(base, slot_pref .. slot, base.pre_pref .. base.insep_prefix, forms, footnotes)
end
end
-- Do present, preterite, subjunctive I and II.
for _, slot_tense in ipairs({"pres", "pret", "subi", "subii"}) do
for index, forms in ipairs(base.irregverbobj[slot_tense]) do
local persnum = person_number_list[index]
local footnotes
if slot_tense == "subii" then
footnotes = get_subii_note(base)
end
addit(slot_tense .. "_" .. persnum, forms, footnotes)
end
end
-- Do imperative.
if slot_pref == "" then
for index, forms in ipairs(base.irregverbobj["imp"]) do
local persnum = imp_person_number_list[index]
addit("imp_" .. persnum, forms)
end
end
end
-- Do the basic forms
doadd("")
-- Also do the subordinate clause forms if any alternants have a prefix.
if base.any_pre_pref then
doadd("subc_")
end
-- Do the miscellaneous non-finite forms
iut.add_multiple_forms(base, "pp", {base.ge_prefix, base.insep_prefix, base.irregverbobj["pp"]},
-- We don't want to use combine_stem_ending because we want sein-sich indicators to be left alone,
-- so they get replaced later when constructing composed forms.
function(stem, ending) return stem .. ending end)
add(base, "perf_part", base.pre_pref, base.pp)
-- only [[werden]] by itself; not [[loswerden]], [[fertigwerden]], etc.
if base.lemma == "werden" then
iut.insert_form(base.forms, "perf_part", {form = "worden", footnotes = {"[เมื่อเป็นคำกริยานุเคราะห์]"}})
end
add(base, "pres_part", base.pre_pref .. base.insep_prefix, base.irregverbobj["presp"])
add_zu_infinitive(base)
end
local function add_composed_forms(base)
local forms = base.forms
local function add_composed(tense_mood, index, persnum, auxforms, participle, suffix, footnotes)
local pers_auxforms = iut.convert_to_general_list_form(auxforms[index])
local linked_pers_auxforms = iut.map_forms(pers_auxforms, function(form) return "[[" .. form .. "]] " end)
add4(base, tense_mood .. "_" .. persnum, linked_pers_auxforms, "[[" .. base.pre_pref, participle, "]]" .. suffix, footnotes)
end
local function add_composed_perf(tense_mood, index, persnum, haben_auxforms, sein_auxforms, haben_suffix, sein_suffix)
for _, auxform in ipairs(base.aux) do
if auxform.form == "haben" then
add_composed(tense_mood, index, persnum, haben_auxforms, base.pp, haben_suffix, auxform.footnotes)
end
if auxform.form == "sein" then
add_composed(tense_mood, index, persnum, sein_auxforms, base.pp, sein_suffix, auxform.footnotes)
end
end
end
local haben_forms = irreg_verbs["haben"]
local sein_forms = irreg_verbs["sein"]
local werden_forms = irreg_verbs["werden"]
for index, persnum in ipairs(person_number_list) do
add_composed_perf("perf_ind", index, persnum, haben_forms["pres"], sein_forms["pres"], "", "")
add_composed_perf("perf_sub", index, persnum, haben_forms["subi"], sein_forms["subi"], "", "")
add_composed_perf("plup_ind", index, persnum, haben_forms["pret"], sein_forms["pret"], "", "")
add_composed_perf("plup_sub", index, persnum, haben_forms["subii"], sein_forms["subii"], "", "")
for _, mood in ipairs({"ind", "subi", "subii"}) do
local tense = mood == "ind" and "pres" or mood
add_composed("futi_" .. mood, index, persnum, werden_forms[tense], base.bare_infinitive, "")
add_composed_perf("futii_" .. mood, index, persnum, werden_forms[tense], werden_forms[tense], " [[haben]]", " [[sein]]")
end
end
add3(base, "futi_inf", "[[" .. base.pre_pref, base.bare_infinitive, "]] [[werden]]")
add5(base, "futii_inf", "[[" .. base.pre_pref, base.pp, "]] [[", base.aux, "]] [[werden]]")
end
local function handle_derived_slots(base)
-- Compute linked versions of potential lemma slots, for use in {{de-verb}}.
-- We substitute the original lemma (before removing links) for forms that
-- are the same as the lemma, if the original lemma has links.
for _, slot in ipairs({"infinitive"}) do
iut.insert_forms(base.forms, slot .. "_linked", iut.map_forms(base.forms[slot], function(form)
if form == base.lemma and rfind(base.linked_lemma, "%[%[") then
return base.linked_lemma
else
return form
end
end))
end
end
local function conjugate_verb(base)
if not conjs[base.conj] then
error("Internal error: Unrecognized conjugation type '" .. base.conj .. "'")
end
conjs[base.conj](base)
add_composed_forms(base)
-- No overrides implemented currently.
-- process_slot_overrides(base)
handle_derived_slots(base)
end
local function parse_indicator_spec(angle_bracket_spec)
local base = {}
local function parse_err(msg)
error(msg .. ": " .. angle_bracket_spec)
end
local function fetch_footnotes(separated_group)
local footnotes
for j = 2, #separated_group - 1, 2 do
if separated_group[j + 1] ~= "" then
parse_err("Extraneous text after bracketed footnotes: '" .. table.concat(separated_group) .. "'")
end
if not footnotes then
footnotes = {}
end
table.insert(footnotes, separated_group[j])
end
return footnotes
end
local function fetch_specs(comma_separated_group, transform_form)
if not comma_separated_group then
return {{}}
end
local specs = {}
local colon_separated_groups = iut.split_alternating_runs(comma_separated_group, ":")
for _, colon_separated_group in ipairs(colon_separated_groups) do
local form = colon_separated_group[1]
if transform_form then
form = transform_form(form)
end
table.insert(specs, {form = form, footnotes = fetch_footnotes(colon_separated_group)})
end
return specs
end
local inside = angle_bracket_spec:match("^<(.*)>$")
assert(inside)
if inside == "" then
return base
end
local segments = iut.parse_balanced_segment_run(inside, "[", "]")
local dot_separated_groups = iut.split_alternating_runs(segments, "%.")
for i, dot_separated_group in ipairs(dot_separated_groups) do
local comma_separated_groups = iut.split_alternating_runs(dot_separated_group, "%s*[,#]%s*", "preserve splitchar")
local first_element = comma_separated_groups[1][1]
if first_element == "haben" or first_element == "sein" then
for j = 1, #comma_separated_groups, 2 do
if j > 1 and strip_spaces(comma_separated_groups[j - 1][1]) ~= "," then
parse_err("Separator of # not allowed with haben or sein")
end
local aux = comma_separated_groups[j][1]
if aux ~= "haben" and aux ~= "sein" then
parse_err("Unrecognized auxiliary '" .. aux .. "'")
end
if base.aux then
for _, existing_aux in ipairs(base.aux) do
if existing_aux.form == aux then
parse_err("Auxiliary '" .. aux .. "' specified twice")
end
end
else
base.aux = {}
end
table.insert(base.aux, {form = aux, footnotes = fetch_footnotes(comma_separated_groups[j])})
end
elseif first_element == "-ge" or first_element == "+ge" then
for j = 1, #comma_separated_groups, 2 do
if j > 1 and strip_spaces(comma_separated_groups[j - 1][1]) ~= "," then
parse_err("Separator of # not allowed with +ge or -ge")
end
local prefix = comma_separated_groups[j][1]
if prefix ~= "+ge" and prefix ~= "-ge" then
parse_err("Unrecognized ge- prefix '" .. prefix .. "'")
end
local ge_prefix
if prefix == "+ge" then
ge_prefix = "ge"
else
ge_prefix = ""
end
if base.ge_prefix then
for _, existing_prefix in ipairs(base.ge_prefix) do
if existing_prefix.form == ge_prefix then
parse_err("Ge- prefix '" .. prefix .. "' specified twice")
end
end
else
base.ge_prefix = {}
end
table.insert(base.ge_prefix, {form = ge_prefix, footnotes = fetch_footnotes(comma_separated_groups[j])})
end
elseif #comma_separated_groups > 1 then
-- principal parts specified
if base.past then
parse_err("Can't specify principal parts twice")
end
local parts = {}
assert(#comma_separated_groups[2] == 1)
local past_index
local first_separator = strip_spaces(comma_separated_groups[2][1])
if first_separator == "#" then
-- present 3rd singular specified
base.pres_23 = fetch_specs(comma_separated_groups[1], function(form)
local stem
if base.conj == "pretpres" then
stem = form
else
stem = form:match("^(.-)%-$")
if not stem then
stem = form:match("^(.-)e?t$")
end
end
if stem then
return stem
else
parse_err("Present 3sg form '" .. form .. "' should end in - (for the stem) or -t")
end
end)
past_index = 3
else
past_index = 1
end
base.past = fetch_specs(comma_separated_groups[past_index], function(form)
return form
end)
if #comma_separated_groups < past_index + 2 then
parse_err("Missing past participle spec")
end
assert(#comma_separated_groups[past_index + 1] == 1)
if strip_spaces(comma_separated_groups[past_index + 1][1]) ~= "," then
parse_err("Only first separator can be a #")
end
base.pp = fetch_specs(comma_separated_groups[past_index + 2], function(form)
if form:find("e[nd]$") or form:find("t$") then
return form
else
parse_err("Past participle '" .. form .. "' should end in -en, -t, or -ed")
end
end)
if #comma_separated_groups > past_index + 2 then
assert(#comma_separated_groups[past_index + 3] == 1)
if strip_spaces(comma_separated_groups[past_index + 3][1]) ~= "," then
parse_err("Only first separator can be a #")
end
base.past_sub = fetch_specs(comma_separated_groups[past_index + 4], function(form)
local stem = form:match("^(.-)e$")
if not stem then
parse_err("Past subjunctive '" .. form .. "' should end in -e")
end
return stem
end)
if #comma_separated_groups > past_index + 4 then
parse_err("Too many specs given")
end
end
elseif first_element == "pretpres" or first_element == "irreg" then
if #comma_separated_groups[1] > 1 then
parse_err("No footnotes allowed with '" .. first_element .. "' spec")
end
if base.conj then
parse_err("Conjugation specified as '" .. first_element .. "' but already specified or autodetermined as '" .. base.conj .. "'")
end
base.conj = first_element
elseif first_element == "einfix" or first_element == "-einfix" then
if #comma_separated_groups[1] > 1 then
parse_err("No footnotes allowed with '" .. first_element .. "' spec")
end
base.unstressed_e_infix = first_element == "einfix"
elseif first_element == "shortimp" or first_element == "longimp" or
first_element == "only3s" or first_element == "only3sp" or
first_element == "nofinite" or first_element == "nosplitprefix" then
if #comma_separated_groups[1] > 1 then
parse_err("No footnotes allowed with '" .. first_element .. "' spec")
end
base[first_element] = true
elseif first_element == "" or first_element == "inf" then
local footnotes = fetch_footnotes(comma_separated_groups[1])
if not footnotes then
parse_err("Empty spec and 'inf' spec without footnotes not allowed")
end
if first_element == "inf" then
base.infstem_footnotes = footnotes
else
base.all_footnotes = footnotes
end
else
parse_err("Unrecognized spec '" .. comma_separated_groups[1][1] .. "'")
end
end
return base
end
-- Normalize all lemmas, splitting off separable prefixes and substituting the pagename for blank lemmas.
local function normalize_all_lemmas(alternant_multiword_spec, from_headword)
local any_pre_pref
iut.map_word_specs(alternant_multiword_spec, function(base)
if base.lemma == "" then
local PAGENAME = mw.title.getCurrentTitle().text
base.lemma = PAGENAME
end
if base.lemma:find("_") and not base.lemma:find("%[%[") then
-- If lemma is multiword and has no links, add links automatically.
base.lemma= "[[" .. base.lemma:gsub("_", "]]_[[") .. "]]"
end
base.orig_lemma = base.lemma
base.orig_lemma_no_links = m_links.remove_links(base.lemma)
-- Normalize the linked lemma by removing dot, underscore, and <pron> and such indicators.
base.linked_lemma = remove_sein_sich_indicators(base.lemma:gsub("%.", ""):gsub("_", " "))
base.lemma = m_links.remove_links(base.linked_lemma)
local lemma = base.orig_lemma_no_links
base.pre_pref, base.post_pref = "", ""
local prefix, verb = lemma:match("^(.*)_(.-)$")
if prefix then
prefix = prefix:gsub("_", " ") -- in case of multiple preceding words
base.pre_pref = base.pre_pref .. prefix .. " "
base.post_pref = base.post_pref .. " " .. prefix
else
verb = lemma
end
prefix, base.base_verb = verb:match("^(.*)%.(.-)$")
if prefix then
-- There may be multiple separable prefixes (e.g. [[wiedergutmachen]], ich mache wieder gut)
base.pre_pref = base.pre_pref .. prefix:gsub("%.", "")
base.post_pref = base.post_pref .. " " .. prefix:gsub("%.", " ")
else
base.base_verb = verb
end
if base.pre_pref ~= "" then
any_pre_pref = true
end
if base.only3s then
alternant_multiword_spec.only3s = true
end
if base.only3sp then
alternant_multiword_spec.only3sp = true
end
-- Remove <pron> indicators and such.
local reconstructed_lemma = remove_sein_sich_indicators(base.pre_pref .. base.base_verb)
if reconstructed_lemma ~= base.lemma then
error("Internal error: Raw lemma '" .. base.lemma .. "' differs from reconstructed lemma '" .. reconstructed_lemma .. "'")
end
base.from_headword = from_headword
end)
if any_pre_pref then
iut.map_word_specs(alternant_multiword_spec, function(base)
base.any_pre_pref = true
end)
end
if alternant_multiword_spec.only3s then
iut.map_word_specs(alternant_multiword_spec, function(base)
if not base.only3s then
error("If some alternants specify 'only3s', all must")
end
end)
end
if alternant_multiword_spec.only3sp then
iut.map_word_specs(alternant_multiword_spec, function(base)
if not base.only3sp then
error("If some alternants specify 'only3sp', all must")
end
end)
end
end
local function detect_verb_type(base, verb_types)
local this_verb_types = {}
local function set_verb_type()
base.verb_types = this_verb_types
if verb_types then
for _, verb_type in ipairs(this_verb_types) do
m_table.insertIfNot(verb_types, verb_type)
end
end
end
if base.conj == "pretpres" then
m_table.insertIfNot(this_verb_types, "pretpres")
set_verb_type()
return
elseif base.conj == "irreg" then
m_table.insertIfNot(this_verb_types, "irreg")
set_verb_type()
return
end
local infstem = m_table.deepCopy(base.infstem)
local past = m_table.deepCopy(base.past)
local pp = m_table.deepCopy(base.pp)
local function matches_forms(forms, expected, ending_to_chop)
expected = expected:gsub("C", not_vowel_c) .. "$"
local seen = false
for _, form in ipairs(forms) do
local stem
if ending_to_chop then
stem = rmatch(form.form, "^(.*)" .. ending_to_chop .. "$")
else
stem = form.form
end
if stem and rfind("#" .. stem, expected) then
seen = true
form.seen = form.seen or "maybe"
end
end
return seen
end
local function reset_maybes(forms, value)
for _, form in ipairs(forms) do
if form.seen == "maybe" then
form.seen = value
end
end
end
local function reset_all_maybes(value)
reset_maybes(infstem, value)
reset_maybes(past, value)
reset_maybes(pp, value)
end
local function has_unseen_weak_pp()
for _, form in ipairs(pp) do
if not form.seen and form.form:find("[dt]$") then
return true
end
end
return false
end
local function has_unseen_strong_pp()
for _, form in ipairs(pp) do
if not form.seen and form.form:find("n$") then
return true
end
end
return false
end
local function check(verbtype, infre, pastre, ppre, exclude)
if exclude then
for _, form in ipairs(infstem) do
if exclude(form.form) then
return
end
end
end
if matches_forms(infstem, infre) and
matches_forms(past, pastre) and
matches_forms(pp, ppre, "en") then
m_table.insertIfNot(this_verb_types, verbtype)
reset_all_maybes(true)
else
reset_all_maybes(false)
end
end
local function check_strong()
check("1", "Ce[iy]C*", "CieC*", "Cie?C*") -- beigen, bleiben, gedeihen, leihen, meiden, preisen, reiben, reihen,
-- scheiden, scheinen, schreiben, schreien, schweigen, speiben, speien, speisen, steigen, treiben, weisen,
-- zeihen; use 'Cie?C*' for past participle to handle 'schrien', 'spien'
check("1", "Ce[iy]C*", "CiC*", "CiC*") -- beißen/beissen/beyßen/beyssen, bleichen, fleißen/fleissen, gleichen,
-- gleiten, greifen, kneifen, kreischen, leiden, pfeifen, reißen/reissen, reiten, scheißen/scheissen,
-- schleichen, schleifen, schleißen/schleissen, schmeißen/schmeissen, schneiden/schneyden, schreiten,
-- spleißen/spleissen, streichen, streiten, weichen
check("2", "CieC*", "CoC*", "CoC*") -- biegen, bieten, fliegen, fliehen, fließen/fliessen, frieren,
-- genießen/geniessen, gießen/giessen, kiesen, kriechen, riechen, schieben, schießen/schiessen, schliefen,
-- schließen/schliessen, sieden, sprießen/spriessen, stieben, triefen, verdrießen/verdriessen, verlieren,
-- wiegen, ziehen
check("2", "CauC*", "CoC*", "CoC*") -- krauchen, saufen, saugen
check("2", "CüC", "CoC", "CoC") -- lügen, trügen
local function exclude_nehmen_sprechen(form)
-- need to exclude nehmen, stehlen, befehlen/empfehlen, sprechen, brechen, stechen
return rfind(form, vowel_c .. "ch$") or rfind(form, vowel_c .. "h" .. not_vowel_c .. "$")
end
check("3", "C[ei]CC+", "CaCC+", "C[ou]CC+", exclude_nehmen_sprechen) -- [with e, + o in pp]: bergen, bersten,
-- gelten, helfen, schelten, sterben, verderben, werben, werfen; [with i, + u in pp]: binden, brinnen, dringen,
-- finden, gelingen, klingen, misslingen, ringen, schlingen, schwinden, schwingen, singen, sinken, springen,
-- stinken, trinken, winden, wringen, zwingen; [with i, + o in pp]: rinnen, gewinnen, schwimmen, sinnen,
-- spinnen
check("3", "C[eiaö]CC+", "CoCC+", "CoCC+", exclude_nehmen_sprechen)
-- [with e]: dreschen, fechten, flechten, melken, quellen, schmelzen, schwellen; [with i]: glimmen, klimmen;
-- [with a]: schallen (geschallt), erschallen; [with ö]: erlöschen
check("3", "quell", "quoll", "quoll") -- need to special-case quellen due to u preceding e
check("3", "schind", "schund", "schund") -- need to special-case due to 'u' in past
check("4", "C[eäo]C*", "Cah?Ch?", "CoC*") -- [with e]: befehlen, brechen, schrecken, nehmen, sprechen, stechen,
-- stecken (gesteckt), stehlen, treffen; [with ä]: gebären; [with o]: kommen
check("4", "C[äe]C", "Coh?C", "Coh?C", function(form) return form:find("heb$") end)
-- [with ä]: gären, wägen, schwären; [with e]: bewegen, weben, scheren (but not heben)
check("5", "C[ei]C*", "CaC", "CeC*") -- [with e, one C]: geben, genesen, geschehen, lesen, meßen, sehen, treten;
-- [with e, two C]: essen, fressen, messen, vergessen; [with i, two C]: bitten, sitzen
check("5", "C[ei]C*", "Cass", "Cess") -- essen, fressen, messen, sitzen in Swiss spelling
check("5", "CieC", "CaC", "CeC") -- liegen
check("6", "CaC*", "CuC*", "CaC*") -- backen, fragen (gefragt), graben, laden, mahlen, schaffen, schlagen,
-- tragen, wachsen, waschen
check("6", "heb", "h[ou]b", "hob") -- we need to special-case this because heben (class 6 per Wikipedia) has the
-- exact same vowels as weben (class 4 per Wikipedia)
check("6", "schwör", "schw[ou]r", "schwor") -- only strong verb with these vowels
check("7", "CaC*", "CieC*", "CaC*") -- blasen, braten, fallen, halten, lassen, raten/rathen, schlafen
check("7", "C[aäe]C*", "CiC*", "CaC*") -- [with a]: fangen; [with ä]: hängen; [with e]: gehen
check("7", "Ce[iy]C*", "CieC*", "Ce[iy]C*") -- heißen/heissen/heyßen/heyssen
check("7", "CauC*", "CieC*", "CauC*") -- hauen, laufen
check("7", "CoC*", "CieC*", "CoC*") -- stoßen/stossen
check("7", "CuC*", "CieC*", "CuC*") -- rufen
end
for _, form in ipairs(past) do
local past_stem = form.form:match("^(.*)te$")
if past_stem then
if matches_forms(infstem, "#" .. past_stem) then
-- Need to run matches_forms() on all possibilities even if earlier ones match,
-- to mark the seen forms correctly.
local matches_pp = matches_forms(pp, "#" .. past_stem .. "t")
matches_pp = matches_forms(pp, "#ge" .. past_stem .. "t") or matches_pp
if matches_pp then
m_table.insertIfNot(this_verb_types, "weak")
form.seen = true
reset_all_maybes(true)
else
reset_all_maybes(false)
end
end
end
if not form.seen and form.form:find("ete$") then
if matches_forms(infstem, "#" .. past_stem:gsub("e$", "")) then
-- Need to run matches_forms() on all possibilities even if earlier ones match,
-- to mark the seen forms correctly.
local matches_pp = matches_forms(pp, "#" .. past_stem .. "t")
matches_pp = matches_forms(pp, "#ge" .. past_stem .. "t") or matches_pp
matches_pp = matches_forms(pp, "#" .. past_stem .. "d") or matches_pp
matches_pp = matches_forms(pp, "#ge" .. past_stem .. "d") or matches_pp
if matches_pp then
m_table.insertIfNot(this_verb_types, "weak")
form.seen = true
reset_all_maybes(true)
else
reset_all_maybes(false)
end
end
end
if past_stem and not form.seen then
if not has_unseen_weak_pp() and has_unseen_strong_pp() then
m_table.insertIfNot(this_verb_types, "mixed")
else
m_table.insertIfNot(this_verb_types, "irregweak")
end
matches_forms(pp, "#" .. past_stem .. "t")
matches_forms(pp, "#ge" .. past_stem .. "t")
form.seen = true
reset_all_maybes(true)
end
if not form.seen then
check_strong()
end
if not form.seen then
if not has_unseen_strong_pp() and has_unseen_weak_pp() then
m_table.insertIfNot(this_verb_types, "mixed")
else
m_table.insertIfNot(this_verb_types, "irregstrong")
end
end
end
for _, form in ipairs(pp) do
if not form.seen then
if form.form:find("n$") then
if m_table.contains(this_verb_types, "strong") then
m_table.insertIfNot(this_verb_types, "irregstrong")
elseif m_table.contains(this_verb_types, "weak") then
m_table.insertIfNot(this_verb_types, "mixed")
end
elseif form.form:find("[dt]$") then
if m_table.contains(this_verb_types, "weak") then
m_table.insertIfNot(this_verb_types, "irregweak")
elseif m_table.contains(this_verb_types, "strong") then
m_table.insertIfNot(this_verb_types, "mixed")
end
end
end
end
base.verb_types = this_verb_types
if verb_types then
for _, verb_type in ipairs(this_verb_types) do
m_table.insertIfNot(verb_types, verb_type)
end
end
set_verb_type()
end
local function detect_indicator_spec(base)
base.forms = {}
base.aux = base.aux or {{form = "haben"}}
base.bare_infinitive = {{form = base.base_verb, footnotes = base.infstem_footnotes}}
add(base, "infinitive", base.pre_pref, base.bare_infinitive)
if base.only3s and base.only3sp then
error("'only3s' and 'only3sp' cannot both be specified")
end
if base.conj == "irreg" then
for irregverb, verbobj in pairs(irreg_verbs) do
base.insep_prefix = base.base_verb:match("^(.-)" .. irregverb .. "$")
if base.insep_prefix then
base.irregverb = irregverb
base.irregverbobj = verbobj
if not base.ge_prefix then
if base.insep_prefix ~= "" then
base.ge_prefix = {{form = ""}}
else
base.ge_prefix = {{form = "ge"}}
end
end
return
end
end
error("Unrecognized irregular base verb '" .. base.base_verb .. "'")
end
-- The following applies to everything but 'irreg' verbs.
local infstem, infroot = base.base_verb:match("^((.*)e[lr])n$")
if infstem then
base.unstressed_el_er = true
else
infstem, infroot = base.base_verb:match("^((.*)erl)n$") -- [[fensterln]]
if infstem then
base.unstressed_erl = true
else
infstem = base.base_verb:match("^(.*)en$")
infroot = infstem
if not infstem then
error("Unrecognized infinitive, should end in -en, -eln, -ern or -erln: '" .. base.base_verb .. "'")
end
end
end
base.infstem = {{form = infstem, footnotes = base.infstem_footnotes}}
if base.unstressed_e_infix == nil then
-- Autodetect whether we need an -e- infix in the pres_2s and pres_3s ([[atmen]], [[eignen]], etc.).
-- Almost all such cases have -Cmen or -Cnen where C is a consonant other than r or l and other than the
-- following m or n (hence [[meinen]], [[lernen]], [[filmen]], [[schwimmen]] should be excluded); we also
-- need to exclue -Vhmen and -Vhnen ([[wohnen]], [[rühmen]]), but not -Chmen and -Chnen ([[zeichnen]]).
if base.base_verb:find("[mn]en$") and not base.base_verb:find("([mn])%1en$") and
not rfind(base.base_verb, vowel_c .. "[hrl]?[mn]en$") then
base.unstressed_e_infix = true
end
end
if not base.conj then
base.conj = "normal"
end
if base.conj == "normal" then
local weak_past
if not base.past then
if base.unstressed_e_infix or ends_in_dt(infstem) then
weak_past = infstem .. "et"
else
weak_past = infstem .. "t"
end
base.past = {{form = weak_past .. "e"}}
end
if not base.pp then
if not weak_past then
error("Internal error: past was explicitly given but not past participle")
end
if not base.ge_prefix then
local no_ge
for _, insep_prefix in ipairs(inseparable_prefixes) do
-- There must be a vowel following the inseparable prefix; excludes beben, bechern, belfern, bellen, bessern,
-- beten, betteln, betten, erben, erden, ernten, erzen, entern, gecken, gehren, gellen, gerben, geten, missen,
-- zergen, zerren, etc.
if rfind(infroot, "^" .. insep_prefix .. ".*" .. vowel_c .. ".*") and
-- Exclude cases like beigen, beichten, beugen, beulen, geifern; this also wrongly excludes
-- beirren, which needs -ge.
not rfind(infroot, "^[bg]e[iu]" .. not_vowel_c .. "*$") then
no_ge = true
break
end
-- Check for -ier preceded by a vowel (excludes bieren, frieren, gieren, schmieren, stieren, zieren, etc.)
if not base.unstressed_el_er and not base.unstressed_erl and rfind(infroot, "^.*" .. vowel_c .. ".*ier$") then
no_ge = true
break
end
end
if no_ge then
base.ge_prefix = {{form = ""}}
else
base.ge_prefix = {{form = "ge"}}
end
end
base.pp = iut.map_forms(base.ge_prefix, function(form)
if base.unstressed_el_er or base.unstressed_erl then
return form .. base.base_verb:gsub("n$", "") .. "t"
else
return form .. weak_past
end
end)
end
else
if not base.pp then
error("For '" .. base.conj .. "' type verbs, past participle must be explicitly given")
end
end
add(base, "perf_part", base.pre_pref, base.pp)
end
local function detect_all_indicator_specs(alternant_multiword_spec)
iut.map_word_specs(alternant_multiword_spec, function(base)
detect_indicator_spec(base)
detect_verb_type(base)
end)
end
-- Set the overall auxiliary or auxiliaries. We can't do this using the normal inflection
-- code as it will produce e.g. '[[haben]] und [[haben]]' for conjoined verbs.
local function compute_auxiliary(alternant_multiword_spec)
iut.map_word_specs(alternant_multiword_spec, function(base)
iut.insert_forms(alternant_multiword_spec.forms, "aux", base.aux)
end)
end
function export.process_verb_classes(classes)
local class_descs = {}
local cats = {}
local function insert_desc(desc)
m_table.insertIfNot(class_descs, desc)
end
local function insert_cat(cat)
m_table.insertIfNot(cats, cat .. "ภาษาเยอรมัน")
end
for _, class in ipairs(classes) do
if class == "weak" then
insert_desc("[[ภาคผนวก:อภิธานศัพท์#คำกริยาอ่อน|อ่อน]]")
insert_cat("คำกริยาอ่อน")
elseif class == "irregweak" then
insert_desc("[[ภาคผนวก:อภิธานศัพท์#คำกริยาอ่อน|อ่อน]] [[ภาคผนวก:อภิธานศัพท์#ไม่ปรกติ|ไม่ปรกติ]]")
insert_cat("คำกริยาอ่อน")
insert_cat("คำกริยาอ่อนไม่ปรกติ")
elseif class == "pretpres" then
insert_desc("[[Appendix:Glossary#preterite-present verb|preterite-present]]")
insert_cat("preterite-present verbs")
elseif class == "irreg" then
insert_desc("[[ภาคผนวก:อภิธานศัพท์#ไม่ปรกติ|ไม่ปรกติ]]")
insert_cat("คำกริยาไม่ปรกติ")
elseif class == "mixed" then
insert_desc("คำกริยาผสม")
insert_cat("คำกริยาผสม")
elseif class == "irregstrong" then
insert_desc("[[ภาคผนวก:อภิธานศัพท์#คำกริยาแข็ง|แข็ง]] [[ภาคผนวก:อภิธานศัพท์#ไม่ปรกติ|ไม่ปรกติ]]")
insert_cat("คำกริยาแข็ง")
insert_cat("คำกริยาแข็งไม่ปรกติ")
elseif class:find("^[1-7]$") then
insert_desc("[[ภาคผนวก:อภิธานศัพท์#คำกริยาแข็ง|แข็ง]] กลุ่ม " .. class)
insert_cat("คำกริยาแข็ง")
insert_cat("คำกริยาแข็งกลุ่ม " .. class .. " ")
else
error("คำกริยาไม่ทราบกลุ่ม '" .. class .. "'")
end
end
return class_descs, cats
end
local function add_categories_and_annotation(alternant_multiword_spec, base, from_headword, manual)
local function insert_cat(full_cat)
m_table.insertIfNot(alternant_multiword_spec.categories, full_cat)
end
if not from_headword then
for _, slot_and_accel in ipairs(all_verb_slots) do
local slot = slot_and_accel[1]
local forms = base.forms[slot]
local must_break = false
if forms then
for _, form in ipairs(forms) do
if not form.form:find("%[%[") then
local title = mw.title.new(form.form)
if title and not title.exists then
insert_cat("คำกริยาที่มีลิงก์แดงในตารางการผันรูปภาษาเยอรมัน")
must_break = true
break
end
end
end
end
if must_break then
break
end
end
end
if manual then
return
end
local class_descs, cats = export.process_verb_classes(base.verb_types)
for _, desc in ipairs(class_descs) do
m_table.insertIfNot(alternant_multiword_spec.verb_types, desc)
end
-- Don't place multiword terms in categories like 'German class 4 strong verbs' to avoid spamming the
-- categories with such terms.
if from_headword and not base.lemma:find(" ") then
for _, cat in ipairs(cats) do
insert_cat(cat)
end
end
for _, aux in ipairs(base.aux) do
m_table.insertIfNot(alternant_multiword_spec.auxiliaries, link_term(aux.form, "term"))
if from_headword and not base.lemma:find(" ") then -- see above
insert_cat("คำกริยาที่ใช้ " .. aux.form .. " เป็นคำกริยานุเคราะห์ภาษาเยอรมัน")
-- Set flags for use below in adding 'German verbs using haben and sein as auxiliary'
alternant_multiword_spec["saw_" .. aux.form] = true
end
end
end
-- Compute the categories to add the verb to, as well as the annotation to display in the
-- conjugation title bar. We combine the code to do these functions as both categories and
-- title bar contain similar information.
local function compute_categories_and_annotation(alternant_multiword_spec, from_headword, manual)
alternant_multiword_spec.categories = {}
alternant_multiword_spec.verb_types = {}
alternant_multiword_spec.auxiliaries = {}
iut.map_word_specs(alternant_multiword_spec, function(base)
add_categories_and_annotation(alternant_multiword_spec, base, from_headword)
end)
if manual then
alternant_multiword_spec.annotation = ""
return
end
local ann_parts = {}
table.insert(ann_parts, table.concat(alternant_multiword_spec.verb_types, " หรือ "))
if #alternant_multiword_spec.auxiliaries > 0 then
table.insert(ann_parts, ", คำกริยานุเคราะห์ " .. table.concat(alternant_multiword_spec.auxiliaries, " หรือ "))
end
if from_headword and alternant_multiword_spec.saw_haben and alternant_multiword_spec.saw_sein then
m_table.insertIfNot(alternant_multiword_spec.categories, "คำกริยาที่ใช้ haben และ sein เป็นคำกริยานุเคราะห์ภาษาเยอรมัน")
end
alternant_multiword_spec.annotation = table.concat(ann_parts)
end
local function show_forms(alternant_multiword_spec)
local lemmas = iut.map_forms(alternant_multiword_spec.forms.infinitive,
remove_sein_sich_indicators)
alternant_multiword_spec.lemmas = lemmas -- save for later use in make_table()
local linked_pronouns = {}
for index, pronoun in ipairs(pronouns) do
-- use 'es' instead of 'er' for 3s-only verbs
if index == 3 and alternant_multiword_spec.only3s then
linked_pronouns[index] = link_term("es")
else
linked_pronouns[index] = link_term(pronoun)
end
end
dass = link_term("dass") .. " "
local function generate_link(data)
local link = m_links.full_link {
lang = lang, term = data.form.formval_for_link, tr = "-", accel = data.form.accel_obj
}
local footnote_text = iut.get_footnote_text(data.form.footnotes, data.footnote_obj)
local persnum = data.slot:match("^imp_(2[sp])$")
if persnum then
link = link .. " (" .. linked_pronouns[persnum_to_index[persnum]] .. ")"
else
persnum = data.slot:match("^.*_([123][sp])$")
if persnum then
link = linked_pronouns[persnum_to_index[persnum]] .. " " .. link
end
if data.slot:find("^subc_") then
link = dass .. link
end
end
return link .. footnote_text
end
local function join_spans(data)
if data.slot == "aux" then
return table.concat(data.formval_spans, " หรือ ")
else
return table.concat(data.formval_spans, "<br />")
end
end
local props = {
lang = lang,
lemmas = lemmas,
generate_link = generate_link,
join_spans = join_spans,
}
props.slot_list = verb_slots_basic
iut.show_forms(alternant_multiword_spec.forms, props)
alternant_multiword_spec.footnote_basic = alternant_multiword_spec.forms.footnote
props.slot_list = verb_slots_subordinate_clause
iut.show_forms(alternant_multiword_spec.forms, props)
alternant_multiword_spec.footnote_subordinate_clause = alternant_multiword_spec.forms.footnote
props.slot_list = verb_slots_composed
iut.show_forms(alternant_multiword_spec.forms, props)
alternant_multiword_spec.footnote_composed = alternant_multiword_spec.forms.footnote
end
local notes_template = [=[
<div style="width:100%;text-align:left;background:#d9ebff">
<div style="display:inline-block;text-align:left;padding-left:1em;padding-right:1em">
{footnote}
</div></div>
]=]
local zu_infinitive_table = [=[
|-
! colspan="2" style="background:#d0d0d0" | รูปกริยากลาง zu
| colspan="4" | {zu_infinitive}
]=]
local basic_table = [=[
<div class="NavFrame" style="">
<div class="NavHead" style="">การผันรูปของ {title}</div>
<div class="NavContent">
{\op}| border="1px solid #000000" style="border-collapse:collapse; background:#fafafa; text-align:center; width:100%" class="inflection-table"
|-
! colspan="2" style="background:#d0d0d0" | <span title="Infinitiv">รูปกริยากลาง</span>
| colspan="4" | {infinitive}
|-
! colspan="2" style="background:#d0d0d0" | <span title="Partizip I (Partizip Präsens)">รูปกริยาขยายปัจจุบันกาล</span>
| colspan="4" | {pres_part}
|-
! colspan="2" style="background:#d0d0d0" | <span title="Partizip II (Partizip Perfekt)">รูปกริยาขยายอดีตกาล</span>
| colspan="4" | {perf_part}
{zu_infinitive_table}|-
! colspan="2" style="background:#d0d0d0" | <span title="Hilfsverb">คำกริยานุเคราะห์</span>
| colspan="4" | {aux}
|-
| rowspan="2" style="background:#a0ade3" |
! colspan="2" style="background:#a0ade3" | <span title="Indikativ">มาลาบอกเล่า</span>
| rowspan="2" style="background:#a0ade3" |
! colspan="2" style="background:#a0ade3" | <span title="Konjunktiv">มาลาสมมุติ</span>
|-
! style="background:#a0ade3" | เอกพจน์
! style="background:#a0ade3" | พหูพจน์
! style="background:#a0ade3" | เอกพจน์
! style="background:#a0ade3" | พหูพจน์
|-
! rowspan="3" style="background:#c0cfe4; width:7em" | <span title="Präsens">ปัจจุบันกาล</span>
| {pres_1s}
| {pres_1p}
! rowspan="3" style="background:#c0cfe4; width:7em" | <span title="Konjunktiv I (Konjunktiv Präsens)">I</span>
| {subi_1s}
| {subi_1p}
|-
| {pres_2s}
| {pres_2p}
| {subi_2s}
| {subi_2p}
|-
| {pres_3s}
| {pres_3p}
| {subi_3s}
| {subi_3p}
|-
| colspan="6" style="background:#d5d5d5; height: .25em" |
|-
! rowspan="3" style="background:#c0cfe4" | <span title="Präteritum">อดีตกาล</span>
| {pret_1s}
| {pret_1p}
! rowspan="3" style="background:#c0cfe4" | <span title="Konjunktiv II (Konjunktiv Präteritum)">II</span>
| {subii_1s}
| {subii_1p}
|-
| {pret_2s}
| {pret_2p}
| {subii_2s}
| {subii_2p}
|-
| {pret_3s}
| {pret_3p}
| {subii_3s}
| {subii_3p}
|-
| colspan="6" style="background:#d5d5d5; height: .25em" |
|-
! style="background:#c0cfe4" | <span title="Imperativ">มาลาสั่ง</span>
| {imp_2s}
| {imp_2p}
| colspan="3" style="background:#e0e0e0" |
|{\cl}{notes_clause}</div></div>
]=]
local subordinate_clause_table = [=[
<div class="NavFrame" style="">
<div class="NavHead" style="">รูปกริยา {title} เมื่ออยู่ในอนุประโยค</div>
<div class="NavContent">
{\op}| border="1px solid #000000" style="border-collapse:collapse; background:#fafafa; text-align:center; width:100%" class="inflection-table"
|-
| style="background:#a0ade3" |
! colspan="2" style="background:#a0ade3" | <span title="Indikativ">มาลาบอกเล่า</span>
| style="background:#a0ade3" |
! colspan="2" style="background:#a0ade3" | <span title="Konjunktiv">มาลาสมมุติ</span>
|-
! rowspan="3" style="background:#c0cfe4; width:7em" | <span title="Präsens">ปัจจุบัน</span>
| {subc_pres_1s}
| {subc_pres_1p}
! rowspan="3" style="background:#c0cfe4; width:7em" | <span title="Konjunktiv I (Konjunktiv Präsens)">I</span>
| {subc_subi_1s}
| {subc_subi_1p}
|-
| {subc_pres_2s}
| {subc_pres_2p}
| {subc_subi_2s}
| {subc_subi_2p}
|-
| {subc_pres_3s}
| {subc_pres_3p}
| {subc_subi_3s}
| {subc_subi_3p}
|-
| colspan="6" style="background:#d5d5d5; height: .25em" |
|-
! rowspan="3" style="background:#c0cfe4" | <span title="Präteritum">อดีต</span>
| {subc_pret_1s}
| {subc_pret_1p}
! rowspan="3" style="background:#c0cfe4" | <span title="Konjunktiv II (Konjunktiv Präteritum)">II</span>
| {subc_subii_1s}
| {subc_subii_1p}
|-
| {subc_pret_2s}
| {subc_pret_2p}
| {subc_subii_2s}
| {subc_subii_2p}
|-
| {subc_pret_3s}
| {subc_pret_3p}
| {subc_subii_3s}
| {subc_subii_3p}
|{\cl}{notes_clause}</div></div>
]=]
local composed_table = [=[
<div class="NavFrame" style="">
<div class="NavHead" style="">รูปประกอบของคำกริยา {title}</div>
<div class="NavContent">
{\op}| border="1px solid #000000" style="border-collapse:collapse; background:#fafafa; text-align:center; width:100%" class="inflection-table"
|-
! colspan="6" style="background:#99cc99" | <span title="Perfekt">การณ์ลักษณะสมบูรณ์</span>
|-
! style="background:#99cc99" |
! style="background:#99cc99" | เอกพจน์
! style="background:#99cc99" | พหูพจน์
! style="background:#99cc99" |
! style="background:#99cc99" | เอกพจน์
! style="background:#99cc99" | พหูพจน์
|-
! rowspan="3" style="background:#cfedcc; width:7em" | <span title="Indikativ">มาลาบอกเล่า</span>
| {perf_ind_1s}
| {perf_ind_1p}
! rowspan="3" style="background:#cfedcc; width:7em" | <span title="Konjunktiv">มาลาสมมุติ</span>
| {perf_sub_1s}
| {perf_sub_1p}
|-
| {perf_ind_2s}
| {perf_ind_2p}
| {perf_sub_2s}
| {perf_sub_2p}
|-
| {perf_ind_3s}
| {perf_ind_3p}
| {perf_sub_3s}
| {perf_sub_3p}
|-
! colspan="6" style="background:#99CC99" | <span title="Plusquamperfekt">การณ์ลักษณะอภิสมบูรณ์</span>
|-
! rowspan="3" style="background:#cfedcc" | <span title="Indikativ">มาลาบอกเล่า</span>
| {plup_ind_1s}
| {plup_ind_1p}
! rowspan="3" style="background:#cfedcc" | <span title="Konjunktiv">มาลาสมมุติ</span>
| {plup_sub_1s}
| {plup_sub_1p}
|-
| {plup_ind_2s}
| {plup_ind_2p}
| {plup_sub_2s}
| {plup_sub_2p}
|-
| {plup_ind_3s}
| {plup_ind_3p}
| {plup_sub_3s}
| {plup_sub_3p}
|-
! colspan="6" style="background:#9999DF" | <span title="Futur I">อนาคตกาล I</span>
|-
! rowspan="3" style="background:#ccccff" | <span title="Infinitiv">รูปกริยากลาง</span>
| rowspan="3" colspan="2" | {futi_inf}
! rowspan="3" style="background:#ccccff" | <span title="Konjunktiv I (Konjunktiv Präsens)">มาลาสมมุติ I</span>
| {futi_subi_1s}
| {futi_subi_1p}
|-
| {futi_subi_2s}
| {futi_subi_2p}
|-
| {futi_subi_3s}
| {futi_subi_3p}
|-
! colspan="6" style="background:#d5d5d5; height: .25em" |
|-
! rowspan="3" style="background:#ccccff" | <span title="Indikativ">มาลาบอกเล่า</span>
| {futi_ind_1s}
| {futi_ind_1p}
! rowspan="3" style="background:#ccccff" | <span title="Konjunktiv II (Konjunktiv Präteritum)">มาลาสมมุติ II</span>
| {futi_subii_1s}
| {futi_subii_1p}
|-
| {futi_ind_2s}
| {futi_ind_2p}
| {futi_subii_2s}
| {futi_subii_2p}
|-
| {futi_ind_3s}
| {futi_ind_3p}
| {futi_subii_3s}
| {futi_subii_3p}
|-
! colspan="6" style="background:#9999DF" | <span title="Futur II">อนาคตกาล II</span>
|-
! rowspan="3" style="background:#ccccff" | <span title="Infinitiv">รูปกริยากลาง</span>
| rowspan="3" colspan="2" | {futii_inf}
! rowspan="3" style="background:#ccccff" | <span title="Konjunktiv I (Konjunktiv Präsens)">มาลาสมมุติ I</span>
| {futii_subi_1s}
| {futii_subi_1p}
|-
| {futii_subi_2s}
| {futii_subi_2p}
|-
| {futii_subi_3s}
| {futii_subi_3p}
|-
! colspan="6" style="background:#d5d5d5; height: .25em" |
|-
! rowspan="3" style="background:#ccccff" | <span title="Indikativ">มาลาบอกเล่า</span>
| {futii_ind_1s}
| {futii_ind_1p}
! rowspan="3" style="background:#ccccff" | <span title="Konjunktiv II (Konjunktiv Präteritum)">มาลาสมมุติ II</span>
| {futii_subii_1s}
| {futii_subii_1p}
|-
| {futii_ind_2s}
| {futii_ind_2p}
| {futii_subii_2s}
| {futii_subii_2p}
|-
| {futii_ind_3s}
| {futii_ind_3p}
| {futii_subii_3s}
| {futii_subii_3p}
|{\cl}{notes_clause}</div></div>]=]
local function make_table(alternant_multiword_spec)
local forms = alternant_multiword_spec.forms
forms.title = link_term(alternant_multiword_spec.lemmas[1].form, "term")
if alternant_multiword_spec.annotation ~= "" then
forms.title = forms.title .. " (" .. alternant_multiword_spec.annotation .. ")"
end
-- Maybe format the subordinate clause table.
local formatted_subordinate_clause_table
if forms.subc_pres_3s ~= "—" then -- use 3s in case of only3s verb
forms.zu_infinitive_table = m_string_utilities.format(zu_infinitive_table, forms)
forms.footnote = alternant_multiword_spec.footnote_subordinate_clause
forms.notes_clause = forms.footnote ~= "" and m_string_utilities.format(notes_template, forms) or ""
formatted_subordinate_clause_table = m_string_utilities.format(subordinate_clause_table, forms)
else
forms.zu_infinitive_table = ""
formatted_subordinate_clause_table = ""
end
-- Format the basic table.
forms.footnote = alternant_multiword_spec.footnote_basic
forms.notes_clause = forms.footnote ~= "" and m_string_utilities.format(notes_template, forms) or ""
local formatted_basic_table = m_string_utilities.format(basic_table, forms)
-- Format the composed table.
forms.footnote = alternant_multiword_spec.footnote_composed
forms.notes_clause = forms.footnote ~= "" and m_string_utilities.format(notes_template, forms) or ""
local formatted_composed_table = m_string_utilities.format(composed_table, forms)
-- Paste them together.
return formatted_basic_table .. formatted_subordinate_clause_table .. formatted_composed_table
end
-- Externally callable function to parse and conjugate a verb given user-specified arguments.
-- Return value is WORD_SPEC, an object where the conjugated forms are in `WORD_SPEC.forms`
-- for each slot. If there are no values for a slot, the slot key will be missing. The value
-- for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}.
function export.do_generate_forms(parent_args, from_headword, def)
local params = {
[1] = {},
}
if from_headword then
params["lemma"] = {list = true}
params["id"] = {}
end
local args = require("Module:parameters").process(parent_args, params)
local PAGENAME = mw.title.getCurrentTitle().text
if not args[1] then
if PAGENAME == "de-conj" or PAGENAME == "de-verb" then
args[1] = def or "aus.fahren<fährt#fuhr,gefahren,führe.haben,sein>"
else
args[1] = PAGENAME
-- If pagename has spaces in it, add links around each word
if args[1]:find(" ") then
args[1] = "[[" .. args[1]:gsub(" ", "]] [[") .. "]]"
end
end
end
local parse_props = {
parse_indicator_spec = parse_indicator_spec,
lang = lang,
allow_default_indicator = true,
allow_blank_lemma = true,
}
local escaped_arg1 = escape_sein_sich_indicators(args[1])
local alternant_multiword_spec = iut.parse_inflected_text(escaped_arg1, parse_props)
alternant_multiword_spec.pos = pos or "verbs"
alternant_multiword_spec.args = args
normalize_all_lemmas(alternant_multiword_spec, from_headword)
detect_all_indicator_specs(alternant_multiword_spec)
local inflect_props = {
slot_list = all_verb_slots,
lang = lang,
inflect_word_spec = conjugate_verb,
-- We add links around the generated verbal forms rather than allow the entire multiword
-- expression to be a link, so ensure that user-specified links get included as well.
include_user_specified_links = true,
}
iut.inflect_multiword_or_alternant_multiword_spec(alternant_multiword_spec, inflect_props)
compute_auxiliary(alternant_multiword_spec)
compute_categories_and_annotation(alternant_multiword_spec, from_headword)
return alternant_multiword_spec
end
-- Entry point for {{de-conj}}. Template-callable function to parse and conjugate a verb given
-- user-specified arguments and generate a displayable table of the conjugated forms.
function export.show(frame)
local parent_args = frame:getParent().args
local alternant_multiword_spec = export.do_generate_forms(parent_args)
show_forms(alternant_multiword_spec)
return make_table(alternant_multiword_spec) .. require("Module:utilities").format_categories(alternant_multiword_spec.categories, lang)
end
-- Concatenate all forms of all slots into a single string of the form
-- "SLOT=FORM,FORM,...|SLOT=FORM,FORM,...|...". Embedded pipe symbols (as might occur
-- in embedded links) are converted to <!>. If INCLUDE_PROPS is given, also include
-- additional properties (currently, none). This is for use by bots.
local function concat_forms(alternant_multiword_spec, include_props)
local ins_text = {}
for _, slot_and_accel in ipairs(all_verb_slots) do
local slot = slot_and_accel[1]
local formtext = iut.concat_forms_in_slot(alternant_multiword_spec.forms[slot])
if formtext then
table.insert(ins_text, slot .. "=" .. formtext)
end
end
if include_props then
local verb_types = {}
iut.map_word_specs(alternant_multiword_spec, function(base)
detect_verb_type(base, verb_types)
end)
table.insert(ins_text, "class=" .. table.concat(verb_types, ","))
end
return table.concat(ins_text, "|")
end
local numbered_params = {
-- required params
[1] = "infinitive",
[2] = "pres_part",
[3] = "perf_part",
[4] = "aux",
[5] = "pres_1s",
[6] = "pres_2s",
[7] = "pres_3s",
[8] = "pres_1p",
[9] = "pres_2p",
[10] = "pres_3p",
[11] = "pret_1s",
[12] = "pret_2s",
[13] = "pret_3s",
[14] = "pret_1p",
[15] = "pret_2p",
[16] = "pret_3p",
[17] = "subi_1s",
[18] = "subi_2s",
[19] = "subi_3s",
[20] = "subi_1p",
[21] = "subi_2p",
[22] = "subi_3p",
[23] = "subii_1s",
[24] = "subii_2s",
[25] = "subii_3s",
[26] = "subii_1p",
[27] = "subii_2p",
[28] = "subii_3p",
[29] = "imp_2s",
[30] = "imp_2p",
-- [31] formerly the 2nd variant of imp_2s; now no longer allowed (use comma-separated 29=)
-- [32] formerly indicated whether the 2nd variant of imp_2s was present
-- optional params
[33] = "subc_pres_1s",
[34] = "subc_pres_2s",
[35] = "subc_pres_3s",
[36] = "subc_pres_1p",
[37] = "subc_pres_2p",
[38] = "subc_pres_3p",
[39] = "subc_pret_1s",
[40] = "subc_pret_2s",
[41] = "subc_pret_3s",
[42] = "subc_pret_1p",
[43] = "subc_pret_2p",
[44] = "subc_pret_3p",
[45] = "subc_subi_1s",
[46] = "subc_subi_2s",
[47] = "subc_subi_3s",
[48] = "subc_subi_1p",
[49] = "subc_subi_2p",
[50] = "subc_subi_3p",
[51] = "subc_subii_1s",
[52] = "subc_subii_2s",
[53] = "subc_subii_3s",
[54] = "subc_subii_1p",
[55] = "subc_subii_2p",
[56] = "subc_subii_3p",
[57] = "zu_infinitive",
}
local max_required_param = 30
-- Externally callable function to parse and conjugate a verb where all forms are given manually.
-- Return value is WORD_SPEC, an object where the conjugated forms are in `WORD_SPEC.forms`
-- for each slot. If there are no values for a slot, the slot key will be missing. The value
-- for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}.
function export.do_generate_forms_manual(parent_args)
local params = {
["generate_forms"] = {type = "boolean"},
}
for paramnum, _ in pairs(numbered_params) do
params[paramnum] = {required = paramnum <= max_required_param}
end
local args = require("Module:parameters").process(parent_args, params)
local base = {
forms = {},
manual = true,
}
local function process_numbered_param(paramnum)
local argval = args[paramnum]
if paramnum == 4 then
if argval == "h" then
base.aux = {{form = "haben"}}
elseif argval == "s" then
base.aux = {{form = "sein"}}
elseif argval == "hs" then
base.aux = {{form = "haben"}, {form = "sein"}}
elseif argval == "sh" then
base.aux = {{form = "sein"}, {form = "haben"}}
elseif not argval then
error("Missing auxiliary in 4=")
else
error("Unrecognized auxiliary 4=" .. argval)
end
elseif argval and argval ~= "-" then
local split_vals = rsplit(argval, "%s*,%s*")
for _, val in ipairs(split_vals) do
-- FIXME! This won't work with commas or brackets in footnotes.
-- To fix this, use functions from [[Module:inflection utilities]].
local form, footnote = val:match("^(.-)%s*(%[[^%]%[]-%])$")
local footnotes
if form then
footnotes = {footnote}
else
form = val
end
local slot = numbered_params[paramnum]
--if slot:find("subii") then
-- local subii_footnotes = get_subii_note(base)
-- footnotes = iut.combine_footnotes(subii_footnotes, footnotes)
--end
iut.insert_form(base.forms, slot, {form = form, footnotes = footnotes})
end
end
end
-- Do the infinitive first as we need to reference it in subjunctive II footnotes.
process_numbered_param(1)
for paramnum, _ in pairs(numbered_params) do
if paramnum ~= 1 then
process_numbered_param(paramnum)
end
end
add_composed_forms(base)
compute_categories_and_annotation(base, nil, "manual")
return base, args.generate_forms
end
-- Entry point for {{de-conj-table}}. Template-callable function to parse and conjugate a verb given
-- manually-specified inflections and generate a displayable table of the conjugated forms.
function export.show_manual(frame)
local parent_args = frame:getParent().args
local base, generate_forms = export.do_generate_forms_manual(parent_args)
if generate_forms then
return concat_forms(base)
end
show_forms(base)
return make_table(base) .. require("Module:utilities").format_categories(base.categories, lang)
end
-- Template-callable function to parse and conjugate a verb given user-specified arguments and return
-- the forms as a string "SLOT=FORM,FORM,...|SLOT=FORM,FORM,...|...". Embedded pipe symbols (as might
-- occur in embedded links) are converted to <!>. If |include_props=1 is given, also include
-- additional properties (currently, none). This is for use by bots.
function export.generate_forms(frame)
local include_props = frame.args["include_props"]
local parent_args = frame:getParent().args
local alternant_multiword_spec = export.do_generate_forms(parent_args)
return concat_forms(alternant_multiword_spec, include_props)
end
return export
rtwmpc04d9abpkgfsu5sj0bwdt7uxzj
4755966
4755936
2025-07-10T13:05:14Z
Octahedron80
267
4755966
Scribunto
text/plain
local export = {}
--[=[
Authorship: Ben Wing <benwing2>
]=]
--[=[
TERMINOLOGY:
-- "slot" = A particular combination of tense/mood/person/number/etc.
Example slot names for verbs are "pres_1s" (present first singular) and
"subc_subii_3p" (subordinate-clause subjunctive II third plural).
Each slot is filled with zero or more forms.
-- "form" = The conjugated German form representing the value of a given slot.
-- "lemma" = The dictionary form of a given German term. For German, always the infinitive.
]=]
--[=[
FIXME:
1. Handle fensterln. (DONE)
2. Handle spie- past tense of speien. (DONE)
3. Make sure rathen, verheirathen work. (DONE)
4. Modify einfix to better handle managen, framen. (DONE)
5. Use variant codes so variant imperatives with and without -e match up in conjoined verbs e.g. [[ausschneiden und einfügen]].
6. In conjoined verbs e.g. [[ausschneiden und einfügen]], don't repeat auxiliaries.
--]=]
local lang = require("Module:languages").getByCode("de")
local m_string_utilities = require("Module:string utilities")
local m_links = require("Module:links")
local m_table = require("Module:table")
local iut = require("Module:inflection utilities")
local rfind = mw.ustring.find
local rmatch = mw.ustring.match
local rsplit = mw.text.split
local function link_term(term, face)
return m_links.full_link({ lang = lang, term = term }, face)
end
local vowel = "aeiouyäëïöüÿáéíóúýàèìòùỳâêîôûŷãẽĩõũỹ"
local vowel_c = "[" .. vowel .. "]"
local not_vowel_c = "[^" .. vowel .. "]"
local function ends_in_dt(stem)
return stem:find("[dt]h?$")
end
local inseparable_prefixes = {
"be", "emp", "ent", "er", "ge", "miss", "miß", "ver", "zer",
-- can also be separable
"durch", "hinter", "über", "um", "unter", "voll", "wider", "wieder",
}
local wuerde = link_term("würde", "term")
local past_subjunctive_single_word_preferred = m_table.listToSet {
"haben", "sein", "können", "müssen", "dürfen", "mögen", "sollen", "wollen", "werden"
}
local past_subjunctive_single_word_preferred_footnote = "[แนะนำให้ใช้, เลี่ยงรูปประกอบ " .. wuerde .. "]"
local past_subjunctive_single_word_often_used = m_table.listToSet {
"bleiben", "brauchen", "bringen", "fallen", "finden", "geben", "gehen", "halten", "heißen", "heissen",
"kommen", "laufen", "lassen", "liegen", "nehmen", "sehen", "stehen", "tun", "thun", "wissen"
}
local past_subjunctive_single_word_often_used_footnote = "[พบได้ทั้งรูปนี้และรูปประกอบ " .. wuerde .. "]"
local past_subjunctive_single_word_rare_footnote = "[พบได้น้อยมากยกเว้นในบริบทที่เป็นทางการมาก, แนะนำให้ใช้รูปประกอบ " .. wuerde .. "]"
local schst_footnote = "[ใช้ได้ในลักษณะเป็นทางการในออสเตรีย, ใช้ในภาษาปากในทุกพื้นที่ที่พูดภาษาเยอรมัน]"
local all_persons_numbers = {
["1s"] = "1|s",
["2s"] = "2|s",
["3s"] = "3|s",
["1p"] = "1|p",
["2p"] = "2|p",
["3p"] = "3|p",
}
local person_number_list = { "1s", "2s", "3s", "1p", "2p", "3p", }
local persnum_to_index = {}
for k, v in pairs(person_number_list) do
persnum_to_index[v] = k
end
local imp_person_number_list = { "2s", "2p", }
local verb_slots_basic = {
{"infinitive", "inf"},
{"infinitive_linked", "inf"},
{"pres_part", "pres|part"},
{"perf_part", "perf|part"},
{"zu_infinitive", "zu"}, -- will be handled specially by [[Module:accel/de]]
{"aux", "-"},
}
local verb_slots_subordinate_clause = {
}
local verb_slots_composed = {
}
-- Add entries for a slot with person/number variants.
-- `verb_slots` is the table to add to.
-- `slot_prefix` is the prefix of the slot, typically specifying the tense/aspect.
-- `tag_suffix` is the set of inflection tags to add after the person/number tags,
-- or "-" to use "-" as the inflection tags (which indicates that no accelerator entry
-- should be generated).
local function add_slot_personal(verb_slots, slot_prefix, tag_suffix)
for persnum, persnum_tag in pairs(all_persons_numbers) do
local slot = slot_prefix .. "_" .. persnum
if tag_suffix == "-" then
table.insert(verb_slots, {slot, "-"})
else
table.insert(verb_slots, {slot, persnum_tag .. "|" .. tag_suffix})
end
end
end
add_slot_personal(verb_slots_basic, "pres", "pres")
add_slot_personal(verb_slots_basic, "subi", "sub|I")
add_slot_personal(verb_slots_basic, "pret", "pret")
add_slot_personal(verb_slots_basic, "subii", "sub|II")
table.insert(verb_slots_basic, {"imp_2s", "s|imp"})
table.insert(verb_slots_basic, {"imp_2p", "p|imp"})
add_slot_personal(verb_slots_subordinate_clause, "subc_pres", "dep|pres")
add_slot_personal(verb_slots_subordinate_clause, "subc_subi", "dep|sub|I")
add_slot_personal(verb_slots_subordinate_clause, "subc_pret", "dep|pret")
add_slot_personal(verb_slots_subordinate_clause, "subc_subii", "dep|sub|II")
add_slot_personal(verb_slots_composed, "perf_ind", "-")
add_slot_personal(verb_slots_composed, "perf_sub", "-")
add_slot_personal(verb_slots_composed, "plup_ind", "-")
add_slot_personal(verb_slots_composed, "plup_sub", "-")
table.insert(verb_slots_composed, {"futi_inf", "-"})
add_slot_personal(verb_slots_composed, "futi_subi", "-")
add_slot_personal(verb_slots_composed, "futi_ind", "-")
add_slot_personal(verb_slots_composed, "futi_subii", "-")
table.insert(verb_slots_composed, {"futii_inf", "-"})
add_slot_personal(verb_slots_composed, "futii_subi", "-")
add_slot_personal(verb_slots_composed, "futii_ind", "-")
add_slot_personal(verb_slots_composed, "futii_subii", "-")
local all_verb_slots = {}
for _, slot_and_accel in ipairs(verb_slots_basic) do
table.insert(all_verb_slots, slot_and_accel)
end
for _, slot_and_accel in ipairs(verb_slots_subordinate_clause) do
table.insert(all_verb_slots, slot_and_accel)
end
for _, slot_and_accel in ipairs(verb_slots_composed) do
table.insert(all_verb_slots, slot_and_accel)
end
local pronouns = { "ich", "du", "er", "wir", "ihr", "sie", }
irreg_verbs = {
["haben"] = {
["pres"] = { "habe", "hast", "hat", "haben", "habt", "haben", },
["pret"] = { "hatte", "hattest", "hatte", "hatten", "hattet", "hatten", },
["subi"] = { "habe", "habest", "habe", "haben", "habet", "haben", },
["subii"] = { "hätte", "hättest", "hätte", "hätten", "hättet", "hätten", },
["imp"] = { {"hab", "habe"}, "habt", },
["presp"] = "habend",
["pp"] = "habt",
},
["sein"] = {
["pres"] = { "bin", "bist", "ist", "sind", "seid", "sind", },
["pret"] = { "war", "warst", "war", "waren", "wart", "waren", },
["subi"] = { "sei", {"seist", "seiest"}, "sei", "seien", "seiet", "seien", },
["subii"] = { "wäre", {"wärst", "wärest"}, "wäre", "wären", {"wärt", "wäret"}, "wären", },
["imp"] = { "sei", "seid", },
["presp"] = "seiend",
["pp"] = "wesen",
},
["tun"] = {
["pres"] = { "tue", "tust", "tut", "tun", "tut", "tun", },
["pret"] = { "tat", {"tatest", "tatst"}, "tat", "taten", "tatet", "taten", },
["subi"] = { "tue", "tuest", "tue", "tuen", "tuet", "tuen", },
["subii"] = { "täte", "tätest", "täte", "täten", "tätet", "täten", },
["imp"] = { {"tu", "tue"}, "tut", },
["presp"] = "tuend",
["pp"] = "tan",
},
-- FIXME, maybe we should construct this automatically from "tun".
["thun"] = {
["pres"] = { "thue", "thust", "thut", "thun", "thut", "thun", },
["pret"] = { "that", {"thatest", "thatst"}, "that", "thaten", "thatet", "thaten", },
["subi"] = { "thue", "thuest", "thue", "thuen", "thuet", "thuen", },
["subii"] = { "thäte", "thätest", "thäte", "thäten", "thätet", "thäten", },
["imp"] = { {"thu", "thue"}, "thut", },
["presp"] = "thuend",
["pp"] = "than",
},
["werden"] = {
["pres"] = { "werde", "wirst", "wird", "werden", "werdet", "werden", },
["pret"] = {
{"wurde", {form = "ward", footnotes = {"[โบราณ]"}}},
{"wurdest", {form = "wardst", footnotes = {"[โบราณ]"}}},
{"wurde", {form = "ward", footnotes = {"[โบราณ]"}}},
"wurden",
"wurdet",
"wurden",
},
["subi"] = { "werde", "werdest", "werde", "werden", "werdet", "werden", },
["subii"] = { "würde", "würdest", "würde", "würden", "würdet", "würden", },
["imp"] = { {"werd", "werde"}, "werdet", },
["presp"] = "werdend",
["pp"] = "worden",
},
}
local sein_forms = {
["sein"] = {"mein", "dein", "sein", "unser", "euer", "ihr"},
["seine"] = {"meine", "deine", "seine", "unsere", "eure", "ihre"},
["seinen"] = {"meinen", "deinen", "seinen", "unseren", "euren", "ihren"},
["seinem"] = {"meinem", "deinem", "seinem", "unserem", "eurem", "ihrem"},
["seiner"] = {"meiner", "deiner", "seiner", "unserer", "eurer", "ihrer"},
["seines"] = {"meines", "deines", "seines", "unseses", "eures", "ihres"},
}
local sich_forms = {
["accpron"] = {"mich", "dich", "sich", "uns", "euch", "sich"},
["datpron"] = {"mir", "dir", "sich", "uns", "euch", "sich"},
}
local function skip_slot(base, slot)
if not slot:find("[123]") then
-- Don't skip non-personal slots.
return false
end
if base.nofinite then
return true
end
if base.nosplitprefix then
-- Verbs that don't allow split prefixes, e.g. [[voreinstellen]], don't have forms where the prefix is
-- split from the main verb, including the present, preterite, subjunctive I and II and imperative (but
-- not the subordinate clause equivalents).
return slot:find("^pre[st]") or slot:find("^subi") or slot:find("^imp_")
end
if base.only3s and not slot:find("3s") or
base.only3sp and not slot:find("3[sp]") then
return true
end
return false
end
local function strip_spaces(text)
return text:gsub("^%s*(.-)%s*", "%1")
end
local function escape_sein_sich_indicators(arg1)
if not arg1:find("pron>") then
return arg1
end
local segments = iut.parse_balanced_segment_run(arg1, "<", ">")
-- Loop over every other segment. The even-numbered segments are angle-bracket specs while
-- the odd-numbered segments are the text between them.
for i = 2, #segments - 1, 2 do
if segments[i] == "<accpron>" then
segments[i] = "⦃⦃accpron⦄⦄"
elseif segments[i] == "<datpron>" then
segments[i] = "⦃⦃datpron⦄⦄"
elseif segments[i] == "<pron>" then
segments[i] = "⦃⦃pron⦄⦄"
end
end
return table.concat(segments)
end
local function undo_escape_form(form)
-- assign to var to throw away second value
local newform = form:gsub("⦃⦃", "<"):gsub("⦄⦄", ">")
return newform
end
local function remove_sein_sich_indicators(form)
-- assign to var to throw away second value
local newform = form:gsub("⦃⦃.-⦄⦄", "")
return newform
end
local function replace_sein_sich_indicators(slot, form)
if not form:find("⦃") then
return form
end
local persnum = slot:match("^.*_([123][sp])$")
local index
if persnum then
index = persnum_to_index[persnum]
else
index = 3
end
form = form:gsub("sich(%]*)⦃⦃accpron⦄⦄", function(brackets)
return sich_forms.accpron[index] .. brackets
end)
form = form:gsub("sich(%]*)⦃⦃datpron⦄⦄", function(brackets)
return sich_forms.datpron[index] .. brackets
end)
form = form:gsub("(seine?[mnrs]?)(%]*)⦃⦃pron⦄⦄", function(sein_form, brackets)
if sein_forms[sein_form] then
return sein_forms[sein_form][index] .. brackets
else
error("Unrecognized sein-form '" .. sein_form .. "' in slot " .. slot .. ": " .. undo_escape_form(form))
end
end)
form = form:gsub("sein%]%](e?[mnrs]?)⦃⦃pron⦄⦄", function(sein_ending, brackets)
local sein_form = "sein" .. sein_ending
if sein_forms[sein_form] then
return sein_forms["sein"][index] .. "|" .. sein_forms[sein_form][index] .. "]]"
else
error("Unrecognized sein-form '" .. sein_form .. "' in slot " .. slot .. ": " .. undo_escape_form(form))
end
end)
if form:find("⦃⦃") or form:find("⦄⦄") then
error("Unrecognized pronoun substitution in slot " .. slot .. ": " .. undo_escape_form(form))
end
return form
end
local function combine_stem_ending(slot, stem, ending)
local ending_with_pound = ending .. "#"
if ending_with_pound:find("^st[ #]") then
if rfind(stem, "[sxzß]$") then
ending = ending:gsub("^s", "")
elseif stem:find("st$") then
-- bersten
ending = ending:gsub("^st", "")
end
elseif ending_with_pound:find("^t[ #]") and stem:find("th?$") then
ending = ending:gsub("^t", "")
end
return replace_sein_sich_indicators(slot, stem .. ending)
end
local function add(base, slot, stems, endings, footnotes)
if skip_slot(base, slot) then
return
end
local function do_combine_stem_ending(stem, ending)
return combine_stem_ending(slot, stem, ending)
end
iut.add_forms(base.forms, slot, stems, endings, do_combine_stem_ending, nil, nil,
iut.combine_footnotes(footnotes, base.all_footnotes))
end
local function add_multi(base, slot, stems_and_endings, footnotes)
if skip_slot(base, slot) then
return
end
local function do_combine_stem_ending(stem, ending)
return combine_stem_ending(slot, stem, ending)
end
iut.add_multiple_forms(base.forms, slot, stems_and_endings, do_combine_stem_ending, nil, nil,
iut.combine_footnotes(footnotes, base.all_footnotes))
end
local function add3(base, slot, stems1, stems2, endings, footnotes)
return add_multi(base, slot, {stems1, stems2, endings})
end
local function add4(base, slot, stems1, stems2, stems3, endings, footnotes)
return add_multi(base, slot, {stems1, stems2, stems3, endings})
end
local function add5(base, slot, stems1, stems2, stems3, stems4, endings, footnotes)
return add_multi(base, slot, {stems1, stems2, stems3, stems4, endings})
end
local function get_subii_note(base)
if base.from_headword then
-- don't include autogenerated note if from_headword, so it doesn't end up in the headword qualifiers
return nil
end
if past_subjunctive_single_word_preferred[base.base_verb] then
return {past_subjunctive_single_word_preferred_footnote}
elseif past_subjunctive_single_word_often_used[base.base_verb] then
return {past_subjunctive_single_word_often_used_footnote}
end
return {past_subjunctive_single_word_rare_footnote}
end
local function add_zu_infinitive(base)
if base.any_pre_pref then
local zu
if base.pre_pref == "" or base.pre_pref:find(" $") then
zu = "zu "
else
zu = "zu"
end
add(base, "zu_infinitive", base.pre_pref .. zu, base.bare_infinitive)
end
end
local function add_present(base, pretpres)
local stems = base.infstem
local stems23 = base.pres_23 or stems
local function doadd(slot_pref, form_pref)
-- Do forms based off the infinitive stem.
for _, stemform in ipairs(stems) do
local prefixed_stem = form_pref .. stemform.form
local syncopated_stem = base.unstressed_el_er and prefixed_stem:gsub("e([lr])$", "%1")
local function addit(slot, stem, ending, footnotes)
add(base, slot_pref .. slot, stem, ending .. (slot_pref == "" and base.post_pref or ""),
iut.combine_footnotes(footnotes, stemform.footnotes))
end
-- first singular present indicative
if not pretpres then -- pres_1s for preterite-present verbs used pres23 stem
if base.unstressed_el_er then
addit("pres_1s", syncopated_stem, "e")
addit("pres_1s", prefixed_stem, "e")
addit("pres_1s", prefixed_stem, "")
else
addit("pres_1s", prefixed_stem, "e")
end
end
-- plural present indicative
local e_in_2p = ends_in_dt(prefixed_stem) or base.unstressed_e_infix
if e_in_2p then
addit("pres_2p", prefixed_stem, "et")
else
addit("pres_2p", prefixed_stem, "t")
end
if base.unstressed_el_er or base.unstressed_erl then
addit("pres_1p", prefixed_stem, "n")
addit("pres_3p", prefixed_stem, "n")
else
addit("pres_1p", prefixed_stem, "en")
addit("pres_3p", prefixed_stem, "en")
end
-- subjunctive I
addit("subi_1s", prefixed_stem, "e")
addit("subi_2s", prefixed_stem, "est")
addit("subi_3s", prefixed_stem, "e")
addit("subi_2p", prefixed_stem, "et")
if base.unstressed_el_er then
addit("subi_1s", syncopated_stem, "e")
addit("subi_2s", syncopated_stem, "est")
addit("subi_3s", syncopated_stem, "e")
addit("subi_2p", syncopated_stem, "et")
end
if base.unstressed_el_er then
addit("subi_1p", prefixed_stem, "n")
addit("subi_3p", prefixed_stem, "n")
else
addit("subi_1p", prefixed_stem, "en")
addit("subi_3p", prefixed_stem, "en")
end
-- imperative plural; most preterite-present verbs don't have it, and [[wissen]] is handled below
if slot_pref == "" and not pretpres then
if e_in_2p then
addit("imp_2p", prefixed_stem, "et")
else
addit("imp_2p", prefixed_stem, "t")
end
end
end
-- Do forms based off of pres23 stem (also includes pres_1sg in preterite-present verbs).
for _, stem23form in ipairs(stems23) do
local prefixed_stem23 = form_pref .. stem23form.form
local function addit(slot, stem, ending, footnotes)
add(base, slot_pref .. slot, stem, ending .. (slot_pref == "" and base.post_pref or ""),
iut.combine_footnotes(footnotes, stem23form.footnotes))
end
if pretpres then
-- Totally different code for preterite-present singular and imperative.
addit("pres_1s", prefixed_stem23, "")
addit("pres_2s", prefixed_stem23, "st")
addit("pres_3s", prefixed_stem23, "")
if slot_pref == "" and base.base_verb == "wissen" then
-- Only [[wissen]] among the preterite-present verbs has an imperative.
addit("imp_2s", "wiss", "e")
-- dewikt mentions 'wisset' as an alternative, but not in Duden
addit("imp_2p", "wiss", "t")
end
else
-- Normal code path.
local stem23_is_same_as_stem
for _, stemform in ipairs(stems) do
if stemform.form == stem23form.form then
stem23_is_same_as_stem = true
break
end
end
-- present 2/3 singular
local e_in_23s = base.unstressed_e_infix or stem23_is_same_as_stem and ends_in_dt(prefixed_stem23)
if e_in_23s then
addit("pres_2s", prefixed_stem23, "est")
addit("pres_3s", prefixed_stem23, "et")
else
addit("pres_2s", prefixed_stem23, "st")
if prefixed_stem23:find("sch$") then
addit("pres_2s", prefixed_stem23, "t",
not base.from_headword and {schst_footnote} or nil)
end
addit("pres_3s", prefixed_stem23, "t")
end
-- imperative singular; this may or may not be based off the pres23 stem
-- Specifically, if the pres23 stem is different from the infinitive stem and does not have an ä or ö
-- in it ([[fahren]], er [[fährt]] but imperative [[fahr]]/[[fahre]]; [[stoßen]], er [[stößt]] but
-- imperative [[stoß]]/[[stoße]]), use it. Don't add -e unless '.longimp' is given (for [[sehen]], with
-- imperatives [[sieh]] and [[siehe]]; but normally [[geben]] with imperative only [[gib]], similarly
-- for [[treten]], [[gelten]], [[bergen]], [[etc.]]). In all other cases, use the infinitive stem, and
-- under normal circumstances include two variants, without -e and with -e. We include only the variant
-- with -e if '.e' is given ([[atmen]], [[zeichnen]], etc.), and we include only the variant without -e
-- if '.shortimp' is given (unclear if this is needed for any verb).
if slot_pref == "" then
if not rfind(prefixed_stem23, "[äö]") and not stem23_is_same_as_stem then
addit("imp_2s", prefixed_stem23, "")
if base.longimp then
addit("imp_2s", prefixed_stem23, "e")
end
else
assert(form_pref == "")
for _, stemform in ipairs(stems) do
local function addimp(stem, ending)
add(base, "imp_2s", stem, ending .. base.post_pref, stemform.footnotes)
end
local stem = stemform.form
if base.unstressed_el_er then
local syncopated_stem = stem:gsub("e([lr])$", "%1")
addimp(syncopated_stem, "e")
end
if base.unstressed_e_infix then
addimp(stem, "e")
elseif base.shortimp then
addimp(stem, "")
else
addimp(stem, "")
addimp(stem, "e")
end
end
end
end
end
end
end
-- Do the basic forms
doadd("", "")
-- Also do the subordinate clause forms if any alternants have a prefix.
if base.any_pre_pref then
doadd("subc_", base.pre_pref)
end
-- Do the miscellaneous non-finite forms
add3(base, "pres_part", base.pre_pref, base.bare_infinitive, "d")
add_zu_infinitive(base)
end
-- Add the past forms and/or subjunctive II forms. `is_past` should be true if we're conjugating the past tense
-- (not the past subjunctive), in which case the stems in `stem` should be the actual 1s/3s forms, ending in -te
-- or -de if weak. If `is_past` is false, we're conjugating the past subjunctive. In that case, the stems passed
-- in should include -e if that needs to be preserved in all forms (specifically, for [[spie]] past of [[speien]];
-- syncopated #'spist' is not allowed). (In practice, we chop off the final -e of explicitly user-specified past
-- subjunctive forms and otherwise pass in the actual past tense. This means that user-specified past subjunctives
-- in -te (e.g. [[brächte]]) will be passed in as 'brächt' but past subjunctives defaulted from the past tense
-- will be passed in e.g. as 'lachte'. This works because for stems in -t and -d, the result is the same.)
local function add_past_or_subii(base, slot_pref, stems, is_past)
local function doadd(full_slot_pref, form_pref)
for _, stemform in ipairs(stems) do
local prefixed_stem = form_pref .. stemform.form
local ends_in_e = prefixed_stem:find("e$")
-- Normally, the weak past tense ends in -te and the strong past does not end in -e. An exception is
-- [[spie]] (past tense of [[speien]]), which will be treated as weak (superseded spellings like
-- 'spieen' will not be generated).
local is_strong = is_past and not ends_in_e
prefixed_stem = prefixed_stem:gsub("e$", "")
local stem_ends_in_dt = ends_in_dt(prefixed_stem)
local function addit(slot, ending, footnotes)
local subii_footnotes
if full_slot_pref:find("subii") then
subii_footnotes = get_subii_note(base)
end
add(base, full_slot_pref .. slot, prefixed_stem, ending .. (full_slot_pref == slot_pref and base.post_pref or ""),
iut.combine_footnotes(subii_footnotes, iut.combine_footnotes(footnotes, stemform.footnotes)))
end
if is_strong then
addit("1s", "")
addit("3s", "")
if not stem_ends_in_dt then
if rfind(prefixed_stem, "[sxzß]$") then
addit("2s", "est")
end
addit("2s", "st")
addit("2p", "t")
else
-- bitten -> batest or batst, similarly for laden, raten, etc.
addit("2s", "est")
if not prefixed_stem:find("st$") then
-- bersten
addit("2s", "st")
end
addit("2p", "et")
end
else
-- Weak past and past subjunctive have same endings when ending in -d or -t (always the case for weak past).
addit("1s", "e")
addit("3s", "e")
if not stem_ends_in_dt and not ends_in_e then
addit("2s", "est") -- more formal; FIXME: should we footnote this?
addit("2p", "et") -- more formal; FIXME: should we footnote this?
addit("2s", "st")
addit("2p", "t")
else
addit("2s", "est")
addit("2p", "et")
end
end
-- Both pasts, as well as past subjunctive, have same endings in 1p and 3p.
addit("1p", "en")
addit("3p", "en")
end
end
-- Do the basic forms
doadd(slot_pref, "")
-- Also do the subordinate clause forms if any alternants have a prefix.
if base.any_pre_pref then
doadd("subc_" .. slot_pref, base.pre_pref)
end
end
local conjs = {}
local conjprops = {}
conjs["normal"] = function(base)
add_present(base)
add_past_or_subii(base, "pret_", base.past, "past")
add_past_or_subii(base, "subii_", base.past_sub or base.past)
end
conjs["pretpres"] = function(base)
add_present(base, "pretpres")
add_past_or_subii(base, "pret_", base.past, "past")
add_past_or_subii(base, "subii_", base.past_sub or base.past)
end
conjs["irreg"] = function(base)
local function doadd(slot_pref)
local function addit(slot, forms, footnotes)
if slot_pref == "" then
add3(base, slot, base.insep_prefix, forms, base.post_pref, footnotes)
else
add(base, slot_pref .. slot, base.pre_pref .. base.insep_prefix, forms, footnotes)
end
end
-- Do present, preterite, subjunctive I and II.
for _, slot_tense in ipairs({"pres", "pret", "subi", "subii"}) do
for index, forms in ipairs(base.irregverbobj[slot_tense]) do
local persnum = person_number_list[index]
local footnotes
if slot_tense == "subii" then
footnotes = get_subii_note(base)
end
addit(slot_tense .. "_" .. persnum, forms, footnotes)
end
end
-- Do imperative.
if slot_pref == "" then
for index, forms in ipairs(base.irregverbobj["imp"]) do
local persnum = imp_person_number_list[index]
addit("imp_" .. persnum, forms)
end
end
end
-- Do the basic forms
doadd("")
-- Also do the subordinate clause forms if any alternants have a prefix.
if base.any_pre_pref then
doadd("subc_")
end
-- Do the miscellaneous non-finite forms
iut.add_multiple_forms(base, "pp", {base.ge_prefix, base.insep_prefix, base.irregverbobj["pp"]},
-- We don't want to use combine_stem_ending because we want sein-sich indicators to be left alone,
-- so they get replaced later when constructing composed forms.
function(stem, ending) return stem .. ending end)
add(base, "perf_part", base.pre_pref, base.pp)
-- only [[werden]] by itself; not [[loswerden]], [[fertigwerden]], etc.
if base.lemma == "werden" then
iut.insert_form(base.forms, "perf_part", {form = "worden", footnotes = {"[เมื่อเป็นคำกริยานุเคราะห์]"}})
end
add(base, "pres_part", base.pre_pref .. base.insep_prefix, base.irregverbobj["presp"])
add_zu_infinitive(base)
end
local function add_composed_forms(base)
local forms = base.forms
local function add_composed(tense_mood, index, persnum, auxforms, participle, suffix, footnotes)
local pers_auxforms = iut.convert_to_general_list_form(auxforms[index])
local linked_pers_auxforms = iut.map_forms(pers_auxforms, function(form) return "[[" .. form .. "]] " end)
add4(base, tense_mood .. "_" .. persnum, linked_pers_auxforms, "[[" .. base.pre_pref, participle, "]]" .. suffix, footnotes)
end
local function add_composed_perf(tense_mood, index, persnum, haben_auxforms, sein_auxforms, haben_suffix, sein_suffix)
for _, auxform in ipairs(base.aux) do
if auxform.form == "haben" then
add_composed(tense_mood, index, persnum, haben_auxforms, base.pp, haben_suffix, auxform.footnotes)
end
if auxform.form == "sein" then
add_composed(tense_mood, index, persnum, sein_auxforms, base.pp, sein_suffix, auxform.footnotes)
end
end
end
local haben_forms = irreg_verbs["haben"]
local sein_forms = irreg_verbs["sein"]
local werden_forms = irreg_verbs["werden"]
for index, persnum in ipairs(person_number_list) do
add_composed_perf("perf_ind", index, persnum, haben_forms["pres"], sein_forms["pres"], "", "")
add_composed_perf("perf_sub", index, persnum, haben_forms["subi"], sein_forms["subi"], "", "")
add_composed_perf("plup_ind", index, persnum, haben_forms["pret"], sein_forms["pret"], "", "")
add_composed_perf("plup_sub", index, persnum, haben_forms["subii"], sein_forms["subii"], "", "")
for _, mood in ipairs({"ind", "subi", "subii"}) do
local tense = mood == "ind" and "pres" or mood
add_composed("futi_" .. mood, index, persnum, werden_forms[tense], base.bare_infinitive, "")
add_composed_perf("futii_" .. mood, index, persnum, werden_forms[tense], werden_forms[tense], " [[haben]]", " [[sein]]")
end
end
add3(base, "futi_inf", "[[" .. base.pre_pref, base.bare_infinitive, "]] [[werden]]")
add5(base, "futii_inf", "[[" .. base.pre_pref, base.pp, "]] [[", base.aux, "]] [[werden]]")
end
local function handle_derived_slots(base)
-- Compute linked versions of potential lemma slots, for use in {{de-verb}}.
-- We substitute the original lemma (before removing links) for forms that
-- are the same as the lemma, if the original lemma has links.
for _, slot in ipairs({"infinitive"}) do
iut.insert_forms(base.forms, slot .. "_linked", iut.map_forms(base.forms[slot], function(form)
if form == base.lemma and rfind(base.linked_lemma, "%[%[") then
return base.linked_lemma
else
return form
end
end))
end
end
local function conjugate_verb(base)
if not conjs[base.conj] then
error("Internal error: Unrecognized conjugation type '" .. base.conj .. "'")
end
conjs[base.conj](base)
add_composed_forms(base)
-- No overrides implemented currently.
-- process_slot_overrides(base)
handle_derived_slots(base)
end
local function parse_indicator_spec(angle_bracket_spec)
local base = {}
local function parse_err(msg)
error(msg .. ": " .. angle_bracket_spec)
end
local function fetch_footnotes(separated_group)
local footnotes
for j = 2, #separated_group - 1, 2 do
if separated_group[j + 1] ~= "" then
parse_err("Extraneous text after bracketed footnotes: '" .. table.concat(separated_group) .. "'")
end
if not footnotes then
footnotes = {}
end
table.insert(footnotes, separated_group[j])
end
return footnotes
end
local function fetch_specs(comma_separated_group, transform_form)
if not comma_separated_group then
return {{}}
end
local specs = {}
local colon_separated_groups = iut.split_alternating_runs(comma_separated_group, ":")
for _, colon_separated_group in ipairs(colon_separated_groups) do
local form = colon_separated_group[1]
if transform_form then
form = transform_form(form)
end
table.insert(specs, {form = form, footnotes = fetch_footnotes(colon_separated_group)})
end
return specs
end
local inside = angle_bracket_spec:match("^<(.*)>$")
assert(inside)
if inside == "" then
return base
end
local segments = iut.parse_balanced_segment_run(inside, "[", "]")
local dot_separated_groups = iut.split_alternating_runs(segments, "%.")
for i, dot_separated_group in ipairs(dot_separated_groups) do
local comma_separated_groups = iut.split_alternating_runs(dot_separated_group, "%s*[,#]%s*", "preserve splitchar")
local first_element = comma_separated_groups[1][1]
if first_element == "haben" or first_element == "sein" then
for j = 1, #comma_separated_groups, 2 do
if j > 1 and strip_spaces(comma_separated_groups[j - 1][1]) ~= "," then
parse_err("Separator of # not allowed with haben or sein")
end
local aux = comma_separated_groups[j][1]
if aux ~= "haben" and aux ~= "sein" then
parse_err("Unrecognized auxiliary '" .. aux .. "'")
end
if base.aux then
for _, existing_aux in ipairs(base.aux) do
if existing_aux.form == aux then
parse_err("Auxiliary '" .. aux .. "' specified twice")
end
end
else
base.aux = {}
end
table.insert(base.aux, {form = aux, footnotes = fetch_footnotes(comma_separated_groups[j])})
end
elseif first_element == "-ge" or first_element == "+ge" then
for j = 1, #comma_separated_groups, 2 do
if j > 1 and strip_spaces(comma_separated_groups[j - 1][1]) ~= "," then
parse_err("Separator of # not allowed with +ge or -ge")
end
local prefix = comma_separated_groups[j][1]
if prefix ~= "+ge" and prefix ~= "-ge" then
parse_err("Unrecognized ge- prefix '" .. prefix .. "'")
end
local ge_prefix
if prefix == "+ge" then
ge_prefix = "ge"
else
ge_prefix = ""
end
if base.ge_prefix then
for _, existing_prefix in ipairs(base.ge_prefix) do
if existing_prefix.form == ge_prefix then
parse_err("Ge- prefix '" .. prefix .. "' specified twice")
end
end
else
base.ge_prefix = {}
end
table.insert(base.ge_prefix, {form = ge_prefix, footnotes = fetch_footnotes(comma_separated_groups[j])})
end
elseif #comma_separated_groups > 1 then
-- principal parts specified
if base.past then
parse_err("Can't specify principal parts twice")
end
local parts = {}
assert(#comma_separated_groups[2] == 1)
local past_index
local first_separator = strip_spaces(comma_separated_groups[2][1])
if first_separator == "#" then
-- present 3rd singular specified
base.pres_23 = fetch_specs(comma_separated_groups[1], function(form)
local stem
if base.conj == "pretpres" then
stem = form
else
stem = form:match("^(.-)%-$")
if not stem then
stem = form:match("^(.-)e?t$")
end
end
if stem then
return stem
else
parse_err("Present 3sg form '" .. form .. "' should end in - (for the stem) or -t")
end
end)
past_index = 3
else
past_index = 1
end
base.past = fetch_specs(comma_separated_groups[past_index], function(form)
return form
end)
if #comma_separated_groups < past_index + 2 then
parse_err("Missing past participle spec")
end
assert(#comma_separated_groups[past_index + 1] == 1)
if strip_spaces(comma_separated_groups[past_index + 1][1]) ~= "," then
parse_err("Only first separator can be a #")
end
base.pp = fetch_specs(comma_separated_groups[past_index + 2], function(form)
if form:find("e[nd]$") or form:find("t$") then
return form
else
parse_err("Past participle '" .. form .. "' should end in -en, -t, or -ed")
end
end)
if #comma_separated_groups > past_index + 2 then
assert(#comma_separated_groups[past_index + 3] == 1)
if strip_spaces(comma_separated_groups[past_index + 3][1]) ~= "," then
parse_err("Only first separator can be a #")
end
base.past_sub = fetch_specs(comma_separated_groups[past_index + 4], function(form)
local stem = form:match("^(.-)e$")
if not stem then
parse_err("Past subjunctive '" .. form .. "' should end in -e")
end
return stem
end)
if #comma_separated_groups > past_index + 4 then
parse_err("Too many specs given")
end
end
elseif first_element == "pretpres" or first_element == "irreg" then
if #comma_separated_groups[1] > 1 then
parse_err("No footnotes allowed with '" .. first_element .. "' spec")
end
if base.conj then
parse_err("Conjugation specified as '" .. first_element .. "' but already specified or autodetermined as '" .. base.conj .. "'")
end
base.conj = first_element
elseif first_element == "einfix" or first_element == "-einfix" then
if #comma_separated_groups[1] > 1 then
parse_err("No footnotes allowed with '" .. first_element .. "' spec")
end
base.unstressed_e_infix = first_element == "einfix"
elseif first_element == "shortimp" or first_element == "longimp" or
first_element == "only3s" or first_element == "only3sp" or
first_element == "nofinite" or first_element == "nosplitprefix" then
if #comma_separated_groups[1] > 1 then
parse_err("No footnotes allowed with '" .. first_element .. "' spec")
end
base[first_element] = true
elseif first_element == "" or first_element == "inf" then
local footnotes = fetch_footnotes(comma_separated_groups[1])
if not footnotes then
parse_err("Empty spec and 'inf' spec without footnotes not allowed")
end
if first_element == "inf" then
base.infstem_footnotes = footnotes
else
base.all_footnotes = footnotes
end
else
parse_err("Unrecognized spec '" .. comma_separated_groups[1][1] .. "'")
end
end
return base
end
-- Normalize all lemmas, splitting off separable prefixes and substituting the pagename for blank lemmas.
local function normalize_all_lemmas(alternant_multiword_spec, from_headword)
local any_pre_pref
iut.map_word_specs(alternant_multiword_spec, function(base)
if base.lemma == "" then
local PAGENAME = mw.title.getCurrentTitle().text
base.lemma = PAGENAME
end
if base.lemma:find("_") and not base.lemma:find("%[%[") then
-- If lemma is multiword and has no links, add links automatically.
base.lemma= "[[" .. base.lemma:gsub("_", "]]_[[") .. "]]"
end
base.orig_lemma = base.lemma
base.orig_lemma_no_links = m_links.remove_links(base.lemma)
-- Normalize the linked lemma by removing dot, underscore, and <pron> and such indicators.
base.linked_lemma = remove_sein_sich_indicators(base.lemma:gsub("%.", ""):gsub("_", " "))
base.lemma = m_links.remove_links(base.linked_lemma)
local lemma = base.orig_lemma_no_links
base.pre_pref, base.post_pref = "", ""
local prefix, verb = lemma:match("^(.*)_(.-)$")
if prefix then
prefix = prefix:gsub("_", " ") -- in case of multiple preceding words
base.pre_pref = base.pre_pref .. prefix .. " "
base.post_pref = base.post_pref .. " " .. prefix
else
verb = lemma
end
prefix, base.base_verb = verb:match("^(.*)%.(.-)$")
if prefix then
-- There may be multiple separable prefixes (e.g. [[wiedergutmachen]], ich mache wieder gut)
base.pre_pref = base.pre_pref .. prefix:gsub("%.", "")
base.post_pref = base.post_pref .. " " .. prefix:gsub("%.", " ")
else
base.base_verb = verb
end
if base.pre_pref ~= "" then
any_pre_pref = true
end
if base.only3s then
alternant_multiword_spec.only3s = true
end
if base.only3sp then
alternant_multiword_spec.only3sp = true
end
-- Remove <pron> indicators and such.
local reconstructed_lemma = remove_sein_sich_indicators(base.pre_pref .. base.base_verb)
if reconstructed_lemma ~= base.lemma then
error("Internal error: Raw lemma '" .. base.lemma .. "' differs from reconstructed lemma '" .. reconstructed_lemma .. "'")
end
base.from_headword = from_headword
end)
if any_pre_pref then
iut.map_word_specs(alternant_multiword_spec, function(base)
base.any_pre_pref = true
end)
end
if alternant_multiword_spec.only3s then
iut.map_word_specs(alternant_multiword_spec, function(base)
if not base.only3s then
error("If some alternants specify 'only3s', all must")
end
end)
end
if alternant_multiword_spec.only3sp then
iut.map_word_specs(alternant_multiword_spec, function(base)
if not base.only3sp then
error("If some alternants specify 'only3sp', all must")
end
end)
end
end
local function detect_verb_type(base, verb_types)
local this_verb_types = {}
local function set_verb_type()
base.verb_types = this_verb_types
if verb_types then
for _, verb_type in ipairs(this_verb_types) do
m_table.insertIfNot(verb_types, verb_type)
end
end
end
if base.conj == "pretpres" then
m_table.insertIfNot(this_verb_types, "pretpres")
set_verb_type()
return
elseif base.conj == "irreg" then
m_table.insertIfNot(this_verb_types, "irreg")
set_verb_type()
return
end
local infstem = m_table.deepCopy(base.infstem)
local past = m_table.deepCopy(base.past)
local pp = m_table.deepCopy(base.pp)
local function matches_forms(forms, expected, ending_to_chop)
expected = expected:gsub("C", not_vowel_c) .. "$"
local seen = false
for _, form in ipairs(forms) do
local stem
if ending_to_chop then
stem = rmatch(form.form, "^(.*)" .. ending_to_chop .. "$")
else
stem = form.form
end
if stem and rfind("#" .. stem, expected) then
seen = true
form.seen = form.seen or "maybe"
end
end
return seen
end
local function reset_maybes(forms, value)
for _, form in ipairs(forms) do
if form.seen == "maybe" then
form.seen = value
end
end
end
local function reset_all_maybes(value)
reset_maybes(infstem, value)
reset_maybes(past, value)
reset_maybes(pp, value)
end
local function has_unseen_weak_pp()
for _, form in ipairs(pp) do
if not form.seen and form.form:find("[dt]$") then
return true
end
end
return false
end
local function has_unseen_strong_pp()
for _, form in ipairs(pp) do
if not form.seen and form.form:find("n$") then
return true
end
end
return false
end
local function check(verbtype, infre, pastre, ppre, exclude)
if exclude then
for _, form in ipairs(infstem) do
if exclude(form.form) then
return
end
end
end
if matches_forms(infstem, infre) and
matches_forms(past, pastre) and
matches_forms(pp, ppre, "en") then
m_table.insertIfNot(this_verb_types, verbtype)
reset_all_maybes(true)
else
reset_all_maybes(false)
end
end
local function check_strong()
check("1", "Ce[iy]C*", "CieC*", "Cie?C*") -- beigen, bleiben, gedeihen, leihen, meiden, preisen, reiben, reihen,
-- scheiden, scheinen, schreiben, schreien, schweigen, speiben, speien, speisen, steigen, treiben, weisen,
-- zeihen; use 'Cie?C*' for past participle to handle 'schrien', 'spien'
check("1", "Ce[iy]C*", "CiC*", "CiC*") -- beißen/beissen/beyßen/beyssen, bleichen, fleißen/fleissen, gleichen,
-- gleiten, greifen, kneifen, kreischen, leiden, pfeifen, reißen/reissen, reiten, scheißen/scheissen,
-- schleichen, schleifen, schleißen/schleissen, schmeißen/schmeissen, schneiden/schneyden, schreiten,
-- spleißen/spleissen, streichen, streiten, weichen
check("2", "CieC*", "CoC*", "CoC*") -- biegen, bieten, fliegen, fliehen, fließen/fliessen, frieren,
-- genießen/geniessen, gießen/giessen, kiesen, kriechen, riechen, schieben, schießen/schiessen, schliefen,
-- schließen/schliessen, sieden, sprießen/spriessen, stieben, triefen, verdrießen/verdriessen, verlieren,
-- wiegen, ziehen
check("2", "CauC*", "CoC*", "CoC*") -- krauchen, saufen, saugen
check("2", "CüC", "CoC", "CoC") -- lügen, trügen
local function exclude_nehmen_sprechen(form)
-- need to exclude nehmen, stehlen, befehlen/empfehlen, sprechen, brechen, stechen
return rfind(form, vowel_c .. "ch$") or rfind(form, vowel_c .. "h" .. not_vowel_c .. "$")
end
check("3", "C[ei]CC+", "CaCC+", "C[ou]CC+", exclude_nehmen_sprechen) -- [with e, + o in pp]: bergen, bersten,
-- gelten, helfen, schelten, sterben, verderben, werben, werfen; [with i, + u in pp]: binden, brinnen, dringen,
-- finden, gelingen, klingen, misslingen, ringen, schlingen, schwinden, schwingen, singen, sinken, springen,
-- stinken, trinken, winden, wringen, zwingen; [with i, + o in pp]: rinnen, gewinnen, schwimmen, sinnen,
-- spinnen
check("3", "C[eiaö]CC+", "CoCC+", "CoCC+", exclude_nehmen_sprechen)
-- [with e]: dreschen, fechten, flechten, melken, quellen, schmelzen, schwellen; [with i]: glimmen, klimmen;
-- [with a]: schallen (geschallt), erschallen; [with ö]: erlöschen
check("3", "quell", "quoll", "quoll") -- need to special-case quellen due to u preceding e
check("3", "schind", "schund", "schund") -- need to special-case due to 'u' in past
check("4", "C[eäo]C*", "Cah?Ch?", "CoC*") -- [with e]: befehlen, brechen, schrecken, nehmen, sprechen, stechen,
-- stecken (gesteckt), stehlen, treffen; [with ä]: gebären; [with o]: kommen
check("4", "C[äe]C", "Coh?C", "Coh?C", function(form) return form:find("heb$") end)
-- [with ä]: gären, wägen, schwären; [with e]: bewegen, weben, scheren (but not heben)
check("5", "C[ei]C*", "CaC", "CeC*") -- [with e, one C]: geben, genesen, geschehen, lesen, meßen, sehen, treten;
-- [with e, two C]: essen, fressen, messen, vergessen; [with i, two C]: bitten, sitzen
check("5", "C[ei]C*", "Cass", "Cess") -- essen, fressen, messen, sitzen in Swiss spelling
check("5", "CieC", "CaC", "CeC") -- liegen
check("6", "CaC*", "CuC*", "CaC*") -- backen, fragen (gefragt), graben, laden, mahlen, schaffen, schlagen,
-- tragen, wachsen, waschen
check("6", "heb", "h[ou]b", "hob") -- we need to special-case this because heben (class 6 per Wikipedia) has the
-- exact same vowels as weben (class 4 per Wikipedia)
check("6", "schwör", "schw[ou]r", "schwor") -- only strong verb with these vowels
check("7", "CaC*", "CieC*", "CaC*") -- blasen, braten, fallen, halten, lassen, raten/rathen, schlafen
check("7", "C[aäe]C*", "CiC*", "CaC*") -- [with a]: fangen; [with ä]: hängen; [with e]: gehen
check("7", "Ce[iy]C*", "CieC*", "Ce[iy]C*") -- heißen/heissen/heyßen/heyssen
check("7", "CauC*", "CieC*", "CauC*") -- hauen, laufen
check("7", "CoC*", "CieC*", "CoC*") -- stoßen/stossen
check("7", "CuC*", "CieC*", "CuC*") -- rufen
end
for _, form in ipairs(past) do
local past_stem = form.form:match("^(.*)te$")
if past_stem then
if matches_forms(infstem, "#" .. past_stem) then
-- Need to run matches_forms() on all possibilities even if earlier ones match,
-- to mark the seen forms correctly.
local matches_pp = matches_forms(pp, "#" .. past_stem .. "t")
matches_pp = matches_forms(pp, "#ge" .. past_stem .. "t") or matches_pp
if matches_pp then
m_table.insertIfNot(this_verb_types, "weak")
form.seen = true
reset_all_maybes(true)
else
reset_all_maybes(false)
end
end
end
if not form.seen and form.form:find("ete$") then
if matches_forms(infstem, "#" .. past_stem:gsub("e$", "")) then
-- Need to run matches_forms() on all possibilities even if earlier ones match,
-- to mark the seen forms correctly.
local matches_pp = matches_forms(pp, "#" .. past_stem .. "t")
matches_pp = matches_forms(pp, "#ge" .. past_stem .. "t") or matches_pp
matches_pp = matches_forms(pp, "#" .. past_stem .. "d") or matches_pp
matches_pp = matches_forms(pp, "#ge" .. past_stem .. "d") or matches_pp
if matches_pp then
m_table.insertIfNot(this_verb_types, "weak")
form.seen = true
reset_all_maybes(true)
else
reset_all_maybes(false)
end
end
end
if past_stem and not form.seen then
if not has_unseen_weak_pp() and has_unseen_strong_pp() then
m_table.insertIfNot(this_verb_types, "mixed")
else
m_table.insertIfNot(this_verb_types, "irregweak")
end
matches_forms(pp, "#" .. past_stem .. "t")
matches_forms(pp, "#ge" .. past_stem .. "t")
form.seen = true
reset_all_maybes(true)
end
if not form.seen then
check_strong()
end
if not form.seen then
if not has_unseen_strong_pp() and has_unseen_weak_pp() then
m_table.insertIfNot(this_verb_types, "mixed")
else
m_table.insertIfNot(this_verb_types, "irregstrong")
end
end
end
for _, form in ipairs(pp) do
if not form.seen then
if form.form:find("n$") then
if m_table.contains(this_verb_types, "strong") then
m_table.insertIfNot(this_verb_types, "irregstrong")
elseif m_table.contains(this_verb_types, "weak") then
m_table.insertIfNot(this_verb_types, "mixed")
end
elseif form.form:find("[dt]$") then
if m_table.contains(this_verb_types, "weak") then
m_table.insertIfNot(this_verb_types, "irregweak")
elseif m_table.contains(this_verb_types, "strong") then
m_table.insertIfNot(this_verb_types, "mixed")
end
end
end
end
base.verb_types = this_verb_types
if verb_types then
for _, verb_type in ipairs(this_verb_types) do
m_table.insertIfNot(verb_types, verb_type)
end
end
set_verb_type()
end
local function detect_indicator_spec(base)
base.forms = {}
base.aux = base.aux or {{form = "haben"}}
base.bare_infinitive = {{form = base.base_verb, footnotes = base.infstem_footnotes}}
add(base, "infinitive", base.pre_pref, base.bare_infinitive)
if base.only3s and base.only3sp then
error("'only3s' and 'only3sp' cannot both be specified")
end
if base.conj == "irreg" then
for irregverb, verbobj in pairs(irreg_verbs) do
base.insep_prefix = base.base_verb:match("^(.-)" .. irregverb .. "$")
if base.insep_prefix then
base.irregverb = irregverb
base.irregverbobj = verbobj
if not base.ge_prefix then
if base.insep_prefix ~= "" then
base.ge_prefix = {{form = ""}}
else
base.ge_prefix = {{form = "ge"}}
end
end
return
end
end
error("Unrecognized irregular base verb '" .. base.base_verb .. "'")
end
-- The following applies to everything but 'irreg' verbs.
local infstem, infroot = base.base_verb:match("^((.*)e[lr])n$")
if infstem then
base.unstressed_el_er = true
else
infstem, infroot = base.base_verb:match("^((.*)erl)n$") -- [[fensterln]]
if infstem then
base.unstressed_erl = true
else
infstem = base.base_verb:match("^(.*)en$")
infroot = infstem
if not infstem then
error("Unrecognized infinitive, should end in -en, -eln, -ern or -erln: '" .. base.base_verb .. "'")
end
end
end
base.infstem = {{form = infstem, footnotes = base.infstem_footnotes}}
if base.unstressed_e_infix == nil then
-- Autodetect whether we need an -e- infix in the pres_2s and pres_3s ([[atmen]], [[eignen]], etc.).
-- Almost all such cases have -Cmen or -Cnen where C is a consonant other than r or l and other than the
-- following m or n (hence [[meinen]], [[lernen]], [[filmen]], [[schwimmen]] should be excluded); we also
-- need to exclue -Vhmen and -Vhnen ([[wohnen]], [[rühmen]]), but not -Chmen and -Chnen ([[zeichnen]]).
if base.base_verb:find("[mn]en$") and not base.base_verb:find("([mn])%1en$") and
not rfind(base.base_verb, vowel_c .. "[hrl]?[mn]en$") then
base.unstressed_e_infix = true
end
end
if not base.conj then
base.conj = "normal"
end
if base.conj == "normal" then
local weak_past
if not base.past then
if base.unstressed_e_infix or ends_in_dt(infstem) then
weak_past = infstem .. "et"
else
weak_past = infstem .. "t"
end
base.past = {{form = weak_past .. "e"}}
end
if not base.pp then
if not weak_past then
error("Internal error: past was explicitly given but not past participle")
end
if not base.ge_prefix then
local no_ge
for _, insep_prefix in ipairs(inseparable_prefixes) do
-- There must be a vowel following the inseparable prefix; excludes beben, bechern, belfern, bellen, bessern,
-- beten, betteln, betten, erben, erden, ernten, erzen, entern, gecken, gehren, gellen, gerben, geten, missen,
-- zergen, zerren, etc.
if rfind(infroot, "^" .. insep_prefix .. ".*" .. vowel_c .. ".*") and
-- Exclude cases like beigen, beichten, beugen, beulen, geifern; this also wrongly excludes
-- beirren, which needs -ge.
not rfind(infroot, "^[bg]e[iu]" .. not_vowel_c .. "*$") then
no_ge = true
break
end
-- Check for -ier preceded by a vowel (excludes bieren, frieren, gieren, schmieren, stieren, zieren, etc.)
if not base.unstressed_el_er and not base.unstressed_erl and rfind(infroot, "^.*" .. vowel_c .. ".*ier$") then
no_ge = true
break
end
end
if no_ge then
base.ge_prefix = {{form = ""}}
else
base.ge_prefix = {{form = "ge"}}
end
end
base.pp = iut.map_forms(base.ge_prefix, function(form)
if base.unstressed_el_er or base.unstressed_erl then
return form .. base.base_verb:gsub("n$", "") .. "t"
else
return form .. weak_past
end
end)
end
else
if not base.pp then
error("For '" .. base.conj .. "' type verbs, past participle must be explicitly given")
end
end
add(base, "perf_part", base.pre_pref, base.pp)
end
local function detect_all_indicator_specs(alternant_multiword_spec)
iut.map_word_specs(alternant_multiword_spec, function(base)
detect_indicator_spec(base)
detect_verb_type(base)
end)
end
-- Set the overall auxiliary or auxiliaries. We can't do this using the normal inflection
-- code as it will produce e.g. '[[haben]] und [[haben]]' for conjoined verbs.
local function compute_auxiliary(alternant_multiword_spec)
iut.map_word_specs(alternant_multiword_spec, function(base)
iut.insert_forms(alternant_multiword_spec.forms, "aux", base.aux)
end)
end
function export.process_verb_classes(classes)
local class_descs = {}
local cats = {}
local function insert_desc(desc)
m_table.insertIfNot(class_descs, desc)
end
local function insert_cat(cat)
m_table.insertIfNot(cats, cat .. "ภาษาเยอรมัน")
end
for _, class in ipairs(classes) do
if class == "weak" then
insert_desc("[[ภาคผนวก:อภิธานศัพท์#คำกริยาอ่อน|อ่อน]]")
insert_cat("คำกริยาอ่อน")
elseif class == "irregweak" then
insert_desc("[[ภาคผนวก:อภิธานศัพท์#คำกริยาอ่อน|อ่อน]], [[ภาคผนวก:อภิธานศัพท์#ไม่ปรกติ|ไม่ปรกติ]]")
insert_cat("คำกริยาอ่อน")
insert_cat("คำกริยาอ่อนไม่ปรกติ")
elseif class == "pretpres" then
insert_desc("[[Appendix:Glossary#preterite-present verb|preterite-present]]")
insert_cat("preterite-present verbs")
elseif class == "irreg" then
insert_desc("[[ภาคผนวก:อภิธานศัพท์#ไม่ปรกติ|ไม่ปรกติ]]")
insert_cat("คำกริยาไม่ปรกติ")
elseif class == "mixed" then
insert_desc("คำกริยาผสม")
insert_cat("คำกริยาผสม")
elseif class == "irregstrong" then
insert_desc("[[ภาคผนวก:อภิธานศัพท์#คำกริยาแข็ง|แข็ง]], [[ภาคผนวก:อภิธานศัพท์#ไม่ปรกติ|ไม่ปรกติ]]")
insert_cat("คำกริยาแข็ง")
insert_cat("คำกริยาแข็งไม่ปรกติ")
elseif class:find("^[1-7]$") then
insert_desc("[[ภาคผนวก:อภิธานศัพท์#คำกริยาแข็ง|แข็ง]], กลุ่ม " .. class)
insert_cat("คำกริยาแข็ง")
insert_cat("คำกริยาแข็งกลุ่ม " .. class .. " ")
else
error("คำกริยาไม่ทราบกลุ่ม '" .. class .. "'")
end
end
return class_descs, cats
end
local function add_categories_and_annotation(alternant_multiword_spec, base, from_headword, manual)
local function insert_cat(full_cat)
m_table.insertIfNot(alternant_multiword_spec.categories, full_cat)
end
if not from_headword then
for _, slot_and_accel in ipairs(all_verb_slots) do
local slot = slot_and_accel[1]
local forms = base.forms[slot]
local must_break = false
if forms then
for _, form in ipairs(forms) do
if not form.form:find("%[%[") then
local title = mw.title.new(form.form)
if title and not title.exists then
insert_cat("คำกริยาที่มีลิงก์แดงในตารางการผันรูปภาษาเยอรมัน")
must_break = true
break
end
end
end
end
if must_break then
break
end
end
end
if manual then
return
end
local class_descs, cats = export.process_verb_classes(base.verb_types)
for _, desc in ipairs(class_descs) do
m_table.insertIfNot(alternant_multiword_spec.verb_types, desc)
end
-- Don't place multiword terms in categories like 'German class 4 strong verbs' to avoid spamming the
-- categories with such terms.
if from_headword and not base.lemma:find(" ") then
for _, cat in ipairs(cats) do
insert_cat(cat)
end
end
for _, aux in ipairs(base.aux) do
m_table.insertIfNot(alternant_multiword_spec.auxiliaries, link_term(aux.form, "term"))
if from_headword and not base.lemma:find(" ") then -- see above
insert_cat("คำกริยาที่ใช้ " .. aux.form .. " เป็นคำกริยานุเคราะห์ภาษาเยอรมัน")
-- Set flags for use below in adding 'German verbs using haben and sein as auxiliary'
alternant_multiword_spec["saw_" .. aux.form] = true
end
end
end
-- Compute the categories to add the verb to, as well as the annotation to display in the
-- conjugation title bar. We combine the code to do these functions as both categories and
-- title bar contain similar information.
local function compute_categories_and_annotation(alternant_multiword_spec, from_headword, manual)
alternant_multiword_spec.categories = {}
alternant_multiword_spec.verb_types = {}
alternant_multiword_spec.auxiliaries = {}
iut.map_word_specs(alternant_multiword_spec, function(base)
add_categories_and_annotation(alternant_multiword_spec, base, from_headword)
end)
if manual then
alternant_multiword_spec.annotation = ""
return
end
local ann_parts = {}
table.insert(ann_parts, table.concat(alternant_multiword_spec.verb_types, " หรือ "))
if #alternant_multiword_spec.auxiliaries > 0 then
table.insert(ann_parts, ", คำกริยานุเคราะห์ " .. table.concat(alternant_multiword_spec.auxiliaries, " หรือ "))
end
if from_headword and alternant_multiword_spec.saw_haben and alternant_multiword_spec.saw_sein then
m_table.insertIfNot(alternant_multiword_spec.categories, "คำกริยาที่ใช้ haben และ sein เป็นคำกริยานุเคราะห์ภาษาเยอรมัน")
end
alternant_multiword_spec.annotation = table.concat(ann_parts)
end
local function show_forms(alternant_multiword_spec)
local lemmas = iut.map_forms(alternant_multiword_spec.forms.infinitive,
remove_sein_sich_indicators)
alternant_multiword_spec.lemmas = lemmas -- save for later use in make_table()
local linked_pronouns = {}
for index, pronoun in ipairs(pronouns) do
-- use 'es' instead of 'er' for 3s-only verbs
if index == 3 and alternant_multiword_spec.only3s then
linked_pronouns[index] = link_term("es")
else
linked_pronouns[index] = link_term(pronoun)
end
end
dass = link_term("dass") .. " "
local function generate_link(data)
local link = m_links.full_link {
lang = lang, term = data.form.formval_for_link, tr = "-", accel = data.form.accel_obj
}
local footnote_text = iut.get_footnote_text(data.form.footnotes, data.footnote_obj)
local persnum = data.slot:match("^imp_(2[sp])$")
if persnum then
link = link .. " (" .. linked_pronouns[persnum_to_index[persnum]] .. ")"
else
persnum = data.slot:match("^.*_([123][sp])$")
if persnum then
link = linked_pronouns[persnum_to_index[persnum]] .. " " .. link
end
if data.slot:find("^subc_") then
link = dass .. link
end
end
return link .. footnote_text
end
local function join_spans(data)
if data.slot == "aux" then
return table.concat(data.formval_spans, " หรือ ")
else
return table.concat(data.formval_spans, "<br />")
end
end
local props = {
lang = lang,
lemmas = lemmas,
generate_link = generate_link,
join_spans = join_spans,
}
props.slot_list = verb_slots_basic
iut.show_forms(alternant_multiword_spec.forms, props)
alternant_multiword_spec.footnote_basic = alternant_multiword_spec.forms.footnote
props.slot_list = verb_slots_subordinate_clause
iut.show_forms(alternant_multiword_spec.forms, props)
alternant_multiword_spec.footnote_subordinate_clause = alternant_multiword_spec.forms.footnote
props.slot_list = verb_slots_composed
iut.show_forms(alternant_multiword_spec.forms, props)
alternant_multiword_spec.footnote_composed = alternant_multiword_spec.forms.footnote
end
local notes_template = [=[
<div style="width:100%;text-align:left;background:#d9ebff">
<div style="display:inline-block;text-align:left;padding-left:1em;padding-right:1em">
{footnote}
</div></div>
]=]
local zu_infinitive_table = [=[
|-
! colspan="2" style="background:#d0d0d0" | รูปกริยากลาง zu
| colspan="4" | {zu_infinitive}
]=]
local basic_table = [=[
<div class="NavFrame" style="">
<div class="NavHead" style="">การผันรูปของ {title}</div>
<div class="NavContent">
{\op}| border="1px solid #000000" style="border-collapse:collapse; background:#fafafa; text-align:center; width:100%" class="inflection-table"
|-
! colspan="2" style="background:#d0d0d0" | <span title="Infinitiv">รูปกริยากลาง</span>
| colspan="4" | {infinitive}
|-
! colspan="2" style="background:#d0d0d0" | <span title="Partizip I (Partizip Präsens)">รูปกริยาขยายปัจจุบันกาล</span>
| colspan="4" | {pres_part}
|-
! colspan="2" style="background:#d0d0d0" | <span title="Partizip II (Partizip Perfekt)">รูปกริยาขยายอดีตกาล</span>
| colspan="4" | {perf_part}
{zu_infinitive_table}|-
! colspan="2" style="background:#d0d0d0" | <span title="Hilfsverb">คำกริยานุเคราะห์</span>
| colspan="4" | {aux}
|-
| rowspan="2" style="background:#a0ade3" |
! colspan="2" style="background:#a0ade3" | <span title="Indikativ">มาลาบอกเล่า</span>
| rowspan="2" style="background:#a0ade3" |
! colspan="2" style="background:#a0ade3" | <span title="Konjunktiv">มาลาสมมุติ</span>
|-
! style="background:#a0ade3" | เอกพจน์
! style="background:#a0ade3" | พหูพจน์
! style="background:#a0ade3" | เอกพจน์
! style="background:#a0ade3" | พหูพจน์
|-
! rowspan="3" style="background:#c0cfe4; width:7em" | <span title="Präsens">ปัจจุบันกาล</span>
| {pres_1s}
| {pres_1p}
! rowspan="3" style="background:#c0cfe4; width:7em" | <span title="Konjunktiv I (Konjunktiv Präsens)">I</span>
| {subi_1s}
| {subi_1p}
|-
| {pres_2s}
| {pres_2p}
| {subi_2s}
| {subi_2p}
|-
| {pres_3s}
| {pres_3p}
| {subi_3s}
| {subi_3p}
|-
| colspan="6" style="background:#d5d5d5; height: .25em" |
|-
! rowspan="3" style="background:#c0cfe4" | <span title="Präteritum">อดีตกาล</span>
| {pret_1s}
| {pret_1p}
! rowspan="3" style="background:#c0cfe4" | <span title="Konjunktiv II (Konjunktiv Präteritum)">II</span>
| {subii_1s}
| {subii_1p}
|-
| {pret_2s}
| {pret_2p}
| {subii_2s}
| {subii_2p}
|-
| {pret_3s}
| {pret_3p}
| {subii_3s}
| {subii_3p}
|-
| colspan="6" style="background:#d5d5d5; height: .25em" |
|-
! style="background:#c0cfe4" | <span title="Imperativ">มาลาสั่ง</span>
| {imp_2s}
| {imp_2p}
| colspan="3" style="background:#e0e0e0" |
|{\cl}{notes_clause}</div></div>
]=]
local subordinate_clause_table = [=[
<div class="NavFrame" style="">
<div class="NavHead" style="">รูปกริยา {title} เมื่ออยู่ในอนุประโยค</div>
<div class="NavContent">
{\op}| border="1px solid #000000" style="border-collapse:collapse; background:#fafafa; text-align:center; width:100%" class="inflection-table"
|-
| style="background:#a0ade3" |
! colspan="2" style="background:#a0ade3" | <span title="Indikativ">มาลาบอกเล่า</span>
| style="background:#a0ade3" |
! colspan="2" style="background:#a0ade3" | <span title="Konjunktiv">มาลาสมมุติ</span>
|-
! rowspan="3" style="background:#c0cfe4; width:7em" | <span title="Präsens">ปัจจุบัน</span>
| {subc_pres_1s}
| {subc_pres_1p}
! rowspan="3" style="background:#c0cfe4; width:7em" | <span title="Konjunktiv I (Konjunktiv Präsens)">I</span>
| {subc_subi_1s}
| {subc_subi_1p}
|-
| {subc_pres_2s}
| {subc_pres_2p}
| {subc_subi_2s}
| {subc_subi_2p}
|-
| {subc_pres_3s}
| {subc_pres_3p}
| {subc_subi_3s}
| {subc_subi_3p}
|-
| colspan="6" style="background:#d5d5d5; height: .25em" |
|-
! rowspan="3" style="background:#c0cfe4" | <span title="Präteritum">อดีต</span>
| {subc_pret_1s}
| {subc_pret_1p}
! rowspan="3" style="background:#c0cfe4" | <span title="Konjunktiv II (Konjunktiv Präteritum)">II</span>
| {subc_subii_1s}
| {subc_subii_1p}
|-
| {subc_pret_2s}
| {subc_pret_2p}
| {subc_subii_2s}
| {subc_subii_2p}
|-
| {subc_pret_3s}
| {subc_pret_3p}
| {subc_subii_3s}
| {subc_subii_3p}
|{\cl}{notes_clause}</div></div>
]=]
local composed_table = [=[
<div class="NavFrame" style="">
<div class="NavHead" style="">รูปประกอบของคำกริยา {title}</div>
<div class="NavContent">
{\op}| border="1px solid #000000" style="border-collapse:collapse; background:#fafafa; text-align:center; width:100%" class="inflection-table"
|-
! colspan="6" style="background:#99cc99" | <span title="Perfekt">การณ์ลักษณะสมบูรณ์</span>
|-
! style="background:#99cc99" |
! style="background:#99cc99" | เอกพจน์
! style="background:#99cc99" | พหูพจน์
! style="background:#99cc99" |
! style="background:#99cc99" | เอกพจน์
! style="background:#99cc99" | พหูพจน์
|-
! rowspan="3" style="background:#cfedcc; width:7em" | <span title="Indikativ">มาลาบอกเล่า</span>
| {perf_ind_1s}
| {perf_ind_1p}
! rowspan="3" style="background:#cfedcc; width:7em" | <span title="Konjunktiv">มาลาสมมุติ</span>
| {perf_sub_1s}
| {perf_sub_1p}
|-
| {perf_ind_2s}
| {perf_ind_2p}
| {perf_sub_2s}
| {perf_sub_2p}
|-
| {perf_ind_3s}
| {perf_ind_3p}
| {perf_sub_3s}
| {perf_sub_3p}
|-
! colspan="6" style="background:#99CC99" | <span title="Plusquamperfekt">การณ์ลักษณะอภิสมบูรณ์</span>
|-
! rowspan="3" style="background:#cfedcc" | <span title="Indikativ">มาลาบอกเล่า</span>
| {plup_ind_1s}
| {plup_ind_1p}
! rowspan="3" style="background:#cfedcc" | <span title="Konjunktiv">มาลาสมมุติ</span>
| {plup_sub_1s}
| {plup_sub_1p}
|-
| {plup_ind_2s}
| {plup_ind_2p}
| {plup_sub_2s}
| {plup_sub_2p}
|-
| {plup_ind_3s}
| {plup_ind_3p}
| {plup_sub_3s}
| {plup_sub_3p}
|-
! colspan="6" style="background:#9999DF" | <span title="Futur I">อนาคตกาล I</span>
|-
! rowspan="3" style="background:#ccccff" | <span title="Infinitiv">รูปกริยากลาง</span>
| rowspan="3" colspan="2" | {futi_inf}
! rowspan="3" style="background:#ccccff" | <span title="Konjunktiv I (Konjunktiv Präsens)">มาลาสมมุติ I</span>
| {futi_subi_1s}
| {futi_subi_1p}
|-
| {futi_subi_2s}
| {futi_subi_2p}
|-
| {futi_subi_3s}
| {futi_subi_3p}
|-
! colspan="6" style="background:#d5d5d5; height: .25em" |
|-
! rowspan="3" style="background:#ccccff" | <span title="Indikativ">มาลาบอกเล่า</span>
| {futi_ind_1s}
| {futi_ind_1p}
! rowspan="3" style="background:#ccccff" | <span title="Konjunktiv II (Konjunktiv Präteritum)">มาลาสมมุติ II</span>
| {futi_subii_1s}
| {futi_subii_1p}
|-
| {futi_ind_2s}
| {futi_ind_2p}
| {futi_subii_2s}
| {futi_subii_2p}
|-
| {futi_ind_3s}
| {futi_ind_3p}
| {futi_subii_3s}
| {futi_subii_3p}
|-
! colspan="6" style="background:#9999DF" | <span title="Futur II">อนาคตกาล II</span>
|-
! rowspan="3" style="background:#ccccff" | <span title="Infinitiv">รูปกริยากลาง</span>
| rowspan="3" colspan="2" | {futii_inf}
! rowspan="3" style="background:#ccccff" | <span title="Konjunktiv I (Konjunktiv Präsens)">มาลาสมมุติ I</span>
| {futii_subi_1s}
| {futii_subi_1p}
|-
| {futii_subi_2s}
| {futii_subi_2p}
|-
| {futii_subi_3s}
| {futii_subi_3p}
|-
! colspan="6" style="background:#d5d5d5; height: .25em" |
|-
! rowspan="3" style="background:#ccccff" | <span title="Indikativ">มาลาบอกเล่า</span>
| {futii_ind_1s}
| {futii_ind_1p}
! rowspan="3" style="background:#ccccff" | <span title="Konjunktiv II (Konjunktiv Präteritum)">มาลาสมมุติ II</span>
| {futii_subii_1s}
| {futii_subii_1p}
|-
| {futii_ind_2s}
| {futii_ind_2p}
| {futii_subii_2s}
| {futii_subii_2p}
|-
| {futii_ind_3s}
| {futii_ind_3p}
| {futii_subii_3s}
| {futii_subii_3p}
|{\cl}{notes_clause}</div></div>]=]
local function make_table(alternant_multiword_spec)
local forms = alternant_multiword_spec.forms
forms.title = link_term(alternant_multiword_spec.lemmas[1].form, "term")
if alternant_multiword_spec.annotation ~= "" then
forms.title = forms.title .. " (" .. alternant_multiword_spec.annotation .. ")"
end
-- Maybe format the subordinate clause table.
local formatted_subordinate_clause_table
if forms.subc_pres_3s ~= "—" then -- use 3s in case of only3s verb
forms.zu_infinitive_table = m_string_utilities.format(zu_infinitive_table, forms)
forms.footnote = alternant_multiword_spec.footnote_subordinate_clause
forms.notes_clause = forms.footnote ~= "" and m_string_utilities.format(notes_template, forms) or ""
formatted_subordinate_clause_table = m_string_utilities.format(subordinate_clause_table, forms)
else
forms.zu_infinitive_table = ""
formatted_subordinate_clause_table = ""
end
-- Format the basic table.
forms.footnote = alternant_multiword_spec.footnote_basic
forms.notes_clause = forms.footnote ~= "" and m_string_utilities.format(notes_template, forms) or ""
local formatted_basic_table = m_string_utilities.format(basic_table, forms)
-- Format the composed table.
forms.footnote = alternant_multiword_spec.footnote_composed
forms.notes_clause = forms.footnote ~= "" and m_string_utilities.format(notes_template, forms) or ""
local formatted_composed_table = m_string_utilities.format(composed_table, forms)
-- Paste them together.
return formatted_basic_table .. formatted_subordinate_clause_table .. formatted_composed_table
end
-- Externally callable function to parse and conjugate a verb given user-specified arguments.
-- Return value is WORD_SPEC, an object where the conjugated forms are in `WORD_SPEC.forms`
-- for each slot. If there are no values for a slot, the slot key will be missing. The value
-- for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}.
function export.do_generate_forms(parent_args, from_headword, def)
local params = {
[1] = {},
}
if from_headword then
params["lemma"] = {list = true}
params["id"] = {}
end
local args = require("Module:parameters").process(parent_args, params)
local PAGENAME = mw.title.getCurrentTitle().text
if not args[1] then
if PAGENAME == "de-conj" or PAGENAME == "de-verb" then
args[1] = def or "aus.fahren<fährt#fuhr,gefahren,führe.haben,sein>"
else
args[1] = PAGENAME
-- If pagename has spaces in it, add links around each word
if args[1]:find(" ") then
args[1] = "[[" .. args[1]:gsub(" ", "]] [[") .. "]]"
end
end
end
local parse_props = {
parse_indicator_spec = parse_indicator_spec,
lang = lang,
allow_default_indicator = true,
allow_blank_lemma = true,
}
local escaped_arg1 = escape_sein_sich_indicators(args[1])
local alternant_multiword_spec = iut.parse_inflected_text(escaped_arg1, parse_props)
alternant_multiword_spec.pos = pos or "verbs"
alternant_multiword_spec.args = args
normalize_all_lemmas(alternant_multiword_spec, from_headword)
detect_all_indicator_specs(alternant_multiword_spec)
local inflect_props = {
slot_list = all_verb_slots,
lang = lang,
inflect_word_spec = conjugate_verb,
-- We add links around the generated verbal forms rather than allow the entire multiword
-- expression to be a link, so ensure that user-specified links get included as well.
include_user_specified_links = true,
}
iut.inflect_multiword_or_alternant_multiword_spec(alternant_multiword_spec, inflect_props)
compute_auxiliary(alternant_multiword_spec)
compute_categories_and_annotation(alternant_multiword_spec, from_headword)
return alternant_multiword_spec
end
-- Entry point for {{de-conj}}. Template-callable function to parse and conjugate a verb given
-- user-specified arguments and generate a displayable table of the conjugated forms.
function export.show(frame)
local parent_args = frame:getParent().args
local alternant_multiword_spec = export.do_generate_forms(parent_args)
show_forms(alternant_multiword_spec)
return make_table(alternant_multiword_spec) .. require("Module:utilities").format_categories(alternant_multiword_spec.categories, lang)
end
-- Concatenate all forms of all slots into a single string of the form
-- "SLOT=FORM,FORM,...|SLOT=FORM,FORM,...|...". Embedded pipe symbols (as might occur
-- in embedded links) are converted to <!>. If INCLUDE_PROPS is given, also include
-- additional properties (currently, none). This is for use by bots.
local function concat_forms(alternant_multiword_spec, include_props)
local ins_text = {}
for _, slot_and_accel in ipairs(all_verb_slots) do
local slot = slot_and_accel[1]
local formtext = iut.concat_forms_in_slot(alternant_multiword_spec.forms[slot])
if formtext then
table.insert(ins_text, slot .. "=" .. formtext)
end
end
if include_props then
local verb_types = {}
iut.map_word_specs(alternant_multiword_spec, function(base)
detect_verb_type(base, verb_types)
end)
table.insert(ins_text, "class=" .. table.concat(verb_types, ","))
end
return table.concat(ins_text, "|")
end
local numbered_params = {
-- required params
[1] = "infinitive",
[2] = "pres_part",
[3] = "perf_part",
[4] = "aux",
[5] = "pres_1s",
[6] = "pres_2s",
[7] = "pres_3s",
[8] = "pres_1p",
[9] = "pres_2p",
[10] = "pres_3p",
[11] = "pret_1s",
[12] = "pret_2s",
[13] = "pret_3s",
[14] = "pret_1p",
[15] = "pret_2p",
[16] = "pret_3p",
[17] = "subi_1s",
[18] = "subi_2s",
[19] = "subi_3s",
[20] = "subi_1p",
[21] = "subi_2p",
[22] = "subi_3p",
[23] = "subii_1s",
[24] = "subii_2s",
[25] = "subii_3s",
[26] = "subii_1p",
[27] = "subii_2p",
[28] = "subii_3p",
[29] = "imp_2s",
[30] = "imp_2p",
-- [31] formerly the 2nd variant of imp_2s; now no longer allowed (use comma-separated 29=)
-- [32] formerly indicated whether the 2nd variant of imp_2s was present
-- optional params
[33] = "subc_pres_1s",
[34] = "subc_pres_2s",
[35] = "subc_pres_3s",
[36] = "subc_pres_1p",
[37] = "subc_pres_2p",
[38] = "subc_pres_3p",
[39] = "subc_pret_1s",
[40] = "subc_pret_2s",
[41] = "subc_pret_3s",
[42] = "subc_pret_1p",
[43] = "subc_pret_2p",
[44] = "subc_pret_3p",
[45] = "subc_subi_1s",
[46] = "subc_subi_2s",
[47] = "subc_subi_3s",
[48] = "subc_subi_1p",
[49] = "subc_subi_2p",
[50] = "subc_subi_3p",
[51] = "subc_subii_1s",
[52] = "subc_subii_2s",
[53] = "subc_subii_3s",
[54] = "subc_subii_1p",
[55] = "subc_subii_2p",
[56] = "subc_subii_3p",
[57] = "zu_infinitive",
}
local max_required_param = 30
-- Externally callable function to parse and conjugate a verb where all forms are given manually.
-- Return value is WORD_SPEC, an object where the conjugated forms are in `WORD_SPEC.forms`
-- for each slot. If there are no values for a slot, the slot key will be missing. The value
-- for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}.
function export.do_generate_forms_manual(parent_args)
local params = {
["generate_forms"] = {type = "boolean"},
}
for paramnum, _ in pairs(numbered_params) do
params[paramnum] = {required = paramnum <= max_required_param}
end
local args = require("Module:parameters").process(parent_args, params)
local base = {
forms = {},
manual = true,
}
local function process_numbered_param(paramnum)
local argval = args[paramnum]
if paramnum == 4 then
if argval == "h" then
base.aux = {{form = "haben"}}
elseif argval == "s" then
base.aux = {{form = "sein"}}
elseif argval == "hs" then
base.aux = {{form = "haben"}, {form = "sein"}}
elseif argval == "sh" then
base.aux = {{form = "sein"}, {form = "haben"}}
elseif not argval then
error("Missing auxiliary in 4=")
else
error("Unrecognized auxiliary 4=" .. argval)
end
elseif argval and argval ~= "-" then
local split_vals = rsplit(argval, "%s*,%s*")
for _, val in ipairs(split_vals) do
-- FIXME! This won't work with commas or brackets in footnotes.
-- To fix this, use functions from [[Module:inflection utilities]].
local form, footnote = val:match("^(.-)%s*(%[[^%]%[]-%])$")
local footnotes
if form then
footnotes = {footnote}
else
form = val
end
local slot = numbered_params[paramnum]
--if slot:find("subii") then
-- local subii_footnotes = get_subii_note(base)
-- footnotes = iut.combine_footnotes(subii_footnotes, footnotes)
--end
iut.insert_form(base.forms, slot, {form = form, footnotes = footnotes})
end
end
end
-- Do the infinitive first as we need to reference it in subjunctive II footnotes.
process_numbered_param(1)
for paramnum, _ in pairs(numbered_params) do
if paramnum ~= 1 then
process_numbered_param(paramnum)
end
end
add_composed_forms(base)
compute_categories_and_annotation(base, nil, "manual")
return base, args.generate_forms
end
-- Entry point for {{de-conj-table}}. Template-callable function to parse and conjugate a verb given
-- manually-specified inflections and generate a displayable table of the conjugated forms.
function export.show_manual(frame)
local parent_args = frame:getParent().args
local base, generate_forms = export.do_generate_forms_manual(parent_args)
if generate_forms then
return concat_forms(base)
end
show_forms(base)
return make_table(base) .. require("Module:utilities").format_categories(base.categories, lang)
end
-- Template-callable function to parse and conjugate a verb given user-specified arguments and return
-- the forms as a string "SLOT=FORM,FORM,...|SLOT=FORM,FORM,...|...". Embedded pipe symbols (as might
-- occur in embedded links) are converted to <!>. If |include_props=1 is given, also include
-- additional properties (currently, none). This is for use by bots.
function export.generate_forms(frame)
local include_props = frame.args["include_props"]
local parent_args = frame:getParent().args
local alternant_multiword_spec = export.do_generate_forms(parent_args)
return concat_forms(alternant_multiword_spec, include_props)
end
return export
03vm5jawspup7837poixv5j661y13bg
stellt dar
0
1729056
4755934
2025-07-10T12:32:29Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755934
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-stellt dar.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||3|s|pres|;|2|p|pres|;|p|imp}}
qd5jt8gbvq7ujz6udi5e8dte4a8cu44
stellte dar
0
1729057
4755935
2025-07-10T12:32:32Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755935
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-stellte dar.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||1//3|s|pret|;|1//3|s|sub|II}}
61276h9nyplbbrinub14rv8cb4ss54y
stelle dar
0
1729058
4755938
2025-07-10T12:39:39Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755938
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-stelle dar.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||1|s|pres|;|1//3|s|sub|I|;|s|imp}}
olnaiq6444yjaur0p7dtb7mqpywlykg
stellen dar
0
1729059
4755939
2025-07-10T12:39:59Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755939
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-stellen dar.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||1//3|p|pres|;|1//3|p|sub|I}}
b58v9t4pnthq6ypfpvt4d8fsfud2mdi
stellst dar
0
1729060
4755940
2025-07-10T12:40:03Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755940
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-stellst dar.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||2|s|pres}}
dww7920bi4aorrrmfaehworsc8s8rix
stellest dar
0
1729061
4755941
2025-07-10T12:40:22Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755941
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-stellest dar.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||2|s|sub|I}}
0ha6wqxza0m5kusyils6sv79qkxyyl6
stellet dar
0
1729062
4755942
2025-07-10T12:40:26Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755942
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-stellet dar.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||2|p|sub|I}}
i7cmoucnir9w4lmq4jf2pxxlqehx238
darstellend
0
1729063
4755943
2025-07-10T12:40:52Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755943
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-darstellend.ogg}}
=== รูปกริยาขยาย ===
{{head|de|รูปกริยาขยายปัจจุบันกาล}}
# {{present participle of|de|darstellen}}
eh0c62onqct2od20t0ovt3bal2122me
darzustellen
0
1729064
4755944
2025-07-10T12:41:01Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755944
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-darzustellen.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{de-zu-infinitive of|darstellen}}
s48rfny8qj5fsn8g9ywl2871uq4mile
stelltest dar
0
1729065
4755946
2025-07-10T12:41:54Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755946
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-stelltest dar.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||2|s|pret|;|2|s|sub|II}}
n2vvglg58f3pydvtqqmwv41mx8dym1k
darstelle
0
1729066
4755947
2025-07-10T12:42:08Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755947
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-darstelle.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||1|s|dep|pres|;|1//3|s|dep|sub|I}}
lotpmfp4wkdh8n417ev71xdjzd0t75n
darstellst
0
1729067
4755948
2025-07-10T12:42:12Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755948
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-darstellst.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||2|s|dep|pres}}
h3j42hox6l9sfz62um3os4abzf9cg0j
darstellt
0
1729068
4755949
2025-07-10T12:42:15Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755949
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-darstellt.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||3|s|dep|pres|;|2|p|dep|pres}}
39ab6evurvenz4wlsb0hs23mk6fa5tr
stellten dar
0
1729069
4755950
2025-07-10T12:47:30Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755950
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-stellten dar.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||1//3|p|pret|;|1//3|p|sub|II}}
d1rw04ijx74aj2ys5mq412bg9cs5e22
stelltet dar
0
1729070
4755951
2025-07-10T12:47:44Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755951
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-stelltet dar.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|darstellen||2|p|pret|;|2|p|sub|II}}
cqxv9d97634wtbz1htfh42faz0icznw
niemand
0
1729071
4755952
2025-07-10T12:52:24Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755952
wikitext
text/x-wiki
== ภาษาแอฟริคานส์ ==
=== รากศัพท์ ===
จาก{{inh|af|nl|niemand}}, จาก{{inh|af|dum|nieman}}, จาก{{inh|af|odt|nieman}}
=== การออกเสียง ===
* {{audio|af|LL-Q14196 (afr)-Oesjaar-niemand.wav}}
=== คำสรรพนาม ===
{{head|af|คำสรรพนาม}}
# [[ไม่]][[มี]][[ใคร]], ไม่มี[[คน]][[ใด]]
# ไม่มี[[สิ่ง]]ใด
== ภาษาดัตช์ ==
=== รากศัพท์ ===
จาก{{inh|nl|dum|nieman}}, จาก{{inh|nl|odt|nieman}}; เทียบเท่า {{prefix|nl|n|iemand}}
=== การออกเสียง ===
* {{IPA|nl|/ˈni.mɑnt/}}
* {{audio|nl|Nl-niemand.ogg}}
* {{hyph|nl|nie|mand}}
* {{rhymes|nl|imɑnt}}
=== คำสรรพนาม ===
{{head|nl|คำสรรพนาม|cat2=คำสรรพนามไม่ชี้เฉพาะ|สัมพันธการก|niemands}}
# [[ไม่]][[มี]][[ใคร]], ไม่มี[[คน]][[ใด]]
#: {{ux|nl|'''Niemand''' weet, '''niemand''' weet, dat ik Repelsteeltje heet.|'''Nobody''' knows, '''nobody''' knows, that I am called Rumpelstiltskin.}}
==== คำตรงข้าม ====
* {{l|nl|iemand}}
* {{l|nl|iedereen}}
==== คำสืบทอด ====
* {{desc|af|niemand}}
== ภาษาเยอรมัน ==
=== รูปแบบอื่น ===
* {{alter|de|Niemand||ไม่มาตรฐาน}}
=== รากศัพท์ ===
จาก{{inh|de|gmh|nieman}}, จาก{{inh|de|goh|nioman}}; เทียบเท่า {{m|de|nie|t=ไม่มี, ไม่เคย}} + {{m|de|Mann|t=คน}}; ร่วมเชื้อสายกับ{{cog|nl|niemand}}, {{cog|af|niemand}}, {{cog|nds|nemann}}, {{m|nds|nemand}}, {{m|nds|nümand}}, {{cog|hrx|nimmand}}
=== การออกเสียง ===
* {{IPA|de|/ˈniːmant/}}
* {{audio|de|De-niemand.ogg}}
=== คำสรรพนาม ===
{{head|de|คำสรรพนาม}}
# [[ไม่]][[มี]][[ใคร]], ไม่มี[[คน]][[ใด]]
#: {{syn|de|keiner}}
#: {{ant|de|jemand|einer}}
#: {{ux|de|Es ist gar '''niemand''' da.|There's '''no one''' at all.|inline=1}}
#* {{quote-song|de|year=1524|lyricist=w:Martin Luther|composer=Johann Walter|title=Christ lag in Todes Banden|passage=Den Tod '''niemand''' zwingen kunnt.|translation='''Nobody''' could defeat death.}}
==== การใช้ ====
* ''Niemand'' is synonymous with {{m|de|keiner||no one}}, which is the nominalised masculine form of the pronoun {{m|de|kein||no}}. In written German, ''niemand'' is more common than ''keiner'', whereas colloquial German often prefers the latter. (Note that ''keiner'' can also be used in other senses, in which ''niemand'' is not applicable.)
* ''Niemand'' may or may not take the case endings ''-em'' (dative) and ''-en'' (accusative). Thus: “''Ich suche niemand''” and “''Ich suche niemand'''en'''''” are both correct translations of “I'm looking for nobody.” The latter is somewhat more common (at least in writing). Using ''niemanden'' in the dative is incorrect, but it's a common error and occurs with surprising frequency in print. It was possible historically, but not in Modern German.
* With a following adjective, ''niemand'' is always uninflected. The adjective itself is capitalized and declined in the strong pattern. It generally uses neuter forms: ''niemand Neu'''es''''' – "nobody new". In the accusative case it may also take a masculine form: “''Ich suche niemand Neu'''en'''''” alongside “''Ich suche niemand Neues.''” ("I'm looking for nobody new.") The dative form has ''-em'' either way. The genitive case cannot be used with an adjective, but needs to be paraphrased.
==== การผันรูป ====
* กรรตุการก: {{l|de||'''niemand'''}}
* สัมพันธการก: {{l|de|niemandes}}, {{l|de|niemands}}
* สัมปทานการก: {{l|de|niemandem}}, {{l|de||'''niemand'''}}, {{l|de|niemanden}} {{qual|ล้าสมัย|ไม่มาตรฐาน}}
* กรรมการก: {{l|de|niemanden}}, {{l|de||'''niemand'''}}
==== ลูกคำ ====
* {{l|de|Niemand}}
* {{l|de|Niemandsland}}
==== คำเกี่ยวข้อง ====
* {{l|de|nichts}}
==== คำสืบทอด ====
* {{desc|hu|nímand|bor=1}}
=== ดูเพิ่ม ===
{{de-corr}}
=== อ่านเพิ่ม ===
* {{R:Duden}}
* {{R:DWDS}}
* [http://www.zeno.org/Adelung-1793/A/Niemand Niemand] in Adelung's ''Grammatisch-kritisches Wörterbuch der Hochdeutschen Mundart'' at Zeno.org
{{cln|de|คำสรรพนามไม่ชี้เฉพาะ}}
aua8m1yohrn04hnfc04caic4qiyfeo3
4755953
4755952
2025-07-10T12:52:35Z
Octahedron80
267
เรียงลำดับหัวเรื่องภาษา
4755953
wikitext
text/x-wiki
== ภาษาดัตช์ ==
=== รากศัพท์ ===
จาก{{inh|nl|dum|nieman}}, จาก{{inh|nl|odt|nieman}}; เทียบเท่า {{prefix|nl|n|iemand}}
=== การออกเสียง ===
* {{IPA|nl|/ˈni.mɑnt/}}
* {{audio|nl|Nl-niemand.ogg}}
* {{hyph|nl|nie|mand}}
* {{rhymes|nl|imɑnt}}
=== คำสรรพนาม ===
{{head|nl|คำสรรพนาม|cat2=คำสรรพนามไม่ชี้เฉพาะ|สัมพันธการก|niemands}}
# [[ไม่]][[มี]][[ใคร]], ไม่มี[[คน]][[ใด]]
#: {{ux|nl|'''Niemand''' weet, '''niemand''' weet, dat ik Repelsteeltje heet.|'''Nobody''' knows, '''nobody''' knows, that I am called Rumpelstiltskin.}}
==== คำตรงข้าม ====
* {{l|nl|iemand}}
* {{l|nl|iedereen}}
==== คำสืบทอด ====
* {{desc|af|niemand}}
== ภาษาเยอรมัน ==
=== รูปแบบอื่น ===
* {{alter|de|Niemand||ไม่มาตรฐาน}}
=== รากศัพท์ ===
จาก{{inh|de|gmh|nieman}}, จาก{{inh|de|goh|nioman}}; เทียบเท่า {{m|de|nie|t=ไม่มี, ไม่เคย}} + {{m|de|Mann|t=คน}}; ร่วมเชื้อสายกับ{{cog|nl|niemand}}, {{cog|af|niemand}}, {{cog|nds|nemann}}, {{m|nds|nemand}}, {{m|nds|nümand}}, {{cog|hrx|nimmand}}
=== การออกเสียง ===
* {{IPA|de|/ˈniːmant/}}
* {{audio|de|De-niemand.ogg}}
=== คำสรรพนาม ===
{{head|de|คำสรรพนาม}}
# [[ไม่]][[มี]][[ใคร]], ไม่มี[[คน]][[ใด]]
#: {{syn|de|keiner}}
#: {{ant|de|jemand|einer}}
#: {{ux|de|Es ist gar '''niemand''' da.|There's '''no one''' at all.|inline=1}}
#* {{quote-song|de|year=1524|lyricist=w:Martin Luther|composer=Johann Walter|title=Christ lag in Todes Banden|passage=Den Tod '''niemand''' zwingen kunnt.|translation='''Nobody''' could defeat death.}}
==== การใช้ ====
* ''Niemand'' is synonymous with {{m|de|keiner||no one}}, which is the nominalised masculine form of the pronoun {{m|de|kein||no}}. In written German, ''niemand'' is more common than ''keiner'', whereas colloquial German often prefers the latter. (Note that ''keiner'' can also be used in other senses, in which ''niemand'' is not applicable.)
* ''Niemand'' may or may not take the case endings ''-em'' (dative) and ''-en'' (accusative). Thus: “''Ich suche niemand''” and “''Ich suche niemand'''en'''''” are both correct translations of “I'm looking for nobody.” The latter is somewhat more common (at least in writing). Using ''niemanden'' in the dative is incorrect, but it's a common error and occurs with surprising frequency in print. It was possible historically, but not in Modern German.
* With a following adjective, ''niemand'' is always uninflected. The adjective itself is capitalized and declined in the strong pattern. It generally uses neuter forms: ''niemand Neu'''es''''' – "nobody new". In the accusative case it may also take a masculine form: “''Ich suche niemand Neu'''en'''''” alongside “''Ich suche niemand Neues.''” ("I'm looking for nobody new.") The dative form has ''-em'' either way. The genitive case cannot be used with an adjective, but needs to be paraphrased.
==== การผันรูป ====
* กรรตุการก: {{l|de||'''niemand'''}}
* สัมพันธการก: {{l|de|niemandes}}, {{l|de|niemands}}
* สัมปทานการก: {{l|de|niemandem}}, {{l|de||'''niemand'''}}, {{l|de|niemanden}} {{qual|ล้าสมัย|ไม่มาตรฐาน}}
* กรรมการก: {{l|de|niemanden}}, {{l|de||'''niemand'''}}
==== ลูกคำ ====
* {{l|de|Niemand}}
* {{l|de|Niemandsland}}
==== คำเกี่ยวข้อง ====
* {{l|de|nichts}}
==== คำสืบทอด ====
* {{desc|hu|nímand|bor=1}}
=== ดูเพิ่ม ===
{{de-corr}}
=== อ่านเพิ่ม ===
* {{R:Duden}}
* {{R:DWDS}}
* [http://www.zeno.org/Adelung-1793/A/Niemand Niemand] in Adelung's ''Grammatisch-kritisches Wörterbuch der Hochdeutschen Mundart'' at Zeno.org
{{cln|de|คำสรรพนามไม่ชี้เฉพาะ}}
== ภาษาแอฟริคานส์ ==
=== รากศัพท์ ===
จาก{{inh|af|nl|niemand}}, จาก{{inh|af|dum|nieman}}, จาก{{inh|af|odt|nieman}}
=== การออกเสียง ===
* {{audio|af|LL-Q14196 (afr)-Oesjaar-niemand.wav}}
=== คำสรรพนาม ===
{{head|af|คำสรรพนาม}}
# [[ไม่]][[มี]][[ใคร]], ไม่มี[[คน]][[ใด]]
# ไม่มี[[สิ่ง]]ใด
lh9c2gfyhkvk9eyre659u00lfztsq4p
niemands
0
1729072
4755954
2025-07-10T12:53:06Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755954
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-niemands.ogg}}
=== คำสรรพนาม ===
{{head|de|รูปสรรพนาม}}
# {{inflection of|de|niemand||gen}}
ikhujkr0tk63lh3om26anu0o19ovdl5
Niemand
0
1729073
4755955
2025-07-10T12:54:20Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755955
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-Niemand.ogg}}
=== คำนาม ===
{{de-noun|m}}
# [[คน]][[ที่]][[ไม่]][[สำคัญ]]
#: {{uxi|de|Du bist ein '''Niemand'''!|You're a '''nobody'''!}}
#* {{quote-song
|de
|title=Walzer für Niemand
|album=Monday's Ghost
|author=w:Sophie Hunger
|year=2008
|passage='''Niemand''', siehst du's, ich wachse nicht mehr / Meine Hände sind Füße, '''Niemand''', schau her / Bald bin ich nichts und das, was dann bleibt / Ist deine Wenigkeit}}
=== คำสรรพนาม ===
{{head|de|คำสรรพนาม}}
# {{lb|de|now|proscribed}} {{alternative form of|de|niemand}}
=== อ่านเพิ่ม ===
* {{R:Duden}}
cptce643twofmo75o60txhmgohcdxcd
4755956
4755955
2025-07-10T12:54:40Z
Octahedron80
267
/* คำสรรพนาม */
4755956
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-Niemand.ogg}}
=== คำนาม ===
{{de-noun|m}}
# [[คน]][[ที่]][[ไม่]][[สำคัญ]]
#: {{uxi|de|Du bist ein '''Niemand'''!|You're a '''nobody'''!}}
#* {{quote-song
|de
|title=Walzer für Niemand
|album=Monday's Ghost
|author=w:Sophie Hunger
|year=2008
|passage='''Niemand''', siehst du's, ich wachse nicht mehr / Meine Hände sind Füße, '''Niemand''', schau her / Bald bin ich nichts und das, was dann bleibt / Ist deine Wenigkeit}}
=== คำสรรพนาม ===
{{head|de|คำสรรพนาม}}
# {{lb|de|ปัจจุบัน|proscribed}} {{alternative form of|de|niemand}}
=== อ่านเพิ่ม ===
* {{R:Duden}}
mrxnqonx1ngzsro5nx013mul9d2amx4
4755957
4755956
2025-07-10T12:54:54Z
Octahedron80
267
/* คำสรรพนาม */
4755957
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-Niemand.ogg}}
=== คำนาม ===
{{de-noun|m}}
# [[คน]][[ที่]][[ไม่]][[สำคัญ]]
#: {{uxi|de|Du bist ein '''Niemand'''!|You're a '''nobody'''!}}
#* {{quote-song
|de
|title=Walzer für Niemand
|album=Monday's Ghost
|author=w:Sophie Hunger
|year=2008
|passage='''Niemand''', siehst du's, ich wachse nicht mehr / Meine Hände sind Füße, '''Niemand''', schau her / Bald bin ich nichts und das, was dann bleibt / Ist deine Wenigkeit}}
=== คำสรรพนาม ===
{{head|de|คำสรรพนาม}}
# {{lb|de|ปัจจุบัน|_|proscribed}} {{alternative form of|de|niemand}}
=== อ่านเพิ่ม ===
* {{R:Duden}}
fx4t9al9m98wihh4x2lx4qlohqjlniw
Stockwerk
0
1729074
4755958
2025-07-10T12:55:42Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755958
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
{{wikipedia|lang=de}}
=== รากศัพท์ ===
จาก{{af|de|Stock|gloss1=|Werk|gloss2=}}
=== การออกเสียง ===
* {{IPA|de|[ˈʃtɔkˌvɛʁk]}}
* {{audio|de|De-Stockwerk.ogg}}
* {{hyph|de|Stock|werk}}
* {{rhymes|de|ɛʁk|s=2}}
=== คำนาม ===
{{de-noun|n,(e)s}}
# [[ชั้น]] (ของอาคาร)
#: {{syn|de|Stock<g:m>|Geschoss<g:n>}}
#* {{quote-song|de|year=1970|lyricist=w:Hildegard Knef|composer=Hans Hammerschmid|title=Im 80. Stockwerk|album=KNEF|passage=Im 80. '''Stockwerk''' / In dem Haus, das es nicht gibt / In der Stadt, die es nicht gibt / Wird ein Mädchen steh'n}}
==== การผันรูป ====
{{de-ndecl|n,(e)s}}
==== คำเกี่ยวข้อง ====
* {{l|de|Bienenstock}}, {{l|de|Holzstock}}, {{l|de|Weinstock}}
* {{l|de|Bollwerk}}, {{l|de|Fachwerk}}, {{l|de|Kunstwerk}}
=== อ่านเพิ่ม ===
* {{R:DWDS}}
* {{R:UniLeipzig}}
* {{R:Duden}}
t0nv9x80mh1libgvj8kfudnasu7p5bv
nichts
0
1729075
4755959
2025-07-10T12:57:57Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755959
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== รูปแบบอื่น ===
* {{alter|de|nix||a very common colloquial pronunciation; frequently seen in informal writing}}
* {{alter|de|nischt||dialectal, widely restricted to eastern Germany}}
=== รากศัพท์ ===
จาก{{inh|de|gmh|nihtes niht||nothing of nothing}}, a reenforcing construction with {{m|gmh|niht}}. See {{m|de|nicht}}.<ref>{{R:Kluge 1891|nichts}}</ref> ร่วมเชื้อสายกับ{{cog|nl|niets}}, {{cog|nds|nix}}, {{cog|hrx|nichs}}
=== การออกเสียง ===
* {{IPA|de|[nɪçt͡s]|/nɪx(t)s/|/nɪks/}}
* {{audio|de|De-nichts.ogg}}
* {{audio|de|De-nichts2.ogg}}
* {{rhymes|de|ɪçt͡s|s=1}}
=== คำสรรพนาม ===
{{head|de|คำสรรพนาม|คำสรรพนามไม่ชี้เฉพาะ|g=n}}
# [[ไม่]][[มี]][[อะไร]], ไม่มี[[สิ่ง]][[ใด]]
#: {{ux|de|Ich weiß, dass ich '''nichts''' weiß.|I know that I know '''nothing'''.}}
==== การใช้ ====
* Used instead of {{l|de|nicht}} to negate a sentence involving a non-specific noun.
*: {{uxi|de|Gibt es da etwas? Nein, ich sehe '''nichts'''.|Is there something there? No, I do'''n't''' see '''anything'''.}}
* Frequently, especially in spoken or informal language, accompanied by {{l|de|gar}}.
*: {{uxi|de|Ich sehe gar '''nichts'''.|I do'''n't''' see '''anything''' at all.}}
==== การผันรูป ====
ไม่มีการผันรูป; A following adjective is capitalized and declined as a neuter singular in the strong pattern. Thus ''nichts Neu'''es''''' (“nothing new”) in the nominative and accusative cases; ''nichts Neu'''em''''' in the dative case.
A genitive form does not exist. It is paraphrased by means of the preposition {{m|de|von||of}}. After the prepositions {{m|de|statt}}, {{m|de|trotz}}, {{m|de|während}}, and {{m|de|wegen}}, the dative case is used instead: ''wegen nichts Wichtig'''em''''' – “because of nothing important” (i.e. because of something unimportant).
=== ดูเพิ่ม ===
{{de-corr}}
=== อ้างอิง ===
<references/>
=== อ่านเพิ่ม ===
* {{R:Duden}}
* {{R:DWDS}}
== ภาษาสกอต ==
=== คำนาม ===
{{head|sco|รูปนาม}}
# {{plural of|sco|nicht}}
5hjimv2nqde48ewknrenlsnrrqq0x7r
4755960
4755959
2025-07-10T12:58:44Z
Octahedron80
267
/* รากศัพท์ */
4755960
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== รูปแบบอื่น ===
* {{alter|de|nix||a very common colloquial pronunciation; frequently seen in informal writing}}
* {{alter|de|nischt||dialectal, widely restricted to eastern Germany}}
=== รากศัพท์ ===
จาก{{inh|de|gmh|nihtes niht||nothing of nothing}}, a reenforcing construction with {{m|gmh|niht}}; ดูที่ {{m|de|nicht}};<ref>{{R:Kluge 1891|nichts}}</ref> ร่วมเชื้อสายกับ{{cog|nl|niets}}, {{cog|nds|nix}}, {{cog|hrx|nichs}}
=== การออกเสียง ===
* {{IPA|de|[nɪçt͡s]|/nɪx(t)s/|/nɪks/}}
* {{audio|de|De-nichts.ogg}}
* {{audio|de|De-nichts2.ogg}}
* {{rhymes|de|ɪçt͡s|s=1}}
=== คำสรรพนาม ===
{{head|de|คำสรรพนาม|คำสรรพนามไม่ชี้เฉพาะ|g=n}}
# [[ไม่]][[มี]][[อะไร]], ไม่มี[[สิ่ง]][[ใด]]
#: {{ux|de|Ich weiß, dass ich '''nichts''' weiß.|I know that I know '''nothing'''.}}
==== การใช้ ====
* Used instead of {{l|de|nicht}} to negate a sentence involving a non-specific noun.
*: {{uxi|de|Gibt es da etwas? Nein, ich sehe '''nichts'''.|Is there something there? No, I do'''n't''' see '''anything'''.}}
* Frequently, especially in spoken or informal language, accompanied by {{l|de|gar}}.
*: {{uxi|de|Ich sehe gar '''nichts'''.|I do'''n't''' see '''anything''' at all.}}
==== การผันรูป ====
ไม่มีการผันรูป; A following adjective is capitalized and declined as a neuter singular in the strong pattern. Thus ''nichts Neu'''es''''' (“nothing new”) in the nominative and accusative cases; ''nichts Neu'''em''''' in the dative case.
A genitive form does not exist. It is paraphrased by means of the preposition {{m|de|von||of}}. After the prepositions {{m|de|statt}}, {{m|de|trotz}}, {{m|de|während}}, and {{m|de|wegen}}, the dative case is used instead: ''wegen nichts Wichtig'''em''''' – “because of nothing important” (i.e. because of something unimportant).
=== ดูเพิ่ม ===
{{de-corr}}
=== อ้างอิง ===
<references/>
=== อ่านเพิ่ม ===
* {{R:Duden}}
* {{R:DWDS}}
== ภาษาสกอต ==
=== คำนาม ===
{{head|sco|รูปนาม}}
# {{plural of|sco|nicht}}
gthmwpjtxjuede7erxepvlg81t9dxe0
4755961
4755960
2025-07-10T12:59:12Z
Octahedron80
267
/* การผันรูป */
4755961
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== รูปแบบอื่น ===
* {{alter|de|nix||a very common colloquial pronunciation; frequently seen in informal writing}}
* {{alter|de|nischt||dialectal, widely restricted to eastern Germany}}
=== รากศัพท์ ===
จาก{{inh|de|gmh|nihtes niht||nothing of nothing}}, a reenforcing construction with {{m|gmh|niht}}; ดูที่ {{m|de|nicht}};<ref>{{R:Kluge 1891|nichts}}</ref> ร่วมเชื้อสายกับ{{cog|nl|niets}}, {{cog|nds|nix}}, {{cog|hrx|nichs}}
=== การออกเสียง ===
* {{IPA|de|[nɪçt͡s]|/nɪx(t)s/|/nɪks/}}
* {{audio|de|De-nichts.ogg}}
* {{audio|de|De-nichts2.ogg}}
* {{rhymes|de|ɪçt͡s|s=1}}
=== คำสรรพนาม ===
{{head|de|คำสรรพนาม|คำสรรพนามไม่ชี้เฉพาะ|g=n}}
# [[ไม่]][[มี]][[อะไร]], ไม่มี[[สิ่ง]][[ใด]]
#: {{ux|de|Ich weiß, dass ich '''nichts''' weiß.|I know that I know '''nothing'''.}}
==== การใช้ ====
* Used instead of {{l|de|nicht}} to negate a sentence involving a non-specific noun.
*: {{uxi|de|Gibt es da etwas? Nein, ich sehe '''nichts'''.|Is there something there? No, I do'''n't''' see '''anything'''.}}
* Frequently, especially in spoken or informal language, accompanied by {{l|de|gar}}.
*: {{uxi|de|Ich sehe gar '''nichts'''.|I do'''n't''' see '''anything''' at all.}}
==== การผันรูป ====
ไม่ผันรูป; A following adjective is capitalized and declined as a neuter singular in the strong pattern. Thus ''nichts Neu'''es''''' (“nothing new”) in the nominative and accusative cases; ''nichts Neu'''em''''' in the dative case.
A genitive form does not exist. It is paraphrased by means of the preposition {{m|de|von||of}}. After the prepositions {{m|de|statt}}, {{m|de|trotz}}, {{m|de|während}}, and {{m|de|wegen}}, the dative case is used instead: ''wegen nichts Wichtig'''em''''' – “because of nothing important” (i.e. because of something unimportant).
=== ดูเพิ่ม ===
{{de-corr}}
=== อ้างอิง ===
<references/>
=== อ่านเพิ่ม ===
* {{R:Duden}}
* {{R:DWDS}}
== ภาษาสกอต ==
=== คำนาม ===
{{head|sco|รูปนาม}}
# {{plural of|sco|nicht}}
6s7z9l1sjw6sgqkfvddsc3uak8x1whd
4755962
4755961
2025-07-10T13:01:31Z
Octahedron80
267
/* รูปแบบอื่น */
4755962
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== รูปแบบอื่น ===
* {{alter|de|nix||เป็นการออกเสียงภาษาปากที่สามัญมาก; พบได้บ่อยในงานเขียนไม่เป็นทางการ}}
* {{alter|de|nischt||ภาษาถิ่น, ใช้อย่างแพร่หลายโดยเฉพาะในเยอรมนีตะวันออก}}
=== รากศัพท์ ===
จาก{{inh|de|gmh|nihtes niht||nothing of nothing}}, a reenforcing construction with {{m|gmh|niht}}; ดูที่ {{m|de|nicht}};<ref>{{R:Kluge 1891|nichts}}</ref> ร่วมเชื้อสายกับ{{cog|nl|niets}}, {{cog|nds|nix}}, {{cog|hrx|nichs}}
=== การออกเสียง ===
* {{IPA|de|[nɪçt͡s]|/nɪx(t)s/|/nɪks/}}
* {{audio|de|De-nichts.ogg}}
* {{audio|de|De-nichts2.ogg}}
* {{rhymes|de|ɪçt͡s|s=1}}
=== คำสรรพนาม ===
{{head|de|คำสรรพนาม|คำสรรพนามไม่ชี้เฉพาะ|g=n}}
# [[ไม่]][[มี]][[อะไร]], ไม่มี[[สิ่ง]][[ใด]]
#: {{ux|de|Ich weiß, dass ich '''nichts''' weiß.|I know that I know '''nothing'''.}}
==== การใช้ ====
* Used instead of {{l|de|nicht}} to negate a sentence involving a non-specific noun.
*: {{uxi|de|Gibt es da etwas? Nein, ich sehe '''nichts'''.|Is there something there? No, I do'''n't''' see '''anything'''.}}
* Frequently, especially in spoken or informal language, accompanied by {{l|de|gar}}.
*: {{uxi|de|Ich sehe gar '''nichts'''.|I do'''n't''' see '''anything''' at all.}}
==== การผันรูป ====
ไม่ผันรูป; A following adjective is capitalized and declined as a neuter singular in the strong pattern. Thus ''nichts Neu'''es''''' (“nothing new”) in the nominative and accusative cases; ''nichts Neu'''em''''' in the dative case.
A genitive form does not exist. It is paraphrased by means of the preposition {{m|de|von||of}}. After the prepositions {{m|de|statt}}, {{m|de|trotz}}, {{m|de|während}}, and {{m|de|wegen}}, the dative case is used instead: ''wegen nichts Wichtig'''em''''' – “because of nothing important” (i.e. because of something unimportant).
=== ดูเพิ่ม ===
{{de-corr}}
=== อ้างอิง ===
<references/>
=== อ่านเพิ่ม ===
* {{R:Duden}}
* {{R:DWDS}}
== ภาษาสกอต ==
=== คำนาม ===
{{head|sco|รูปนาม}}
# {{plural of|sco|nicht}}
e4m8d10f9yed0lfd6vy66laqcok0kdr
4755963
4755962
2025-07-10T13:02:07Z
Octahedron80
267
/* รูปแบบอื่น */
4755963
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== รูปแบบอื่น ===
* {{alter|de|nix||การออกเสียงเป็นภาษาปากที่สามัญมาก; พบได้บ่อยในงานเขียนที่ไม่เป็นทางการ}}
* {{alter|de|nischt||ภาษาถิ่น, ใช้อย่างแพร่หลายโดยเฉพาะในเยอรมนีตะวันออก}}
=== รากศัพท์ ===
จาก{{inh|de|gmh|nihtes niht||nothing of nothing}}, a reenforcing construction with {{m|gmh|niht}}; ดูที่ {{m|de|nicht}};<ref>{{R:Kluge 1891|nichts}}</ref> ร่วมเชื้อสายกับ{{cog|nl|niets}}, {{cog|nds|nix}}, {{cog|hrx|nichs}}
=== การออกเสียง ===
* {{IPA|de|[nɪçt͡s]|/nɪx(t)s/|/nɪks/}}
* {{audio|de|De-nichts.ogg}}
* {{audio|de|De-nichts2.ogg}}
* {{rhymes|de|ɪçt͡s|s=1}}
=== คำสรรพนาม ===
{{head|de|คำสรรพนาม|คำสรรพนามไม่ชี้เฉพาะ|g=n}}
# [[ไม่]][[มี]][[อะไร]], ไม่มี[[สิ่ง]][[ใด]]
#: {{ux|de|Ich weiß, dass ich '''nichts''' weiß.|I know that I know '''nothing'''.}}
==== การใช้ ====
* Used instead of {{l|de|nicht}} to negate a sentence involving a non-specific noun.
*: {{uxi|de|Gibt es da etwas? Nein, ich sehe '''nichts'''.|Is there something there? No, I do'''n't''' see '''anything'''.}}
* Frequently, especially in spoken or informal language, accompanied by {{l|de|gar}}.
*: {{uxi|de|Ich sehe gar '''nichts'''.|I do'''n't''' see '''anything''' at all.}}
==== การผันรูป ====
ไม่ผันรูป; A following adjective is capitalized and declined as a neuter singular in the strong pattern. Thus ''nichts Neu'''es''''' (“nothing new”) in the nominative and accusative cases; ''nichts Neu'''em''''' in the dative case.
A genitive form does not exist. It is paraphrased by means of the preposition {{m|de|von||of}}. After the prepositions {{m|de|statt}}, {{m|de|trotz}}, {{m|de|während}}, and {{m|de|wegen}}, the dative case is used instead: ''wegen nichts Wichtig'''em''''' – “because of nothing important” (i.e. because of something unimportant).
=== ดูเพิ่ม ===
{{de-corr}}
=== อ้างอิง ===
<references/>
=== อ่านเพิ่ม ===
* {{R:Duden}}
* {{R:DWDS}}
== ภาษาสกอต ==
=== คำนาม ===
{{head|sco|รูปนาม}}
# {{plural of|sco|nicht}}
c28mvqgz7qyw00s5kwyogo2ju99yuez
wohnt
0
1729076
4755964
2025-07-10T13:03:32Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755964
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-wohnt.ogg}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|wohnen||3|s|pres|;|2|p|pres|;|p|imp}}
37u4vy2tswshnz5uafspytvk7z94852
wohnte
0
1729077
4755965
2025-07-10T13:03:46Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755965
wikitext
text/x-wiki
== ภาษาเยอรมัน ==
=== การออกเสียง ===
* {{audio|de|De-wohnte.ogg}}
* {{audio|de|De-at-wohnte.ogg|a=Austria}}
=== คำกริยา ===
{{head|de|รูปกริยา}}
# {{verb form of|de|wohnen||1//3|s|pret|;|1//3|s|sub|II}}
145yhe2qifqlvcy96hbjlbzfudiylkw
impulsionar
0
1729078
4755967
2025-07-10T13:26:50Z
Alifshinobi
397
สร้างหน้าด้วย "==ภาษาโปรตุเกส== ===รากศัพท์=== จาก {{suffix|pt|impulsão|ar}} ===การออกเสียง=== {{pt-IPA}} * {{hyphenation|pt|im|pul|si|o|nar}} ===คำกริยา=== {{pt-verb}} # {{lb|pt|transitive}} [[ส่งเสริม]] (ผู้คน) #: {{syn|pt|incentivar}} # {{lb|pt|transitive}} [[เติม]][[พลัง]] (ยานพาหนะ) #: {{syn|pt|propulsar}} # {{lb|pt|..."
4755967
wikitext
text/x-wiki
==ภาษาโปรตุเกส==
===รากศัพท์===
จาก {{suffix|pt|impulsão|ar}}
===การออกเสียง===
{{pt-IPA}}
* {{hyphenation|pt|im|pul|si|o|nar}}
===คำกริยา===
{{pt-verb}}
# {{lb|pt|transitive}} [[ส่งเสริม]] (ผู้คน)
#: {{syn|pt|incentivar}}
# {{lb|pt|transitive}} [[เติม]][[พลัง]] (ยานพาหนะ)
#: {{syn|pt|propulsar}}
# {{lb|pt|figurative|transitive}} [[กระตุ้น]] (เศรษฐกิจ, วิจัย, การเติบโต, การซื้อขาย)
#: {{syn|pt|estimular}}
====การผันรูป====
{{pt-conj}}
===อ่านเพิ่ม===
* {{R:pt:Priberam}}
===อ้างอิง===
{{รายการอ้างอิง}}
* ''Oxford Portuguese Dictionary''. (2023). Oxford University Press.
p9ga3b0fyx85lauklclpnyxyg1ucqo0
4755968
4755967
2025-07-10T13:27:30Z
Alifshinobi
397
/* คำกริยา */
4755968
wikitext
text/x-wiki
==ภาษาโปรตุเกส==
===รากศัพท์===
จาก {{suffix|pt|impulsão|ar}}
===การออกเสียง===
{{pt-IPA}}
* {{hyphenation|pt|im|pul|si|o|nar}}
===คำกริยา===
{{pt-verb}}
# {{lb|pt|transitive}} [[ส่งเสริม]] (ผู้คน)
#: {{syn|pt|incentivar}}
# {{lb|pt|transitive}} [[เติม]][[พลัง]] (ยานพาหนะ)
#: {{syn|pt|propulsar}}
# {{lb|pt|figurative|transitive}} [[กระตุ้น]] (เศรษฐกิจ, การวิจัย, การเติบโต, การซื้อขาย)
#: {{syn|pt|estimular}}
====การผันรูป====
{{pt-conj}}
===อ่านเพิ่ม===
* {{R:pt:Priberam}}
===อ้างอิง===
{{รายการอ้างอิง}}
* ''Oxford Portuguese Dictionary''. (2023). Oxford University Press.
nib9jfw7k351534u167fp6iagd3s0qg
คุยกับผู้ใช้:Miss Wellness World
3
1729079
4755969
2025-07-10T13:42:08Z
New user message
2698
เพิ่ม[[Template:Welcome|สารต้อนรับ]]ในหน้าคุยของผู้ใช้ใหม่
4755969
wikitext
text/x-wiki
{{Template:Welcome|realName=|name=Miss Wellness World}}
-- [[ผู้ใช้:New user message|New user message]] ([[คุยกับผู้ใช้:New user message|คุย]]) 20:42, 10 กรกฎาคม 2568 (+07)
enp7gmvdlb0mqaebtw6k4jetd82dhxi
impulsiono
0
1729080
4755970
2025-07-10T13:47:27Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755970
wikitext
text/x-wiki
== ภาษาโปรตุเกส ==
=== การออกเสียง ===
{{pt-IPA|[on:ô*n]}}
* {{rhymes|pt|ɔnu|q1=Portugal|õnu|q2=Brazil|s=5}}
* {{hyph|pt|im|pul|si|o|no}}
=== คำกริยา ===
{{head|pt|รูปกริยา}}
# {{pt-verb form of|impulsionar}}
6y7uyfpx51mosyj6nbd9lwk3fy165sp
impulsionado
0
1729081
4755971
2025-07-10T13:47:31Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
4755971
wikitext
text/x-wiki
== ภาษาโปรตุเกส ==
=== รูปกริยาขยาย ===
{{pt-pp}}
# {{past participle of|pt|impulsionar}}
7prpiynap3o8v7kl1vleowyn8uvxtu7
สรีสฤบ
0
1729082
4755973
2025-07-10T15:30:57Z
Jamnanja
16523
เพิ่มหน้า สรีสฤบ
4755973
wikitext
text/x-wiki
== ภาษาไทย ==
=== รากศัพท์ ===
{{bor+|th|sa|सरीसृप||สัตว์เลื้อยคลาน}}; เทียบ{{cog|pi|สิรึสป}}
=== การออกเสียง ===
{{th-pron|สะ-รี-สิบ}}
=== คำนาม ===
{{th-noun}}
# [[สัตว์เลื้อยคลาน]], [[งู]]
8apgsyk2vbha6pe6q77yq796l10k65a
disciplina
0
1729083
4755974
2025-07-10T21:05:26Z
Alifshinobi
397
สร้างหน้าด้วย "==ภาษาโปรตุเกส== ===การออกเสียง=== {{pt-IPA|br=+|pt=+,desciplina}} * {{hyph|pt|dis|ci|pli|na}} ===รากศัพท์ 1=== {{bor+|pt|la|disciplīna}} ====คำนาม==== {{pt-noun|f}} # [[วินัย]] # [[สาขาวิชา]] # [[ข้อบังคับ]] ===รากศัพท์ 2=== {{nonlemma}} ====คำกริยา==== {{head|pt|รูปกริยา}} # {{pt-..."
4755974
wikitext
text/x-wiki
==ภาษาโปรตุเกส==
===การออกเสียง===
{{pt-IPA|br=+|pt=+,desciplina}}
* {{hyph|pt|dis|ci|pli|na}}
===รากศัพท์ 1===
{{bor+|pt|la|disciplīna}}
====คำนาม====
{{pt-noun|f}}
# [[วินัย]]
# [[สาขาวิชา]]
# [[ข้อบังคับ]]
===รากศัพท์ 2===
{{nonlemma}}
====คำกริยา====
{{head|pt|รูปกริยา}}
# {{pt-verb form of|disciplinar}}
===อ่านเพิ่ม===
* {{R:pt:Priberam}}
===อ้างอิง===
{{รายการอ้างอิง}}
* ''Oxford Portuguese Dictionary''. (2023). Oxford University Press.
0jotq3yf0mguw4qlmru2xr5bcz1ot2b
คุยกับผู้ใช้:Gaiʀahard
3
1729084
4755975
2025-07-10T23:51:31Z
New user message
2698
เพิ่ม[[Template:Welcome|สารต้อนรับ]]ในหน้าคุยของผู้ใช้ใหม่
4755975
wikitext
text/x-wiki
{{Template:Welcome|realName=|name=Gaiʀahard}}
-- [[ผู้ใช้:New user message|New user message]] ([[คุยกับผู้ใช้:New user message|คุย]]) 06:51, 11 กรกฎาคม 2568 (+07)
ovcn6obho25e9pu3yxkilvulewjl7zo
คุยกับผู้ใช้:Mr Pie 5
3
1729085
4755976
2025-07-11T00:20:40Z
New user message
2698
เพิ่ม[[Template:Welcome|สารต้อนรับ]]ในหน้าคุยของผู้ใช้ใหม่
4755976
wikitext
text/x-wiki
{{Template:Welcome|realName=|name=Mr Pie 5}}
-- [[ผู้ใช้:New user message|New user message]] ([[คุยกับผู้ใช้:New user message|คุย]]) 07:20, 11 กรกฎาคม 2568 (+07)
lwkredgboi7ztm7zkgsdz1a9q5p6kkf
armadilha
0
1729086
4755978
2025-07-11T08:49:16Z
Alifshinobi
397
สร้างหน้าด้วย "==ภาษาโปรตุเกส== ===รากศัพท์=== {{inh+|pt|roa-opt|armadilha}}, จาก{{der|pt|la|*armāticula}}, จาก {{m|la|armātus}}, จาก {{m|la|armō}} ซึ่งเป็นคำกริยา ===การออกเสียง=== {{pt-IPA}} * {{IPA|pt|[aɻmaˈdʒija]|a=Caipira}} * {{IPA|pt|[aχmaˈdiʎa]|a=Nordestino}} * {{rhymes|pt|iʎɐ|s=4}} * {{hyphenation|pt|ar|ma|di|lha}} ===คำนาม=..."
4755978
wikitext
text/x-wiki
==ภาษาโปรตุเกส==
===รากศัพท์===
{{inh+|pt|roa-opt|armadilha}}, จาก{{der|pt|la|*armāticula}}, จาก {{m|la|armātus}}, จาก {{m|la|armō}} ซึ่งเป็นคำกริยา
===การออกเสียง===
{{pt-IPA}}
* {{IPA|pt|[aɻmaˈdʒija]|a=Caipira}}
* {{IPA|pt|[aχmaˈdiʎa]|a=Nordestino}}
* {{rhymes|pt|iʎɐ|s=4}}
* {{hyphenation|pt|ar|ma|di|lha}}
===คำนาม===
{{pt-noun|f}}
# [[กับ]][[ดัก]] (เครื่องดักสัตว์)
# [[กับ]][[ดัก]] (อุบาย)
#: {{syn|pt|cilada}}
# {{lb|pt|military}} [[การซุ่ม]][[โจมตี]], [[กับระเบิด]]
#: {{syn|pt|cilada}}
===อ่านเพิ่ม===
* {{pedia|lang=pt}}
* {{R:pt:Priberam}}
===อ้างอิง===
{{รายการอ้างอิง}}
* ''Oxford Portuguese Dictionary''. (2023). Oxford University Press.
6f9ebxqhn163z1aln463kzasd2zz4q7
คุยกับผู้ใช้:鳦
3
1729087
4755979
2025-07-11T09:01:51Z
New user message
2698
เพิ่ม[[Template:Welcome|สารต้อนรับ]]ในหน้าคุยของผู้ใช้ใหม่
4755979
wikitext
text/x-wiki
{{Template:Welcome|realName=|name=鳦}}
-- [[ผู้ใช้:New user message|New user message]] ([[คุยกับผู้ใช้:New user message|คุย]]) 16:01, 11 กรกฎาคม 2568 (+07)
84iyhzvzof1czhzy2814kjt8kewe4fk