打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

目前wiki关闭了自行注册账号的功能,如需注册账号,请查阅Help:注册账号

模块:Hatnote:修订间差异

来自RIA | Wiki
Aunst留言 | 贡献
还原
Aunst留言 | 贡献
测试
第238行: 第238行:
-- Deal with the case where we don't have to pipe the link
-- Deal with the case where we don't have to pipe the link
if not display and not parsed.section and not options.italicizePage then
if not display and not parsed.section and not options.italicizePage then
return string.format('[[:%s]]', parsed.link)
if string.find(parsed.link, 'http?(s)://') == "nil" then
return string.format('[[:%s]]', parsed.link)
else
return parsed.link
end
end
end
第254行: 第258行:
end
end


--[[ if mw.ustring.find('%s', "[") ~= nil then
if string.find(parsed.link, 'http?(s)://') == "nil" then
return string.format('[-[:%s|%s]-]', parsed.link, display)
return string.format('[[:%s|%s]]', parsed.link, display)
else
else
return string.format('%s', display)
return parsed.link
end ]]
end
return string.format('[[:%s|%s]]', parsed.link, display)
end
end



2021年4月14日 (三) 00:07的版本

模块文档
--------------------------------------------------------------------------------
--                              Module:Hatnote                                --
--                                                                            --
-- This module produces hatnote links and links to related articles. It       --
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --
-- helper functions for other Lua hatnote modules.                            --
--------------------------------------------------------------------------------

local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local yesno -- lazily initialise [[Module:Yesno]]

local p = {}

--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------

local function getArgs(frame)
	-- Fetches the arguments from the parent frame. Whitespace is trimmed and
	-- blanks are removed.
	mArguments = require('Module:Arguments')
	return mArguments.getArgs(frame, {parentOnly = true})
end

local function removeInitialColon(s)
	-- Removes the initial colon from a string, if present.
	return s:match('^:?(.*)')
end

function p.findNamespaceId(link, removeColon)
	-- Finds the namespace id (namespace number) of a link or a pagename. This
	-- function will not work if the link is enclosed in double brackets. Colons
	-- are trimmed from the start of the link by default. To skip colon
	-- trimming, set the removeColon parameter to false.
	checkType('findNamespaceId', 1, link, 'string')
	checkType('findNamespaceId', 2, removeColon, 'boolean', true)
	if removeColon ~= false then
		link = removeInitialColon(link)
	end
	local namespace = link:match('^(.-):')
	if namespace then
		local nsTable = mw.site.namespaces[namespace]
		if nsTable then
			return nsTable.id
		end
	end
	return 0
end

function p.formatPages(...)
	-- Formats a list of pages using formatLink and returns it as an array. Nil
	-- values are not allowed.
	local pages = {...}
	local ret = {}
	for i, page in ipairs(pages) do
		ret[i] = p._formatLink{link = page}
	end
	return ret
end

function p.formatPageTables(...)
	-- Takes a list of page/display tables and returns it as a list of
	-- formatted links. Nil values are not allowed.
	local pages = {...}
	local links = {}
	for i, t in ipairs(pages) do
		checkType('formatPageTables', i, t, 'table')
		local link = t[1]
		local display = t[2]
		links[i] = p._formatLink{link = link, display = display}
	end
	return links
end

function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
	-- Formats an error message to be returned to wikitext. If
	-- addTrackingCategory is not false after being returned from
	-- [[Module:Yesno]], and if we are not on a talk page, a tracking category
	-- is added.
	checkType('makeWikitextError', 1, msg, 'string')
	checkType('makeWikitextError', 2, helpLink, 'string', true)
	yesno = require('Module:Yesno')
	title = title or mw.title.getCurrentTitle()
	-- Make the help link text.
	local helpText
	if helpLink then
		helpText = ' ([[' .. helpLink .. '|帮助]])'
	else
		helpText = ''
	end
	-- Make the category text.
	local category
	if not title.isTalkPage -- Don't categorise talk pages
		and title.namespace ~= 2 -- Don't categorise userspace
		and yesno(addTrackingCategory) ~= false -- Allow opting out
	then
		category = '带有错误的Hatnote模板'
		category = string.format(
			'[[%s:%s]]',
			mw.site.namespaces[14].name,
			category
		)
	else
		category = ''
	end
	return string.format(
		'<strong class="error" style="font-size: inherit;">错误: %s%s.</strong>%s',
		msg,
		helpText,
		category
	)
end

function p.disambiguate(page, disambiguator)
	-- Formats a page title with a disambiguation parenthetical,
	-- i.e. "Example" → "Example (disambiguation)".
	checkType('消歧义' or 'disambiguate', 1, page, 'string')
	checkType('消歧义' or 'disambiguate', 2, disambiguator, 'string', true)
	disambiguator = disambiguator or '消歧义' or 'disambiguation'
	return string.format('%s (%s)', page, disambiguator)
