Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Please sign up or log in to edit the wiki.

Module:ItemPorts: Difference between revisions

From the Star Citizen Wiki, the fidelity™ encyclopedia
Content deleted Content added
No edit summary
No edit summary
 
(25 intermediate revisions by 2 users not shown)
Line 1: Line 1:
require( 'strict' )
require( 'strict' )
require( 'Module:Mw.html extension' );
require( 'Module:Mw.html extension' )


local ItemPorts = {}
local ItemPorts = {}
Line 12: Line 12:
local config = mw.loadJsonData( MODULE_NAME .. '/config.json' )
local config = mw.loadJsonData( MODULE_NAME .. '/config.json' )


local i18n = require( 'Module:i18n' ):new()
local TNT = require( 'Module:Translate' ):new()
local TNT = require( 'Module:Translate' ):new()


--- Wrapper function for Module:i18n.translate
---
--- @param key string The translation key
--- @return string If the key was not found, the key is returned
local function t( key )
return i18n:translate( key )
end




Line 21: Line 31:
--- @return string If the key was not found in the .tab page, the key is returned
--- @return string If the key was not found in the .tab page, the key is returned
local function translate( key, addSuffix, ... )
local function translate( key, addSuffix, ... )
return TNT:translate( MODULE_NAME .. '/i18n.json', config, key, addSuffix, {...} ) or key
return TNT:translate( MODULE_NAME .. '/i18n.json', config, key, addSuffix, { ... } ) or key
end

--- Utility function to format item size for display
--- TODO: Perhaps this should go into a common module
---
--- @param size any Size(s) to be formatted
--- @return string
local function formatItemSize( size )
-- Range
if type( size ) == 'table' then
if size[ 1 ] == size[ 2 ] or not size[ 1 ] or not size[ 2 ] then
return formatItemSize( size[ 1 ] or size[ 2 ] )
end
return string.format( 'S%d–%d', size[ 1 ], size[ 2 ] )
-- Numerial size
elseif type( size ) == 'number' then
return string.format( 'S%d', size )
end
-- String size (e.g. M, XL)
return size
end
end


Line 30: Line 60:
--- @return table
--- @return table
local function makeSmwQueryObject( page )
local function makeSmwQueryObject( page )
local ignores = config.blocklist_itemport_name or {}
return {

mw.ustring.format(
local itemPortName = t( 'SMW_ItemPortName' )
'[[-Has subobject::' .. page .. ']][[%s::+]]',
local query = {
translate( 'SMW_ItemPortName' )
string.format( '?%s#-=name', itemPortName ),
),
mw.ustring.format( '?%s#-=name', translate( 'SMW_ItemPortName' ) ),
string.format( '?%s#-=display_name', t( 'SMW_ItemPortDisplayName' ) ),
mw.ustring.format( '?%s#-=min_size', translate( 'SMW_ItemPortMinimumSize' ) ),
string.format( '?%s#-=min_size', t( 'SMW_ItemPortMinimumSize' ) ),
mw.ustring.format( '?%s#-=max_size', translate( 'SMW_ItemPortMaximumSize' ) ),
string.format( '?%s#-=max_size', t( 'SMW_ItemPortMaximumSize' ) ),
mw.ustring.format( '?%s#-=equipped_name', translate( 'SMW_EquippedItemName' ) ),
string.format( '?%s#-=equipped_name', t( 'SMW_EquippedItemName' ) ),
mw.ustring.format( '?%s#-=equipped_uuid', translate( 'SMW_EquippedItemUUID' ) ),
string.format( '?%s#-=equipped_size', t( 'SMW_EquippedItemSize' ) ),
string.format( '?%s#-=equipped_uuid', t( 'SMW_EquippedItemUUID' ) ),
mw.ustring.format(
'sort=%s,%s',
string.format( 'sort=%s', itemPortName ),
translate( 'SMW_ItemPortName' ),
'order=asc',
translate( 'SMW_ItemPortMaximumSize' )
),
'order=asc,desc',
'limit=1000'
'limit=1000'
}
}

table.insert( query, 1, string.format(
'[[-Has subobject::' .. page .. ']][[%s::+]]',
itemPortName
) )

for _, portName in ipairs( ignores ) do
table.insert( query, 2, string.format(
'[[%s::!' .. portName .. ']]',
itemPortName
) )
end

--mw.logObject( query, '[ItemPorts] Query SMW with the following parameters' )

return query
end
end


