text:
Module:parse utilities

local export = {}

local m_string_utilities = require("Module:string utilities") local parameters_module = "Module:parameters"

local rfind = mw.ustring.find local rsplit = mw.text.split local u = mw.ustring.char local rsubn = mw.ustring.gsub

-- version of rsubn that discards all but the first return value local function rsub(term, foo, bar) local retval = rsubn(term, foo, bar) return retval end

--[==[ intro: In order to understand the following parsing code, you need to understand how inflected text specs work. They are intended to work with inflected text where individual words to be inflected may be followed by inflection specs in angle brackets. The format of the text inside of the angle brackets is up to the individual language and part-of-speech specific implementation. A real-world example is as follows: ` меди́чна<+> сестра́<*,*#.pr> `. This is the inflection of the Ukrainian multiword expression , consisting of two words: the adjective and the noun. The specs in angle brackets follow each word to be inflected; for example, `<+>` means that the preceding word should be declined as an adjective.

The code below works in terms of balanced expressions, which are bounded by delimiters such as `< >` or `[ ]`. The intention is to allow separators such as spaces to be embedded inside of delimiters; such embedded separators will not be parsed as separators. For example, Ukrainian noun specs allow footnotes in brackets to be inserted inside of angle brackets; something like `меди́чна<+> сестра́` is legal, as is ` меди́чна<+> сестра́ `, and the parsing code should not be confused by the embedded brackets, spaces or angle brackets.

The parsing is done by two functions, which work in close concert: {parse_balanced_segment_run} and {split_alternating_runs}. To illustrate, consider the following:

{parse_balanced_segment_run("foo bar", "<", ">")} =

{ {"foo", "", " bar", "", ""}}

then

{split_alternating_runs({"foo", "", " bar", "", ""}, " ")} =

{ {{"foo", "", ""}, {"bar", "", ""}}}

Here, we start out with a typical inflected text spec `foo bar`, call {parse_balanced_segment_run} on it, and call {split_alternating_runs} on the result. The output of {parse_balanced_segment_run} is a list where even-numbered segments are bounded by the bracket-like characters passed into the function, and odd-numbered segments consist of the surrounding text. {split_alternating_runs} is called on this, and splits only the odd-numbered segments, grouping all segments between the specified character. Note that the inner lists output by {split_alternating_runs} are themselves in the same format as the output of {parse_balanced_segment_run}, with bracket-bounded text in the even-numbered segments. Hence, such lists can be passed again to {split_alternating_runs}. ]==]

--[==[ Parse a string containing matched instances of parens, brackets or the like. Return a list of strings, alternating between textual runs not containing the open/close characters and runs beginning and ending with the open/close characters. For example,

{parse_balanced_segment_run("foo(x(1)), bar(2)", "(", ")") = {"foo", "(x(1))", ", bar", "(2)", ""}} ]==] function export.parse_balanced_segment_run(segment_run, open, close) return m_string_utilities.split(segment_run, "(%b" .. open .. close .. ")") end

-- The following is an equivalent, older implementation that does not use %b (written before I was aware of %b). --[=[ function export.parse_balanced_segment_run(segment_run, open, close) local break_on_open_close = m_string_utilities.split(segment_run, "([%" .. open .. "%" .. close .. "])")	local text_and_specs = {} local level = 0 local seg_group = {} for i, seg in ipairs(break_on_open_close) do		if i % 2 == 0 then if seg == open then table.insert(seg_group, seg) level = level + 1 else assert(seg == close) table.insert(seg_group, seg) level = level - 1 if level < 0 then error("Unmatched " .. close .. " sign: '" .. segment_run .. "'") elseif level == 0 then table.insert(text_and_specs, table.concat(seg_group)) seg_group = {} end end elseif level > 0 then table.insert(seg_group, seg) else table.insert(text_and_specs, seg) end end if level > 0 then error("Unmatched " .. open .. " sign: '" .. segment_run .. "'") end return text_and_specs end ]=]

--[==[ Like parse_balanced_segment_run but accepts multiple sets of delimiters. For example,

{parse_multi_delimiter_balanced_segment_run("foo[bar(baz[bat])], quux ", {{"[", "]"}, {"(", ")"}, {"<", ">"}}) = {"foo", "[bar(baz[bat])]", ", quux", " ", ""}}.

Each element in the list of delimiter pairs is a string specifying an equivalence class of possible delimiter characters. You can use this, for example, to allow either "[" or "&#91;" to be treated equivalently, with either one closed by either "]" or "&#93;". To do this, first replace "&#91;" and "&#93;" with single Unicode characters such as U+FFF0 and U+FFF1, and then specify a two-character string containing "[" and U+FFF0 as the opening delimiter, and a two-character string containing "]" and U+FFF1 as the corresponding closing delimiter.

If `no_error_on_unmatched` is given and an error is found during parsing, a string is returned containing the error message instead of throwing an error. ]==] function export.parse_multi_delimiter_balanced_segment_run(segment_run, delimiter_pairs, no_error_on_unmatched) local escaped_delimiter_pairs = {} local open_to_close_map = {} local open_close_items = {} local open_items = {} for _, open_close in ipairs(delimiter_pairs) do		local open, close = unpack(open_close) open = rsub(open, "([%[%]%%%%-])", "%%%1") close = rsub(close, "([%[%]%%%%-])", "%%%1") table.insert(open_close_items, open) table.insert(open_close_items, close) table.insert(open_items, open) open = "[" .. open .. "]"		close = "[" .. close .. "]"		open_to_close_map[open] = close table.insert(escaped_delimiter_pairs, {open, close}) end local open_close_pattern = "([" .. table.concat(open_close_items) .. "])" local open_pattern = "([" .. table.concat(open_items) .. "])" local break_on_open_close = m_string_utilities.split(segment_run, open_close_pattern) local text_and_specs = {} local level = 0 local seg_group = {} local open_at_level_zero

for i, seg in ipairs(break_on_open_close) do		if i % 2 == 0 then table.insert(seg_group, seg) if level == 0 then if not rfind(seg, open_pattern) then local errmsg = "Unmatched close sign " .. seg .. ": '" .. segment_run .. "'"					if no_error_on_unmatched then return errmsg else error(errmsg) end end assert(open_at_level_zero == nil) for _, open_close in ipairs(escaped_delimiter_pairs) do					local open, close = unpack(open_close) if rfind(seg, open) then open_at_level_zero = open break end end if open_at_level_zero == nil then error(("Internal error: Segment %s didn't match any open regex"):format(seg)) end level = level + 1 elseif rfind(seg, open_at_level_zero) then level = level + 1 elseif rfind(seg, open_to_close_map[open_at_level_zero]) then level = level - 1 assert(level >= 0) if level == 0 then table.insert(text_and_specs, table.concat(seg_group)) seg_group = {} open_at_level_zero = nil end end elseif level > 0 then table.insert(seg_group, seg) else table.insert(text_and_specs, seg) end end if level > 0 then local errmsg = "Unmatched open sign " .. open_at_level_zero .. ": '" .. segment_run .. "'"		if no_error_on_unmatched then return errmsg else error(errmsg) end end return text_and_specs end

