sc>FoXFTW KKeine Bearbeitungszusammenfassung |
K (1 Version importiert) |
Aktuelle Version vom 3. September 2023, 08:02 Uhr
Die Dokumentation für dieses Modul kann unter Modul:VehiclePriceTable/Doku erstellt werden
local VehiclePriceTable = {} local metatable = {} local methodtable = {} metatable.__index = methodtable local common = require( 'Module:Common' ) local log = require( 'Module:Log' ) --- Queries the SMW Store --- @return table function methodtable.getSmwData( self ) -- Cache multiple calls if self.smwData ~= nil then return self.smwData end -- name from args or current page -- local subType = self.frameArgs[ 'Typ' ] or 'Raumschiff' local query if self.args[ 1 ] == 'rental' then query = { '[[1 Tag::+]][[Typ::Raumschiff||Typ::Fahrzeug]][[Ort::+]][[Ort::!Levski]]', '?#-=page', '?Name#-=name', '?1 Tag=price_1', '?1 Tag#-n=raw_1', '?3 Tage=price_3', '?3 Tage#-n=raw_3', '?7 Tage=price_7', '?7 Tage#-n=raw_7', '?30 Tage=price_30', '?30 Tage#-n=raw_30', '?Händler#-=vendor', '?Ort#-=position', '?Spielversion#-=version', 'mainlabel=-', 'sort=Name,Ort,Händler', 'order=asc,asc,asc', 'limit=250', } else query = { '[[Kaufbar::wahr]][[Typ::Raumschiff||Typ::Fahrzeug]][[Ort::+]][[Ort::!Levski]]', '?#-=page', '?Name#-=name', '?Preis=price', '?Preis#-n=price_raw', '?Händler#-=vendor', '?Ort#-=position', '?Spielversion#-=version', 'mainlabel=-', 'sort=Name,Ort,Händler', 'order=asc,asc,asc', 'limit=250', } end local data = mw.smw.ask( query ) if data == nil or data[ 1 ] == nil then return nil end self.smwData = data return self.smwData end --- Sorts the table by Position -> Shop --- --- @return table function methodtable.sort( self ) local sorted = {} for _, row in pairs( self.smwData ) do if row.position ~= nil and row.vendor ~= nil then if type( sorted[ row.position ] ) ~= 'table' then sorted[ row.position ] = {} end if type( sorted[ row.position ][ row.vendor ] ) ~= 'table' then sorted[ row.position ][ row.vendor ] = {} end table.insert( sorted[ row.position ][ row.vendor ], row ) end end return sorted end --- Creates the buy table --- --- @param vehicles table --- @return string function methodtable.createTable( self, vehicles ) if #vehicles == 0 then return '' end local currentRow = 1 local table = mw.html.create( 'table' ) :attr( 'class', 'wikitable broadtable sortable' ) :attr( 'style', 'width: 100%') :tag( 'tr' ) :tag( 'th' ) :wikitext( 'Name' ) :done() :tag( 'th' ) :wikitext( 'Preis' ) :done() :tag( 'th' ) :wikitext( 'Spielversion' ) :done() :done() :done() for _, vehicle in pairs( vehicles ) do local trClass = 'row-odd' if currentRow % 2 == 0 then trClass = 'row-even' end currentRow = currentRow + 1 table:tag( 'tr' ) :addClass( trClass ) :tag( 'td' ) :wikitext( string.format( '[[%s]]', vehicle.name ) ) :done() :tag( 'td' ) :attr( 'data-sort-value', vehicle.price_raw ) :wikitext( vehicle.price ) :done() :tag( 'td' ) :wikitext( vehicle.version ) :done() :done() end return table:allDone() end --- Creates the rental table --- --- @param vehicles table --- @return string function methodtable.createRentalTable( self, vehicles ) if #vehicles == 0 then return '' end local currentRow = 1 local table = mw.html.create( 'table' ) :attr( 'class', 'wikitable broadtable sortable' ) :attr( 'style', 'width: 100%') :tag( 'tr' ) :tag( 'th' ) :wikitext( 'Name' ) :done() :tag( 'th' ) :wikitext( '1 Tag' ) :done() :tag( 'th' ) :wikitext( '3 Tage' ) :done() :tag( 'th' ) :wikitext( '7 Tage' ) :done() :tag( 'th' ) :wikitext( '30 Tage' ) :done() :tag( 'th' ) :wikitext( 'Spielversion' ) :done() :done() :done() for _, vehicle in pairs( vehicles ) do local trClass = 'row-odd' if currentRow % 2 == 0 then trClass = 'row-even' end currentRow = currentRow + 1 table:tag( 'tr' ) :addClass( trClass ) :tag( 'td' ) :wikitext( string.format( '[[%s]]', vehicle.name ) ) :done() :tag( 'td' ) :attr( 'data-sort-value', vehicle.raw_1 ) :wikitext( vehicle.price_1 ) :done() :tag( 'td' ) :attr( 'data-sort-value', vehicle.raw_3 ) :wikitext( vehicle.price_3 ) :done() :tag( 'td' ) :attr( 'data-sort-value', vehicle.raw_7 ) :wikitext( vehicle.price_7 ) :done() :tag( 'td' ) :attr( 'data-sort-value', vehicle.raw_30 ) :wikitext( vehicle.price_30 ) :done() :tag( 'td' ) :wikitext( vehicle.version ) :done() :done() end return table:allDone() end --- Outputs the table --- --- @return string function methodtable.make( self ) local data = self:getSmwData() if data == nil then return log.info( 'Konnte keine semantischen Preisdaten laden.' ) end local sorted = self:sort() local out = '' local rental = self.args[ 1 ] == 'rental' local tabber = self.args[ 'output_tabber' ] ~= nil for position, merchants in common.spairs( sorted ) do local format = "=== [[%s]] ===\n" if tabber then format = "|-|%s=\n" end local outerContent = string.format( format, position ) local innerContent = '' for merchant, vehicles in common.spairs( merchants ) do local innerFormat = "%s\n==== [[%s]] ====\n%s" local vehicleTable if rental == true then vehicleTable = tostring( self:createRentalTable( vehicles ) ) else vehicleTable = tostring( self:createTable( vehicles ) ) end if tabber then innerFormat = "%s|-|%s=\n%s" end innerContent = string.format( innerFormat, innerContent, merchant, vehicleTable ) end if tabber then innerContent = mw.getCurrentFrame():extensionTag( 'tabber', innerContent ) end outerContent = string.format( "%s%s", outerContent, innerContent ) out = string.format( "%s\n%s", out, outerContent ) end if tabber then return mw.getCurrentFrame():extensionTag( 'tabber', mw.text.trim( out ) ) end return mw.text.trim( out ) end --- New Instance --- @return table VehiclePriceTable function VehiclePriceTable.new( self, frameArgs ) local instance = { args = frameArgs, } setmetatable( instance, metatable ) return instance end --- Entry for module calls --- --- @return string function VehiclePriceTable.fromArgs( frame ) local args = require( 'Module:Arguments' ).getArgs( frame ) local instance = VehiclePriceTable:new( args ) return instance:make() end return VehiclePriceTable