Difference between revisions of "Module:Excerpt"
From Asmbly Wiki
m (1 revision imported) |
m (1 revision imported) |
||
(One intermediate revision by one other user not shown) | |||
Line 1: | Line 1: | ||
− | + | -- Module:Excerpt implements the Excerpt template | |
+ | -- Documentation https://www.mediawiki.org/wiki/Module:Excerpt | ||
+ | -- By User:Sophivorus, User:Certes & others | ||
+ | -- Version 1.5 | ||
+ | -- License CC BY-SA-3.0 | ||
− | local | + | local Transcluder = require( 'Module:Transcluder' ) |
− | local ok, config = pcall(require, 'Module:Excerpt/config') | + | local yesno = require( 'Module:Yesno' ) |
+ | |||
+ | local ok, config = pcall( require, 'Module:Excerpt/config' ) | ||
if not ok then config = {} end | if not ok then config = {} end | ||
Line 10: | Line 16: | ||
-- Helper function to get arguments | -- Helper function to get arguments | ||
local args | local args | ||
− | function getArg(key, default) | + | function getArg( key, default ) |
− | value = args[key] | + | local value = args[ key ] |
− | if value and mw.text.trim(value) ~= '' then | + | if value and mw.text.trim( value ) ~= '' then |
return value | return value | ||
end | end | ||
Line 19: | Line 25: | ||
-- Helper function to handle errors | -- Helper function to handle errors | ||
− | function getError(message, value) | + | function getError( message, value ) |
− | if type(message) == 'string' then | + | if type( message ) == 'string' then |
− | message = Transcluder.getError(message, value) | + | message = Transcluder.getError( message, value ) |
end | end | ||
if config.categories and config.categories.errors and mw.title.getCurrentTitle().isContentPage then | if config.categories and config.categories.errors and mw.title.getCurrentTitle().isContentPage then | ||
− | message:node('[[Category:' .. config.categories.errors .. ']]') | + | message:node( '[[Category:' .. config.categories.errors .. ']]' ) |
end | end | ||
return message | return message | ||
Line 30: | Line 36: | ||
-- Helper function to get localized messages | -- Helper function to get localized messages | ||
− | function getMessage(key) | + | function getMessage( key ) |
− | local ok, TNT = pcall(require, 'Module:TNT') | + | local ok, TNT = pcall( require, 'Module:TNT' ) |
if not ok then return key end | if not ok then return key end | ||
− | return TNT.format('I18n/Module:Excerpt.tab', key) | + | return TNT.format( 'I18n/Module:Excerpt.tab', key ) |
end | end | ||
− | function p.main(frame) | + | function p.main( frame ) |
− | args = Transcluder.parseArgs(frame) | + | args = Transcluder.parseArgs( frame ) |
-- 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) | ||
− | if not title then return getError('no-page') end | + | if not title then return getError( 'no-page' ) end |
if title.isRedirect then title = title.redirectTarget end | if title.isRedirect then title = title.redirectTarget end | ||
− | if not title.exists then return getError('page-not-found', page) end | + | if not title.exists then return getError( 'page-not-found', page ) end |
page = title.prefixedText | page = title.prefixedText | ||
− | -- Set variables | + | -- Set variables from the template parameters |
− | + | local section = getArg( 2, mw.ustring.match( getArg( 1 ), '[^#]+#(.+)' ) ) | |
− | local section = | + | local hat = yesno( getArg( 'hat', true ) ) |
− | local hat = yesno( getArg('hat', true) ) | + | local edit = yesno( getArg( 'edit', true ) ) |
− | local edit = yesno( getArg('edit', true) ) | + | local this = getArg( 'this' ) |
− | local this = getArg('this') | + | local only = getArg( 'only' ) |
− | local only = getArg('only') | + | local files = getArg( 'files', getArg( 'file', ( only == 'file' and 1 ) ) ) |
− | local files = getArg('files', getArg('file', ( only == 'file' and 1 ) ) ) | + | local lists = getArg( 'lists', getArg( 'list', ( only == 'list' and 1 ) ) ) |
− | local lists = getArg('lists', getArg('list', ( only == 'list' and 1 ) ) ) | + | local tables = getArg( 'tables', getArg( 'table', ( only == 'table' and 1 ) ) ) |
− | local tables = getArg('tables', getArg('table', ( only == 'table' and 1 ) ) ) | + | 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 | + | local noLinks = not yesno( getArg( 'links', true ) ) |
− | local | + | local noBold = not yesno( getArg( 'bold' ) ) |
− | local inline = yesno( getArg('inline') ) | + | local onlyFreeFiles = yesno( getArg( 'onlyfreefiles', true ) ) |
− | local quote = yesno( getArg('quote') ) | + | local inline = yesno( getArg( 'inline' ) ) |
− | local more = yesno( getArg('more') ) | + | local quote = yesno( getArg( 'quote' ) ) |
− | local class = getArg('class') | + | local more = yesno( getArg( 'more' ) ) |
+ | local class = getArg( 'class' ) | ||
-- Build the hatnote | -- Build the hatnote | ||
Line 73: | Line 80: | ||
hat = this | hat = this | ||
elseif quote then | elseif quote then | ||
− | hat = getMessage('this') | + | hat = getMessage( 'this' ) |
elseif only then | elseif only then | ||
− | hat = getMessage(only) | + | hat = getMessage( only ) |
else | else | ||
− | hat = getMessage('section') | + | hat = getMessage( 'section' ) |
end | end | ||
− | hat = hat .. ' ' .. getMessage('excerpt') .. ' ' | + | hat = hat .. ' ' .. getMessage( 'excerpt' ) .. ' ' |
if section and not fragment then | if 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 | + | .. ' § ' .. mw.ustring.gsub( section, '%[%[([^]|]+)|?[^]]*%]%]', '%1' ) .. ']].' -- remove nested links |
else | else | ||
hat = hat .. '[[:' .. page .. '|' .. page .. ']].' | hat = hat .. '[[:' .. page .. '|' .. page .. ']].' | ||
Line 88: | Line 95: | ||
if edit then | if edit then | ||
hat = hat .. '<span class="mw-editsection-like plainlinks"><span class="mw-editsection-bracket">[</span>[' | 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 .. title:fullUrl( 'action=edit' ) .. ' ' .. mw.message.new( 'editsection' ):plain() |
hat = hat .. ']<span class="mw-editsection-bracket">]</span></span>' | hat = hat .. ']<span class="mw-editsection-bracket">]</span></span>' | ||
end | end | ||
if config.hat then | if config.hat then | ||
hat = config.hat .. hat .. '}}' | hat = config.hat .. hat .. '}}' | ||
− | hat = frame:preprocess(hat) | + | hat = frame:preprocess( hat ) |
else | else | ||
− | hat = mw.html.create('div'):addClass('dablink excerpt-hat'):wikitext(hat) | + | hat = mw.html.create( 'div' ):addClass( 'dablink excerpt-hat' ):wikitext( hat ) |
end | end | ||
else | else | ||
Line 103: | Line 110: | ||
-- Build the "Read more" link | -- Build the "Read more" link | ||
if more and not inline then | if more and not inline then | ||
− | more = "'''[[" .. page .. '#' .. (section or '') .. "|" .. getMessage('more') .. "]]'''" | + | more = "'''[[" .. page .. '#' .. ( section or '' ) .. "|" .. getMessage( 'more' ) .. "]]'''" |
− | more = mw.html.create('div'):addClass('noprint excerpt-more'):wikitext(more) | + | more = mw.html.create( 'div' ):addClass( 'noprint excerpt-more' ):wikitext( more ) |
else | else | ||
more = nil | more = nil | ||
end | end | ||
− | + | -- Build the options for Module:Transcluder out of the template parameters and the desired defaults | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | -- Build the options for Module:Transcluder out of the template | ||
local options = { | local options = { | ||
files = files, | files = files, | ||
Line 125: | Line 122: | ||
tables = tables, | tables = tables, | ||
paragraphs = paragraphs, | paragraphs = paragraphs, | ||
− | |||
sections = subsections, | sections = subsections, | ||
categories = 0, | categories = 0, | ||
references = references, | references = references, | ||
− | only = only and mw.text.trim(only, 's') .. 's', | + | only = only and mw.text.trim( only, 's' ) .. 's', |
+ | noLinks = noLinks, | ||
noBold = noBold, | noBold = noBold, | ||
noSelfLinks = true, | noSelfLinks = true, | ||
− | noNonFreeFiles = | + | noNonFreeFiles = onlyFreeFiles, |
noBehaviorSwitches = true, | noBehaviorSwitches = true, | ||
fixReferences = true, | fixReferences = true, | ||
Line 139: | Line 136: | ||
-- Get the excerpt itself | -- Get the excerpt itself | ||
− | local title = page .. '#' .. (section or '') | + | local title = page .. '#' .. ( section or '' ) |
− | local ok, excerpt = pcall(Transcluder.get, title, options) | + | local ok, excerpt = pcall( Transcluder.get, title, options ) |
− | if not ok then return getError(excerpt) end | + | if not ok then return getError( excerpt ) end |
− | if mw.text.trim(excerpt) == '' and not only then | + | if mw.text.trim( excerpt ) == '' and not only then |
− | if section then return getError('section-empty', section) else return getError('lead-empty') end | + | if section then return getError( 'section-empty', section ) else return getError( 'lead-empty' ) end |
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 | |
− | -- If no file was found, try to | + | not Transcluder.matchAny( excerpt, '%[%[', fileNamespaces, ':' ) and -- and there are no files in Transcluder's output |
− | 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 | config.captions -- and we have the config option required to try finding files in templates | ||
then | then | ||
− | local | + | -- We cannot distinguish the infobox from the other templates so we search them all |
− | local parameters = Transcluder.getParameters( | + | 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 |
file = pair[1] | file = pair[1] | ||
file = parameters[file] | file = parameters[file] | ||
− | if file and Transcluder.matchAny(file, '^.*%.', {'[Jj][Pp][Ee]?[Gg]','[Pp][Nn][Gg]','[Gg][Ii][Ff]','[Ss][Vv][Gg]'}, '.*') then | + | 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 | + | file = mw.ustring.match( file, '%[?%[?.-:([^{|]+)%]?%]?' ) or file -- [[File:Example.jpg{{!}}upright=1.5]] to Example.jpg |
captions = pair[2] | captions = pair[2] | ||
− | for _, p in pairs(captions) do | + | for _, p in pairs( captions ) do |
− | if parameters[p] then caption = parameters[p] break end | + | if parameters[ p ] then caption = parameters[ p ] break end |
+ | end | ||
+ | excerpt = '[[File:' .. file .. '|thumb|' .. ( caption or '' ) .. ']]' .. excerpt | ||
+ | if ( onlyFreeFiles ) then | ||
+ | excerpt = Transcluder.removeNonFreeFiles( excerpt ) | ||
end | 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 | ||
+ | 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 | -- Remove nested categories | ||
− | excerpt = frame:preprocess(excerpt) | + | excerpt = frame:preprocess( excerpt ) |
− | local categories, excerpt = Transcluder.getCategories(excerpt, options.categories) | + | local categories, excerpt = Transcluder.getCategories( excerpt, options.categories ) |
-- Add tracking categories | -- Add tracking categories | ||
Line 197: | Line 219: | ||
-- Combine and return the elements | -- Combine and return the elements | ||
− | |||
− | |||
if inline then | if inline then | ||
− | + | return mw.text.trim( excerpt ) | |
− | + | end | |
− | + | local tag = 'div' | |
− | + | if quote then | |
+ | tag = 'blockquote' | ||
end | end | ||
− | excerpt = mw.html.create( | + | excerpt = mw.html.create( 'div' ):addClass( 'excerpt' ):wikitext( excerpt ) |
− | local block = mw.html.create( | + | local block = mw.html.create( tag ):addClass( 'excerpt-block' ):addClass( class ) |
− | return block:node(styles):node(hat):node(excerpt):node(more) | + | return block:node( styles ):node( hat ):node( excerpt ):node( more ) |
end | end | ||
-- Entry points for backwards compatibility | -- Entry points for backwards compatibility | ||
− | function p.lead(frame) return p.main(frame) end | + | function p.lead( frame ) return p.main( frame ) end |
− | function p.excerpt(frame) return p.main(frame) end | + | function p.excerpt( frame ) return p.main( frame ) end |
return p | return p |
Latest revision as of 01:38, 24 December 2022
Page Module:Message box/ombox.css has no content.
Page Module:Message box/ombox.css has no content.
Page Module:Message box/ombox.css has no content.
This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
This Lua module is used on approximately 2,400 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
This module depends on the following other modules: |
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
-- Module:Excerpt implements the Excerpt template -- Documentation https://www.mediawiki.org/wiki/Module:Excerpt -- By User:Sophivorus, User:Certes & others -- Version 1.5 -- License CC BY-SA-3.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 ) local 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 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 noLinks = not yesno( getArg( 'links', true ) ) local noBold = not yesno( getArg( 'bold' ) ) local onlyFreeFiles = yesno( getArg( 'onlyfreefiles', true ) ) 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 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', noLinks = noLinks, noBold = noBold, noSelfLinks = true, noNonFreeFiles = onlyFreeFiles, 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 ( onlyFreeFiles ) 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 if inline then return mw.text.trim( excerpt ) end local tag = 'div' if quote then tag = 'blockquote' end excerpt = mw.html.create( 'div' ):addClass( 'excerpt' ):wikitext( excerpt ) local block = mw.html.create( tag ):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