胀气打嗝是什么原因| 1月10日什么星座| 白眼狼是什么意思| 一个鸟一个木念什么| 胃不好吃什么水果最好| 敏使朗是什么药| 1977年出生属什么生肖| 糖尿病人早餐吃什么最好| 蛋白过敏是什么症状| 什么民族不吃猪肉| 领空是什么意思| 敏感是什么意思| yishion是什么牌子| 泌乳素高是什么意思| 乳夹是什么| 水瓶女喜欢什么样的男生| 什么叫阳痿| 虾为什么叫对虾| 巴基斯坦是什么语言| 黄芪什么季节喝最好| 鼻息肉是什么样的图片| 1月21日什么星座| 眼霜有什么作用和功效| 爸爸的哥哥叫什么| 不走寻常路是什么品牌| 更年期出汗吃什么药好| 萱五行属什么| 五六月份是什么星座| 什么是淋病| 护法是什么意思| 不易是什么意思| 眉毛白是什么原因引起的| 葵瓜子吃多了有什么危害| 破瓜年华是什么意思| 日和立念什么| 做梦梦见狗咬我什么意思啊| 乌龟吃什么水果| bbq是什么| 便秘挂什么科| 为什么8到10周容易胎停| 果是什么结构的字| 梦见情敌什么预兆| 生化是什么意思| 起痱子是什么原因| cot是什么| 脑白质脱髓鞘改变是什么意思| 小肠是干什么的| 1950年属什么生肖| 梦见战争是什么兆头| 特异性是什么意思| 瘦肚子吃什么水果| 结婚32年是什么婚| 花枝招展是什么意思| qeelin是什么牌子| 小儿舌苔白厚什么原因| 切除甲状腺有什么影响| 智商125是什么水平| 平安顺遂什么意思| 土地兼并是什么意思| 澳门区花是什么花| 天兵神将是什么动物| 折叠胆囊是什么意思| 口字旁的字和什么有关| bridge什么意思| 结婚六十年是什么婚| 什么人不宜吃石斛| 醋酸生育酚是什么东西| 头晕吃什么药| 敕令是什么意思| 为什么月经一次比一次提前| 延时吃什么药| 怀孕有什么感觉| 全身发麻是什么原因引起的| poems是什么意思| 胃疼是什么感觉| 豆腐干炒什么好吃| 什么是初心| 出轨是什么意思| 抉择是什么意思| 肌肉紧张是什么症状| 感冒可以吃什么| 什么时候可以上环最好的| l是什么意思| 滋生是什么意思| 手掌心发红是什么原因| 身体透支是什么意思| 胃疼检查什么项目| 四物汤什么时候喝| 咽炎挂什么科| 血糖高吃什么降血糖| 骨髓不造血是什么病| 区域经理的岗位职责是什么| 磋商是什么意思| 孕反什么时候结束| 做妇科检查前需要注意什么| 什么是肺腺瘤| 妹妹你坐船头是什么歌| 身体缺钾会有什么症状| 阻生智齿是什么意思| 手脱皮吃什么维生素| 有才是什么意思| 亨字五行属什么| 什么是放疗| 乌岽单丛是什么茶| 夏天适合喝什么养生茶| 巴基斯坦讲什么语言| 竖小拇指什么意思| 天珠是什么做的| 什么时候不能喷芸苔素| 什么药去湿气最好最快| 吃什么补精| 黄铜是什么| 6月18是什么日子| 苏菲是什么| 3月21日什么星座| 谷草转氨酶偏高是什么原因| 吃中药为什么要忌口| 拔牙前需要做什么检查| 开火念什么| 与虎谋皮什么意思| 梦见拖地是什么意思| 什么牌的笔记本电脑好| 梦见蟑螂是什么意思| 5月份是什么星座| 经典是什么意思| 孕妇适合喝什么茶| 牙齿吃甜的就会疼什么原因| 什么菜不能吃| 什么是高压氧| 四平八稳是什么生肖| 辞退和开除有什么区别| 刺史相当于现在的什么官| 骨质疏松有什么症状| 生菜不能和什么一起吃| 扁桃体发炎吃什么药好得快| 胃酸过多吃点什么食物比较好| 梦见杀蛇是什么意思| 怀孕的尿液是什么颜色| 梦到狐狸是什么意思| 为什么叫深圳| 反驳是什么意思| 夏天适合吃什么食物| 蛋糕粉是什么面粉| 国医堂是什么意思| 夏天受凉感冒吃什么药| 北京的市花是什么| 跳蛛吃什么| 马天尼是什么酒| 刘备的马叫什么名字| 锁骨是什么骨| 什么痣不能点| 大小便失禁是什么原因造成的| 紫涵女装属于什么档次| 肠炎可以吃什么食物| 杞菊地黄丸治什么病| 透析病人吃什么水果好| 1944年属什么生肖| 尿道炎吃什么药好| 喝鲜牛奶有什么好处和坏处| 六月初一什么日子| 牙龈溃疡吃什么药| 羊病是什么病| 孕妇为什么不能参加婚礼| 2003年的羊是什么命| 小孩子黑眼圈重是什么原因| 什么人不能喝牛奶| 儿童受凉咳嗽吃什么药| 飞蛾扑火是什么意思| ibs是什么意思| 高血压适合吃什么食物| 梦见自己得了绝症预示着什么| 热泪盈眶的盈是什么意思| 骨质密度不均匀是什么意思| 上海特产是什么| t什么意思| 吃什么东西去湿气| 蓝莓葡萄是什么品种| 乌鸦长什么样| 脑梗做什么检查最准确| 锤子什么意思| 为什么可乐能溶解鱼刺| 摆脱是什么意思| 怕痒的男人意味着什么| 鼻子出汗是什么原因| 狐狸是什么动物| lyocell是什么面料| 分心念什么| 苦瓜煮水喝有什么功效| 鸡胗是什么| 扁桃体有什么作用| 南京有什么玩的| ce是什么元素| 红细胞计数偏低是什么意思| 开化龙顶属于什么茶| 一什么睡莲| 下巴上有痣代表什么| 反射弧是什么| 猫薄荷是什么东西| 什么是环境影响评价| 白羊男喜欢什么样的女生| 什么眼镜品牌好| 小时的单位是什么| 裙带菜是什么| 12388是什么电话| 红薯什么时候种植| 侍寝是什么意思| 足底血查什么| 力五行属什么| 什么像| 蔓越莓是什么| 重复肾是什么意思| 怀孕的人梦见蛇是什么意思| 属鼠的和什么属相相克| 脸书是什么意思| 老鼠长什么样子图片| 什么是心理学| 腰花是什么部位| 尿性什么意思| 命脉是什么意思| 梦到捡菌子是什么意思| 三维b片主治什么病| 双子座和什么星座最配| 莓茶属于什么茶| 公粮是什么意思| 13颗珠子的手串什么意思| 喝酒脸红是缺少什么酶| 手掌麻是什么原因引起的| 平均血小板体积偏高是什么意思| 麂皮绒是什么材质| 上火便秘吃什么最快排便| 夜宵和宵夜有什么区别| 淋巴滤泡增生吃什么药| 为什么月经前乳房胀痛| 龙虾吃什么| 61岁属什么生肖| 腿肿挂什么科| 肝肾功能挂什么科| 什么耳什么腮| 夜间盗汗是什么原因| 豆腐是什么意思| 长期熬夜有什么危害| 精索静脉曲张挂什么科| 男生第一次是什么感觉| 曹操是什么星座| 脱氢酶高是什么原因| 伏脉常见于什么病| 迷迭香是什么| cima是什么证书| 肺火旺吃什么药| 耳朵里面痒用什么药| 带状疱疹用什么药膏| 起什么转什么成语| 肾虚是什么原因| 舒俱来是什么宝石| 宝宝入盆有什么感觉| 升白针叫什么名字| 脂肪肝挂什么科室| 考试前吃什么提神醒脑| 铁观音什么季节喝最好| 什么牌子的学习机好| ca125是什么检查项目| 豆面是什么| 拍证件照穿什么衣服| 揉肚子有什么好处| 百度コンテンツにスキップ

