这是什么皮肤病| wm是什么牌子| 垂死病中惊坐起什么意思| 乾隆是什么生肖| 刺梨果有什么功效| 乐色是什么意思| 乌龟肺炎用什么药| 八岁属什么生肖| 减肥为什么让早上空腹喝咖啡| 白芝麻有什么功效| 五什么六什么的成语| 凝血酸是什么| 同化什么意思| 什么样的人容易中风| 拉锯战是什么意思| 曹植字什么| 手术后为什么要平躺6小时| 在所不辞是什么意思| 宫颈管分离是什么意思| 容易打嗝是什么原因| 下眼袋大是什么原因引起的| 下焦湿热阴囊潮湿吃什么药| 蒙羞是什么意思| 耳石症眩晕吃什么药| 车字旁有什么字| 结肠炎有什么症状表现| 引什么大什么| 梅毒吃什么药最好| 温开水冲服是什么意思| slow什么意思| 燚是什么意思| 肺部斑片状高密度影是什么意思| 双子女和什么座最配对| 空调制热效果不好什么原因| 什么妖魔鬼怪什么美女画皮| 为什么奢侈品都是pvc| 陶渊明是什么先生| 复方板蓝根和板蓝根有什么区别| 痂是什么意思| 炖牛肉不放什么调料| 三千烦恼丝什么意思| 在农村干什么挣钱| 湿疹是什么症状图片| 什么是什么意思| 什么人不适合艾灸| 什么是丙肝| 鼻子干燥是什么原因| 笋不能和什么一起吃| 绿色的鸟是什么鸟| 狡兔三窟是什么意思| 什么人不怕冷| 整体认读音节有什么| 发现新大陆是什么意思| 梦见自己大肚子快生了是什么意思| 忽必烈和成吉思汗是什么关系| 做梦梦到已故的亲人是什么意思| 黄皮果什么时候成熟| 李子什么人不能吃| 鼻子下面长痘什么原因| 鱼油吃多了有什么副作用| 低血钾吃什么| 一月2日是什么星座| 一本万利是什么意思| 后背疼去医院挂什么科| edf是什么意思| 吃中药能吃什么水果| 三个龙念什么| 硬水是什么| 摸金是什么意思| 7月15是什么节日| 鸡是什么命| 我想长胖点有什么办法| 怀孕不可以吃什么东西| 闰月给父母买什么| 糖类抗原125偏高说明什么| 神经内科主要看什么病| 睡觉老是流口水是什么原因| 肝风内动是什么意思| 觉悟高是什么意思| 形同陌路什么意思| 很low是什么意思| 蓟类植物是什么| 什么字五行属土| 陈皮的作用是什么| 超敏c反应蛋白是什么| 低盐饮食有利于预防什么| 摆架子是什么意思| 欣喜若狂的近义词是什么| sanag是什么牌子| 为什么养鱼双数是大忌| 结婚九年是什么婚| 妙三多预防什么| 辣根是什么| 热闹非凡是什么意思| dia什么意思| 泰坦尼克号什么时候上映的| 怪是什么意思| 什么是碳水| 东南五行属什么| 女人右下巴有痣代表什么| 天池为什么没有鱼| doge是什么意思| 慢性肠胃炎吃什么药| 总恶心是什么原因| 口香糖是什么材料做的| 睾丸痒用什么药| 一什么天安门| 血液肿瘤是什么病| 为什么家里不能放假花| 怀孕初期应该注意什么| 白带发黄吃什么药| 氧化是什么意思| 月与什么有关| 什么药能治阳痿早泄| 来月经有异味什么原因| 伤口溃烂不愈合用什么药| 儿童拉肚子吃什么药| suan是什么意思| 移植后吃什么水果好| 心有余悸是什么意思| 梦见自己流血是什么预兆| 梦见卖东西是什么意思| 左手无名指戴戒指什么意思| 门前的小树已成年是什么歌| 蒸蒸日上什么意思| 无情是什么意思| 晚上睡觉容易醒是什么原因| 白萝卜什么时候种| 1981年属什么生肖| 湿阻病是什么病| 什么是香云纱| 庚申五行属什么| 阴道为什么会排气| hr医学上什么意思| 健字五行属什么| 2月25号是什么星座| 林冲为什么叫豹子头| 右侧中耳乳突炎是什么意思| 美联储加息意味着什么| 立加羽读什么| 尿素氮肌酐比值偏高是什么原因| 湿寒吃什么中成药| 肚脐眼周围痛什么原因| 牝是什么意思| 益生菌是什么| 羊肚菌有什么功效和作用| 双手发抖是什么原因| 核黄素是什么| 血常规能查出什么病| 格林巴利综合症是什么病| 麻黄碱是什么| 急性尿路感染吃什么药| 奇葩是什么意思| 肝肾亏虚吃什么中成药| 中出是什么意识| 火影忍者大结局是什么| 借鸡生蛋是什么意思| xpe是什么材质| 6月底是什么星座| 试金石是什么意思| 周吴郑王是什么意思| 梦见自己家被盗有什么预兆| 忧郁是什么意思| 外婆菜是什么菜做的| 为什么一抽烟就想拉屎| 贵是什么意思| 更年期失眠吃什么药调理效果好| 漠视是什么意思| 多晒太阳有什么好处| 预估是什么意思| 联手是什么意思| 胡萝卜什么颜色| 西瓜霜是什么做的| 月经9天了还没干净是什么原因| 红薯什么时候种植最好| 什么时候吃榴莲最好| 又当又立是什么意思| 庚金是什么意思| 三国之前是什么朝代| 曾毅玲花什么关系| 水猴子长什么样| philips是什么牌子| 梦见蛇是什么意思啊| 云吞面是什么面| 甲沟炎看什么科| 蒌蒿是什么| 珍珠鸟是什么鸟| 棕榈油是什么油| pB什么意思| 飞机联程票是什么意思| 阿卡波糖什么时候吃| 肺炎后遗症有什么症状| 2004年属什么| 12月18号是什么星座| 阻生齿是什么意思| onlycook是什么牌子| 端坐呼吸常见于什么病| 独一无二是什么生肖| 月经推迟一个月不来什么原因| 菊花像什么比喻句| 郡字五行属什么| 小孩发烧可以吃什么水果| 上头是什么意思| 绿色的大便是什么原因| 风疹病毒igg阳性是什么意思| 头发需要什么营养| baron是什么意思| 空调睡眠模式是什么意思| 腰部疼痛挂什么科| 爱因斯坦是什么学家| 男宝胶囊为什么不建议吃| 高铁服务员叫什么| 老铁是什么意思| 小便无力是什么原因男| 狗不能吃什么食物| 黑色屎是什么原因| anti什么意思| 梦到自己的妈妈死了是什么意思| 弥月之喜是什么意思| 男生第一次什么感觉| 猪头三是什么意思| 空调室内机漏水是什么原因| 刚怀孕有什么办法打掉| 肛门疼痛是什么原因引起的| 霜降是什么季节| 一个王一个番读什么| 风湿关节炎吃什么药| 空前绝后是什么生肖| kcal是什么意思| 乳腺低回声结节是什么意思| 子年是什么年| 王菲属什么生肖| 裸妆是什么意思| 面试要带什么| 20年属什么生肖| 五月二十五是什么星座| 秋葵什么时候播种| 青鱼和草鱼有什么区别| 五十八岁属什么生肖| 鼻子上长痘痘是什么原因| 横纹肌溶解症是什么原因造成的| t1w1高信号代表什么| 上胸围90下胸围80是什么罩杯| 附耳是什么意思| 放屁多是什么原因呢| 依波手表什么档次| 打脸是什么意思| 做爱都有什么姿势| 鼻子经常流鼻涕是什么原因| 疯狂动物城里的狐狸叫什么| 右上眼皮跳是什么预兆| 青鱼用什么饵料好钓| 什么虫子咬完是小红点| 月经不来挂什么科| 香水edp什么意思| 柔和是什么意思| 祛湿吃什么食物| 线性是什么意思| 怀孕初期吃什么菜| 高碎是什么茶| 做什么事要从头来| 没什么好怕| 脚肿什么病| 傻瓜是什么意思| 百度