Line 54: Line 97:
--- @return table|nil
--- @return table|nil
function methodtable.getSmwData( self, page )
function methodtable.getSmwData( self, page )
--mw.logObject( self.smwData, 'cachedSmwData' )
-- Cache multiple calls
-- Cache multiple calls
if self.smwData ~= nil then
if self.smwData ~= nil then
return self.smwData
return self.smwData
end
end


local smwData = mw.smw.ask( makeSmwQueryObject( page ) )
local smwData = mw.smw.ask( makeSmwQueryObject( page ) )


if smwData == nil or smwData[ 1 ] == nil then
if smwData == nil or smwData[ 1 ] == nil then
Line 65: Line 109:
end
end


--mw.logObject( smwData, 'getSmwData' )
--mw.logObject( smwData, 'getSmwData' )
self.smwData = smwData
self.smwData = smwData


return self.smwData
return self.smwData
end
end



--- Generates wikitext needed for the template
--- Generates wikitext needed for the template
--- @return string
--- @return string
function methodtable.out( self )
function methodtable.out( self )
local smwData = self:getSmwData( self.page )
local smwData = self:getSmwData( self.page )

if smwData == nil then
if smwData == nil then
local msg = mw.ustring.format( "No item ports found on '''%s'''.", self.page )
local msg = string.format( t( 'message_error_no_itemports_found' ), self.page )
return require( 'Module:Hatnote' )._hatnote( msg, { icon = 'WikimediaUI-Error.svg' } )
return require( 'Module:Hatnote' )._hatnote( msg, { icon = 'WikimediaUI-Error.svg' } )
end
end


local containerHtml = mw.html.create( 'div' ):addClass( 'template-itemPorts' )
local containerHtml = mw.html.create( 'div' ):addClass( 'template-itemPorts' )


for _, port in ipairs( smwData ) do
for _, port in ipairs( smwData ) do
local size_text, title
local title, subtitle


-- Use display_name if it is different, so that we use the same key as the game localization
if port.min_size == port.max_size then
if port.display_name and port.display_name ~= port.name and translate( 'itemPort_' .. port.display_name ) ~= 'itemPort_' .. port.display_name then
size_text = mw.ustring.format( 'S%d', port.min_size )
subtitle = translate( 'itemPort_' .. port.display_name )
else
elseif port.name then
size_text = mw.ustring.format( 'S%d–%d', port.min_size, port.max_size )
subtitle = translate( 'itemPort_' .. port.name )
end
end

if port.equipped_name ~= nil then
-- FIXME: Add i18n for N/A
local size_primary, size_secondary
local port_size = formatItemSize( { port.min_size, port.max_size } )
local equipped_size = formatItemSize( port.equipped_size )

if not equipped_size then
size_primary = port_size or 'N/A'
elseif equipped_size == port_size then
size_primary = equipped_size
else
size_primary = equipped_size
size_secondary = port_size
end

if port.equipped_name ~= nil then
if port.equipped_name == '<= PLACEHOLDER =>' then
if port.equipped_name == '<= PLACEHOLDER =>' then
-- TODO: Display more specific name by getting the type of the item
-- TODO: Display more specific name by getting the type of the item
title = 'Placeholder item'
title = translate( 'item_placeholder' )
else
else
title = mw.ustring.format( '[[%s]]', port.equipped_name )
title = string.format( '[[%s]]', port.equipped_name )
end
end
else
else
title = translate( 'msg_no_item_equipped' )
title = 'No item equipped'
end
end

local portHtml = mw.html.create( 'div' ):addClass( 'template-itemPort' )
local portHtml = mw.html.create( 'div' ):addClass( 'template-itemPort' )
-- Size
portHtml:tag( 'div' )
portHtml:tag( 'div' )
:addClass( 'template-itemPort-port' )
:addClass( 'template-itemPort-port' )
:IF( size_secondary )
:tag( 'div' )
:addClass( 'template-itemPort-size' )
:tag( 'div' )
:wikitext( size_text )
:addClass( 'template-itemPort-subtitle' )
:wikitext( size_secondary )
portHtml:tag( 'div' )
:done()
:END()
:IF( size_primary )
:tag( 'div' )
:addClass( 'template-itemPort-title' )
:wikitext( size_primary )
:done()
:END()

portHtml:tag( 'div' )
:addClass( 'template-itemPort-item' )
:addClass( 'template-itemPort-item' )
:addClassIf( port.equipped_name, 'template-itemPort-item--hasItem' )
:addClassIf( port.equipped_name, 'template-itemPort-item--hasItem' )
:tag( 'div' )
:tag( 'div' )
:addClass( 'template-itemPort-subtitle' )
:addClass( 'template-itemPort-subtitle' )
:wikitext( port.name )
:wikitext( subtitle )
:done()
:done()
:tag( 'div' )
:tag( 'div' )
:addClass( 'template-itemPort-title' )
:addClass( 'template-itemPort-title' )
:wikitext( title )
:wikitext( title )

