Difference between revisions of "Module: Infobox character/name"

From A Wiki of Ice and Fire
Jump to: navigation, search
(Undo revision 284444 by Abjiklam (talk))
(Tag: Undo)
(added nametemplate)
Line 4: Line 4:
 
local br = require('Module:Separated entries').br
 
local br = require('Module:Separated entries').br
 
local roman = require('Module:Roman').main
 
local roman = require('Module:Roman').main
 +
 +
local function split(inputstr, sep)
 +
  sep = sep or '%s'
 +
  local t = {}
 +
  for field, s in mw.ustring.gmatch(inputstr, "([^" .. sep .. "]*)(" .. sep .. "?)") do
 +
    table.insert(t, field)
 +
    if s == "" then
 +
      return t
 +
    end
 +
  end
 +
end
  
 
local function is_empty(s)
 
local function is_empty(s)
    -- This function checks whether a string is empty
+
  -- This function checks whether a string is empty
    return s == nil or s == ''
+
  return s == nil or s == ''
 
end
 
end
  
 
local function generate_arms(arms)
 
local function generate_arms(arms)
    --This function generates small coat of arms icons
+
  --This function generates small coat of arms icons
    return infobox_image({
+
  return infobox_image({
        args = {
+
    args = {
            image = arms,
+
      image = arms,
            size   = '50x55px',
+
      size = '50x55px',
            border = 'no',
+
      border = 'no',
            suppressplaceholder = 'no',
+
      suppressplaceholder = 'no',
        }
+
    }
    })
+
  })
 
end
 
end
  
Line 25: Line 36:
  
 
function p.main(frame)
 
function p.main(frame)
    local args = getArgs(frame)
+
  local args = getArgs(frame)
  
    local fullname = args.name or args.fullname or ""
+
  local template = args.nametemplate or nil
    local title = args.title or ""
+
  local regnalnumber = args.regnalnumber or ""
    local nickname = args.nickname or ""
+
  local lastfirst = yesno(args.lastfirst) -- whether last name comes before first name
    local firstname = args.firstname or ""
 
    local particle = args.particle or ""
 
    local lastname = args.lastname or ""
 
    local epithet = args.epithet or ""
 
    local regnalnumber = args.regnalnumber or ""
 
    local romanregnalnumber = roman({regnalnumber}) or ""
 
    local lastfirst = yesno(args.lastfirst) -- whether last name comes before first name
 
  
    local above
+
  local name_parts = {}
    local core
+
  name_parts.fullname = args.name or args.fullname or ""
    local below
+
  name_parts.title = args.title or ""
     if not is_empty(firstname) then
+
  name_parts.nickname = args.nickname or ""
        above = title
+
  name_parts.firstname = args.firstname or ""
        if not is_empty(lastname) then
+
  name_parts.particle = args.particle or ""
            if lastfirst then
+
  name_parts.lastname = args.lastname or ""
                core = nickname .. ' ' .. lastname .. ' ' .. particle .. ' ' .. firstname .. ' ' .. romanregnalnumber
+
  name_parts.epithet = args.epithet or ""
            else
+
  name_parts.romanregnalnumber = roman({ regnalnumber }) or ""
                core = nickname .. ' ' .. firstname .. ' ' .. romanregnalnumber .. ' ' .. particle .. ' ' .. lastname
+
 
            end
+
  if template == nil then
            below = epithet
+
     if not is_empty(name_parts.firstname) then
 +
      if not is_empty(name_parts.lastname) then
 +
        if lastfirst then
 +
          template = 'title/nickname-lastname-particle-firstname-romanregnalnumber/epithet'
 
         else
 
         else
            core = nickname .. ' ' .. firstname .. ' ' .. epithet
+
          template = 'title/nickname-firstname-romanregnalnumber-particle-lastname/epithet'
 
         end
 
         end
     elseif not is_empty(lastname) then
+
      else
        core = nickname .. ' ' .. title .. ' ' .. particle .. ' ' .. lastname
+
        template = 'title/nickname-firstname-epithet/'
        below = epithet
+
      end
     elseif not is_empty(nickname) then
+
     elseif not is_empty(name_parts.lastname) then
        core = title .. ' ' .. nickname
+
      template = '/nickname-title-particle-lastname/epithet'
        below = epithet
+
     elseif not is_empty(name_parts.nickname) then
     elseif not is_empty(title) then
+
      template = '/title-nickname/epithet'
        core = title