--[==[ Check whether a term contains top-level HTML. We want to distinguish inline modifiers from HTML. We assume an inline modifier is either a boolean modifier like ` ` or a prefix modifier like ``. All other things inside of angle brackets, e.g. ` `, `   `, `   `, etc., should be flagged as HTML (typically caused by wrapping an argument in ..., ... or similar, but sometimes specified directly, e.g. ` 6 `). By default, we assume the tag in an inline modifier contains either letters, numbers, hyphens or underscore (but not spaces), and must either stand alone or be followed by a colon, leading to a default HTML-checking pattern of {"<[%w_%-]*[^%w_%-:>]"}. But this can be modified; e.g. Module:tl-pronunciation allows modifiers of the form `< pos ^ defn >` or `< pos, pos , pos ^ defn >`, and would need to use its own HTML pattern. It's important we restrict the check for HTML to top-level to allow for generated HTML inside of e.g. qualifier tags, such as ` foo `. ]==] function export.term_contains_top_level_html(term, html_pattern) html_pattern = html_pattern or "<[%w_%-]*[^%w_%-:>]" -- If no HTML anywhere, the answer is no.	if not term:find(html_pattern) then return false end -- Otherwise, we have to call parse_balanced_segment_run and check alternate runs at top level. local runs = export.parse_balanced_segment_run(term, "<", ">") for i = 2, #runs, 2 do if runs[i]:find("^" .. html_pattern) then return true end end return false end

--[==[ Split a list of alternating textual runs of the format returned by `parse_balanced_segment_run` on `splitchar`. This only splits the odd-numbered textual runs (the portions between the balanced open/close characters). The return value is a list of lists, where each list contains an odd number of elements, where the even-numbered elements of the sublists are the original balanced textual run portions. For example, if we do

{parse_balanced_segment_run("foo bar", "<", ">") = {"foo", "<M.proper noun>", " bar", "<F>", ""}}

then

{split_alternating_runs({"foo", "<M.proper noun>", " bar", "<F>", ""}, " ") = {{"foo", "<M.proper noun>", ""}, {"bar", "<F>", ""}}}

Note that we did not touch the text "<M.proper noun>" even though it contains a space in it, because it is an even-numbered element of the input list. This is intentional and allows for embedded separators inside of brackets/parens/etc. Note also that the inner lists in the return value are of the same form as the input list (i.e. they consist of alternating textual runs where the even-numbered segments are balanced runs), and can in turn be passed to split_alternating_runs.

If `preserve_splitchar` is passed in, the split character is included in the output, as follows:

{split_alternating_runs({"foo", "<M.proper noun>", " bar", "<F>", ""}, " ", true) = {{"foo", "<M.proper noun>", ""}, {" "}, {"bar", "<F>", ""}}}

Consider what happens if the original string has multiple spaces between brackets, and multiple sets of brackets without spaces between them.

{parse_balanced_segment_run("foo[dated][low colloquial] baz-bat quux xyzzy[archaic]", "[", "]") = {"foo", "[dated]", "", "[low colloquial]", " baz-bat quux xyzzy", "[archaic]", ""}}

then

{split_alternating_runs({"foo", "[dated]", "", "[low colloquial]", " baz-bat quux xyzzy", "[archaic]", ""}, "[ %-]") = {{"foo", "[dated]", "", "[low colloquial]", ""}, {"baz"}, {"bat"}, {"quux"}, {"xyzzy", "[archaic]", ""}}}

If `preserve_splitchar` is passed in, the split character is included in the output, as follows:

{split_alternating_runs({"foo", "[dated]", "", "[low colloquial]", " baz bat quux xyzzy", "[archaic]", ""}, "[ %-]", true) = {{"foo", "[dated]", "", "[low colloquial]", ""}, {" "}, {"baz"}, {"-"}, {"bat"}, {" "}, {"quux"}, {" "}, {"xyzzy", "[archaic]", ""}}}

As can be seen, the even-numbered elements in the outer list are one-element lists consisting of the separator text. ]==] function export.split_alternating_runs(segment_runs, splitchar, preserve_splitchar) local grouped_runs = {} local run = {} for i, seg in ipairs(segment_runs) do		if i % 2 == 0 then table.insert(run, seg) else local parts = preserve_splitchar and m_string_utilities.split(seg, "(" .. splitchar .. ")") or				rsplit(seg, splitchar) table.insert(run, parts[1]) for j=2,#parts do				table.insert(grouped_runs, run) run = {parts[j]} end end end if #run > 0 then table.insert(grouped_runs, run) end return grouped_runs end

function export.strip_spaces(text) return rsub(text, "^%s*(.-)%s*$", "%1") end

--[==[ Apply an arbitrary function `frob` to the "raw-text" segments in a split run set (the output of split_alternating_runs). We leave alone stuff within balanced delimiters (footnotes, inflection specs and the like), as well as splitchars themselves if present. `preserve_splitchar` indicates whether splitchars are present in the split run set. `frob` is a function of one argument (the string to frob) and should return one argument (the frobbed string). We operate by only frobbing odd-numbered segments, and only in odd-numbered runs if preserve_splitchar is given. ]==] function export.frob_raw_text_alternating_runs(split_run_set, frob, preserve_splitchar) for i, run in ipairs(split_run_set) do		if not preserve_splitchar or i % 2 == 1 then for j, segment in ipairs(run) do				if j % 2 == 1 then run[j] = frob(segment) end end end end end

--[==[ Like split_alternating_runs but applies an arbitrary function `frob` to "raw-text" segments in the result (i.e. not stuff within balanced delimiters such as footnotes and inflection specs, and not splitchars if present). `frob` is a function of one argument (the string to frob) and should return one argument (the frobbed string). ]==] function export.split_alternating_runs_and_frob_raw_text(run, splitchar, frob, preserve_splitchar) local split_runs = export.split_alternating_runs(run, splitchar, preserve_splitchar) export.frob_raw_text_alternating_runs(split_runs, frob, preserve_splitchar) return split_runs end

--[==[ Split the non-modifier parts of an alternating run (after parse_balanced_segment_run is called) on a Lua pattern, but not on certain sequences involving characters in that pattern (e.g. comma+whitespace). `splitchar` is the pattern to split on; `preserve_splitchar` indicates whether to preserve the delimiter and is the same as in split_alternating_runs. `escape_fun` is called beforehand on each run of raw text and should return two values: the escaped run and whether unescaping is needed. If any call to `escape_fun` indicates that unescaping is needed, `unescape_fun` will be called on each run of raw text after splitting on `splitchar`. The return value of this function is as in split_alternating_runs. ]==] function export.split_alternating_runs_escaping(run, splitchar, preserve_splitchar, escape_fun, unescape_fun) -- First replace comma with a temporary character in comma+whitespace sequences. local need_unescape = false for i, seg in ipairs(run) do		if i % 2 == 1 then local this_need_unescape run[i], this_need_unescape = escape_fun(run[i]) need_unescape = need_unescape or this_need_unescape end end

if need_unescape then return export.split_alternating_runs_and_frob_raw_text(run, splitchar, unescape_fun, preserve_splitchar) else return export.split_alternating_runs(run, splitchar, preserve_splitchar) end end

--[==[ Replace comma with a temporary char in comma + whitespace. ]==] function export.escape_comma_whitespace(run, tempcomma) tempcomma = tempcomma or u(0xFFF0) local escaped = false

if run:find("\\,") then run = run:gsub("\\,", "\\" .. tempcomma) -- assign to temp to discard second return value escaped = true end if run:find(",%s") then run = run:gsub(",(%s)", tempcomma .. "%1") -- assign to temp to discard second return value escaped = true end return run, escaped end

--[==[ Undo the replacement of comma with a temporary char. ]==] function export.unescape_comma_whitespace(run, tempcomma) tempcomma = tempcomma or u(0xFFF0)

run = run:gsub(tempcomma, ",") -- assign to temp to discard second return value return run end

--[==[ Split the non-modifier parts of an alternating run (after parse_balanced_segment_run is called) on comma, but not on comma+whitespace. See `split_on_comma` above for more information and the meaning of `tempcomma`. ]==] function export.split_alternating_runs_on_comma(run, tempcomma) tempcomma = tempcomma or u(0xFFF0)

-- Replace comma with a temporary char in comma + whitespace. local function escape_comma_whitespace(seg) return export.escape_comma_whitespace(seg, tempcomma) end

-- Undo replacement of comma with a temporary char in comma + whitespace. local function unescape_comma_whitespace(seg) return export.unescape_comma_whitespace(seg, tempcomma) end

return export.split_alternating_runs_escaping(run, ",", false, escape_comma_whitespace, unescape_comma_whitespace) end

--[==[ Split text on a Lua pattern, but not on certain sequences involving characters in that pattern (e.g. comma+whitespace). `splitchar` is the pattern to split on; `preserve_splitchar` indicates whether to preserve the delimiter between split segments. `escape_fun` is called beforehand on the text and should return two values: the escaped run and whether unescaping is needed. If the call to `escape_fun` indicates that unescaping is needed, `unescape_fun` will be called on each run of text after splitting on `splitchar`. The return value of this a list of runs, interspersed with delimiters if `preserve_splitchar` is specified. ]==] function export.split_escaping(text, splitchar, preserve_splitchar, escape_fun, unescape_fun) if not rfind(text, splitchar) then return {text} end

-- If there are square or angle brackets, we don't want to split on delimiters inside of them. To effect this, we	-- use parse_multi_delimiter_balanced_segment_run to parse balanced brackets, then do delimiter splitting on the -- non-bracketed portions of text using split_alternating_runs_escaping, and concatenate back to a list of -- strings. When calling parse_multi_delimiter_balanced_segment_run, we make sure not to throw an error on -- unbalanced brackets; in that case, we fall through to the code below that handles the case without brackets. if text:find("[%[<]") then local runs = export.parse_multi_delimiter_balanced_segment_run(text, {{"[", "]"}, {"<", ">"}},			"no error on unmatched") if type(runs) ~= "string" then local split_runs = export.split_alternating_runs_escaping(runs, splitchar, preserve_splitchar, escape_fun,				unescape_fun) for i = 1, #split_runs, (preserve_splitchar and 2 or 1) do				split_runs[i] = table.concat(split_runs[i]) end return split_runs end end

-- First escape sequences we don't want to count for splitting. local need_unescape text, need_unescape = escape_fun(text)

local parts = preserve_splitchar and m_string_utilities.split(text, "(" .. splitchar .. ")") or		rsplit(text, splitchar) if need_unescape then for i = 1, #parts, (preserve_splitchar and 2 or 1) do			parts[i] = unescape_fun(parts[i]) end end return parts end

--[==[ Split text on comma, but not on comma+whitespace. This is similar to `mw.text.split(text, ",")` but will not split on commas directly followed by whitespace, to handle embedded commas in terms (which are almost always followed by a space). `tempcomma` is the Unicode character to temporarily use when doing the splitting; normally U+FFF0, but you can specify a different character if you use U+FFF0 for some internal purpose. ]==] function export.split_on_comma(text, tempcomma) -- Don't do anything if no comma. Note that split_escaping has a similar check at the beginning, so if there's a	-- comma we effectively do this check twice, but this is worth it to optimize for the common no-comma case. if not text:find(",") then return {text} end

tempcomma = tempcomma or u(0xFFF0)

-- Replace comma with a temporary char in comma + whitespace. local function escape_comma_whitespace(run) return export.escape_comma_whitespace(run, tempcomma) end

-- Undo replacement of comma with a temporary char in comma + whitespace. local function unescape_comma_whitespace(run) return export.unescape_comma_whitespace(run, tempcomma) end

return export.split_escaping(text, ",", false, escape_comma_whitespace, unescape_comma_whitespace) end

--[==[ Ensure that Wikicode (bracketed links, HTML, bold/italics, etc.) displays literally in error messages by inserting a Unicode word-joiner symbol after all characters that may trigger Wikicode interpr. Replacing with equivalent HTML escapes doesn't work because they are displayed literally. I could not get this to work using ... (those tags display literally) and using using (same thing). FIXME: This is a massive hack; there must be a better way. ]==] function export.escape_wikicode(term) term = term:gsub("([%[<'])", "%1" .. u(0x2060)) return term end

function export.make_parse_err(arg_gloss) return function(msg, stack_frames_to_ignore) error(export.escape_wikicode(("%s: %s"):format(msg, arg_gloss)), stack_frames_to_ignore) end end

-- Parse a term that may include a link 'LINK' or a two-part link 'DISPLAY'. FIXME: Doesn't currently -- handle embedded links like 'FOO BAR' or BAR BAZ' or 'FOOs'; if they are detected, it returns -- the term unchanged and `nil` for the display form. local function parse_bracketed_term(term, parse_err) local inside = term:match("^%[%[(.*)%]%]$") if inside then if inside:find("%[%[") or inside:find("%]%]") then -- embedded links, e.g. 'FOO BAR'; FIXME: we should process them properly return term, nil end local parts = rsplit(inside, "|") if #parts > 2 then parse_err("Saw more than two parts inside a bracketed link") end return unpack(parts) end return term, nil end

--[==[ Parse a term that may have a language code (or possibly multiple comma-separated language codes, if `allow_multiple` is given) preceding it (e.g. {la:minūtia} or {grc:σκατός} or {nan-hbl,hak:毋知}). Return four arguments: list of such objects if `allow_multiple` is given; Wikipedia and Wikisource prefixes) or of the form {{ link }, otherwise the full term; Etymology-only languages are allowed. This function also correctly handles Wikipedia prefixes (e.g. {w:Abatemarco} or {w:it:Colle Val d'Elsa} or {lw:ru:Филарет}) and Wikisource prefixes (e.g. {s:Twelve O'Clock} or {s:Walden} or {s:fr:Perceval ou le conte du Graal} or {s:ro:Mr. Vucea} or {ls:ko:이상적 부인} or {ls:ko:조선 독립의 서}) and converts them into two-part links, with the display form not including the Wikipedia or Wikisource prefix unless it was explicitly specified using a two-part link as in {lw:ru:Митрополи́т Филаре́т} or {ls:ko:조선 독립의 서}. The difference between {w:} ("Wikipedia") and {lw:} ("Wikipedia link") is that the latter requires a language code and returns the corresponding language object; same for the difference between {s:} ("Wikisource") and {ls:} ("Wikisource link").
 * 1) the term minus the language code;
 * 2) the language object corresponding to the language code (possibly a family object if `allow_family` is given), or a
 * 1) the link if the term is of the form { display } (it may be generated into that form with
 * 1) the display part if the term is of the form { display }, otherwise nil.

NOTE: Embedded links are not correctly handled currently. If an embedded link is detected, the whole term is returned as the link part (third argument), and the display part is nil. If you construct your own link from the link and display parts, you must check for this.

`parse_err_or_paramname` is an optional function of one or two arguments to display an error, or a string naming a parameter to display in the error message. If omitted, a function is generated based off of `term`. (The second argument to the function is the number of stack frames to ignore when calling error; if you declare your error function with only one argument, things will still work fine.) ]==] function export.parse_term_with_lang(data_or_term, parse_err_or_paramname) if type(data_or_term) == "string" then data_or_term = { term = data_or_term }		if type(parse_err_or_paramname) == "function" then data_or_term.parse_err = parse_err_or_paramname else data_or_term.paramname = parse_err_or_paramname end end local term = data_or_term.term local parse_err = data_or_term.parse_err or		data_or_term.paramname and export.make_parse_err(("%s=%s"):format(data_or_term.paramname, term)) or		export.make_parse_err(term) -- Parse off an initial language code (e.g. 'la:minūtia' or 'grc:σκατός'). First check for Wikipedia -- prefixes ('w:Abatemarco' or 'w:it:Colle Val d'Elsa' or 'lw:zh:邹衡') and Wikisource prefixes -- ('s:ro:Mr. Vucea' or 'ls:ko:이상적 부인'). Wikipedia/Wikisource language codes follow a similar -- format to Wiktionary language codes (see below). Here and below we don't parse if there's a space after the -- colon (happens e.g. if the user uses inside of 🇨🇴, grrr ...). local termlang, foreign_wiki, actual_term = term:match("^(l?[ws]):([a-z][a-z][a-z-]*):([^ ].*)$") if not termlang then termlang, actual_term = term:match("^([ws]):([^ ].*)$") end if termlang then local wiki_links = termlang:find("^l") local base_wiki_prefix = termlang:find("w$") and "w:" or "s:" local wiki_prefix = base_wiki_prefix .. (foreign_wiki and foreign_wiki .. ":" or "") local link, display = parse_bracketed_term(actual_term, parse_err) if link:find("%[%[") or display and display:find("%[%[") then -- FIXME, this should be handlable with the right parsing code parse_err("Cannot have embedded brackets following a Wikipedia (w:... or lw:...) link; expand the term to a fully bracketed term w:DISPLAY or similar") end local lang = wiki_links and require("Module:languages").getByCode(foreign_wiki, parse_err, "allow etym") or nil local prefixed_link = wiki_prefix .. link return ("%s"):format(prefixed_link, display or link), lang, prefixed_link, display end

-- Wiktionary language codes are in one of the following formats, where 'x' is a lowercase letter and 'X' an	-- uppercase letter: -- xx	-- xxx -- xxx-xxx -- xxx-xxx-xxx (esp. for protolanguages) -- xx-xxx (for etymology-only languages) -- xx-xxx-xxx (maybe? for etymology-only languages) -- xx-XX (for etymology-only languages, where XX is a country code, e.g. en-US) -- xxx-XX (for etymology-only languages, where XX is a country code) -- xx-xxx-XX (for etymology-only languages, where XX is a country code) -- xxx-xxx-XX (for etymology-only langauges, where XX is a country code, e.g. nan-hbl-PH) -- Things like xxx-x+ (e.g. cmn-pinyin, cmn-tongyong) -- VL., LL., etc.	-- -- We check the for nonstandard Latin etymology language codes separately, and otherwise make only the following -- assumptions: -- (1) There are one to three hyphen-separated components. -- (2) The last component can consist of two uppercase ASCII letters; otherwise, all components contain only --    lowercase ASCII letters. -- (3) Each component must have at least two letters. -- (4) The first component must have two or three letters. local function is_possible_lang_code(code) -- Special hack for Latin variants, which can have nonstandard etym codes, e.g. VL., LL. if code:find("^[A-Z]L%.$") then return true end return code:find("^([a-z][a-z][a-z]?)$") or			code:find("^[a-z][a-z][a-z]?%-[A-Z][A-Z]$") or			code:find("^[a-z][a-z][a-z]?%-[a-z][a-z]+$") or			code:find("^[a-z][a-z][a-z]?%-[a-z][a-z]+%-[A-Z][A-Z]$") or			code:find("^[a-z][a-z][a-z]?%-[a-z][a-z]+%-[a-z][a-z]+$") end

local function get_by_code(code, allow_bad) local lang if data_or_term.lang_cache then lang = data_or_term.lang_cache[code] end if lang == nil then lang = require("Module:languages").getByCode(code, not allow_bad and parse_err or nil, "allow etym",				data_or_term.allow_family) if data_or_term.lang_cache then data_or_term.lang_cache[code] = lang or false end end return lang or nil end

if data_or_term.allow_multiple then local termlang_spec termlang_spec, actual_term = term:match("^([a-zA-Z.,-]+):([^ ].*)$") if termlang_spec then termlang = rsplit(termlang_spec, ",") local all_possible_code = true for _, code in ipairs(termlang) do				if not is_possible_lang_code(code) then all_possible_code = false break end end if all_possible_code then local saw_nil = false for i, code in ipairs(termlang) do					termlang[i] = get_by_code(code, data_or_term.allow_bad) if not termlang[i] then saw_nil = true end end if saw_nil then termlang = nil else term = actual_term end else termlang = nil end end else termlang, actual_term = term:match("^([a-zA-Z.-]+):([^ ].*)$") if termlang then if is_possible_lang_code(termlang) then termlang = get_by_code(termlang, data_or_term.allow_bad) if termlang then term = actual_term end else termlang = nil end end end local link, display = parse_bracketed_term(term, parse_err) return term, termlang, link, display end

--[==[ Parse a term that may have inline modifiers attached (e.g. {rifiuti<q:plural-only>} or {rinfusa<t:bulk cargo><lit:resupplying><qq:more common in the plural >}). `generate_obj` are required):  error messages). return a corresponding parsed object (into which the inline modifiers will be rewritten). If declared with one argument, that will be the raw value to parse; if declared with two arguments, the second argument will be the `parse_err` function (see below). with any desired contextual text (e.g. the argument name and value that triggered the error). If omitted, a default function will be generated which displays the error along with the original value of `arg` (passed through  {escape_wikicode} above to ensure that Wikicode (such as links) is displayed literally). may be followed by inline modifiers, and the return value will be a list of parsed objects instead of a single object. Note that splitting on delimiters will not happen in certain protected sequences (by default  comma+whitespace; see below). The algorithm to split on delimiters is sensitive to inline modifier syntax and will not be confused by delimiters inside of inline modifiers, which do not trigger splitting (whether or not contained  within protected sequences). into which the list of per-term objects is stored (into the `terms` field) and into which any modifiers that are given the `overall` property (see below) will be stored. If given, this value will be returned as the value of  {parse_inline_modifiers}. If `outer_container` is not given, {parse_inline_modifiers} will return the list of  per-term objects directly, and no modifier may have an `overall` property. parsed object describing the element that comes after the delimiter. The delimiter is stored in a key whose name is controlled by `separator_key`, which defaults to "separator". See above. control the protected sequences that won't be split. By default, `escape_comma_whitespace` and `unescape_comma_whitespace` are used, so that comma+whitespace sequences won't be split. prior to further parsing. This is used, for example, in Module:tl-pronunciation to convert modifiers of the form to, so they can be processed as standard modifiers. It could similarly be used, for example, to handle boolean modifiers like in desc and convert them to a standard form. It runs just before parsing out the modifier prefix and value, and is passed an object containing fields `modtext` (the un-normalized modifier text, without surrounding angle  brackets) and `parse_err` (the passed-in or autogenerated function to signal an error during parsing; a function   of one argument, a message, which throws an error displaying that message). It should return a single value, the normalized value of `modtext`.
 * `arg` is the term to parse.
 * `props` is an object holding further properties controlling how to parse the term (only `param_mods` and
 * `paramname` is the name of the parameter where `arg` comes from, or nil if this isn't available (it is used only in
 * `param_mods` is a table describing the allowed inline modifiers (see below).
 * `generate_obj` is a function of one or two arguments that should parse the argument minus the inline modifiers and
 * `parse_err` is an optional function of one argument (an error message) and should display the error message, along
 * `splitchar` is a Lua pattern. If specified, `arg` can consist of multiple delimiter-separated terms, each of which
 * `outer_container`, if specified, is used when multiple delimiter-separated terms are possible, and is the object
 * `preserve_splitchar`, if specified, causes the actual delimiter matched by `splitchar` to be returned in the
 * `separator_key` controls the key into which the actual delimiter is written when `preserve_splitchar` is used.
 * `escape_fun` and `unescape_fun` are as in split_escaping and split_alternating_runs_escaping above and
 * `pre_normalize_modifiers`, if specified, is a function of one argument, which can be used to "normalize" modifiers

`param_mods` is a table describing allowed modifiers. The keys of the table are modifier prefixes and the values are tables describing how to parse and store the associated modifier values. Here is a typical example, for an item that takes the standard modifiers associated with `full_link` in Module:links, as well as left and right qualifiers and labels:

{ local param_mods = { alt = {}, t = { -- Module:links expects the gloss in "gloss". item_dest = "gloss", },	gloss = {}, tr = {}, ts = {}, g = { -- Module:links expects the genders in "g". `sublist = true` automatically splits on comma (optionally		-- with surrounding whitespace). item_dest = "genders", sublist = true, },	pos = {}, lit = {}, id = {}, sc = { -- Automatically parse as a script code and convert to a script object. type = "script", },	-- Qualifiers and labels q = { type = "qualifier", qq = { type = "qualifier", }	l = { type = "labels", },	ll = { type = "labels", }, } }

In the table values: the object from the string form given by the user into the form needed for further processing. Note that `type` makes use of additional properties that may be specified. Specifically, if {type = "language"}, the properties `family` and `method` are also examined, and if {type = "family"} or {type = "script"}, the property `method` is examined. is simply written into the parsed object under the appropriate key; but an error is generated if the key already has a value. (This means that multiple occurrences of a given modifier are allowed if `store` is given, but not otherwise.) `store` can be one of the following: is first converted to an empty list; key's existing value using {table.insert}; {"insert-flattened"} and {"insertIfNot-flattened"}, if there is no existing value for the key, the converted value is  just stored directly. This means that future appends will side-effect that value, so make sure that the return value of the conversion function for this key generates a fresh list each time.)   the message about the modifier in question, the angle-bracket spec that includes the modifier in it, the overall	value, and (if `paramname` was given) the parameter holding the overall value.   to an individual term in the argument, and must occur after the last item separated by `splitchar`, instead of being   allowed to occur after any of them. The modifier will be stored into the outer container object, which must exist   (i.e. `outer_container` must have been given).
 * `item_dest` specifies the destination key to store the object into (if not the same as the modifier key itself).
 * `type`, `set`, `sublist` and `convert` have the same meaning as in Module:parameters and are used for converting
 * `store` describes how to store the converted modifier value into the parsed object. If omitted, the converted value
 * {"insert"}: the converted value is appended to the key's value using {table.insert}; if the key has no value, it
 * {"insertIfNot"}: is similar but appends the value using {insertIfNot} in Module:table;
 * {"insert-flattened"}, the converted value is assumed to be a list and the objects are appended one-by-one into the
 * {"insertIfNot-flattened"} is similar but appends using {insertIfNot} in Module:table; (WARNING: When using
 * a function of one argument, an object with the following properties:
 * `dest`: the object to write the value into;
 * `key`: the field where the value should be written;
 * `converted`: the (converted) value to write;
 * `raw_val`: the raw, user-specified value (a string);
 * `parse_err`: a function of one argument (an error string), which signals an error, and includes extra context in
 * `overall` only applies if `splitchar` is given. In this case, the modifier applies to the entire argument rather than

The return value of {parse_inline_modifiers} depends on whether `splitchar` and `outer_container` have been given. If neither is given, the return value is the object returned by `generate_obj`. If `splitchar` but not `outer_container` is given, the return value is a list of per-term objects, each of which is generated by `generate_obj`. If both `splitchar` and `outer_container` are given, the return value is the value of `outer_container` and the per-term objects are stored into the `terms` field of this object. ]==] function export.parse_inline_modifiers(arg, props) local segments = export.parse_balanced_segment_run(arg, "<", ">")

local function verify_no_overall for mod, mod_props in pairs(props.param_mods) do			if mod_props.overall then error("Internal caller error: Can't specify `overall` for a modifier in `param_mods` unless `outer_container` property is given") end end end

if not props.splitchar then if props.outer_container then error("Internal caller error: Can't specify `outer_container` property unless `splitchar` is given") end verify_no_overall return export.parse_inline_modifiers_from_segments { group = segments, group_index = nil, separated_groups = nil, arg = arg, props = props }	else local terms = {} if props.outer_container then props.outer_container.terms = terms else verify_no_overall end local separated_groups = export.split_alternating_runs_escaping(segments, props.splitchar,			props.preserve_splitchar, props.escape_fun or export.escape_comma_whitespace,			props.unescape_fun or export.unescape_comma_whitespace) for j = 1, #separated_groups, (props.preserve_splitchar and 2 or 1) do			local parsed = export.parse_inline_modifiers_from_segments { group = separated_groups[j], group_index = j,				separated_groups = separated_groups, arg = arg, props = props }			if props.preserve_splitchar and j > 1 then parsed[props.separator_key or "separator"] = separated_groups[j - 1][1] end table.insert(terms, parsed) end if props.outer_container then return props.outer_container else return terms end end end

--[==[ Parse a single term that may have inline modifiers attached. This is a helper function of {parse_inline_modifiers} but is exported separately in case the caller needs to make their own call to {parse_balanced_segment_run} (as in Module:quote, which splits on several matched delimiters simultaneously). It takes only a single argument, `data`, which is an object with the following fields: Module:parse utilities), or one of the lists returned by calling {split_alternating_runs}. argument parsed by {parse_inline_modifiers}, or {nil} if this isn't applicable (i.e. multiple terms aren't allowed in the argument).
 * `group`: A list of segments as output by {parse_balanced_segment_run} (see the overall comment at the top of
 * `separated_groups`: The list of groups (each of which is of the form of `group`) describing all the terms in the
 * `group_index`: The index into `separated_groups` where `group` can be found, or {nil} if not applicable.
 * `arg`: The original user-specified argument being parsed; used only for error messages.
 * `props`: The `props` argument to {parse_inline_modifiers}.

The return value is the object created by `generate_obj`, with properties filled in describing the modifiers of the term in question. ]==] function export.parse_inline_modifiers_from_segments(data) local props = data.props local group = data.group local function get_valid_prefixes local valid_prefixes = {} for param_mod, _ in pairs(props.param_mods) do			table.insert(valid_prefixes, param_mod) end table.sort(valid_prefixes) return valid_prefixes end

local function get_arg_gloss if props.paramname then return ("%s=%s"):format(props.paramname, data.arg) else return data.arg end end

local parse_err = props.parse_err or export.make_parse_err(get_arg_gloss) local term_obj = props.generate_obj(group[1], parse_err) for k = 2, #group - 1, 2 do		if group[k + 1] ~= "" then parse_err("Extraneous text '" .. group[k + 1] .. "' after modifier") end local modtext = group[k]:match("^<(.*)>$") if not modtext then parse_err("Internal error: Modifier '" .. group[k] .. "' isn't surrounded by angle brackets") end if props.pre_normalize_modifiers then -- FIXME: For some use cases, we might have to pass more information. modtext = props.pre_normalize_modifiers { modtext = modtext, parse_err = parse_err }		end local prefix, val = modtext:match("^([a-zA-Z0-9+_-]+):(.*)$") if not prefix then local valid_prefixes = get_valid_prefixes for i, valid_prefix in ipairs(valid_prefixes) do valid_prefixes[i] = "'" .. valid_prefix .. ":'"			end parse_err("Modifier " .. group[k] .. " lacks a prefix, should begin with one of " ..				require("Module:table").serialCommaJoin(valid_prefixes, {dontTag = true})) end local prefix_parse_err = export.make_parse_err(("modifier prefix '%s' in %s in %s"):format(prefix, group[k], get_arg_gloss)) if props.param_mods[prefix] then local mod_props = props.param_mods[prefix] local key = mod_props.item_dest or prefix local dest if mod_props.overall then if not data.separated_groups then prefix_parse_err("Internal error: `data.separated_groups` not given when `overall` is seen") end if not props.outer_container then -- This should have been caught earlier during validation in parse_inline_modifiers. prefix_parse_err("Internal error: `props.outer_container` not given when `overall` is seen") end if data.group_index ~= #data.separated_groups then prefix_parse_err("Prefix should occur after the last comma-separated term") end dest = props.outer_container else dest = term_obj end

local converted = val if mod_props.type or mod_props.set or mod_props.sublist or mod_props.convert then -- WARNING: Here as an optimization we embed some knowledge of convert_val in Module:parameters, -- specifically that if none of `type`, `set`, `sublist` and `convert` are set, the conversion is an -- identity operation and can be skipped. (convert_val also makes use of the fields `method` and				-- `family`, but only if `type` is set to certain values such as "language", "family" or "script", and				-- makes use of the field `required`, but only if `set` is set.) If this becomes problematic, consider -- removing the optimization. converted = require(parameters_module).convert_val(converted, prefix_parse_err, mod_props) end local store = props.param_mods[prefix].store if not store then if dest[key] then prefix_parse_err("Prefix occurs twice") end dest[key] = converted elseif store == "insert" then if not dest[key] then dest[key] = {converted} else table.insert(dest[key], converted) end elseif store == "insertIfNot" then if not dest[key] then dest[key] = {converted} else require("Module:table").insertIfNot(dest[key], converted) end elseif store == "insert-flattened" then if not dest[key] then dest[key] = converted else for _, obj in ipairs(converted) do						table.insert(dest[key], obj) end end elseif store == "insertIfNot-flattened" then if not dest[key] then dest[key] = converted else for _, obj in ipairs(converted) do						require("Module:table").insertIfNot(dest[key], obj) end end elseif type(store) == "string" then prefix_parse_err(("Internal caller error: Unrecognized value '%s' for `store` property"):format(store)) elseif type(store) ~= "function" then prefix_parse_err(("Internal caller error: Unrecognized type for `store` property %s"):format( mw.dumpObject(store))) else store { dest = dest, key = key, converted = converted, raw = val, parse_err = prefix_parse_err }			end else local valid_prefixes = get_valid_prefixes for i, valid_prefix in ipairs(valid_prefixes) do valid_prefixes[i] = "'" .. valid_prefix .. "'"			end prefix_parse_err("Unrecognized prefix, should be one of " ..				require("Module:table").serialCommaJoin(valid_prefixes, {dontTag = true})) end end return term_obj end

return export

title: Module:parse utilities


text: syntax tree

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

title: syntax tree


text: parsing tree

title: parsing tree


text: derivation tree

title: derivation tree


text: syntax trees

title: syntax trees


text: derivation trees

title: derivation trees


text: parsing trees

title: parsing trees


text: Citations:meanfem

title: Citations:meanfem


text: meanfem

title: meanfem


text:
apepsinia

Noun

 * 1)  The absence of pepsin in the body.

