Module:Info

Wikipedia, ɔnsikopedi hɔrɔn ka nyɛ

local p = {} local lang = 'pt'

local item = nil -- o elemento Wikidata ligado local localdata = {}-- guarda parâmetros passados à predefinição local page = { -- guarda parâmetros da página mostrados na infocaixa

       name = mw.title.getCurrentTitle().prefixedText,
   namespace =  mw.title.getCurrentTitle().namespace

} local maincolor, secondcolor, thirdcolor = '#E1E1E1', '#E1E1E1', '#000000' -- o objecto principal a mostrar local infobox = mw.html.create('div')

-- objetos secundários a mostrar local maintenance = -- cadeia devolvida com o módulo : cats de monitoramento local externaltext = -- para exemplo com coordenadas no título -- modules importados local linguistic = require "Módulo:Linguística" local wd = require 'Módulo:Infobox/Wikidata' local valueexpl = wd.translate("activate-query") local CategorizacaoABeAD = require('Módulo:Categorização AD e AB de outras wikis') local i18n = {

       ['see doc'] = 'Documentação da predefinição',
       ['edit'] = 'editar',
       ['edit code'] = 'editar código-fonte',
       ['edit item'] = 'editar Wikidata',
       ['tracking cat'] = "!Páginas que utilizam dados no Wikidata",
       ['invalid block type'] = "Bloco de dados inválidos dentro do módulo infobox",
       ['default cat'] = "!Monitoramento das infobox",

}

local function addWikidataCat(prop)

         maintenance = maintenance .. wd.addTrackingCat(prop)

end

local function expandQuery(query)

         local value, number -- valor a mostrar, nome dos valores para o rótulo
       if not query.entity then
               query.entity = localdata.item
       end
       if not query.conjtype then
               query.conjtype = 'new line'
       end
       local claims = wd.getClaims(query)
                 if (not claims) then
              return nil
       end
       return wd.formatAndCat(query), #claims -- para acordo do plural

end

local function getWikidataValue(params, wikidataparam)

         -- Mostrar o valor Wikidata para o valor, quer no parâmetro "wikidata" ou no parâmetro "property"
       if not localdata.item then
               return nil
       end
       if params.blockers then -- blockers are local parameters that disable the wikidata query
                 local blockers = params.blockers
              if (type(blockers) == 'string') then
                     blockers = {blockers}
              end
              for i, blocker in ipairs(blockers) do
                     if localdata[blocker] then
                                  return nil
                  end
              end
       end
       local v, valnum -- o valor a retornar e o número de valores (para concordância gramatical)

   if not wikidataparam then -- por padrão o valor wikidata está no parâmetro "wikidata" mas nas estruturas compostas como "title", existem vários parâmetros wikidata
              wikidataparam = 'wikidata'
       end
       if params[wikidataparam] then
              if type(params[wikidataparam]) == 'function' then
                      v, valnum = params[wikidataparam](localdata.item)
           elseif type(params[wikidataparam]) == 'table' then
                          v, valnum = expandQuery(params[wikidataparam])
           else
           v, valnum = params[wikidataparam]
           end
       end
       if not v then
               return nil
       end
       --v = linguistic.ucfirst(v)
       return v, valnum

end

local function getValue(val, params)

         if type(val) == 'string' then
              return localdata[val]
       elseif type(val) == 'function' then
              return val(localdata, localdata.item, params)
       elseif type(val) == 'table' then
              for i, j in pairs(val) do -- se vários parâmetros possíveis (legado do código antigo), tomar o primeiro não-vazio
                         if localdata[j] then
                                   return localdata[j]
                     end
              end
       end

end

local function addMaintenanceCat(cat, sortkey)

         if page.namespace ~= 0 then
              return 
       end
       if cat then
       maintenance = maintenance .. 
       end

end

function p.separator(params)

       local style = params['estilo separador'] or {}
       style.height = style.height or '2px'
       style['background-color'] = style['background-color'] or maincolor

   return mw.html.create('hr'):css( style )

