Actions

Module

MenuData: Difference between revisions

From Dune Awakening DB

mNo edit summary
mNo edit summary
 
(One intermediate revision by the same user not shown)
Line 2: Line 2:


function p.renderJSON(frame)
function p.renderJSON(frame)
  -- Fetch main radial menu items
   local mainRows = mw.ext.externalData.getExternalData({
   local mainRows = mw.ext.externalData.getExternalData({
     source = "externaldb",
     source = "externaldb",
Line 8: Line 9:
   })
   })


  -- Fetch submenu items
   local subRows = mw.ext.externalData.getExternalData({
   local subRows = mw.ext.externalData.getExternalData({
     source = "externaldb",
     source = "externaldb",
Line 14: Line 16:
   })
   })


  -- Group submenu items by category
   local subMap = {}
   local subMap = {}
   for _, sub in ipairs(subRows) do
   for _, sub in ipairs(subRows) do
Line 25: Line 28:
   end
   end


  -- Sort submenus
   for _, list in pairs(subMap) do
   for _, list in pairs(subMap) do
     table.sort(list, function(a, b)
     table.sort(list, function(a, b)
Line 31: Line 35:
   end
   end


  -- Attach submenus to main menu items
   for _, item in ipairs(mainRows) do
   for _, item in ipairs(mainRows) do
     item.subcategories = subMap[item.category] or {}
     item.subcategories = subMap[item.category] or {}
   end
   end


  -- JSON encode the final structure
   local json = mw.text.jsonEncode(mainRows)
   local json = mw.text.jsonEncode(mainRows)


   return frame:extensionTag{
   -- Safely generate <script> element that MediaWiki won’t escape
    name = "script",
  local Html = mw.html
    content = json,
local tag = Html.create('div')
    args = {
  :attr('id', 'radialMenuData')
      id = "radialMenuData",
  :attr('data-type', 'json')
      type = "application/json"
  :addClass('radial-json-data')
    }
  :css('display', 'none')
   }
   :wikitext(json)
 
return tostring(tag)
 
 
end
end


return p
return p

Latest revision as of 00:41, 8 April 2025

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

local p = {}

function p.renderJSON(frame)
  -- Fetch main radial menu items
  local mainRows = mw.ext.externalData.getExternalData({
    source = "externaldb",
    from = "site_radial_menu",
    data = "name=name,icon=icon_url,position=position,category=category,url=link_url"
  })

  -- Fetch submenu items
  local subRows = mw.ext.externalData.getExternalData({
    source = "externaldb",
    from = "site_radial_submenu",
    data = "menu_category=menu_category,name=name,url=link_url,sort_order=sort_order"
  })

  -- Group submenu items by category
  local subMap = {}
  for _, sub in ipairs(subRows) do
    local cat = sub.menu_category
    if not subMap[cat] then subMap[cat] = {} end
    table.insert(subMap[cat], {
      name = sub.name,
      url = sub.url,
      sort_order = tonumber(sub.sort_order) or 0
    })
  end

  -- Sort submenus
  for _, list in pairs(subMap) do
    table.sort(list, function(a, b)
      return a.sort_order < b.sort_order
    end)
  end

  -- Attach submenus to main menu items
  for _, item in ipairs(mainRows) do
    item.subcategories = subMap[item.category] or {}
  end

  -- JSON encode the final structure
  local json = mw.text.jsonEncode(mainRows)

  -- Safely generate <script> element that MediaWiki won’t escape
  local Html = mw.html
local tag = Html.create('div')
  :attr('id', 'radialMenuData')
  :attr('data-type', 'json')
  :addClass('radial-json-data')
  :css('display', 'none')
  :wikitext(json)

return tostring(tag)


end

return p