抱团!孟加拉国加入印度所提“南亚卫星计划”

半永久的に拡張半保護されているモジュール
モジュールの解説[表示] [編集] [履歴] [キャッシュを破棄]
百度 党员干部纷纷表示,要全面贯彻落实党的十九大精神,以习近平新时代中国特色社会主义思想为指导,围绕实施乡村振兴战略,深入贯彻新发展理念,落实高质量发展的要求,主动把实施乡村振兴战略的新要求与推进农产品加工业、休闲农业和乡村旅游、农村就业创业创新和农村一二三产业融合发展结合,认真谋划2018年重点工作,切实把党中央国务院决策部署和部党组确定的中心任务落到实处,切实把理论学习转化为推动工作的能力。

このモジュールにはモジュール:Citation/CS1とそのサブモジュールで使用される共通の関数と表が含まれています。

下記はCS1とCS2の出典テンプレートを実装するサブモジュールの一覧です。列の背景が薄い黄色になっているものが和書用出典表記形式でも使用しているモジュールで、それ以外がCS1/CS2のみで使用されているモジュールです。

CS1とCS2の関連モジュール
モジュール サンドボックス 差分 説明
モジュール:Citation/CS1 モジュール:Citation/CS1/sandbox [編集] 差分 レンダリングとサポート用関数
モジュール:Citation/CS1/Configuration モジュール:Citation/CS1/Configuration/sandbox [編集] 差分 翻訳用の表、エラーと識別子の関連設定
モジュール:Citation/CS1/Whitelist モジュール:Citation/CS1/Whitelist/sandbox [編集] 差分 CS1とCS2テンプレートの引数一覧(非推奨と廃止された引数を含む)
モジュール:Citation/CS1/Date validation モジュール:Citation/CS1/Date validation/sandbox [編集] 差分 日付の書式検証用関数
モジュール:Citation/CS1/Identifiers モジュール:Citation/CS1/Identifiers/sandbox [編集] 差分 識別子(ISBNDOIPMIDなど)用のサポート関数
モジュール:Citation/CS1/Utilities モジュール:Citation/CS1/Utilities/sandbox [編集] 差分 ユーティリティ関数と表
モジュール:Citation/CS1/COinS モジュール:Citation/CS1/COinS/sandbox [編集] 差分 CS1とCS2テンプレートのメタデータを出力する関数
モジュール:Citation/CS1/styles.css モジュール:Citation/CS1/sandbox/styles.css [編集] 差分 CS1とCS2テンプレートに適用されるCSSスタイル
モジュール:Citation/CS1/Suggestions モジュール:Citation/CS1/Suggestions/sandbox [編集] 差分 よく使われる間違った引数名とそれに対応する正しい引数名の一覧

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)
	if not cfg.prop_cats [key] then												-- 暫定: cfg.prop_cats[key]が存在するかどうかを予め確認する
		return;
	end
	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
	}
