冷漠是什么意思| 过劳肥是什么意思| 移居改姓始为良是什么意思| 104是什么意思| 什么是低筋面粉| 爱奇艺积分有什么用| 看颈椎病挂什么科| 甯字五行属什么| 高压高低压低是什么原因| may是什么意思| 谷草谷丙偏低代表什么| cmyk代表什么颜色| 睡觉磨牙是什么原因| 艺高人胆大什么意思| 女人贫血吃什么补血最快| 阴道是什么意思| 混不吝是什么意思| renewal什么意思| 耳洞疼痛什么原因| halloween是什么意思| 什么把什么造句子| 黄豆煲汤搭配什么最好| 两个o型血能生出什么血型的孩子| 慢性咽炎挂什么科| 脂溢性脱发用什么洗发水| esr是什么| 眼珠子发黄是什么原因| 葡萄糖是什么意思| 什么人适合戴玉| 痛风吃什么好得快| 蜈蚣是什么生肖| 每天什么时间锻炼最好| 尿潜血是什么意思| 脑震荡挂什么科| 泓五行属什么| les什么意思| 淋症是什么意思| 胆汁反流吃什么食物好| 老汉是什么意思| 万艾可是什么药| 什么病需要做透析| 玫瑰痤疮吃什么药| 免疫力低吃什么| 糖类抗原724偏高是什么原因| 撩是什么意思| 甲醛中毒吃什么药解毒| pet什么意思| 跳蚤咬了擦什么药| 睾酮是什么意思| 端午节喝什么酒| 无证之罪什么意思| 双肺局限性气肿是什么病| 心率过低吃什么药| 为什么身上老是痒| 少尉军衔是什么级别| 2月15号是什么星座| 主治医师是什么级别| 牙酸是什么原因| 肝藏血是什么意思| 梅毒是什么| 凿是什么意思| 耳钉后面的塞子叫什么| 清宫手术后需要注意什么| 主观臆断是什么意思| pu什么意思| 陈皮治什么病| jp是什么意思| 鸡的祖先是什么| 肝功能七项是检查什么| 日本人为什么喜欢喝冰水| 薄情是什么意思| 为什么会腰疼| 张学良为什么被囚禁| 为什么叫关东军| 快餐是什么意思| 敏五行属什么| 小脑萎缩吃什么药效果最好| 巴斯光年是什么意思| 96999是什么电话| 经常做噩梦是什么原因| 国外微信叫什么| 转氨酶高挂什么科| review是什么意思| 能力很强的动物是什么| 经常头晕是什么原因引起的| 口字五行属什么| 粿条是什么做的| 含字五行属什么| 小腿发黑是什么原因| 什么作用| 6月18号是什么星座| 奇异是什么意思| 双肾囊性灶是什么意思| 肾囊肿有什么症状表现| 什么是大三阳和小三阳| 俏皮话是什么意思| 国民党为什么会失败| dd什么意思| 为什么会自言自语| 胎儿顶臀长是什么意思| 心气不足吃什么中成药| 黄褐斑是什么样的图片| 鉴黄师是什么职业| 左耳疼痛什么原因引起| 专科女生学什么专业好| 小便多是什么原因| 痔疮挂什么科| 八大菜系之首是什么菜| 经常早上肚子疼是什么原因| 埋线有什么好处和坏处| 吉利丁片是什么东西| 看脑袋挂什么科| 脚癣是什么原因引起的| 黄色是什么意思| 头晕眼睛模糊是什么原因| 月经量少是什么原因啊| 润喉咙什么东西最合适| 保守治疗是什么意思| 梦见男人是什么意思| 小螃蟹吃什么食物| 为什么会连续两天遗精| 提手旁的字与什么有关| 肝不好吃什么调理| 元宵节的习俗是什么| 甲状腺结节看什么科| 提篮子是什么意思| 精神障碍是什么病| 七月初七是什么节日| 飞机为什么能飞上天| 表哥的儿子叫什么| 头晕做什么检查| 什么样的| 官官相护是什么意思| 思伤脾是什么意思| 小孩为什么会得手足口病| pears是什么意思| 翻版是什么意思| 什么石头最值钱| 杞人忧天是什么意思| 戊是什么意思| 白茶什么季节喝好| 3.15什么星座| 周边是什么意思| 小透明是什么意思| 孩子不长个子是什么原因| 腺样体面容是什么意思| 黄体功能不足是什么原因造成的| 什么人不能吃火龙果| 蓝莓有什么营养价值| 什么是援交| 孕妇梦见猫是什么意思| 团是什么结构| 梦见胎死腹中预示什么| 什么叫实性结节| 宝路华手表什么档次| 梦到生女儿是什么意思| 外阴瘙痒是什么原因| 用盐水漱口有什么好处| nda是什么| 十二月四号是什么星座| 芙蓉花长什么样| 乳腺钼靶是什么| 生吃苦瓜有什么好处和坏处| sheep是什么意思| 脚趾头抽筋是什么原因| 心是什么意思| 酒糟鼻买什么药膏去红| 直博生是什么意思| 胎停是什么原因引起的| 鱼缸底部铺什么好| 本命年为什么要穿红色| 猫的偏旁叫什么| 母亲节送给妈妈什么礼物好| 荔枝什么品种最贵| 四维彩超主要检查什么| 育字五行属什么| 专案组是什么意思| 抖音什么意思| 冬瓜炒什么好吃| 国家电网是什么单位| 处女座是什么| 金蝉脱壳是什么意思| 为什么腰会痛| 维生素b什么时候吃| 嗓子疼吃什么水果好| 有时候会感到莫名的难过是什么歌| 全血细胞减少是什么意思| 一直咳嗽吃什么药| 灰色配什么颜色好看| 眉茶属于什么茶| 滴度是什么意思| 五行中水是什么颜色| durex什么意思| 外阴白斑是什么病| 嗓子疼喝什么| 下午两点多是什么时辰| 怕什么来什么| mdzz是什么意思| 身上皮肤痒是什么原因| 3.22是什么星座| 咖啡不能和什么一起吃| 金银花泡水喝有什么功效| 眼压高什么症状| 垂体泌乳素高是什么原因| 老是头疼是什么原因| 从胃到小腹连着疼是什么原因| joan是什么意思| 青黄不接是什么意思| pt是什么元素| 低密度脂蛋白是什么意思| 支气管炎哮喘吃什么药| 什么护肤品比较好| 跳蚤咬了擦什么药最好| 王王是什么字| 酸性体质是什么意思| 女人内火旺喝什么降火| 老做梦是什么原因| 耳膜穿孔有什么症状| 快车和专车有什么区别| 什么是神经衰弱| 血脂高挂什么科| 苦瓜为什么是苦的| 云南为什么叫云南| 水猴子是什么| 雪花秀属于什么档次| 着凉肚子疼吃什么药| 什么的腊梅| 拖什么东西最轻松| 窘迫是什么意思| 宝宝拉肚子能吃什么| 盆腔钙化灶是什么意思| 什么叫释怀| 九月份有什么节日| 探病是什么意思| 11月9号是什么日子| 什么 姿势 最深| 了口是什么字| 诗经又称什么| 大寒是什么意思| 吃东西想吐是什么原因| 什么药降糖效果最好| 人瘦了是什么原因| 生辰八字指的是什么| 乩童是什么意思| 缺钠是什么原因造成的| 什么是超声检查| 押韵是什么意思| 手作是什么意思| 萎缩性胃炎可以吃什么水果| 夜深人静是什么意思| 生理盐水是什么东西| 吃金蝉有什么好处| 女生为什么会肾虚| manu是什么意思| 朋友是什么| 跛行是什么意思| 阴茎皮开裂是什么原因| 干咳吃什么食物好| 考教师资格证需要什么条件| 晚上12点是什么时辰| 女人腰椎疼是什么原因| 晚上睡不着觉吃什么药| 走婚是什么意思| sodium是什么意思| 百度Jump to content

