Modul:Valuta
Hopp til navigering
Hopp til søk
Dokumentasjon for denne modulen kan opprettes på Modul:Valuta/dok
--- Class for handling valuta entries local mt = {} local Valuta = setmetatable( {}, mt ) --- Fast lookup of all entities known to the lib local entitiesById = {} local idByCode = mw.loadData( 'Module:Valuta/data' ) --- The local language local contentLanguage = mw.getContentLanguage() --- Lookup of missing class members function Valuta:__index( key ) -- luacheck: no self return Valuta[key] end local validEntityTypes = {} validEntityTypes['item'] = true local validSchemaVersion = {} validSchemaVersion[2] = true function assertEntity( entity ) assert( entity ) assert( entity.id) assert( entity.type) assert( entity.schemaVersion ) assert( validSchemaVersion[entity.schemaVersion] ) assert( validEntityTypes[entity.type] ) end function assertEntityId( id ) assert( string.match( id, '^[qQ]%d+$') ) end --- Create a new instance function Valuta.create( ... ) local self = setmetatable( {}, Valuta ) self:_init( ... ) return self end --- Initialize a new instance function Valuta:_init( ... ) self._items = {} for _,arg in ipairs( {...} ) do local tpe = type( arg ) local value = arg if tpe == 'function' then value = arg() tpe = type( value ) end if tpe == 'string' then local id = idByCode[value] assertEntityId( id ) local entity = Valuta.loadEntity( id ) assertEntity( entity ) self.entity = entity elseif tpe == 'table' then assertEntity( value ) local entity = value Valuta.registerEntity( entity, true ) self.entity = entity elseif tpe == 'number' then self.value = value else error() end end return self end function mt.__call( tbl, ... ) return tbl.create( ... ) end function Valuta.registerEntity( entity, noAssert ) assertEntity( entity, noAssert ) local ucEntityId = string.upper( entity.id ) entitiesById[ucEntityId] = entity end function Valuta.loadEntity( entityId, noAssert ) assertEntityId( entityId, noAssert ) local ucEntityId = string.upper( entityId ) local entity = entitiesById[ucEntityId] if not entity then entity = mw.wikibase.getEntity( ucEntityId ) if not entity then return nil end Valuta.registerEntity( entity, true ) end return entity end function Valuta:getValue() return self.value end function Valuta:getBestStatements( propertyId ) return self.entity:getBestStatements( propertyId ) end function Valuta:getSymbolStatements() local claims = self:getBestStatements( 'P5061' ) if #claims == 0 then claims = self:getBestStatements( 'P558' ) end return claims end function Valuta:getSymbols() local rendered = {} for i,v in ipairs( self:getSymbolStatements() ) do rendered[i] = mw.wikibase.renderSnak( v.mainsnak ) end return rendered end function Valuta:getCodeStatements() return self:getBestStatements( 'P498' ) end function Valuta:getCodes() local rendered = {} for i,v in ipairs( self:getCodeStatements() ) do rendered[i] = mw.wikibase.renderSnak( v.mainsnak ) end return rendered end function Valuta:getLabel( lang ) return lang and self.entity:getLabel( lang ) or self.entity:getLabel() end function Valuta:getPriceStatements() local claims = self:getBestStatements( 'P2284' ) return claims end function Valuta:getSitelink( site ) return site and self.entity:getSitelink( site ) or self.entity:getSitelink() end function Valuta:formatTitlestring( lang ) local items = {} local label = self:getLabel( lang ) local symbol = unpack( self:getSymbols() ) if label and symbol then local formatted = string.format( '%s (%s)', label, symbol ) table.insert( items, formatted ) elseif label and not symbol then local formatted = string.format( '%s', label ) table.insert( items, formatted ) elseif not label and symbol then local formatted = string.format( '%s', symbol ) table.insert( items, formatted ) end local value = self:getValue() if value then --local formatted = string.format( '%g', value ) local formatted = contentLanguage:formatNum( value ) if #items > 0 then table.insert( items, ': ' ) end table.insert( items, formatted ) end return table.concat( items, '' ) end function Valuta:formatWikitext( site ) local items = {} local sitelink = self:getSitelink( site ) local code = unpack( self:getCodes() ) if sitelink and code then local formatted = string.format( '[[%s|%s]]', sitelink, code ) table.insert( items, formatted ) elseif sitelink and not code then local formatted = string.format( '[[%s]]', sitelink ) table.insert( items, formatted ) elseif not sitelink and code then local formatted = string.format( '[[%s]]', code ) table.insert( items, formatted ) end local value = self:getValue() if value then local formatted = contentLanguage:formatNum( value ) if #items > 0 then table.insert( items, ' ' ) end table.insert( items, formatted ) end return table.concat( items, '' ) end function Valuta:format( site, lang ) local html = mw.html.create( 'span' ) :addClass( 'note' ) :addClass( 'nowrap' ) :attr( 'title', self:formatTitlestring( lang ) ) :wikitext( self:formatWikitext( site ) ) return html end function Valuta.isValidCode( code ) return not not idByCode[code] end function Valuta.parse( str ) local items = {} local len = string.len( str ) local index = 1 local first = nil local last = nil local step = 10 local keep = index repeat local valuta = nil keep = index step = step - 1 first, last = string.find( str, '^%s+', index) if first then index = last+1 end first, last = string.find( str, '^[A-Z][A-Z][A-Z] *[0-9%.,]+[0-9]', index) if first then if string.find( string.sub( str, -1 ), '[%.,]' ) then last = last - 1 end local code = string.sub( str, first, first+2 ) local value = contentLanguage:parseFormattedNumber( string.sub( str, first+3, last ) ) if value and Valuta.isValidCode( code ) then valuta = Valuta.create( code, value ) end end if valuta then table.insert( items, string.sub( str, keep, first-1 ) ) table.insert( items, tostring( valuta:format() ) ) else table.insert( items, string.sub( str, keep, keep ) ) end index = (last or keep)+1 until (index > len) return table.concat( items, '' ) end function Valuta.query( frame ) local valutas = {} if not frame.args[1] then frame = frame:getParent() end for _,v in ipairs( frame.args ) do table.insert( valutas, Valuta.parse( v ) ) end return table.concat( valutas, ', ' ) end return Valuta