<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="th">
	<id>http://wiki.cuneifox.com/index.php?action=history&amp;feed=atom&amp;title=%E0%B8%A1%E0%B8%AD%E0%B8%94%E0%B8%B9%E0%B8%A5%3ALoops</id>
	<title>มอดูล:Loops - ประวัติรุ่นแก้ไข</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.cuneifox.com/index.php?action=history&amp;feed=atom&amp;title=%E0%B8%A1%E0%B8%AD%E0%B8%94%E0%B8%B9%E0%B8%A5%3ALoops"/>
	<link rel="alternate" type="text/html" href="http://wiki.cuneifox.com/index.php?title=%E0%B8%A1%E0%B8%AD%E0%B8%94%E0%B8%B9%E0%B8%A5:Loops&amp;action=history"/>
	<updated>2026-05-01T04:06:17Z</updated>
	<subtitle>ประวัติรุ่นแก้ไขของหน้านี้ในวิกิ</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>http://wiki.cuneifox.com/index.php?title=%E0%B8%A1%E0%B8%AD%E0%B8%94%E0%B8%B9%E0%B8%A5:Loops&amp;diff=152&amp;oldid=prev</id>
		<title>Tenko: นำเข้า 1 รุ่นการแก้ไข</title>
		<link rel="alternate" type="text/html" href="http://wiki.cuneifox.com/index.php?title=%E0%B8%A1%E0%B8%AD%E0%B8%94%E0%B8%B9%E0%B8%A5:Loops&amp;diff=152&amp;oldid=prev"/>
		<updated>2023-05-08T11:52:10Z</updated>

		<summary type="html">&lt;p&gt;นำเข้า 1 รุ่นการแก้ไข&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;th&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←รุ่นแก้ไขก่อนหน้า&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;รุ่นแก้ไขเมื่อ 18:52, 8 พฤษภาคม 2566&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key cunei_wiki:diff::1.12:old-151:rev-152 --&gt;
&lt;/table&gt;</summary>
		<author><name>Tenko</name></author>
	</entry>
	<entry>
		<id>http://wiki.cuneifox.com/index.php?title=%E0%B8%A1%E0%B8%AD%E0%B8%94%E0%B8%B9%E0%B8%A5:Loops&amp;diff=151&amp;oldid=prev</id>
		<title>mediawiki&gt;Jan Myšák: Reverted edits by 2403:6200:88A2:46B7:1192:F749:D866:575 (talk) to last version by ExE Boss</title>
		<link rel="alternate" type="text/html" href="http://wiki.cuneifox.com/index.php?title=%E0%B8%A1%E0%B8%AD%E0%B8%94%E0%B8%B9%E0%B8%A5:Loops&amp;diff=151&amp;oldid=prev"/>
		<updated>2023-04-07T19:23:08Z</updated>

		<summary type="html">&lt;p&gt;Reverted edits by &lt;a href=&quot;/wiki/%E0%B8%9E%E0%B8%B4%E0%B9%80%E0%B8%A8%E0%B8%A9:%E0%B9%80%E0%B8%A3%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%87%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B9%80%E0%B8%82%E0%B8%B5%E0%B8%A2%E0%B8%99/2403:6200:88A2:46B7:1192:F749:D866:575&quot; title=&quot;พิเศษ:เรื่องที่เขียน/2403:6200:88A2:46B7:1192:F749:D866:575&quot;&gt;2403:6200:88A2:46B7:1192:F749:D866:575&lt;/a&gt; (&lt;a href=&quot;/index.php?title=%E0%B8%84%E0%B8%B8%E0%B8%A2%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9C%E0%B8%B9%E0%B9%89%E0%B9%83%E0%B8%8A%E0%B9%89:2403:6200:88A2:46B7:1192:F749:D866:575&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;คุยกับผู้ใช้:2403:6200:88A2:46B7:1192:F749:D866:575 (ไม่มีหน้านี้)&quot;&gt;talk&lt;/a&gt;) to last version by ExE Boss&lt;/p&gt;