文化部办公厅关于开展2017年度国家文化创新工程项...

Permanently protected module
From Wikipedia, the free encyclopedia

local z = {
	error_cats_t = {};															-- for categorizing citations that contain errors
	error_ids_t = {};															-- list of error identifiers; used to prevent duplication of certain errors; local to this module
	error_msgs_t = {};															-- sequence table of error messages
	maint_cats_t = {};															-- for categorizing citations that aren't erroneous per se, but could use a little work
	prop_cats_t = {};															-- for categorizing citations based on certain properties, language of source for instance
	prop_keys_t = {};															-- for adding classes to the citation's <cite> tag
};


--[[--------------------------< F O R W A R D   D E C L A R A T I O N S >--------------------------------------
]]

local cfg;																		-- table of tables imported from selected Module:Citation/CS1/Configuration


--[[--------------------------< I S _ S E T >------------------------------------------------------------------

Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string.

]]

local function is_set (var)
	return not (var == nil or var == '');
end


--[[--------------------------< I N _ A R R A Y >--------------------------------------------------------------

Whether needle is in haystack

]]

local function in_array (needle, haystack)
	if needle == nil then
		return false;
	end
	for n, v in ipairs (haystack) do
		if v == needle then
			return n;
		end
	end
	return false;
end


--[[--------------------------< H A S _ A C C E P T _ A S _ W R I T T E N >------------------------------------

When <str> is wholly wrapped in accept-as-written markup, return <str> without markup and true; return <str> and false else

with allow_empty = false, <str> must have at least one character inside the markup
with allow_empty = true, <str> the markup frame can be empty like (()) to distinguish an empty template parameter from the specific condition "has no applicable value" in citation-context.

After further evaluation the two cases might be merged at a later stage, but should be kept separated for now.

]]