title: apepsinia


text:
πάνοπτος

Etymology
From.

Adjective

 * 1) seen by all, visible to all

title: πάνοπτος


text:
User talk:2602:306:CEC2:A3A0:603E:4DF3:F376:8B24

niggeration
The original text spells "Black" with a capital B. Don't change real published texts just to match your preferences. That's messing with history. Equinox ◑ 05:51, 5 July 2022 (UTC)


text:
светр

Noun

 * 1) sweater, pullover

title: светр


text: aplostemonous

title: aplostemonous


text: riisuutumisesitys

title: riisuutumisesitys


text:
rikkakasvihävite

Noun

 * 1) herbicide, weedkiller

title: rikkakasvihävite


text:
rinnakkaiskäyttö

Noun

 * 1) parallel use, parallel operation

title: rinnakkaiskäyttö


text:
rinnanympärysmitta

Noun

 * 1) chest circumference, chest girth

title: rinnanympärysmitta


text:
rippikoulunkäynti

Noun

 * 1) going to a

title: rippikoulunkäynti


text:
rippikoulutodistus

Noun

 * 1)  diploma

title: rippikoulutodistus


text:
risteytysjalostus

Noun

 * 1) crossbreeding, outbreeding

title: risteytysjalostus


text:
ristikudosrengas

