模組:Special wikitext/Custom Module
外观
本模块主要用於require('Module:Module wikitext')._addText
(Module:Module wikitext)中,用於客製化模組命名空間。
使用方法為複製以下代碼到要客製化的模組中:
防止模板循環
如果上述設置仍無法防止模板循環,即模組或調用模組的頁面出現以下錯誤:
- 檢查到模板循環:Module:Special wikitext/Custom Module
- 檢查到模板循環:Module:Documentation
- 页面超出展开深度限制
- 警告:包含模板大小过大。 一些模板将不会包含。
可考慮改用以下代碼:
參見
#include <string>
#include "Module:Special wikitext/Custom Module.h"
std::string main () {
std::string wikitext = new mw::title("Template:Special wikitext/Custom Module")->getContent();
wikitext = removeNoinclude(wikitext);
mw::frame *frame = mw::getCurrentFrame();
wikitext = frame->preprocess(wikitext);
wikitext = removeIndicator(wikitext);
return wikitext;
}
本模块主要用於require('Module:Module wikitext')._addText
(Module:Module wikitext)中,用於客製化模組命名空間。
使用方法為複製以下代碼到要客製化的模組中:
防止模板循環
如果上述設置仍無法防止模板循環,即模組或調用模組的頁面出現以下錯誤:
- 檢查到模板循環:Module:Special wikitext/Custom Module
- 檢查到模板循環:Module:Documentation
- 页面超出展开深度限制
- 警告:包含模板大小过大。 一些模板将不会包含。
可考慮改用以下代碼:
參見
local p = {}
require('Module:Module wikitext')._addText([[
{{#ifexpr:{{{_is_in_doc|0}}}=0|
{{Special wikitext/Hide Code}}
{{Special wikitext/Hide Doc}}
<div class="special-wikitext-not-hide">
{{#invoke:documentation|main|_is_in_doc={{#expr:{{{_is_in_doc|0}}}+1}}|_content={{ {{#invoke:documentation|contentTitle}}}}}}
<syntaxhighlight lang=cpp line>
#include <string>
#include "Module:Special wikitext/Custom Module.h"
std::string main () {
std::string wikitext = new mw::title("Template:Special wikitext/Custom Module")->getContent();
wikitext = removeNoinclude(wikitext);
mw::frame *frame = mw::getCurrentFrame();
wikitext = frame->preprocess(wikitext);
wikitext = removeIndicator(wikitext);
return wikitext;
}
</syntaxhighlight>
</div>
}}
]])
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 --<indicator></indicator>內容移除完畢
return wikitext
end
local function removeNoinclude(input_text)
local wikitext = input_text
--關於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
function p.main()
local wikitext = mw.title.new("Template:Special wikitext/Custom Module"):getContent()
wikitext = removeNoinclude(wikitext)
local frame = mw.getCurrentFrame()
wikitext = frame:preprocess(wikitext)
wikitext = removeIndicator(wikitext)
return wikitext
end
return p