local function has_accept_as_written (str, allow_empty)
	if not is_set (str) then
		return str, false;
	end

	local count;

	if true == allow_empty then
		str, count = str:gsub ('^%(%((.*)%)%)$', '%1'); 						-- allows (()) to be an empty set
	else
		str, count = str:gsub ('^%(%((.+)%)%)$', '%1');
	end
	return str, 0 ~= count;
end


--[[--------------------------< S U B S T I T U T E >----------------------------------------------------------

Populates numbered arguments in a message string using an argument table. <args> may be a single string or a
sequence table of multiple strings.

]]

local function substitute (msg, args)
	return args and mw.message.newRawMessage (msg, args):plain() or msg;
end


--[[--------------------------< E R R O R _ C O M M E N T >----------------------------------------------------

Wraps error messages with CSS markup according to the state of hidden. <content> may be a single string or a
sequence table of multiple strings.

]]

local function error_comment (content, hidden)
	return substitute (hidden and cfg.presentation['hidden-error'] or cfg.presentation['visible-error'], content);
end


--[[--------------------------< H Y P H E N _ T O _ D A S H >--------------------------------------------------

Converts a hyphen, endash, emdash to endash under certain conditions.  The hyphen/en/em must separate
like items; unlike items are returned unmodified.  These forms are modified:
	letter - letter (A-B)
	digit - digit (4-5)
	digit separator digit - digit separator digit (4.1-4.5 or 4-1-4-5)
	letterdigit - letterdigit (A1-A5) (an optional separator between letter and
		digit is supported – a.1-a.5 or a-1-a-5)
	digitletter - digitletter (5a-5d) (an optional separator between letter and
		digit is supported – 5.a-5.d or 5-a-5-d)

any other forms are returned unmodified.

str may be a comma- or semicolon-separated list of page ranges with/without single pages

]]