Noun

 * 1) diagonal ply tire

title: ristikudosrengas


text:
ristikukkaiskasvi

Noun

 * 1) cruciferous plant

title: ristikukkaiskasvi


text:
ristipistokirjonta

Noun

 * 1) cross stitch embroidery

title: ristipistokirjonta


text:
rituaalimusiikki

Noun

 * 1) ritual music

title: rituaalimusiikki


text:
rituaaliteurastus

Noun

 * 1) ritual slaughter

title: rituaaliteurastus


text:
rivinvaihtonäppäin

Noun

 * 1) Enter key, return key

title: rivinvaihtonäppäin


text:
rivitalohuoneisto

Noun

 * 1) an apartment or a flat in a terraced house or rowhouse

title: rivitalohuoneisto


text:
rokokoohuonekalu

Noun

 * 1) an article of rococo furniture

title: rokokoohuonekalu


text:
romanssinpoikanen

Noun

 * 1)  little romance

title: romanssinpoikanen


text:
roskakirjallisuus

Noun

 * 1) trash literature

title: roskakirjallisuus


text:
rosvokapitalismi

Noun

 * 1) exploitative capitalism

title: rosvokapitalismi


text:
rottinkihuonekalu

Noun

 * 1) an article of rattan furniture

title: rottinkihuonekalu


text:
rotuennakkoluulo

Noun

 * 1) racial prejudice

title: rotuennakkoluulo


text:
apoharmine

Etymology
en

Noun

 * 1)  An alkaloid, C8H8N2, derived from harmic acid, that behaves similarly to harmine, but that has greater solubility in water.
 * 2) * 1961, Chemical Society (Great Britain), Journal of the Chemical Society (part 3, page 2716)
 * Apoharmine and apoadifoline also exhibit similar colour changes in Dische's carbazole test.
 * Apoharmine and apoadifoline also exhibit similar colour changes in Dische's carbazole test.

title: apoharmine


text:
apodictive

Adjective

 * 1) apodictic

title: apodictive


text: pick-mes

title: pick-mes


text: factfems

title: factfems


text: meanfems

title: meanfems


text: thussies

title: thussies


text:
abschauen

Verb

 * 1)  to learn by watching
 * 2)  to plagiarize, copy especially schoolwork
 * 3) to lipread
 * 1)  to plagiarize, copy especially schoolwork
 * 2) to lipread
 * 1) to lipread

title: abschauen


text:
ghais

Verb

 * 1) to call; to send

title: ghais


text:
Naturheilverfahren

Noun

 * 1) naturopathic treatment

title: Naturheilverfahren


text: Espera

title: Espera


text:
Psychosomatik

Noun

 * 1) psychosomatics (psychosomatic medicine: the science of the significance of mental processes for the development and course of diseases)

title: Psychosomatik


text:
Umlenkung

Noun

 * 1) redirection

title: Umlenkung


text: футболці

title: футболці


text: huòqǐxiāoqiáng

title: huòqǐxiāoqiáng


text:
Diätetik

Noun

 * 1) dietetics (the science of proper nutrition)

title: Diätetik


text:
run mad

Verb

 * 1)  To go mad.

title: run mad


text:
lão sư

Etymology
.

Noun

 * 1) elderly teacher or master

title: lão sư


text: куплений

title: куплений


text: Beerup

title: Beerup


text:
shzhosum

Noun

 * 1) elderly teacher

title: shzhosum


text: куплено

title: куплено


text:
криворізький

Adjective

 * 1)  Kryvyi Rih

title: криворізький


text:
言語接触

Noun

 * 1)  language contact

title: 言語接触


text:
諸相

Noun

 * 1) various aspects

title: 諸相


text:
Hierocles

Etymology
From.

Translations

 * Catalan: Hièrocles
 * Finnish: Hierokles
 * French: Hiéroclès
 * Greek:
 * Italian: Ierocle
 * Latin: Hieroclēs
 * Polish: Hierokles
 * Russian: Гиеро́кл, Иеро́кл

title: Hierocles


text:
論考

Noun

 * 1) scholarly discussion

Verb

 * 1) to discuss; to hold a scholarly discussion

title: 論考


text:
渡加

Noun

 * 1) going to Canada

Verb

 * 1) to go to Canada

title: 渡加


text:
Template:R:cng:Zhou, Sun

<!--

title: Template:R:cng:Zhou, Sun


text: Category:Rhymes:Swedish/øːk/1 syllable

title: Category:Rhymes:Swedish/øːk/1 syllable


text: Category:Rhymes:Swedish/øːk

title: Category:Rhymes:Swedish/øːk


text: Category:ab:Berries

title: Category:ab:Berries


text:
distribusi

Etymology
From.

Noun

 * 1) distribution:
 * 2) an act of distributing or state of being distributed.
 * 3) anything distributed; portion; share.
 * 4) the result of distributing; arrangement.
 * 5)  the process by which goods get to final consumers over a geographical market, including storing, selling, shipping and advertising.
 * 6)  generalized functions used to formulate solutions of partial differential equations.
 * 7)  probability distribution; the set of relative likelihoods that a variable will have a value in a given interval.
 * 8) rationing: controlled distribution of scarce resources such as food or fuel; used typically in wartime.
 * 1)  generalized functions used to formulate solutions of partial differential equations.
 * 2)  probability distribution; the set of relative likelihoods that a variable will have a value in a given interval.
 * 3) rationing: controlled distribution of scarce resources such as food or fuel; used typically in wartime.

title: distribusi


text: Category:Rhymes:Swedish/øːk/2 syllables

title: Category:Rhymes:Swedish/øːk/2 syllables


text: apostrophied

title: apostrophied


text: купимо

title: купимо


text:
febfem

Etymology
Contraction of -.

Noun

 * 1)  A cisgender bisexual woman who exclusively dates other cisgender women.

title: febfem


text:
交婚

Noun

 * 1) intermarriage

Verb

 * 1) to intermarry

title: 交婚


text:
散住

Noun

 * 1) living scattered

Verb

 * 1) to live scattered

title: 散住


text: куплять

title: куплять


text:
appetently

Adverb

 * 1) In an appetent manner.

title: appetently


text:
hhdhe ssdda

Etymology
🇰🇲,.

Noun

 * 1) nebula

title: hhdhe ssdda


text: febfems

title: febfems


text:
ミルクセーキ

Etymology
.

Noun

 * 1) milkshake

title: ミルクセーキ


text: entseelend

title: entseelend


text: entseele

title: entseele


text: entseelst

title: entseelst


text: entseelest

title: entseelest


text: entseelet

title: entseelet


text: entseeltest

title: entseeltest


text: entseeltet

title: entseeltet