+
     elseif not is_empty(name_parts.title) then
        below = epithet
+
      template = '/title/epithet'
     elseif not is_empty(epithet) then
+
     elseif not is_empty(name_parts.epithet) then
        core = epithet
+
      template = '/epithet/'
     elseif not is_empty(fullname) then
+
     elseif not is_empty(name_parts.fullname) then
        core = fullname
+
      template = '/fullname/'
 +
    end
 +
  end
 +
 
 +
  local above_template, core_template, below_template = unpack(split(template, '/'))
 +
 
 +
  local above = ''
 +
  for _, part in pairs(split(above_template, '-')) do
 +
    if not is_empty(name_parts[part]) then
 +
      above = above .. ' ' .. name_parts[part]
 
     end
 
     end
 +
  end
  
    local above_span = ""
+
  local core = ''
     if not is_empty(above) then
+
  for _, part in pairs(split(core_template, '-')) do
        above_span = mw.html.create('span')
+
     if not is_empty(name_parts[part]) then
        above_span:css('font-size', '80%')
+
      core = core .. ' ' .. name_parts[part]
                  :css('font-weight', 'normal')
 
                  :wikitext(above)
 
 
     end
 
     end
 +
  end
  
    local below_span = ""
+
  local below = ''
     if not is_empty(below) then
+
  for _, part in pairs(split(below_template, '-')) do
        below_span = mw.html.create('span')
+
     if not is_empty(name_parts[part]) then
        below_span:css('font-size', '80%')
+
      below = below .. ' ' .. name_parts[part]
                  :css('font-weight', 'normal')
 
                  :wikitext(below)
 
 
     end
 
     end
 +
  end
  
    local name = br({
+
  local above_span = ""
        tostring(above_span),
+
  if not is_empty(above) then
        core,
+
    above_span = mw.html.create('span')
        tostring(below_span),
+
    above_span:css('font-size', '80%')
    })
+
              :css('font-weight', 'normal')
 +
              :wikitext(above)
 +
  end
  
     local complete_name
+
  local below_span = ""
    -- The module looks different based on the number of arms to display
+
  if not is_empty(below) then
    -- 1) One or two arms
+
    below_span = mw.html.create('span')
    if args.arms or args.arms1 then
+
    below_span:css('font-size', '80%')
        local arms1 = args.arms1 or args.arms
+
              :css('font-weight', 'normal')
        local arms2 = args.arms2 or arms1
+
              :wikitext(below)
        complete_name = mw.html.create('table')
+
  end
        complete_name:css('width', '100%')
+
 
                    :tag('tr'):tag('td'):css('vertical-align', 'top')
+
  local name = br({
                                        :css('text-align', 'left')
+
     tostring(above_span),
                                        :css('width', '50px')
+
    core,
                                        :wikitext(generate_arms(arms1))
+
    tostring(below_span),
                                        :done()
+
  })
                              :tag('td'):css('vertical-align', 'middle')
+
 
                                        :css('text-align', 'center')
+
  local complete_name
                                        :css('padding-bottom', '5px')
+
  -- The module looks different based on the number of arms to display
                                        :wikitext(name)
+
  -- 1) One or two arms
                                        :done()
+
  if args.arms or args.arms1 then
                              :tag('td'):css('vertical-align', 'top')
+
    local arms1 = args.arms1 or args.arms
                                        :css('text-align', 'right')
+
    local arms2 = args.arms2 or arms1
                                        :css('width', '50px')
+
    complete_name = mw.html.create('table')
                                        :wikitext(generate_arms(arms2))
+
    complete_name:css('width', '100%')
 +
                :tag('tr'):tag('td'):css('vertical-align', 'top')
 +
                :css('text-align', 'left')
 +
                :css('width', '50px')
 +
                :wikitext(generate_arms(arms1))
 +
                :done()
 +
                :tag('td'):css('vertical-align', 'middle')
 +
                :css('text-align', 'center')
 +
                :css('padding-bottom', '5px')
 +
                :wikitext(name)
 +
                :done()
 +
                :tag('td'):css('vertical-align', 'top')
 +
                :css('text-align', 'right')
 +
                :css('width', '50px')
 +
                :wikitext(generate_arms(arms2))
 
     -- 2) No arms
 
     -- 2) No arms
    else
+
  else
        complete_name = name
+
    complete_name = name
    end
+
  end
  
    return tostring(complete_name)
+
  return tostring(complete_name)
 
end
 
end
  
 
return p
 
return p

