模組:Delcat
主要用於
概要
{{Delcat}}模版的作用是可以讓參數的分類不出現在該條目,可能會有例外和其他技術不可完全執行的可能,例如引用重定向,消歧義頁面也會显示橘色、斜體顯示的站內技術。由於技術限制,任何由擴展定義的XML標籤(如<ref>
)產生的分類無法去除。
後來修改為字串取代函數直接實現,因此,相反地,也能做到抽取分類功能(函數:list_category);修改其正規運算式後則還能實現「消除內部連結」(圖像、編輯按鈕等,函數:dellink)、以及抽出特定章節(函數:get_title)等功能。
函數介紹
main
為主函式,設計給{{#invoke:Delcat}}
調用。
- 參數
- 1:主參數,要去除分類、內連的主要內容
- type:處理類型,可用的值如下
category
:去除分類list category
:抽出分類link
:去除[[]]
,內部連結會保留目標條目、圖像會保留圖像名稱
- 其餘參數:其他要一並刪除的內容
delete_category
- (*)提醒:本函數僅能利用Lua呼叫
刪除分類,作用是可以讓參數的分類不出現在該條目,可能會有例外和其他技術不可完全執行的可能,例如引用重定向,消歧義頁面也會現實橘色、斜體顯示的站內技術。由於技術限制,任何由擴展定義的XML標籤(如<ref>
)產生的分類無法去除。
本函數做的是與list_category
相反的動作。
- 參數
- source_str:字串。要清除分類的內容
- other:陣列。包含所有除了分類外要一並清除的內容,例如不應被憶起包含的魔術字,其表達式須遵循MW:Lua manual#Patterns以及MW:Lua manual#uPatterns。
list_category
- 設計給
{{#invoke:Delcat}}
調用。
列出分類,作用是可以僅列出參數的分類,而不顯示除了分類外的其他內容,可能會有例外和其他技術不可完全執行的可能,例如引用重定向,消歧義頁面也會現實橘色、斜體顯示的站內技術。由於技術限制,任何由擴展定義的XML標籤(如<ref>
)產生的分類無法取出。
本函數做的是與delete_category
相反的動作。
- 參數
- 1:主參數,要取出分類的主要內容
- 2:取出分類後的顯示方式,其會自動將
{{{1}}}
填入抓到的分類,預設值為*{{{1}}}\n
- 例如輸入
[[:{{{1}}}]]、
會輸出為[[:Category:分類1]]、[[:Category:分類2]]、[[:Category:分類3]]、
。
- 例如輸入
dellink
- 設計給
{{#invoke:Delcat}}
調用。
刪除內部連結、編輯連結、分類、合理使用圖像等,以避免在某些情況下出現不必要的連出頁面和合理使用圖像的非合理使用情況,或者可以用於草稿頁。
作用是可以讓參數的[[]]
不出現在該條目,可能會有例外和其他技術不可完全執行的可能,例如一些由模板產生的[[]]
,或由擴展定義的XML標籤(如<ref>
)產生的內部連結無法去除。
- 1:主參數,要去除
[[]]
的內容
deltitle
- (*)提醒:本函數僅能利用Lua呼叫
將章節替換成一般文字,避免出現於目錄的函數
- 參數
- input:字串。形如
== 章節名稱 ==
的字串,會替換成接近的大小之粗體文字。
find_category
- (*)提醒:本函數僅能利用Lua呼叫
回傳一個包含參數中所有可解析的分類之陣列。可能會有例外和其他技術不可完全執行的可能,例如引用重定向,消歧義頁面也會現實橘色、斜體顯示的站內技術。由於技術限制,任何由擴展定義的XML標籤(如<ref>
)產生的分類無法取出。
- 參數
- source_str:字串。要抓取分類的內容。
get_title
- 設計給
{{#invoke:Delcat}}
調用。
只取出參數中的特定章節
- 參數
- 1:主參數,要取出特定章節的內容
- 2或title:章節標題,
__FIRST_SECTION__
表示首段。
find_title
- (*)提醒:本函數僅能利用Lua呼叫
從輸入的字串中抽出特定章節的內容
- 參數
- str:字串。要取出特定章節的內容
- title:字串。章節標題,
__FIRST_SECTION__
表示首段。
get_chapter
- 設計給
{{#invoke:Delcat}}
調用。
取得章節標題
- 參數
- 1:主參數,要取出章節標題的內容,例如輸入「哈哈#你好」將返回「你好」。
範例
- main
語法:{{#invoke:Delcat|main| 1 = {{:啊}}| 2 = __DISAMBIG__ | type = category }}
的顯示效果為:
啊是一个感叹词,通常指一种跨语言现象,因语调不同而可能表示惊讶、赞叹、疑问或肯定。也可指:
- 啊 (Superfly单曲),日本歌手Superfly于2011年6月29日发行的第13首单曲。
另見
这是一个消歧义页,羅列了有相同或相近的标题,但內容不同的条目。 如果您是通过某條目的内部链接而转到本页,希望您能協助修正该處的内部链接,將它指向正确的条目。 |
- dellink
語法:{{#invoke:Delcat|dellink| 1 = {{:啊}}}}
的顯示效果為:
啊是一个感叹词,通常指啊 (跨语言现象),因语调不同而可能表示惊讶、赞叹、疑问或肯定。也可指:
- 啊 (Superfly单曲),日本歌手Superfly于2011年6月29日发行的第13首单曲。
- 另見
- Special:PrefixIndex/啊
File:Disambig gray.svg | 这是一个Wikipedia:消歧义页,羅列了有相同或相近的标题,但內容不同的条目。 如果您是通过某條目的内部链接而转到本页,希望您能協助修正该處的内部链接,將它指向正确的条目。 |
Category:全部消歧義頁面
- list_category
語法:{{#invoke:Delcat | list_category | {{:小林家的龍女僕}} | *[[:{{{1}}}|{{{1}}}]]\n }}
的顯示效果為:
- Category:百合动画
- Category:青年漫畫
- Category:2017年日本電視動畫
- Category:2021年日本電視動畫
- Category:日本漫畫作品
- Category:Nihongo模板使用extra參數的頁面
- Category:Cool教信者
- Category:2025年日本動畫電影
- Category:Crunchyroll動畫獎得主
- Category:女僕題材作品
- Category:龍題材漫畫
- Category:女主人公漫畫
- Category:萌擬人化題材作品
- Category:使用了Infobox animanga/name正式译名的条目
- Category:京都動畫
- Category:百合漫画
- Category:Comico
- Category:搞笑漫畫
- Category:Bilibili外购动画
- Category:女仆题材作品
- include
語法:
{{#invoke:Delcat | dellink | 1 = {{#invoke:Delcat | include | 1 = :娜娜奇#__FIRST_SECTION__ }} }}
的顯示效果為:
娜娜奇 奈奈祈 ナナチ | |
---|---|
《來自深淵 (漫畫)》角色 | |
File:娜娜奇.png | |
首次登場 | 《來自深淵 (漫畫)》 漫畫 第三卷 第19話 動畫 第一季 第10話 |
创作者 | 土筆章人 |
配音 | File:Flag of Japan.svg 井澤詩織 File:Flag of the United States.svg :布蘭特妮·卡爾博夫斯基 |
角色设定信息 | |
別名 | 奈奈祈 娜娜其 娜娜祈 娜娜琪 毛毛卿 |
物種 | 來自深淵用語列表#生骸(原為人類) |
性別 | 不明 |
出生 | 北極 賽雷尼之地 |
居住 | 深界四層:33 娜娜奇的基地 |
相關角色 | 好友:#米蒂 |
代表色 | 紅棕色 |
娜娜奇(日语:ナナチ Nanachi), 又譯奈奈祈,是土筆章人(つくしあきひと)創作的奇幻題材漫畫《來自深淵 (漫畫)》中的主要角色之一 ,是一個有著類似兔子外形、且自稱軟綿綿有如布偶的角色,配音員是井澤詩織。被視為《來自深淵》這部作品的吉祥物 ,由於此角色登場後導致《來自深淵》人氣有所提升,因此被作者稱為「招財娜娜奇」。
- getcjk
語法:
{{#invoke:Delcat | dellink | 1 = {{#invoke:Delcat | getcjk | 1 = {{:除以二}} }} }}
的顯示效果為:
- Image:Five and six divide by two.svg
Image:Divide 14 Rabbits by 2.svg 在數學中,除以二是一種運算動作,即被除數的除數(分母)是2、或乘以二分之一的動作,又可稱為半分(dimidiation)或平分(halving)。最早將除法二視為一種獨立運算的是古埃及人,其用於:古埃及乘法演算法中的一個基本步驟。一直到近代,除以二都有被單獨當作為一種運算方式看待的情況。而在現代電腦電腦程式設計中,由於大部分的情況下,除以二可以使用邏輯位移運算取代,因此也用於編譯器最佳化的技術中。
- 歷史
將除以二視為一個特殊的運算方式來處理乘法及除法的做法,最早可以追溯到古埃及人,其將除以二作為:古埃及乘法演算法中的一個基本步驟。 一直到十六世紀,仍有一些數學家將除以二視為一個獨立的運算方式。 而在十進制算術、計算機科學的二進制及其他偶數進制算術中,除以二的計算相較於被除數的除數為其他數的除法而言,相對簡單,因此在現代的電腦程式設計中,除以二也會被視為一個獨立的運算子。
- 二進制
File:Rotate right logically.svg二進制)使用邏輯右移來實現除以二的過程,得到了商為11(11二進制)]] 在二進制算術中,除以二可以透過移位運算中的右移運算子來完成,即將二進位數中的每一位全部都向右移動一位,此技術應用於編譯器最佳化中的強度折減技術。例如將105除以二,先將105表示為二進制,即1101001,接著將所有位元向右移一位,溢位的部分1被捨棄,即得到商110100,對應的十進制數值為52。類似地,此操作可以套用到所有除以二的正整數次方的情形,當被除數的除數(分母)為時,其做法為將該數的所有位數右移位來完成,例如欲將24除以八,24在二進制中計為11000,而8為2的立方數,將11000向右位移3位得11,十進制為3,則得到商為3,即完成的運算。由於位移運算通常比除法來得快,因此以這種透過位移運算取代部分除法運用在編譯器最佳化中是有幫助的。但是,出於程式碼的可移植性和程式可讀性的考慮,通常仍然會在程式碼中以除法表示,替換為移位運算應由編譯器來完成。不過,在有符號數處理中,上述做法並不能確保總是正確。一般邏輯右移一位可以將該數除以二,若除不盡總是會向下取整,但在某些程式語言中,有符號二進制整數的除法會向0舍入,也就是說,若一整數是負的,除不盡的狀況將會向上取整。
- <span id="除以2k" style="font-size
- 18px;">除以2k
邏輯右移可以處理除數(或分母)為任意二的冪的除法,即除以。例如除以四、除以八等。更一般地,在特定底數的進位制中,除數(或分母)為任意的除法(k為整數)皆可以透過將數字位數向右移k位來完成。例如除以十,由於普遍的數字計法是透過十進制表達,因此可以直接將數字位數向右移1位來完成除以十的操作。例如230除以十,將230向右移一位,得23,即。
- 二進制浮點數
在二進制浮點數算術中,在不要求結果不為:非正規化数的情況下,由於其是由二進制表示,因此可透過將浮點數科學記號的指數部分減一來完成除以二的動作。許多程式語言會單獨專門為浮點數提供除以二的冪之函數,例如Java有提供一個名為java.lang.Math.scalb
的函數來計算二的冪之比;而C語言也有類似功能的函數,例如ldexp
。
- 十進制
在十進制中,可透過下列演算法將任意整數除以二,其也可以作為定義底數為偶數之進位制中將任意數除以二的模型。其做法如下:
- 寫下整數N,並於左邊補上1個0。
- 針對N的每一個位數,根據下列表格寫下數字則可得到除以二的商。
第一位數為 | 偶數 | 偶數 | 偶數 | 偶數 | 偶數 | 奇數 | 奇數 | 奇數 | 奇數 | 奇數 |
---|---|---|---|---|---|---|---|---|---|---|
下一位數 | 0 或 1 | 2 或 3 | 4 或 5 | 6 或 7 | 8 或 9 | 0 或 1 | 2 或 3 | 4 或 5 | 6 或 7 | 8 或 9 |
寫下 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
例如: 1738除以2=?
- 寫下 01738。
- 01:偶數位數0後面跟著1,寫下0;
- 17:奇數位數1後面跟著7, 寫下8;
- 73:奇數位數7後面跟著3, 寫下6;
- 38:奇數位數3後面跟著8, 寫下9;
- 商為0869。
從示例中可以看出0的奇偶性。此外,若N的最後一位是奇數,則需再將0.5加到結果中。
- 奇偶性
File:Parity of 5 and 6 Cuisenaire rods.png展示了整數的奇偶性:對於奇數5,無法使用2個相同長度的古氏積木排出;而6可以可以均勻分為2個3或是用3個長度為2的積木排出]]
對整數而言,分母為2的除法與一數的奇偶性相關:可被整除者是偶數(包括自己與),不可被整除者是奇數。
- 其他用途
除以二可以用於某些速算法,例如某數乘以五可以透過先將該數除以二再乘以十來完成,例如25乘以五,首先將25除以2得12.5,再乘以10得到結果為125。
- 參見
- 二分之一:1除以二的結果
- 中位數:除以二對應的統計學的概念:將一組數值平分為兩個相等子集的值
- 平分線:除以二對應的幾何學的概念:將一幾何物件平分為兩等分的線,又可分為垂直平分線和角平分線
- 除以零:另一個會被單獨討論的除法,特點在其結果難以被定義。
- 參考文獻
Category:二 Category:分數 Category:除法
注意事项
模板编辑说明
參見
- {{Delcat}}
local p={
replace_data = {
"%[%[[Cc][Aa][Tt].-%]%]",
"%[%[分類.-%]%]",
"%[%[分类.-%]%]",
"%[%[[Cc]ategory.-%]%]",
"%[%[CATEGORY.-%]%]",
--"其他例外", --直接新增即可
},
nullstr = ''
}
local strings = require( 'Module:String' )
local TlParLib = {}
local lib_arg = {}
--主函數
function p.main(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
get_args = getArgs(frame, {parentFirst=true})
--__DISAMBIG__
other_replace = {}
to_replace = ''
rep_type = "category"
for arg_name, arg_value in pairs( get_args ) do
if arg_name == 1 or arg_name == '1' then
--要處理的字串
to_replace = arg_value
elseif arg_name == "type" then
rep_type = mw.ustring.lower(arg_value)
else
other_replace[arg_name] = arg_value
end
end
if rep_type == "category" then
return p.delete_category(to_replace, other_replace)
elseif rep_type == "link" then
return p.dellink(get_args)
elseif rep_type == "list_category" or rep_type == "listcategory" or rep_type == "list category" then
return p.list_category(get_args)
else
return to_replace
end
end
function p.list_category(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
get_args = getArgs(frame, {parentFirst=true})
category_list = p.find_category((get_args[1] or get_args['1']) or '')
format = mw.ustring.gsub((get_args[2] or get_args['2']) or "*{{{1}}}\n", "%{%{%{.-%}%}%}", "%%s" );
it = mw.ustring.find(format, "%%s", 1)
if it == nil then format = format .. "%s" end
format = mw.ustring.gsub(format, "\\n", "\n")
body = ''
for i, category in pairs( category_list ) do
body = body .. mw.ustring.gsub(format, "%%s", category)
end
return body
end
function p.deltitle(input)
str = mw.text.trim(mw.ustring.gsub(input,"\127\'\"`UNIQ%-%-.-QINU`\"\'\127", p.nullstr))
begin_, end_ = mw.ustring.find(str, "=+", 1)
if begin_==nil then return input end
begin_2 = mw.ustring.find(str, "=+ *\n", end_ + 1)
count = end_ - begin_ + 1
title_name = mw.text.trim(mw.ustring.sub(str, end_ + 1, begin_2-1 ))
result = "\n;<span id=\"" .. title_name .. "\" style=\"font-size:" .. (({24,20,18,16,14})[count] or 14) .. "px;\">" .. title_name .. "</span>"
if count < 1 then return str
elseif count < 3 then result = result .. "\n----" end
return result .. '\n'
end
function p.bytelen(frame)
local args
if frame == mw.getCurrentFrame() then
-- We're being called via #invoke. The args are passed through to the module
-- from the template page, so use the args that were passed into the template.
args = frame.args
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
args = frame
if type(args) ~= type({}) then args = {frame} end
end
return string.len(args[1] or args['1'])
end
function p.getcjk(frame)
local args
if frame == mw.getCurrentFrame() then
-- We're being called via #invoke. The args are passed through to the module
-- from the template page, so use the args that were passed into the template.
args = frame.args
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
args = frame
if type(args) ~= type({}) then args = {frame} end
end
local str = args[1] or args['1']
str = mw.ustring.gsub(str, "<%s*div.-<%s*%/div%s*>",'')
mw.ustring.gsub(mw.ustring.gsub(args[1] or args['1'],
"[%c%l%u%d%p%s%z" ..
"%>%<%=%{%}%|%[%]%`%+%-%*%/%\\"
.. "↑↓←→№©⧸⁄"
.. "%−%~%~%!%@%#%$%^%&%_×÷ºª±∓"
.. "]"
,'.'),"%.+",args['gap'] or '')
return str
end
function p.dellink(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
get_args = getArgs(frame, {parentFirst=true})
input = (get_args[1] or get_args['1']) or ''
input = mw.ustring.gsub(input,"\127\'\"`UNIQ%-%-ref.-QINU`\"\'\127", p.nullstr)
body = p.delete_category(input, {})
get_link = mw.ustring.gmatch( body, "%[%[.-%]%]" )
i = 1 j = 1 while mw.ustring.find(body, "\n=+ *[^\n]* *=+ *\n") and j do
if i>=10 then j = nil end
body = mw.ustring.gsub(body, "\n=+ *[^\n]* *=+ *\n", p.deltitle)
i = i + 1
end
catbody = mw.ustring.gsub(input,'<',"<")
catbody = mw.ustring.gsub(catbody,'>',">")
category_list = p.find_category(catbody)
link_str = get_link()
while link_str do
link_url = mw.ustring.sub(link_str, 3, -3)
--^$()%.[]*+-?
link_matcher = mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(link_url,
"%%", "%%%%"), "%)", "%)"), "%-", "%-"), "%^", "%^"), "%$", "%$"), "%(", "%("), "%.", "%."), "%*", "%*"), "%+", "%+"), "%|", "%|")
link_matcher = mw.ustring.gsub(mw.ustring.gsub(link_matcher, "%[", "%[") , "%]", "%]")
link_matcher = mw.ustring.gsub(mw.ustring.gsub(link_matcher, "%{", "%{") , "%}", "%}")
first_split = mw.ustring.find(link_url, "%|", 1) or 0
get_link_inner = mw.ustring.gsub(mw.ustring.sub(link_url, 1, first_split - 1), "%%", "%%%%")
body = mw.ustring.gsub( body, "%[%[" .. link_matcher .. "%]%]", get_link_inner );
link_str = get_link()
end
body = mw.text.trim(body) .. '\n'
body = mw.ustring.gsub( body, "[Ii][Ss][Bb][Nn]", "ISBN" );
body = mw.ustring.gsub( body, "__[A-Z]+__", p.nullstr );
for i, category in pairs( category_list ) do
body = body .. category .. " "
end
return body
end
function p.delete_category(source_str, other)
local body = source_str
for i, categorys in pairs( p.replace_data ) do
body = mw.ustring.gsub( body, categorys, p.nullstr );
end
for i, categorys in pairs( other ) do
body = mw.ustring.gsub( body, categorys, p.nullstr );
end
--Category:使用ISBN魔術連結的頁面
body = mw.ustring.gsub( body, "[Ii][Ss][Bb][Nn]", "ISBN" );
body = mw.text.trim(body) --消除多餘空行
return body
end
function p.find_category(source_str)
local body = ''
input = mw.ustring.gsub(source_str,'<',"<")
input = mw.ustring.gsub(input,'>',">")
cat_counting = {}
for i, category_matcher in pairs( p.replace_data ) do
get_cat = mw.ustring.gmatch( input, category_matcher )
cat_str = get_cat()
while cat_str do
cat_name_it = mw.ustring.find(cat_str, ':', 1, false)
first_split = mw.ustring.find(cat_str, "%|", 1) or -2
category = mw.ustring.sub(cat_str, cat_name_it + 1, first_split - 1)
cat_counting[category] = category
cat_str = get_cat()
end
end
if mw.ustring.find(body, "[Ii][Ss][Bb][Nn]") then category_list["使用ISBN魔術連結的頁面"] = "使用ISBN魔術連結的頁面" end
cat_list = {}
i=1
for _, category_name in pairs( cat_counting ) do
cat_list[i] = "Category:" .. category_name
i = i + 1
end
return cat_list
end
function p.test(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
get_args = getArgs(frame, {parentFirst=true})
text = mw.ustring.gsub( ((get_args[1] or get_args['1']) or ''), '\n', "\n ")
input = mw.ustring.gsub(text,'<',"<")
input = mw.ustring.gsub(input,'>',">")
--return mw.ustring.gsub( input .. "\n*匹配數:", "\127\'\"`UNIQ%-%-ref.-QINU`\"\'\127", p.nullstr );
input = mw.ustring.gsub( input, "\127\'\"`", p.nullstr );
return mw.ustring.gsub( input, "`\"\'\127", p.nullstr );
end
function p.get_title(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
get_args = getArgs(frame, {parentFirst=true})
for arg_name, arg_value in pairs( get_args ) do
if arg_name == 1 or arg_name == '1' then
--要處理的字串
input = arg_value
elseif arg_name == "title" or arg_name == "2" or arg_name == 2 then
title = arg_value
elseif arg_name == "keep" or arg_name == "keep_title" or arg_name == "keep title" or
arg_name == "3" or arg_name == 3 then
keep_title = mw.ustring.lower(arg_value)
end
end
return p.find_title(input or '', title or '', keep_title)
end
function p.get_chapter(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
get_args = getArgs(frame, {parentFirst=true})
input = (get_args[1] or get_args['1']) or ''
chapter_begin, chapter_end = mw.ustring.find(input, '#', 1)
if chapter_begin ~= nil then
return mw.ustring.sub(input, chapter_begin + 1)
end
return ''
end
-- @deprecated
function p.delnowiki(frame)
mw.addWarning('[[Module:Delcat]]: Deprecated method <code>[[Module:Delcat]]#delnowiki</code> is called. Please replace with <code>{{tlm|#invoke|Unstrip|unstripNoWiki|text}}</code> (wikitext) or <syntaxhighlight lang="lua" inline>mw.text.unstripNoWiki(text)</syntaxhighlight> (lua).')
-- For calling from #invoke.
local get_args
if frame == mw.getCurrentFrame() then
-- We're being called via #invoke. The args are passed through to the module
-- from the template page, so use the args that were passed into the template.
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
get_args = getArgs(frame, {parentFirst=true})
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
get_args = frame
if type(get_args) ~= type({}) then get_args = {frame} end
end
local input_str=nil,get_args[1] or get_args['1'] or ''
return mw.text.unstripNoWiki(input_str)
end
function p.getData(data,data_path)
local path_items = mw.text.split(data_path, "%.")
local result = data
for _, path_item in ipairs(path_items) do
if type(result) == type(nil) then break end
result = result[path_item]
end
return result
end
function p.include(frame)
local args, working_frame
if frame == mw.getCurrentFrame() then
-- We're being called via #invoke. The args are passed through to the module
-- from the template page, so use the args that were passed into the template.
if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end
args = lib_arg.getArgs(frame, {parentFirst=true})
working_frame = frame
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
args = frame
working_frame = mw.getCurrentFrame()
if type(args) ~= type({}) then args = {frame} end
end
local keep_title
local pagename
local full_include = false
local preprocess = true
local new_args = { args["\\1"] or '' }
for arg_name, arg_value in pairs( args ) do
if arg_name == 1 or arg_name == '1' then
pagename = arg_value
elseif arg_name == "keep" or arg_name == "keep_title" or arg_name == "keep title" then
keep_title = mw.ustring.lower(arg_value)
elseif arg_name == "full_include" or arg_name == "full include" or arg_name == "full" then
if yesno == nil then yesno = require('Module:Yesno') end
full_include = yesno(mw.ustring.lower(arg_value) or 'no')
elseif arg_name == "\\1" then new_args["1"] = arg_value
elseif frame ~= mw.getCurrentFrame() and arg_name == "NoPreprocess" then preprocess = not require('Module:Yesno')(arg_value) -- lua專用,使目標暫時不展開,不允許直接呼叫避免慘案發生
else new_args[arg_name] = arg_value end
end
local hide_first_title = false
local show_t = true
if keep_title ~= nil then
if yesno == nil then yesno = require('Module:Yesno') end
if keep_title == "hide" then show_t, hide_first_title = false, true
else show_t = yesno(keep_title or "yes") end
else
show_t = true
end
if mw.text.trim(pagename or '') == '' then return '' end
local chaptername = ''
local input_fullpagename = tostring(pagename)
local InIsSubst, InIsSSubst, InIsMsgnw
pagename, InIsSubst = mw.ustring.gsub(pagename, "^subst:","")
pagename, InIsMsgnw = mw.ustring.gsub(pagename, "^msgnw:","")
pagename, InIsSSubst = mw.ustring.gsub(pagename, "^safesubst:","")
pagename = mw.ustring.gsub(pagename, "^raw:","")
pagename = mw.ustring.gsub(pagename, "^int:","MediaWiki:")
InIsSubst = InIsSubst > 0 or InIsMsgnw > 0
InIsMsgnw = InIsMsgnw > 0
local mark_pos,_ = mw.ustring.find(pagename, '%#') --分析章節語法(#)
if mark_pos then
chaptername = mw.ustring.sub(pagename,mark_pos+1,#pagename)
pagename = mw.ustring.sub(pagename,1,mark_pos-1)
end
local chapterfullname = tostring(chaptername)
local chapterid = 1
mark_pos = mw.ustring.find(chapterfullname, "%_%d+$") --分析章節語法(_)
if mark_pos then
chaptername = mw.ustring.sub(chapterfullname,1,mark_pos-1)
chapterid = tonumber(mw.ustring.sub(chapterfullname,mark_pos+1,#chapterfullname)) or 1
end
local chapterothername = tostring(chaptername)
local body = ''
if mw.text.trim(pagename) == '' then return '' end
--取得引用頁名稱
local check_includetitle, is_namespace0 = mw.text.trim(pagename), 0
check_includetitle, is_namespace0 = mw.ustring.gsub(check_includetitle, "^%s-:","")
local check_includetitle_obj = (mw.title.new( check_includetitle ) or {})
local check_includetitle_namespace = check_includetitle_obj.namespace or 10
local check_isExternal = check_includetitle_obj.isExternal
if check_isExternal == nil then check_isExternal = false end
if check_includetitle_namespace == 0 and is_namespace0 > 0 and not check_isExternal then --有冒號表示指名名字空間(預設是 Template )
check_includetitle = mw.title.new( check_includetitle )
elseif check_includetitle_namespace == 0 and not check_isExternal then --沒有冒號表示預設是 Template
check_includetitle = mw.title.new( "Template:" .. check_includetitle )
else --其餘情況就用解析到的名字空間
check_includetitle = mw.title.new( check_includetitle )
end
if check_includetitle == nil then check_includetitle = check_includetitle or {
fullText = mw.text.trim(pagename) , text = mw.text.trim(pagename), isErrorTitle=true
} end
--建立解析器,解析模板語法
local include_frame = mw.getCurrentFrame()
local include_parent_frame = include_frame:getParent()
if include_parent_frame and not mw.isSubsting() then include_frame = include_parent_frame end
--定位為由呼叫者直接執行
if not mw.isSubsting() then
working_frame = include_frame:newChild{ title = include_frame:getTitle(), args = new_args }
end
local input_str = working_frame:preprocess( "{{msgnw:" .. pagename .. "}}" ) --析出頁面原碼
local redirectTarget = check_includetitle.redirectTarget
if redirectTarget ~= false and redirectTarget ~= nil then check_includetitle = redirectTarget end
local subst_error = false
if mw.isSubsting() then
--這部份似乎無解,subst:和msgnw:無法同時疊加
xpcall( function()
input_str = working_frame:expandTemplate{ title = ":" .. check_includetitle.fullText, args = new_args }
--針對章節標提移除擴展標籤,使subst後系統自動生成新的
input_str = mw.text.trim(mw.ustring.gsub(input_str,"\127\'\"`UNIQ%-%-h%-.-QINU`\"\'\127", p.nullstr))
end, function(message)
input_str = ''
subst_error = true
end )
else
input_str = mw.text.decode(input_str) --解析網頁符號 (&#XXX;)
end
if (#input_str <= (12 + #check_includetitle.fullText) ) or subst_error==true then
if TlParLib._getEscapeString == nil then TlParLib = require('Module:TemplateParameters') end
local new_str, replaced = mw.ustring.gsub(mw.ustring.lower(input_str),
"[%[%{][%[%{][^%]%}]-:(" ..
TlParLib._getEscapeString(mw.ustring.lower(check_includetitle.fullText)) ..
")[%]%}][%]%}]"
,"[[:%1"
)
if replaced > 0 or subst_error==true then
if subst_error==true then new_str = "[[:" .. check_includetitle.fullText end
if check_includetitle.isErrorTitle then return check_includetitle.fullText end
input_str = new_str .. '#' .. chapterfullname .. '|'
if mw.text.trim(check_includetitle.nsText or '') ~= '' then input_str = input_str .. check_includetitle.nsText .. ':' end
input_str = input_str .. check_includetitle.text
if mw.text.trim(chapterfullname) ~= '' then input_str = input_str .. '#' .. chaptername end
input_str = input_str .. "]]"
return input_str
end
end
--去除擴展標籤之前,由於章節(== XX ==)也是一種列入strip的擴展標籤,因此要先儲存起來,避免資料遺失
local htagstrip_table = {}
if not mw.isSubsting() then --subst需保留擴展標籤 (subst後會自動還原)
local htagstrip_matcher = "\127\'\"`UNIQ%-%-h%-.-QINU`\"\'\127%s-[^\n]-%s-=+%s-\n"
local htagstrip_start, htagstrip_end = mw.ustring.find(input_str, htagstrip_matcher, 1)
while htagstrip_start do
local temp_htagstrip = mw.ustring.sub(input_str, htagstrip_start, htagstrip_end)
local htagstrip_str = mw.ustring.match(temp_htagstrip, "\127\'\"`UNIQ%-%-h%-.-QINU`\"\'\127")
local htag_tail = mw.ustring.gsub(temp_htagstrip, "\127\'\"`UNIQ%-%-h%-.-QINU`\"\'\127", "")
local begin_, end_ = mw.ustring.find(htag_tail, "=+", 1)
local htag_name = mw.text.trim(mw.ustring.gsub(htag_tail, '=', ''))
htagstrip_table[#htagstrip_table+1] = {
name=mw.text.trim(htag_name),
level=end_ - begin_ + 1,
htagstrip=htagstrip_str
}
htagstrip_start, htagstrip_end = mw.ustring.find(input_str, htagstrip_matcher, htagstrip_end+1)
end
input_str = mw.text.killMarkers( input_str ) --去除擴展標籤
end
input_str = '\n\n' .. input_str .. '\n\n' --使規表達式不會在首行和末行出現邊界情況
if TlParLib._getEscapeString == nil then TlParLib = require('Module:TemplateParameters') end
local chapterfullname_regex_pattern = TlParLib._getEscapeString(chapterfullname)
local chaptername_regex_pattern = TlParLib._getEscapeString(chaptername)
local is_htag = false
local function htag_regex(chname)
--用於處理subst不同的載入方式
if mw.isSubsting() then return "\n=+ -" .. chname .. " -=+ -\n" end
return "\n=+%s-" .. chname .. "%s-=+%s-\n"
end
local function spantag_regex(chname) return "%<%s-span[^%>]+id=[%\"%\']" .. chname .. "[%\"%\']" end
local function anchortag_regex(chname) return "%{%{[Aa][Nn][Cc][Hh][Oo][Rr][^%}]-%|%s-" .. chname .. "%s-[%|%}]" end
local function find_chtag(chname, alltext)
is_htag = true
local finded_title_begin, finded_title_end = mw.ustring.find(input_str, htag_regex(chname), 1)
if finded_title_begin then return finded_title_begin, finded_title_end end
is_htag = false
finded_title_begin, finded_title_end = mw.ustring.find(input_str, spantag_regex(chname), 1)
if finded_title_begin then return finded_title_begin, finded_title_end end
finded_title_begin, finded_title_end = mw.ustring.find(input_str, anchortag_regex(chname), 1)
if finded_title_begin then return finded_title_begin, finded_title_end end
end
local next_title_matcher = htag_regex("[^\n]-")
if mw.text.trim(chapterfullname) ~= '' then
local finded_title_begin, finded_title_end = find_chtag(chapterfullname_regex_pattern, input_str)
local next_title_begin, next_title_end = #input_str, nil; next_title_end = next_title_begin
if finded_title_begin then --匹配全名
else --從非全名尋找
finded_title_begin, finded_title_end =find_chtag(chaptername_regex_pattern, input_str)
end
if chapterid > 1 then
local cutted_title_matcher = htag_regex(chaptername_regex_pattern)
for index = 2, chapterid do
if finded_title_end ~= nil then
finded_title_begin, finded_title_end = mw.ustring.find(input_str, cutted_title_matcher, finded_title_end + 1)
end
end
end
local finded_title_string = mw.ustring.sub(input_str, finded_title_begin, finded_title_end)
if chapterfullname == "__FIRST_SECTION__" then finded_title_begin = -1;is_htag=true end
local htag_level = nil
if finded_title_begin then --找到了
if chapterfullname == "__FIRST_SECTION__" then
finded_title_string = ''
htag_level = 9007199254740991 --lua max int
finded_title_end = 1
else
if is_htag == false then --分析章節標題
local re_find = mw.ustring.sub(input_str, 1, finded_title_begin)
re_find = re_find:reverse()
local temp_title_begin, temp_title_end
if(mw.ustring.isutf8(re_find) == true )then
temp_title_begin, temp_title_end = mw.ustring.find(re_find, htag_regex("[^\n]-"), 1)
if temp_title_begin then finded_title_string = mw.ustring.sub(re_find, temp_title_begin, temp_title_end) end
else
temp_title_begin, temp_title_end = re_find:find(htag_regex("[^\n]-"), 1)
if temp_title_begin then finded_title_string = re_find:sub(temp_title_begin, temp_title_end) end
end
finded_title_string = finded_title_string:reverse()
if(mw.ustring.isutf8(finded_title_string) == true )then
chapterothername = mw.ustring.gsub(finded_title_string,"=",'')
else
chapterothername = finded_title_string:gsub("=",'')
end
end
--獲得章節標題的級數
if htag_level==nil then
local begin_, end_ = mw.ustring.find(finded_title_string, "=+", 1)
htag_level = end_ - begin_ + 1
end
end
local next_title_find_begin, next_title_find_end = mw.ustring.find(input_str, next_title_matcher, finded_title_end + 1)
local flag = true while next_title_find_begin and flag do
local next_title_find = mw.ustring.sub(input_str, next_title_find_begin, next_title_find_end)
local find_begin_, find_end_ = mw.ustring.find(next_title_find, "=+", 1)
local find_count = find_end_ - find_begin_ + 1
if find_count <= htag_level then
next_title_begin = next_title_find_begin
next_title_end = next_title_find_end
flag = nil
end
next_title_find_begin, next_title_find_end = mw.ustring.find(input_str, next_title_matcher, next_title_find_end + 1)
end
if next_title_begin == nil then next_title_begin = 0 end
local ch_start = finded_title_end + 1
if is_htag == false then ch_start = finded_title_begin end
body = mw.ustring.sub(input_str, ch_start, next_title_begin - 1)
if show_t == false then --不顯示章節標頭者,移除章節標頭
local i = 1 j = 1 while mw.ustring.find(body, "\n=+ *[^\n]* *=+ *\n") and j do if i>=10 then j = nil end
body = mw.ustring.gsub(body, "\n=+ *[^\n]* *=+ *\n", p.deltitle)
i = i + 1
end
end
if hide_first_title==false then
if show_t then body = finded_title_string .. body
else body = p.deltitle(finded_title_string) .. body end
end
end
else
body = input_str
end
if full_include==true then --設定為 "全面引用" 將noinclude等標記移除
--匹配noinclude等標記的正規表達式 (適用於lua的版本)
local include_pattern = "[Ii][Nn][Cc][Ll][Uu][Dd][Ee]"
local only_pattern = "[Oo][Nn][Ll][Yy]"
local no_pattern = "[Nn][Oo]"
local taghead_pattern = "%<[%s/]-"
local tagtail_pattern = "[^%>]-%>"
local tagdel_pattern = "<!---->"
body = mw.ustring.gsub(body, taghead_pattern .. no_pattern .. include_pattern .. tagtail_pattern, tagdel_pattern)
body = mw.ustring.gsub(body, taghead_pattern .. only_pattern .. include_pattern .. tagtail_pattern, tagdel_pattern)
body = mw.ustring.gsub(body, taghead_pattern .. include_pattern .. only_pattern .. tagtail_pattern, tagdel_pattern)
end
local min_title = 0
if show_t == true and not mw.isSubsting() then --顯示章節標頭者,須使章節標頭正常運作
--將擴展標籤 (== XX ==) 擺回去
body = '\n\n' .. body .. '\n\n' --使規表達式不會在首行和末行出現邊界情況
local back_title_start, back_title_end = mw.ustring.find(body, next_title_matcher, 1)
local title_first_match = true
while back_title_start do --逐一搜索標題
local check_title=mw.ustring.sub(body, back_title_start, back_title_end)
check_title=mw.text.trim(mw.ustring.gsub(check_title, '=', ''))
check_title=mw.text.trim(check_title) --確定標題名稱
local check_title_matcher=TlParLib._getEscapeString(check_title)
local htagstrip_table_item={} --獲得原始標題的擴展標籤strip標記符號
for ik, iv in ipairs(htagstrip_table) do
if iv.name == check_title or iv.name == chapterothername then
htagstrip_table_item = iv
if title_first_match == true then
min_title = ik
title_first_match = false
end
break
end
end
--將擴展標籤strip標記符號放回內文
if htagstrip_table_item.htagstrip then
body = mw.ustring.gsub(body, "(=+)(%s-" .. check_title_matcher .. "%s-=+)", "%1" .. htagstrip_table_item.htagstrip .. "%2")
end
back_title_start, back_title_end = mw.ustring.find(body, next_title_matcher, back_title_end+1)
end
end
body = mw.text.trim(body)
--subst無須復位
if mw.isSubsting() then return body end
if min_title > 1 then body = "\127\'\"`UNIQ____TITLE__TAG__PATTERN____QINU`\"\'\127\n" .. body
for _=2,min_title do body = "== ==\n" .. body end
end
working_frame = include_frame:newChild{ title = check_includetitle.fullText, args = new_args }
if preprocess then -- lua專用,使目標暫時不展開
body = working_frame:preprocess( body )
end
if min_title > 1 then local start;_,start = mw.ustring.find(body,"\127\'\"`UNIQ____TITLE__TAG__PATTERN____QINU`\"\'\127\n")
if start then body =mw.ustring.sub(body, start+1, #body) end
body = mw.text.trim(body)
end
return body
end
function p.find_title(str, title, keep_title)
if title == nil then return '' end
if title == '' then return str end
settion_data_begin, settion_data_end = mw.ustring.find(title, "_[0-9]+$", 1)
find_count = 1
if settion_data_begin ~= nil then
cutted_title = mw.ustring.sub(title, 1, settion_data_begin - 1)
find_count = tonumber(mw.ustring.sub(title, settion_data_begin + 1, settion_data_end))
else
cutted_title = title
end
if find_count < 1 then
find_count = 1
cutted_title = title
end
show_t = true
if keep_title ~= nil then
if yesno == nil then yesno = require('Module:Yesno') end
if keep_title == "hide" then show_t = false end
keep_t = yesno(keep_title)
else
keep_t = false
end
str = '\n'..mw.text.trim(mw.ustring.gsub(str,"\127\'\"`UNIQ%-%-h%-.-QINU`\"\'\127", p.nullstr))
--^$()%.[]*+-?
title_matcher = mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(title,
"%%", "%%%%"), "%)", "%)"), "%-", "%-"), "%^", "%^"), "%$", "%$"), "%(", "%("), "%.", "%."), "%*", "%*"), "%+", "%+"), "%|", "%|")
title_matcher = mw.ustring.gsub(mw.ustring.gsub(title_matcher, "%[", "%[") , "%]", "%]")
title_matcher = mw.ustring.gsub(mw.ustring.gsub(title_matcher, "%{", "%{") , "%}", "%}")
cutted_title_matcher = mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(cutted_title,
"%%", "%%%%"), "%)", "%)"), "%-", "%-"), "%^", "%^"), "%$", "%$"), "%(", "%("), "%.", "%."), "%*", "%*"), "%+", "%+"), "%|", "%|")
cutted_title_matcher = mw.ustring.gsub(mw.ustring.gsub(cutted_title_matcher, "%[", "%[") , "%]", "%]")
cutted_title_matcher = mw.ustring.gsub(mw.ustring.gsub(cutted_title_matcher, "%{", "%{") , "%}", "%}")
cutted_title_matcher = "\n=+ *" .. cutted_title_matcher .. " *=+ *\n"
title_matcher = "\n=+ *" .. title_matcher .. " *=+ *\n"
finded_title_begin, finded_title_end = mw.ustring.find(str, title_matcher, 1)
if finded_title_begin == nil then
finded_title_begin, finded_title_end = mw.ustring.find(str, cutted_title_matcher, 1)
for index = 2, find_count do
if finded_title_end ~= nil then
finded_title_begin, finded_title_end = mw.ustring.find(str, cutted_title_matcher, finded_title_end + 1)
end
end
end
if title == "__FIRST_SECTION__" then finded_title_begin = -1 end
if finded_title_begin ~= nil then
if title == "__FIRST_SECTION__" then
finded_title = ''
count = 99999
finded_title_end = 1
else
finded_title = mw.ustring.sub(str, finded_title_begin, finded_title_end)
begin_, end_ = mw.ustring.find(finded_title, "=+", 1)
begin_2, end_2 = mw.ustring.find(finded_title, "=+ *\n", end_ + 1)
count = end_ - begin_ + 1
end
next_title_matcher = "\n=+ *[^=\n]* *=+ *\n"
next_title_find_begin, next_title_find_end = mw.ustring.find(str, next_title_matcher, finded_title_end + 1)
flag = true while next_title_find_begin and flag do
next_title_find = mw.ustring.sub(str, next_title_find_begin, next_title_find_end)
find_begin_, find_end_ = mw.ustring.find(next_title_find, "=+", 1)
find_count = find_end_ - find_begin_ + 1
if find_count <= count then
next_title_begin = next_title_find_begin
next_title_end = next_title_find_end
flag = nil
end
next_title_find_begin, next_title_find_end = mw.ustring.find(str, next_title_matcher, next_title_find_end + 1)
end
--title_name = mw.text.trim(mw.ustring.sub(str, end_ + 1, begin_2-1 ))
if next_title_begin == nil then next_title_begin = 0 end
body = mw.ustring.sub(str, finded_title_end + 1, next_title_begin - 1)
i = 1 j = 1 while mw.ustring.find(body, "\n=+ *[^\n]* *=+ *\n") and j do if i>=10 then j = nil end
body = mw.ustring.gsub(body, "\n=+ *[^\n]* *=+ *\n", p.deltitle)
i = i + 1
end
if show_t then if keep_title then body = finded_title .. body else body = p.deltitle(finded_title) .. body end end
return mw.text.trim(body)
end
return ''
end
function p.delcat_specific(frame)
if frame == mw.getCurrentFrame() then
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
get_args = getArgs(frame, {parentFirst=true})
else
-- From [[Module:TemplateParameters]], Thank [[User:A2569875|A2569875]]
if type(frame) ~= type({}) then
get_args = {frame}
else
get_args = frame
end
end
local wt = ''
local delcat = {}
local i = 1
for k, v in pairs( get_args ) do
if k == 1 or k == '1' then
--要處理的字串
to_replace = v
else
delcat[i] = v
i = i + 1
end
end
for _, cat in ipairs( delcat ) do
wt = mw.ustring.gsub(wt, "%[%[([Cc][Aa][Tt]|[Cc]ategory|CATEGORY|分类|分類):" .. cat .. "(%|.|)%]%]", "")
end
return wt
end
return p