Module:Format link:修订间差异
外观
删除的内容 添加的内容
创建 Distinguish(zhwiki 版,NSPN→NAMESPACE) |
from zhwiki |
||
| 第21行: | 第21行: | ||
local function getArgs(frame) |
local function getArgs(frame) |
||
-- Fetches the arguments from the parent frame. Whitespace is trimmed and |
|||
-- blanks are removed. |
|||
mArguments = require('Module:Arguments') |
mArguments = require('Module:Arguments') |
||
return mArguments.getArgs(frame, {parentOnly = true}) |
return mArguments.getArgs(frame, {parentOnly = true}) |
||
| 第26行: | 第28行: | ||
local function removeInitialColon(s) |
local function removeInitialColon(s) |
||
-- Removes the initial colon from a string, if present. |
|||
return s:match('^:?(.*)') |
return s:match('^:?(.*)') |
||
end |
end |
||
local function parseLink(link) |
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) |
link = removeInitialColon(link) |
||
-- Find whether a faux display value has been added with the {{!}} magic |
|||
-- word. |
|||
local prePipe, display = link:match('^(.-)|(.*)$') |
local prePipe, display = link:match('^(.-)|(.*)$') |
||
link = prePipe or link |
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 preHash, postHash = link:match('^(.-)#(.*)$') |
||
local page |
local page |
||
if not preHash then |
if not preHash then |
||
-- We have a link like [[Foo]]. |
|||
page = link |
page = link |
||
elseif preHash ~= '' then |
elseif preHash ~= '' then |
||
-- We have a link like [[Foo#Bar]]. |
|||
page = preHash |
page = preHash |
||
end |
end |
||
-- Find the section, if it exists. |
|||
local section |
local section |
||
if postHash and postHash ~= '' then |
if postHash and postHash ~= '' then |
||
section = postHash |
section = postHash |
||
end |
end |
||
return { |
return { |
||
link = link, |
link = link, |
||
| 第52行: | 第72行: | ||
end |
end |
||
local function formatDisplay(parsed) |
local function formatDisplay(parsed, options) |
||
-- Formats a display string based on a parsed link table (matching the |
|||
-- output of parseLink) and an options table (matching the input options for |
|||
-- _formatLink). |
|||
local page = parsed.page |
local page = parsed.page |
||
local section = parsed.section |
local section = parsed.section |
||
| 第58行: | 第81行: | ||
return page |
return page |
||
elseif (not page) then |
elseif (not page) then |
||
return mw.ustring.format(' |
return mw.ustring.format('§ %s', section) |
||
else |
else |
||
return mw.ustring.format('%s |
return mw.ustring.format('%s § %s', page, section) |
||
end |
end |
||
end |
end |
||
| 第76行: | 第99行: | ||
function p.formatLink(frame) |
function p.formatLink(frame) |
||
-- The formatLink export function, for use in templates. |
|||
yesno = require('Module:Yesno') |
yesno = require('Module:Yesno') |
||
local args = getArgs(frame) |
local args = getArgs(frame) |
||
| 第93行: | 第117行: | ||
function p._formatLink(options) |
function p._formatLink(options) |
||
-- The formatLink export function, for use in modules. |
|||
checkType('_formatLink', 1, options, 'table') |
checkType('_formatLink', 1, options, 'table') |
||
local function check(key, expectedType) |
local function check(key, expectedType) --for brevity |
||
checkTypeForNamedArg( |
checkTypeForNamedArg( |
||
'_formatLink', key, options[key], expectedType or 'string', true |
'_formatLink', key, options[key], expectedType or 'string', true |
||
| 第104行: | 第129行: | ||
check('categorizeMissing') |
check('categorizeMissing') |
||
-- Normalize link and target and check that at least one is present |
|||
if options.link == '' then options.link = nil end |
if options.link == '' then options.link = nil end |
||
if options.target == '' then options.target = nil end |
if options.target == '' then options.target = nil end |
||
| 第110行: | 第136行: | ||
end |
end |
||
-- Bypassing transwiki link |
|||
if options.link and options.link:match('<span class="ilh-') then |
if options.link and options.link:match('<span class="ilh-') then |
||
return options.link |
return options.link |
||
| 第119行: | 第146行: | ||
local category = '' |
local category = '' |
||
-- Find the display text |
|||
if not display then display = formatDisplay(parsed, options) end |
if not display then display = formatDisplay(parsed, options) end |
||
-- Handle the target option if present |
|||
if options.target then |
if options.target then |
||
if options.target:match('<span class="ilh-') then |
if options.target:match('<span class="ilh-') then |
||
| 第130行: | 第159行: | ||
end |
end |
||
-- Test if page exists if a diagnostic category is specified |
|||
if catMissing and (mw.ustring.len(catMissing) > 0) then |
if catMissing and (mw.ustring.len(catMissing) > 0) then |
||
local title = nil |
local title = nil |
||
| 第140行: | 第170行: | ||
end |
end |
||
end |
end |
||
-- Format the result as a link |
|||
if parsed.link == display then |
if parsed.link == display then |
||
return mw.ustring.format('[[:%s]]%s', parsed.link, category) |
return mw.ustring.format('[[:%s]]%s', parsed.link, category) |
||
| 第147行: | 第178行: | ||
end |
end |
||
end |
end |
||
-------------------------------------------------------------------------------- |
|||
-- Derived convenience functions |
|||
-------------------------------------------------------------------------------- |
|||
function p.formatPages(options, pages) |
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 = {} |
local ret = {} |
||
for i, page in ipairs(pages) do |
for i, page in ipairs(pages) do |
||
2026年7月25日 (六) 23:20的最新版本
--------------------------------------------------------------------------------
-- 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 = {}
--------------------------------------------------------------------------------
-- 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
-- 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 function formatDisplay(parsed, options)
-- Formats a display string based on a parsed link table (matching the
-- 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
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
-- 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
--------------------------------------------------------------------------------
-- 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
return ret
end
return p