local function hyphen_to_dash (str)
	if not is_set (str) then
		return str;
	end

	str = str:gsub ("(%(%(.-%)%))", function(m) return m:gsub(",", ","):gsub(";", ";") end) -- replace commas and semicolons in accept-as-written markup with similar unicode characters so they'll be ignored during the split	
	str = str:gsub ('&[nm]dash;', {['&ndash;'] = '–', ['&mdash;'] = '—'});		-- replace &mdash; and &ndash; entities with their characters; semicolon mucks up the text.split
	str = str:gsub ('&#45;', '-');												-- replace HTML numeric entity with hyphen character
	str = str:gsub ('&nbsp;', ' ');												-- replace &nbsp; entity with generic keyboard space character
	
	local out = {};
	local list = mw.text.split (str, '%s*[,;]%s*');								-- split str at comma or semicolon separators if there are any

	local accept;																-- boolean

	for _, item in ipairs (list) do												-- for each item in the list
		item, accept = has_accept_as_written (item);							-- remove accept-this-as-written markup when it wraps all of item
		if not accept and mw.ustring.match (item, '^%w*[%.%-]?%w+%s*[—–-]%s*%w*[%.%-]?%w+$') then	-- if a hyphenated range or has endash or emdash separators
			if mw.ustring.match (item, '^%a+[%.%-]?%d+%s*[—–-]%s*%a+[%.%-]?%d+$') or		-- letterdigit hyphen letterdigit (optional separator between letter and digit)
				mw.ustring.match (item, '^%d+[%.%-]?%a+%s*[—–-]%s*%d+[%.%-]?%a+$') or		-- digitletter hyphen digitletter (optional separator between digit and letter)
				mw.ustring.match (item, '^%d+[%.%-]%d+%s*[—–-]%s*%d+[%.%-]%d+$') then		-- digit separator digit hyphen digit separator digit
					item = mw.ustring.gsub (item, '(%w*[%.%-]?%w+)%s*[—–-]%s*(%w*[%.%-]?%w+)', '<span class="nowrap">%1 –</span> <span class="nowrap">%2</span>');	-- replace hyphen/dash, with spaced endash

			elseif mw.ustring.match (item, '^%d+%s*[—–-]%s*%d+$') or			-- digit hyphen digit
				mw.ustring.match (item, '^%a+%s*[—–-]%s*%a+$') then				-- letter hyphen letter
					item = mw.ustring.gsub (item, '(%w+)%s*[—–-]%s*(%w+)', '<span class="nowrap">%1–</span>%2');	-- replace hyphen/emdash with endash, remove extraneous space characters

			else
--				item = mw.ustring.gsub (item, '%s*[—–-]%s*', '–');				-- disabled; here when 'unlike' items so return <item> as is
			end
		end
		table.insert (out, item);												-- add the (possibly modified) item to the output table
	end

	local temp_str = '';														-- concatenate the output table into a comma separated string
	temp_str, accept = has_accept_as_written (table.concat (out, ', '));		-- remove accept-this-as-written markup when it wraps all of concatenated out
	if accept then
		temp_str = has_accept_as_written (str);									-- when global markup removed, return original str; do it this way to suppress boolean second return value
		return temp_str:gsub(",", ","):gsub(";", ";");
	else
		return temp_str:gsub(",", ","):gsub(";", ";");						-- else, return assembled temp_str
	end
end


--[=[-------------------------< M A K E _ W I K I L I N K >----------------------------------------------------

Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only
link is provided (or link and display are the same), returns a wikilink in the form [[L]]; if neither are
provided or link is omitted, returns an empty string.

]=]

local function make_wikilink (link, display)
	if not is_set (link) then return '' end

	if is_set (display) and link ~= display then			
		return table.concat ({'[[', link, '|', display, ']]'});			
	else
		return table.concat ({'[[', link, ']]'});
	end
end


--[[--------------------------< S E T _ M E S S A G E >----------------------------------------------------------

Sets an error message using the ~/Configuration error_conditions{} table along with arguments supplied in the function
call, inserts the resulting message in z.error_msgs_t{} sequence table, and returns the error message.

<error_id> – key value for appropriate error handler in ~/Configuration error_conditions{} table 
<arguments> – may be a single string or a sequence table of multiple strings to be subsititued into error_conditions[error_id].message
<raw> – boolean
	true –	causes this function to return the error message not wrapped in visible-error, hidden-error span tag;
			returns error_conditions[error_id].hidden as a second return value
			does not add message to z.error_msgs_t sequence table
	false, nil – adds message wrapped in visible-error, hidden-error span tag to z.error_msgs_t
			returns the error message wrapped in visible-error, hidden-error span tag; there is no second return value
<prefix> – string to be prepended to <message>									-- TODO: remove support for these unused(?) arguments?
<suffix> – string to be appended to <message>

TODO: change z.error_cats_t and z.maint_cats_t to have the form cat_name = true?  this to avoid dups without having to have an extra table

]]

