Editing Module:Navbox

Jump to: navigation, search

Warning: You are not logged in.

Your IP address will be recorded in this page's edit history.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 1: Line 1:
 
--
 
--
-- This module implements {{Navbox}}
+
-- This module will implement {{Navbox}}
 
--
 
--
 
+
 
local p = {}
 
local p = {}
 
+
local navbar = require('Module:Navbar')._navbar
+
local HtmlBuilder = require('Module:HtmlBuilder')
local getArgs -- lazily initialized
+
local Navbar = require('Module:Navbar')
  
 
local args
 
local args
 +
local frame
 
local tableRowAdded = false
 
local tableRowAdded = false
 
local border
 
local border
 
local listnums = {}
 
local listnums = {}
 
+
local function trim(s)
+
function trim(s)
 
     return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
 
     return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
 
end
 
end
  
local function addNewline(s)
+
function addTableRow(tbl)
    if s:match('^[*:;#]') or s:match('^{|') then
+
        return '\n' .. s ..'\n'
+
    else
+
        return s
+
    end
+
end
+
 
+
local function addTableRow(tbl)
+
 
     -- If any other rows have already been added, then we add a 2px gutter row.
 
     -- If any other rows have already been added, then we add a 2px gutter row.
 
     if tableRowAdded then
 
     if tableRowAdded then
 
         tbl
 
         tbl
             :tag('tr')
+
             .tag('tr')
                 :css('height', '2px')
+
                 .css('height', '2px')
                 :tag('td')
+
                 .tag('td')
                    :attr('colspan',2)
+
 
     end
 
     end
 
+
   
 
     tableRowAdded = true
 
     tableRowAdded = true
 +
   
 +
    return tbl.tag('tr')
 +
end
  
     return tbl:tag('tr')
+
 
 +
--
 +
--  Title row
 +
--
 +
function renderTitleRow(tbl)
 +
     if not args.title then return end
 +
 +
    local titleRow = addTableRow(tbl)
 +
   
 +
    if args.titlegroup then
 +
        titleRow
 +
            .tag('th')
 +
                .attr('scope', 'row')
 +
                .addClass('navbox-group')
 +
                .addClass(args.titlegroupclass)
 +
                .cssText(args.basestyle)
 +
                .cssText(args.groupstyle)
 +
                .cssText(args.titlegroupstyle)
 +
                .wikitext(args.titlegroup)
 +
    end
 +
   
 +
    local titleCell = titleRow.tag('th').attr('scope', 'col')
 +
           
 +
    if args.titlegroup then
 +
        titleCell
 +
            .css('border-left', '2px solid #fdfdfd')
 +
            .css('width', '100%')
 +
    end
 +
   
 +
    local titleColspan = 2
 +
    if args.imageleft then titleColspan = titleColspan + 1 end
 +
    if args.image then titleColspan = titleColspan + 1 end
 +
    if args.titlegroup then titleColspan = titleColspan - 1 end
 +
   
 +
    titleCell
 +
        .cssText(args.basestyle)
 +
        .cssText(args.titlestyle)
 +
        .addClass('navbox-title')
 +
        .attr('colspan', titleColspan)
 +
 +
    renderNavBar(titleCell)
 +
 +
    titleCell
 +
        .tag('div')
 +
            .addClass(args.titleclass)
 +
            .css('font-size', '110%')
 +
            .newline()
 +
            .wikitext(args.title)
 
end
 
end
  
local function renderNavBar(titleCell)
+
function renderNavBar(titleCell)
 
     -- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left
 
     -- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left
 
     -- or right to keep the title centered.
 
     -- or right to keep the title centered.
Line 49: Line 91:
 
         -- also no show/hide link, then we need a spacer on the right to achieve the left shift.
 
         -- also no show/hide link, then we need a spacer on the right to achieve the left shift.
 
         if args.state == 'plain' then spacerSide = 'right' end
 
         if args.state == 'plain' then spacerSide = 'right' end
     elseif args.navbar == 'plain' or (not args.name and mw.getCurrentFrame():getParent():getTitle():gsub('/sandbox$', '') == 'Template:Navbox') then
