Module:Listing: Difference between revisions

From Zelda Dungeon Wiki
Jump to navigation Jump to search
Want an adless experience? Log in or Create an account.
(proof-of-concept parser for listing pages. may or may not decide to use this to generate navboxes)
 
(quick demo that outputs a basic list)
Line 1: Line 1:
local p = {}
local p = {}


function p.getSections( pageContent )
function p._parseListing( pageName )
  local pageContent = mw.title.new( pageName ):getContent()
   local currentSection = {
   local currentSection = {
     level = 1,
     level = 1,
     name = "", -- TODO page name (change args to take pagename and get the content in this function)
     name = pageName,
     content = "",
     content = "",
     summary = "",
     summary = "",
Line 47: Line 48:
   return currentSection
   return currentSection
end
end
function p.bullets( frame )
  local listing = p._parseListing( frame.args[1] )
  local bullets = mw.html.create( 'ul' )
  for _, section in ipairs( listing.sections ) do
    local sublist = bullets:tag( 'li' )
      :wikitext( section.name )
      :tag( 'ul' )
    for _, subsection in ipairs( section.sections ) do
      sublist:tag( 'li' ):wikitext( subsection.name )
    end
  end
  return tostring( bullets )
end
p.debugFrame = {
  args = {
    [1] = 'User:Locke/Sandbox/Listing'
  }
}


p.debugContent = [[
p.debugContent = [[

Revision as of 04:05, July 24, 2020

Documentation for this module may be created at Module:Listing/doc

local p = {}

function p._parseListing( pageName )
  local pageContent = mw.title.new( pageName ):getContent()
  local currentSection = {
    level = 1,
    name = pageName,
    content = "",
    summary = "",
    sections = {}
  }

  -- can't think of a regex to split sections so go line by line
  for line in mw.text.gsplit( pageContent, '\n' ) do
    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 = {}
      }

      -- find the right parent and insert
      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
  end

  -- navigate back to the root to return
  while currentSection.parent do
    currentSection = currentSection.parent
  end
  return currentSection
end

function p.bullets( frame )
  local listing = p._parseListing( frame.args[1] )
  local bullets = mw.html.create( 'ul' )
  for _, section in ipairs( listing.sections ) do
    local sublist = bullets:tag( 'li' )
      :wikitext( section.name )
      :tag( 'ul' )
    for _, subsection in ipairs( section.sections ) do
      sublist:tag( 'li' ):wikitext( subsection.name )
    end
  end
  return tostring( bullets )
end

p.debugFrame = {
  args = {
    [1] = 'User:Locke/Sandbox/Listing'
  }
}

p.debugContent = [[
Summary {{Infobox|thing=value}}

== First Section ==
Section 1 summary {{Template|prop=val}}

=== Subsection of First Section ===
Subsection 1 content {{Template|prop=val}}

== Second Section ==
Section 2 summary {{Template|prop=val}}

=== Subsection of Second Section ===
Subsection 2 content {{Template|prop=val}}

{{Cat}}
]]

return p