text: entseel

title: entseel


text:
逆引き

Etymology
From.

Noun

 * 1) reverse lookup

title: 逆引き


text: 名指し

title: 名指し


text:
lehhrr

Noun

 * 1) book

title: lehhrr


text:
なざし

Etymology
From.

Noun

 * 1) reference by name

Verb

 * 1) to refer by name

title: なざし


text:
Atēna

Etymology
Borrowed from.

Proper noun

 * 1)  Athena

title: Atēna


text:
interden

Adjective

 * 1) Between dens.

title: interden


text: купіть

title: купіть


text: Dogecoins

title: Dogecoins


text: купім

title: купім


text: купімо

title: купімо


text:
sleeper shark

Etymology
From, referring to their slow, lethargic habits.

Noun

 * 1) Any shark of the family.

title: sleeper shark


text: sleepersharks

title: sleepersharks


text:
Hēra

Etymology
Borrowed from.

Proper noun

 * 1)  Hera

title: Hēra


text:
ރީތި

Etymology
From earlier, , from.

Adjective

 * 1) beautiful, pretty

title: ރީތި


text: Category:Dhivehi terms by suffix

title: Category:Dhivehi terms by suffix


text: Category:Dhivehi terms suffixed with ވެތި


text: Seelsorgers

title: Seelsorgers


text: Seelsorgern

title: Seelsorgern


text:
性差

Noun

 * 1) difference between the genders

title: 性差


text:
Proclus

Etymology
From, from.

Proper noun

 * 1) Specifically, a Greek Neoplatonist philosopher.
 * 1) Specifically, a Greek Neoplatonist philosopher.

Translations

 * Armenian: Պրոկլ
 * Catalan: Procle
 * Finnish: Proklos
 * Georgian:
 * German: Proklos
 * Hungarian: Proklosz
 * Italian: Proclo
 * Polish: Proklos
 * Portuguese:
 * Russian: Прокл

title: Proclus


text:
Reconstruction:Proto-Slavic/zapъrtъkъ

Etymology
Presumptively from

Noun

 * 1) addled egg

Descendants

 * East Slavic:
 * South Slavic:
 * Serbian Church Slavonic:
 * West Slavic:
 * Sorbian:
 * South Slavic:
 * Serbian Church Slavonic:
 * West Slavic:
 * Sorbian:
 * West Slavic:
 * Sorbian:
 * West Slavic:
 * Sorbian:
 * West Slavic:
 * Sorbian:
 * Sorbian:
 * Sorbian:

title: Reconstruction:Proto-Slavic/zapъrtъkъ


text:
Seelsorge

Noun

 * 1) pastoral care

title: Seelsorge


text: Template:RQ:Nietzsche Menschliches

title: Template:RQ:Nietzsche Menschliches


text:
Template:RQ:Nietzsche Menschliches/documentation

Parameters

 * chapter, aphorism
 * the number of the cited aphorism (1–638)
 * {| class="wikitable"

! Part !! Title !! Number
 * Erstes Hauptstück || Von den ersten und letzten Dingen || 1–34
 * Zweites Hauptstück || Zur Geschichte der moralischen Empfindungen || 35–107
 * Drittes Hauptstück || Das religiöse Leben || 108–144
 * Viertes Hauptstück || Aus der Seele der Künstler und Schriftsteller || 145–223
 * Fünftes Hauptstück || Anzeichen höherer und niederer Cultur || 224–292
 * Sechtes Hauptstück || Der Mensch im Verkehr || 293–376
 * Siebentes Hauptstück || Weib und Kind || 377–437
 * Achtes Hauptstück || Ein Blick auf den Staat || 438–482
 * Neuntes Hauptstück || Der Mensch mit sich allein || 483–638
 * Unter Freunden || Ein Nachspiel || 1–2
 * }
 * passage
 * translation, t
 * Siebentes Hauptstück || Weib und Kind || 377–437
 * Achtes Hauptstück || Ein Blick auf den Staat || 438–482
 * Neuntes Hauptstück || Der Mensch mit sich allein || 483–638
 * Unter Freunden || Ein Nachspiel || 1–2
 * }
 * passage
 * translation, t
 * }
 * passage
 * translation, t


text:
gołōmb

Etymology
.

Noun

 * 1) pigeon

title: gołōmb


text: Citations:TEHM

title: Citations:TEHM


text:
biuściasty

Etymology
From. .

Adjective

 * 1)  busty

title: biuściasty


text:
grążel żółty

Etymology
lit. 'yellow waterlily'.

Noun

 * 1) yellow waterlily, brandy bottle

title: grążel żółty


text:
crisis hotline

Noun

 * 1) A telephone number people can call to get immediate emergency telephone counseling.

title: crisis hotline


text: crisis line

title: crisis line


text: crisis lines

title: crisis lines


text: crisis hotlines

title: crisis hotlines


text: Category:kbd:Dairy products

title: Category:kbd:Dairy products


text:
biuścik

Etymology
From. .

title: biuścik


text:
á hinn

Etymology
Literally "the other one". From.

Adverb

 * 1) day after tomorrow

title: á hinn


text: шортів

title: шортів


text:
User:Lousysofa/sandbox

NTBCF
,

Improve
1. Be like this (w/o "Synonyms:"):

title: User:Lousysofa/sandbox


text:
counterevidential

Adjective

 * 1) Being or relating to counterevidence.

title: counterevidential


text:
TEHM

Etymology
. Coined after the pattern of.

Noun

 * 1) A trans-exclusionary homosexual male; a gay man who holds gender-critical or anti-transgender views, particularly one who considers trans men to be women.

Usage notes
This term is used mainly in critical discourse by trans-inclusive LGBT people and other opponents of the beliefs to which the term refers, although it is rarely used for self-description.

title: TEHM


text: chàm quạp

title: chàm quạp


text:
Гобәйдулла

Etymology
.

title: Гобәйдулла


text: hornyposted

title: hornyposted


text: hornyposts

title: hornyposts


text: hornyposting

title: hornyposting


text: Гобәйдуллин

title: Гобәйдуллин


text: Гобәйдуллина

title: Гобәйдуллина


text:
biusthalter

Etymology
..

Noun

 * 1)  bra, brassiere

title: biusthalter


text: Ғөбәйҙуллин

title: Ғөбәйҙуллин


text: Ғөбәйҙуллина

title: Ғөбәйҙуллина


text: Woloszczuks

title: Woloszczuks


text: Taubeses

title: Taubeses


text: Template:RQ:Burroughs Monster Men

title: Template:RQ:Burroughs Monster Men


text: عبيد الله

title: عبيد الله


text: Template:RQ:Burroughs Monster Men/documentation


text:
Template:User:NameName233/sandbox

Not to be confused with

title: Template:User:NameName233/sandbox


text:
Berberyan

Etymology
From,.

Statistics

 * According to the 2010 United States Census, Berberyan is the 107134th most common surname in the United States, belonging to 166 individuals. Berberyan is most common among White (99.4%) individuals.

title: Berberyan


text: шапці

title: шапці


text:
Պերպերյան

Etymology
Western Armenian spelling of. The Eastern Armenian pronunciation is a spelling pronunciation.

title: Պերպերյան


text: Berberyans

title: Berberyans


text: Asatrians

title: Asatrians


text: Category:Rhymes:Portuguese/ɛlɐ/3 syllables


text:
น้าว

Etymology
Cognate with 🇨🇬, 🇨🇬, 🇨🇬.

Verb

 * 1)  to pull down; to draw; to bend.

title: น้าว


text: タモ網

title: タモ網


text: たもあみ

title: たもあみ


text:
既遂

Verb

 * 1)  to be successful; to be accomplished

Noun

 * 1) a thing already completed or achieved
 * 2)  of a criminal offence, completed (as opposed to attempted), choate

title: 既遂


text: Hallucination

title: Hallucination


text: Ниғмәтуллин

title: Ниғмәтуллин


text: Ниғмәтуллина

title: Ниғмәтуллина


text:
Բերբերյան

Etymology
From. The Western Armenian pronunciation is a spelling pronunciation.

title: Բերբերյան


text: Ellero

title: Ellero


text: Green Grove

title: Green Grove


text:
User:Thadh/common.css

/* Old Slavic */ .Cyrs {	font-family: "Monomakh Unicode"; font-size: 100%; font-weight: 75; }

/* Middle Slavic */ .Cyrs:lang(zle-ort) { font-family: "Bukyvede"; font-size: 100%; font-weight: normal; }

/* Modern Slavic */ .Cyrl:lang(bg) { font-family: "Ossem" }

/* Old Germanic */
 * lang(ang),
 * lang(odt),
 * lang(goh),
 * lang(osx),
 * lang(ofs) { font-family: "Pfeffer Mediæval"; }

/* Bodic */ .Tibt:lang(xkz) { font-family: "Uchen"; font-size: 130%; }

/* tlb */ p .headword-line ~ .usage-label-term { display: inline; }

title: User:Thadh/common.css


text: نعمة الله

title: نعمة الله


text:
Template:R:be:Skarnik

“”, in Skarnik's

title: Template:R:be:Skarnik


text:
unbeschuht

Adjective

 * 1)  discalced, shoeless

title: unbeschuht


text: сорочок

title: сорочок


text: Leysse

title: Leysse


text:
unwahsan

Etymology
, past participle of.

Adjective

 * 1) ungrown

title: unwahsan


text: Category:fr:Rivers in Nouvelle-Aquitaine


text: unƿahsan

title: unƿahsan


text: сорочці

title: сорочці


text:
pingst

Etymology
,, from. Cognate 🇨🇬.

Noun

 * 1) Pentecost

title: pingst


text: Ognon

title: Ognon


text: Нуриева

title: Нуриева


text: Category:Tatar terms suffixed with -ева

title: Category:Tatar terms suffixed with -ева


text: Category:Bashkir terms suffixed with -ева


text:
pinkod

Etymology
, compounded with. Attested since 1993.

Noun

 * 1) personal identification number

title: pinkod


text: pinkoden

title: pinkoden


text: pinkoder

title: pinkoder


text: pinkoderna

title: pinkoderna


text: Vézère

title: Vézère


text: pinkods

title: pinkods


text: pinkodens

title: pinkodens


text: pinkoders

title: pinkoders


text: pinkodernas

title: pinkodernas


text: Gartempe

title: Gartempe


text:
pinoläger

Etymology
🇰🇲

Noun

 * 1)  painful place or situation

title: pinoläger


text: pinolägret

title: pinolägret


text: pinolägrets

title: pinolägrets


text: pinolägren

title: pinolägren


text: pinolägrens

title: pinolägrens


text: pinolägers

title: pinolägers


text:
Нуреев

Etymology
From.

Proper noun

 * , notably borne by

title: Нуреев


text:
pinuppa

Etymology
. Attested since 1945.

Noun

 * 1)  pin-up girl

title: pinuppa


text:
pinuppig

Adjective

 * 1)  in the style of a pin-up

title: pinuppig


text: pinuppan

title: pinuppan


text: pinuppor

title: pinuppor


text: pinupporna

title: pinupporna


text: pinuppas

title: pinuppas


text: pinuppans

title: pinuppans


text: pinuppors

title: pinuppors


text: pinuppornas

title: pinuppornas


text:
Nureyev

Etymology
, from.

Proper noun

 * , notably borne by

title: Nureyev


text: pinuppiga

title: pinuppiga


text: pinuppigt

title: pinuppigt


text: куртці

title: куртці


title: N2s


text: pingstar

title: pingstar


text: pingstarna

title: pingstarna


text: pingsts

title: pingsts


text: pingstens

title: pingstens


text: pingstars

title: pingstars


text: pingstarnas

title: pingstarnas


text: Nuryýewa

title: Nuryýewa


text: Thätigkeit

title: Thätigkeit


text: Category:Turkmen terms suffixed with -ewa


text:
Llanfihangel Ystrad

Etymology
From.

title: Llanfihangel Ystrad


text: Template:cop-IPA-S

title: Template:cop-IPA-S


text:
Wiktionary talk:Votes/pl-2022-07/Stubifying alternative forms