local added_maint_cats = {}														-- list of maintenance categories that have been added to z.maint_cats_t; TODO: figure out how to delete this table

local function set_message (error_id, arguments, raw, prefix, suffix)
	local error_state = cfg.error_conditions[error_id];
	
	prefix = prefix or '';
	suffix = suffix or '';
	
	if error_state == nil then
		error (cfg.messages['undefined_error'] .. ': ' .. error_id);			-- because missing error handler in Module:Citation/CS1/Configuration

	elseif is_set (error_state.category) then
		if error_state.message then												-- when error_state.message defined, this is an error message
			table.insert (z.error_cats_t, error_state.category);
		else
			if not added_maint_cats[error_id] then
				added_maint_cats[error_id] = true;								-- note that we've added this category
				table.insert (z.maint_cats_t, substitute (error_state.category, arguments));	-- make cat name then add to table
			end
			return;																-- because no message, nothing more to do
		end
	end

	local message = substitute (error_state.message, arguments);

	message = table.concat (
		{
		message,
		' (',
		make_wikilink (
			table.concat (
				{
				cfg.messages['help page link'],
				'#',
				error_state.anchor
				}),
			cfg.messages['help page label']),
		')'
		});

	z.error_ids_t[error_id] = true;
	if z.error_ids_t['err_citation_missing_title'] and							-- if missing-title error already noted
		in_array (error_id, {'err_bare_url_missing_title', 'err_trans_missing_title'}) then		-- and this error is one of these
			return '', false;													-- don't bother because one flavor of missing title is sufficient
	end
	
	message = table.concat ({prefix, message, suffix});

	if true == raw then
		return message, error_state.hidden;										-- return message not wrapped in visible-error, hidden-error span tag
	end		

	message = error_comment (message, error_state.hidden);						-- wrap message in visible-error, hidden-error span tag
	table.insert (z.error_msgs_t, message);										-- add it to the messages sequence table
	return message;																-- and done; return value generally not used but is used as a flag in various functions of ~/Identifiers
end


--[[-------------------------< I S _ A L I A S _ U S E D >-----------------------------------------------------

This function is used by select_one() to determine if one of a list of alias parameters is in the argument list
provided by the template.

Input:
	args – pointer to the arguments table from calling template
	alias – one of the list of possible aliases in the aliases lists from Module:Citation/CS1/Configuration
	index – for enumerated parameters, identifies which one
	enumerated – true/false flag used to choose how enumerated aliases are examined
	value – value associated with an alias that has previously been selected; nil if not yet selected
	selected – the alias that has previously been selected; nil if not yet selected
	error_list – list of aliases that are duplicates of the alias already selected

Returns:
	value – value associated with alias we selected or that was previously selected or nil if an alias not yet selected
	selected – the alias we selected or the alias that was previously selected or nil if an alias not yet selected

]]

local function is_alias_used (args, alias, index, enumerated, value, selected, error_list)
	if enumerated then															-- is this a test for an enumerated parameters?
		alias = alias:gsub ('#', index);										-- replace '#' with the value in index
	else
		alias = alias:gsub ('#', '');											-- remove '#' if it exists
	end

	if is_set (args[alias]) then												-- alias is in the template's argument list
		if value ~= nil and selected ~= alias then								-- if we have already selected one of the aliases
			local skip;
			for _, v in ipairs (error_list) do									-- spin through the error list to see if we've added this alias
				if v == alias then
					skip = true;
					break;														-- has been added so stop looking 
				end
			end
			if not skip then													-- has not been added so
				table.insert (error_list, alias);								-- add error alias to the error list
			end
		else
			value = args[alias];												-- not yet selected an alias, so select this one
			selected = alias;
		end
	end
	return value, selected;														-- return newly selected alias, or previously selected alias
end


--[[--------------------------< A D D _ M A I N T _ C A T >------------------------------------------------------

Adds a category to z.maint_cats_t using names from the configuration file with additional text if any.
To prevent duplication, the added_maint_cats table lists the categories by key that have been added to z.maint_cats_t.

]]