+
     elseif args.navbar == 'plain' or args.navbar == 'off' or (not args.name and (border == 'subgroup' or border == 'child' or border == 'none')) then
 
         -- No navbar. Need a spacer on the left to balance out the width of the show/hide link.
 
         -- No navbar. Need a spacer on the left to balance out the width of the show/hide link.
 
         if args.state ~= 'plain' then spacerSide = 'left' end
 
         if args.state ~= 'plain' then spacerSide = 'left' end
Line 57: Line 99:
 
         if args.state == 'plain' then spacerSide = 'right' end
 
         if args.state == 'plain' then spacerSide = 'right' end
  
         titleCell:wikitext(navbar{
+
         titleCell.wikitext(Navbar.navbar({  
             args.name,
+
             args.name,  
             mini = 1,
+
             mini = 1,  
 
             fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') ..  ';background:none transparent;border:none;'
 
             fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') ..  ';background:none transparent;border:none;'
         })
+
         }))
 
     end
 
     end
 
+
   
 
     -- Render the spacer div.
 
     -- Render the spacer div.
 
     if spacerSide then
 
     if spacerSide then
 
         titleCell
 
         titleCell
             :tag('span')
+
             .tag('span')
                 :css('float', spacerSide)
+
                 .css('float', spacerSide)
                 :css('width', '6em')
+
                 .css('width', '6em')
                 :wikitext(' ')
+
                 .wikitext(' ')
 
     end
 
     end
 
end
 
end
  
--
 
--  Title row
 
--
 
local function renderTitleRow(tbl)
 
    if not args.title then return end
 
 
    local titleRow = addTableRow(tbl)
 
 
    if args.titlegroup then
 
        titleRow
 
            :tag('th')
 
                :attr('scope', 'row')
 
                :addClass('navbox-group')
 
                :addClass(args.titlegroupclass)
 
                :cssText(args.basestyle)
 
                :cssText(args.groupstyle)
 
                :cssText(args.titlegroupstyle)
 
                :wikitext(args.titlegroup)
 
    end
 
 
    local titleCell = titleRow:tag('th'):attr('scope', 'col')
 
 
    if args.titlegroup then
 
        titleCell
 
            :css('border-left', '2px solid #fdfdfd')
 
            :css('width', '100%')
 
    end
 
 
    local titleColspan = 2
 
    if args.imageleft then titleColspan = titleColspan + 1 end
 
    if args.image then titleColspan = titleColspan + 1 end
 
    if args.titlegroup then titleColspan = titleColspan - 1 end
 
 
    titleCell
 
        :cssText(args.basestyle)
 
        :cssText(args.titlestyle)
 
        :addClass('navbox-title')
 
        :attr('colspan', titleColspan)
 
 
    renderNavBar(titleCell)
 
 
    titleCell
 
        :tag('div')
 
            :addClass(args.titleclass)
 
            :css('font-size', '110%')
 
            :wikitext(addNewline(args.title))
 
end
 
  
 
--
 
--
 
--  Above/Below rows
 
--  Above/Below rows
 
--
 
--
 
+
function renderAboveRow(tbl)
local function getAboveBelowColspan()
+
    local ret = 2
+
    if args.imageleft then ret = ret + 1 end
+
    if args.image then ret = ret + 1 end
+
    return ret
+
end
+
 
+
local function renderAboveRow(tbl)
+
 
     if not args.above then return end
 
     if not args.above then return end
 
+
 
     addTableRow(tbl)
 
     addTableRow(tbl)
         :tag('td')
+
         .tag('td')
             :addClass('navbox-abovebelow')
+
             .addClass('navbox-abovebelow')
             :addClass(args.aboveclass)
+
             .addClass(args.aboveclass)
             :cssText(args.basestyle)
+
             .cssText(args.basestyle)
             :cssText(args.abovestyle)
+
             .cssText(args.abovestyle)
             :attr('colspan', getAboveBelowColspan())
+
             .attr('colspan', getAboveBelowColspan())
             :tag('div')
+
             .tag('div')
                 :wikitext(addNewline(args.above))
+
                 .newline()
 +
                .wikitext(args.above)
 
end
 
end
  
local function renderBelowRow(tbl)
+
function renderBelowRow(tbl)
 
     if not args.below then return end
 
     if not args.below then return end
 