Derived and descendants from the stub
I welcome the proposal for the most part, but I have some reserves about where to list derived and descendants. For instance, is listed as European Portuguese alternative of. From the first it was derived the adjective, while the second yields. I would find it very weird to see listed as derived term of. The proposal doesn't mention these subsection, but I think a likely implication would be that they would all fall under the so called full article. Can't we also open a exception to list derived and descendant terms in the stub when it is clear that they came from the stub? - Sarilho1 (talk) 10:15, 5 July 2022 (UTC)

 * Thanks for providing this practical example. In the first version of the vote, I actually put derived and related terms in the second section ("included if they differ") but I decided to remove them because I thought they should be listed in the main article. Your example shed new light on that decision for me, though I personally still think having a derived term in Gronelândia is unexpected and very easy to miss. If I were on the article Groenlândia it wouldn't occur to me to check the alt-form for more derived terms. I think I'll include them again for now, let's see if somebody thinks we should do otherwise. — Fytcha〈 T | L | C 〉 11:26, 5 July 2022 (UTC)
 * Visibility is indeed a good point, though. So although I don't really like the solution, I wouldn't be too oppose to keep the derived terms or descendants sections in a single place. However, I would still like to present some possible alternatives. The easiest one is to include a pointer to the stub indicating that the user could find there more derived terms/descendants (similar to Template:see desc). This could also be an option for the pronunciation problem from below. Another one would be to transclude the terms with a function similar to Template:desctree. Thus, we wouldn't lose (much) visibility and still have the derived terms and descendants properly sorted. - Sarilho1 (talk) 11:41, 5 July 2022 (UTC)
 * Thinking about it again, maybe adding the descendants to the list of exceptions is not a good idea. The current architecture with desc/desctree doesn't seem to mesh well with that. desctree assumes all alt-forms to be present in the main descendant article and it only incorporates the recursive descendants found within that article. So if we split the descendants to the different alt-forms, then, while the alt-forms are found by desctree, their descendants are not.
 * The derived terms I need to think about more; I have tentatively included them in the exceptions. Transcluding alt-forms' derived terms on the main article (with a nice little separator à la "derived terms of alternative form such-and-such) sounds like an idea, if technologically possible. — Fytcha〈 T | L | C 〉 11:54, 5 July 2022 (UTC)

Pronunciations
I'm opening a second topic because I think these should be two different discussions. Currently the policy I follow with Portuguese entries is to only list the pronunciations compatible with the writing of the word. For instance, contains the European Portuguese pronunciation, while  contains the Brazilian one. Similarly, and  contain different pronunciations, each with their own diphthong. The only exceptions are cases like which contains two pronunciations for European Portuguese, but the misspelling/eye dialect  contains a single one. I would like to know what should we expect the policy if the stubification comes to pass. - Sarilho1 (talk) 10:25, 5 July 2022 (UTC)

 * If I understand this correctly, is the correct spelling for both variants but  is the eye dialect only for European Portuguese? In that case, nothing has to be changed because the IPA differs between the two articles (being more restricted / containing less is also differing) and thus may be included per the vote's text ("that which differs and only applies to the alternative form"). — Fytcha〈 T | L | C 〉 11:44, 5 July 2022 (UTC)
 * Indeed. My question concerned mostly the first two cases where the pronunciations are incompatible with the spellings. - Sarilho1 (talk) 11:48, 5 July 2022 (UTC)
 * and 's pronunciation sections will be left untouched by this vote, seeing that they differ. I only want to eliminate those that are identical (so that nobody can copy-paste the pronunciation section from naïveté to naiveté for instance). — Fytcha〈 T | L | C 〉 11:58, 5 July 2022 (UTC)
 * Ok, that clears it. - Sarilho1 (talk) 11:59, 5 July 2022 (UTC)

Form-of entries
Devil's advocate: why shouldn't these rules apply to all form-of entries, not just alternative forms? Non-lemma forms obviously won't have inflection headers, and presumably not Description or Glyph origin either, but other than that, it seems plausible enough. This, that and the other (talk) 12:01, 5 July 2022 (UTC)
 * Some of the form-of entries allow of extra senses, though. For instance, the template:diminutive of. For instance, see . - Sarilho1 (talk) 12:08, 5 July 2022 (UTC)
 * So can alternative forms: see pink (alt form of pinko), future (alt form of futures), ribbon (alt form of ribband), clubs (alt form of clumps)... This, that and the other (talk) 12:16, 5 July 2022 (UTC)
 * I have some sympathies for that actually and funnily enough I was just about to start a BP discussion asking where our policy for forbidding nyms in inflected forms is because I couldn't find it. I would draw a line at synonym of, diminutive of, clipping of, ellipsis of etc. however, allowing them to be full articles because they are separate terms and not mere variations. I am not sure however if I want to extend this vote to inflected forms because there are some slight variations in the headers that should be allowed for them (e.g. References / Further reading don't belong in inflected form entries IMO). — Fytcha〈 T | L | C 〉 12:12, 5 July 2022 (UTC)
 * Yes, there are some nuances now that you mention it. Certainly synonym of is a bit of an oddball one. This, that and the other (talk) 12:17, 5 July 2022 (UTC)

nonlemma
This proposal effectively bans this template in the entries to which it applies. Intentional or not? This, that and the other (talk) 12:11, 5 July 2022 (UTC)

 * Yes. Alternative forms of lemmas are themselves lemmas. naiveté is in its dictionary form and therefore also rightly part of Category:English lemmas. — Fytcha〈 T | L | C 〉 12:14, 5 July 2022 (UTC)
 * Heh it was a silly question, wasn't it. Let me think about what I actually meant to ask, and come back to you. This, that and the other (talk) 12:34, 5 July 2022 (UTC)
 * But alternative forms of non-lemmas are non-lemmas!
 * Additionally, redirecting text may look better than empty space under empty Etymology n headings. --RichardW57m (talk) 12:39, 28 July 2022 (UTC)

Etymologies
What if some form is archaic, but you can trace the various forms back to specific dates? Would that all be in the etymology section of the main entry? E.g. biszkopt and biszkokt Vininn126 (talk) 20:58, 5 July 2022 (UTC)
 * On that note, what about alt forms where one is an unadapted borrowing and the other is not? Would there not be use in having the unadapted borrowing category? E.g. biznes and business Vininn126 (talk) 10:54, 6 July 2022 (UTC)
 * The etymology section is one of the sections that can be included in the stub, provided it is different from the main entry so there is no necessity to have all in the main entry. - Sarilho1 (talk) 11:12, 6 July 2022 (UTC)
 * Ah, I must have missed that, thanks. Vininn126 (talk) 11:13, 6 July 2022 (UTC)
 * I think this is actually unclear. If I'm interpreting the footnote correctly, it says that an etymology can only be included for senses other than the alt form entry. For example,, an alt form of , cannot have an etymology. But can have an etymology. Again, if I'm understanding the proposal, this would result in, for example, throwing out all those etymologies explaining the different romanization schemes for Chinese localities, etc. I would consider that a loss of valuable information and strongly oppose if so. : Could you please clarify? 98.170.164.88 04:23, 8 July 2022 (UTC)
 * Can you give an example of a entry with an etymology referring to "different romanization schemes for Chinese localities"? I assume you are talking about English terms here. This, that and the other (talk) 04:27, 8 July 2022 (UTC)
 * See for a particularly notable example, or /, or really most entries in 's contributions list. But I don't mean to imply Chinese localities are the only cases where explaining the origin of an alt form is useful; it's just the first thing that sprang to mind. 98.170.164.88 04:33, 8 July 2022 (UTC)
 * In that case, it seems to me that the additional ("differing") information about romanisation justifies the inclusion of the Etymology header there. I tried to clarify the footnote in a way that hopefully helps. This, that and the other (talk) 04:43, 8 July 2022 (UTC)
 * Ah, now I see that the the conditions were intended to be disjunctive (either the etymology must differ between the alt forms, or the word must have multiple etymologies justifying a bare header). Thank you for clearing that up. 98.170.164.88 04:46, 8 July 2022 (UTC)
 * I've tweaked the condition, because your clarification didn't work. --RichardW57m (talk) 12:10, 28 July 2022 (UTC)
 * Sometimes alternative forms have different origins from the main entry, but the words are still just alternative forms. Taipei is of late 19th century origin via Wade-Giles, and Taibei is of late 20th century origin, via Hanyu Pinyin. These words couldn't be anything but alternative forms, unless they were somehow synonyms right? They are intended to have the exact same pronunciation (as proven by the 1952 gazetteer on the Taipei page showing the "b" pronunciation) and they have the same meaning. BUT they have truly divergent etymologies. Also, sometimes words are alternative forms one of the other, but neither is a main entry, like Jiang and Chiang or Xie and Hsieh. --Geographyinitiative (talk) 10:04, 8 July 2022 (UTC)

Senses vs. entries
I'm not too fond of. Your new wording doesn't apply to e.g. anymore (meaning sense 2 therein may now have synonyms associated with it) whereas mine did. — Fytcha〈 T | L | C 〉 02:04, 7 July 2022 (UTC)

 * Of course. But the text as written was not very clear on whether it applied to individual senses or entire entries. I think that is worth clarifying, perhaps reverting the change I just made to the first sentence, and adding an extra paragraph at the end discussing what to do with lone alt-form senses in otherwise non-alt-form entries. This, that and the other (talk) 02:13, 7 July 2022 (UTC)
 * I think I see what you meant and I have now revamped the wording completely. Tell me what you think. — Fytcha〈 T | L | C 〉 12:33, 7 July 2022 (UTC)

Excluding regional tags
While I agree with the core of the vote, I foresee a problem, though cannot find an apt example to demonstrate it. The section I'm concerned with is the following:

 * Only the labels that differ between the full entry and the stub may be included. For instance, the senses in anemia have the labels (American spelling), (uncountable), (countable), and (pathology) associated with them. However, the alternative form stub entry anaemia may only have the (British spelling) label, not (uncountable), (countable), and (pathology).

Say, we have an entry with three common regional spellings, one of which is used in North America and two in the UK, and the entry is lemmatised at one of the UK specific spellings. If I understand correctly, this vote would mean we could no longer label the UK specific alternative form as such because the same information is already found in the main entry. This, I think, would be rather confusing. brittletheories (talk) 07:14, 7 July 2022 (UTC)

 * I understood that passage as meaning that labeling the regional spellings always occurs, but the other labels (the examples given are uncountable/countable and pathology) are only placed on the main entry. The entry anaemia is already written according to the example. - Sarilho1 (talk) 08:48, 7 July 2022 (UTC)

 * No, I don't think so. The passage is quite clear: "Only the labels that differ between the full entry and the stub may be included." Fytcha seems to agree with my assessment.
 * Also, anemia would only work as an example of this were it lemmatised at anaemia, at which point, according to the rule above, anæmia could no longer retain the UK label. brittletheories (talk) 12:03, 7 July 2022 (UTC)

 * Good point actually, I see what you mean. What do you think about changing that part of the text to something like "Stubs may only contain labels if that kind of label differs among the different forms."? This allows all three entries to have a regional label in the scenario you constructed. The "kind of label" phrase is a bit vague though so that would have to be clarified in a footnote. — Fytcha〈 T | L | C 〉 11:28, 7 July 2022 (UTC)

 * Yeah, I think that would be a more comprehensive and sensible solution that ouright excepting all regional tags. Maybe: "Only labels that differ among the alternative forms may be included." brittletheories (talk) 12:03, 7 July 2022 (UTC)

 * See . — Fytcha〈 T | L | C 〉 12:43, 7 July 2022 (UTC)

 * That looks good to me. brittletheories (talk) 13:10, 7 July 2022 (UTC)

Inflection, Declension or Conjugation
So another question that occurred to me. Why are we restricting the inflection, declension or conjugations to the main entry page? For instance, the Portuguese verb is an alternative form of. The conjugations of both forms are thus also different (e.g.: eu vs. eu )), so imo, they should be listed somewhere. - Sarilho1 (talk) 09:13, 7 July 2022 (UTC)

 * The vote doesn't do this. In fact, the inflection section is explicitly allowed to exist in the stub entries. This, that and the other (talk) 10:28, 7 July 2022 (UTC)
 * I think we are all suffering from a severe case of misreadingness. :D - Sarilho1 (talk) 10:41, 7 July 2022 (UTC)
 * @Sarilho1, @Fytcha I have tried to shuffle the proposed text around a bit so we don't keep misreading it. All the stub sense, full entry, ... stuff was just doing my head in. In particular, it wasn't clear how it was to apply to entries with mixes of form-of senses and normal senses (clubs - form-of sense next to normal sense under same POS header - or freeze - Ety 3 is a stub but the whole entry is not a stub entry). I have reduced the metalanguage to two terms: stub sense and primary form. What matters is not when an entry consists only of stub senses, but when the etymology section consists only of stub senses. This, that and the other (talk) 04:39, 8 July 2022 (UTC)

