17,273
edits
(add Listbox class to be inherited by Navbox and Galbox) |
(remove remaining staging checks (WW Enemies, HW Characters). Migration is complete.) |
||
(16 intermediate revisions by the same user not shown) | |||
Line 24: | Line 24: | ||
end | end | ||
local | function handleLine( line, currentSection ) | ||
local headingLevel, headingText = string.match( line, '^%s*(=+)%s*(.-)%s*=+$' ) | |||
if headingLevel then -- line is a heading | |||
local newSection = { | |||
level = #headingLevel, | |||
name = headingText, | |||
content = "", | |||
summary = "", | |||
sections = {} | |||
} | |||
function | -- find the right parent and insert | ||
local subject = args[1] .. ' ' .. args[2] | while currentSection.level >= #headingLevel do | ||
currentSection = currentSection.parent | |||
end | |||
newSection.parent = currentSection | |||
currentSection.sections[#currentSection.sections + 1] = newSection | |||
currentSection = newSection | |||
elseif #currentSection.sections == 0 then -- no child headings yet so this is part of the summary of the current section | |||
currentSection.summary = currentSection.summary .. line .. '\n' | |||
end | |||
-- add to content of all parent sections, plus current section if line isn't a heading | |||
local contentBackfillSection = headingLevel and currentSection.parent or currentSection | |||
repeat | |||
contentBackfillSection.content = contentBackfillSection.content .. line .. '\n' | |||
contentBackfillSection = contentBackfillSection.parent | |||
until not contentBackfillSection | |||
-- determine if line is a category | |||
local cat = string.match( line, '^%s*%[%[Category:(.-)]]%s*$' ) | |||
cat = cat and mw.text.split( cat, '|' )[1] | |||
return currentSection, cat | |||
end | |||
local Navbox = Box.new() | |||
Navbox.__index = Navbox | |||
setmetatable( Navbox, Box ) | |||
function Navbox.new( args ) | |||
local subject = args[2] and (args[1] .. ' ' .. args[2]) or args[1] | |||
args.class = 'navbox' | args.class = 'navbox' | ||
args.title = '[[' .. subject .. ']]' | args.title = '[[' .. subject .. ']]' | ||
Line 36: | Line 72: | ||
local obj = Box.new( 'light', args ) | local obj = Box.new( 'light', args ) | ||
obj.subject = subject | obj.subject = subject | ||
obj.categories = { args[1], subject, args[2] } | obj.categories = args[2] and { args[1], subject, args[2] } or {} -- will be set later when parsing the page | ||
return setmetatable( obj, | return setmetatable( obj, Navbox ) | ||
end | end | ||
local p = {} | local p = {} | ||
p. | p.Navbox = Navbox | ||
function p._parseListing( pageName, pageContent ) | function p._parseListing( pageName, pageContent ) | ||
local pageContent = pageContent or mw. | local pageContent = pageContent or mw.text.killMarkers( mw.getCurrentFrame():expandTemplate{ title = ':' .. pageName, args = {} } ) | ||
local root = { | local root = { | ||
level = 1, | level = 1, | ||
Line 51: | Line 87: | ||
content = "", | content = "", | ||
summary = "", | summary = "", | ||
sections = {} | sections = {}, | ||
categories = {}, | |||
topLevelLeaves = {}, -- i.e. L2 sections with no children | |||
groups = {} -- i.e. L2 sections that have children | |||
} | } | ||
local currentSection = root | local currentSection = root | ||
local cat = nil | |||
-- can't think of a regex to split sections so go line by line | -- can't think of a regex to split sections so go line by line | ||
for line in gsplit( pageContent, '\n' ) do | for line in gsplit( pageContent, '\n' ) do | ||
currentSection, cat = handleLine( line, currentSection ) | |||
if | if cat and cat ~= "Listings" then root.categories[#root.categories + 1] = cat end | ||
end | |||
-- split sections into top-level items and groups with second-level items | |||
for _, section in ipairs( root.sections ) do | |||
if #section.sections > 0 then | |||
root.groups[#root.groups + 1] = section | |||
else | |||
root.topLevelLeaves[#root.topLevelLeaves + 1] = section | |||
end | end | ||
end | end | ||
Line 105: | Line 129: | ||
p.debugFrame = { | p.debugFrame = { | ||
args = { | args = { | ||
[1] = ' | [1] = 'The Legend of Zelda Locations' | ||
} | } | ||
} | } |