+
   
 
     addTableRow(tbl)
 
     addTableRow(tbl)
         :tag('td')
+
         .tag('td')
             :addClass('navbox-abovebelow')
+
             .addClass('navbox-abovebelow')
             :addClass(args.belowclass)
+
             .addClass(args.belowclass)
             :cssText(args.basestyle)
+
             .cssText(args.basestyle)
             :cssText(args.belowstyle)
+
             .cssText(args.belowstyle)
             :attr('colspan', getAboveBelowColspan())
+
             .attr('colspan', getAboveBelowColspan())
             :tag('div')
+
             .tag('div')
                 :wikitext(addNewline(args.below))
+
                 .newline()
 +
                .wikitext(args.below)
 
end
 
end
  
 +
function getAboveBelowColspan()
 +
    local ret = 2
 +
    if args.imageleft then ret = ret + 1 end
 +
    if args.image then ret = ret + 1 end
 +
    return ret
 +
end
 +
 +
 
--
 
--
 
--  List rows
 
--  List rows
 
--
 
--
local function renderListRow(tbl, listnum)
+
function renderListRow(tbl, listnum)
 
     local row = addTableRow(tbl)
 
     local row = addTableRow(tbl)
 
+
   
 
     if listnum == 1 and args.imageleft then
 
     if listnum == 1 and args.imageleft then
 
         row
 
         row
             :tag('td')
+
             .tag('td')
                 :addClass('navbox-image')
+
                 .addClass('navbox-image')
                 :addClass(args.imageclass)
+
                 .addClass(args.imageclass)
                 :css('width', '0%')
+
                 .css('width', '0%')
                 :css('padding', '0px 2px 0px 0px')
+
                 .css('padding', '0px 2px 0px 0px')
                 :cssText(args.imageleftstyle)