Split into Proposal 1 / 2
I agreed with your objection that the section to which I wanted to append the new text was not that comprehensive. I've now included a second proposal to clarify the existing text. From what I can tell, it should be relatively clear now: Against your personal opinion, I have included dialectal variations. It is to be noted however that the text still leaves a loophole open, if you can call it that, in that a consensus to not define Yoruba dialectal forms as forms of one another means that they don't have to be stubified. — Fytcha〈 T | L | C 〉 16:04, 7 July 2022 (UTC)
 * 1) Such and such lemmas are variations of other lemmas
 * 2) Variations are to be defined using the form-of templates
 * 3) Senses that are defined using form-of templates must be stubified

"may only be defined using a definition line that consists of a suitable form-of template."
Hey, how would Suchow be affected by this wording? Wiktionary kind of needs a little tiny bit of extra definitional content outside the form-of template (the province name) to make things easier on the reader. Please clean up the entry generally if you see fit (it needs work). Thanks. --Geographyinitiative (talk) 10:11, 8 July 2022 (UTC)

 * It might be best if it read, 'should most often be defined'. An exception to the rule is already mentioned in the text, so we should not use language that might insinuate a steadfast rule on editors' choice of template. As I see it, the passage ought only to serve as precedent to affirm that most stubified alternative form entries' definitions be as terse and regular as possible. brittletheories (talk) 14:34, 12 July 2022 (UTC)

 * There must be quite a few cases where something is an alt form of only one meaning or etymology of another string of letters. I've seen these handled by including the clarifying information inside the form-of template as part of the gloss, which in the case of Suchow might look like:
 * but I agree the shorter format used at Suchow is also fine / should also be allowed. Probably we need a note that stub / form-of senses can or should include as much of a gloss or qualifier as necessary to clarify when they apply to only some of the senses or etymology sections of the target page. - -sche (discuss) 19:15, 28 July 2022 (UTC)
 * but I agree the shorter format used at Suchow is also fine / should also be allowed. Probably we need a note that stub / form-of senses can or should include as much of a gloss or qualifier as necessary to clarify when they apply to only some of the senses or etymology sections of the target page. - -sche (discuss) 19:15, 28 July 2022 (UTC)

Previously, we have added templates to English alternative forms so as to, on one hand, help the reader, and on the other, channel the contributions in one place. Both of these points, the first one in particular, will stand even after this vote. What I suggest is 1) adding "Translations" among the permitted headers with a note, saying 'Only the template may be used in stub entries', and 2) removing the word "translations" later in the text. brittletheories (talk) 14:28, 12 July 2022 (UTC)

Attestation
Unless a quotation can be part of a 'definition line', I think we have a problem. I notice that the 'Quotations' heading is not allowed for 'stub senses'. We sometimes need attestation evidence for forms in alternative scripts; the forms across scripts are not always totally predictable. For example, Burmese Pali has rather than the expected *. More familiarly, we would have issues if we tried to merge British draught and American draft. Some of the senses of draft are not normally spelt 'draught' in Britain. For example, in Britain we write 'a draft document'. Do we really want to put quotations for the use of 'draught' under 'draft' when we are demonstrating the British usage? Do we want Burmese script Pali under the Roman script usage when we are demonstrating the Burmese script spelling, as opposed to demonstrating cross-script Pali usage? --RichardW57m (talk) 17:07, 25 October 2022 (UTC)

 * The second paragraph of Proposal 2 says "Quotations may be provided". I suppose the intention is that they be provided inline using  under the relevant sense line, not under a separate "Quotations" header, because that header is only supposed to be used when there is ambiguity between senses, and that ought not to be an issue in an entry with only stub senses. (This, that and the other) (talk) 02:00, 27 October 2022 (UTC)

 * But that text does not extend the meaning of 'stub sense definition line'. A solution is to modify the list in the third paragraph to "Stub sense definition line (as set out above)" to "Stub sense definition line (as set out above) plus satellite quotations". --RichardW57m (talk) 09:56, 27 October 2022 (UTC)

 * In any case, you raise an interesting point about placement of citations. I too would generally prefer to see "interesting" quotations centralised at the primary form entry. However, if three otherwise uninteresting cites have been collected solely to satisfy RFV, it is probably better to keep them at the stub sense. Not sure what the best practice is here. This, that and the other (talk) 02:00, 27 October 2022 (UTC)

 * What I've found myself doing with Pali is to use a non-Roman script quotation both for RfV in the subsidiary non-Roman script lemma, to satisfy RfV for the script form, and in the main, Roman script lemma, to demonstrate some point for the word in general, such as an irregular inflection. As I hold the text for the quotation in a central module, which makes sense as I collect text to ward off RfV's while economising on translation effort (I'm not protected by US pro-piracy laws such as fair use), I avoid the usual problem of duplicating text.  I think I've also duplicated as a defence against RfV when I can't find the word in the major dictionaries - that's fairly rare.  --RichardW57m (talk) 09:56, 27 October 2022 (UTC)

Synchronic Derivation
Am I right in thinking that details of synchronic derivation across clusters of alternative forms are to be deleted if the vote passes. For example, under these proposals, the only hints that synchronisation is the verbal noun of synchronise rather than of synchronize will have to be in a headword line or an inflection section

For example, at present in we have the single definition line:

 * , which is

so that the user can see the base form in the same script, or directly click on the Roman script form of it to see the senses before the causative transformation is applied. As for Pali we have the policy that the Roman script lemma is the primary lemma, will this have to be hacked back to

I fear I've ignored the Johnsonian * principle of 'Fuck the user!' by trying to approximate a one-click service. --RichardW57m (talk) 10:49, 11 July 2023 (UTC)


text:
Reconstruction:Proto-Slavic/mękyna

Etymology
From.

Noun

 * 1) chaff

Descendants

 * East Slavic:
 * South Slavic:
 * West Slavic:
 * South Slavic:
 * West Slavic:
 * South Slavic:
 * West Slavic:
 * West Slavic:
 * West Slavic:
 * West Slavic:
 * West Slavic:

title: Reconstruction:Proto-Slavic/mękyna


text:
pinkär

Etymology
🇰🇲

Adjective

 * 1) head over heels in love

title: pinkär


text: pinkära

title: pinkära


text: pinkärt

title: pinkärt


text:
âjo

Etymology
.

Noun

 * 1) age

title: âjo


text: одягу

title: одягу


text: одягові

title: одягові


text: min-maxed

title: min-maxed


text: min-maxes

title: min-maxes


text: min-maxing

title: min-maxing


text:
国家憲兵

Noun

 * 1) gendarmerie

title: 国家憲兵


text: одягом

title: одягом


text:
국가 헌병

Etymology
.

Noun

 * 1) gendarmerie

title: 국가 헌병


text: одязі

title: одязі


text: ruiu

title: ruiu


text:
isytihar

Etymology
From.

title: isytihar


text:
zabiwakować

Etymology
From. .

Verb

 * 1)  to bivouac

title: zabiwakować


text:
zabiwakowanie

Etymology
From.

title: zabiwakowanie


text:
biwakowanie

Etymology
From.

title: biwakowanie


text:
Talk:from sea to shining sea

Etymology
Taken from the lyrics of the song "America the Beautiful". Backinstadiums (talk) 10:45, 5 July 2022 (UTC)

title: Talk:from sea to shining sea


text:
خرقه

Etymology
.

Noun

 * 1) rag, tatter, a piece of old cloth, generally used for cleaning, patching, etc.
 * 2) the simple, but thick coat or cloak typically worn by dervishes that has become a symbol
 * 3) kind of thick, wadded and quilted jacket or coat worn by men under their robes
 * 1) kind of thick, wadded and quilted jacket or coat worn by men under their robes

Etymology
.

Noun

 * 1) mantle; cloak; habit (usually of a dervish or saint, especially one ragged from asceticism)

title: خرقه


text: взуттю

title: взуттю


text:
bivouacer

Noun

 * 1) A person who bivouacs, a person who camps at a bivouac.

Translations

 * Polish: ,

title: bivouacer


text: bivouacers

title: bivouacers


text: взуттям

title: взуттям


text:
Talk:kamidere

Alternative spellings in Japanese
afaik the spellings vary a fair bit in Japanese "神デレ" About 79.800 results "かみデレ" About 11.300 results "かみでれ" About 1.400 results "カミデレ" About 1.800 results Immanuelle (talk) 10:50, 5 July 2022 (UTC)

RFV discussion: March–June 2023
Similar concerns to Requests_for_verification/CJK, although there are actual Google results.

—Fish bowl (talk) 01:59, 21 March 2023 (UTC)
 * Failed. - TheDaveRoss  12:48, 20 June 2023 (UTC)

title: Talk:kamidere


text: взутті

title: взутті


text:
Ancyre

Etymology
.

title: Ancyre


text: Freigeister

title: Freigeister


text: Freigeistes

title: Freigeistes


text: Freigeists

title: Freigeists


text: Freigeiste

title: Freigeiste


text: Freigeistern

title: Freigeistern


text:
biwakowiczka

Etymology
From. .

title: biwakowiczka


text: bergsklättraren

title: bergsklättraren


text: bergsklättrarens

title: bergsklättrarens


text: bergsklättrarna

title: bergsklättrarna


text: bergsklättrarnas

title: bergsklättrarnas


text: vorauszusetzen

title: vorauszusetzen


text: voraussetze

title: voraussetze


text: bergsklättrares

title: bergsklättrares


text: voraussetzt

title: voraussetzt


text: voraussetzest

title: voraussetzest


text: voraussetzet

title: voraussetzet


text: voraussetzte

title: voraussetzte


text: voraussetzten

title: voraussetzten


text: voraussetztest

title: voraussetztest


text: voraussetztet

title: voraussetztet


text: hervorzubringen

title: hervorzubringen


text: hervorbringe

title: hervorbringe


text: hervorbringst

title: hervorbringst


text: bergsbestigaren

title: bergsbestigaren


text: hervorbringt

title: hervorbringt


text: bergsbestigarens

title: bergsbestigarens


text: hervorbringest

title: hervorbringest


text: bergsbestigarna

title: bergsbestigarna


text: hervorbringet

title: hervorbringet


text: bergsbestigarnas

title: bergsbestigarnas


text: hervorbrachte

title: hervorbrachte


text: hervorbrachten

title: hervorbrachten


text: bergsbestigares

title: bergsbestigares


text: hervorbrächte

title: hervorbrächte


text: hervorbrächten

title: hervorbrächten


text: hervorbrachtest

title: hervorbrachtest


text: hervorbrachtet

title: hervorbrachtet


text: hervorbrächtest

title: hervorbrächtest


text: hervorbrächtet

title: hervorbrächtet


text: abgeschätzt

title: abgeschätzt


text: abschätzend

title: abschätzend


text: abzuschätzen

title: abzuschätzen


text: abschätze

title: abschätze


text: abschätzt

title: abschätzt


text: abschätzest

title: abschätzest


text: abschätzet

title: abschätzet


text: abschätzte

title: abschätzte


text: abschätzten

title: abschätzten


text: abschätztest

title: abschätztest


text: abschätztet

title: abschätztet


text: weiterzuleben

title: weiterzuleben


text: weiterlebe

title: weiterlebe


text: weiterlebst

title: weiterlebst


text: weiterlebt

title: weiterlebt


text: weiterlebest

title: weiterlebest


text: weiterlebet

title: weiterlebet


text: weiterlebte

title: weiterlebte


text: weiterlebten

title: weiterlebten


text: weiterlebtest

title: weiterlebtest


text: weiterlebtet

title: weiterlebtet


text: gotten what was coming to one

title: gotten what was coming to one


text: got what was coming to one

