<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.azisaba.net/index.php?action=history&amp;feed=atom&amp;title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%3AFTBCommon</id>
	<title>モジュール:FTBCommon - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.azisaba.net/index.php?action=history&amp;feed=atom&amp;title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%3AFTBCommon"/>
	<link rel="alternate" type="text/html" href="https://wiki.azisaba.net/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:FTBCommon&amp;action=history"/>
	<updated>2026-05-19T17:35:38Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://wiki.azisaba.net/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:FTBCommon&amp;diff=577&amp;oldid=prev</id>
		<title>PerfectBoat: took from ftb wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.azisaba.net/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:FTBCommon&amp;diff=577&amp;oldid=prev"/>
		<updated>2022-05-22T12:40:25Z</updated>

		<summary type="html">&lt;p&gt;took from ftb wiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
p.bullet = &amp;quot;&amp;amp;nbsp;&amp;amp;bull;&amp;amp;#32;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- checks if a param is given (i. e. neither null nor whitespace)&lt;br /&gt;
function p.isGiven(param)&lt;br /&gt;
	if type(param) == &amp;quot;string&amp;quot; then -- special checks for strings&lt;br /&gt;
		if string.gsub(param, &amp;quot;%s*&amp;quot;, &amp;quot;&amp;quot;) == &amp;quot;&amp;quot; then -- remove all whitespace before checking if empty&lt;br /&gt;
			return false&lt;br /&gt;
		else&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	elseif param == nil then -- return false if nil&lt;br /&gt;
		return false&lt;br /&gt;
	else -- return true in all other cases&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getFrameAndArgs(frame)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	local args&lt;br /&gt;
	&lt;br /&gt;
	-- Make frame.args a fully functional table&lt;br /&gt;
	if frame.args then&lt;br /&gt;
		local frame_args = frame.args&lt;br /&gt;
		frame.args = {}&lt;br /&gt;
		for k, v in pairs(frame_args) do&lt;br /&gt;
			frame.args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if frame.args and next(frame.args) ~= nil then&lt;br /&gt;
		args = frame.args -- use args from #invoke&lt;br /&gt;
	elseif type(frame.getParent) == &amp;quot;function&amp;quot; then&lt;br /&gt;
		local pframe = frame:getParent()&lt;br /&gt;
		-- Make pframe.args a fully functional table&lt;br /&gt;
		local pframe_args = pframe.args&lt;br /&gt;
		pframe.args = {}&lt;br /&gt;
		for k, v in pairs(pframe_args) do&lt;br /&gt;
			pframe.args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		args = pframe.args -- get args from template call&lt;br /&gt;
	else&lt;br /&gt;
		args = frame -- assume directly passed in args&lt;br /&gt;
		frame = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return frame, args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.unescape(s)&lt;br /&gt;
	local news = s&lt;br /&gt;
	for start, stop in s:gmatch(&amp;quot;&amp;amp;#()%d*();&amp;quot;) do&lt;br /&gt;
		-- need to be relative to end, otherwise the indexes will be incorrect once the strigh's length changes&lt;br /&gt;
		start = start-1 - #s&lt;br /&gt;
		stop = stop-2 - #s&lt;br /&gt;
		&lt;br /&gt;
		news = news:sub(1, start-3) .. string.char(tonumber(s:sub(start, stop))) .. news:sub(stop+2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return news&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- generates a span tag that automatically cycles through the given image list&lt;br /&gt;
function p.anim(images, size)&lt;br /&gt;
	if p.isGiven(images) then&lt;br /&gt;
		images = p.unescape(images)&lt;br /&gt;
		local r = &amp;quot;&amp;quot;&lt;br /&gt;
		r = r .. &amp;quot;&amp;lt;span class=\&amp;quot;animated\&amp;quot; data-imgs=\&amp;quot;&amp;quot; .. images .. &amp;quot;\&amp;quot; &amp;quot;&lt;br /&gt;
		if p.isGiven(size) then&lt;br /&gt;
			r = r .. &amp;quot;data-img-size=\&amp;quot;&amp;quot; .. tostring(size) ..&amp;quot;\&amp;quot; &amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		r = r .. &amp;quot;&amp;gt;&amp;lt;span class=\&amp;quot;active\&amp;quot;&amp;gt;[[File:&amp;quot; .. mw.text.split(images, &amp;quot;;&amp;quot;)[1]&lt;br /&gt;
		if p.isGiven(size) then&lt;br /&gt;
			r = r .. &amp;quot;|&amp;quot; .. tostring(size)&lt;br /&gt;
		end&lt;br /&gt;
		r = r .. &amp;quot;]]&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
		return r&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mwAnim(frame)&lt;br /&gt;
	return p.anim(frame.args.images, frame.args.size)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- generates a Semantic MediaWiki property&lt;br /&gt;
function p.smwProp(name, value, display)&lt;br /&gt;
	if p.isGiven(name) and p.isGiven(value) then&lt;br /&gt;
		if p.isGiven(display) or display == &amp;quot; &amp;quot; then&lt;br /&gt;
			return &amp;quot;[[&amp;quot; .. name .. &amp;quot;::&amp;quot; .. value .. &amp;quot;|&amp;quot; .. display .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;[[&amp;quot; .. name .. &amp;quot;::&amp;quot; .. value .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- trims leading and trailing whitespace characters from a given string&lt;br /&gt;
function p.trim(str)&lt;br /&gt;
	if p.isGiven(str) then&lt;br /&gt;
		return string.gsub(str, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- appends px to a given value, only if it's not already there&lt;br /&gt;
function p.px(val)&lt;br /&gt;
	if tonumber(val) then&lt;br /&gt;
		return val .. &amp;quot;px&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if p.isGiven(val) then&lt;br /&gt;
		return string.gsub(val, &amp;quot;^(%d+)(?:px)?$&amp;quot;, &amp;quot;%1px&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- creates an internal MediaWiki link&lt;br /&gt;
function p.link(page, text, anchor)&lt;br /&gt;
	if p.isGiven(page) then&lt;br /&gt;
		local out = &amp;quot;[[&amp;quot; .. page&lt;br /&gt;
		if p.isGiven(anchor) then&lt;br /&gt;
			out = out .. &amp;quot;#&amp;quot; .. anchor&lt;br /&gt;
		end&lt;br /&gt;
		if p.isGiven(text) or (text == ' ') then&lt;br /&gt;
			out = out .. &amp;quot;|&amp;quot; .. text&lt;br /&gt;
		end&lt;br /&gt;
		out = out .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		return out&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- creates an image link&lt;br /&gt;
function p.img(page, size, link, alt)&lt;br /&gt;
	if p.isGiven(page) then&lt;br /&gt;
		local out = &amp;quot;[[File:&amp;quot; .. page&lt;br /&gt;
		if p.isGiven(size) then&lt;br /&gt;
			out = out .. &amp;quot;|&amp;quot; .. p.px(size)&lt;br /&gt;
		end&lt;br /&gt;
		if p.isGiven(link) then&lt;br /&gt;
			out = out .. &amp;quot;|link=&amp;quot; .. link&lt;br /&gt;
		end&lt;br /&gt;
		if p.isGiven(alt) then&lt;br /&gt;
			out = out .. &amp;quot;|&amp;quot; .. alt&lt;br /&gt;
		end&lt;br /&gt;
		out = out .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		return out&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- capitalize the first letter of a given string&lt;br /&gt;
function p.cap(str)&lt;br /&gt;
    return (str:gsub(&amp;quot;^%l&amp;quot;, string.upper))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- parses seconds to a min:sec string&lt;br /&gt;
function p.parseTime(seconds)&lt;br /&gt;
	if (seconds &amp;lt; 10) then&lt;br /&gt;
		return '0:0' .. seconds&lt;br /&gt;
	elseif (seconds &amp;lt; 60) then&lt;br /&gt;
		return '0:' .. seconds&lt;br /&gt;
	else&lt;br /&gt;
		local sec = seconds % 60&lt;br /&gt;
		local min = (seconds - sec) / 60&lt;br /&gt;
		if (sec &amp;lt; 10) then&lt;br /&gt;
			return min .. ':0' .. sec&lt;br /&gt;
		else&lt;br /&gt;
			return min .. ':' .. sec&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- formats a number with commas&lt;br /&gt;
-- http://lua-users.org/wiki/FormattingNumbers&lt;br /&gt;
function p.commaValue(n)&lt;br /&gt;
	local left, num, right = string.match(n, '^([^%d]*%d)(%d*)(.-)$')&lt;br /&gt;
	return left .. (num:reverse():gsub('(%d%d%d)', '%1,'):reverse()) .. right&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>PerfectBoat</name></author>
	</entry>
</feed>