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 .. "&nbsp;") 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 .. "&nbsp;") 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