end

function p.buildtitle(params)

       local text = getValue(params.value, params) or params.textdefaultvalue or  getWikidataValue(params) or mw.title.getCurrentTitle().text
   local subtext = getValue(params.subtitle) or  getWikidataValue(params, 'wikidatasubtitle') or params.subtitledefaultvalue
   if subtext and (subtext ~= text) then
             text = text .. '
' .. subtext .. '' end local style = { border = 'none', ['text-align'] = 'center', ['font-size'] = '1.3em', padding = '0', display = 'table', height = '45px', width = '100%', ['*height'] = 'auto', -- be kind ie7 ['*padding'] = '12px 0', } local style2 = { display = 'table-cell', ['vertical-align'] = 'middle', padding = '3px', } local icon = params.icon or if icon ~= and not params.large then icon = ' ' .. icon else -- style.padding = '12px' icon = " " end local class = 'topo' .. icon -- overwrites with those provided in the module -- local style = {} style['background-color'] = maincolor style['color'] = thirdcolor if params.style then for i, j in pairs(params.style) do style[i] = j end end local title = mw.html.create('div') :addClass(class) :css(style) :tag('div') :css(style2) :wikitext(text) :allDone() return title

end p.buildTitle = p.buildtitle

function p.buildnavbox(params)

   -- definição do estilo
       local class = "navbox " .. (params.class or )
       local style = params.style or {['overflow'] = 'hidden'}
       if params.separated then -- opções para adicionar uma linha de separação acima
              class = class .. ' bordered'
           style['border-top'] = '1px solid' .. maincolor
       end
       -- ajuste de parâmetros de dados
       params.previousval = params.previousval or params.previousparameter -- nome do parâmetro obsoleto
       params.nextval = params.nextval or params.nextparameter

   if params.previousproperty then
              params.previouswikidata = {property = params.previousproperty}
       end
       if params.nextproperty then
              params.nextwikidata = {property = params.nextproperty}
       end

   local previousval = getValue(params.previousval, params) or getWikidataValue(params, 'previouswikidata')
       local nextval = getValue(params.nextval, params) or getWikidataValue(params, 'nextwikidata')

   local navbox
       if params.inner then -- para quem está dentro de uma tabela
              navbox = mw.html.create('tr'):tag('th'):attr('colspan', 2)
           style['font-weight'] = style['font-weight'] or 'normal'
       else
       navbox = mw.html.create('div')
       end

   navbox
   :css({['background-color'] = '#E6E6E6'})
       :addClass(class)
       -- :css(style)
       :css{border = '2px ' .. maincolor, ['font-weight'] = 'normal'}
       :tag('div')
       :addClass('prev_bloc')
       :wikitext(previousval)
       :done()
       :tag('div')
       :addClass('next_bloc')
       :wikitext(nextval)
       :done()
       :allDone()
       return navbox

end p.buildNavbox = p.buildnavbox