Revision as of 17:43, 11 November 2022

Documentation for this module may be created at Module:Infobox character/name/doc

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local infobox_image = require('Module:InfoboxImage').InfoboxImage
local br = require('Module:Separated entries').br
local roman = require('Module:Roman').main

local function split(inputstr, sep)
  sep = sep or '%s'
  local t = {}
  for field, s in mw.ustring.gmatch(inputstr, "([^" .. sep .. "]*)(" .. sep .. "?)") do
    table.insert(t, field)
    if s == "" then
      return t
    end
  end
end

local function is_empty(s)
  -- This function checks whether a string is empty
  return s == nil or s == ''
end

local function generate_arms(arms)
  --This function generates small coat of arms icons
  return infobox_image({
    args = {
      image = arms,
      size = '50x55px',
      border = 'no',
      suppressplaceholder = 'no',
    }
  })
end

local p = {}

function p.main(frame)
  local args = getArgs(frame)

  local template = args.nametemplate or nil
  local regnalnumber = args.regnalnumber or ""
  local lastfirst = yesno(args.lastfirst) -- whether last name comes before first name

  local name_parts = {}
  name_parts.fullname = args.name or args.fullname or ""
  name_parts.title = args.title or ""
  name_parts.nickname = args.nickname or ""
  name_parts.firstname = args.firstname or ""
  name_parts.particle = args.particle or ""
  name_parts.lastname = args.lastname or ""
  name_parts.epithet = args.epithet or ""
  name_parts.romanregnalnumber = roman({ regnalnumber }) or ""

  if template == nil then
    if not is_empty(name_parts.firstname) then
      if not is_empty(name_parts.lastname) then
        if lastfirst then
          template = 'title/nickname-lastname-particle-firstname-romanregnalnumber/epithet'
        else
          template = 'title/nickname-firstname-romanregnalnumber-particle-lastname/epithet'
        end
      else
        template = 'title/nickname-firstname-epithet/'
      end
    elseif not is_empty(name_parts.lastname) then
      template = '/nickname-title-particle-lastname/epithet'
    elseif not is_empty(name_parts.nickname) then
      template = '/title-nickname/epithet'
    elseif not is_empty(name_parts.title) then
      template = '/title/epithet'
    elseif not is_empty(name_parts.epithet) then
      template = '/epithet/'
    elseif not is_empty(name_parts.fullname) then
      template = '/fullname/'
    end
  end

  local above_template, core_template, below_template = unpack(split(template, '/'))

  local above = ''
  for _, part in pairs(split(above_template, '-')) do
    if not is_empty(name_parts[part]) then
      above = above .. ' ' .. name_parts[part]
    end
  end

  local core = ''
  for _, part in pairs(split(core_template, '-')) do
    if not is_empty(name_parts[part]) then
      core = core .. ' ' .. name_parts[part]
    end
  end

  local below = ''
  for _, part in pairs(split(below_template, '-')) do
    if not is_empty(name_parts[part]) then
      below = below .. ' ' .. name_parts[part]
    end
  end

  local above_span = ""
  if not is_empty(above) then
    above_span = mw.html.create('span')
    above_span:css('font-size', '80%')
              :css('font-weight', 'normal')
              :wikitext(above)
  end

  local below_span = ""
  if not is_empty(below) then
    below_span = mw.html.create('span')
    below_span:css('font-size', '80%')
              :css('font-weight', 'normal')
              :wikitext(below)
  end

  local name = br({
    tostring(above_span),
    core,
    tostring(below_span),
  })

  local complete_name
  -- The module looks different based on the number of arms to display
  -- 1) One or two arms
  if args.arms or args.arms1 then
    local arms1 = args.arms1 or args.arms
    local arms2 = args.arms2 or arms1
    complete_name = mw.html.create('table')
    complete_name:css('width', '100%')
                 :tag('tr'):tag('td'):css('vertical-align', 'top')
                 :css('text-align', 'left')
                 :css('width', '50px')
                 :wikitext(generate_arms(arms1))
                 :done()
                 :tag('td'):css('vertical-align', 'middle')
                 :css('text-align', 'center')
                 :css('padding-bottom', '5px')
                 :wikitext(name)
                 :done()
                 :tag('td'):css('vertical-align', 'top')
                 :css('text-align', 'right')
                 :css('width', '50px')
                 :wikitext(generate_arms(arms2))
    -- 2) No arms
  else
    complete_name = name
  end

  return tostring(complete_name)
end

return p