モジュール:Infobox改

出典: 謎の百科事典もどき『エンペディア(Enpedia)』
ナビゲーションに移動 検索に移動

この説明文は 『 モジュール:Infobox改/doc 』 から呼び出されています。
{{Infobox改}}の内部モジュール。

-- https://enpedia.rxy.jp/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Infobox を大幅に改変したもの
local p = {}

-- @param label: string
-- @param style: string
-- @return string
function toHeaderHTML(label, style)
  return '<tr><th colspan="2" style="'..style..'">'..label..'</th></tr>'
end

-- @param onlyLabelTable: { {key: string, style: string} }
-- @return string
function toOnlyLabelHTML(onlyLabelTable)
  local result = ''
  for i = 1, #onlyLabelTable do
    if 0 < #onlyLabelTable[i][1] then
      result = result..'<tr><td colspan="2" style="text-align:center;'..onlyLabelTable[i][2]..'">'..onlyLabelTable[i][1]..'</td></tr>'
    end
  end
  return result
end

-- @param label: string
-- @param data: string
-- @param style: string
-- @return string
function toTwinLabelHTML(label, data, labelstyle, datastyle)
  return '<tr><th style="width:7em;text-align:left;'..labelstyle..'">'..label..'</th><td style="word-break:break-word;'..datastyle..'">'..data..'</td></tr>'
end

-- @param args: Module:Arguments.getArgsの返り値
-- @return function(...: strings): string
function createArgsGetter(args)
  return function(...)
    for _, v in pairs({...}) do
      if args[v] then return args[v] end
    end
    return ''
  end
end

function p.main(frame)
  local args = require('Module:Arguments').getArgs(frame, {wrappers = 'Template:Infobox改'})
  local argsGetter = createArgsGetter(args)
  local result = ''
  
  local bodystyle = 'width:300px;border:1px solid #aaa;background:#fff;float:right;clear:right;margin:0 0 1em 1em;font-size:small;'..(args.bodystyle or '')

  titleHTML = ''
  if args.title then
    local titlestyle = 'font-size:125%;font-weight:bold;'..(args.titlestyle or '')
    titleHTML = '<caption style="'..titlestyle..'">'..(args.title or '')..'</caption>'
  end

  headerHTML = ''
  if args.above then
    local headerstyle = 'font-size:125%;'..(args.abovestyle or '')
    headerHTML = toHeaderHTML(args.above or '', headerstyle)
  end

  -- 以下 1行項目ら(前)HTML の作成
  local imgstyle = args.imagestyle or ''
  local capstyle = args.captionstyle or ''
  local labelOnlyBeforesHTML = toOnlyLabelHTML({
    {argsGetter('subheader', 'subheader1'), argsGetter('subheaderstyle', 'subheaderstyle1')},
    {args.subheader2 or '',                 argsGetter('subheaderstyle', 'subheaderstyle2')},
    {argsGetter('image', 'image1'),         imgstyle},
    {args.image2 or '',                     imgstyle},
    {argsGetter('caption', 'caption1'),     capstyle},
    {args.caption2 or '',                   capstyle}
  })
  -- 以上 1行項目ら(前)HTML の作成

  -- 以下 row項目HTML の作成
  local rowHTML = ''
  local row = args.row or args[1] or ''
  local labelstyle = args.labelstyle or ''
  local datastyle = args.datastyle or ''
  row = row:gsub('^%s+', ''):gsub('%s+$', '') -- 前後の空白を削除 trim
  for r in row:gmatch'([^\n]+)\n*' do            -- 改行で区切る split
    if r:find'^!' then
      rowHTML = rowHTML..toHeaderHTML(r:match'^!([^\n]+)' or '', args.headerstyle or '')
    else
      local label, split, data = r:match'([^\n]+) (-) ([^\n]+)'
      if split ~= nil and 0 < #split then
        rowHTML = rowHTML..toTwinLabelHTML(label, data, labelstyle, datastyle)
      else
      	label, split = r:match'([^\n]+) (-)'
      	-- データラベル対指定のラベルがない場合、その行の挿入自体を拒否
        rowHTML = rowHTML..toOnlyLabelHTML({{split and '' or r, datastyle}})
      end
    end
  end
  -- 以上 row項目HTML の作成

  -- 以下 1行項目ら(後)HTML の作成
  local labelOnlyAfters = {{args.below or '', args.belowstyle or ''}}
  local name = argsGetter('name', 'tnavbar')
  if name ~= '' then
    local processedName = frame:preprocess('{{Tnavbar|'..name..'|plain=1}}')
    table.insert(labelOnlyAfters, {processedName, 'text-align:right;'})
  end
  local labelOnlyAftersHTML = toOnlyLabelHTML(labelOnlyAfters)
  -- 以上 1行項目ら(後)HTML の作成

  return '<table class="infobox" style="'..bodystyle..'">'..titleHTML..headerHTML..labelOnlyBeforesHTML..rowHTML..labelOnlyAftersHTML..'</table>'
end

return p