<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https://wiki.dnd.in.ua/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AParseList</id>
	<title>Модуль:ParseList - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dnd.in.ua/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AParseList"/>
	<link rel="alternate" type="text/html" href="https://wiki.dnd.in.ua/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:ParseList&amp;action=history"/>
	<updated>2026-05-03T13:39:41Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.dnd.in.ua/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:ParseList&amp;diff=1517&amp;oldid=prev</id>
		<title>587: Створена сторінка: local getArgs = require('Module:Arguments').getArgs local p = {}  -- Config options, set in main function local listDelimiters local makeElementsLinks local makeElementsPlural local makeElementsSingular local makeElementsLowercase local useTemplateOnElements local useTwoArgTemplateOnElements local finalJoiningWord  local function splitListString(listString)     local strings = {}     for str in listString:gmatch(&quot;[^&quot; .. listDelimiters .. &quot;]+&quot;) do         t...</title>
		<link rel="alternate" type="text/html" href="https://wiki.dnd.in.ua/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:ParseList&amp;diff=1517&amp;oldid=prev"/>
		<updated>2023-08-26T11:14:43Z</updated>

		<summary type="html">&lt;p&gt;Створена сторінка: local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs local p = {}  -- Config options, set in main function local listDelimiters local makeElementsLinks local makeElementsPlural local makeElementsSingular local makeElementsLowercase local useTemplateOnElements local useTwoArgTemplateOnElements local finalJoiningWord  local function splitListString(listString)     local strings = {}     for str in listString:gmatch(&amp;quot;[^&amp;quot; .. listDelimiters .. &amp;quot;]+&amp;quot;) do         t...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова сторінка&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Config options, set in main function&lt;br /&gt;
local listDelimiters&lt;br /&gt;
local makeElementsLinks&lt;br /&gt;
local makeElementsPlural&lt;br /&gt;
local makeElementsSingular&lt;br /&gt;
local makeElementsLowercase&lt;br /&gt;
local useTemplateOnElements&lt;br /&gt;
local useTwoArgTemplateOnElements&lt;br /&gt;
local finalJoiningWord&lt;br /&gt;
&lt;br /&gt;
local function splitListString(listString)&lt;br /&gt;
    local strings = {}&lt;br /&gt;
    for str in listString:gmatch(&amp;quot;[^&amp;quot; .. listDelimiters .. &amp;quot;]+&amp;quot;) do&lt;br /&gt;
        table.insert(strings, str:match(&amp;quot;^%s*(.-)%s*$&amp;quot;))&lt;br /&gt;
    end&lt;br /&gt;
    return strings&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This is a TWO-WAY conversion table of singular words and their corresponding&lt;br /&gt;