local function add_maint_cat (key, arguments)
	if not added_maint_cats [key] then
		added_maint_cats [key] = true;											-- note that we've added this category
		table.insert (z.maint_cats_t, substitute (cfg.maint_cats [key], arguments));	-- make name then add to table
	end
end


--[[--------------------------< A D D _ P R O P _ C A T >--------------------------------------------------------

Adds a category to z.prop_cats_t using names from the configuration file with additional text if any.

foreign_lang_source and foreign_lang_source_2 keys have a language code appended to them so that multiple languages
may be categorized but multiples of the same language are not categorized.

added_prop_cats is a table declared in page scope variables above

]]

local added_prop_cats = {};														-- list of property categories that have been added to z.prop_cats_t

local function add_prop_cat (key, arguments, key_modifier)
	local key_modified = key .. ((key_modifier and key_modifier) or '');		-- modify <key> with <key_modifier> if present and not nil
	
	if not added_prop_cats [key_modified] then
		added_prop_cats [key_modified] = true;									-- note that we've added this category
		table.insert (z.prop_cats_t, substitute (cfg.prop_cats [key], arguments));	-- make name then add to table
		table.insert (z.prop_keys_t, 'cs1-prop-' .. key);						-- convert key to class for use in the citation's <cite> tag
	end
end


--[[--------------------------< S A F E _ F O R _ I T A L I C S >----------------------------------------------

Protects a string that will be wrapped in wiki italic markup '' ... ''

Note: We cannot use <i> for italics, as the expected behavior for italics specified by ''...'' in the title is that
they will be inverted (i.e. unitalicized) in the resulting references.  In addition, <i> and '' tend to interact
poorly under Mediawiki's HTML tidy.

]]

local function safe_for_italics (str)
	if not is_set (str) then return str end

	if str:sub (1, 1) == "'" then str = "<span></span>" .. str; end
	if str:sub (-1, -1) == "'" then str = str .. "<span></span>"; end
	
	return str:gsub ('\n', ' ');												-- Remove newlines as they break italics.
end


--[[--------------------------< W R A P _ S T Y L E >----------------------------------------------------------

Applies styling to various parameters.  Supplied string is wrapped using a message_list configuration taking one
argument; protects italic styled parameters.  Additional text taken from citation_config.presentation - the reason
this function is similar to but separate from wrap_msg().

]]

local function wrap_style (key, str)
	if not is_set (str) then
		return "";
	elseif in_array (key, {'italic-title', 'trans-italic-title'}) then
		str = safe_for_italics (str);
	end

	return substitute (cfg.presentation[key], {str});
end


--[[--------------------------< M A K E _ S E P _ L I S T >------------------------------------------------------------

make a separated list of items using provided separators.
	<sep_list> - typically '<comma><space>'
	<sep_list_pair> - typically '<space>and<space>'
	<sep_list_end> - typically '<comma><space>and<space>' or '<comma><space>&<space>'

defaults to cfg.presentation['sep_list'], cfg.presentation['sep_list_pair'], and cfg.presentation['sep_list_end']
if <sep_list_end> is specified, <sep_list> and <sep_list_pair> must also be supplied

]]

local function make_sep_list (count, list_seq, sep_list, sep_list_pair, sep_list_end)
	local list = '';

	if not sep_list then														-- set the defaults
		sep_list = cfg.presentation['sep_list'];
		sep_list_pair = cfg.presentation['sep_list_pair'];
		sep_list_end = cfg.presentation['sep_list_end'];
	end
	
	if 2 >= count then
		list = table.concat (list_seq, sep_list_pair);							-- insert separator between two items; returns list_seq[1] then only one item
	elseif 2 < count then
		list = table.concat (list_seq, sep_list, 1, count - 1);					-- concatenate all but last item with plain list separator
		list = table.concat ({list, list_seq[count]}, sep_list_end);			-- concatenate last item onto end of <list> with final separator
	end
	
	return list;
end


--[[--------------------------< S E L E C T _ O N E >----------------------------------------------------------

Chooses one matching parameter from a list of parameters to consider.  The list of parameters to consider is just
names.  For parameters that may be enumerated, the position of the numerator in the parameter name is identified
by the '#' so |author-last1= and |author1-last= are represented as 'author-last#' and 'author#-last'.

Because enumerated parameter |<param>1= is an alias of |<param>= we must test for both possibilities.


Generates an error if more than one match is present.

]]