&lt;p&gt;&lt;b&gt;หน้าใหม่&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Lua module implementing features similar to [[mw:Extension:Loops]].&lt;br /&gt;
--&lt;br /&gt;
-- @module lööps&lt;br /&gt;
-- @alias  loops&lt;br /&gt;
-- @author [[User:ExE Boss]]&lt;br /&gt;
-- @require [[Module:TableTools]]&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&amp;quot;libraryUtil&amp;quot;);&lt;br /&gt;
local tableTools  = require(&amp;quot;Module:TableTools&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
local checkType = libraryUtil.checkType;&lt;br /&gt;
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg;&lt;br /&gt;
&lt;br /&gt;
local ustring = mw.ustring;&lt;br /&gt;
local loops = {};&lt;br /&gt;
&lt;br /&gt;
local function userError(message)&lt;br /&gt;
	return &amp;#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;&amp;#039; .. message .. &amp;#039;&amp;lt;/strong&amp;gt;&amp;#039;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function escapePattern(pattern)&lt;br /&gt;
	return ustring.gsub(pattern, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$%]])&amp;quot;, &amp;quot;%%%1&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isFrame(frame)&lt;br /&gt;
	return type(frame) == &amp;quot;table&amp;quot;&lt;br /&gt;
		and type(frame.args) == &amp;quot;table&amp;quot;&lt;br /&gt;
		and type(frame.getParent) == &amp;quot;function&amp;quot;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Preprocesses text escaped using the [[mw:Extension:DynamicPageList3]] method.&lt;br /&gt;
--&lt;br /&gt;
-- @function loops._preprocess&lt;br /&gt;
-- @param {Frame} frame&lt;br /&gt;
-- @param {string} msg&lt;br /&gt;
-- @return {string}&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function preprocess(frame, msg)&lt;br /&gt;
	msg = ustring.gsub(msg, &amp;quot;«&amp;quot;, &amp;quot;&amp;lt;&amp;quot;);&lt;br /&gt;
	msg = ustring.gsub(msg, &amp;quot;»&amp;quot;, &amp;quot;&amp;gt;&amp;quot;);&lt;br /&gt;
	msg = ustring.gsub(msg, &amp;quot;¦&amp;quot;, &amp;quot;|&amp;quot;);&lt;br /&gt;
	msg = ustring.gsub(msg, &amp;quot;²{&amp;quot;, &amp;quot;{{&amp;quot;);&lt;br /&gt;
	msg = ustring.gsub(msg, &amp;quot;}²&amp;quot;, &amp;quot;}}&amp;quot;);&lt;br /&gt;
	return frame:preprocess(msg);&lt;br /&gt;
