Module:Delcat

维基教科书,自由的教学读本
Template:Lmd

主要用於Template:模板

概要[编辑]

{{Delcat}}模版的作用是可以讓參數的分類不出現在該條目,可能會有例外和其他技術不可完全執行的可能,例如引用重定向,消歧義頁面也會显示橘色、斜體顯示的站內技術。由於技術限制,任何由擴展定義的XML標籤(如<ref>)產生的分類無法去除。

後來修改為字串取代函數直接實現,因此,相反地,也能做到抽取分類功能(函數:list_category);修改其正規運算式後則還能實現「消除內部連結」(圖像、編輯按鈕等,函數:dellink)、以及抽出特定章節(函數:get_title)等功能。

函數介紹[编辑]

main[编辑]

為主函式,設計給{{#invoke:Delcat}}調用。

參數
  • 1:主參數,要去除分類、內連的主要內容
  • type:處理類型,可用的值如下
    • category:去除分類
    • list category:抽出分類
    • link:去除[[]],內部連結會保留目標條目、圖像會保留圖像名稱
  • 其餘參數:其他要一並刪除的內容

delete_category[编辑]

Template:提醒:本函數僅能利用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[编辑]

Template:提醒:本函數僅能利用Lua呼叫

將章節替換成一般文字,避免出現於目錄的函數

參數
  • input:字串。形如== 章節名稱 ==的字串,會替換成接近的大小之粗體文字。

find_category[编辑]

Template:提醒:本函數僅能利用Lua呼叫

回傳一個包含參數中所有可解析的分類之陣列。可能會有例外和其他技術不可完全執行的可能,例如引用重定向,消歧義頁面也會現實橘色、斜體顯示的站內技術。由於技術限制,任何由擴展定義的XML標籤(如<ref>)產生的分類無法取出。

參數
  • source_str:字串。要抓取分類的內容。

get_title[编辑]

設計給{{#invoke:Delcat}}調用。

只取出參數中的特定章節

參數
  • 1:主參數,要取出特定章節的內容
  • 2title:章節標題,__FIRST_SECTION__表示首段。

find_title[编辑]

Template:提醒:本函數僅能利用Lua呼叫

從輸入的字串中抽出特定章節的內容

參數
  • str:字串。要取出特定章節的內容
  • title:字串。章節標題,__FIRST_SECTION__表示首段。

get_chapter[编辑]

設計給{{#invoke:Delcat}}調用。

取得章節標題

參數
  • 1:主參數,要取出章節標題的內容,例如輸入「哈哈#你好」將返回「你好」。

範例[编辑]

main

語法:{{#invoke:Delcat|main| 1 = {{:公民指南}}| 2 = __DISAMBIG__ | type = category }}的顯示效果為:

这本教科书介绍基本的政治理念与概念,旨在培养基本的公民素质与素养,因而称作公民指南。

什么是公民?[编辑]

序言

第一章 社会契约渊源[编辑]

第一节 社会契约的历史渊源

政治体制的基本概念[编辑]

选举[编辑]

我有意见怎么办?[编辑]

dellink

語法:{{#invoke:Delcat|dellink| 1 = {{:公民指南}}}}的顯示效果為:

这本教科书介绍基本的政治理念与概念,旨在培养基本的公民素质与素养,因而称作公民指南。

什么是公民?

公民指南/序言

第一章 社会契约渊源

第一节 公民指南/社会契约的历史渊源

政治体制的基本概念

选举

我有意见怎么办?[编辑]

list_category

語法:{{#invoke:Delcat | list_category | {{:紐約植物圖鑑}} | *[[:{{{1}}}|{{{1}}}]]\n }}的顯示效果為:

include

語法:

{{#invoke:Delcat | dellink | 1 = 
  {{#invoke:Delcat | include
   | 1 = :紐約植物圖鑑#__FIRST_SECTION__
  }}
}}

的顯示效果為:


  這本圖鑑翻譯自紐約植物誌(:en:Flora of New York)。紐約植物誌收錄美國紐約州的原生及外來植物,依照科學分類綱、目、科、亞科、族、屬的順序排列,列出每種植物的學名,英文名稱,原生或外來種,圖像,分布圖等。圖鑑刪除了部分內容,只收錄學名、英文名稱及圖片,另外新增加了中文名稱。

getcjk

語法:

{{#invoke:Delcat | dellink | 1 = 
  {{#invoke:Delcat | getcjk
   | 1 = {{:Ubuntu/命令行基础}}
  }}
}}

的顯示效果為:

==命令行优点==

虽然桌面型计算机操作系统通常都采用w:GUI,但w:CLI还是具有非常重要的作用和意义:

  1. 可实现图形界面不具有的功能。Linux的很多程序是面向命令行的,没有图形前端,只能用命令行使用。
  2. 可使用超级用户权限。一些需要超级用户权限的操作只能在命令行下运行。
  3. 高效快速。可借助正则表达式实现批量处理,还能向程序发送参数。
  4. 安全性高。可减少因错误操作或者权限问题导致的风险。
使用方法

目前的桌面操作系统几乎都采用图形用户界面,而不是命令行界面。使用命令行,可通过以下几种方式。

虚拟终端

w:虚拟终端是一种应用程序,此程序在图形界面内创建一个窗口,此窗口内就像是命令行界面的屏幕一样。

在Ubuntu中,可按快捷键Ctrl+Alt+T快速启动终端。

切换字符界面

可在虚拟终端中输入:

INIT.D 3

将当前图形界面切换到命令行界面,可用于不得不关闭图形界面进行操作的情况。

输入:

INIT.D 5

切换回图形界面。

登陆其它tty

可按Ctrl+Alt+F1或F2,F3……来切换到其他tty,即一个命令行登陆界面。这种方式完全不依赖于图形界面,且每个登陆屏幕相对独立互不干扰。

Shell

w:Shell在计算机科学中,是指“提供用户使用界面”的软件,通常指的是命令行界面的解析器。一般来说,这个词是指操作系统中,提供访问内核所提供之服务的程序。

sh

详见w:Bourne shell

bash

详见w:Bash

常用命令

软件管理
功能 命令
查看软件xxx安装内容
dpkg -L xxx
查找软件库中的软件
apt-cache search 正则表达式

aptitude search 软件包
显示系统安装包的统计信息
apt-cache stats
显示系统全部可用包的名称
apt-cache pkgnames
显示包的信息
apt-cache show k3b
查找文件属于哪个包
dpkg -S filename

apt-file search filename
查看已经安装了哪些包
dpkg -l

也可用

dpkg -l
less

翻页查看

查询软件xxx依赖哪些包
apt-cache depends xxx
查询软件xxx被哪些包依赖
apt-cache rdepends xxx
增加一个光盘源
sudo apt-cdrom add
系统更新
sudo apt-get update
(这一步更新包列表)
sudo apt-get dist-upgrade
(这一步安装所有可用更新)
或者
sudo apt-get upgrade
(这一步安装应用程序更新,不安装新内核等)
清除所有已删除包的残馀配置文件
dpkg -l
grep ^rc
awk '{print $2}'
sudo xargs dpkg -P
编译时缺少h文件的自动处理
sudo auto-apt run ./configure
查看安装软件时下载包的临时存放目录
ls /var/cache/apt/archives
备份当前系统安装的所有包的列表
dpkg --get-selections
grep -v deinstall > ~/somefile
从上面备份的安装包的列表文件恢复所有包
dpkg --set-selections < ~/somefile
sudo dselect
清理旧版本的软件缓存
sudo apt-get autoclean
清理所有软件缓存
sudo apt-get clean
删除系统不再使用的孤立软件
sudo apt-get autoremove

如果使用

sudo apt-get autoremove --purge

的话会把这些孤立软件的残留配置文件也一并移除

查看包在服务器上面的地址
apt-get -qq --print-uris install ssh
cut -d\' -f2
彻底删除Gnome
sudo apt-get --purge remove liborbit2
彻底删除KDE
sudo apt-get --purge remove libqt3-mt libqtcore4
一键安装 LAMP 服务
sudo tasksel install lamp-server
删除旧内核
sudo aptitude purge ~ilinux-image-.*\(\!`uname -r`\)
导入ppa源的key值
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 5126890CDCC7AFE0
5126890CDCC7AFE0替换为你需要导入的Key值
增加一个ppa源
sudo add-apt-repository ppa:user/ppa-name

使用 ppa 的地址替换 ppa:user/ppa-name

系统版本升级
sudo apt-get update
sudo apt-get install update-manager-core
sudo do-release-upgrade

Category:Ubuntu

注意事项[编辑]

模板编辑说明[编辑]

參見[编辑]


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,'<',"&lt;")
	catbody = mw.ustring.gsub(catbody,'>',"&gt;")
	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]", "&#73;&#83;&#66;&#78;" );
	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]", "&#73;&#83;&#66;&#78;" );
	body = mw.text.trim(body) --消除多餘空行
	return body
end

function p.find_category(source_str)
	local body = ''
	input = mw.ustring.gsub(source_str,'<',"&lt;")
	input = mw.ustring.gsub(input,'>',"&gt;")
	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,'<',"&lt;")
	input = mw.ustring.gsub(input,'>',"&gt;")

	--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
function p.delnowiki(frame)
	-- 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 lib_unstrip,input_str=nil,get_args[1] or get_args['1'] or ''
	if (input_str ~= nil) then lib_unstrip=require('module:Unstrip') end
	return mw.text.unstripNoWiki(input_str)
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