-- plural form, for those that wouldn't be handled correctly by the automatic&lt;br /&gt;
-- rules implemented further down below.  Note that we don't need to cover most&lt;br /&gt;
-- regular English words, as they're unlikely to ever be used with this module.&lt;br /&gt;
-- The kind of stuff you want to add here is gameplay elements like classes,&lt;br /&gt;
-- weapons, races, and so on.&lt;br /&gt;
local specialPlurals = {&lt;br /&gt;
	-- Weapons&lt;br /&gt;
	Glaive = &amp;quot;Glaives&amp;quot;,&lt;br /&gt;
	glaive = &amp;quot;glaives&amp;quot;,&lt;br /&gt;
	Staff = &amp;quot;Staves&amp;quot;,&lt;br /&gt;
	staff = &amp;quot;staves&amp;quot;,&lt;br /&gt;
	-- Races&lt;br /&gt;
	Gith = &amp;quot;Gith&amp;quot;,&lt;br /&gt;
	gith = &amp;quot;gith&amp;quot;,&lt;br /&gt;
	Githyanki = &amp;quot;Githyanki&amp;quot;,&lt;br /&gt;
	githyanki = &amp;quot;githyanki&amp;quot;,&lt;br /&gt;
	Duergar = &amp;quot;Duergar&amp;quot;,&lt;br /&gt;
	duergar = &amp;quot;duergar&amp;quot;,&lt;br /&gt;
	Drow = &amp;quot;Drow&amp;quot;,&lt;br /&gt;
	drow = &amp;quot;drow&amp;quot;,&lt;br /&gt;
	Dragonborn = &amp;quot;Dragonborn&amp;quot;,&lt;br /&gt;
	dragonborn = &amp;quot;dragonborn&amp;quot;,&lt;br /&gt;
	-- Creature types&lt;br /&gt;
	Fey = &amp;quot;Fey&amp;quot;,&lt;br /&gt;
	fey = &amp;quot;fey&amp;quot;,&lt;br /&gt;
	Undead = &amp;quot;Undead&amp;quot;,&lt;br /&gt;
	undead = &amp;quot;undead&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Checks if str is equal to or ends in one of the keys in specialPlurals.&lt;br /&gt;
-- Returns the pluralized version if so, otherwise nil.&lt;br /&gt;
local function findSpecialPlural(str)&lt;br /&gt;
	for singular, plural in pairs(specialPlurals) do&lt;br /&gt;
		if str == singular then&lt;br /&gt;
			return plural&lt;br /&gt;
		end&lt;br /&gt;
		local len = #singular&lt;br /&gt;
		local suffix = str:sub(-len, -1)&lt;br /&gt;
		if (suffix == singular) then&lt;br /&gt;
			return str:sub(1, -len - 1) .. plural&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Checks if str is equal to or ends in one of the values in specialPlurals.&lt;br /&gt;
-- Returns the singular version if so, otherwise nil.&lt;br /&gt;
local function findSpecialSingular(str)&lt;br /&gt;
	for singular, plural in pairs(specialPlurals) do&lt;br /&gt;
		if str == plural then&lt;br /&gt;
			return singular&lt;br /&gt;
		end&lt;br /&gt;
		local len = #plural&lt;br /&gt;
		local suffix = str:sub(-len, -1)&lt;br /&gt;
		if suffix == plural then&lt;br /&gt;
			return str:sub(1, -len - 1) .. singular&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Checks for a special pluralization first, then implements these rules:&lt;br /&gt;
-- ...f -&amp;gt; ...ves&lt;br /&gt;
-- ...y -&amp;gt; ...ies&lt;br /&gt;
-- ...s -&amp;gt; ...ses&lt;br /&gt;
-- ...ch -&amp;gt; ...ches&lt;br /&gt;
-- ...sh -&amp;gt; ...shes&lt;br /&gt;
-- ... -&amp;gt; ...s&lt;br /&gt;
local function makePlural(str)&lt;br /&gt;
	local sp = findSpecialPlural(str)&lt;br /&gt;
	if sp then&lt;br /&gt;
		return sp&lt;br /&gt;
	end&lt;br /&gt;
	local last1 = str:sub(-1)&lt;br /&gt;
	if last1 == &amp;quot;f&amp;quot; then&lt;br /&gt;
		return str:sub(1, -2) .. &amp;quot;ves&amp;quot;&lt;br /&gt;
	elseif last1 == &amp;quot;y&amp;quot; then&lt;br /&gt;
		return str:sub(1, -2) .. &amp;quot;ies&amp;quot;&lt;br /&gt;
	elseif last1 == &amp;quot;s&amp;quot; then&lt;br /&gt;
		return str .. &amp;quot;es&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local last2 = str:sub(-2)&lt;br /&gt;
	if last2 == &amp;quot;ch&amp;quot; or last2 == &amp;quot;sh&amp;quot; then&lt;br /&gt;
		return str .. &amp;quot;es&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return str .. &amp;quot;s&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Checks for a special singularization first, then implements these rules:&lt;br /&gt;
-- ...ves -&amp;gt; ...f&lt;br /&gt;
-- ...ies -&amp;gt; ...y&lt;br /&gt;
-- ...ses -&amp;gt; ...s&lt;br /&gt;
-- ...ches -&amp;gt; ...ch&lt;br /&gt;
-- ...shes -&amp;gt; ...sh&lt;br /&gt;
-- ...s -&amp;gt; ...&lt;br /&gt;
-- ... -&amp;gt; ...&lt;br /&gt;
local function makeSingular(str)&lt;br /&gt;
	local special = findSpecialSingular(str)&lt;br /&gt;
	if special then&lt;br /&gt;
		return special&lt;br /&gt;
	end&lt;br /&gt;
	local last3 = str:sub(-3)&lt;br /&gt;
	if last3 == &amp;quot;ves&amp;quot; then&lt;br /&gt;
		return str:sub(1, -4) .. &amp;quot;f&amp;quot;&lt;br /&gt;
	elseif last3 == &amp;quot;ies&amp;quot; then&lt;br /&gt;
		return str:sub(1, -4) .. &amp;quot;y&amp;quot;&lt;br /&gt;
	elseif last3 == &amp;quot;ses&amp;quot; then&lt;br /&gt;
		return str:sub(1, -3)&lt;br /&gt;
	end&lt;br /&gt;
	local last4 = str:sub(-4)&lt;br /&gt;
	if last4 == &amp;quot;ches&amp;quot; or last4 == &amp;quot;shes&amp;quot; then&lt;br /&gt;
		return str:sub(1, -3)&lt;br /&gt;
	end&lt;br /&gt;
	if str:sub(-1) == &amp;quot;s&amp;quot; then&lt;br /&gt;
		return str:sub(1, -2)&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Applies the various per-element transforms.  Frame is needed for template&lt;br /&gt;
-- expansion; it may be nil if template transforms won't be applied.&lt;br /&gt;
local function processElement(str, frame)&lt;br /&gt;
	local original = str&lt;br /&gt;
	if makeElementsPlural then&lt;br /&gt;
		str = makePlural(str)&lt;br /&gt;
	elseif makeElementsSingular then&lt;br /&gt;
		str = makeSingular(str)&lt;br /&gt;
	end&lt;br /&gt;
	if makeElementsLowercase then&lt;br /&gt;
		str = str:lower()&lt;br /&gt;
	end&lt;br /&gt;
	if makeElementsLinks then&lt;br /&gt;
		return &amp;quot;[[&amp;quot; .. original .. &amp;quot;|&amp;quot; .. str .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	elseif useTemplateOnElements then&lt;br /&gt;
		return frame:expandTemplate{&lt;br /&gt;
			title = useTemplateOnElements,&lt;br /&gt;
			args = { str }&lt;br /&gt;
		}&lt;br /&gt;
	elseif useTwoArgTemplateOnElements then&lt;br /&gt;
		return frame:expandTemplate{&lt;br /&gt;
			title = useTwoArgTemplateOnElements,&lt;br /&gt;
			args = { original, str }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- These functions implement the different output types.  The elements will have&lt;br /&gt;
-- already gone through processElement() at this point, so they only need to be&lt;br /&gt;
-- glued together to produce the desired type of listing format.&lt;br /&gt;
local converters = {&lt;br /&gt;
	sentence = function (elements)&lt;br /&gt;
	    local count = #elements&lt;br /&gt;
	    if count == 0 then&lt;br /&gt;
	    	return &amp;quot;&amp;quot;&lt;br /&gt;
	    elseif count == 1 then&lt;br /&gt;
	    	return elements[1]&lt;br /&gt;
	    elseif count == 2 then&lt;br /&gt;
			return elements[1] .. &amp;quot; &amp;quot; .. finalJoiningWord .. &amp;quot; &amp;quot; .. elements[2]&lt;br /&gt;
	    end&lt;br /&gt;
	    local result = &amp;quot;&amp;quot;&lt;br /&gt;
		for i, str in ipairs(elements) do&lt;br /&gt;
			if i &amp;lt; count then&lt;br /&gt;
				result = result .. str .. &amp;quot;, &amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				result = result .. finalJoiningWord .. &amp;quot; &amp;quot; .. str&lt;br /&gt;
			end&lt;br /&gt;
	    end&lt;br /&gt;
	    return result&lt;br /&gt;
	end,&lt;br /&gt;
	htmlList = function (elements)&lt;br /&gt;
		local result = &amp;quot;&amp;quot;&lt;br /&gt;
		for i, str in ipairs(elements) do&lt;br /&gt;
			result = result .. &amp;quot;* &amp;quot; .. str .. &amp;quot;\n&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return result&lt;br /&gt;
	end,&lt;br /&gt;
	simpleList = function (elements)&lt;br /&gt;
		local result = &amp;quot;&amp;quot;&lt;br /&gt;
		local first = true&lt;br /&gt;
		for i, str in ipairs(elements) do&lt;br /&gt;
			if first then&lt;br /&gt;
				result = str&lt;br /&gt;
				first = false&lt;br /&gt;
			else&lt;br /&gt;
				result = result .. &amp;quot;, &amp;quot; .. str&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return result&lt;br /&gt;
	end,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame, { frameOnly = true })&lt;br /&gt;
	return p._main(args, frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Frame is needed for template expansion; may be nil if the useTemplate and&lt;br /&gt;
-- useTemplate2 args are nil.&lt;br /&gt;
function p._main(args, frame)&lt;br /&gt;
	listDelimiters = args['delimiter'] or &amp;quot;,&amp;quot;&lt;br /&gt;
	makeElementsLinks = args['makeLinks']&lt;br /&gt;
	makeElementsPlural = args['makePlural']&lt;br /&gt;
	makeElementsSingular = args['makeSingular']&lt;br /&gt;
	makeElementsLowercase = args['makeLowercase']&lt;br /&gt;
	useTemplateOnElements = args['useTemplate']&lt;br /&gt;
	useTwoArgTemplateOnElements = args['useTemplate2']&lt;br /&gt;
	finalJoiningWord = args['joinWord'] or &amp;quot;and&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local type = args['type'] or 'sentence'&lt;br /&gt;
	local converter = converters[type]&lt;br /&gt;
	local elements = {}&lt;br /&gt;
	local listString = args[1]&lt;br /&gt;
	local strings = splitListString(listString)&lt;br /&gt;
	for i, str in ipairs(strings) do&lt;br /&gt;
		table.insert(elements, processElement(str, frame))&lt;br /&gt;
	end&lt;br /&gt;
	return converter(elements)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>587</name></author>
	</entry>
</feed>