local function select_one (args, aliases_list, error_condition, index)
	local value = nil;															-- the value assigned to the selected parameter
	local selected = '';														-- the name of the parameter we have chosen
	local error_list = {};

	if index ~= nil then index = tostring(index); end

	for _, alias in ipairs (aliases_list) do									-- for each alias in the aliases list
		if alias:match ('#') then												-- if this alias can be enumerated
			if '1' == index then												-- when index is 1 test for enumerated and non-enumerated aliases
				value, selected = is_alias_used (args, alias, index, false, value, selected, error_list);	-- first test for non-enumerated alias
			end
			value, selected = is_alias_used (args, alias, index, true, value, selected, error_list);	-- test for enumerated alias
		else
			value, selected = is_alias_used (args, alias, index, false, value, selected, error_list);	-- test for non-enumerated alias
		end
	end

	if #error_list > 0 and 'none' ~= error_condition then						-- for cases where this code is used outside of extract_names()
		for i, v in ipairs (error_list) do
			error_list[i] = wrap_style ('parameter', v);
		end
		table.insert (error_list, wrap_style ('parameter', selected));
		set_message (error_condition, {make_sep_list (#error_list, error_list)});
	end
	
	return value, selected;
end


--[=[-------------------------< R E M O V E _ W I K I _ L I N K >----------------------------------------------

Gets the display text from a wikilink like [[A|B]] or [[B]] gives B

The str:gsub() returns either A|B froma [[A|B]] or B from [[B]] or B from B (no wikilink markup).

In l(), l:gsub() removes the link and pipe (if they exist); the second :gsub() trims whitespace from the label
if str was wrapped in wikilink markup.  Presumably, this is because without wikimarkup in str, there is no match
in the initial gsub, the replacement function l() doesn't get called.

]=]

local function remove_wiki_link (str)
	return (str:gsub ("%[%[([^%[%]]*)%]%]", function(l)
		return l:gsub ("^[^|]*|(.*)$", "%1" ):gsub ("^%s*(.-)%s*$", "%1");
	end));
end


--[=[-------------------------< I S _ W I K I L I N K >--------------------------------------------------------

Determines if str is a wikilink, extracts, and returns the wikilink type, link text, and display text parts.
If str is a complex wikilink ([[L|D]]):
	returns wl_type 2 and D and L from [[L|D]];
if str is a simple wikilink ([[D]])
	returns wl_type 1 and D from [[D]] and L as empty string;
if not a wikilink:
	returns wl_type 0, str as D, and L as empty string.

trims leading and trailing whitespace and pipes from L and D ([[L|]] and [[|D]] are accepted by MediaWiki and
treated like [[D]]; while [[|D|]] is not accepted by MediaWiki, here, we accept it and return D without the pipes).

]=]

local function is_wikilink (str)
	local D, L
	local wl_type = 2;															-- assume that str is a complex wikilink [[L|D]]

	if not str:match ('^%[%[[^%]]+%]%]$') then									-- is str some sort of a wikilink (must have some sort of content)
		return 0, str, '';														-- not a wikilink; return wl_type as 0, str as D, and empty string as L
	end
	
	L, D = str:match ('^%[%[([^|]+)|([^%]]+)%]%]$');							-- get L and D from [[L|D]] 

	if not is_set (D) then														-- if no separate display
		D = str:match ('^%[%[([^%]]*)|*%]%]$');									-- get D from [[D]] or [[D|]]
		wl_type = 1; 
	end
	
	D = mw.text.trim (D, '%s|');												-- trim white space and pipe characters 
	return wl_type, D, L or '';
end


--[[--------------------------< S T R I P _ A P O S T R O P H E _ M A R K U P >--------------------------------

Strip wiki italic and bold markup from argument so that it doesn't contaminate COinS metadata.
This function strips common patterns of apostrophe markup.  We presume that editors who have taken the time to
markup a title have, as a result, provided valid markup. When they don't, some single apostrophes are left behind.

Returns the argument without wiki markup and a number; the number is more-or-less meaningless except as a flag
to indicate that markup was replaced; do not rely on it as an indicator of how many of any kind of markup was
removed; returns the argument and nil when no markup removed

]]

local function strip_apostrophe_markup (argument)
	if not is_set (argument) then
		return argument, nil;													-- no argument, nothing to do
	end

	if nil == argument:find ( "''", 1, true ) then								-- Is there at least one double apostrophe?  If not, exit.
		return argument, nil;
	end

	local flag;
	while true do
		if argument:find ("'''''", 1, true) then								-- bold italic (5)
			argument, flag = argument:gsub ("%'%'%'%'%'", "");					-- remove all instances of it
		elseif argument:find ("''''", 1, true) then								-- italic start and end without content (4)
			argument, flag=argument:gsub ("%'%'%'%'", "");
		elseif argument:find ("'''", 1, true) then								-- bold (3)
			argument, flag=argument:gsub ("%'%'%'", "");
		elseif argument:find ("''", 1, true) then								-- italic (2)
			argument, flag = argument:gsub ("%'%'", "");
		else
			break;
		end
	end

	return argument, flag;														-- done
end


--[[--------------------------< S E T _ S E L E C T E D _ M O D U L E S >--------------------------------------

Sets local cfg table to same (live or sandbox) as that used by the other modules.

]]

local function set_selected_modules (cfg_table_ptr)
	cfg = cfg_table_ptr;
	
end


--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]

return {
	add_maint_cat = add_maint_cat,												-- exported functions
	add_prop_cat = add_prop_cat,
	error_comment = error_comment,
	has_accept_as_written = has_accept_as_written,
	hyphen_to_dash = hyphen_to_dash,
	in_array = in_array,
	is_set = is_set,
	is_wikilink = is_wikilink,
	make_sep_list = make_sep_list,
	make_wikilink = make_wikilink,
	remove_wiki_link = remove_wiki_link,
	safe_for_italics = safe_for_italics,
	select_one = select_one,
	set_message = set_message,
	set_selected_modules = set_selected_modules,
	strip_apostrophe_markup = strip_apostrophe_markup,
	substitute = substitute,
	wrap_style = wrap_style,

	z = z,																		-- exported table
	}
三点水翟读什么 儿童肠系膜淋巴结炎吃什么药 气虚血虚吃什么中成药 最高人民法院院长什么级别 一个虫一个离念什么
胸痛是什么病的前兆 德国为什么发动二战 朋友生日送什么礼物好 儿童口腔溃疡用什么药 孕妇为什么不能吃韭菜
腋臭去医院挂什么科 68年属什么生肖多少岁 胃窦糜烂是什么意思严重吗 浩瀚是什么意思 什么什么为什么
护士要什么学历 梦见父亲死了是什么意思 查性激素六项挂什么科 降7是什么调 篮子是什么意思
为什么精子是黄色的hcv9jop3ns7r.cn 身体上有小红点是什么病hcv7jop5ns4r.cn 酿酒用什么菌hcv9jop6ns0r.cn sheep是什么意思hcv8jop8ns6r.cn 11月11号什么星座hcv9jop4ns8r.cn
股癣用什么药最好wuhaiwuya.com 提心吊胆是什么生肖hcv9jop1ns6r.cn 拉青色大便是什么原因hcv7jop9ns2r.cn 什么是生理盐水hcv8jop1ns7r.cn 卧是什么意思hcv9jop2ns2r.cn
性冷淡什么意思xjhesheng.com 风云人物什么意思96micro.com 耍朋友是什么意思hcv8jop2ns2r.cn 幽门螺杆菌感染吃什么药hcv8jop2ns0r.cn 铜绿假单胞菌用什么抗生素hcv9jop4ns0r.cn
寿终正寝是什么意思hcv8jop7ns8r.cn 什么腔什么调96micro.com itp是什么意思hcv8jop2ns9r.cn 7点到9点是什么时辰hcv8jop7ns0r.cn 梦到和老公离婚了是什么征兆hcv7jop7ns2r.cn
百度