end

--------------------------------------------------------------------------------
-- Format link
--
-- Makes a wikilink from the given link and display values. Links are escaped
-- with colons if necessary, and links to sections are detected and displayed
-- with " § " as a separator rather than the standard MediaWiki "#". Used in
-- the {{format link}} template.
--------------------------------------------------------------------------------

function p.formatLink(frame)
	-- The formatLink export function, for use in templates.
	yesno = require('Module:Yesno')
	local args = getArgs(frame)
	local link = args[1]
	if not link then
		return p.makeWikitextError(
			'未定义链接',
			'Template:Format link#Errors',
			args.category
		)
	end
	return p._formatLink{
		link = link,
		display = args[2],
		italicizePage = yesno(args.italicizepage),
		italicizeSection = yesno(args.italicizesection),
	}
end

local function italicize(s)
	-- Italicize a string.
	return '<i>' .. s .. '</i>'
end

local function maybeItalicize(s, shouldItalicize)
	-- italicize s if s is a string and the shouldItalicize parameter is true.
	if s and shouldItalicize then
		return italicize(s)
	else
		return s
	end
end

local function parseLink(link)
	-- Parse a link and return a table with the link's components.
	-- These components are:
	-- - link: the link, stripped of any initial colon (always present)
	-- - page: the page name (always present)
	-- - section: the page name (may be nil)
	-- - display: the display text, if manually entered after a pipe (may be nil)
	link = removeInitialColon(link)

	-- Find whether a faux display value has been added with the {{!}} magic
	-- word.
	local prePipe, display = link:match('^(.-)|(.*)$')
	link = prePipe or link

	-- Find the page, if it exists.
	-- For links like [[#Bar]], the page will be nil.
	local preHash, postHash = link:match('^(.-)#(.*)$')
	local page
	if not preHash then
		-- We have a link like [[Foo]].
		page = link
	elseif preHash ~= '' then
		-- We have a link like [[Foo#Bar]].
		page = preHash
	end

	-- Find the section, if it exists.
	local section
	if postHash and postHash ~= '' then
		section = postHash
	end
	
	return {
		link = link,
		page = page,
		section = section,
		display = display,
	}
end

function p._formatLink(options)
	-- The formatLink export function, for use in modules.
	checkType('_formatLink', 1, options, 'table')
	checkTypeForNamedArg('_formatLink', 'link', options.link, 'string', false)
	checkTypeForNamedArg(
		'_formatLink',
		'display',
		options.display,
		'string',
		true
	)
	checkTypeForNamedArg(
		'_formatLink',
		'italicizePage',
		options.italicizePage,
		'boolean',
		true
	)
	checkTypeForNamedArg(
		'_formatLink',
		'italicizeSection',
		options.italicizeSection,
		'boolean',
		true
	)

	local parsed = parseLink(options.link)
	local display = options.display or parsed.display
	
	-- Deal with the case where we don't have to pipe the link
	if not display and not parsed.section and not options.italicizePage then
		if string.find(parsed.link, 'http?(s)://') == "nil" then
			return string.format('[[:%s]]', parsed.link)
		else
			return parsed.link
		end
	end
	
	-- Find the display text for piped links
	if not display then
		local page = maybeItalicize(parsed.page, options.italicizePage)
		local section = maybeItalicize(parsed.section, options.italicizeSection)
		if not page then
			display = string.format('§&nbsp;%s', section)
		elseif section then
			display = string.format('%s §&nbsp;%s', page, section)
		else
			display = page
		end
	end

	if string.find(parsed.link, 'http?(s)://') == "nil" then
		return string.format('[[:%s|%s]]', parsed.link, display)
	else
		return parsed.link
	end
end

--------------------------------------------------------------------------------
-- Hatnote
--
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------

function p.hatnote(frame)
	local args = getArgs(frame)
	args.text = args.text or args[1]
	local s = args.text
	local options = {}
	if not s then
		return p.makeWikitextError(
			'未定义文本',
			'Template:Hatnote#错误',
			args.category
		)
	end
	options.extraclasses = args.extraclasses
	options.selfref = args.selfref
	options.style = args.style
	return p._hatnote(s, options)
end

function p._hatnote(s, options)
	checkType('_hatnote', 1, s, 'string')
	checkType('_hatnote', 2, options, 'table', true)
	options = options or {}
	local classes = 'hatnote navigation-not-searchable'
	local extraclasses = options.extraclasses
	local selfref = options.selfref
	local style = options.style
	if type(extraclasses) == 'string' then
		classes = classes .. ' ' .. extraclasses
	end
	if selfref then
		classes = classes .. ' ' .. 'selfref'
	end

	local output = mw.html.create('div')
		:attr('role', 'note')
		:addClass(classes)
		:cssText(style)
		:wikitext(s)
		:done()
	return tostring(output)
end

return p