end&lt;br /&gt;
loops._preprocess = preprocess;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- @param {Frame|table} args&lt;br /&gt;
-- @return {number}&lt;br /&gt;
-- @usage {{#invoke:Loops|numArgs}}&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function loops.numArgs(frame)&lt;br /&gt;
	checkType(&amp;quot;numArgs&amp;quot;, 1, frame, &amp;quot;table&amp;quot;);&lt;br /&gt;
	local args;&lt;br /&gt;
	if (isFrame(frame)) then&lt;br /&gt;
		args = (frame:getParent() or frame).args;&lt;br /&gt;
	else&lt;br /&gt;
		args = frame;&lt;br /&gt;
	end&lt;br /&gt;
	return tableTools.length(args);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- @param {Frame} args&lt;br /&gt;
-- @return {string}&lt;br /&gt;
--&lt;br /&gt;
-- @usage {{#invoke:Loops|forNumArgs|template string}}&lt;br /&gt;
-- @usage {{#invoke:Loops|forNumArgs|value pattern|template string}}&lt;br /&gt;
-- @usage {{#invoke:Loops|forNumArgs|key pattern|value pattern|template string}}&lt;br /&gt;
-- @usage&lt;br /&gt;
--  {{#invoke:Loops|forNumArgs&lt;br /&gt;
--  | template = template string&lt;br /&gt;
--  }}&lt;br /&gt;
-- @usage&lt;br /&gt;
--  {{#invoke:Loops|forNumArgs&lt;br /&gt;
--  | value    = value pattern&lt;br /&gt;
--  | template = template string&lt;br /&gt;
--  }}&lt;br /&gt;
-- @usage&lt;br /&gt;
--  {{#invoke:Loops|forNumArgs&lt;br /&gt;
--  | key      = key pattern&lt;br /&gt;
--  | template = template string&lt;br /&gt;
--  }}&lt;br /&gt;
-- @usage&lt;br /&gt;
--  {{#invoke:Loops|forNumArgs&lt;br /&gt;
--  | key      = key pattern&lt;br /&gt;
--  | value    = value pattern&lt;br /&gt;
--  | template = template string&lt;br /&gt;
--  }}&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function loops.forNumArgs(frame)&lt;br /&gt;
	local frameArgs, parentArgs;&lt;br /&gt;
	checkType(&amp;quot;numArgs&amp;quot;, 1, frame, &amp;quot;table&amp;quot;);&lt;br /&gt;
	if (isFrame(frame)) then&lt;br /&gt;
		frameArgs  = frame.args;&lt;br /&gt;
		parentArgs = frame:getParent().args;&lt;br /&gt;
	else&lt;br /&gt;
		return error(&amp;quot;forNumArgs only supports invocation&amp;quot;);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local kPattern, vPattern, template;&lt;br /&gt;
	local frameNumArgs = tableTools.length(frameArgs);&lt;br /&gt;
	if (frameNumArgs &amp;gt;= 3) then&lt;br /&gt;
		kPattern = frameArgs[1];&lt;br /&gt;
		vPattern = frameArgs[2];&lt;br /&gt;
		template = frameArgs[3];&lt;br /&gt;
	elseif (frameNumArgs &amp;gt;= 2) then&lt;br /&gt;
		vPattern = frameArgs[1];&lt;br /&gt;
		template = frameArgs[2];&lt;br /&gt;
	else&lt;br /&gt;
		template = frameArgs[1];&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	kPattern = frameArgs.key      or kPattern;&lt;br /&gt;
	vPattern = frameArgs.value    or vPattern;&lt;br /&gt;
	template = frameArgs.template or template;&lt;br /&gt;
&lt;br /&gt;
	checkTypeForNamedArg(&amp;quot;forNumArgs&amp;quot;, &amp;quot;key&amp;quot;,      kPattern, &amp;quot;string&amp;quot;, true);&lt;br /&gt;
	checkTypeForNamedArg(&amp;quot;forNumArgs&amp;quot;, &amp;quot;value&amp;quot;,    vPattern, &amp;quot;string&amp;quot;, true);&lt;br /&gt;
	checkTypeForNamedArg(&amp;quot;forNumArgs&amp;quot;, &amp;quot;template&amp;quot;, template, &amp;quot;string&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
	if (template == nil) then&lt;br /&gt;
		return userError(&amp;quot;Must supply template parameter to forNumArgs&amp;quot;);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	vPattern = vPattern or &amp;quot;$1&amp;quot;;&lt;br /&gt;
	if (kPattern ~= nil) then&lt;br /&gt;
		if (#kPattern &amp;gt; 0) then&lt;br /&gt;
			if (kPattern == vPattern) then&lt;br /&gt;
				return userError(&amp;quot;key pattern must be different from value pattern&amp;quot;);&lt;br /&gt;
			end&lt;br /&gt;
			kPattern = escapePattern(kPattern);&lt;br /&gt;
		else&lt;br /&gt;
			kPattern = nil;&lt;br /&gt;
		end&lt;br /&gt;
	elseif (vPattern ~= &amp;quot;$2&amp;quot;) then&lt;br /&gt;
		kPattern = &amp;quot;%$2&amp;quot;;&lt;br /&gt;
	end&lt;br /&gt;
	if (#vPattern == 0) then&lt;br /&gt;
		vPattern = nil;&lt;br /&gt;
	else&lt;br /&gt;
		vPattern = escapePattern(vPattern);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result = {};&lt;br /&gt;
	local v, msg;&lt;br /&gt;
	for k = 1, tableTools.length(parentArgs) do&lt;br /&gt;
		v = parentArgs[k];&lt;br /&gt;
		if (v ~= nil) then&lt;br /&gt;
			msg = template;&lt;br /&gt;
			if (kPattern) then&lt;br /&gt;
				msg = ustring.gsub(msg, kPattern, (ustring.gsub(tostring(k), &amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot;)));&lt;br /&gt;
			end&lt;br /&gt;
			if (vPattern) then&lt;br /&gt;
				msg = ustring.gsub(msg, vPattern, (ustring.gsub(tostring(v), &amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot;)));&lt;br /&gt;
			end&lt;br /&gt;
			result[#result + 1] = preprocess(frame, msg);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(result);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return loops;&lt;/div&gt;</summary>
		<author><name>mediawiki&gt;Jan Myšák</name></author>
	</entry>
</feed>