跳转到内容

模組:Special wikitext/Custom Module/tools

维基百科,自由的百科全书

这是Module:Special wikitext/Custom Module/tools当前版本,由A2569875留言 | 贡献编辑于2024年1月6日 (六) 09:34。这个网址是本页该版本的固定链接。

(差异) ←上一修订 | 最后版本 (差异) | 下一修订→ (差异)
local p = {}
local empty_string = ""
function p.removeIndicator(input_text)
	local wikitext = input_text
	if type(input_text) == type(0) then
		wikitext = tostring(input_text)
	elseif type(input_text.args) == type({"table"}) then
		wikitext = input_text.args[1] or input_text.args['1'] or ''
	elseif type(input_text) == type({"table"}) then
		wikitext = input_text[1] or input_text['1'] or ''
	end
	local re_indicator_head = "<%s*[Ii][Nn][Dd][Ii][Cc][Aa][Tt][Oo][Rr]"
	local re_indicator_tail = "<%s*/%s*[Ii][Nn][Dd][Ii][Cc][Aa][Tt][Oo][Rr]%s*>"
	local re_indicator = "<%s*/?%s*[Ii][Nn][Dd][Ii][Cc][Aa][Tt][Oo][Rr]%s*/?%s*>"
	--摘除模板樣板中的indicator與當中的內容
	local indicator = mw.ustring.find(wikitext, re_indicator_head)
	local _i = 1
	while indicator do --如果找到<indicator>
		--尋找</indicator>
		local _, indicator_end = mw.ustring.find(wikitext, re_indicator_tail)
		--如無</indicator>,視為indicator到頁面結尾
		indicator_end = indicator_end or -1
		--取得<indicator>...</indicator>之間的內容
		local indicator_text = mw.ustring.sub(wikitext, indicator, indicator_end or -1)
		--去除掉<indicator>...</indicator>與其之間的內容
		wikitext = mw.ustring.sub(wikitext, 1, indicator-1) .. ((indicator_end < 0) and empty_string or mw.ustring.sub(wikitext, indicator_end + 1, -1))
		--尋找下一個<indicator>
		indicator = mw.ustring.find(wikitext, re_indicator_head)
		_i = _i + 1 --避免無窮迴圈
		if _i > 100 then mw.addWarning(module_warn..'<indicator>過多') break end
	end
	wikitext = mw.ustring.gsub(wikitext, "\127'\"`UNIQ%-%-indicator%-[^%-]+%-QINU`\"'\127", "")
	return wikitext --<indicator></indicator>內容移除完畢
end
function p.removeNoinclude(input_text)
	local wikitext = input_text
	if type(input_text) == type(0) then
		wikitext = tostring(input_text)
	elseif type(input_text.args) == type({"table"}) then
		wikitext = input_text.args[1] or input_text.args['1'] or ''
	elseif type(input_text) == type({"table"}) then
		wikitext = input_text[1] or input_text['1'] or ''
	end
	--關於noinclude、includeonly和onlyinclude的regexp
	local re_noinclude_head = "<%s*[Nn][Oo][Ii][Nn][Cc][Ll][Uu][Dd][Ee]%s*>"
	local re_noinclude_tail = "<%s*/%s*[Nn][Oo][Ii][Nn][Cc][Ll][Uu][Dd][Ee]%s*>"
	local re_noinclude = "<%s*/?%s*[Nn][Oo][Ii][Nn][Cc][Ll][Uu][Dd][Ee]%s*/?%s*>"
	local re_includeonly = "<%s*/?%s*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][Oo][Nn][Ll][Yy]%s*/?%s*>"
	local re_onlyinclude = "<%s*/?%s*[Oo][Nn][Ll][Yy][Ii][Nn][Cc][Ll][Uu][Dd][Ee]%s*/?%s*>"
	local re_removes = {{"noinclude",re_noinclude}, {"includeonly",re_includeonly}, {"onlyinclude",re_onlyinclude}}
	--摘除模板樣板中的noinclude與當中的內容
	local noinclude = mw.ustring.find(wikitext, re_noinclude_head)
	local _i = 1
	while noinclude do --如果找到<noinclude>
		--尋找</noinclude>
		local _, noinclude_end = mw.ustring.find(wikitext, re_noinclude_tail)
		--如無</noinclude>,視為noinclude到頁面結尾
		noinclude_end = noinclude_end or -1
		--去除掉<noinclude>...</noinclude>與其之間的內容
		wikitext = mw.ustring.sub(wikitext, 1, noinclude-1) .. ((noinclude_end < 0) and empty_string or mw.ustring.sub(wikitext, noinclude_end + 1, -1))
		--尋找下一個<noinclude>
		noinclude = mw.ustring.find(wikitext, re_noinclude_head)
		_i = _i + 1 --避免無窮迴圈
		if _i > 100 then mw.addWarning(module_warn..'<noinclude>過多') break end
	end --<noinclude></noinclude>內容移除完畢
	--移除其他會影響解析功能的標籤
	for _, to_remove in pairs(re_removes) do _i = 1
		--處理巢狀引用
		local remove_count = 1 --紀錄移除數量
		while (tonumber(remove_count) or 0) > 0 do --如果還有殘留的相關標籤
			--移除殘留的相關標籤,並記錄移除數量
			wikitext, remove_count = mw.ustring.gsub(wikitext, to_remove[2], empty_string)
			_i = _i + 1 --避免無窮迴圈
			if _i > 100 then mw.addWarning(module_warn..'<'..to_remove[1]..'>過多') break end
		end --如果沒有殘留的相關標籤則結束迴圈
	end
	return wikitext
end
return p