Module:Format link:修订间差异
创建页面,内容为“local p = {} function p.call( inputArgs ) if not inputArgs or type( inputArgs ) ~= 'table' then return nil end local rawPage = inputArgs[ 1 ] or '' local rawSection = inputArgs[ 2 ] or '' local finalPage, finalSection if rawPage:find( '[', 1, true ) then return rawPage else if rawPage:find( '|', 1, true ) then return '' .. rawPage .. '' else if rawPage:find( '#', 1, true ) then local splitParts = mw.text.split( rawPage:gsub( '#+…” |
无编辑摘要 |
||
第1行: | 第1行: | ||
-------------------------------------------------------------------------------- | |||
-- 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. | |||
-------------------------------------------------------------------------------- | |||
local libraryUtil = require('libraryUtil') | |||
local checkType = libraryUtil.checkType | |||
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg | |||
local mArguments -- lazily initialise [[Module:Arguments]] | |||
local mError -- lazily initialise [[Module:Error]] | |||
local yesno -- lazily initialise [[Module:Yesno]] | |||
local p = {} | local p = {} | ||
function | -------------------------------------------------------------------------------- | ||
if | -- 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 | |||
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 | end | ||
local | -- 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 | |||
local | local function formatDisplay(parsed, options) | ||
if | -- Formats a display string based on a parsed link table (matching the | ||
return | -- output of parseLink) and an options table (matching the input options for | ||
-- _formatLink). | |||
local page = parsed.page | |||
local section = parsed.section | |||
if (not section) then | |||
return page | |||
elseif (not page) then | |||
return mw.ustring.format('§ %s', section) | |||
else | else | ||
return mw.ustring.format('%s § %s', page, section) | |||
end | |||
end | |||
local function missingArgError(target) | |||
mError = require('Module:Error') | |||
return mError.error{message = | |||
'错误:link或target参数缺失([[' .. target .. '#错误|帮助]])' | |||
} | |||
end | |||
-------------------------------------------------------------------------------- | |||
-- Main functions | |||
-------------------------------------------------------------------------------- | |||
function p.formatLink(frame) | |||
-- The formatLink export function, for use in templates. | |||
yesno = require('Module:Yesno') | |||
local args = getArgs(frame) | |||
local link = args[1] or args.link | |||
local target = args[3] or args.target | |||
if not (link or target) then | |||
return missingArgError('Template:Format link') | |||
end | |||
return p._formatLink{ | |||
link = link, | |||
display = args[2] or args.display, | |||
target = target, | |||
categorizeMissing = args.categorizemissing | |||
} | |||
end | |||
function p._formatLink(options) | |||
-- The formatLink export function, for use in modules. | |||
checkType('_formatLink', 1, options, 'table') | |||
local function check(key, expectedType) --for brevity | |||
checkTypeForNamedArg( | |||
'_formatLink', key, options[key], expectedType or 'string', true | |||
) | |||
end | |||
check('link') | |||
check('display') | |||
check('target') | |||
check('categorizeMissing') | |||
-- Normalize link and target and check that at least one is present | |||
if options.link == '' then options.link = nil end | |||
if options.target == '' then options.target = nil end | |||
if not (options.link or options.target) then | |||
return missingArgError('Module:Format link') | |||
end | |||
-- Bypassing transwiki link | |||
if options.link and options.link:match('<span class="ilh-') then | |||
return options.link | |||
end | |||
local parsed = parseLink(options.link) | |||
local display = options.display or parsed.display | |||
local catMissing = options.categorizeMissing | |||
local category = '' | |||
-- Find the display text | |||
if not display then display = formatDisplay(parsed, options) end | |||
-- Handle the target option if present | |||
if options.target then | |||
if options.target:match('<span class="ilh-') then | |||
return options.target | |||
end | |||
local parsedTarget = parseLink(options.target) | |||
parsed.link = parsedTarget.link | |||
parsed.page = parsedTarget.page | |||
end | |||
-- Test if page exists if a diagnostic category is specified | |||
if catMissing and (mw.ustring.len(catMissing) > 0) then | |||
local title = nil | |||
if parsed.page then title = mw.title.new(parsed.page) end | |||
if title and (not title.isExternal) then | |||
local success, exists = pcall(function() return title.exists end) | |||
if success and not exists then | |||
category = mw.ustring.format('[[Category:%s]]', catMissing) | |||
end | end | ||
end | end | ||
end | |||
-- Format the result as a link | |||
if parsed.link == display then | |||
return mw.ustring.format('[[:%s]]%s', parsed.link, category) | |||
else | |||
return mw.ustring.format('[[:%s|%s]]%s', parsed.link, display, category) | |||
end | end | ||
end | end | ||
function p. | -------------------------------------------------------------------------------- | ||
local | -- Derived convenience functions | ||
-------------------------------------------------------------------------------- | |||
function p.formatPages(options, pages) | |||
-- Formats an array of pages using formatLink and the given options table, | |||
-- and returns it as an array. Nil values are not allowed. | |||
local ret = {} | |||
for i, page in ipairs(pages) do | |||
ret[i] = p._formatLink{ | |||
link = page, | |||
categorizeMissing = options.categorizeMissing | |||
} | |||
end | end | ||
return ret | |||
return | |||
end | end | ||
return p | return p |