【我奋斗 我幸福】新时代女性的特质,你具备几条?

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
	}
吃什么可以淡化黄褐斑 血糖忽高忽低是什么原因 6代表什么意思 导师是什么意思 贵子是什么意思
保花保果用什么药最好 拟物是什么意思 12月14日是什么星座 肺结核可以做什么运动 割伤用什么药愈合伤口
什么是处女膜 腰椎间盘突出看什么科 男人更年期有什么症状有哪些表现 子宫内膜单纯性增生是什么意思 卵泡生成素高是什么原因
产妇喝什么汤下奶最快最多 男人皮肤黑穿什么颜色的衣服好看 卫生棉条是什么 河豚吃什么食物 肩周炎用什么药最好
睡觉趴着睡是什么原因hcv8jop8ns3r.cn 什么叫末法时代hcv9jop5ns2r.cn 睾丸发炎吃什么药hcv8jop3ns9r.cn 蛇为什么怕雄黄hcv8jop3ns7r.cn 肝ca是什么意思hcv8jop4ns2r.cn
孩子注意力不集中去医院看什么科hcv9jop0ns8r.cn amp是什么sanhestory.com 女人经期吃什么食物好hcv8jop6ns0r.cn 眼珠子发黄是什么原因hcv7jop5ns6r.cn 咽喉炎吃什么药hcv8jop4ns8r.cn
舌头裂痕是什么原因hcv7jop6ns2r.cn ysy是什么意思96micro.com 气体交换受损与什么有关hcv8jop7ns9r.cn 女人叫床最好喊什么huizhijixie.com 指甲起层是什么原因hcv8jop3ns1r.cn
远字五行属什么hcv8jop4ns4r.cn 吃什么对神经恢复快速hcv9jop6ns8r.cn 二代试管是什么意思hcv8jop4ns9r.cn 搀扶什么意思hcv7jop6ns4r.cn 怀孕初期有什么症状xscnpatent.com
百度