+
                 .cssText(args.imageleftstyle)
                 :attr('rowspan', 2 * #listnums - 1)
+
                 .attr('rowspan', 2 * #listnums - 1)
                 :tag('div')
+
                 .tag('div')
                     :wikitext(addNewline(args.imageleft))
+
                     .newline()
 +
                    .wikitext(args.imageleft)
 
     end
 
     end
 
+
 
     if args['group' .. listnum] then
 
     if args['group' .. listnum] then
         local groupCell = row:tag('th')
+
         local groupCell = row.tag('th')
 
+
       
 
         groupCell
 
         groupCell
            :attr('scope', 'row')
+
              .attr('scope', 'row')
            :addClass('navbox-group')
+
              .addClass('navbox-group')
            :addClass(args.groupclass)
+
              .addClass(args.groupclass)
            :cssText(args.basestyle)
+
              .cssText(args.basestyle)
 
+
             
 
         if args.groupwidth then
 
         if args.groupwidth then
             groupCell:css('width', args.groupwidth)
+
             groupCell.css('width', args.groupwidth)
 
         end
 
         end
 
+
         
 
         groupCell
 
         groupCell
             :cssText(args.groupstyle)
+
             .cssText(args.groupstyle)
             :cssText(args['group' .. listnum .. 'style'])
+
             .cssText(args['group' .. listnum .. 'style'])
             :wikitext(args['group' .. listnum])
+
             .wikitext(args['group' .. listnum])
 
     end
 
     end
 
+
   
     local listCell = row:tag('td')
+
     local listCell = row.tag('td')
  
 
     if args['group' .. listnum] then
 
     if args['group' .. listnum] then
 
         listCell
 
         listCell
             :css('text-align', 'left')
+
             .css('text-align', 'left')
             :css('border-left-width', '2px')
+
             .css('border-left-width', '2px')
             :css('border-left-style', 'solid')
+
             .css('border-left-style', 'solid')
 
     else
 
     else
         listCell:attr('colspan', 2)
+
         listCell.attr('colspan', 2)
 
     end
 
     end
 
+
   
     if not args.groupwidth then
+
     if not args.groupwidth then  
         listCell:css('width', '100%')
+
         listCell.css('width', '100%')
 
     end
 
     end
 
+
   
 
     local isOdd = (listnum % 2) == 1
 
     local isOdd = (listnum % 2) == 1
 
     local rowstyle = args.evenstyle
 
     local rowstyle = args.evenstyle
 
     if isOdd then rowstyle = args.oddstyle end
 
     if isOdd then rowstyle = args.oddstyle end
 
+
 
     local evenOdd
 
     local evenOdd
 
     if args.evenodd == 'swap' then
 
     if args.evenodd == 'swap' then
Line 224: Line 222:
 
         if isOdd then evenOdd = args.evenodd or 'odd' else evenOdd = args.evenodd or 'even' end
 
         if isOdd then evenOdd = args.evenodd or 'odd' else evenOdd = args.evenodd or 'even' end
 
     end
 
     end
 
+
   
 
     listCell
 
     listCell
         :css('padding', '0px')
+
         .css('padding', '0px')
         :cssText(args.liststyle)
+
         .cssText(args.liststyle)
         :cssText(rowstyle)
+
         .cssText(rowstyle)
         :cssText(args['list' .. listnum .. 'style'])
+
         .cssText(args['list' .. listnum .. 'style'])
         :addClass('navbox-list')
+
         .addClass('navbox-list')
         :addClass('navbox-' .. evenOdd)
+
         .addClass('navbox-' .. evenOdd)
         :addClass(args.listclass)
+
         .addClass(args.listclass)
         :tag('div')
+
         .tag('div')
             :css('padding', (listnum == 1 and args.list1padding) or args.listpadding or '0em 0.25em')
+
             .css('padding', (listnum == 1 and args.list1padding) or args.listpadding or '0em 0.25em')
             :wikitext(addNewline(args['list' .. listnum]))
+
             .newline()
 +
            .wikitext(args['list' .. listnum])
  
 
     if listnum == 1 and args.image then
 
     if listnum == 1 and args.image then
 
         row
 
         row
             :tag('td')
+
             .tag('td')
                 :addClass('navbox-image')
+
                 .addClass('navbox-image')
                 :addClass(args.imageclass)
+
                 .addClass(args.imageclass)
                 :css('width', '0%')
+
                 .css('width', '0%')
                 :css('padding', '0px 0px 0px 2px')
+
                 .css('padding', '0px 0px 0px 2px')
                 :cssText(args.imagestyle)
+
                 .cssText(args.imagestyle)
                 :attr('rowspan', 2 * #listnums - 1)
+
                 .attr('rowspan', 2 * #listnums - 1)
                 :tag('div')
+
                 .tag('div')
                     :wikitext(addNewline(args.image))
+
                     .newline()
 +
                    .wikitext(args.image)
 
     end
 
     end
 
end
 
end
Line 255: Line 255:
 
--  Tracking categories
 
--  Tracking categories
 
--
 
--
 +
function renderTrackingCategories(builder)
 +
    local frame = mw.getCurrentFrame()
 +
   
 +
    if not frame then return end
 +
   
 +
    local s = frame:preprocess('{{#ifeq:{{NAMESPACE}}|{{ns:10}}|1|0}}{{SUBPAGENAME}}')
 +
    if mw.ustring.sub(s, 1, 1) == '0' then return end -- not in template space
 +
    local subpage = mw.ustring.lower(mw.ustring.sub(s, 2))
 +
    if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end
 +
   
 +
    for i, cat in ipairs(getTrackingCategories()) do
 +
        builder.wikitext('[[Category:' .. cat .. ']]')
 +
    end
 +
end
  
local function needsHorizontalLists()
+
function getTrackingCategories()
 +
    local cats = {}
 +
    if needsHorizontalLists() then table.insert(cats, 'Navigational boxes without horizontal lists') end
 +
    if hasCustomListSpacing() then table.insert(cats, 'Navigational boxes with custom list spacing') end
 +
    if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end
 +
    return cats
 +
end
 +
 
 +
function needsHorizontalLists()
 
     if border == 'child' or border == 'subgroup'  or args.tracking == 'no' then return false end
 
     if border == 'child' or border == 'subgroup'  or args.tracking == 'no' then return false end
 
+
   
     local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist hwrap', 'hlist vcard', 'vcard hlist', 'hlist vevent'}
+
     local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist vcard', 'vcard hlist'}
 
     for i, cls in ipairs(listClasses) do
 
     for i, cls in ipairs(listClasses) do
 
         if args.listclass == cls or args.bodyclass == cls then
 
         if args.listclass == cls or args.bodyclass == cls then
Line 269: Line 291:
 
end
 
end
  
local function hasBackgroundColors()
+
function hasCustomListSpacing()
     return mw.ustring.match(args.titlestyle or '','background') or mw.ustring.match(args.groupstyle or '','background') or mw.ustring.match(args.basestyle or '','background')
+
     return args.liststyle == 'padding: 0.25em 0; line-height: 1.3em;' or  
 +
          args.liststyle == 'padding:0.25em 0; line-height:1.4em; width:auto;' or  
 +
          args.liststyle == 'padding:0.4em 0; line-height:1.4em;'
 
end
 
end
  
local function getTrackingCategories()
+
function hasBackgroundColors()
     local cats = {}
+
     return args.titlestyle or args.groupstyle
    if needsHorizontalLists() then table.insert(cats, 'Navigational boxes without horizontal lists') end
+
    if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end
+
    return cats
+
 
end
 
end
  
local function renderTrackingCategories(builder)
 
    local title = mw.title.getCurrentTitle()
 
    if title.namespace ~= 10 then return end -- not in template space
 
    local subpage = title.subpageText
 
    if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end
 
 
    for i, cat in ipairs(getTrackingCategories()) do
 
        builder:wikitext('[[Category:' .. cat .. ']]')
 
    end
 
end
 
  
 
--
 
--
 
--  Main navbox tables
 
--  Main navbox tables
 
--
 
--
local function renderMainTable()
+
function renderMainTable()
     local tbl = mw.html.create('table')
+
     local tbl = HtmlBuilder.create('table')
         :addClass('nowraplinks')
+
         .attr('cellspacing', 0)
         :addClass(args.bodyclass)
+
        .addClass('nowraplinks')
 
+
         .addClass(args.bodyclass)
 +
           
 
     if args.title and (args.state ~= 'plain' and args.state ~= 'off') then
 
     if args.title and (args.state ~= 'plain' and args.state ~= 'off') then
 
         tbl
 
         tbl
             :addClass('collapsible')
+
             .addClass('collapsible')
             :addClass(args.state or 'autocollapse')
+
             .addClass(args.state or 'autocollapse')
 
     end
 
     end
 
+
     tbl:css('border-spacing', 0)
+
     tbl.css('border-spacing', 0)
 
     if border == 'subgroup' or border == 'child' or border == 'none' then
 
     if border == 'subgroup' or border == 'child' or border == 'none' then
 
         tbl
 
         tbl
             :addClass('navbox-subgroup')
+
             .addClass('navbox-subgroup')
             :cssText(args.bodystyle)
+
             .cssText(args.bodystyle)
             :cssText(args.style)
+
             .cssText(args.style)
 
     else -- regular navobx - bodystyle and style will be applied to the wrapper table
 
     else -- regular navobx - bodystyle and style will be applied to the wrapper table
 
         tbl
 
         tbl
             :addClass('navbox-inner')
+
             .addClass('navbox-inner')
             :css('background', 'transparent')
+
             .css('background', 'transparent')
             :css('color', 'inherit')
+
             .css('color', 'inherit')
 
     end
 
     end
     tbl:cssText(args.innerstyle)
+
     tbl.cssText(args.innerstyle)
 
+
 
     renderTitleRow(tbl)
 
     renderTitleRow(tbl)
 
     renderAboveRow(tbl)
 
     renderAboveRow(tbl)
 
     for i, listnum in ipairs(listnums) do
 
     for i, listnum in ipairs(listnums) do
         renderListRow(tbl, listnum)
+
         renderListRow(tbl, listnum)  
 
     end
 
     end
 
     renderBelowRow(tbl)
 
     renderBelowRow(tbl)
 
+
   
 
     return tbl
 
     return tbl
 
end
 
end
Line 331: Line 343:
 
function p._navbox(navboxArgs)
 
function p._navbox(navboxArgs)
 
     args = navboxArgs
 
     args = navboxArgs
 
+
   
 
     for k, v in pairs(args) do
 
     for k, v in pairs(args) do
 
         local listnum = ('' .. k):match('^list(%d+)$')
 
         local listnum = ('' .. k):match('^list(%d+)$')
Line 337: Line 349:
 
     end
 
     end
 
     table.sort(listnums)
 
     table.sort(listnums)
 
+
 
     border = trim(args.border or args[1] or '')
 
     border = trim(args.border or args[1] or '')
  
Line 344: Line 356:
  
 
     -- render the appropriate wrapper around the navbox, depending on the border param
 
     -- render the appropriate wrapper around the navbox, depending on the border param
     local res = mw.html.create()
+
     local res = HtmlBuilder.create()
 
     if border == 'none' then
 
     if border == 'none' then
         res:node(tbl)
+
         res.node(tbl)
 
     elseif border == 'subgroup' or border == 'child' then
 
     elseif border == 'subgroup' or border == 'child' then
 
         -- We assume that this navbox is being rendered in a list cell of a parent navbox, and is
 
         -- We assume that this navbox is being rendered in a list cell of a parent navbox, and is
Line 352: Line 364:
 
         -- padding being applied, and at the end add a <div> to balance out the parent's </div>
 
         -- padding being applied, and at the end add a <div> to balance out the parent's </div>
 
         res
 
         res
             :wikitext('</div>') -- XXX: hack due to lack of unclosed support in mw.html.
+
             .tag('/div', {unclosed = true})
             :node(tbl)
+
                .done()
             :wikitext('<div>') -- XXX: hack due to lack of unclosed support in mw.html.
+
             .node(tbl)
 +
             .tag('div', {unclosed = true})
 
     else
 
     else
 
         res
 
         res
             :tag('table')
+
             .tag('table')
                 :addClass('navbox')
+
                 .attr('cellspacing', 0)
                 :css('border-spacing', 0)
+
                .addClass('navbox')
                 :cssText(args.bodystyle)
+
                 .css('border-spacing', 0)
                 :cssText(args.style)
+
                 .cssText(args.bodystyle)
                 :tag('tr')
+
                 .cssText(args.style)
                     :tag('td')
+
                 .tag('tr')
                         :css('padding', '2px')
+
                     .tag('td')
                         :node(tbl)
+
                         .css('padding', '2px')
 +
                         .node(tbl)
 
     end
 
     end
 
+
 
     renderTrackingCategories(res)
 
     renderTrackingCategories(res)
 
+
 
     return tostring(res)
 
     return tostring(res)
 
end
 
end
 
+
 
function p.navbox(frame)
 
function p.navbox(frame)
     if not getArgs then
+
     -- ParserFunctions considers the empty string to be false, so to preserve the previous
        getArgs = require('Module:Arguments').getArgs
+
    -- behavior of {{navbox}}, change any empty arguments to nil, so Lua will consider
     end
+
     -- them false too.
     args = getArgs(frame, {wrappers = 'Template:Navbox'})
+
     local args = {}
 +
    local parent_args = frame:getParent().args;
  
     -- Read the arguments in the order they'll be output in, to make references number in the right order.
+
     -- Out of order parsing bug.
     local _
+
     local temp;
     _ = args.title
+
     temp = parent_args.title;
     _ = args.above
+
     temp = parent_args.above;
 
     for i = 1, 20 do
 
     for i = 1, 20 do
         _ = args["group" .. tostring(i)]
+
         temp = parent_args["group" .. tostring(i)];
         _ = args["list" .. tostring(i)]
+
         temp = parent_args["list" .. tostring(i)];
 +
    end   
 +
    temp = parent_args.below;
 +
   
 +
    for k, v in pairs(parent_args) do
 +
        if v ~= '' then
 +
            args[k] = v
 +
        end
 
     end
 
     end
    _ = args.below
 
 
 
     return p._navbox(args)
 
     return p._navbox(args)
 
end
 
end
 
+
 
return p
 
return p
 

Please note that all contributions to The Crowdsourced Resource-Based Economy Knowledgebase are considered to be released under the Creative Commons Zero (Public Domain) (see RBEMWiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

Cancel | Editing help (opens in new window)
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox
Share