肾炎什么症状 海螺姑娘是什么意思 长期咳嗽是什么原因 男生的隐私长什么样 什么是电汇
什么命要承受丧子之痛 鸡呜狗盗是什么生肖 属羊的跟什么属相犯冲 什么人容易得布病 吉兰巴雷综合征是什么病
波立维是什么药 入木三分什么意思 晚上8点到9点是什么时辰 小孩突然抽搐失去意识是什么原因 ppd试验是什么意思
养寇自重什么意思 痛风不能吃什么食物表 体温偏高的人说明什么 炒菜放什么调料最好吃 出现的反义词是什么
芭蕉花炖猪心治什么病mmeoe.com 天珠到底是什么hcv8jop6ns8r.cn 耳朵蝉鸣是什么原因引起的hcv9jop0ns0r.cn 市辖区什么意思yanzhenzixun.com 91年出生的属什么hcv9jop6ns8r.cn
女人血虚吃什么补最快hcv7jop5ns6r.cn 菊粉是什么hcv8jop2ns1r.cn 无以回报是什么意思hcv9jop6ns7r.cn 晚上十一点是什么时辰hcv9jop2ns5r.cn 9月16日是什么星座onlinewuye.com
营养性贫血是什么意思hcv9jop1ns8r.cn 家庭烧烤准备什么食材520myf.com 吃什么能阻止性早熟hcv9jop4ns5r.cn 尿道炎吃什么药hcv8jop3ns7r.cn 一个口一个甫念什么hcv8jop5ns5r.cn
总是打嗝是什么原因引起的hcv9jop1ns2r.cn 桦树茸有什么作用hcv8jop4ns7r.cn 嗯嗯什么意思hcv8jop7ns6r.cn 梦见棺材什么意思hcv7jop9ns8r.cn 拉屎出血是什么原因hcv7jop9ns6r.cn
百度