Module:Excerpt:修订间差异
外观
删除的内容 添加的内容
撤销Sophivorus(讨论)的版本72156127 似乎有bug |
update to 1.2 |
||
第1行: | 第1行: | ||
-- Module:Excerpt implements the Excerpt template |
|||
-- Documentation https://www.mediawiki.org/wiki/Module:Excerpt |
|||
-- By User:Sophivorus, User:Certes & others |
|||
-- Version 1.2 Chinese Version |
|||
-- License CC-BY-SA-4.0 |
|||
local Transcluder = require('Module:Transcluder') |
local Transcluder = require('Module:Transcluder') |
||
第40行: | 第46行: | ||
-- Make sure the requested page exists |
-- Make sure the requested page exists |
||
local page = getArg(1 |
local page = getArg(1) |
||
if not page then return getError('no-page') end |
if not page then return getError('no-page') end |
||
local title = mw.title.new(page) |
local title = mw.title.new(page) |
||
第48行: | 第54行: | ||
page = title.prefixedText |
page = title.prefixedText |
||
-- Set variables |
-- Set variables from the template parameters |
||
local link=getArg('link') |
local link=getArg('link') |
||
local fragment = getArg('fragment') |
local fragment = getArg('fragment') |
||
local section = |
local section = getArg(2, mw.ustring.match( getArg(1), '[^#]+#(.+)') ) |
||
local hat = yesno( getArg('hat', true) ) |
local hat = yesno( getArg('hat', true) ) |
||
local edit = yesno( getArg('edit', true) ) |
local edit = yesno( getArg('edit', true) ) |
||
第61行: | 第67行: | ||
local templates = getArg('templates', getArg('template', ( only == 'template' and 1 ) ) ) |
local templates = getArg('templates', getArg('template', ( only == 'template' and 1 ) ) ) |
||
local paragraphs = getArg('paragraphs', getArg('paragraph', ( only == 'paragraph' and 1 ) ) ) |
local paragraphs = getArg('paragraphs', getArg('paragraph', ( only == 'paragraph' and 1 ) ) ) |
||
local references = getArg('references' |
local references = getArg('references') |
||
local subsections = not yesno( getArg('subsections') ) |
local subsections = not yesno( getArg('subsections') ) |
||
local noBold = not yesno( getArg('bold') ) |
local noBold = not yesno( getArg('bold') ) |
||
local freefiles = yesno( getArg('freefiles') ) |
|||
local inline = yesno( getArg('inline') ) |
local inline = yesno( getArg('inline') ) |
||
local quote = yesno( getArg('quote') ) |
local quote = yesno( getArg('quote') ) |
||
第84行: | 第91行: | ||
hat = hat .. link |
hat = hat .. link |
||
elseif section and not fragment then |
elseif section and not fragment then |
||
hat = hat .. '[[:' .. page .. '#' .. mw.uri.anchorEncode(section) .. '|' .. page |
hat = hat .. '[[:' .. page .. '#' .. mw.uri.anchorEncode(section) .. '|' .. page |
||
.. ' § ' .. mw.ustring.gsub(section, '%[%[([^]|]+)|?[^]]*%]%]', '%1') .. ']].' -- remove nested links |
|||
else |
else |
||
hat = hat .. '[[:' .. page .. '|' .. page .. ']]' |
hat = hat .. '[[:' .. page .. '|' .. page .. ']].' |
||
end |
end |
||
if edit then |
if edit then |
||
第111行: | 第119行: | ||
end |
end |
||
⚫ | |||
-- Build the templates option |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
local options = { |
local options = { |
||
files = files, |
files = files, |
||
第127行: | 第125行: | ||
tables = tables, |
tables = tables, |
||
paragraphs = paragraphs, |
paragraphs = paragraphs, |
||
⚫ | |||
sections = subsections, |
sections = subsections, |
||
categories = 0, |
categories = 0, |
||
第134行: | 第131行: | ||
noBold = noBold, |
noBold = noBold, |
||
noSelfLinks = true, |
noSelfLinks = true, |
||
noNonFreeFiles = |
noNonFreeFiles = freefiles, |
||
noBehaviorSwitches = true, |
noBehaviorSwitches = true, |
||
fixReferences = true, |
fixReferences = true, |
||
第148行: | 第145行: | ||
end |
end |
||
⚫ | |||
-- Add a line break in case the excerpt starts with a table or list |
|||
⚫ | |||
⚫ | |||
local fileNamespaces = Transcluder.getNamespaces('File') |
local fileNamespaces = Transcluder.getNamespaces('File') |
||
if ((only == 'file' or only == 'files') or (not only and (files ~= '0' or not files))) and -- caller asked for files |
if ((only == 'file' or only == 'files') or (not only and (files ~= '0' or not files))) and -- caller asked for files |
||
第157行: | 第151行: | ||
config.captions -- and we have the config option required to try finding files in templates |
config.captions -- and we have the config option required to try finding files in templates |
||
then |
then |
||
-- We cannot distinguish the infobox from the other templates so we search them all |
|||
local templates = Transcluder.get(title, { only = 'templates', templates = blacklist, fixReferences = true } ) |
|||
local |
local infobox = Transcluder.getTemplates(excerpt); |
||
infobox = table.concat(infobox) |
|||
local parameters = Transcluder.getParameters(infobox) |
|||
local file, captions, caption |
local file, captions, caption |
||
for _, pair in pairs(config.captions) do |
for _, pair in pairs(config.captions) do |
||
第170行: | 第166行: | ||
end |
end |
||
excerpt = '[[File:' .. file .. '|thumb|' .. (caption or '') .. ']]' .. excerpt |
excerpt = '[[File:' .. file .. '|thumb|' .. (caption or '') .. ']]' .. excerpt |
||
excerpt = Transcluder.removeNonFreeFiles(excerpt) |
if ( freefiles ) then |
||
excerpt = Transcluder.removeNonFreeFiles(excerpt) |
|||
end |
|||
break |
break |
||
end |
end |
||
end |
end |
||
end |
end |
||
-- Unlike other elements, templates are filtered here |
|||
-- because we had to search the infoboxes for files |
|||
local trash |
|||
if only and (only == 'template' or only == 'templates') then |
|||
trash, excerpt = Transcluder.getTemplates(excerpt, templates); |
|||
else -- Remove blacklisted templates |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
else --Wanted templates. Replaces blacklist and acts as whitelist |
|||
⚫ | |||
end |
|||
⚫ | |||
⚫ | |||
⚫ | |||
trash, excerpt = Transcluder.getTemplates(excerpt, blacklist); |
|||
⚫ | |||
-- Remove extra line breaks but leave one before and after so the parser interprets lists, tables, etc. correctly |
|||
excerpt = mw.text.trim(excerpt) |
|||
excerpt = string.gsub(excerpt, '\n\n\n+', '\n\n') |
|||
⚫ | |||
-- Remove nested categories |
-- Remove nested categories |
2022年6月15日 (三) 01:49的版本
此模块已评为alpha版,可接受第三方输入,并可用于少量页面以检查是否存在问题,但需要受到检查。欢迎提供新功能或修改其输入输出机制的建议。 |
此模块使用Lua语言: |
相对英文版做出了一些本地化调整,增加了link参数等
This module implements Template:Excerpt.
- See Template:Excerpt for documentation on the template parameters
- See mw:Module:Excerpt for documentation on this module
- See Module:Excerpt/config for configuration of this module
Portals
Portals still use a previous version of this module:
- Module:Excerpt/portals / sandbox — Used by:
- {{Transclude lead excerpt}} / sandbox / testcases
- {{Transclude linked excerpt}} / sandbox / testcases
- {{Transclude list item excerpt}} / sandbox / testcases
- {{Transclude random excerpt}} / sandbox / testcases
- {{Transclude selected excerpt}} / sandbox / testcases
- Module:Excerpt slideshow / sandbox — Uses Module:Excerpt/portals and is used by:
- Module:Random slideshow / sandbox — Uses Module:Excerpt/portals and is used by:
- {{Random slideshow}} / sandbox / testcases
- {{Transclude files as random slideshow}} / sandbox / testcases
上述文档嵌入自Module:Excerpt/doc。 (编辑 | 历史) 编者可以在本模块的沙盒 (编辑 | 差异)和测试样例 (创建)页面进行实验。 本模块的子页面。 |
-- Module:Excerpt implements the Excerpt template
-- Documentation https://www.mediawiki.org/wiki/Module:Excerpt
-- By User:Sophivorus, User:Certes & others
-- Version 1.2 Chinese Version
-- License CC-BY-SA-4.0
local Transcluder = require('Module:Transcluder')
local yesno = require('Module:Yesno')
local ok, config = pcall(require, 'Module:Excerpt/config')
if not ok then config = {} end
local p = {}
-- Helper function to get arguments
local args
function getArg(key, default)
value = args[key]
if value and mw.text.trim(value) ~= '' then
return value
end
return default
end
-- Helper function to handle errors
function getError(message, value)
if type(message) == 'string' then
message = Transcluder.getError(message, value)
end
if config.categories and config.categories.errors and mw.title.getCurrentTitle().isContentPage then
message:node('[[Category:' .. config.categories.errors .. ']]')
end
return message
end
-- Helper function to get localized messages
function getMessage(key)
local ok, TNT = pcall(require, 'Module:TNT')
if not ok then return key end
return TNT.format('I18n/Module:Excerpt.tab', key)
end
function p.main(frame)
args = Transcluder.parseArgs(frame)
-- Make sure the requested page exists
local page = getArg(1)
if not page then return getError('no-page') end
local title = mw.title.new(page)
if not title then return getError('no-page') end
if title.isRedirect then title = title.redirectTarget end
if not title.exists then return getError('page-not-found', page) end
page = title.prefixedText
-- Set variables from the template parameters
local link=getArg('link')
local fragment = getArg('fragment')
local section = getArg(2, mw.ustring.match( getArg(1), '[^#]+#(.+)') )
local hat = yesno( getArg('hat', true) )
local edit = yesno( getArg('edit', true) )
local this = getArg('this')
local only = getArg('only')
local files = getArg('files', getArg('file', ( only == 'file' and 1 ) ) )
local lists = getArg('lists', getArg('list', ( only == 'list' and 1 ) ) )
local tables = getArg('tables', getArg('table', ( only == 'table' and 1 ) ) )
local templates = getArg('templates', getArg('template', ( only == 'template' and 1 ) ) )
local paragraphs = getArg('paragraphs', getArg('paragraph', ( only == 'paragraph' and 1 ) ) )
local references = getArg('references')
local subsections = not yesno( getArg('subsections') )
local noBold = not yesno( getArg('bold') )
local freefiles = yesno( getArg('freefiles') )
local inline = yesno( getArg('inline') )
local quote = yesno( getArg('quote') )
local more = yesno( getArg('more') )
local class = getArg('class')
-- Build the hatnote
if hat and not inline then
if this then
hat = this
elseif quote then
hat = getMessage('this')
elseif only then
hat = getMessage(only)
else
hat = getMessage('section')
end
hat = hat .. getMessage('excerpt')
if link then
hat = hat .. link
elseif section and not fragment then
hat = hat .. '[[:' .. page .. '#' .. mw.uri.anchorEncode(section) .. '|' .. page
.. ' § ' .. mw.ustring.gsub(section, '%[%[([^]|]+)|?[^]]*%]%]', '%1') .. ']].' -- remove nested links
else
hat = hat .. '[[:' .. page .. '|' .. page .. ']].'
end
if edit then
hat = hat .. '<span class="mw-editsection-like plainlinks"><span class="mw-editsection-bracket">[</span>['
hat = hat .. title:fullUrl('action=edit') .. ' ' .. mw.message.new('editsection'):plain()
hat = hat .. ']<span class="mw-editsection-bracket">]</span></span>'
end
if config.hat then
hat = config.hat .. hat .. '}}'
hat = frame:preprocess(hat)
else
hat = mw.html.create('div'):addClass('dablink excerpt-hat'):wikitext(hat)
end
else
hat = nil
end
-- Build the "Read more" link
if more and not inline then
more = "'''[[" .. page .. '#' .. (section or '') .. "|" .. getMessage('more') .. "]]'''"
more = mw.html.create('div'):addClass('noprint excerpt-more'):wikitext(more)
else
more = nil
end
-- Build the options for Module:Transcluder out of the template parameters and the desired defaults
local options = {
files = files,
lists = lists,
tables = tables,
paragraphs = paragraphs,
sections = subsections,
categories = 0,
references = references,
only = only and mw.text.trim(only, 's') .. 's',
noBold = noBold,
noSelfLinks = true,
noNonFreeFiles = freefiles,
noBehaviorSwitches = true,
fixReferences = true,
linkBold = true,
}
-- Get the excerpt itself
local title = page .. '#' .. (section or '')
local ok, excerpt = pcall(Transcluder.get, title, options)
if not ok then return getError(excerpt) end
if mw.text.trim(excerpt) == '' and not only then
if section then return getError('section-empty', section) else return getError('lead-empty') end
end
-- If no file was found, try to get one from the infobox
local fileNamespaces = Transcluder.getNamespaces('File')
if ((only == 'file' or only == 'files') or (not only and (files ~= '0' or not files))) and -- caller asked for files
not Transcluder.matchAny(excerpt, '%[%[', fileNamespaces, ':') and -- and there are no files in Transcluder's output
config.captions -- and we have the config option required to try finding files in templates
then
-- We cannot distinguish the infobox from the other templates so we search them all
local infobox = Transcluder.getTemplates(excerpt);
infobox = table.concat(infobox)
local parameters = Transcluder.getParameters(infobox)
local file, captions, caption
for _, pair in pairs(config.captions) do
file = pair[1]
file = parameters[file]
if file and Transcluder.matchAny(file, '^.*%.', {'[Jj][Pp][Ee]?[Gg]','[Pp][Nn][Gg]','[Gg][Ii][Ff]','[Ss][Vv][Gg]'}, '.*') then
file = mw.ustring.match(file, '%[?%[?.-:([^{|]+)%]?%]?') or file -- [[File:Example.jpg{{!}}upright=1.5]] to Example.jpg
captions = pair[2]
for _, p in pairs(captions) do
if parameters[p] then caption = parameters[p] break end
end
excerpt = '[[File:' .. file .. '|thumb|' .. (caption or '') .. ']]' .. excerpt
if ( freefiles ) then
excerpt = Transcluder.removeNonFreeFiles(excerpt)
end
break
end
end
end
-- Unlike other elements, templates are filtered here
-- because we had to search the infoboxes for files
local trash
if only and (only == 'template' or only == 'templates') then
trash, excerpt = Transcluder.getTemplates(excerpt, templates);
else -- Remove blacklisted templates
local blacklist = config.blacklist and table.concat(config.blacklist, ',') or ''
if templates then
if string.sub(templates, 1, 1) == '-' then --Unwanted templates. Append to blacklist
blacklist = templates .. ',' .. blacklist
else --Wanted templates. Replaces blacklist and acts as whitelist
blacklist = templates
end
else
blacklist = '-' .. blacklist
end
trash, excerpt = Transcluder.getTemplates(excerpt, blacklist);
end
-- Remove extra line breaks but leave one before and after so the parser interprets lists, tables, etc. correctly
excerpt = mw.text.trim(excerpt)
excerpt = string.gsub(excerpt, '\n\n\n+', '\n\n')
excerpt = '\n' .. excerpt .. '\n'
-- Remove nested categories
excerpt = frame:preprocess(excerpt)
local categories, excerpt = Transcluder.getCategories(excerpt, options.categories)
-- Add tracking categories
if config.categories then
local contentCategory = config.categories.content
if contentCategory and mw.title.getCurrentTitle().isContentPage then
excerpt = excerpt .. '[[Category:' .. contentCategory .. ']]'
end
local namespaceCategory = config.categories[ mw.title.getCurrentTitle().namespace ]
if namespaceCategory then
excerpt = excerpt .. '[[Category:' .. namespaceCategory .. ']]'
end
end
-- Load the styles
local styles
if config.styles then
styles = frame:extensionTag( 'templatestyles', '', { src = config.styles } )
end
-- Combine and return the elements
local tag1 = 'div'
local tag2 = 'div'
if inline then
tag1 = 'span'
tag2 = 'span'
elseif quote then
tag2 = 'blockquote'
end
excerpt = mw.html.create(tag1):addClass('excerpt'):wikitext(excerpt)
local block = mw.html.create(tag2):addClass('excerpt-block'):addClass(class)
return block:node(styles):node(hat):node(excerpt):node(more)
end
-- Entry points for backwards compatibility
function p.lead(frame) return p.main(frame) end
function p.excerpt(frame) return p.main(frame) end
return p