title: got what was coming to one


text: gets what's coming to one

title: gets what's coming to one


text: reisst

title: reisst


text: getting what's coming to one

title: getting what's coming to one


text: reisse

title: reisse


text:
ахкаара

Noun

 * 1) cote
 * 2) barnyard

title: ахкаара


text: reissend

title: reissend


text: reissest

title: reissest


text: reisset

title: reisset


text:
ახკარა

Etymology
From.

Noun

 * 1) cote
 * 2) warehouse

title: ახკარა


text:
User:Wpi

Hello I'm Wpi. As a Hong Konger, my main focuses are English-Cantonese loans, Hong Kong Cantonese, and Cantonese in general. I also work on (or is interested in) other contact/mixed languages in East Asia, such as Chinese Coastal Pidgin, Yilan Creole and Singlish, especially on words that have shifted in semantics and/or morphology from the donor language.

Current focuses

 * New entries: (in decreasing order of priority)
 * Modern English loans into Hong Kong Cantonese via Hong Kong English, which are often written in the English alphabet
 * English loans into Cantonese
 * Hong Kong English entries
 * Hong Kong Internet slang (and slang in general)
 * Cantonese idioms
 * Cantonese loans into English
 * Japanese loans into Cantonese
 * Hong Kong place names

 * Long term stuff:
 * Sino-Tibetan reconstruction formatting
 * Redoing various zh modules
 * Appendix:Cantonese sentence final particles
 * Splitting transcription characters
 * Unified Chinese revisited
 * lb and categorisation
 * zh-pron redesign

See also: /plans

Languages
In case anyone wants a more detailed explanation other than Babel:

English
My English accent is basically Hong Kong English, but I am also able to speak with a somewhat Southeastern England/Transatlantic accent. Unlike most speakers of HKE, my KIT-FLEECE and DRESS-TRAP vowels are not merged, though sometimes I hypercorrect them, such as pronouncing as. Cetain words do not follow the typical HKE tone pattern, including si2,  den2,  en6 den2,  plas6.

Most accents would be easily understood by me, except heavy Indian English and Southern American English. (and I hate the way some accents pronounce the lot, cloth, thought vowels as )

English is not my native language, so even though the level of understanding is near-native, I would still make mistakes from time to time, especially mixing up words that are spelt similarly and using a few words that are commonly used as direct translations of common Cantonese phrases. Please do bear with them.

Cantonese
I speak Cantonese that is based on Hong Kong Cantonese, but with a weird accent, notably the following:
 * further pronouncing, , as their postaveolar equivalents when followed by certain vowels that do not have this change in mainstream HKC
 * partial nasalisation of tone 4
 * the n-l, null-ng, tone 2/5, tone 3/6 mergers in quick speech, but they are still distinguished phonemically (except for a few completed mergers)
 * heavy consonant assimilation in quick speech:
 * in V唔V forms, e.g. 知唔知 zi1 mi1, 識唔識 sik1 mik1, 愛唔愛 oi3 moi3, 經唔經 ging1 ming1, 明唔明 ming4 ming4 (which contrasts with 明明 )
 * before h and j initials (今日 gam1 mat6)
 * consonant reduction in quick speech for g>ng (應該 jing1 ngoi1, 已經 ji5 (ng)ing1), z>null (去咗 heoi6 o2, 攞咗 lo2 o2), s>z (食 zik6). Some of these are not seen in mainstream HKC.

Also note my Cantonese is heavily filled with code-switching and loans from English, so it would be difficult to understand without understanding both languages. Certain idiolectal words include spag spek6 "spaghetti", fact fek1 "(mathematics) to factorize", fact fek6 "(mathematics) factorial", pert pat6 "percent", 頭𩓥頂 tau4 ok6 deng2 "top of the head" (=頭殼頂), 衫架 "clotheshanger" (=衣架). Idiolectal pronunciations that often persist even in proper speech include 舊陣時 gau6 wan6 si4, 按摩 oi3 mo1, 寵物 cou2 mat6.

For formal Cantonese I generally prefer literary words over Mandarin equivalents, since the latter feels weird when spoken in Cantonese.

Mandarin
My pronunciation is extremely bad, and phonemically there are only two tones: the high tone (=T1 and T4) and the rising tone(=T2 and T3), plus the neutral tone which really shouldn't be counted. Other than that it is what you would expect for a Cantonese speaker to learn Mandarin.

Japanese
I can read Japanese fine (provided that it does uses kanji for words that are commonly written in kanji), but my writing skills are horrible; speaking and listening is still at beginner level. Also note that my Japanese sounds are often mapped onto their Cantonese equivalents.

Other
If it's a mixed language I usually can guess around 50% of the meaning by knowing one of the parent languages, 80-90% if both. If the language in question has cognates with either English or Cantonese, I will probably be able to understand it, but the cognates must be very obvious.

Unattested words

 * 煙[][] (jin1 gung6 gung6, "smokey")
 * 水[]水[] (seoi2 doe4 seoi2 dai3, "watery, wet")
 * comm (kam2/5, "commission")

Useful resources

 * English Loanwords in Hong Kong Cantonese
 * words.hk
 * 粵音資料集叢
 * 粵語審音配詞字庫
 * 漢語多功能字庫
 * zi.tools
 * kaom.net
 * 現代標準漢語與粵語對照資料庫 (2001)
 * 潮語字典
 * 政府部門常用辭彙
 * 中英雙語時事詞彙
 * 香港中文大學 資訊處 遣詞用字統一表
 * 香港手語瀏覽器
 * Unihan
 * rime cantonese
 * 食水含鉛超標調查委員會
 * 沙田至中環線項目紅磡站擴建部分及其鄰近的建造工程調查委員會
 * 香港專營巴士服務獨立檢討委員會
 * Hong Kong Government Reports Online (1842-1941)
 * Google books:
 * 英譯廣州話常用口語詞匯 (bilingual dictionary of idioms)
 *
 * construction tutorial videos, useful for slang/argot stuff
 * https://ccl.hkust.edu.hk/useful_resources
 * 早期粵語標註語料庫
 * 早期粵語口語文獻資料庫
 * 早期漢語方言文獻資料庫
 * plus other books on GB and other places
 * 早期粵語聖經資料庫/早期基督教文學資料庫
 * 中文詞彙網絡 (corpus)
 * 中央研究院現代漢語標記語料庫 (corpus)

title: User:Wpi


text: zerreisst

title: zerreisst


text: ах'каара

title: ах'каара


text: zerreisse

title: zerreisse


text: zerreissend

title: zerreissend


text: zerreiss

title: zerreiss


text:
ակադեմիկոս

Etymology
Partly from and partly from.

Noun

 * 1) academician full member of the National Academy of Sciences

title: ակադեմիկոս


text: zerreissest

title: zerreissest


text: кросівці

title: кросівці


text: zerreisset

title: zerreisset


text: ridden the coattails

title: ridden the coattails


text: rides the coattails

title: rides the coattails


text: riding the coattails

title: riding the coattails


text: rode the coattails

title: rode the coattails


text:
rumah kaca

Etymology
Compound 🇰🇲, from.

Noun

 * 1) greenhouse: a building used to grow plants, particularly one with large glass windows or plastic sheeting to trap heat from sunlight even in intemperate seasons or climates.

title: rumah kaca


text: takes on the chin

title: takes on the chin


text: taking on the chin

title: taking on the chin


text: кросівкам

title: кросівкам


text: took on the chin

title: took on the chin


text:
អាវុធហត្ថ

Etymology
🇰🇲

Noun

 * 1) soldier, armed person

title: អាវុធហត្ថ


text: taken on the chin

title: taken on the chin


text: übermässig

title: übermässig


text: Category:Dhivehi terms borrowed from Prakrit


text: taking something in stride

title: taking something in stride


text: taken something in stride

title: taken something in stride


text: takes something in stride

title: takes something in stride


text: took something in stride

title: took something in stride


text: кросівках

title: кросівках


text: überbietet

title: überbietet


text: überbot

title: überbot


text: überboten

title: überboten


text: überböte

title: überböte


text: überbietend

title: überbietend


text: überbiete

title: überbiete


text: überbietest

title: überbietest


text: überböten

title: überböten


text: überbotest

title: überbotest


text:
აბორა

Etymology
From.

Noun

 * 1) animal stall

title: აბორა


text: überbotst

title: überbotst


text: took something as it came

title: took something as it came


text: überbotet

title: überbotet


text: taken something as it came

title: taken something as it came


text: überbötest

title: überbötest


text: überbötet

title: überbötet


text: takes something as it comes

title: takes something as it comes


text: überbiet

title: überbiet


text: taking something as it comes

title: taking something as it comes


text: Windungen

title: Windungen


text: rides down

title: rides down


text: riding down

title: riding down


text: rode down

title: rode down


text: ridden down

title: ridden down


text: preiszugeben

title: preiszugeben


text: preisgebe

title: preisgebe


text: preisgibst

title: preisgibst


text: preisgebt

title: preisgebt


text: preisgebest

title: preisgebest


text: preisgebet

title: preisgebet


text: preisgibt

title: preisgibt


text: preisgab

title: preisgab


text: preisgaben

title: preisgaben


text: preisgäbe

title: preisgäbe


text: preisgäben

title: preisgäben


text: preisgabst

title: preisgabst


text: not pay any mind

title: not pay any mind


text: schliesst

title: schliesst


text: preisgabt

title: preisgabt


text: preisgäbest

title: preisgäbest


text: preisgäbst

title: preisgäbst


text: preisgäbet

title: preisgäbet


text: preisgäbt

title: preisgäbt


text: schliess

title: schliess


text:
拖羅

Etymology
From. .

Noun

 * 1)  fatty cut of tuna; sushi made from fatty cut of tuna

title: 拖羅


text: schliessend

title: schliessend


text: schliessest

title: schliessest


text: schliesset

title: schliesset


text: чоботу

title: чоботу


text: unterzuschieben

title: unterzuschieben


text: unterschiebe

title: unterschiebe


text: unterschiebst

title: unterschiebst


text: unterschiebt

title: unterschiebt


text: unterschiebest

title: unterschiebest


text: unterschiebet

title: unterschiebet


text: unterschob

title: unterschob


text: unterschoben

title: unterschoben


text: unterschöbe

title: unterschöbe


text: unterschöben

title: unterschöben


text: unterschobst

title: unterschobst


text: unterschobt

title: unterschobt


text: чоботі

title: чоботі


text: unterschöbest

title: unterschöbest


text: unterschöbst

title: unterschöbst


text: unterschöbet

title: unterschöbet


text: unterschöbt

title: unterschöbt


text: brings it

title: brings it


text: bringing it

title: bringing it


text: voranzustellen

title: voranzustellen


text: voranstelle

title: voranstelle


text: brought it

title: brought it


text: voranstellst

title: voranstellst


text:
ပူဖောင်း

Etymology
🇰🇲

Noun

 * 1) balloon
 * 2) bubble

title: ပူဖောင်း


text: voranstellt

title: voranstellt


text: voranstellest

title: voranstellest


text: voranstellet

title: voranstellet


text: voranstellte

title: voranstellte


text: voranstellten

title: voranstellten


text: voranstelltest

title: voranstelltest


text: voranstelltet

title: voranstelltet


text: чоботах

title: чоботах


text:
thokeawn

Etymology
. Its beak resembles a fire.

Noun

 * 1)  A destructive fire.

title: thokeawn


text: чоботях

title: чоботях


text: nachzugehen

title: nachzugehen


text: nachgehe

title: nachgehe


text: nachgehst

title: nachgehst


text: nachgeht

title: nachgeht


text: nachgehest

title: nachgehest


text: nachgehet

title: nachgehet


text: nachging

title: nachging


text: nachgingen

title: nachgingen


text: nachginge

title: nachginge


text: nachgingst

title: nachgingst


text: nachgingt

title: nachgingt


text:
Anatolie

Etymology
.

Proper noun

 * 1) Anatolia
 * 2)  Anatolia
 * 1)  Anatolia

title: Anatolie


text:
hempeen

Etymology
. Compare also.

Noun

 * 1) A little bird.

title: hempeen


text: nachgingest

title: nachgingest


text: nachginget

title: nachginget


text: specielle

title: specielle