function p.buildimages(params)

       local images = {}
       local upright, link, caption, alt, size    -- size is deprecated
       if type(params.imageparameters) == 'string' then
               params.imageparameters = {params.imageparameters}
       end
       if not params.imageparameters then -- se não houver nenhum parâmetro de imagem, continue, talvez haja uma imagem padrão definida no módulo de infobox
              params.imageparameters = {}
       end
       for j, k in ipairs(params.imageparameters) do
              table.insert(images, localdata[k])
       end
       -- Images de Wikidata
       if #images == 0 and localdata.item then
          if params.property then
                                params.wikidata = {entity = localdata.item, property = params.property}
           end
           if params.wikidata then
                       local wdq = params.wikidata
                   wdq.excludespecial = true
                   if type(wdq) == 'table' then
                          wdq.entity = wdq.entity or localdata.item
                       wdq.numval = wdq.numval or params.numval or 1
                       images = wd.getClaims(wdq)
               end
               if type(wdq) == 'function' then
                          images = params.wikidata()
                       if type(images) == 'string' then
                       return images
                       end --provavelmente é um erro no pedido => mostrar a mensagem
               end
               if (not images) then
                          images = {}
               end
               if (#images > 0) and (params.wikidata.property) then
                          addWikidataCat(params.wikidata.property)
               end
               if type(images[1]) == 'table' then
                     for i, image in pairs(images) do
                              if image.mainsnak.snaktype ~= 'value' then
                           return
                       end
                       if #images == 1 then -- se apenas uma imagem, usamos a legenda (se mais duas imagens, como formatar?)
                                     caption = wd.getFormattedQualifiers('P18', {qualifier = 'P2096'}, {isinlang = 'pt'})
                       end
                       images[i] = image.mainsnak.datavalue.value
                   end
              end
             end
       end
       -- Imagens por padrao
       if #images == 0 then
              if params.maintenancecat then
                      addMaintenanceCat(params.maintenancecat, params.sortkey)
           end
           if params.defaultimages then
                      images = params.defaultimages
                   if type(images) == 'string' then
                          images = {images}
                   end
                   upright = params.defaultimageupright
                   caption = params.defaultimagecaption
                   link = params.defaultimagelink
                   alt = params.defaultimagealt
                   if not alt and ( images[1] == 'Padrao.svg' or images[1] == 'Padrao 2.svg' ) then
                           alt = 'uma ilustração licenciada gratuita seria bem-vinda'
                   end
           end
       end
       if #images == 0 then
              return nil
       end

   upright = upright or getValue(params.uprightparameter) or params.defaultupright or "1" -- 1.2 deixa uma margem
       link = link or getValue(params.linkparameter) or params.defaultlink
       caption = caption or getValue(params.captionparameter) or params.defaultcaption
       alt = alt or getValue( params.altparameter) or params.defaultalt
       -- tamanho com "size" (obsoleto)
       size = size or getValue(params.sizeparameter) or params.defaultsize or params.tamanho-- deprecated
       if size then
              local numsize = size:gsub('px', )
           numsize = mw.ustring.gsub(numsize, 'x.*', )
           numsize = tonumber(numsize)
           if type(numsize) ~= 'number' or numsize > 280 then
                      addMaintenanceCat("tamanho da imagem inválido")
           end
           if tonumber(size) then
                      size = size .. 'px'
           end
           size = '|' .. size
       else
       size = 
       end

   if tonumber(upright) then
              upright = tostring(tonumber(upright) ) / #images
       end
       if tonumber(size) then
              size = tostring(tonumber(size) ) / #images
       end
   local style = params.style or {
                 padding ='2px 0',
       ['text-align'] = 'center',
         ['display'] = 'flex',
         ['justify-content'] = 'space-around',
         ['align-items'] = 'center',
   }
       local styleLegend = params.stylelegend or {
                 ['font-size'] = '0.9em',
         ['text-align'] = 'center',
         ['margin'] = '5px 0 5px 0',
       }
   -- Imagem da peça
       local imagesString = 
       for i,image in pairs(images) do
               if image == '-' then
                      return
           end
           imagesString = imagesString ..      'upright=' .. ( 1 / #images ) end imagesString = imagesString .. ''
       end
       local image = mw.html.create('div')
                 :addClass("image")
           :css(style)
           :wikitext(imagesString)
       -- Parte da legenda
       local captionobj
       if caption then
              captionobj = mw.html.create('p')
                   :css(styleLegend)
           :wikitext(caption)
                   :css(params.style or {})
                   :addClass("caption")
                   :done()
       end

       -- separador
          local separator
       if params.separator then
              separator = separator(params)
       end
       return mw.html.create('div')
               :node(image)
               :node(captionobj)
               :node(separator)
               :done()

end p.buildImages = p.buildimages

function p.buildtext(params)

       local class = params.class or 
       local style = {
               ['text-align'] = 'center',
           ['font-weight'] = 'bold'
       }
       if params.style then
              for i, j in pairs(params.style) do
                       style[i] = j
           end
       end
       local text = getValue(params.value, params) or getWikidataValue(params) or params.defaultvalue
       if text == '-' then
              return
       end
       if not text then
               addMaintenanceCat(params.maintenancecat, params.sortkey)
       return nil
       end
       local formattedtext = mw.html.create('p')
               :addClass(class)
           :css(style)
           :wikitext(text)
           :done()
       return formattedtext

end p.buildText = p.buildtext

function p.buildrow(params)

   local class = params.class or 
       local style = params.style or {}
   style['vertical-align'] = 'middle'
   local style2 = {
         ['text-align'] = 'left',
         ['padding-right'] = '10px',
         ['width'] = '8em',
         ['max-width'] = '140px',
         ['word-wrap'] = 'normal',
   }
       local value, number =  getValue(params.value, params)
       if (value == valueexpl) then
               value = nil
           params.wikidata.expl = false
       end
       if (not value) then
              value, number = getWikidataValue(params, 'wikidata')
       end
       if (not value) and (params.property) then
              value, number = expandQuery{ property = params.property, ucfirst = params.ucfirst }
       end
       if not value then
               value = params.defaultvalue
       end
       if value == '-' then
               return nil
       end
       if not number then
               number = 0 -- == indefinido
       end
       if not value then
               if params.maintenancecat then
                      local maintenancecat = getValue(params.maintenancecat, params)
                   addMaintenanceCat(maintenancecat, params.sortkey)
           end
           return nil
       end
       local label = params.label
       if number > 1 and (params.plurallabel) then
              label = params.plurallabel
       elseif number == 1 and (params.singularlabel) then
               label = params.singularlabel
       end
       if type(label) == 'function' then
              label = label(localdata, localdata.item)
       end
       -- format
       local formattedvalue = mw.html.create('div')
       :wikitext('\n' .. value) -- 'não é necessário quando o valor é uma lista que começa com '*' ou '#'

       if (params.hidden == true)then
               formattedvalue
                   :attr({class="NavContent", background= "none !important", ['padding-top'] = "0 !important", ['padding-bottom']="0 !important", ['border-top']= "1px solid grey !important", ['border-bottom']= "1px solid grey !important", ['margin-left']= "2em !important", ['margin-right']= "2em !important", style="display: none; text-align: left;"})
           formattedvalue = mw.html.create('div')
                       :attr({class="NavFrame", title="[Mostrar]/[Esconder]", style="border: none; padding: 0;"})
                   :node(formattedvalue)
       end
       formattedvalue =  mw.html.create('td')
                  :node(formattedvalue)
                  :allDone()

   local formattedlabel
       if label then
              formattedlabel = mw.html.create('th')
                :attr('scope', 'row')
                :css(style2)
                :wikitext(label)
                :done()
       end
       local row = mw.html.create('tr')
           :attr('scope', 'row')
           :addClass(class)
           :css(style)
           :node(formattedlabel)
           :node(formattedvalue)
           :done()

       return row

end p.buildRow = p.buildrow

function p.buildsuccession(params)

       if not params.value then
               return nil
       end

   --local style = params.style or {}
       --style['text-align'] = style['text-align'] or 'center'
       --style['color'] = style['color'] or '#000000'
       --style['background-color'] = style['background-color'] or '#F9F9F9'

   local rowI = mw.html.create('tr')

   local colspan = '2'
       cellI = mw.html.create('td')
           :attr({colspan = colspan})
               :attr({align = 'center'})

   local styleT = {}
       styleT['background-color'] = 'transparent'
       styleT['width'] = '100%'
       tabC = mw.html.create('table')
           :attr({cellspacing = '0'})
               :addClass('navigation-not-searchable')
               :css(styleT)

   local row = mw.html.create('tr')
       local color = params.color
       local style = {}
       local arrowLeft
       local arrowRight

   if color == 'default' then
              style['background-color'] = '#E6E6E6'
           arrowLeft = '13px|alt=Precedente|link='
           arrowRight = '13px|alt=Precedente|link='
       else
       style['background-color'] = color
           arrowLeft = '13px|alt=Próximo|link='
           arrowRight = '13px|alt=Próximo|link='
       end

   local styleTrans = {}
       styleTrans['background-color'] = '#F9F9F9'

   local values = params.value
       local before = values['before']
       local center = values['center']
       local after = values['after']

   local widthCell = '44%'
       if center then
              widthCenter = '28%'
           widthCell = '29%'
       end

   local formattedbefore
       if before then
              formattedbefore = mw.html.create('td')
                   :attr({valign = 'middle'})
                   :attr({align = 'left'})
                   :attr({width = '5%'})
                   :css(style)
                   :wikitext(arrowLeft)
                   :done()
           row:node(formattedbefore)
           formattedbefore = mw.html.create('td')
                   :attr({width = '1%'})
                   :css(style)
                   :wikitext()
                   :done()
           row:node(formattedbefore)
           formattedbefore = mw.html.create('td')
                   :attr({align = 'left'})
                   :attr({valign = 'middle'})
                   :attr({width = widthCell})
                   :css(style)
                   :wikitext(before)
                   :done()
               row:node(formattedbefore)
       else
       formattedbefore = mw.html.create('td')
                   :attr({valign = 'middle'})
                   :attr({align = 'left'})
                   :attr({width = '5%'})
                   :css(styleTrans)
                   :wikitext()
                   :done()
           row:node(formattedbefore)
           formattedbefore = mw.html.create('td')
                   :attr({width = '1%'})
                   :css(styleTrans)
                   :wikitext()
                   :done()
           row:node(formattedbefore)
           formattedbefore = mw.html.create('td')
                   :attr({align = 'left'})
                   :attr({valign = 'middle'})
                   :attr({width = widthCell})
                   :css(styleTrans)
                   :wikitext()
                   :done()
           row:node(formattedbefore)
       end

   local formattedcenter
       formattedcenter = mw.html.create('td')
           :attr({width = '1%'})
           :css(styleTrans)
           :wikitext()
           :done()
       row:node(formattedcenter)

   if center then
              formattedcenter = mw.html.create('td')
                   :attr({align = 'center'})
                   :attr({valign = 'middle'})
                   :attr({width = widthCenter})
                   :css(style)
                   :wikitext(center)
                   :done()
           row:node(formattedcenter)
           formattedcenter = mw.html.create('td')
                   :attr({width = '1%'})
                   :css(styleTrans)
                   :wikitext()
                   :done()
           row:node(formattedcenter)
       end

   local formattedafter
       if after then
              formattedafter = mw.html.create('td')
                   :attr({align = 'right'})
                   :attr({valign = 'middle'})
                   :attr({width = widthCell})
                   :css(style)
                   :wikitext(after)
                   :done()
           row:node(formattedafter)
           formattedbefore = mw.html.create('td')
                   :attr({width = '1%'})
                   :css(style)
                   :wikitext()
                   :done()
           row:node(formattedbefore)
           formattedafter = mw.html.create('td')
                   :attr({align = 'right'})
                   :attr({valign = 'middle'})
                   :attr({width = '5%'})
                   :css(style)
                   :wikitext(arrowRight)
                   :done()
           row:node(formattedafter)
       else
       formattedafter = mw.html.create('td')
                   :attr({align = 'right'})
                   :attr({valign = 'middle'})
                   :attr({width = widthCell})
                   :css(styleTrans)
                   :wikitext()
                   :done()
           row:node(formattedafter)
           formattedbefore = mw.html.create('td')
                   :attr({width = '1%'})
                   :css(styleTrans)
                   :wikitext()
                   :done()
           row:node(formattedbefore)
           formattedafter = mw.html.create('td')
                   :attr({align = 'right'})
                   :attr({valign = 'middle'})
                   :attr({width = '5%'})
                   :css(styleTrans)
                   :wikitext()
                   :done()
           row:node(formattedafter)
       end

   row:done()
       tabC:node(row)
       tabC:done()
       cellI:node(tabC)
       cellI:done()
       rowI:node(cellI)
       rowI:allDone()

   return rowI

end p.buildSuccession = p.buildsuccession

function p.buildrow1col(params)

   if not params.value then
               return nil
       end

   --local style = params.style or {}
       --style['text-align'] = style['text-align'] or 'center'
       --style['color'] = style['color'] or '#000000'
       --style['background-color'] = style['background-color'] or '#F9F9F9'
       local class = params.class
       local rowcolor
       if params.color == 'secondcolor' then
              rowcolor = secondcolor
       else
       rowcolor = params.color
       end

   local style = {}
       style['padding'] = '4px'
       style['text-align'] = 'center'
       style['background-color'] = rowcolor or '#F9F9F9'
       style['color'] = '#000000'

   local text = params.value
       local colspan ='2'
       local formattedlabel
       formattedlabel = mw.html.create('th')
           :attr({colspan = colspan})
           :css(style)
           :wikitext(text)
           :done()
       local row = mw.html.create('tr')
               :addClass(class)
           :css(style)
           :node(formattedlabel)
           :done()

   return row

end p.buildRow1Col = p.buildrow1col

function p.buildtable(params)

       local tab = mw.html.create('table'):css(params.style or {})
       local rows = params.rows

   -- expand parameters so that we have a list of tables
       local i = 1
       while (i <= #rows) do
                 local l = rows[i]
           if type(l) == 'function' then
                      l = l(localdata, localdata.item)
           end
           if (type(l) == 'table') and (l.type == 'multi') then
                      table.remove(rows, i)
                   for j, row in ipairs(l.rows) do
                              table.insert(rows, i + j - 1, row)
                   end
           elseif type(l) == 'nil' then
                       table.remove(rows, i)
           elseif type(l) ~= 'table' then
                          return error('as linhas da infobox ("rows") devem ser tabelas, e ' .. type(l))
           else
           i = i + 1
           end
       end
       -- CREATE ROW
       local expandedrows = {}
       for k, row in ipairs(rows) do
                  local v = p.buildblock(row)
           if v then
           table.insert(expandedrows, v)
           end
       end
       if (#expandedrows == 0) then
              return nil
       end
       rows = expandedrows
       -- ADD TITLE
       local title
       if params.title or params.singulartitle or params.pluraltitle then
              local text
           if #rows > 1 and params.pluraltitle then
                  text = params.pluraltitle
           elseif #rows == 1 and params.singulartitle then
                      text = params.singulartitle
           else
           text = params.title
           end
           local style = params.titlestyle or {}
           style['font-weight'] = style['font-weight'] or 'bolder'
           style['width'] = style['width'] or '23em'
           style['text-align'] = style['text-align'] or 'center'
           style['line-height'] = style['line-height'] or '1.5'
           style['margin'] = style['margin'] or '0 0 5px 0'
           --style['padding-top'] = style['padding-top'] or '.5em'
           --style['padding-bottom'] = style['padding-bottom'] or '.5em'
           style['color'] = style['color'] or thirdcolor
           style['background-color'] = style['background-color'] or maincolor
       style['max-width'] = style['max-width'] or '300px'
       style['word-wrap'] = style['word-wrap'] or 'break-word'


           local colspan ='2'
           title = mw.html.create('caption')
                     :attr({colspan = colspan})
               :css(style)
               :wikitext(text)
               :done()
    end

   if title then
              tab:node(title)
       end

   for i, j in pairs (rows) do
                  tab:node(j)
       end

   if params.separator then
              local separator = p.separator(params)
           tab:node(separator)
       end
       tab:allDone()
       return tab

end p.buildTable = p.buildtable

function p.buildinvalidblock(args)

       addMaintenanceCat(defaultcat)
       local text = 
       if type(args) ~= 'table' then
              text = "Blocos de infobox devem ser tabelas"
       else
       text = i18n["invalid block type"] .. ' : ' .. (args.type or '??')
       end
       return text

end p.buildInvalidBlock = p.buildinvalidblock

function p.buildmap(params)

       -- configuração de exibição
       local maplist = getValue(params.maps)
       local pointtype = params.pointtype
       local maptype = params.maptype -- escolhe o tipo de mapa mais adequado (alívio, administrativo, etc.)
       if type(maplist) == 'function' then
              maplist = maplist(localdata, localdata.item)
       end
       local width = tonumber(params.largura) or 270 -- 280 padrao f.ajustar
       if width > 280 then
              addMaintenanceCat("!Erro de infobox - imagem muito grande")
           return 'imagem muito grande, a largura deve ser menor ou igual a 280px'
       end
       -- mostrar os dados locais
       local pointtable = {}
       local globe = params.globe
       if params.latitude then
              local lat, long
            if type(params.latitude) == 'function' then
                       lat, long = params.latitude(localdata, localdata.item), params.longitude(localdata, localdata.item)
       else
       lat, long = localdata[params.latitude], localdata[params.longitude]
           end
           if lat then
           table.insert(pointtable, {latitude = lat, longitude = long})
            end
       end
       -- mostrar os dados wikidata
       local function processWDval(claim, displayformat)
                 if not claim then
                      return nil
           end
           local val = wd.formatSnak( claim.mainsnak )
           return {latitude = val.latitude, longitude = val.longitude, globe = val.globe, marker = displayformat.marker}
       end

   local function getWDvals(query)
                 query.excludespecial = true
           query.numval = query.numval or 1
           query.entity = query.entity or localdata.item
           local claims = wd.getClaims(query)
           if (not claims) then
                  return
           end
           for i, claim in ipairs(claims) do
                      claim = processWDval(claim, query)
               table.insert(pointtable, claim)
           end
       end

   if (#pointtable == 0) and localdata.item and params.wikidata and (params.wikidata ~= '-') then
              for i, query in ipairs(params.wikidata) do
                          if type(query) == 'function' then
                          query = query()
                   end
                   if query then
                             getWDvals(query)
                   end
           end
       end

   if (not pointtable) or (#pointtable == 0) then
              return nil
       end

   local newparams = {maplist = maplist, pointtype = pointtype, maptype = maptype, width = width, item = localdata.item, pointtable = pointtable, globe = globe, marker=params.marker, default_zoom=params.default_zoom, ids = params.ids, markercolor = params.markercolor, shapecolor = params.shapecolor }
       if params.params and type(params.params) == 'table' then -- parâmetro adicionais
              for i, j in pairs(params.params) do
                          newparams[i] = j
           end
       end
       return require('Módulo:Mapa').multimap(newparams)

end p.buildMap = p.buildmap

function p.buildexternaltext(params)

   local value = getValue(params.value)
       if value and (type(value) == 'string') then
              externaltext = externaltext .. value
       end

end p.buildExternalText = p.buildexternaltext

function p.buildfooter(params)

       if not params then
                  params = {}
       end

   local class = 'navbar noprint bordered ' .. (params.class or )
       local style = params.style or {['border-width'] = '1px'}
       style['margin-top'] = '5px' -- espaço vertical para o footer
   style['margin-bottom'] = '-0.125em'
       style['border-top'] = style['border-top'] or '1px solid ' .. maincolor
   style['border-bottom'] = '0'
   style['display'] = 'block'
   local backlinkstr = '[' .. tostring( mw.uri.fullUrl( page.name, 'veaction=edit&section=0' ) ) .. ' ' .. i18n['edit'] .. ']'
                 .. ' - [' .. tostring( mw.uri.fullUrl( page.name, 'action=edit&section=0' ) ) .. ' ' .. i18n['edit code'] .. ']'
       local itemlinkstr
       if localdata.item then
              itemlinkstr = '' .. i18n['edit item'] .. ''
       end
       local editstr = backlinkstr
      if itemlinkstr then
               editstr = editstr .. ' - ' .. itemlinkstr
       end
       local editlinkspan =  mw.html.create('span')
                 :css({['text-align'] = "left"})
           :css({['width'] = "23em"})
       --:css({['float'] = "left"})
           :addClass('plainlinks') --?existe
           :wikitext(editstr)
           :done()
       local doclinkstr = '12px|link=' .. localdata.templatename .. '|' .. i18n['see doc'] .. ''
       -- Se esse link nem sempre funcionar, adicione uma variável para o nome da infobox recuperada pelo quadro
       local doclinkspan = mw.html.create('span')
                 :css({['text-align'] = "right"})
           :css({['float'] = "right"})
           :wikitext(doclinkstr)
           :done()

   local footer = mw.html.create('p')
                 :addClass(class)
           :css(style)
           :node(editlinkspan)
           :node(doclinkspan)
       return footer

end p.buildFooter = p.buildfooter

function p.buildblock(block)

       if type(block) == 'function' then
              block = block( localdata )
       end
       local blocktypes = { -- list of functions for block buildings
                 ['invalid'] = p.buildinvalidblock,
           ['external text'] = p.buildexternaltext,
           ['footer'] = p.buildfooter,
           ['images'] = p.buildimages,
           ['map']= p.buildmap,
           ['mixed'] = p.buildrow,
           ['navbox'] = p.buildnavbox,
           ['table'] = p.buildtable,
           ['row'] = p.buildrow,
           ['row1col'] = p.buildrow1col,
           ['succession'] = p.buildnavbox,
           ['text'] = p.buildtext,
           ['title'] = p.buildtitle,
       }
       if type(block) ~= 'table' or (not block.type) or (not blocktypes[block.type]) then
          return blocktypes['invalid'](block)
       end
       return blocktypes[block.type](block)

end p.buildBlock = p.buildblock

function p.build()

   localdata = require( 'Módulo:Infobox/Localdata' )
       item = localdata.item
       -- assign rank to the infobox, "secondary" means special formatting like no displaytitle for coordinates
       local infoboxrank = 'main' -- main infobox of the page, with coordinates displayed in title etc.
       if page.namespace ~= 0 then
              infoboxrank = 'secondary'
       end
       -- if infobox is linked to another item: rank = secondary
       if localdata.item then
              local itemlink = mw.wikibase.sitelink(localdata.item.id)
           local pagetitle = mw.title.getCurrentTitle().text
           if (itemlink or ) ~= pagetitle then
                      infoboxrank = 'secondary'
           end
       end
       localdata.infoboxrank = infoboxrank
       -- load infobox module page
       local moduledata = require('Módulo:Infobox/' .. localdata.modulename)
       moduledata.name = localdata.modulename
       -- defines main color
       maincolor = localdata['cor infobox'] or localdata['caixa de cor'] or moduledata.maincolor or maincolor
       secondcolor =  moduledata.secondcolor or secondcolor
       thirdcolor =  moduledata.thirdcolor or thirdcolor
       if maincolor:match( '^%x%x%x%x%x%x$' ) or maincolor:match( '^%x%x%x$' ) then
              maincolor = '#' .. maincolor
       end

       -- class
       local class = 'infobox_v2'
       if moduledata.class then
           class = class .. ' ' .. moduledata.class
       end

   -- style
       local style = moduledata.style or {} --{'width: 20em; text-align: left; font-size: 88%; max-width: 23em'}
       style['font-size'] = style['font-size'] or '88%'

   -- build infobox
       infobox :addClass(class)
           :attr({cellpadding= "3"})
               :attr({border= "0"})
               :css(style)
       for i, j in pairs( moduledata.parts ) do
                  infobox:node( p.buildblock(j) )
       end
       infobox :node(p.buildfooter(moduledata.footer))
               :done()
       if CategorizacaoABeAD.hasAnyBadge() == '1' then
           maintenance = maintenance .. (CategorizacaoABeAD.badgesCategories())
       end
       return tostring(infobox) .. externaltext, maintenance

end

return p