Module:OmegaMap

From Omega Wiki
Revision as of 03:28, 24 July 2026 by OmegaWiki seed importer (talk | contribs) (Refresh OmegaWiki seed content)
Jump to navigation Jump to search

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

local p = {}
local maps = {
  remake = {
    { text='###########', locations={ [3]={target='Locations/Harbor', label='Harbor', zh='港口', char='H', class='cyan'} } },
    { text='#.........#', locations={} },
    { text='#..@......#', locations={ [4]={target='Locations/Town', label='Town', zh='城镇', char='T', class='yellow'} } },
    { text='#.........#', locations={} },
    { text='###########', locations={} },
  },
  classic = {
    { text='#########', locations={ [3]={target='Classic:Locations/Harbor', label='Harbor', zh='港口', char='H', class='cyan'} } },
    { text='#.......#', locations={} },
    { text='#..@....#', locations={ [4]={target='Classic:Locations/Town', label='Town', zh='城镇', char='T', class='yellow'} } },
    { text='#########', locations={} },
  },
}

function p.render(frame)
  local edition = frame.args.edition or (mw.title.getCurrentTitle().namespace == 3002 and 'classic' or 'remake')
  local map = maps[edition] or maps.remake
  local root = mw.html.create('div'):addClass('omega-map-layout')
  local mapNode = root:tag('div')
    :addClass('omega-map')
    :attr('role', 'group')
    :attr('aria-label', edition .. ' map')
  local locations = {}
  for _, line in ipairs(map) do
    local rowNode = mapNode:tag('div'):addClass('omega-map-row')
    for col = 1, #line.text do
      local char = line.text:sub(col, col)
      local location = line.locations[col]
      if location then
        local target = tostring(mw.uri.localUrl(location.target))
        rowNode:tag('a')
          :addClass('omega-color-' .. location.class)
          :attr('href', target)
          :attr('title', location.label .. ' (' .. location.zh .. ')')
          :attr('aria-label', location.label .. ' (' .. location.zh .. ')')
          :wikitext(mw.text.nowiki(location.char))
        locations[#locations+1] = {
          target = target,
          label = location.label,
          zh = location.zh,
        }
      else
        rowNode:wikitext(mw.text.nowiki(char))
      end
    end
  end

  local directory = root:tag('div')
    :addClass('omega-map-directory')
    :attr('role', 'navigation')
    :attr('aria-label', 'Locations')
  local list = directory:tag('ol')
  for _, location in ipairs(locations) do
    local item = list:tag('li')
    item:tag('a')
      :attr('href', location.target)
      :wikitext(mw.text.nowiki(location.label))
    item:wikitext(' ')
    item:tag('span')
      :attr('lang', 'zh-Hans')
      :wikitext(mw.text.nowiki(location.zh))
  end

  return tostring(root)
end
return p