containerHtml:node( portHtml )
containerHtml:node( portHtml )
end
end

return tostring( containerHtml ) .. mw.getCurrentFrame():extensionTag{
return mw.getCurrentFrame():extensionTag {
name = 'templatestyles', args = { src = MODULE_NAME .. '/styles.css' }
name = 'templatestyles', args = { src = MODULE_NAME .. '/styles.css' }
} .. tostring( containerHtml )
}
end
end



--- New Instance
--- New Instance
Line 142: Line 210:
return instance
return instance
end
end



--- Parser call for generating the table
--- Parser call for generating the table
function ItemPorts.outputTable( frame )
function ItemPorts.outputTable( frame )
local args = require( 'Module:Arguments' ).getArgs( frame )
local args = require( 'Module:Arguments' ).getArgs( frame )
local page = args[ 1 ] or mw.title.getCurrentTitle().rootText
local page = args[ 1 ] or mw.title.getCurrentTitle().text


local instance = ItemPorts:new( page )
local instance = ItemPorts:new( page )
Line 154: Line 221:
return out
return out
end
end



--- For debugging use
--- For debugging use

Latest revision as of 19:20, 6 November 2024

Module documentation[view][edit][history][purge]
This documentation is transcluded from Module:ItemPorts/doc. Changes can be proposed in the talk page.
Function list
L 22 — t
L 32 — translate
L 41 — formatItemSize
L 61 — makeSmwQueryObject
L 98 — methodtable.getSmwData
L 119 — methodtable.out
L 203 — ItemPorts.new
L 214 — ItemPorts.outputTable
L 228 — ItemPorts.test

require( 'strict' )
require( 'Module:Mw.html extension' )

local ItemPorts = {}

local metatable = {}
local methodtable = {}

metatable.__index = methodtable

local MODULE_NAME = 'Module:ItemPorts'
local config = mw.loadJsonData( MODULE_NAME .. '/config.json' )

local i18n = require( 'Module:i18n' ):new()
local TNT = require( 'Module:Translate' ):new()


--- Wrapper function for Module:i18n.translate
---
--- @param key string The translation key
--- @return string If the key was not found, the key is returned
local function t( key )
    return i18n:translate( key )
end


--- Wrapper function for Module:Translate.translate
---
--- @param key string The translation key
--- @param addSuffix boolean|nil Adds a language suffix if config.smw_multilingual_text is true
--- @return string If the key was not found in the .tab page, the key is returned
local function translate( key, addSuffix, ... )
    return TNT:translate( MODULE_NAME .. '/i18n.json', config, key, addSuffix, { ... } ) or key
end

--- Utility function to format item size for display
--- TODO: Perhaps this should go into a common module
---
--- @param size any Size(s) to be formatted
--- @return string
local function formatItemSize( size )
    -- Range
    if type( size ) == 'table' then
        if size[ 1 ] == size[ 2 ] or not size[ 1 ] or not size[ 2 ] then
            return formatItemSize( size[ 1 ] or size[ 2 ] )
        end
        return string.format( 'S%d–%d', size[ 1 ], size[ 2 ] )
        -- Numerial size
    elseif type( size ) == 'number' then
        return string.format( 'S%d', size )
    end
    -- String size (e.g. M, XL)
    return size
end


--- Creates the object that is used to query the SMW store
---
--- @param page string the item page containing data
--- @return table
local function makeSmwQueryObject( page )
    local ignores = config.blocklist_itemport_name or {}

    local itemPortName = t( 'SMW_ItemPortName' )
    local query = {
        string.format( '?%s#-=name', itemPortName ),
        string.format( '?%s#-=display_name', t( 'SMW_ItemPortDisplayName' ) ),
        string.format( '?%s#-=min_size', t( 'SMW_ItemPortMinimumSize' ) ),
        string.format( '?%s#-=max_size', t( 'SMW_ItemPortMaximumSize' ) ),
        string.format( '?%s#-=equipped_name', t( 'SMW_EquippedItemName' ) ),
        string.format( '?%s#-=equipped_size', t( 'SMW_EquippedItemSize' ) ),
        string.format( '?%s#-=equipped_uuid', t( 'SMW_EquippedItemUUID' ) ),
        string.format( 'sort=%s', itemPortName ),
        'order=asc',
        'limit=1000'
    }

    table.insert( query, 1, string.format(
        '[[-Has subobject::' .. page .. ']][[%s::+]]',
        itemPortName
    ) )

    for _, portName in ipairs( ignores ) do
        table.insert( query, 2, string.format(
            '[[%s::!' .. portName .. ']]',
            itemPortName
        ) )
    end

    --mw.logObject( query, '[ItemPorts] Query SMW with the following parameters' )

    return query
