Difference between revisions of "Module: Coa/core"

From A Wiki of Ice and Fire
Jump to: navigation, search
Line 7: Line 7:
 
   key = mw.ustring.lower(key)  -- make lowercase
 
   key = mw.ustring.lower(key)  -- make lowercase
 
   local patterns = {
 
   local patterns = {
 +
    "^%[%[file:",
 +
    "^%[%[image:",
 +
    "%|.*]]$",
 
     " of ",
 
     " of ",
 
     " the ",
 
     " the ",

Revision as of 00:23, 23 November 2022

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

local getArgs = require('Module:Arguments').getArgs
local data = require('Module:Coa/data')

local p = {}

local function find_key(key)
  key = mw.ustring.lower(key)  -- make lowercase
  local patterns = {
    "^%[%[file:",
    "^%[%[image:",
    "%|.*]]$",
    " of ",
    " the ",
    "^house ",
    "%.png$",
    "%.svg$",
    "%.jpe?g$",
  }
  for _, pattern in pairs(patterns) do  -- remove some words
    key = mw.ustring.gsub(key, pattern, " ")
  end
  key = mw.ustring.gsub(key, "[^a-z]", "")  -- remove all non-letter characters
  return key
end

local function get(key)
  house = data[find_key(key)]
  if house == nil then
    error('"' .. key .. '" is not a valid COA')
  else
    return house
  end
end

local function coa(file, link, text, size, format)
  if format == 'file' then
    return file
  elseif format == 'image' then
    return '[[File:' .. file .. '|' .. size .. '|link=' .. link .. ']]'
  elseif format == 'text' then
    if link == nil or text == nil then
      return '[[File:' .. file .. '|' .. size .. '|link=]]'
    else
      return '[[File:' .. file .. '|' .. size .. '|link=' .. link .. ']] [[' .. link .. '|' .. text .. ']]'
    end
  end
end

local function get_size(size)
  local sizes = {
    xs = '16x18px',
    s = '20x22px',
    m = '32x35px',
    l = '100x110px',
    xl = '250x275px',
    infobox = '50x55px',
  }
  return sizes[size] or sizes['xs']
end

function p.main(frame)
  local args = getArgs(frame)
  local key = args[1]
  if key == nil then
    error("No key given")
  end
  local house = get(key)
  local file = args['file'] or house['file'] or "None.svg"
  local link = args['link'] or house['page'] or ""
  local text = args['text'] or house['name'] or house['page']
  local size = get_size(args['size'] or args[2])
  local format = args['format']
  return coa(file, link, text, size, format)
end

function p.list(frame)
  local t = '{| class="wikitable"'
  for key, house in pairs(data) do
    t = t .. '\n|-\n| <code>' .. key .. '</code> || ' .. coa(
        house['file'] or "None.svg",
        house['page'],
        house['name'] or house['page'],
        '16x18px',
        'text'
    )
  end
  t = t .. '\n|}'
  return t
end

function p.png_list(frame)
  local t = '{| class="wikitable"'
  for key, house in pairs(data) do
    local file = house['file'] or "None.svg"
    if mw.ustring.match(file, "%.svg$") == nil then
      t = t .. '\n|-\n| <code>' .. key .. '</code> || ' .. coa(
          file,
          ":File:" .. file,
          file,
          '100x110px',
          'text'
      )
    end
  end
  t = t .. '\n|}'
  return t
end

return p