end


--- Queries the SMW Store
--- @return table|nil
function methodtable.getSmwData( self, page )
    --mw.logObject( self.smwData, 'cachedSmwData' )
    -- Cache multiple calls
    if self.smwData ~= nil then
        return self.smwData
    end

    local smwData = mw.smw.ask( makeSmwQueryObject( page ) )

    if smwData == nil or smwData[ 1 ] == nil then
        return nil
    end

    --mw.logObject( smwData, 'getSmwData' )
    self.smwData = smwData

    return self.smwData
end

--- Generates wikitext needed for the template
--- @return string
function methodtable.out( self )
    local smwData = self:getSmwData( self.page )

    if smwData == nil then
        local msg = string.format( t( 'message_error_no_itemports_found' ), self.page )
        return require( 'Module:Hatnote' )._hatnote( msg, { icon = 'WikimediaUI-Error.svg' } )
    end

    local containerHtml = mw.html.create( 'div' ):addClass( 'template-itemPorts' )

    for _, port in ipairs( smwData ) do
        local title, subtitle

        -- Use display_name if it is different, so that we use the same key as the game localization
        if port.display_name and port.display_name ~= port.name and translate( 'itemPort_' .. port.display_name ) ~= 'itemPort_' .. port.display_name then
            subtitle = translate( 'itemPort_' .. port.display_name )
        elseif port.name then
            subtitle = translate( 'itemPort_' .. port.name )
        end

        -- FIXME: Add i18n for N/A
        local size_primary, size_secondary
        local port_size = formatItemSize( { port.min_size, port.max_size } )
        local equipped_size = formatItemSize( port.equipped_size )

        if not equipped_size then
            size_primary = port_size or 'N/A'
        elseif equipped_size == port_size then
            size_primary = equipped_size
        else
            size_primary = equipped_size
            size_secondary = port_size
        end

        if port.equipped_name ~= nil then
            if port.equipped_name == '<= PLACEHOLDER =>' then
                -- TODO: Display more specific name by getting the type of the item
                title = translate( 'item_placeholder' )
            else
                title = string.format( '[[%s]]', port.equipped_name )
            end
        else
            title = translate( 'msg_no_item_equipped' )
        end

        local portHtml = mw.html.create( 'div' ):addClass( 'template-itemPort' )
        -- Size
        portHtml:tag( 'div' )
            :addClass( 'template-itemPort-port' )
            :IF( size_secondary )
            :tag( 'div' )
            :addClass( 'template-itemPort-subtitle' )
            :wikitext( size_secondary )
            :done()
            :END()
            :IF( size_primary )
            :tag( 'div' )
            :addClass( 'template-itemPort-title' )
            :wikitext( size_primary )
            :done()
            :END()

        portHtml:tag( 'div' )
            :addClass( 'template-itemPort-item' )
            :addClassIf( port.equipped_name, 'template-itemPort-item--hasItem' )
            :tag( 'div' )
            :addClass( 'template-itemPort-subtitle' )
            :wikitext( subtitle )
            :done()
            :tag( 'div' )
            :addClass( 'template-itemPort-title' )
            :wikitext( title )

        containerHtml:node( portHtml )
    end

    return mw.getCurrentFrame():extensionTag {
        name = 'templatestyles', args = { src = MODULE_NAME .. '/styles.css' }
    } .. tostring( containerHtml )
end

--- New Instance
---
--- @return table ItemPorts
function ItemPorts.new( self, page )
    local instance = {
        page = page or nil
    }

    setmetatable( instance, metatable )

    return instance
end

--- Parser call for generating the table
function ItemPorts.outputTable( frame )
    local args = require( 'Module:Arguments' ).getArgs( frame )
    local page = args[ 1 ] or mw.title.getCurrentTitle().text

    local instance = ItemPorts:new( page )
    local out = instance:out()

    return out
end

--- For debugging use
---
--- @param page string page name on the wiki
--- @return string
function ItemPorts.test( page )
    local instance = ItemPorts:new( page )
    local out = instance:out()

    return out
end

return ItemPorts