Wikicesty
cswikivoyage
https://cs.wikivoyage.org/wiki/Hlavn%C3%AD_strana
MediaWiki 1.47.0-wmf.3
first-letter
Média
Speciální
Diskuse
Uživatel
Diskuse s uživatelem
Wikicesty
Diskuse k Wikicestám
Soubor
Diskuse k souboru
MediaWiki
Diskuse k MediaWiki
Šablona
Diskuse k šabloně
Nápověda
Diskuse k nápovědě
Kategorie
Diskuse ke kategorii
TimedText
TimedText talk
Modul
Diskuse k modulu
Podujatie
Diskusia k podujatiu
Modul:VCard
828
1326
22085
20755
2026-05-20T09:32:41Z
LiMr
96
aktualizace na novější verzi
22085
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard&oldid=1775863)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard&oldid=1775863)
-- module variable and administration
local vc = {
moduleInterface = {
suite = 'vCard',
serial = '2026-05-18',
item = 58187507
},
-- table containing parameters fetched from Wikidata
fromWD = {},
-- Wikidata to subtype table
subtypeIds = nil,
-- complete subtype table including Wikidata subtypes
subtypes = {},
-- Added for storing Wikivoyage link
wikivoyageLink = nil
}
-- module import
-- require( 'strict' )
local mi = require( 'Module:Marker utilities/i18n' )
local mu = require( 'Module:Marker utilities' )
local vp = require( 'Module:VCard/Params' ) -- parameter lists
local vi = require( 'Module:VCard/i18n' ) -- parameter translations
local vq = mw.loadData( 'Module:VCard/Qualifiers' ) -- comment tables
local cm = require( 'Module:CountryData2' )
local er -- modules will be loaded later if needed
local hi
local hr
local lg
local lp = require( 'Module:LinkPhone2' )
local vs
local wu = require( 'Module:Wikidata utilities' )
local function addWdClass( key )
return mu.addWdClass( vc.fromWD[ key ] )
end
local function forceFetchFromWikidata( tab )
for key, value in pairs( tab ) do
vp.ParMap[ key ] = true
end
end
-- copying frameArgs parameters to args = vp.ParMap parameters
local function copyParameters( args, show )
local t, value
local exclude = { auto = 1, show = 1, subtype = 1, wikidata = 1 }
local copy = { subtype = 1 }
vp.ParMap.wikidata = args.wikidata
-- force getting data from Wikidata for missing parameters
show.inlineDescription = true -- description with div or span tag
if vp.ParMap.auto == true then
forceFetchFromWikidata( vp.ParWD )
forceFetchFromWikidata( vp.ParWDAdd )
end
-- copying args parameters to vp.ParMap parameters
for key, v in pairs( vi.p ) do
value = args[ key ]
if value then
value, t =
mu.removeCtrls( value, show.inline or key ~= 'description' )
if t then
show.inlineDescription = false
end
if not exclude[ key ] then
if value == '' and key ~= 'type' then
value = 'y'
end
t = mu.yesno( value )
if t then
if vp.ParMap.wikidata ~= '' then
vp.ParMap[ key ] = t == 'y'
else
vp.ParMap[ key ] = ''
end
else
vp.ParMap[ key ] = value
end
end
if copy[ key ] then
vp.ParMap[ key ] = value
end
end
end
return vp.ParMap
end
-- checking subtypes
local function checkSubtypes( args, subtypesTable )
if not mu.isSet( args.subtype ) then
return {}
end
local function aliasToSubtype( alias )
if not vc.subtypeAliases then -- alias to subtype table
vc.subtypeAliases = mu.getAliases( subtypesTable, 'alias' )
end
return vc.subtypeAliases[ alias ]
end
local function subtypeExists( subtype )
return subtypesTable[ subtype ] and subtype or aliasToSubtype( subtype )
end
local subtypes = {}
local invalidSubtypes = {}
local at, count, invalidCount, item
for subtype, v in pairs( mu.split( args.subtype ) ) do
invalidCount = false
count = ''
item = subtype
-- split item from count
at = item:find( ':', 1, true )
if at then
count = tonumber( item:sub( at + 1, #item ) ) or ''
item = mw.text.trim( item:sub( 1, at - 1 ) )
if count == '' then
invalidCount = true -- ':' without count or not a number
else
count = math.floor( count )
if count < 2 then
count = ''
end
end
end
item = subtypeExists( item ) or mu.typeExists( item )
if item then
subtypes[ item ] = count
end
if invalidCount or not item then
table.insert( invalidSubtypes, subtype )
end
end
if #invalidSubtypes > 0 then
mu.addMaintenance( 'unknownSubtype', table.concat( invalidSubtypes, mu.commaSeparator ) )
end
return subtypes
end
local function initialParametersCheck( frame, page )
local country, email, entity, show, t, v, web, wrongQualifier
local frameArgs = mu.checkArguments( frame:getParent().args, vi.p )
-- Using wu.getEntity instead of wu.getEntityId brings a better overall performance
frameArgs.wikidata, entity, wrongQualifier = wu.getEntity( frameArgs.wikidata or '' )
if wrongQualifier then
mu.addMaintenance( 'wrongQualifier' )
end
if mu.isSet( frameArgs.wikidata ) then
mu.addMaintenance( 'wikidata' )
v = mu.yesno( frameArgs.auto or '' )
if v then
vp.ParMap.auto = v == 'y'
else
vp.ParMap.auto = vi.options.defaultAuto
end
else
vp.ParMap.auto = false
end
-- making phone number table
t = {}
for i, key in ipairs( vp.phones ) do
mu.tableInsert( t, frameArgs[ key ] )
end
-- making web addresses table
web = {}
mu.tableInsert( web, frameArgs.url )
email = frameArgs.email or ''
email = email:gsub( ',.*$', '' ) -- first email
mu.tableInsert( web, email )
-- getting country-specific technical parameters
country = cm.getCountryData( entity, t, frameArgs.country, frameArgs.wikidata, web )
if country.fromWD then
mu.addMaintenance( 'countryFromWD' )
end
if country.unknownCountry then
mu.addMaintenance( 'unknownCountry' )
end
if country.cc ~= '' then
country.trunkPrefix = lp.getTrunkPrefix( country.cc )
end
-- for map support
country.extra = mi.map.defaultSiteType
if mu.isSet( country.iso_3166 ) then
country.extra = country.extra .. '_region:' .. country.iso_3166
-- country-specific default show
end
if mu.isSet( country.show ) then
vp.ParMap.show = vp.ParMap.show .. ',' .. country.show
end
-- handling args table
show = mu.getShow( vp.ParMap.show, frameArgs, vp.show )
-- copying frameArgs parameters to args = vp.ParMap parameters
local args = copyParameters( frameArgs, show )
-- alternate local language
if mu.isSet( args.localLang ) then
lg = lg or require( 'Module:Languages' )
args.localLang = args.localLang:lower()
if lg.lngProps[ args.localLang ] then
cm.setLanguageParams( args.localLang, page.lang, country )
else
args.localLang = ''
mu.addMaintenance( 'unknownLanguage' )
end
end
mu.checkStatus( args )
mu.checkStyles( args )
-- checking coordinates and converting DMS to decimal coordinates if necessary
mu.checkCoordinates( args )
mu.checkZoom( args )
-- remove namespace from category
mu.checkCommonsCategory( args )
mu.checkId( args )
for i, param in ipairs( mi.options.parameters ) do
if mu.isSet( args[ param ] ) then
mu.addMaintenance( 'parameterUsed', param )
end
end
args.subtypeAdd = mu.isSet( args.wikidata ) and vp.ParMap.auto
-- getting features manually entered
if mu.isSet( args.subtype ) then
vs = require( 'Module:VCard/Subtypes' )
vc.subtypes = checkSubtypes( args, vs.f )
if mu.isSet( args.wikidata ) then
-- y = fetch additional features from Wikidata
if vc.subtypes.y then
args.subtypeAdd = true
-- n = do not show subtypes fetched from Wikidata
elseif vc.subtypes.n then
args.subtypeAdd = false
end
end
end
if type( args.lastedit ) == 'string' and args.lastedit ~= ''
and not args.lastedit:match( mi.dates.yyyymmdd.p ) then
mu.addMaintenance( 'wrongDate' )
args.lastedit = ''
end
-- check Google Maps customer id
if type( args.googlemaps ) == 'string' and mu.isSet( args.googlemaps ) and
not ( mu.checkLength( args.googlemaps, 14, 20 ) and args.googlemaps:match( '^[1-9]%d+$' ) ) then
mu.addMaintenance( 'wrongGoogleCid' )
args.googlemaps = ''
end
if type( args.googlemaps ) == 'string' and mu.isSet( args.googlemaps ) then
mu.addMaintenance( 'parameterUsed', 'google-maps' )
if mu.isSet( args.wikidata ) then
mu.addMaintenance( 'wdWithGoogleCid' )
end
end
return args, entity, show, country
end
local function getQuantity( value, formatter, page )
local a, u, unit, unitId
if type( value ) == 'number' then
return tostring( value )
elseif value.amount == '0' then
return '0'
else
a = mu.formatNumber( value.amount )
u = ''
unitId = value.unit
unit = cm.getCurrency( unitId )
if mu.isSet( unit ) then
if unit.mul then
a = mu.formatNumber( string.format( '%.2f', -- 2 decimal places
tonumber( value.amount ) * unit.mul ) )
end
if mi.noCurrencyConversion.all or mi.noCurrencyConversion[ unit.iso ] then
unit = mu.makeSpan( cm.getCurrencyFormatter( unitId ),
'voy-currency voy-currency-' .. unit.iso:lower() )
else
er = er or require( 'Module:Exchange rate' )
unit = er.getWrapper( a, unit.iso, '', 2, cm.getCurrencyFormatter )
mu.addMaintenance( 'currencyTooltip' )
end
else
unit = vq.labels[ unitId ]
end
if unit and unit:find( '%s', 1, true ) then
a = mw.ustring.format( unit, a )
elseif unit then
u = unit
elseif mw.wikibase.isValidEntityId( unitId ) then
-- currency code
u = wu.getValue( unitId, mi.properties.iso4217 )
if u == '' then
-- unit symbol
u = wu.getValuesByLang( unitId, mi.properties.unitSymbol, 1,
page.lang )
u = u[ 1 ] or ''
end
if u ~= '' then
mu.addMaintenance( 'unitFromWD' )
else
u = unitId
mu.addMaintenance( 'unknownUnit' )
end
end
if a ~= '' and u ~= '' and formatter ~= '' and
formatter:find( '$1', 1, true ) and formatter:find( '$2', 1, true ) then
a = mw.ustring.gsub( formatter, '($1)', a )
a = mw.ustring.gsub( a, '($2)', u )
else
a = ( u ~= '' ) and a .. ' ' .. u or a
end
end
return a
end
local function getHourModules()
if not hr then
hi = require( 'Module:Hours/i18n' )
hr = require( 'Module:Hours' )
end
end
local function getLabel( id )
local label = id
local tables = { vq.labels }
if hi then
table.insert( tables, hi.dateIds )
end
if type( id ) == 'string' and id:match( '^Q%d+$' ) then
for i, tab in ipairs( tables ) do
if type( tab[ id ] ) == 'string' then
label = tab[ id ]
break
end
end
if label == '' then
return label
elseif label == id then
label = mu.getTypeLabel( id )
end
if label == '' or label == id then
label = wu.getLabel( id ) or ''
if label == '' then
mu.addMaintenance( 'unknownLabel' )
else
mu.addMaintenance( 'labelFromWD' )
end
end
end
return label
end
local function removeStringDuplicates( ar )
local hash = {}
local result = {}
local val
for i = 1, #ar do
val = ar[ i ]
if not hash[ val ] then
table.insert( result, val )
hash[ val ] = 1
end
end
return result
end
-- getting comments for contacts and prizes from Wikidata using tables
local function getComments( statement, properties, args, page )
local comments = {}
local isMobilephone = false
local minAge, maxAge
for i, property in ipairs( properties ) do
local pType = property .. '-type'
if statement[ property ] then
if property == mi.properties.minimumAge then
minAge = getQuantity( statement[ property ][ 1 ], '', page )
elseif property == mi.properties.maximumAge then
maxAge = getQuantity( statement[ property ][ 1 ], '', page )
end
for j, id in ipairs( statement[ property ] ) do
if statement[ pType ] == 'monolingualtext' then
id = id.text
elseif statement[ pType ] == 'time' then
-- getting last date in case of price/fees
id = wu.getDateFromTime( id )
if not mu.isSet( args.asOf ) or args.asOf < id then
args.asOf = id
end
id = ''
elseif type( id ) == 'table' then
id = ''
end
if id == mi.qualifiers.mobilePhone then
isMobilephone = true
else
mu.tableInsert( comments, getLabel( id ) )
end
end
end
end
comments = removeStringDuplicates( comments )
if minAge and maxAge then
mu.tableInsert( comments, mw.ustring.format( mi.texts.fromTo,
minAge:gsub( '(%d+).*', '%1' ), maxAge ) )
elseif minAge then
mu.tableInsert( comments, mw.ustring.format( mi.texts.from, minAge ) )
elseif maxAge then
mu.tableInsert( comments, mw.ustring.format( mi.texts.to, maxAge ) )
end
return table.concat( comments, mu.commaSeparator ), isMobilephone
end
local function getLngProperty( lng, p )
if not mu.isSet( lng ) then
return ''
end
lg = lg or require( 'Module:Languages' )
local item = lg.lngProps[ lng ]
if not item then
local hyphen = lng:find( '-', 1, true )
if hyphen and hyphen > 1 then
item = lg.lngProps[ lng:sub( 1, hyphen - 1 ) ]
end
end
if item then
item = item[ p ]
end
return item or ( p == 'c' and 0 or '' )
end
local function removeTableDuplicates( ar )
local hash = {}
local result = {}
local hashVal
for i, tab in ipairs( ar ) do
hashVal = tab.value .. '#' .. tab.comment
if not hash[ hashVal ] then
table.insert( result, tab )
hash[ hashVal ] = 1
end
end
return result
end
local function mergeComments( ar )
if #ar > 1 then
for i = #ar, 2, -1 do
for j = 1, i - 1, 1 do
if ar[ i ].value == ar[ j ].value and ar[ i ].comment ~= ''
and ar[ j ].comment ~= '' then
ar[ j ].comment = ar[ j ].comment .. '; ' .. ar[ i ].comment
table.remove( ar, i )
break
end
end
end
end
end
local function convertTableWithComment( ar )
for i = 1, #ar, 1 do
if ar[ i ].comment == '' then
ar[ i ] = ar[ i ].value
else
ar[ i ] = ar[ i ].value .. mu.parentheses( ar[ i ].comment )
end
end
end
--[[
properties are defined in Module:vCard/Params
p property or set of properties
f formatter string
c maximum count of results, default = 1
m concat mode (if c > 1), default concat with ', '
v value type,
empty: string value (i.e. default type),
id: string value of an id like Q1234567
idl: string value of the label of an id like Q1234567
il: language-dependent string value
iq: string value with qualifier ids
au: quantity consisting of amount and unit
pau: quantity consisting of amount (for P8733)
vq: string or table value with qualifiers ids and references
l = lang: language dependent
wiki / local: monolingual text by wiki or local language
le = true: use date for lastedit parameter
--]]
-- function returns an array in any case
local function getWikidataValues( args, propDef, entity, page, country )
local ar = {}
local a, isMobilephone, item, id, langs, q, u
-- setting defaults
propDef.v = propDef.v or ''
propDef.f = propDef.f or ''
propDef.c = propDef.c or 1
-- getting value arrays
if propDef.l == 'wiki' then
ar = wu.getValuesByLang( entity, propDef.p, propDef.c, page.lang )
elseif propDef.l == 'local' then
ar = wu.getValuesByLang( entity, propDef.p, propDef.c, country.lang )
elseif propDef.l == 'lang' and propDef.c == 1 then
id = getLngProperty( country.lang, 'q' )
if id == '' then
country.unknownLanguage = true
else
-- using language of work or name ( page.lang, mi.langs, country.lang )
a = wu.getValuesByQualifier( entity, propDef.p, mi.properties.languageOfName, id )
if next( a ) then
langs = mu.getLangTable( page.lang, country.lang )
for i, lang in ipairs( langs ) do
item = a[ getLngProperty( lang, 'q' ) ]
if item then
break
end
end
ar = { item or a[ next( a, nil ) ] } -- fallback: first item
end
end
elseif propDef.v == 'iq' or propDef.v == 'iqa' or propDef.v == 'iqp' then
q = mi.propTable.quantity
if propDef.v == 'iqa' then
q = mi.propTable.accessQuantity
elseif propDef.v == 'iqp' then
q = mi.propTable.policyComments
end
ar = wu.getValuesWithQualifiers( entity, propDef.p, propDef.q, q,
{ mi.properties.retrieved }, propDef.c )
if propDef.le then
args.lastedit = wu.getLastedit( args.lastedit, ar )
end
elseif propDef.v == 'au' or propDef.v == 'vq' then
q = propDef.v == 'au' and mi.propTable.feeComments or
mi.propTable.contactComments
ar = wu.getValuesWithQualifiers( entity, propDef.p, nil, q,
{ mi.properties.retrieved }, propDef.c )
-- maybe a change of nil to a properties table is useful
if propDef.le then
args.lastedit = wu.getLastedit( args.lastedit, ar )
end
else
ar = wu.getValues( entity, propDef.p, propDef.c )
end
if #ar == 0 and propDef.p ~= mi.properties.instanceOf then
return ar
end
for i = #ar, 1, -1 do
-- amount with unit (for fees)
if propDef.v == 'au' then
a = getQuantity( ar[ i ].value, propDef.f, page )
if a == '0' then
a = vq.labels.gratis
end
u = getComments( ar[ i ], mi.propTable.feeComments, args, page )
ar[ i ] = { value = a, comment = u }
-- for number of rooms P8733
elseif propDef.v == 'pau' then
if ar[ i ].unit == '1' then
a = tonumber( ar[ i ].amount ) or 0
else
a = 0
end
ar[ i ] = {}
ar[ i ][ mi.properties.quantity ] = { a }
ar[ i ][ mi.properties.quantity .. '-type' ] = 'quantity'
ar[ i ].value = mi.qualifiers.roomNumber
ar[ i ]['value-type'] = 'wikibase-entityid'
-- qualifier ids (for subtypes)
elseif propDef.v == 'iq' or propDef.v == 'iqa' or propDef.v == 'iqp' then
if ar[ i ][ 'value-type' ] ~= 'wikibase-entityid' then
table.remove( ar, i )
end
if propDef.v == 'iqa' then
ar[ i ].policyComment =
getComments( ar[ i ], mi.propTable.accessibility, args, page )
end
if propDef.v == 'iqp' then
ar[ i ].policyComment =
getComments( ar[ i ], mi.propTable.policyComments, args, page )
end
-- strings with qualifiers (for contacts)
elseif propDef.v == 'vq' then
if ar[ i ][ 'value-type' ] ~= 'string' then
table.remove( ar, i )
else
u, isMobilephone =
getComments( ar[ i ], mi.propTable.contactComments, args, page )
if vi.options.useMobile and propDef.t then
if ( isMobilephone and propDef.t == 'mobile' ) or
( not isMobilephone and propDef.t == 'landline' ) then
ar[ i ] = { value = ar[ i ].value, comment = u }
else
table.remove( ar, i )
end
else
ar[ i ] = { value = ar[ i ].value, comment = u }
end
end
-- value, monolingual text, identifier
else
if propDef.v == 'id' then
ar[ i ] = ar[ i ].id
elseif propDef.v == 'idl' then
getHourModules()
ar[ i ] = hr.formatTime( getLabel( ar[ i ].id ) )
end
if ar[ i ] ~= '' and propDef.f ~= '' then
ar[ i ] = mw.ustring.format( propDef.f, ar[ i ] )
end
end
if propDef.v == 'au' or propDef.v == 'vq' then
if ar[ i ] and ar[ i ].value == '' then
table.remove( ar, i )
end
else
if ar[ i ] == '' then
table.remove( ar, i )
end
end
end
-- cleanup
if propDef.v == 'au' or propDef.v == 'vq' then
ar = removeTableDuplicates( ar )
mergeComments( ar )
convertTableWithComment( ar )
else
ar = removeStringDuplicates( ar )
end
return ar
end
local function getWikidataItem( args, parWDitem, entity, page, country )
local arr = {}
local function singleProperty( propDef )
if #arr == 0 then
arr = getWikidataValues( args, propDef, entity, page, country )
else
for i, value in ipairs( getWikidataValues( args, propDef, entity, page, country ) ) do
table.insert( arr, value ) -- copy to arr
end
end
end
local p = parWDitem
if not p then
return ''
end
p.c = p.c or 1 -- count
local tp = type( p.p )
if tp == 'string' then
singleProperty( p )
elseif tp == 'table' then
for i, sngl in ipairs( p.p ) do
if type( sngl ) == 'table' then
singleProperty( sngl )
if p.c == 1 and #arr > 0 then
break
end
end
end
end
if #arr > p.c then
for i = #arr, p.c + 1, -1 do -- delete supernumerary values
table.remove( arr, i )
end
end
if p.m == 'no' then
return arr
else
return table.concat( arr, p.m or mu.commaSeparator )
end
end
local function getAddressesFromWikidata( args, page, country, entity )
local addresses
local t, u, w, weight
-- getting addresses from Wikidata but only if necessary
if args.address == true or type( args.addressLocal ) == 'boolean' then
-- P6375: address
addresses = wu.getMonolingualValues( entity, mi.properties.streetAddress )
if next( addresses ) then -- sometimes addresses contain <br> tag(s)
for key, value in pairs( addresses ) do
addresses[ key ] = value:gsub( '</*br%s*/*>', mi.texts.space )
end
else
return
end
else
return
end
if args.address == true then
args.address = addresses[ page.lang ]
-- select address if the same writing system is used
if not args.address then
weight = -1
u = getLngProperty( page.lang, 'w' ) -- writing entity id
for key, value in pairs( addresses ) do
-- same writing entity id as page.lang
w = getLngProperty( key, 'w' )
if w == '' then
country.unknownPropertyLanguage = true
else
if key and w == u then -- same writing entity id
w = getLngProperty( key, 'c' ) -- getting language weight
if w > weight then -- compare language weight
args.address = value
args.addressLang = key
weight = w
end
end
end
end
end
if not args.address then
for i, lng in ipairs( mi.langs ) do
if addresses[ lng ] then
args.address = addresses[ lng ]
args.addressLang = lng
break
end
end
end
if not args.address then
args.address = ''
args.addressLang = ''
end
vc.fromWD.address = args.address ~= ''
end
-- removing county name from the end of address
-- same with county name in county language and English
if type( args.address ) == 'string' then
args.address = mw.ustring.gsub( args.address,
'[.,;]*%s*' .. country.country .. '$', '' )
end
t = true
for i, lng in ipairs( mi.langs ) do
if country.lang == lng then
t = false
end
end
-- keeping local address in any case for html data
args.addAddressLocal = addresses[ country.lang ] or ''
if t and args.addressLocal == true
and country.lang ~= page.lang then
if country.lang ~= '' then
args.addressLocal = addresses[ country.lang ] or ''
else
-- unknown language, maybe missing in Module:Languages
args.addressLocal = addresses.unknown or ''
end
vc.fromWD.addressLocal = args.addressLocal ~= ''
end
end
local function getDataFromWikidata( args, page, country, entity )
if args.wikidata == '' then
return
end
mu.getTypeFromWikidata( args, entity )
-- prevent local data if wiki language == country language
if page.lang == country.lang then
for i, value in ipairs( vp.localData ) do
if type( args[ value ] ) == 'boolean' then
args[ value ] = ''
end
end
end
mu.getNamesFromWikidata( args, vc.fromWD, page, country, entity )
-- Uložíme odkaz na Wikicesty, pokud existuje
if entity and entity.sitelinks and entity.sitelinks.cswikivoyage then
vc.wikivoyageLink = entity.sitelinks.cswikivoyage.title
end
getAddressesFromWikidata( args, page, country, entity )
if args.hours == true then
local lastEdit
getHourModules()
if not mu.typeIds then
mu.idToType( 'Q1' ) -- dummy call to create mu.typeIds
end
args.hours, lastEdit = hr.getHoursFromWikidata( entity, page.lang,
mi.langs[ 1 ] or '', mi.maintenance.properties, nil, args.lastedit,
vq.labels, { typeTable = mu.types, idTable = mu.typeIds } )
vc.fromWD.hours = args.hours ~= ''
if vi.options.lasteditHours then
args.lastedit = lastEdit
end
end
for key, value in pairs( vp.ParWD ) do
if args[ key ] == true then
args[ key ] =
getWikidataItem( args, vp.ParWD[ key ], entity, page, country )
vc.fromWD[ key ] = args[ key ] ~= ''
end
end
mu.getArticleLink( args, entity, page )
mu.getCommonsCategory( args, entity )
mu.getCoordinatesFromWikidata( args, vc.fromWD, entity )
end
local function finalParametersCheck( args, show, page, country, defaultType, entity )
-- remove boolean values from parameters to have only strings
for key, value in pairs( args ) do
if type( args[ key ] ) == 'boolean' then
args[ key ] = ''
end
end
-- create givenName, displayName tables
mu.prepareNames( args )
-- analysing addressLocal vs address
if args.addressLang and args.addressLang == country.lang then
args.addressLocal = ''
args.addAddressLocal = ''
end
if args.addressLocal ~= '' and args.address == '' then
args.address =
mu.languageSpan( args.addressLocal, mi.texts.hintAddress, page, country )
args.addressLocal = ''
args.addAddressLocal = ''
vc.fromWD.address = vc.fromWD.addressLocal
end
show.noCoord = args.lat == '' or args.long == ''
if show.noCoord then
show.coord = nil
show.poi = nil
mu.addMaintenance( 'missingCoordVc' )
else
mu.prepareCoordinates( args )
end
-- getting Marker type, group, and color
if not mu.isSet( args.type ) and mu.isSet( defaultType ) then
args.type = defaultType
end
mu.checkTypeAndGroup( args )
-- image check
if not vc.fromWD.image or mi.options.WDmediaCheck then
mu.checkImage( args, entity )
end
mu.checkUrl( args )
args.commonscat = args.commonscat:gsub( ' ', '_' )
-- add final period if not yet exists
if mu.isSet( args.description ) then
if mw.ustring.match( args.description, '[%w_€$]$' ) then
args.description = args.description .. mi.texts.period
end
if mw.ustring.len( args.description ) > mi.options.contentLimit and
mi.options.groupsWithLimit[ args.group ] then
args.description = mw.ustring.sub( args.description, 1, mi.options.contentLimit ) .. '…'
mu.addMaintenance( 'contentTooLong' )
end
end
end
local function formatText( args, results, key, class )
if not mu.isSet( args[ key ] ) then
return
end
local r
local textKey = key
local period = mi.texts.period
if key == 'hours' then
args[ key ], r = mw.ustring.gsub( args[ key ],
mi.texts.closedPattern, '' )
textKey = ( r > 0 ) and 'closed' or key
end
r = mw.ustring.format( mi.texts[ textKey ], args[ key ] )
r = mw.ustring.gsub( r, '^%a', mw.ustring.upper )
-- add period if not yet exists
r = r .. ( mw.ustring.sub( r, -1 ) == period and '' or period )
table.insert( results, mu.makeSpan( r, class .. addWdClass( key ) ) )
end
local function formatPhone( args, key, country )
if not mu.isSet( args[ key ] ) then
return ''
end
local class
local pArgs = {
phone = args[ key ],
cc = country.cc,
isFax = false,
isTollfree = false,
format = false
}
if vc.fromWD[ key ] then
pArgs.format = true
pArgs.size = country.phoneDigits or 2
end
if key == 'fax' then
class = 'voy-listing-fax p-tel-fax fax' .. addWdClass( key )
pArgs.isFax = true
else
class = 'p-tel tel' .. addWdClass( key )
if key == 'tollfree' then
class = 'voy-listing-tollfree ' .. class
pArgs.isTollfree = true
elseif key == 'mobile' then
class = 'voy-listing-mobile ' .. class
else
class = 'voy-listing-phone ' .. class
end
end
return mw.ustring.format( mi.texts[ key ],
mu.makeSpan( lp.linkPhoneNumbers( pArgs ), class ) )
end
local function formatDate( aDate, aFormat )
return mw.getContentLanguage():formatDate( aFormat, aDate, true )
end
local function removePeriods( s )
local period = mi.texts.period
local _period = '%' .. period
-- closing (span) tags between full stops
return s:gsub( _period .. '+(</[%l<>/]+>)' .. _period .. '+', '%1' .. period )
:gsub( _period .. _period .. '+', period )
end
local function makeMarkerAndName( args, show, page, country, frame )
local result = {}
-- adding status icons
mu.tableInsert( result, mu.makeStatusIcons( args ) )
-- adding POI marker
if show.poi or mu.isSet( args.copyMarker ) then
table.insert( result, mu.makeMarkerSymbol( args, show, frame ) )
end
-- Upravená část pro vytvoření odkazu u názvu
if mu.isSet(vc.wikivoyageLink) then
-- Vytvoříme HTML pro název s interním Wikicesty odkazem
local nameHtml = mu.makeSpan(
string.format('[[%s|%s]]', vc.wikivoyageLink, args.givenName.name),
'p-name fn listing-name' .. addWdClass('name')
)
table.insert(result, nameHtml) -- Vložíme upravený název
-- Logika pro externí URL ikonu byla přesunuta do makeIcons, takže zde nic nepřidáváme.
else
-- Jinak použijeme původní logiku pro generování názvu (externí URL nebo jen text)
mu.makeName( result, args, show, page, country, addWdClass( 'name' ),
addWdClass( 'nameLocal' ) )
end
if #result > 0 then
result = { table.concat( result, mi.texts.space ) }
end
if args.before ~= '' then
table.insert( result, 1, mu.makeSpan( args.before, 'voy-listing-before' ) )
end
return table.concat( result, mi.texts.space )
end
local function makeEvent( args, page )
local isEvent = false
local s = {}
local count = 0 -- counts from-to statements
local startMonth -- month of start date
local today = page.langObj:formatDate( 'Y-m-d', 'now', true )
local todayYear = today:sub( 1, 4 ) -- yyyy
local todayMonth = today:sub( 6, 7 ) -- mm
local lastDate = ''
local lastYear = ''
local useYMD -- both dates are yyyy-mm-dd
local function makePeriod( beginP, endP )
if beginP == endP then
endP = ''
end
if mu.isSet( beginP ) and mu.isSet( endP ) then
count = count + 1
return mw.ustring.format( mi.texts.fromTo2, beginP, endP )
elseif mu.isSet( beginP ) then
return beginP
else
return endP
end
end
local function analyseDate( d, m, y )
local success, c, t
if useYMD then
success, t = pcall( formatDate, d, mi.dates.yyyymmdd.f )
if success then
success, c = pcall( formatDate, d, 'Y-m-d' )
end
if success then
lastDate = c > lastDate and c or lastDate
d = t
end
return d, nil
end
if d:match( mi.dates.yyyymmdd.p ) then
y = d:sub( 1, 4 )
d = d:sub( 6 )
end
if mu.isSet( y ) then
if y:match( mi.dates.yy.p ) then
y = ( '2000' ):sub( -#y ) .. y
elseif not y:match( mi.dates.yyyy.p ) then
y = nil
end
lastYear = y > lastYear and y or lastYear
end
if mu.isSet( d ) and mu.isSet( m ) and d:match( mi.dates.dd.p ) and
not m:match( mi.dates.mm.p ) then
-- try to convert month to number string
success, t = pcall( formatDate, m, 'm' )
if success then
m = t
else
for i = 1, 12, 1 do
if m == mi.months[ i ] or mw.ustring.match( m, mi.monthAbbr[ i ] ) then
m = '' .. i
break
end
end
end
end
if mu.isSet( d ) and mu.isSet( m ) and d:match( mi.dates.dd.p ) and
m:match( mi.dates.mm.p ) then
d = m:gsub( '%.+$', '' ) .. '-' .. d:gsub( '%.+$', '' )
m = nil
elseif mu.isSet( d ) and not mu.isSet( m ) and d:match( mi.dates.dd.p ) then
d = ( startMonth or todayMonth ) .. '-' .. d:gsub( '%.+$', '' )
end
if mu.isSet( d ) then
if d:match( mi.dates.mmdd.p ) then
startMonth = d:gsub( '%-%d+', '' )
m = nil
c = ( y or todayYear ) .. '-' .. d
success, t = pcall( formatDate, c, mi.dates.mmdd.f )
if success then
d = t
end
elseif d:match( mi.dates.dd.p ) and not mu.isSet( m ) and startMonth then
c = ( y or todayYear ) .. '-' .. startMonth .. '-' .. d
success, t = pcall( formatDate, c, mi.dates.mmdd.f )
if success then
d = t
end
end
end
if mu.isSet( m ) then
d = ( mu.isSet( d ) and ( d .. mi.texts.space ) or '' ) .. m
end
return d, y
end
if not mu.groupWithEvents( args.group ) then
return ''
end
-- check if vCard is an event
for i, param in ipairs( vp.checkEvent ) do
if mu.isSet( args[ param ] ) then
isEvent = true
break
end
end
if not isEvent then
return ''
end
if mu.isSet( args.frequency ) then
table.insert( s, mu.makeSpan( args.frequency, 'voy-listing-frequency' ) )
else
if args.date:match( mi.dates.yyyymmdd.p ) and
args.endDate:match( mi.dates.yyyymmdd.p ) then
useYMD = true
if args.date > args.endDate then
args.date, args.endDate = args.endDate, args.date
end
end
args.date, args.year
= analyseDate( args.date, args.month, args.year )
args.endDate, args.endYear
= analyseDate( args.endDate, args.endMonth, args.endYear )
local d = {}
mu.tableInsert( d, makePeriod( args.date, args.endDate ) )
mu.tableInsert( d, makePeriod( args.year, args.endYear ) )
mu.tableInsert( s, mu.makeSpan( table.concat( d, count > 1 and
mu.commaSeparator or mi.texts.space ), 'voy-listing-date' ) )
if ( lastYear ~= '' and lastYear < todayYear ) or
( lastDate ~= '' and lastDate < today ) then
mu.addMaintenance( 'outdated' )
end
end
if mu.isSet( args.location ) then
local locations = mu.textSplit( args.location, ',' )
for i, location in ipairs( locations ) do
if location ~= page.subpageText and location ~= page.text
and mw.title.new( location, '' ).exists then
location = mu.makeSpan( '[[' .. location .. ']]', 'voy-listing-location' )
end
table.insert( s, location )
end
end
s = table.concat( s, mu.commaSeparator )
return ( s ~= '' and ': ' or '' ) .. s
end
local function makeAddressAndDirections( args, page, country )
local r = ''
local p, t
if mu.isSet( args.address ) then
p = {}
if mu.isSet( args.addressLang ) then
p.lang = args.addressLang
t = mw.language.fetchLanguageName( args.addressLang, page.lang )
if mu.isSet( t ) then
p.title = mw.ustring.format( mi.texts.hintAddress2, t )
else
country.unknownPropertyLanguage = true
end
end
r = mu.commaSeparator .. mu.makeSpan( args.address,
'voy-listing-address p-adr adr' .. addWdClass( 'address' ), true, p )
end
if mi.options.showLocalData and mu.isSet( args.addressLocal ) then
r = r .. mu.comma .. mu.languageSpan( args.addressLocal, mi.texts.hintAddress,
page, country, 'voy-listing-address-local' .. addWdClass( 'addressLocal' ) )
end
t = {}
if mu.isSet( args.directions ) then
table.insert( t, mu.makeSpan( args.directions,
'voy-listing-directions' .. addWdClass( 'directions' ) ) )
end
if mi.options.showLocalData and mu.isSet( args.directionsLocal ) then
table.insert( t, mu.languageSpan( args.directionsLocal,
mi.texts.hintDirections, page, country,
'voy-listing-directions-local' .. addWdClass( 'directionsLocal' ) ) )
end
if #t == 0 then
return r
end
return r .. mi.texts.space .. mu.makeSpan( mu.parentheses( table.concat( t, mu.comma ), true ),
'voy-listing-add-address' )
end
local function makeContacts( args, country )
local t = {}
local s
mu.tableInsert( t, formatPhone( args, 'phone', country ) )
mu.tableInsert( t, formatPhone( args, 'tollfree', country ) )
mu.tableInsert( t, formatPhone( args, 'mobile', country ) )
mu.tableInsert( t, formatPhone( args, 'fax', country ) )
if args.email ~= '' then
local lm = require( 'Module:LinkMail' )
s = mu.makeSpan( lm.linkMailSet( { email = args.email, ignoreUnicode = 1 } ),
'voy-listing-email u-email email' .. addWdClass( 'email' ) )
mu.tableInsert( t, mw.ustring.format( mi.texts.email, s ) )
end
s = table.concat( t, mu.commaSeparator )
if s ~= '' then
-- mi.texts.periodSeparator = '. '
s = mi.texts.periodSeparator .. mw.ustring.gsub( s, '^%a', mw.ustring.upper )
end
return s
end
-- making subtypes string
local function makeFeatures( args, tab )
vs = vs or require( 'Module:VCard/Subtypes' )
local function getSubtypeParams( subtype )
local r = vs.f[ subtype ] or mu.getTypeParams( subtype )
if not r.n then
r.n = r.label or subtype
end
r.g = r.g or vs.fromTypesGroupNumber
return r
end
vc.fromWD.subtypeAdd = type( args.subtypeAdd ) == 'table' and #args.subtypeAdd > 0
-- merging subtypeAdd (from Wikidata) to manually entered subtypes
local unknowWDfeatures = false
local label, p, t
if vc.fromWD.subtypeAdd then
-- making translation table from Wikidata ids to feature types
if not vc.subtypeIds then
vc.subtypeIds = mu.getAliases( vs.f, 'wd' )
end
-- adding type if Wikidata id (wd.value) is known
-- indexed array prevents multiple identical types
for i, wd in ipairs( args.subtypeAdd ) do
t = vc.subtypeIds[ wd.value ] or mu.idToType( wd.value )
if not t then
-- maybe instance or subclass of wd.value are known
local p31ids = wu.getIds( wd.value, mi.properties.instanceOf )
local p279ids = wu.getIds( wd.value, mi.properties.subclassOf )
-- merging both arrays
for j = 1, #p279ids, 1 do
table.insert( p31ids, p279ids[ j ] )
end
for j = 1, #p31ids, 1 do
t = vc.subtypeIds[ p31ids[ j ] ] or mu.idToType( p31ids[ j ] )
if t then
break
end
end
end
-- subtype from WD is not known
if not t and not vs.exclude[ wd.value ] then
unknowWDfeatures = true
-- try to add a new subtype Q... to vs.f subtypes table
label = wu.getLabel( wd.value )
if label then
vs.f[ wd.value ] = {
n = label,
wd = wd.value,
g = vs.fromWDGroupNumber
}
t = wd.value
end
end
-- add known subtype
if t then
vc.subtypes[ t ] = {
c = ( wd[ mi.properties.quantity ]
and wd[ mi.properties.quantity ][ 1 ] )
or ( wd[ mi.properties.capacity ] and
wd[ mi.properties.capacity ][ 1 ] ) or '',
p = wd.policyComment
}
end
end
end
if unknowWDfeatures then
mu.addMaintenance( 'unknowWDfeatures' )
end
if next( vc.subtypes ) == nil and #args.subtypeTable == 0 then
return
end
-- replace selected subtypes
for subtype, count in pairs( vc.subtypes ) do
if vs.convert[ subtype ] then
if type( count ) == 'table' then
p = count.p
count = count.c
end
t = vs.convert[ subtype ][ count ] or vs.convert[ subtype ][ 1 ]
vc.subtypes[ t ] = { p = p }
vc.subtypes[ subtype ] = nil
end
end
-- make subtypes table sortable
local s = {};
for subtype, count in pairs( vc.subtypes ) do
if type( count ) == 'table' then
table.insert( s, { t = subtype, c = count.c, p = count.p } )
else
table.insert( s, { t = subtype, c = count } )
end
end
-- add subtypes from types table
if args.subtypeTable then
for i, subtype in ipairs( args.subtypeTable ) do
table.insert( s, { t = subtype, c = 1 } )
end
end
-- sorting subtypes
-- by subtype group and then alphabetically by name
table.sort( s,
function( a, b )
local at = getSubtypeParams( a.t )
local bt = getSubtypeParams( b.t )
local na = mu.convertForSort( at.n )
local nb = mu.convertForSort( bt.n )
return ( at.g < bt.g ) or ( at.g == bt.g and na < nb )
end
)
-- make text and data output
local data = {} -- for data-subtype attribute in wrapper tag
if #s > 0 then
local r = {};
local subtype, f, u, u_n, v
for i = 1, #s do
subtype = s[ i ]
-- for data-subtype="..." in wrapper tag
u = subtype.t .. ',' .. tostring( i )
if type( subtype.c ) == 'number' and subtype.c > 1 then
u = u .. ',' .. subtype.c
end
table.insert( data, u )
u = getSubtypeParams( subtype.t )
if u.g >= vs.firstGroup then
u_n = u.n
if not mu.isSet( u_n ) then
u_n = subtype.t
end
u_n = u_n:gsub( '[,;/].*$', '' )
local count = ( type( subtype.c ) == 'number' ) and subtype.c or 1
if count > 1 and u_n:find( '%[[^%[%]]*%]' ) then
v = mw.ustring.format( mi.texts.subtypeWithCount, subtype.c,
u_n:gsub( '%[([^%[%]]*)|([^%[%]]*)%]', '%1' )
:gsub( '%[([^%[%]]*)%]', '%1' ) )
else
v = u_n:gsub( '%[([^%[%]]*)|([^%[%]]*)%]', '%2' )
:gsub( '%[([^%[%]]*)%]', '' )
end
if mu.isSet( u.t ) then -- string tooltip
v = mw.ustring.format( mi.texts.subtypeSpan, u.t, v )
elseif mu.isSet( u.f ) then -- icons
f = mw.ustring.format( mi.texts.subtypeFile, u.f, v )
if u.c then
f = mw.ustring.rep( f, u.c )
end
v = mw.ustring.format( mi.texts.subtypeAbbr, v, f )
end
-- adding policy comment
if subtype.p and subtype.p ~= '' then
v = v .. mu.parentheses( subtype.p )
end
end
table.insert( r, v )
end
if #r > 0 then
r = #r == 1 and mw.ustring.format( mi.texts.subtype, r[ 1 ] )
or mw.ustring.format( mi.texts.subtypes, table.concat( r, mu.commaSeparator ) )
if r ~= '' then
table.insert( tab, mu.makeSpan( r,
'voy-listing-subtype' .. addWdClass( 'subtypeAdd' ) ) )
end
end
end
-- subtype contains now the value for wrapper tag
args.subtype = table.concat( data, ';' )
end
local function makePayment( args, results )
if not mu.isSet( args.payment ) then
return
end
local t
local class = 'voy-listing-payment p-note note'
if type( args.payment ) == 'table' then
local vr = mw.loadData( 'Module:VCard/Cards')
for i = #args.payment, 1, -1 do -- remove unknown items
t = args.payment[ i ]
if vr.cards[ t ] then
args.payment[ i ] = vr.cards[ t ]
else
table.remove( args.payment, i )
end
end
class = class .. mu.addWdClass( #args.payment > 0 )
args.payment = table.concat( args.payment, mu.commaSeparator )
else
mu.addMaintenance( 'paymentUsed' )
end
formatText( args, results, 'payment', class )
end
local function wrapDescription( args, tab, isInline, addText )
if args.description ~= '' then
table.insert( tab, tostring( mw.html.create( isInline and 'span' or 'div' )
:addClass( 'voy-listing-content p-note note' )
:wikitext( args.description .. ( addText or '' ) ) )
)
end
end
local function makeMetadata( args, page )
local outdated = false
local s, success, u
local t = args.lastedit
if t ~= '' then
success, t = pcall( formatDate, t, mi.dates.lastedit.f )
if not success then
mu.addMaintenance( 'wrongDate' )
t = ''
else
success, s = pcall( formatDate, args.lastedit, 'U' ) -- UNIX seconds
if success then
success, u = pcall( formatDate, mi.texts.expirationPeriod, 'U' )
end
if success and s < u then
t = t .. mi.texts.space .. mi.texts.maybeOutdated
outdated = true
end
end
end
local tag = mw.html.create( 'span' )
:attr( 'class', 'voy-listing-metadata' )
-- add node to save the parent tag
:node( mw.html.create( 'span' )
:addClass( 'voy-listing-metadata-item voy-listing-lastedit' )
:addClass( outdated and 'voy-listing-outdated' or nil )
:addClass( t == '' and 'voy-listing-item-dummy' or nil )
:wikitext( mw.ustring.format( mi.texts.lastedit,
t == '' and mi.texts.lasteditNone or t ) )
)
if mu.isSet( args.sectionFrom ) then
local from = args.sectionFrom:gsub( '_', ' ' )
if from ~= page.subpageText and from ~= page.text then
if mu.isSet( args.wikidata ) then
from = mw.ustring.format( '%s#' .. mi.texts.anchor, from, args.wikidata )
end
tag:node( mw.html.create( 'span' )
:addClass( 'voy-listing-metadata-item voy-listing-toSourcePage' )
:wikitext( mw.ustring.format( '[[%s|%s]]', from, mi.texts.editInSource ) )
)
end
end
return tostring( tag )
end
-- making description, coordinates, and meta data
local function makeDescription( args, show, page, country, entity )
local results = {}
-- inline description
if show.inlineDescription then
wrapDescription( args, results, true )
end
-- adding features
makeFeatures( args, results )
-- practicalities
formatText( args, results, 'hours', 'voy-listing-hours p-note note' )
formatText( args, results, 'checkin', 'voy-listing-checkin' )
formatText( args, results, 'checkout', 'voy-listing-checkout' )
if mu.isSet( args.asOf ) and mu.isSet( args.price ) then
local success
success, args.asOf = pcall( formatDate, args.asOf, mi.dates.asOf.f )
if success then
args.price = args.price .. mw.ustring.format( mi.texts.asOf, args.asOf )
end
end
formatText( args, results, 'price', 'voy-listing-price p-note note' )
makePayment( args, results )
-- adding Unesco symbol
if args.unesco ~= '' and vi.options.showUnesco then
local uLink, uTitle = require( 'Module:VCard/Unesco' ).getUnescoInfo( country )
table.insert( results, mu.addLinkIcon( 'voy-listing-unesco', uLink,
uTitle, 'unesco' ) )
end
local noContent = #results == 0
-- adding DMS coordinates
if show.coord then
table.insert( results, mu.dmsCoordinates( args, page, country, vc.fromWD.lat ) )
end
if mi.options.showSisters == 'atEnd' then
table.insert( results, mu.makeIcons( args, page, country, entity, show, vc.fromWD ) )
end
local description
local space = mi.texts.space
-- adding description in block mode
if args.description ~= '' and not show.inlineDescription then
-- last edit will be inserted at the end of the div tag
wrapDescription( args, results, false, makeMetadata( args, page ) )
noContent = false
description = table.concat( results, space )
if description ~= '' then
description = space .. description
end
-- adding description in inline mode
else
description = table.concat( results, space )
if description ~= '' then
description = space .. description
end
end
return removePeriods( description ), noContent
end
-- vCard main function
function vc.vCard( frame )
mu.initMaintenance()
local page = mu.getPageData()
-- getting location (vCard/listing) entity, show options and country data
local args, vcEntity, show, country = initialParametersCheck( frame, page )
-- associated Wikivoyage page of the location in current Wikivoyage branch
-- possibly modified by mu.getArticleLink()
args.wikiPage = ''
-- getting data from Wikidata
getDataFromWikidata( args, page, country, vcEntity )
-- final check
local defaultType = frame.args.type
finalParametersCheck( args, show, page, country, defaultType, vcEntity )
-- making output
-- leading part for marker mode: only location names and comment
-- saving address
args.addressOrig = args.address
-- creating text parts
-- leading part (marker and names)
local leading = makeMarkerAndName( args, show, page, country, frame )
.. makeEvent( args, page )
-- additional parts for vCard mode
-- get address and directions
local address = makeAddressAndDirections( args, page, country )
-- get all contact information
local contacts = makeContacts( args, country ) -- all contacts
contacts = removePeriods( address .. contacts )
-- making description, coordinates, and meta data
local description, noContent =
makeDescription( args, show, page, country, vcEntity )
local r = leading
local icons = ''
if contacts == '' and noContent then
show.inline = true
r = r .. mu.makeIcons( args, page, country, vcEntity, show, vc.fromWD ) .. description
else
if type( mi.options.showSisters ) == 'boolean' then
-- could also be 'atEnd', then part of body
icons = mu.makeIcons( args, page, country, vcEntity, show, vc.fromWD )
end
-- mi.texts.periodSeparator = '. '
r = removePeriods( r .. contacts .. icons ..
( show.noperiod and '' or mi.texts.periodSeparator ) .. description )
:gsub( '%)(</span>)%s*(<span [^>]*>)%s*%(', '%1; %2' )
end
-- prevents line break before punctuation mark
r = r:gsub( '</span>([,;.:!?])', '%1</span>' )
-- remove space(s) before punctuation marks
:gsub( '%s+(<span [^>]*>[,;.:!?])', '%1' )
if show.inlineDescription then
r = r:gsub( '%s+$', '' ) .. makeMetadata( args, page )
end
-- error handling and maintenance, not in template and module namespaces
if country.unknownLanguage then
mu.addMaintenance( 'unknownLanguage' )
end
if country.unknownPropertyLanguage then
mu.addMaintenance( 'unknownPropertyLanguage' )
end
r = r .. mu.makeMaintenance( page, { wu, mu, cm, hr } )
-- wrapping tag
args.address = args.addressOrig
args.template = 'vCard'
return mu.makeWrapper( r, args, page, country, show, vp.vcardData, frame )
end
return vc
kk17o49wly6equl12h95jwxi4089uxy
Modul:VCard/Cards
828
1329
22091
17281
2026-05-20T10:48:38Z
LiMr
96
aktualizace na novější verzi
22091
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Cards&oldid=1727431)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Cards&oldid=1727431)
--[[
In future, strings should be amended by icons
please use only quotation marks instead of apostrophs for JSON export
]]--
return {
-- administration
moduleInterface = {
suite = 'vCard',
sub = 'Cards',
serial = '2025-11-16',
item = 65455785
},
cards = {
-- general
Q693464 = "hotovost",
-- credit cards
Q161380 = "kreditní karta",
Q194360 = "American Express",
Q24228273 = "American Express",
Q56747433 = "BankAmericard",
Q50612448 = "Diners Club",
Q1374831 = "Eurocard",
Q24228272 = "Mastercard",
Q719625 = "UnionPay",
Q2993698 = "VISA",
-- debit cards
Q13499 = "debitní karta",
Q1093128 = "Cirrus",
Q1406930 = "EC-/Girocard",
Q1350133 = "Maestro",
Q2507012 = "V PAY",
Q6101546 = "İnterbank",
-- prepaid
Q2237462 = "Muzejní karta",
-- electronic money
Q493556 = "AliPay",
Q4740864 = "Amazon Pay",
Q18010990 = "Apple Pay",
Q131723 = "Bitcoin",
Q2966823 = "ChronoPay",
Q1191337 = "elektronische Maut",
Q4827020 = "Autotoll",
Q290518 = "Giropay",
Q19834616 = "Google Pay",
Q252382 = "M-Pesa",
Q21503770 = "Paydirekt",
Q483959 = "PayPal",
Q311277 = "Skrill",
Q7624104 = "Stripe",
Q59426035 = "WeChat Pay"
}
}
jrrse43pskdhqsnakxfsri1lz96z7tz
Modul:VCard/Subtypes
828
1330
22090
17763
2026-05-20T10:45:52Z
LiMr
96
aktualizace na novější verzi
22090
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Subtypes&oldid=1767413)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Subtypes&oldid=1767413)
-- empty strings should be filled with icons
-- please use only quotation marks instead of apostrophs for JSON export
return {
-- administration
moduleInterface = {
suite = 'vCard',
sub = 'Subtypes',
serial = '2026-04-09',
item = 65455756
},
firstGroup = 2, -- first group to display
fromWDGroupNumber = 98, -- group number for Q... types from Wikidata
fromTypesGroupNumber = 99, -- group number for types from types table
-- subtype conversion
convert = {
hotelstars = { "1", "2", "3", "4", "5" }, -- hotel stars codes
michelin = { "michelin1", "michelin2", "michelin3" }
},
-- type list
f = {
-- classification, rating, y & n. Group 1 is usually not displayed
budget = { g = 1, wd = "", n = "levný" },
midrange = { g = 1, wd = "", n = "střední" },
upmarket = { g = 1, wd = "", n = "luxusní" },
-- fetching features from Wikidata
n = { g = 1, wd = "", alias = { "no", "none", "ne" }, n = "bez atributů Wikidat" },
y = { g = 1, wd = "", alias = { "yes", "j", "ano" }, n = "s atributy Wikidat" },
-- hotel rating
hotelstars = { g = 2, wd = "Q2976556", n = "hotelové hvězdičky" }, -- see: convert
-- Upto now it seems that there is no font containing the left black half star
-- (u+2BE8): ⯨. That's why now the ½ workaround.
["1"] = { g = 2, wd ="Q110772650", sortkey = "01*", n = "★", t = "1 hvězdičkové hodnocení" }, -- tourist
["1h"] = { g = 2, wd ="Q110932985", sortkey = "01*5", n = "★½", t = "1,5 hvězdičkové hodnocení" }, -- superior tourist (tourist plus)
["1s"] = { g = 2, wd ="Q109726413", sortkey = "01*S", n = "★S", t = "1 hvězdičkové Superior hodnocení" }, -- superior tourist (tourist plus)
["2"] = { g = 2, wd ="Q110772651", sortkey = "02*", n = "★★", t = "2 hvězdičkové hodnocení" }, -- standard
["2h"] = { g = 2, wd ="Q110932986", sortkey = "02*5", n = "★★½", t = "2,5 hvězdičkové hodnocení" }, -- superior standard
["2s"] = { g = 2, wd ="Q109726348", sortkey = "02*S", n = "★★S", t = "2 hvězdičkové Superior hodnocení" }, -- superior standard
["3"] = { g = 2, wd ="Q110772652", sortkey = "03*", n = "★★★", t = "3 hvězdičkové hodnocení" }, -- comfort
["3h"] = { g = 2, wd ="Q110932987", sortkey = "03*5", n = "★★★½", t = "3,5 hvězdičkové hodnocení" }, -- superior comfort
["3s"] = { g = 2, wd ="Q109726284", sortkey = "03*S", n = "★★★S", t = "3 hvězdičkové Superior hodnocení" }, -- superior comfort
["4"] = { g = 2, wd ={ "Q110772653", "Q99309708" }, sortkey = "04*", n = "★★★★", t = "4 hvězdičkové hodnocení" }, -- first class
["4h"] = { g = 2, wd ="Q110932988", sortkey = "04*5", n = "★★★★½", t = "4,5 hvězdičkové hodnocení" }, -- superior first class
["4s"] = { g = 2, wd ="Q109726210", sortkey = "04*S", n = "★★★★S", t = "4 hvězdičkové Superior hodnocení" }, -- superior first class
["5"] = { g = 2, wd ={ "Q109248725", "Q109248724" }, sortkey = "05*", n = "★★★★★", t = "5 hvězdičkové hodnocení" }, -- luxury
["5s"] = { g = 2, wd ="Q109726138", sortkey = "05*S", n = "★★★★★S", t = "5 hvězdičkové Superior hodnocení" }, -- superior luxury
-- Michelin awards to restaurant chefs
bib_gourmand = { g = 2, wd ="Q104135230", n = "Bib Gourmand" },
michelin = { g = 2, wd = "Q20824563", n = "Michelin-Stern[e]" },
michelin1 = { g = 2, wd = "", n = "Michelin 1*", f = "Etoile Michelin-1.svg", c = 1 },
michelin2 = { g = 2, wd = "", n = "Michelin 2*", f = "Etoile Michelin-1.svg", c = 2 },
michelin3 = { g = 2, wd = "", n = "Michelin 3*", f = "Etoile Michelin-1.svg", c = 3 },
-- subtypes from subtype parameter in types table
bnb = { g = 3, wd = "Q367914", n = "postel a snídaně" },
boarding_house = { g = 3, wd = { "Q1558858", "Q1065252" }, n = "penzion" },
hotel_garni= { g = 3, wd = "Q1631103", n = "garni" },
-- general facilities
accessible = { g = 4, wd = "Q808926", n = "bezbariérové" }, -- barrier-free, for handicapped people
ai = { g = 4, wd = "Q1281666", n = "All inclusive" },
basement_garage = { g = 4, wd = "Q2431970", n = "podzemní parkoviště" },
car_park = { g = 4, wd = "Q13218805", n = "parkovací garáž" },
free_wlan = { g = 4, wd = "Q1543615", n = "bezplatná Wi-Fi" },
garage = { g = 4, wd = "Q22733", n = "garáž[e]" },
induction_loop = { g = 4, wd = "Q2163913", n = "indukční smyčka" },
internet_access = { g = 4, wd = "Q1472399", n = "přístup k internetu" }, -- unknown type or both lan and wlan
lan = { g = 4, wd = "Q11381", n = "LAN" },
lgbt = { g = 4, wd = "Q17884", n = "LGBT", f = "Gay flag.svg" }, -- including gay
nobreakfast= { g = 4, wd ="Q106041208", n = "bez snídaně" },
nowheelchair = { g = 4, wd = "Q24192069", n = "není bezbariérové", f = "Wheelchair-red3.png" },
nowlan = { g = 4, wd = "Q1814990", n = "není Wi-Fi" }, -- no
paid_wlan = { g = 4, wd = "Q24202480", n = "placená Wi-Fi" },
parking = { g = 4, wd = "Q6501349", n = "parkovací míst[a|o]" },
tactile_graphic = { g = 4, wd = "Q7674130", n = "tyflografika" },
valet_parking = { g = 4, wd = "Q1423019", n = "parkování s obsluhou" },
withbreakfast = { g = 4, wd ="Q106041297", n = "se snídaní" },
wheelchair = { g = 4, wd = "Q24192067", n = "bezbariérové", f = "Wheelchair-green3.png" },
wheelchair_available = { g = 4, wd = "Q191931", n = "invalidní vozík k dispozici" },
wheelchair_with_help = { g = 4, wd = "Q24192068", n = "bezbariérový přístup s asistencí", f = "Wheelchair-yellow3.png" },
wheelchair_partially = { g = 4, wd = "Q63731120", n = "částečně bezbariérové" },
wheelchair_partially_with_help = { g = 4, wd = "Q63731151", n = "částečně bezbariérové s asistencí" },
wlan = { g = 4, wd = { "Q6452715", "Q29643" }, n = "Wi-Fi" }, -- yes
-- hotel facilities
adult_pool = { g = 5, wd = "", n = "bazén[y] pro dospělé" },
airport_transfer_service = { g = 5, wd ="Q110012299", n = "transfer z letiště" },
atm = { g = 5, wd = "Q81235", n = "bankomat[y]" },
ballroom = { g = 5, wd = "Q805353", n = "taneční sál[y]" },
babysitter = { g = 5, wd = "Q45181247", n = "chůva" },
bank = { g = 5, wd = "Q22687", n = "banka" },
banquet_room = { g = 5, wd = "Q85833489", n = "hodovní síň" },
bar = { g = 5, wd = "Q187456", n = "bar[y]" },
beach = { g = 5, wd = "Q40080", n = "pláž[e]" },
bed = { g = 5, wd = "Q42177", n = "postel[e]" },
bicycle_stand = { g = 5, wd = "Q1392526", n = "stojan na kola" },
bike_rental= { g = 5, wd = "Q10611118", n = "půjčovna kol" },
business = { g = 5, wd = "Q203180", n = "kancelář[e]" },
buy = { g = 5, wd = "Q1369832", n = "nakupování" },
cabana = { g = 5, wd = "Q3649129", n = "chat[y|a]" },
cafe = { g = 5, wd = "Q30022", n = "kavárn[y|a]" },
cafeteria = { g = 5, wd = "Q8463304", n = "Cafeteria[s]" },
casino = { g = 5, wd = "Q133215", n = "kasin[a|o]" },
cell = { g = 5, wd = "Q2555640", n = "Zelle[n]" },
change_machine = { g = 5, wd = "Q5071849", n = "automat[y] na výměnu peněz" },
cinema = { g = 5, wd = "Q41253", n = "kin[a|o]" },
cloakroom = { g = 5, wd = "Q965173", n = "šatn[y|a]" },
conference = { g = 5, wd = { "Q625994", "Q1207465" }, n = "konferenční místnost[i]" },
currency_exchange = { g = 5, wd = "Q2002539", n = "směnárna peněz" },
dance_hall = { g = 5, wd ="Q121085156", n = "taneční sál[y]" },
dining_room= { g = 5, wd = "Q661199", n = "Esszimmer" },
diving = { g = 5, wd = "Q179643", n = "potápění" },
dormitory = { g = 5, wd = "Q3037266", n = "Schlafs[ä|aa]l[e]" },
family_room= { g = 5, wd = "Q5433389", n = "rodinn[é|ý] pokoj[e]" },
fitness_center = { g = 5, wd = { "Q1065656", "Q30750411" }, n = "fitnessstudio" }, -- including gym, healthclub
games_room = { g = 5, wd = "", n = "hern[y|a]" },
garden = { g = 5, wd = "Q1107656", n = "zahrad[y|a]" },
golf = { g = 5, wd = { "Q5377", "Q1048525", "Q3177122", "Q3177122" }, n = "golf" },
gym = { g = 5, wd = { "Q14092", "Q203609", "Q121085159" }, n = "tělocvičn[y|a]" },
indoorpool = { g = 5, wd = "Q357380", n = "kryt[é|ý] bazén[y]" },
kidsclub = { g = 5, wd = "Q16255832", n = "dětsk[é|ý] klub[y]" },
kiting = { g = 5, wd = "Q219554", n = "kitesurfing" },
library = { g = 5, wd = "Q7075", n = "knihovn[y|a]" },
lift = { g = 5, wd = "Q132911", n = "výtah[y]" },
lobby = { g = 5, wd = "Q31948", n = "lobby" },
luggage_storage = { g = 5, wd = { "Q1195470", "Q21996814" }, n = "úschovna zavazadel" },
money_exchange_machine = { g = 5, wd = "Q25632829", n = "automat na výměnu peněz" },
meeting = { g = 5, wd = "Q3469909", n = "zasedací místnost[i]" }, -- meeting rooms
minigolf = { g = 5, wd = "Q754796", n = "minigolf" },
nightclub = { g = 5, wd = "Q622425", n = "noční klub[y]" },
playground = { g = 5, wd = "Q11875349", n = "hřiště" },
pool = { g = 5, wd = { "Q1501", "Q118559330" }, n = "bazén[y]" },
reception = { g = 5, wd = "Q2794937", alias = "service_counter", n = "recepce" },
restaurant = { g = 5, wd = "Q11707", n = "restaurace" },
roof_garden= { g = 5, wd = "Q1156696", n = "střešní zahrada" },
roof_terrace= { g = 5, wd = "Q1081213", n = "střešní teras[y|a]" },
room = { g = 5, wd = "Q180516", n = "pokoj[e]" },
sauna = { g = 5, wd = "Q57036", n = "sauna" },
socket_near_bed = { g = 5, wd ="Q110073378", n = "zásuvka u postele" },
shop = { g = 5, wd = "Q213441", n = "prodejna" },
souvenir_shop = { g = 5, wd = "Q865693", n = "prodejna suvenýrů" },
spa = { g = 5, wd = "Q1341387", alias = "wellness_center", n = "lázně" },
sports = { g = 5, wd = "Q349", n = "sport" },
suite = { g = 5, wd = "Q1367530", n = "apartmá" },
surfing = { g = 5, wd = "Q1324499", n = "surfing" },
tennis = { g = 5, wd = "Q847", n = "tenis" },
tennis_court = { g = 5, wd = "Q741118", n = "tenisový kurt" },
theater = { g = 5, wd = "Q24354", n = "divadlo" },
warm_water = { g = 5, wd = "Q1419245", n = "teplá voda" },
water_slide= { g = 5, wd = "Q1163166", n = "Wasserrutsche[n]" },
wave_pool = { g = 5, wd = "Q827349", n = "bazén s vlnami" },
-- non-hotel facilities
audioguide = { g = 5, wd = "Q758877", n = "audioprůvodce" },
cctv = { g = 5, wd = { "Q242256", "Q334415" }, n = "kamerový systém" },
communal_bunks = { g = 5, wd = "Q1628935", n = "společné palandy" },
educational_workshop = { g = 5, wd ="Q113484895", n = "vzdělávací workshop" },
guidebook = { g = 5, wd = "Q223638", n = "tištěný cestovní průvodce" },
lecture_hall = { g = 5, wd = "Q253275", n = "auditorium" },
lighting = { g = 5, wd = "Q210064", n = "osvětlení" },
museum_shop= { g = 5, wd = "Q2922607", n = "muzejní obchod[y]" },
organ = { g = 5, wd = "Q1444", n = "varhany" },
public_clock = { g = 5, wd ="Q129165885", n = "veřejné hodiny" },
rest_area = { g = 5, wd = { "Q47520603", "Q785979" }, alias = "picnic_site", n = "místo pro piknik" },
reading_room = { g = 5, wd = "Q1753764", n = "čítárna" },
shakedown = { g = 5, wd = "Q40415224", n = "nouzové nocoviště" },
school_meal= { g = 5, wd = "Q1195832", n = "školní stravování" },
winter_room= { g = 5, wd = "Q382899", n = "zimní prostor" },
-- services in hotels etc.
["24-hour_reception"] = { g = 6, wd = "", n = "24hodinová recepce" },
accessible_toilet = { g = 6, wd = "Q2775009", n = "přístupná toaleta" },
airport_shuttle = { g = 6, wd = "", n = "letištní transfer" },
airport_terminal = { g = 6, wd = "Q849706", n = "letištní terminál" },
airport_transportation = { g = 6, wd = "", n = "letištní doprava" },
animation = { g = 6, wd = "Q547762", n = "animátor" },
baby_change = { g = 6, wd = "Q2567605", n = "přebalovací místnost[i]" },
babysitting = { g = 6, wd = "Q797990", n = "hlídání dětí" },
bahnhofsmission = { g = 6, wd = "Q801713", n = "Bahnhofsmission" },
beauty_service = { g = 6, wd = "Q30303305", n = "kosmetický servis" },
bicycle = { g = 6, wd = "Q11442", n = "jízdní kolo" },
breakfast = { g = 6, wd = "Q80973", n = "snídaně" },
breakfast_buffet = { g = 6, wd = "", n = "snídaně ve formě bufetu" },
breakfast_included= { g = 6, wd = "", n = "snídaně v ceně" },
bus_stop = { g = 6, wd = "Q953806", n = "zastávka autobusu" },
car_hire = { g = 6, wd = "Q291240", n = "půjčovna aut" },
changing_table = { g = 6, wd = "Q1780834", n = "přebalovací pult" },
concierge = { g = 6, wd = "Q2664461", n = "vrátný" },
discotheque = { g = 6, wd = "Q1228895", n = "diskotéka" },
dry_cleaning = { g = 6, wd = "Q878156", n = "suché čištění" },
entertainment = { g = 6, wd = "Q173799", n = "zábava" },
federal_police = { g = 6, wd = "Q56026", n = "Bundespolizei" },
free_parking = { g = 6, wd ="Q108759647", n = "bezplatné parkování" },
gate = { g = 6, wd = "Q247739", n = "odletová brána" },
hairdresser = { g = 6, wd = { "Q55187", "Q95856773", "Q3062512" }, n = "kadeřník" },
laundry = { g = 6, wd = { "Q267734", "Q7223085", "Q12893467", "Q57261433" }, n = "prádelna[y]" },
live_music = { g = 6, wd ="Q100348587", n = "živá hudba" },
massage = { g = 6, wd = "Q179415", n = "masáž" },
multilingual_staff= { g = 6, wd = "Q30081", n = "vícejazyčný personál" },
newspaper = { g = 6, wd = "Q11032", n = "noviny" },
paid_parking = { g = 6, wd ="Q128800991", n = "placené parkování" },
post_office = { g = 6, wd = "Q35054", n = "pošta" },
public_toilet = { g = 6, wd = { "Q813966", "Q3472280" }, n = "veřejné záchody" },
railroad_police = { g = 6, wd = "Q1930355", n = "železniční policie" },
room_service = { g = 6, wd = "Q2048970", n = "pokojová služba" },
selflaundry = { g = 6, wd = "Q1143034", n = "samoobslužná prádelna" },
shuttle_bus = { g = 6, wd = "Q1368498", n = "shuttlebus" },
taxicab_stand = { g = 6, wd = { "Q82650", "Q1395196" }, n = "taxi" },
ticket_machine = { g = 6, wd = "Q657345", n = "automat na jízdenky" },
ticket_office = { g = 6, wd = { "Q56845288", "Q15842100" }, n = "pokladna" },
toilet = { g = 6, wd = { "Q7857", "Q97657740" }, n = "záchody" },
urinal = { g = 6, wd = { "Q152285", "Q97657738" }, n = "pisoár" },
wc = { g = 6, wd = "Q7813355", n = "WC" },
workshop = { g = 6, wd = "Q656720", n = "dílna" },
-- room facilities
ac = { g = 7, wd = "Q173725", n = "klimatizace" },
air_condition = { g = 5, wd = "Q1265533", n = "klimatizace" },
balcony = { g = 7, wd = "Q170552", n = "balkon" },
bathroom = { g = 7, wd = "Q190771", n = "koupelna" },
bathtub = { g = 7, wd = "Q152095", n = "vana" },
bottle_warmer = { g = 7, wd = "Q56711128", n = "ohřívač lahví" },
coffeemaker= { g = 7, wd = "Q211841", n = "kávovar" },
commonbath = { g = 7, wd = "", n = "společná koupelna" }, -- Gemeinschaftsbad
fan = { g = 7, wd = "Q6498398", n = "ventilátor" },
fridge = { g = 7, wd = "Q37828", n = "lednice" },
grab_rail = { g = 7, wd = "", n = "rukojeť" },
hairdryer = { g = 7, wd = "Q15004", n = "fén" },
jacuzzi = { g = 7, wd = "Q1936429", n = "vířivka" }, -- incl. hot tub
kitchen = { g = 7, wd = "Q43164", n = "kuchyně" }, -- usable for guest, usually in the room
minibar = { g = 7, wd = "Q1191522", n = "minibar[y]" },
phone = { g = 7, wd = "Q11035", n = "telefon[y]" },
safe = { g = 7, wd = "Q471898", n = "trezor[y]" },
shower = { g = 7, wd = "Q7863", n = "sprcha" },
terrace = { g = 7, wd = "Q641406", n = "terasa" },
tv = { g = 7, wd = "Q8075", n = "televize" },
-- cuisine by ethnicity
african = { g = 8, wd = "Q386284", n = "africká kuchyně" },
alsatian = { g = 8, wd = "Q3006870", n = "elsässische Küche" },
american = { g = 8, wd = "Q40578", n = "americká kuchyně" },
arab = { g = 8, wd = "Q623970", n = "arabská kuchyně" },
argentinian= { g = 8, wd = "Q579500", n = "argentinská kuchyně" },
asian = { g = 8, wd = "Q728206", n = "asijská kuchyně" },
australian = { g = 8, wd = "Q783010", n = "autralská kuchyně" },
austrian = { g = 8, wd = "Q42029", n = "österreichische Küche" },
baden = { g = 8, wd = "Q799087", n = "badische Küche" },
balkan = { g = 8, wd = "Q805060", n = "balkánská kuchyně" },
basque = { g = 8, wd = "Q521179", n = "baskická kuchyně" },
bavarian = { g = 8, wd = "Q458851", n = "bavorská kuchyně" },
bolivian = { g = 8, wd = "Q3006895", n = "bolivijská kuchyně" },
brazilian = { g = 8, wd = "Q614394", n = "brasilská kuchyně" },
burmese = { g = 8, wd = "Q1187275", n = "burmská kuchyně" },
californian= { g = 8, wd = "Q1026802", n = "kalifornská kuchyně" },
cambodian = { g = 8, wd = "Q139430", n = "kambodžská kuchyně" },
cantonese = { g = 8, wd = "Q1154790", n = "kantonská kuchyně" },
caribbean = { g = 8, wd = "Q1729345", n = "karibská kuchyně" },
chinese = { g = 8, wd = "Q10876842", n = "čínská kuchyně" },
creole = { g = 8, wd = { "Q85430164", "Q1645076" }, n = "kreolische Küche" },
croatian = { g = 8, wd = "Q1789628", n = "chorvatská kuchyně" },
cypriot = { g = 8, wd = "Q245932", n = "kyperská kuchyně" },
czech = { g = 8, wd = "Q871595", n = "česká kuchyně" },
danish = { g = 8, wd = "Q1196267", n = "dánská kuchyně" },
egyptian = { g = 8, wd = "Q1346230", n = "egyptská kuchyně" },
english = { g = 8, wd = "Q1261477", n = "anglická kuchyně" },
ethiopian = { g = 8, wd = "Q257508", n = "etiopská kuchyně" },
european = { g = 8, wd = "Q579316", n = "evropská kuchyně" },
franconian = { g = 8, wd = "Q1471192", n = "fränkische Küche" },
french = { g = 8, wd = "Q6661", n = "francouzská kuchyně" },
fucha_ryori= { g = 8, wd = "Q10286142", n = "Fucha Ryōri" }, -- ????????????? nevím jak přeložit do CZ
georgian = { g = 8, wd = "Q1199026", n = "gruzínská kuchyně" },
german = { g = 8, wd = "Q47629", n = "německá kuchyně" },
greek = { g = 8, wd = "Q744027", n = "řecká kuchyně" },
home_style = { g = 8, wd = "Q881929", n = "domácí kuchyně" },
hunan = { g = 8, wd = "Q1156889", n = "Hunanská kuchyně" },
hungarian = { g = 8, wd = "Q264327", n = "maďarská kuchyně" },
indian = { g = 8, wd = "Q192087", n = "indická kuchyně" },
indonesian = { g = 8, wd = "Q787497", n = "indonézská kuchyně" },
international = { g = 8, wd = "Q99522230", n = "mezinárodní kuchyně" },
iranian = { g = 8, wd = "Q1342397", n = "íránská kuchyně" },
irish = { g = 8, wd = "Q1068545", n = "irská kuchyně" },
italian = { g = 8, wd = "Q192786", n = "italská kuchyně" },
japanese = { g = 8, wd = "Q234138", n = "japonská kuchyně" },
jewish = { g = 8, wd = "Q284288", n = "jüdische Küche" },
korean = { g = 8, wd = "Q647500", n = "korejská kuchyně" },
latin_american = { g = 8, wd = "Q2707196", n = "latinskoamerická kuchyně" },
lebanese = { g = 8, wd = "Q929239", n = "libanonská kuchyně" },
levantine = { g = 8, wd = "Q765174", n = "levantská kuchyně" },
malaysian = { g = 8, wd = "Q772247", n = "malajská kuchyně" },
medieval = { g = 8, wd = "Q10886", n = "středověká kuchyně" },
mediterranean = { g = 8, wd = "Q934309", n = "středomořská kuchyně" },
mexican = { g = 8, wd = "Q207965", n = "mexická kuchyně" },
modern = { g = 8, wd = "", n = "moderne Küche" },
national = { g = 8, wd = "Q1968435", n = "národní kuchyně" },
nepalese = { g = 8, wd = "Q1194855", n = "nepálská kuchyně" },
new_nordic = { g = 8, wd = "Q3345199", n = "nová dánská kuchyně" },
nubian = { g = 8, wd ="Q113827054", n = "núbijská kuchyně" },
oriental = { g = 8, wd = "Q1547037", n = "orientální kuchyně" },
pakistani = { g = 8, wd = "Q1089120", n = "pákistánská kuchyně" },
peruvian = { g = 8, wd = "Q749847", n = "peruánská kuchyně" },
polish = { g = 8, wd = "Q756020", n = "polská kuchyně" },
portuguese = { g = 8, wd = "Q180817", n = "portugalská kuchyně" },
regional = { g = 8, wd = "Q94951", n = "regionální kuchyně" },
rhenish = { g = 8, wd = "Q2147761", n = "rýnská kuchyně" },
russian = { g = 8, wd = "Q12505", n = "ruská kuchyně" },
savoy = { g = 8, wd = "Q3006988", n = "Savoyer Küche" },
shandong = { g = 8, wd = "Q1038209", n = "shandongská kuchyně" },
sichuan = { g = 8, wd = "Q691365", n = "sichuanská kuchyně" },
south_indian= { g = 8, wd = "Q3595152", n = "jihoindická kuchyně" },
spanish = { g = 8, wd = "Q622512", n = "španělská kuchyně" },
swedish = { g = 8, wd = "Q35623", n = "švédská kuchyně" },
swiss = { g = 8, wd = "Q13497", n = "švýcarská kuchyně" },
swabian = { g = 8, wd = "Q880365", n = "švábská kuchyně" },
syrian = { g = 8, wd = "Q4119264", n = "syrische Küche" },
thai = { g = 8, wd = "Q841984", n = "thajská kuchyně" },
thuringian = { g = 8, wd = "Q187477", n = "durynská kuchyně" },
turkish = { g = 8, wd = "Q654493", n = "turecká kuchyně" },
ukranian = { g = 8, wd = "Q1503789", n = "ukrajinská kuchyně" },
vietnamese = { g = 8, wd = "Q826059", n = "vietnamská kuchyně" },
western = { g = 8, wd = "Q16143746", n = "západní kuchyně" },
westphalian= { g = 8, wd = "Q2565249", n = "vestfálská kuchyně" },
-- cuisine by type of food
bagel = { g = 9, wd = "Q272502", n = "bagel" },
barbecue = { g = 9, wd = "Q461696", n = "Q461696" },
bougatsa = { g = 9, wd = "Q895009", n = "bougatsa" },
burger = { g = 9, wd = "Q6663", n = "hamburger" },
cake = { g = 9, wd = "Q13276", n = "dort" },
casserole = { g = 9, wd = "Q7724780", n = "kastrol" },
chicken = { g = 9, wd = "Q864693", n = "kuře" },
crepe = { g = 9, wd = "Q12200", n = "crêpe" },
couscous = { g = 9, wd = "Q76605", n = "kuskus" },
curry = { g = 9, wd = "Q164606", n = "curry" },
dessert = { g = 9, wd = "Q182940", n = "dezert" },
donut = { g = 9, wd = "Q192783", n = "donut" },
empanada = { g = 9, wd = "Q747457", n = "empanada" },
fish = { g = 9, wd = "Q152", n = "ryba" },
fish_and_chips = { g = 9, wd = "Q203925", n = "fish and chips" },
fried_food = { g = 9, wd = "Q300472", n = "smažené jídlo" },
friture = { g = 9, wd = "Q854618", n = "fritované jídlo" },
grill = { g = 9, wd = "Q853185", n = "gril" },
gyros = { g = 9, wd = "Q681596", n = "gyros" },
ice_cream = { g = 9, wd = "Q13233", n = "zmrzlina" },
kebab = { g = 9, wd = "Q179010", n = "kebab" },
noodle = { g = 9, wd = "Q192874", n = "nudle" },
pancake = { g = 9, wd = "Q44541", n = "palačinky" },
pasta = { g = 9, wd = "Q178", n = "těstoviny" },
pie = { g = 9, wd = "Q13360264", n = "koláč" },
pizza = { g = 9, wd = "Q177", n = "pizza" },
salad = { g = 9, wd = "Q9266", n = "salát" },
sandwich = { g = 9, wd = "Q28803", n = "sandwich" },
sausage = { g = 9, wd = "Q131419", n = "uzenina" },
seafood = { g = 9, wd = "Q192935", n = "mořské plody" },
soba = { g = 9, wd = "Q753910", n = "Soba" },
soup = { g = 9, wd = "Q41415", n = "polévka" },
steakhouse = { g = 9, wd = "Q3109696", n = "steakhouse" },
sushi = { g = 9, wd = "Q46383", n = "sushi" },
tapas = { g = 9, wd = "Q220964", n = "tapas" },
vegan = { g = 9, wd = { "Q181138", "Q20669090" }, n = "veganská strava" },
vegetarian = { g = 9, wd = { "Q83364", "Q638022" }, n = "vegetariánská strava" },
wild_game = { g = 9, wd = "Q223930", n = "zvěřina" },
yakitori = { g = 9, wd = "Q483163", n = "jakitori" },
-- drinks
alcoholic = { g = 10, wd = "Q154", n = "alkoholické nápoje" },
beer = { g = 10, wd = "Q44", n = "pivo" },
cocktails = { g = 10, wd = "Q134768", n = "koktejly" },
["non-alcoholic"] = { g = 10, wd = "Q2647467", n = "nealkoholické nápoje" },
noalcoholic= { g = 10, wd = "Q67426650", n = "žádné alkoholické nápoje" },
wine = { g = 10, wd = "Q282", n = "víno" },
-- services in restaurants
beer_garden = { g = 11, wd = "Q857909", n = "pivní zahrada" },
bowling_alley = { g = 11, wd = "Q27106471", n = "bowlingová dráha" },
delivery = { g = 11, wd = { "Q2334804", "Q1824143" }, n = "dodávka" },
drive_in = { g = 11, wd = "Q14253958", n = "drive-in" },
drive_through = { g = 11, wd = "Q14253958", n = "drive-through" }, -- including drive-thru
outdoor_seating = { g = 11, wd = "Q98642678", n = "venkovní posezení" },
reservation = { g = 11, wd = { "Q2145615", "Q7673285" }, n = "rezervace" },
self_service = { g = 11, wd = "Q1369310", n = "samoobslužný servis" },
table_service = { g = 11, wd ="Q100805023", n = "číšník" },
takeaway = { g = 11, wd = "Q154383", n = "jídlo s sebou" }, -- including "take-out", "to-go", and "carry-out"
-- activity policies (P5023)
-- photography
noflash = { g = 12, wd = "Q51728726", n = "bez blesku" },
nophotos = { g = 12, wd = "Q51728721", n = "fotografování zakázáno" },
nosticks = { g = 12, wd = "Q53540617", n = "žádné selfie tyče" },
notripod = { g = 12, wd ="Q108583523", n = "bez stativu" },
novideo = { g = 12, wd = "Q66361451", n = "video zakázáno" },
permit_for_commercial_photography = { g = 12, wd ="Q113756144", n = "pro komerční fotografování vyžadováno povolení" },
photos_allowed= { g = 12, wd = "Q51728733", n = "fotografování povoleno" },
-- general policies
adults_only = { g = 13, wd ="Q132174927", n = "Adults Only, Erwachsenenhotel" },
animals = { g = 13, wd ="Q105100898", n = "zvířata povolena" },
bags_prohibited = { g = 13, wd ="Q113773766", n = "velké tašky zakázány" },
cats = { g = 13, wd ="Q105100905", n = "kočky povoleny" },
companion_dogs= { g = 13, wd ="Q116343464", n = "doprovodní psi povoleni" },
couples_and_families = { g = 13, wd ="Q136175147", n = "Couples and Families Only" },
couples_only = { g = 13, wd ="Q136175105", n = "Couples Only" },
dogs = { g = 13, wd ="Q105100922", n = "psi povoleni" },
drinking_ban = { g = 13, wd ="Q111986775", n = "zákaz pití" },
eating_ban = { g = 13, wd ="Q116343890", n = "zákaz jezení" },
face_mask_mandatory = { g = 13, wd = "Q97933005", n = "povinná rouška" },
families_only = { g = 13, wd ="Q136175123", n = "Families Only, Familienhotel" },
leashed_dogs = { g = 13, wd = "Q66361287", n = "psi na vodítku" },
noanimals = { g = 13, wd ="Q105094093", n = "zvířata zakázána" },
nobarefoot = { g = 13, wd ="Q135522352", n = "keine Barfüßigkeit" },
nobikes = { g = 13, wd = "Q66361472", n = "Fahrräder verboten" },
nocamping = { g = 13, wd = "Q66361437", n = "zákaz stanování" },
nocats = { g = 13, wd ="Q105094244", n = "kočky zakázány" },
nodogs = { g = 13, wd ="Q105094236", n = "psi zakázáni" },
nodrones = { g = 13, wd = "Q66361435", n = "drony zakázány" },
nofeeding = { g = 13, wd = "Q5286412", n = "krmení zvířat je zakázáno" },
nohighheels = { g = 13, wd ="Q123013492", n = "podpatky zakázány" },
nokids = { g = 13, wd = "Q24861437", n = "děti zakázány" },
nolittering = { g = 13, wd = "Q66361444", n = "odhazování odpadků zakázáno" },
noloudly = { g = 13, wd ="Q111986810", n = "mluvení nahlas zakázáno" },
nonsmoking = { g = 13, wd = "", n = "kouření zakázáno" },
nopets = { g = 13, wd = "Q66361297", n = "domácí zvířata zakázána" },
notouch = { g = 13, wd = "Q66361307", n = "dotýkat se zakázáno" },
pets = { g = 13, wd = "Q66361299", n = "domácí zvířata povolena" },
smoking = { g = 13, wd = "Q18809854", n = "kouření" },
smoking_ban = { g = 13, wd = "Q751734", n = "kouření zakázáno" },
smoking_separated= { g = 13, wd ="Q110090224", n = "kouření na oddělených místech" },
water_mandatory= { g = 13, wd = "Q66361375", n = "eigenes Wasser zwingend erforderlich" },
-- dress codes:
dress_code = { g = 13, wd = "Q286300", n = "Kleiderordnung" },
smart_casual = { g = 13, wd = "Q7544032", n = "smart casual" },
decent_clothing = { g = 13, wd = "Q66361332", n = "Angemessene Kleidung erforderlich" },
-- difficulties (routes etc.)
novice = { g = 14, wd = "", n = "začátečník" },
easy = { g = 14, wd = "", n = "jednoduché" },
intermediate = { g = 14, wd = "", n = "střední" },
advanced = { g = 14, wd = "", n = "pokročilý" },
expert = { g = 14, wd = "", n = "zkušenější" },
freeride = { g = 14, wd = "", n = "Freeride" },
extreme = { g = 14, wd = "", n = "extrémní" },
},
-- group meanings
g = {
["1"] = "cenová skupina",
["2"] = "klasifikace",
["3"] = "typ hotelu",
["4"] = "obecná zařízení",
["5"] = "vybavení",
["6"] = "služby",
["7"] = "vybavení",
["8"] = "kuchyně podle typu",
["9"] = "jídlo podle druhu",
["10"] = "nápoje",
["11"] = "služby restaurace",
["12"] = "fotografování",
["13"] = "chování",
["14"] = "úrovně obtížnosti"
},
exclude = { -- do not translate
Q116168276 = "10. Superior Deluxe",
Q1031873 = "aircraft catapult",
Q573970 = "apron",
Q104123038 = "bilingual street name sign",
Q918324 = "control tower",
Q192375 = "hangar",
Q464020 = "instrument landing system",
Q1061299 = "jet bridge",
Q184590 = "runway",
Q774583 = "solar panel",
Q5191724 = "steeple",
Q35473 = "window"
}
}
8rupvb9g0v2uwtqgw1s3m5l7vefcbz8
Modul:Languages
828
1331
22097
17400
2026-05-20T11:30:24Z
LiMr
96
aktualizace na novější verzi
22097
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:Languages&oldid=1763812)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:Languages&oldid=1763812)
--[[
Using ISO 639-1 code of the languages
table indexes:
q: Language entity id
w: Writing entity id
c: Wikipedia edits in millions per 2018/7/1 as a measure of importance
from https://de.wikipedia.org/wiki/Wikipedia:Sprachen
]]--
return {
-- administration
moduleInterface = {
suite = 'Languages',
serial = '2026-03-25',
item = 65439949
},
id2code = {
Q27811 = 'aa',
Q5111 = 'ab',
Q14196 = 'af',
Q28026 = 'ak',
Q28244 = 'am',
Q8765 = 'an',
Q13955 = 'ar',
Q29401 = 'as',
Q29561 = 'av',
Q4627 = 'ay',
Q9292 = 'az',
Q13389 = 'ba',
Q9091 = 'be',
Q7918 = 'bg',
Q35452 = 'bi',
Q33243 = 'bm',
Q9610 = 'bn',
Q34271 = 'bo',
Q12107 = 'br',
Q9303 = 'bs',
Q7026 = 'ca',
Q33350 = 'ce',
Q33262 = 'ch',
Q33111 = 'co',
Q33390 = 'cr',
Q9056 = 'cs',
Q33348 = 'cv',
Q9309 = 'cy',
Q9035 = 'da',
Q188 = 'de',
Q13286 = 'dsb', -- Lower Sorbian
Q32656 = 'dv',
Q33081 = 'dz',
Q30005 = 'ee',
Q36510 = 'el', -- Modern Greek
Q9129 = 'el', -- Greek
Q1860 = 'en',
Q7979 = 'en-gb',
Q7976 = 'en-us',
Q143 = 'eo',
Q1321 = 'es',
Q9072 = 'et',
Q8752 = 'eu',
Q9168 = 'fa',
Q33454 = 'ff',
Q1412 = 'fi',
Q33298 = 'fil',
Q33295 = 'fj',
Q25258 = 'fo',
Q150 = 'fr',
Q1450506= 'fr-ca', -- Canadian French
Q28224 = 'frr',
Q27175 = 'fy',
Q9142 = 'ga',
Q9314 = 'gd',
Q9307 = 'gl',
Q35876 = 'gn',
Q387066 = 'gsw',
Q5137 = 'gu',
Q12175 = 'gv',
Q56475 = 'ha',
Q9288 = 'he',
Q1568 = 'hi',
Q33617 = 'ho',
Q6654 = 'hr',
Q13248 = 'hsb', -- Upper Sorbian
Q33491 = 'ht',
Q9067 = 'hu',
Q8785 = 'hy',
Q33315 = 'hz',
Q9240 = 'id',
Q33578 = 'ig',
Q34235 = 'ii',
Q27183 = 'ik',
Q294 = 'is',
Q652 = 'it',
Q29921 = 'iu',
Q5287 = 'ja',
Q33549 = 'jv',
Q8108 = 'ka',
Q33702 = 'kg',
Q33587 = 'ki',
Q1405077 = 'kj',
Q9252 = 'kk',
Q25355 = 'kl',
Q9205 = 'km',
Q33673 = 'kn',
Q9176 = 'ko',
Q36094 = 'kr',
Q33552 = 'ks',
Q36368 = 'ku',
Q36126 = 'kv',
Q25289 = 'kw',
Q9255 = 'ky',
Q9051 = 'lb',
Q33368 = 'lg',
Q102172 = 'li',
Q36217 = 'ln',
Q9211 = 'lo',
Q9083 = 'lt',
Q36157 = 'lu',
Q9078 = 'lv',
Q7930 = 'mg',
Q36280 = 'mh',
Q36451 = 'mi',
Q9296 = 'mk',
Q36236 = 'ml',
Q9246 = 'mn',
Q36392 = 'mo',
Q1571 = 'mr',
Q9237 = 'ms',
Q9166 = 'mt',
Q20923490 = 'mul',
Q9228 = 'my',
Q13307 = 'na',
Q25167 = 'nb',
Q35613 = 'nd',
Q33823 = 'ne',
Q33900 = 'ng',
Q33790 = 'niu',
Q7411 = 'nl',
Q25164 = 'nn',
Q9043 = 'no',
Q36785 = 'nr',
Q33273 = 'ny',
Q14185 = 'oc',
Q33875 = 'oj',
Q33864 = 'om',
Q33810 = 'or',
Q33968 = 'os',
Q58635 = 'pa',
Q36727 = 'pi',
Q809 = 'pl',
Q58680 = 'ps',
Q5146 = 'pt',
Q13199 = 'rm',
Q33583 = 'rn',
Q7913 = 'ro',
Q7737 = 'ru',
Q33573 = 'rw',
Q11059 = 'sa',
Q33976 = 'sc',
Q33997 = 'sd',
Q33947 = 'se',
Q33954 = 'sg',
Q13267 = 'si',
Q9058 = 'sk',
Q9063 = 'sl',
Q34011 = 'sm',
Q34004 = 'sn',
Q13275 = 'so',
Q8748 = 'sq',
Q9299 = 'sr',
Q8821 = 'sr-me', -- Montenegrin
Q34014 = 'ss',
Q34340 = 'st',
Q34002 = 'su',
Q9027 = 'sv',
Q7838 = 'sw',
Q5885 = 'ta',
Q8097 = 'te',
Q9260 = 'tg',
Q9217 = 'th',
Q34124 = 'ti',
Q9267 = 'tk',
Q34097 = 'tkl',
Q34057 = 'tl',
Q34137 = 'tn',
Q34094 = 'to',
Q256 = 'tr',
Q34327 = 'ts',
Q25285 = 'tt',
Q34055 = 'tvl',
Q36850 = 'tw',
Q34128 = 'ty',
Q13263 = 'ug',
Q8798 = 'uk',
Q1617 = 'ur',
Q9264 = 'uz',
Q32704 = 've',
Q9199 = 'vi',
Q100103 = 'vls',
Q34219 = 'wa',
Q34257 = 'wo',
Q13218 = 'xh',
Q8641 = 'yi',
Q34311 = 'yo',
Q13216 = 'za',
Q7850 = 'zh', -- Chinese
Q727694 = 'zh', -- Standard Chinese
Q1624231 = 'zh-nan', -- Hokkien
Q9186 = 'zh-yue', -- Cantonese
Q10179 = 'zu'
},
scripts = {
Q8196 = 'arabská abeceda',
Q8201 = 'čínské znaky',
Q8209 = 'cyrilice',
Q8216 = 'řecká abeceda',
Q8222 = 'hangŭl',
Q8229 = 'latinka',
Q11932 = 'arménské písmo',
Q26803 = 'Tamilské písmo',
Q33513 = 'hebrejské písmo',
Q38592 = 'Dévanágarí',
Q46861 = 'tibetské písmo',
Q82772 = 'kandži',
Q161428 = 'gruzínská písma',
Q185083 = 'Bráhmí',
Q191272 = 'asamská abeceda',
Q236376 = 'thajské písmo',
Q257634 = "Etiopské písmo",
Q570450 = 'Telugské písmo',
Q733944 = 'Gujarati',
Q756802 = 'bengálské písmo',
Q839666 = 'Kannadské písmo',
Q854968 = 'Barmské písmo',
Q877906 = 'Tána',
Q1054190 = 'khmerské písmo',
Q1164129 = 'Malajská abeceda',
Q1197646 = 'Yi abeceda',
Q1574992 = 'sinhálské písmo',
Q1760127 = 'Odia',
Q1815229 = 'laoské písmo',
Q2274646 = 'Inuktitutské písmo',
},
lngProps = {
aa = { q = 'Q27811', w = 'Q8229' },
ab = { q = 'Q5111', w = 'Q8209' },
af = { q = 'Q14196', w = 'Q8229' },
ak = { q = 'Q28026', w = 'Q8229' },
am = { q = 'Q28244', w = 'Q257634' },
an = { q = 'Q8765', w = 'Q8229' },
ar = { q = 'Q13955', w = 'Q8196', c = 29 },
as = { q = 'Q29401', w = 'Q191272' },
av = { q = 'Q29561', w = 'Q8209' },
ay = { q = 'Q4627', w = 'Q8229' },
az = { q = 'Q9292', w = 'Q8229' },
ba = { q = 'Q13389', w = 'Q8209' },
be = { q = 'Q9091', w = 'Q8209' },
bg = { q = 'Q7918', w = 'Q8209' },
bi = { q = 'Q35452', w = 'Q8229' },
bm = { q = 'Q33243', w = 'Q8229' },
bn = { q = 'Q9610', w = 'Q756802' },
bo = { q = 'Q34271', w = 'Q46861' },
br = { q = 'Q12107', w = 'Q8229' },
bs = { q = 'Q9303', w = 'Q8229' },
ca = { q = 'Q7026', w = 'Q8229', c = 20 },
ce = { q = 'Q33350', w = 'Q8209' },
ch = { q = 'Q33262', w = 'Q8229' },
co = { q = 'Q33111', w = 'Q8229' },
cr = { q = 'Q33390', w = 'Q8229' },
cs = { q = 'Q9056', w = 'Q8229' },
cv = { q = 'Q33348', w = 'Q8209' },
cy = { q = 'Q9309', w = 'Q8229' },
da = { q = 'Q9035', w = 'Q8229' },
de = { q = 'Q188', w = 'Q8229', c = 178 },
dsb = { q = 'Q13286', w = 'Q8229' },
dv = { q = 'Q32656', w = 'Q877906' },
dz = { q = 'Q33081', w = 'Q46861' },
ee = { q = 'Q30005', w = 'Q8229' },
el = { q = 'Q9129', w = 'Q8216' },
en = { q = 'Q1860', w = 'Q8229', c = 844 },
['en-gb'] = { q = 'Q7979', w = 'Q8229' },
['en-us'] = { q = 'Q7976', w = 'Q8229' },
eo = { q = 'Q143', w = 'Q8229', c = 1 },
es = { q = 'Q1321', w = 'Q8229', c = 109 },
et = { q = 'Q9072', w = 'Q8229' },
eu = { q = 'Q8752', w = 'Q8229' },
fa = { q = 'Q9168', w = 'Q8196', c = 24 },
ff = { q = 'Q33454', w = 'Q8229' },
fi = { q = 'Q1412', w = 'Q8229' },
fil = { q = 'Q33298', w = 'Q8229' },
fj = { q = 'Q33295', w = 'Q8229' },
fo = { q = 'Q25258', w = 'Q8229' },
fr = { q = 'Q150', w = 'Q8229', c = 150 },
['fr-ca'] = { q = 'Q1450506', w = 'Q8229' },
frr = { q = 'Q28224', w = 'Q8229' },
fy = { q = 'Q27175', w = 'Q8229' },
ga = { q = 'Q9142', w = 'Q8229' },
gd = { q = 'Q9314', w = 'Q8229' },
gl = { q = 'Q9307', w = 'Q8229' },
gn = { q = 'Q35876', w = 'Q8229' },
gsw = { q = 'Q387066', w = 'Q8229' },
gu = { q = 'Q5137', w = 'Q733944' },
gv = { q = 'Q12175', w = 'Q8229' },
ha = { q = 'Q56475', w = 'Q8229' },
he = { q = 'Q9288', w = 'Q33513' },
hi = { q = 'Q1568', w = 'Q38592' },
ho = { q = 'Q33617', w = 'Q8229' },
hr = { q = 'Q6654', w = 'Q8229' },
hsb = { q = 'Q13248', w = 'Q8229' },
ht = { q = 'Q33491', w = 'Q8229' },
hu = { q = 'Q9067', w = 'Q8229' },
hy = { q = 'Q8785', w = 'Q11932' },
hz = { q = 'Q33315', w = 'Q8229' },
id = { q = 'Q9240', w = 'Q8229' },
ig = { q = 'Q33578', w = 'Q8229' },
ii = { q = 'Q34235', w = 'Q1197646' },
ik = { q = 'Q27183', w = 'Q8229' },
is = { q = 'Q294', w = 'Q8229' },
it = { q = 'Q652', w = 'Q8229', c = 98 },
iu = { q = 'Q29921', w = 'Q2274646' },
ja = { q = 'Q5287', w = 'Q82772', c = 69 },
jv = { q = 'Q33549', w = 'Q8229' },
ka = { q = 'Q8108', w = 'Q161428' },
kg = { q = 'Q33702', w = 'Q8229' },
ki = { q = 'Q33587', w = 'Q8229' },
kj = { q = 'Q1405077', w = 'Q8229' },
kk = { q = 'Q9252', w = 'Q8209' },
kl = { q = 'Q25355', w = 'Q8229' },
km = { q = 'Q9205', w = 'Q1054190' },
kn = { q = 'Q33673', w = 'Q839666' },
ko = { q = 'Q9176', w = 'Q8222' },
kr = { q = 'Q36094', w = 'Q8229' },
ks = { q = 'Q33552', w = 'Q38592' },
ku = { q = 'Q36368', w = 'Q8229' },
kv = { q = 'Q36126', w = 'Q8209' },
kw = { q = 'Q25289', w = 'Q8229' },
ky = { q = 'Q9255', w = 'Q8209' },
lb = { q = 'Q9051', w = 'Q8229' },
lg = { q = 'Q33368', w = 'Q8229' },
li = { q = 'Q102172', w = 'Q8229' },
ln = { q = 'Q36217', w = 'Q8229' },
lo = { q = 'Q9211', w = 'Q1815229' },
lt = { q = 'Q9083', w = 'Q8229' },
lu = { q = 'Q36157', w = 'Q8229' },
lv = { q = 'Q9078', w = 'Q8229' },
mg = { q = 'Q7930', w = 'Q8229' },
mh = { q = 'Q36280', w = 'Q8229' },
mi = { q = 'Q36451', w = 'Q8229' },
mk = { q = 'Q9296', w = 'Q8209' },
ml = { q = 'Q36236', w = 'Q1164129' },
mn = { q = 'Q9246', w = 'Q8209' },
mo = { q = 'Q36392', w = 'Q8229' },
mr = { q = 'Q1571', w = 'Q38592' },
ms = { q = 'Q9237', w = 'Q8229' },
mt = { q = 'Q9166', w = 'Q8229' },
mul = { q = 'Q20923490', w = 'Q8229' },
my = { q = 'Q9228', w = 'Q854968' },
na = { q = 'Q13307', w = 'Q8229' },
nb = { q = 'Q25167', w = 'Q8229' },
nd = { q = 'Q35613', w = 'Q8229' },
ne = { q = 'Q33823', w = 'Q38592' },
ng = { q = 'Q33900', w = 'Q8229' },
niu = { q = 'Q33790', w = 'Q8229' },
nl = { q = 'Q7411', w = 'Q8229', c = 52 },
nn = { q = 'Q25164', w = 'Q8229' },
no = { q = 'Q9043', w = 'Q8229' },
nr = { q = 'Q36785', w = 'Q8229' },
ny = { q = 'Q33273', w = 'Q8229' },
oc = { q = 'Q14185', w = 'Q8229' },
oj = { q = 'Q33875', w = 'Q8229' },
om = { q = 'Q33864', w = 'Q8229' },
['or'] = { q = 'Q33810', w = 'Q1760127' },
['os'] = { q = 'Q33968', w = 'Q8209' },
pa = { q = 'Q58635', w = 'Q38592' },
pi = { q = 'Q36727', w = 'Q185083' },
pl = { q = 'Q809', w = 'Q8229', c = 54 },
ps = { q = 'Q58680', w = 'Q8196' },
pt = { q = 'Q5146', w = 'Q8229', c = 52 },
rm = { q = 'Q13199', w = 'Q8229' },
rn = { q = 'Q33583', w = 'Q8229' },
ro = { q = 'Q7913', w = 'Q8229' },
ru = { q = 'Q7737', w = 'Q8209', c = 93 },
rw = { q = 'Q33573', w = 'Q8229' },
sa = { q = 'Q11059', w = 'Q38592' },
sc = { q = 'Q33976', w = 'Q8229' },
sd = { q = 'Q33997', w = 'Q8196' },
se = { q = 'Q33947', w = 'Q8229' },
sg = { q = 'Q33954', w = 'Q8229' },
si = { q = 'Q13267', w = 'Q1574992' },
sk = { q = 'Q9058', w = 'Q8229' },
sl = { q = 'Q9063', w = 'Q8229' },
sm = { q = 'Q34011', w = 'Q8229' },
sn = { q = 'Q34004', w = 'Q8229' },
so = { q = 'Q13275', w = 'Q8229' },
sq = { q = 'Q8748', w = 'Q8229' },
sr = { q = 'Q9299', w = 'Q8209', c = 21 },
['sr-me'] = { q = 'Q8821', w = 'Q8209' },
ss = { q = 'Q34014', w = 'Q8229' },
st = { q = 'Q34340', w = 'Q8229' },
su = { q = 'Q34002', w = 'Q8229' },
sv = { q = 'Q9027', w = 'Q8229', c = 43 },
sw = { q = 'Q7838', w = 'Q8229' },
ta = { q = 'Q5885', w = 'Q26803' },
te = { q = 'Q8097', w = 'Q570450' },
tg = { q = 'Q9260', w = 'Q8209' },
th = { q = 'Q9217', w = 'Q236376' },
ti = { q = 'Q34124', w = 'Q257634' },
tk = { q = 'Q9267', w = 'Q8229' },
tkl = { q = 'Q34097', w = 'Q8229' },
tl = { q = 'Q34057', w = 'Q8229' },
tn = { q = 'Q34137', w = 'Q8229' },
to = { q = 'Q34094', w = 'Q8229' },
tr = { q = 'Q256', w = 'Q8229' },
ts = { q = 'Q34327', w = 'Q8229' },
tt = { q = 'Q25285', w = 'Q8209' },
tvl = { q = 'Q34055', w = 'Q8229' },
tw = { q = 'Q36850', w = 'Q8229' },
ty = { q = 'Q34128', w = 'Q8229' },
ug = { q = 'Q13263', w = 'Q8196' },
uk = { q = 'Q8798', w = 'Q8209', c = 23 },
ur = { q = 'Q1617', w = 'Q8196' },
uz = { q = 'Q9264', w = 'Q8229' },
ve = { q = 'Q32704', w = 'Q8229' },
vi = { q = 'Q9199', w = 'Q8229', c = 41 },
vls = { q = 'Q100103', w = 'Q8229' },
wa = { q = 'Q34219', w = 'Q8229' },
wo = { q = 'Q34257', w = 'Q8229' },
xh = { q = 'Q13218', w = 'Q33513' },
yi = { q = 'Q8641', w = 'Q8229' },
yo = { q = 'Q34311', w = 'Q8229' },
yue = { q = 'Q9186', w = 'Q8201' },
za = { q = 'Q13216', w = 'Q8229' },
zh = { q = 'Q7850', w = 'Q8201', c = 50 },
['zh-nan'] = { q = 'Q1624231', w = 'Q8201' },
['zh-yue'] = { q = 'Q9186', w = 'Q8201' },
zu = { q = 'Q10179', w = 'Q8229'}
}
}
4d0v243cf4sebzx6t64tgs9dj6k50ce
Modul:VCard/Qualifiers
828
1332
22089
17412
2026-05-20T10:29:32Z
LiMr
96
aktualizace na novější verzi
22089
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Qualifiers&oldid=1769792)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Qualifiers&oldid=1769792)
-- Qualifier to label table
-- please use only quotation marks instead of apostrophs for JSON export
return {
-- documentation
moduleInterface = {
suite = "VCard",
sub = "VCard/Qualifiers",
serial = "2026-04-12",
item = 99929816
},
labels = {
-- Einheiten / units
gratis = "zdarma",
Q1543615 = "zdarma",
Q1092296 = "rok",
Q24564698 = "let",
-- Benutzung / use (P366)
-- betroffener Teil / applies to part (P518) etc.
Q5070802 = "mimořádná událost",
Q11028 = "informace",
Q58897583 = "Information",
Q1482145 = "helpline",
Q256132 = "telefonní ústředna",
Q1261521 = "Vermittlung",
Q589666 = "Telefonzentrale",
Q2794937 = "recepce",
Q31948 = "předsíň",
Q862212 = "lobby",
Q4096995 = "Buchung",
Q1029698 = "Führung",
Q2145615 = "rezervace",
Q1162163 = "ředitel",
Q267936 = "výkonný ředitel",
Q25713832 = "vedoucí organizace",
Q11964531 = "generální manažer",
Q22132694 = "ředitel muzea",
Q80687 = "sekretář",
Q859482 = "sekretariát",
Q182060 = "kancelář",
Q5283295 = "administrativa",
Q50412353 = "správa",
Q39809 = "marketing",
Q133080 = "public relations",
Q111148864 = "Kulturamt",
Q674426 = "kurátor",
Q2108946 = "Pressestelle",
Q1193236 = "Presse",
Q5196479 = "Kundenbetreuung",
Q1060653 = "Kundendienst",
Q955464 = "farář",
Q7406919 = "služba",
Q51073356 = "Hafenmeister",
Q11735065 = "Hafenmeister",
Q12407563 = "Parkraumbewirtschaftung",
Q1049511 = "WhatsApp",
Q15616276 = "Telegram",
Q17517 = "mobilní telefon",
Q738621 = "pevná linka",
Q2664461 = "vrátný",
Q1735282 = "pokladník",
Q1463565 = "pokladna",
Q551800 = "vstupenka",
Q187456 = "bar",
Q777754 = "catering",
Q41958 = "catering",
Q171141 = "gastronomie",
Q43164 = "kuchyně",
Q213441 = "prodejna",
Q11707 = "restaurace",
Q547762 = "animátor",
Q133215 = "kasino",
Q1065656 = "posilovna",
Q55187 = "kadeřník",
Q31374404 = "obchodní dům",
Q179415 = "masáž",
Q33506 = "muzeum",
Q2772772 = "Militärmuseum",
Q1824143 = "dodávka",
Q2048970 = "pokojová služba",
Q15983979 = "ztráty a nálezy",
Q60616546 = "městský cestovní ruch",
Q112726458 = "vízový úřad",
Q862761 = "uvnitř",
Q1322786 = "außen",
Q121298623 = "Außenanlage",
Q115156410 = "muzejní výstava",
Q464980 = "Ausstellung",
Q5402268 = "Dauerausstellung",
Q10426913 = "Dauerausstellung",
Q29023906 = "dočasná výstava",
-- gilt für Leute / applies to people (P6001)
Q5 = "osoba",
Q1340307 = "batole",
Q11370581 = "kojenci a batolata",
Q7569 = "dítě",
Q29514218 = "dítě",
Q1076052 = "Vorschulkinder",
Q11519472 = "Vorschulkinder",
Q1902344 = "Vorschulkinder",
Q190007 = "mladý",
Q131774 = "adolescent",
Q170079 = "mladistvý",
Q1492760 = "teenager",
Q17156455 = "mladý dospělý",
Q80994 = "dospělý",
Q18000 = "zletilý",
Q16003605 = "student základní školy",
Q98021727 = "student základní školy",
Q16003532 = "středoškolák",
Q15360275 = "středoškolák",
Q48942 = "žák",
Q68131879 = "žák",
Q73229462 = "Schüler",
Q98033936 = "Sekundarschüler",
Q37226 = "učitel",
Q48282 = "student",
Q315247 = "student univerzity",
Q110207241 = "zahraniční student",
Q253567 = "učeň",
Q59263364 = "učeň",
Q28790169 = "nezaměstnaný",
Q59308743 = "příjemce sociálních dávek",
Q109710549 = "Federální poskytovatel dobrovolnických služeb", -- zajímalo by mě kde se to využije
Q136806547 = "Freiwilligendienstleistende",
Q136806565 = "Freiwilligendienstleistende",
Q24716636 = "dobrovolník",
Q1454927 = "Wehrdienstleistende",
Q47228496 = "Wehrdienstleistende",
Q1930187 = "novinář",
Q1749879 = "důchodce",
Q1358789 = "senior",
Q191089 = "senior",
Q2191986 = "senior",
Q111524907 = "senior od 60 let",
Q117131136 = "senior od 65 let",
Q108427775 = "senior nad 65 let",
Q12131 = "invalida",
Q10857933 = "osoba se zdravotním postižením",
Q1250414 = "těžce postižený",
Q136806121 = "Schwerbehinderte ab 50%",
Q8436 = "rodina",
Q1422286 = "doprovázející osoba",
Q874405 = "sociální skupina",
Q16334295 = "skupina",
Q1605672 = "vedoucí mládeže",
Q113191894 = "egyptští studenti",
Q113191817 = "arabští studenti",
Q221488 = "chodec",
Q11442 = "cyklista",
Q42889 = "vozidlo",
Q1420 = "auto",
Q1144312 = "osobní automobil",
Q190578 = "Pkw",
Q43193 = "kamion",
Q5638 = "Bus",
Q1373492 = "Bus",
Q193234 = "skútr",
Q34493 = "motocykl",
Q23901795 = "plná cena",
Q100157294 = "snížená cena",
Q23901802 = "snížená cena",
Q10328277 = "poloviční vstupné",
Q10585806 = "Minimum",
Q10578722 = "Maximum",
Q30079877 = "měsíční jízdenka",
Q2024421 = "online jízdenka",
Q59582212 = "týdenní jízdenka",
Q819073 = "pracovní den",
Q211391 = "víkend",
Q22947 = "obyvatel",
Q1020994 = "občan",
Q70237645 = "Inland",
Q473741 = "cizinec",
Q1072012 = "mezinárodní",
Q56508363 = "EU/EEA občan",
Q56508358 = "ne EU/EEA občan",
Q1061510 = "egypťan",
Q35323 = "arab",
Q31 = "belgičan",
Q4200853 = "indonésan",
Q15731961 = "indonésan",
Q19840821 = "singapuřan",
Q126003079 = "Singapurer*innen",
Q2408569 = "Thailänder*innen",
Q7901501 = "uruguajec",
Q39201 = "domácí mazlíček",
Q144 = "pes",
Q62966720 = "management parkování",
Q1039099 = "průvodce",
Q758877 = "audioprůvodce",
Q15328 = "kamera",
Q313600 = "fotoaparát",
Q313614 = "videokamera",
Q335234 = "videokamera",
Q335095 = "filmová kamera",
Q683906 = "stativ",
Q24192067 = "rollstuhlgeeignet",
Q24192068 = "rollstuhlgeeignet mit Hilfe",
Q63731120 = "teilweise rollstuhlzugänglich",
Q63731151 = "teilweise rollstuhlzugänglich mit Hilfe"
-- es fehlen Übernachtung, ÜF, EZ, DZ u. ä. (in Wikidata anlegen)
}
}
99anpp79hc5q7b6qm2httpkluf8ds0l
Modul:Exchange rate
828
1335
22098
17280
2026-05-20T11:34:48Z
LiMr
96
aktualizace na novější verzi
22098
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:Exchange_rate&oldid=1775631)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:Exchange_rate&oldid=1775631)
-- pravděpodobně lze sloučit s modulem převzatým z enwikivoyage modul:Exchangerate
--[[
Thanks to GiftBot who is uploading/updating currency exchange rates to Wikimedia
Commons. This service is available since March of 2022.
]]--
-- module variable and administration
local er = {
moduleInterface = {
suite = 'Exchange rate',
serial = '2026-05-17',
item = 112066294
}
}
-- require( 'strict' )
-- Exchange-rate tables stored on Wikimedia Commons
local tableNames = {
'ECB euro foreign exchange reference rates.tab',
'Xe.com exchange rates.tab'
}
-- language-dependent error messages
local messages = {
unknownIsoCode = '[[Kategorie:Údržba:Stránky s neznámým kódem měny]] <span class="error">Neznámý kód měny</span>',
wrongParams = '[[Kategorie:Údržba:Nesprávné parametry]] <span class="error">Nesprávné parametry</span>'
}
-- language-dependent constants
local language = {
defaultUnits = { 'CZK', 'EUR', 'USD' },
decimalSep = ',', -- decimal separator
thousandsSep = '.',
commaSep = mw.message.new( 'comma-separator' ):plain(),
dateFormat = 'j. M Y',
convertFormatter = '≈ %s',
defaultFormatter = '%s unit',
wrapperClass = 'voy-currency',
conversionVia = 'EUR', -- EUR or USD
all = 'všechno', -- lowercase letters
date = 'datum'
}
-- variables for internal use
local cu -- for currencies-table module
local rateTables = {} -- to prevent multiple fetching
-- check if arg is set
local function isSet( arg )
return arg and arg ~= ''
end
-- returns a currency formatter string for isoCode
-- the following function must be localized
local function getFormatter( isoCode, externalFormatter )
isoCode = isSet( isoCode ) and isoCode:upper() or 'XXX'
if externalFormatter then
return externalFormatter( isoCode )
elseif not cu then
cu = mw.loadData( 'Module:CountryData/Currencies' )
end
local tab = cu.isoToQid[ isoCode ] and cu.currencies[ cu.isoToQid[ isoCode ] ]
local default = cu.currencies.default or language.defaultFormatter
if tab then
if tab.f then
return tab.f
else
local unit = tab.add and tab.add:gsub( ',.*', '' ) or tab.iso
return default:gsub( 'unit', unit )
end
end
return default:gsub( 'unit', isoCode )
end
-- returns count of significant digits
-- zeros after decimal separator are significant
local function getDigitCount( num )
num = num:gsub( '%.', '' ):gsub( '^0+', '' )
return #num
end
-- rounds mantissa/significand of number num to digit count digitCount
local function round( num, digitCount )
return tonumber( string.format( '%.' .. digitCount .. 'g', num ) )
end
-- returns tabularData fields schema as associative table
local function getFields( tabularData )
local fields = {}
local tFields = tabularData.schema.fields
for i = 1, #tFields do
fields[ tFields[ i ].name ] = i
end
return fields
end
-- returns currency-rates table as associative table
-- this is an expensive function: the rateTables should be established only once
local function getRateTable( tableName )
local rows = {}
local colNo, fields, row, tData
if not rateTables[ tableName ] then
local tabularData = mw.ext.data.get( tableName )
if not tabularData then
return nil
end
fields = getFields( tabularData )
colNo = fields[ 'currency' ]
tData = tabularData.data
for i = 1, #tData do
row = tData[ i ]
rows[ row[ colNo ] ] = row
end
rateTables[ tableName ] = {
fields = fields,
rows = rows
}
end
return rateTables[ tableName ]
end
-- returns exchange-rate properties for source -> target iso codes
local function getCurrencyData( rateTable, source, target )
local rate, digitCount, asOf
local fields = rateTable.fields
local row = rateTable.rows[ source ]
if row then
rate = row[ fields[ target ] ]:gsub( ',', '' )
-- remove English thousands separator
digitCount = getDigitCount( rate )
rate = tonumber( rate )
asOf = row[ fields[ 'date' ] ]
end
return rate, digitCount, asOf
end
-- returns exchange rate for source -> target iso codes
-- toRound: Boolean
function er.getRate( source, target, toRound )
-- source, target are three-letter ISO 4217 codes
if not source:match( '^%a%a%a$' ) or not target:match( '^%a%a%a$' ) then
return nil
end
local rateTable, fields, rate, digitCount, asOf
source = source:upper()
target = target:upper()
for i = 1, #tableNames do
rateTable = getRateTable( tableNames[ i ] )
if rateTable then
fields = rateTable.fields
if fields[ target ] then
rate, digitCount, asOf = getCurrencyData( rateTable, source, target )
if rate then
rate = 1/rate
end
elseif fields[ source ] then
rate, digitCount, asOf = getCurrencyData( rateTable, target, source )
elseif fields[ language.conversionVia ] then
local rate1, digitCount1, asOf1 = getCurrencyData( rateTable, source, language.conversionVia )
local rate2, digitCount2, asOf2 = getCurrencyData( rateTable, target, language.conversionVia )
if rate1 and rate2 then
rate = rate2/rate1
digitCount = digitCount1 < digitCount2 and digitCount1 or digitCount2
asOf = asOf1 < asOf2 and asOf1 or asOf2
end
end
end
if rate then
break
end
end
if rate and toRound then
rate = round( rate, digitCount )
end
return rate, asOf, digitCount
end
-- returns a converted date for aDate due to formatStr
local function getDate( aDate, formatStr )
local function formatDate( date, aFormatStr )
return mw.getContentLanguage():formatDate( aFormatStr, date, true )
end
if isSet( aDate ) then
local success, t = pcall( formatDate, aDate, formatStr )
return success and t or ''
else
return ''
end
end
-- inserts thousands separators in amount string
local function insertThousandsSep( amount )
local k
local sep = '%1' .. language.thousandsSep .. '%2'
while true do
amount, k = amount:gsub( '^(-?%d+)(%d%d%d)', sep )
if k == 0 then
break
end
end
return amount
end
-- localizes a number string
local function formatNumber( num )
if language.decimalSep ~= '.' then
num = num:gsub( '%.', language.decimalSep )
end
return insertThousandsSep( num )
end
-- adds the currency unit of isoCode to amount string
local function addUnit( amount, isoCode, externalFormatter )
local formatStr = getFormatter( isoCode, externalFormatter )
return mw.ustring.format( mw.text.decode( formatStr ), amount )
end
local function outputFormat( digits )
digits = math.floor( tonumber( digits ) or 2 )
if digits < 0 or digits > 6 then
digits = 2
end
return '%.'.. digits .. 'f'
end
-- selects different rate outputs due to show
local function formatRate( rate, asOf, show, digits, target )
show = ( show or '' ):lower()
rate = formatNumber( isSet( digits ) and outputFormat( digits ):format( rate )
or tostring( rate ) )
if isSet( digits ) or show == 'all' or show == language.all then
rate = addUnit( rate, target )
end
if show == 'all' or show == language.all then
return rate .. ' (' .. getDate( asOf, language.dateFormat ) .. ')'
elseif show == 'date' or show == language.date then
return getDate( asOf, language.dateFormat )
else
return rate
end
end
-- converts a single currency amount without adding the currency unit
local function convertSingle( source, target, amount, digits )
local rate, asOf, digitCount = er.getRate( source, target )
if rate then
return formatNumber( outputFormat( digits ):format(
round( amount * rate, digitCount ) ):gsub( '%.0*$', '' ) )
else
return nil
end
end
-- converts a single currency amount or an amount range and adding the currency unit
function er._convert( source, targets, amount, withUnit, digits, externalFormatter )
local amount1, amount2, pos, result
local results = {}
if not isSet( targets ) then
targets = language.defaultUnits
withUnit = true
elseif type( targets ) == 'string' then
targets = { targets }
end
amount = amount:gsub( '[ %a%' .. language.thousandsSep .. ']+', '' ):gsub( '-', '–' )
if language.decimalSep ~= '.' then
amount = amount:gsub( language.decimalSep, '.' )
end
for i, target in ipairs( targets ) do
if target ~= source then
pos = mw.ustring.find( amount, '[^,%.%d]' )
if pos then
amount1 = mw.ustring.sub( amount, 1, pos - 1 )
amount2 = tonumber( mw.ustring.sub( amount, pos + 1 ) )
else
amount1 = amount
end
amount1 = tonumber( amount1 ) or 1
result = convertSingle( source, target, amount1, digits )
if pos and result and amount2 then
amount2 = convertSingle( source, target, amount2, digits )
result = amount2 and
( result .. mw.ustring.sub( amount, pos, pos ) .. amount2 )
end
if result then
if withUnit then
result = addUnit( result, target, externalFormatter )
end
table.insert( results, result )
end
end
end
result = table.concat( results, language.commaSep )
return result ~= '' and result
end
-- returns a wrapper format string with tooltip title
function er.getWrapper( amount, source, target, digits, externalFormatter,
withMaintenance)
local formatStr = getFormatter( source, externalFormatter )
local title = er._convert( source, target, amount, true, digits )
if title then
return tostring( mw.html.create( 'abbr' )
:attr( 'title', mw.ustring.format( language.convertFormatter, title ) )
:addClass( language.wrapperClass )
:addClass( language.wrapperClass .. '-' .. source:lower() )
:wikitext( formatStr )
)
else
return formatStr .. ( withMaintenance and messages.wrongParams or '' )
end
end
-- #invoke function returning the exchange rate
function er.rate( frame )
local args = frame.args
local rate, asOf = er.getRate( args.source, args.target, true )
return rate and formatRate( rate, asOf, args.show, args.digits, args.target )
or messages.unknownIsoCode
end
-- #invoke function returning the converted amount or amount range
function er.convert( frame )
local args = frame.args
if isSet( args.show ) then
return er.rate( frame )
else
return er._convert( args.source, args.target,
isSet( args.amount ) and args.amount or '1', ( args.plain or '' ) ~= '1',
args.digits ) or messages.wrongParams
end
end
-- #invoke function returning exchange-rate information
-- returns the formatted amount or amount range with a tooltip containing
-- converted values
function er.currencyWithConversions( frame )
local args = frame.args
if not isSet( args.amount ) then
args.amount = '1'
end
return mw.ustring.format(
er.getWrapper( args.amount, args.source, args.target, args.digits, nil, true ),
args.amount:gsub( '-', '–' )
)
end
return er
mkhssyh1bongcqkdmdtx2fei412iavq
Modul:Marker utilities/i18n
828
1336
22093
20759
2026-05-20T11:08:21Z
LiMr
96
aktualizace na novější verzi
22093
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities/i18n&oldid=1768059)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities/i18n&oldid=1768059)
-- Separating code from internationalization
return {
-- module administration
moduleInterface = {
suite = 'Marker utilities',
sub = 'i18n',
serial = '2026-04-12',
item = 65441686
},
dates = { yyyymmdd = { p = '^20[0-5]%d%-[01]?%d%-[0-3]?%d$', f = 'j. M Y' },
yyyy = { p = '^20[0-5]%d$', f = 'Y' },
yy = { p = '^[0-5]%d$', f = 'Y' },
mmdd = { p = '^[01]?%d%-[0-3]?%d$', f = 'j. M' },
dd = { p = '^[0-3]?%d%.?$', f = 'j.' },
mm = { p = '^[01]?%d%.?$', f = 'M' },
lastedit = { f = 'M Y' },
asOf = { f = 'n/Y' }
},
fileExtensions = { 'tif', 'tiff', 'gif', 'png', 'jpg', 'jpeg', 'jpe',
'webp', 'xcf', 'ogg', 'ogv', 'svg', 'pdf', 'stl',
'djvu', 'webm', 'mpg', 'mpeg' },
months = { 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec',
'srpen', 'září', 'říjen', 'listopad', 'prosinec' },
monthAbbr = { 'led%.?', 'úno%.?', 'bře%.?', 'dub%.?', 'kvě%.?', 'čvn%.?',
'čvc%.?', 'srp%.?', 'zář%.?', 'říj%.?', 'lis%.?', 'pro%.?' },
-- Map related constants
map = {
coordURLformat = '//%s.wikivoyage.org/w/index.php?title=Special%%3AMapsources¶ms=%s_%s_%s&locname=%s',
defaultDmsFormat = 'f1', -- see: Module:Coordinates/i18n
defaultSiteType = 'type:landmark_globe:earth',
defaultZoomLevel = 17,
maxZoomLevel = 19, -- also to set in Module:GeoData, Module:Mapshape utilities/i18n
},
-- Wikidata properties
properties = {
appliesToJurisdiction = 'P1001',
appliesToPart = 'P518',
appliesToPeople = 'P6001',
capacity = 'P1083',
centerCoordinates = 'P5140',
commonsCategory = 'P373',
coordinates = 'P625',
endTime = 'P582', -- time
headquartersLoc = 'P159',
image = 'P18',
instanceOf = 'P31',
iso4217 = 'P498',
languageOfName = 'P407',
mainCategory = 'P910',
maximumAge = 'P4135',
minimumAge = 'P2899',
nameInNativeLang = 'P1559',
occupation = 'P106',
of = 'P642',
officialName = 'P1448',
pointInTime = 'P585',
propertyScope = 'P5314', -- for fees
quantity = 'P1114',
retrieved = 'P813',
roomNumber = 'P8733',
startTime = 'P580', -- time, for fees
streetAddress = 'P6375',
subclassOf = 'P279',
unitSymbol = 'P5061',
use = 'P366',
validInPeriod = 'P1264'
},
-- Groups of Wikidata properties
propTable = {
accessibility = { 'P2846' },
contactComments = { 'P366', 'P518', 'P642', 'P1001', 'P1559', 'P106' },
feeComments = { 'P5314', 'P518', 'P6001', 'P1264', 'P585', 'P2899',
'P4135', 'P642', 'P580' },
policyComments = { 'P518', 'P1001', 'P6001' },
quantity = { 'P1114', 'P1083' },
accessQuantity = { 'P1114', 'P1083', 'P2846' }
},
-- Wikidata properties representing a qualifier
qualifiers = {
mobilePhone = 'Q17517',
P8733 = 'Q180516',
roomNumber = 'Q180516'
},
-- Languages for fallbacks, except wiki language
langs = { 'en', 'cs', 'de' }, -- array can be empty
-- Display and performance options for vCard / Listing and Marker modules
-- additional options in Module:VCard/i18n
options = {
excludeColorTypes = true,
normalizeValues = { 'type', 'subtype', 'show', 'status', 'symbol' },
noStarParams = { 'nameExtra', 'nameLocal', 'alt', 'comment' },
noTypeMsgs = true, -- prevents display of maintenance( typeFromWD, typeIsGroup )
parameters = { 'commonscat', 'country', 'id', 'localLang', 'nameExtra', 'wikipedia' }, -- parameter is used
showLocalData = true, -- names, addresses, directions
showSisters = true, -- possible values true, false, 'atEnd'
usePropertyCateg = true, -- create maintenance categories for Wikidata properties
useTypeCateg = true, -- create maintenance categories for marker types
markerMetadata = true, -- add metadata at marker templates
-- text limit of content/description parameter
contentLimit = 1000,
groupsWithLimit = { buy = 1, drink = 1, eat = 1, sleep = 1 },
-- Wikidata related constants
searchLimit = 4, -- count of levels for P31-P279 search
-- useful but not necessary function calls
WDmediaCheck = false, -- check file names retrieved from Wikidata
mediaCheck = false, -- for better performance, otherwise expensive
-- mw.title.new( 'Media:' .. image ) call is used
secondaryCoords = false, -- adding listing coordinates to article database
-- using #coordinates parser function
skipPathCheck = false -- for URL check, see Module:UrlCheck
},
-- strings
texts = {
asOf = '; stav %s', -- with semicolon separator
from = 'od %s',
fromTo = '%s–%s',
to = 'do %s',
fromTo2 = '%s až %s',
-- General, i18n
-- black x-like cross
closeX = '[[File:Close x - black.png|15px|link=|class=noviewer|Unbekanntes Marker-Symbol]]',
missingName = 'Chybí název',
-- In case of CJK languages no spaces are used with punctuation
-- Enumeration commas. voy-listing-comma is used for alt names only
comma = '<span class="voy-listing-comma">, </span>', -- with zero-width space
commaSeparator = ', ',
period = '.',
periodSeparator= '. ',
-- Space following a punctuation mark
space = ' ',
nbSpace = ' ',
parentheses = ' (%s)',
emph = "''%s''",
-- Formatting numbers: replacement patterns
decimalPoint = ',',
groupSeparator = '.',
-- Anchor id
anchor = 'vCard_%s',
-- Marker
CategoryNS = { '[Cc]ategory', '[Kk]ategorie' },
FileNS = { '[Ff]ile', '[Ss]oubor', '[Oo]brázek' },
latitude = 'Zeměpisná šířka',
longitude = 'Zeměpisná délka',
tooltip = 'Kliknutím na značku se otevře mapa.',
-- vCard / Listing module
checkin = 'Check-in: %s',
checkout = 'Check-out: %s',
closed = 'Uzavřeno: %s',
closedPattern = '^[Uu]zavřeno:?%s*',
editInSource = 'upravit ve zdrojovém článku',
email = 'e-mail: %s',
expirationPeriod = 'now - 3 years',
fax = 'Fax: %s',
hintName = 'Název v místním jazyce %s',
hintLatin = 'Název v latinském přepisu',
hintAddress = 'Adresa v místním jazyce %s',
hintAddress2 = 'Adresa v %s',
hintDirections = 'Pokyny v místním jazyce %s',
hours = 'Otevřeno: %s',
iata = '[[International Air Transport Association|IATA]]: %s',
icao = '[[Mezinárodní organizace pro civilní letectví|ICAO]]: %s',
lastedit = 'Aktualizace: %s',
lasteditNone = 'není specifikováno',
maybeOutdated = '(Informace mohou být zastaralé)[[Kategorie:Údržba:Bod:zastaralé informace]]',
mobile = 'Mobil: %s',
payment = 'Přijímané způsoby platby: %s',
phone = '<abbr title="Telefon">Tel.</abbr>: %s',
price = 'Cena: %s',
subtype = 'Vlastnost: %s.',
subtypes = 'Vlastnosti: %s.',
subtypeAbbr = '<abbr title="%s">%s</abbr>',
subtypeFile = '[[File:%s|x14px|link=|class=noviewer voy-listing-subtype-icon|%s]]',
-- for subtype icons like Michelin stars
subtypeSpan = '<span title="%s">%s</span>',
subtypeWithCount = '%d %s',
tollfree = '<abbr title="Telefon">Tel.</abbr> zdarma: %s'
},
-- format strings for mu.addMaintenance
formats = {
category = '[[Kategorie:%s]]',
error = ' <span class="error">%s</span>',
hint = ' <span class="voy-listing-check-recommended" style="display: none;">%s</span>'
},
-- maintenance
maintenance = {
-- general
properties = '[[Kategorie:Monitoring:Data z Wikidat]]', --myslím že není třeba kategorizovat
type = { category = 'Monitoring:Data z Wikidat' }, --myslím že není třeba kategorizovat
group = { category = 'Monitoring:Data z Wikidat' }, --myslím že není třeba kategorizovat
urlWithIP = { category = 'Údržba:Špatná URL', hint = 'URL obsahuje IP adresu' },
wrongUrl = { category = 'Údržba:Neplatná URL', err = 'neplatná URL' },
commonscatWD = { category = 'Monitoring:Data z Wikidat' }, --myslím že není třeba kategorizovat
contentTooLong = { category = 'Údržba:Popis je příliš dlouhý', err = 'Popis je příliš dlouhý' },
-- currencyTooltip= { category = 'VCard: Währungstooltips eingesetzt' }, --myslím že není třeba kategorizovat
dmsCoordinate = { category = 'Údržba:DMS-souřadnice', hint = 'DMS-souřadnice' },
duplicateAliases = { category = 'Údržba:Stránky s duplicitním voláním šablon', err = 'Duplicitní aliasy: %s' },
headquarters = { category = 'VCard: Koordinate der Hauptverwaltung' },
labelFromWD = { category = 'Monitoring:Data z Wikidat', hint = 'Štítek z Wikidat' }, --myslím že není třeba kategorizovat; když tam kategorie není tak to hází chybu
-- linkIsRedirect = { category = 'VCard: Artikellink ist Weiterleitung' }, --myslím že není třeba kategorizovat
linkToOtherWV = { category = 'Údržba:Odkaz na jiné wikicesty' },
malformedName = { category = 'Údržba:Špatný název', err = 'Špatný název' },
missingImg = { category = 'Údržba:Stránky s neexistujícím souborem', err = 'Neexistující soubor: %s' },
missingNameMsg = { category = 'Údržba:Šablona Bod beze jména', err = 'Chybí název' },
missingType = { category = 'Údržba:Šablona Bod bez typu', hint = 'Chybí typ' },
nameFromWD = { category = 'Monitoring:Data z Wikidat', hint = 'Název z Wikidat' }, --myslím že není třeba kategorizovat
nameWithStar = { category = 'Údržba:Šablona Bod s hvězdičkou ve jméně', err = 'Název obsahuje hvězdičku' },
outdated = { category = 'Údržba:Akce ukončena', err = 'Akce ukončena' },
parameterUsed = { category = 'Údržba:Použitý parametr %s' }, --myslím že není třeba kategorizovat
deleteShowCopy = { category = 'Údržba:Kopie smazána', hint = 'show=kopie smazána' },
-- showInlineUsed = { category = 'VCard: show=inline gesetzt' }, --myslím že není třeba kategorizovat
-- showNoneUsed = { category = 'VCard: show=none gesetzt' },
-- showPoiUsed = { category = 'VCard: show=poi gesetzt' }, --myslím že není třeba kategorizovat
typeFromWDchain= { category = 'Monitoring:Data z Wikidat', hint = 'Typ z Wikidat' },
-- typeIsGroup = { category = 'Údržba:Chybné hodnoty', hint = 'Typ je název skupiny' },
-- typeIsColor = { category = 'Údržba:Chybné hodnoty', hint = 'Typ je název barvy' },
-- typeIsColor is not used if excludeColorTypes = true
unknownCountry = { category = 'Údržba:Články s neznámým kódem země', err = 'Neznámý kód země' },
unknownGroup = { category = 'Údržba:Šablona Bod s neznámou skupinou', err = 'Neznámá skupina' },
unknownLanguage= { category = 'Údržba:Šablona Bod s neznámým jazykem', hint = 'Neznámý místní jazyk' },
unknownParam = { category = 'Údržba:Články s neznámými parametry', err = 'Neznámý parametr: %s' },
unknownParams = { category = 'Údržba:Články s neznámými parametry', err = 'Neznámé parametry: %s' },
unknownPropertyLanguage= { category = 'Údržba:Šablona Bod s neznámým jazykem', hint = 'Neznámý jazyk pro vlastnost' },
unknownStatus = { category = 'Údržba:Šablona Bod s neznámým statusem', err = 'Neznámý status' },
unknownType = { category = 'Údržba:Chybné hodnoty', err = 'Neznámý typ: %s' },
-- unusedRedirect = { category = 'VCard: Unbenutzter Weiterleitungs-Sitelink' },
urlIsSocialMedia = { category = 'Údržba:Špatná URL', err = 'URL ze sociálních sítí' },
wikidata = { category = 'Monitoring:Data z Wikidat' },
wrongCoord = { category = 'Údržba:Šablona Bod s chybějícími souřadnicemi', err = 'Chybné souřadnice' },
wrongImgName = { category = 'Údržba:Chybný název souboru', err = 'Chybný název souboru' },
wrongQualifier = { category = 'Údržba:Nesprávný odkaz na Wikidata', err = 'Nesprávný odkaz na Wikidata' },
-- Marker module
missingCoord = { category = 'Údržba:Šablona Bod s chybějícími souřadnicemi', err = 'Chybí souřadnice' },
numberUsed = { category = 'Údržba:Chybné hodnoty' },
unknownIcon = { category = 'Údržba:Chybné hodnoty' },
-- vCard / Listing module
countryFromWD = { category = 'Monitoring:Data z Wikidat' },
missingCoordVc = { category = 'Údržba:Šablona Bod s chybějícími souřadnicemi' },
paymentUsed = { category = 'Monitoring:Zadána platební metoda' },
socialUrlUsed = { category = 'Údržba:URL sociálních sítí', hint = 'Použita URL sítě %s' },
unitFromWD = { category = 'Monitoring:Data z Wikidat' },
unknownLabel = { category = 'Údržba:Neznámý štítek nebo id' },
unknownMAKI = { category = 'Údržba:Neznámý symbol MAKI', hint = 'Neznámý symbol MAKI' },
unknownShow = { category = 'Údržba:Chybné hodnoty', err = 'Hodnota(y) pro show neznámá: %s' },
unknownSubtype = { category = 'Údržba:Chybné hodnoty', err = 'Hodnota(y) pro podtyp neznámý: %s' },
unknownUnit = { category = 'Údržba:Chybné hodnoty', hint = 'Neznámá entita' },
unknowWDfeatures = { category = 'Údržba:Šablona Bod s neznámými charakteristikami Wikidat', hint = 'Neznámé charakteristiky Wikidat' },
wdWithGoogleCid = { category = 'VCard: Parametr google-maps používaný společně s Wikidaty', hint = 'google-maps použito s Wikidaty' },
wikidataWithId = { category = 'VCard: Parametr id používaný společně s Wikidaty', hint = 'id použito s Wikidaty' },
wrongDate = { category = 'Údržba:Články s chybami v datech', hint = 'Nesprávné datum' },
wrongGoogleCid = { category = 'VCard: Nesprávné ID zákazníka Google map', err = 'Nesprávné ID zákazníka Google map' },
wrongId = { category = 'VCard: Nesprávné id', err = 'Nesprávné id' },
wrongSocialId = { category = 'Údrža:Nesprávné ID sociální sítě', err = 'Nesprávné ID %s' },
wrongSocialUrl = { category = 'Údržba:Neplatná URL', err = 'Chybná URL %s' }
},
iconTitles = {
commons = '%s na Wikimedia Commons',
facebook = '%s na Facebooku',
flickr = '%s na Flickru',
instagram = '%s na Instagramu',
internet = 'Web tohoto místa',
maps = '%s na mapách a v plánovačích tras',
rss = 'RSS webový zdroj této instituce',
tiktok = '%s na TikToku',
wikidata = '%s (%s) na Wikidatech',
wikipedia = '%s na Wikipedii',
wikivoyage = '%s na Wikicestách (Wikivoyage) v jiném jazyce',
x = '%s na X',
youtube = '%s na YouTube'
},
-- social media services
services = {
{ key = 'facebook', url = 'https://www.facebook.com/%s', pattern = { '^[-.%d%w][-_.%d%w]+$', '^[^%z\1-,/:-?\91-\94{-~]+/[1-9]%d+$' } },
{ key = 'flickr', url = 'https://www.flickr.com/photos/%s', pattern = '^%d%d%d%d%d+@N%d%d$' },
{ key = 'instagram', url = 'https://www.instagram.com/%s/', pattern = { '^[0-9a-z_][0-9a-z._]+[0-9a-z_]$', '^explore/locations/%d+$' } },
{ key = 'tiktok', url = 'https://www.tiktok.com/@%s', pattern = '^[0-9A-Za-z_][0-9A-Za-z_.]+$' },
{ key = 'x', url = 'https://x.com/%s', pattern = '^[0-9A-Za-z_]+$' },
{ key = 'youtube', url = { 'https://www.youtube.com/channel/%s', 'https://www.youtube.com/%s' },
pattern = { '^UC[-_0-9A-Za-z]+[AQgw]$', '^@[-0-9A-Za-z_.][-0-9A-Za-z_.][-0-9A-Za-z_.]+$' } }
},
--[[ status symbols
g: successive symbol group number
alias: status alias
label: image tag title
category = 1: add maintenance category
--]]
statuses = {
['top-hotel'] = { g = 1, label = 'Top-Hotel', category = 1 },
['top-restaurant'] = { g = 1, label = 'Top-Restaurace', category = 1 },
['top-sight'] = { g = 1, label = 'Top-Atrakce', category = 1 },
recommendation = { g = 1, label = 'Doporučení' },
none = { g = 2, alias = 'class-0', label = "Bez klasifikace" },
stub = { g = 2, alias = 'class-1', label = "Pahýl" },
outline = { g = 2, alias = 'class-2', label = "Návrh článku" },
usable = { g = 2, alias = 'class-3', label = "Užitečný článek" },
guide = { g = 2, alias = 'class-4', label = "Celý článek" },
star = { g = 2, alias = 'class-5', label = "Doporučený článek" }
},
-- Marker name styles
-- Colors in Template:VCard/styles.css
nameStyles = {
inherit = 'font-weight: inherit; font-style: inherit;',
italic = 'font-weight: normal; font-style: italic;',
kursiv = 'font-weight: normal; font-style: italic;', -- de: kursiv = italic
normal = 'font-weight: normal; font-style: normal;',
station = 'font-weight: normal; white-space: nowrap; padding-left: 2px; padding-right: 2px;'
},
-- yes/no variants
yesno = {
y = 'y',
yes = 'y',
j = 'y',
ja = 'y',
a = 'y',
ano = 'y',
n = 'n',
no = 'n',
nein = 'n',
ne = 'n'
},
-- List of currencies without conversion tooltips
noCurrencyConversion = {
-- all = 1, -- no rate conversion tooltips are shown
-- there is no confusion with (uppercase) ALL = "Q125999"
EUR = 1 -- local currency
},
-- Language-dependent sorting substitutes
substitutes = {
{ l = 'ä', as = 'a' },
{ l = 'ö', as = 'o' },
{ l = 'ü', as = 'u' },
{ l = 'ß', as = 'ss' }
}
}
it8czwkwhb3j8gpocvzz93mivqbs0be
Modul:Marker utilities
828
1337
22092
20820
2026-05-20T10:57:29Z
LiMr
96
aktualizace na novější verzi
22092
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities&oldid=1775579)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities&oldid=1775579)
--[[
Functions library for Marker and vCard modules
In non-Wikivoyage projects, sister-project links functions have to be adapted.
]]--
-- require( 'strict' )
local cd = require( 'Module:Coordinates2' )
local mg = require( 'Module:Marker utilities/Groups' )
local mi = require( 'Module:Marker utilities/i18n' )
local mm -- MAKI icons
local mt = require( 'Module:Marker utilities/Types' ) -- types to groups like drink, eat, go, see, sleep, ...
local uc -- URL check
local wu = require( 'Module:Wikidata utilities' )
-- module variable and administration
local mu = {
moduleInterface = {
serial = '2026-05-16',
item = 58187612
},
comma = mi.texts.comma,
commaSeparator = mi.texts.commaSeparator
}
-- to keep background color in print
local colorAdjust = { ['-webkit-print-color-adjust'] = 'exact', ['color-adjust'] = 'exact',
['print-color-adjust'] = 'exact' }
-- maintenance tools
function mu.initMaintenance()
mu.invalidParams = {} -- table of unknown parameters
mu.duplicateAliases = {} -- table of duplicate parameter aliases
mu.maintenance = {} -- table of error strings
mu.types = mt.types
mu.groups = mg.groups
mu.typeAliases = nil -- table for type aliases. Create on demand
mu.groupAliases = nil -- table for group aliases
end
local function contains( new )
for i = 1, #mu.maintenance do
if mu.maintenance[ i ] == new then
return true
end
end
return false
end
function mu.addMaintenance( key, value )
local s = key -- fallback
local tab = mi.maintenance[ key ]
if tab then
s = mi.formats.category:format( tab.category ) ..
( tab.err and mi.formats.error:format( tab.err ) or '' ) ..
( tab.hint and mi.formats.hint:format( tab.hint ) or '' )
end
s = value and mw.ustring.format( s, value ) or s
if not contains( s ) then
table.insert( mu.maintenance, s )
end
end
function mu.getCategories( formatStr )
return wu.getCategories( formatStr )
end
local function getMaintenance()
if #mu.invalidParams == 1 then
mu.addMaintenance( 'unknownParam', mu.invalidParams[ 1 ] )
elseif #mu.invalidParams > 1 then
mu.addMaintenance( 'unknownParams',
table.concat( mu.invalidParams, mu.commaSeparator ) )
end
if #mu.duplicateAliases > 0 then
mu.addMaintenance( 'duplicateAliases',
table.concat( mu.duplicateAliases, mu.commaSeparator ) )
end
return table.concat( mu.maintenance, '' )
end
function mu.makeMaintenance( page, modules )
local r = getMaintenance()
if mi.options.usePropertyCateg then
local m = mi.maintenance.properties -- format string
for i, aModule in ipairs( modules ) do
if aModule then
r = r .. aModule.getCategories( m )
end
end
end
if page.namespace ~= 0 then
-- remove maintenance categories
r = r:gsub( '%[%[[^%]]+%]%]', '' )
end
return r
end
-- general-use functions
function mu.isSet( arg )
return arg and arg ~= ''
end
function mu.convertForSort( s )
s = s:ulower()
for i, obj in ipairs( mi.substitutes ) do
s = mw.ustring.gsub( s, obj.l, obj.as )
end
return s
end
-- replacing decimal separator and inserting group separators
function mu.formatNumber( num )
if mu.isSet( mi.texts.decimalPoint ) and mi.texts.decimalPoint ~= '.' then
num = num:gsub( '%.', mi.texts.decimalPoint )
end
if mu.isSet( mi.texts.groupSeparator ) then
local count
repeat
num, count = num:gsub( '^([-+]?%d+)(%d%d%d)',
'%1%' .. mi.texts.groupSeparator .. '%2' )
until count == 0
end
return num
end
function mu.tableInsert( tab, value )
if mu.isSet( value ) then
table.insert( tab, value )
end
end
-- splitting string s at sep, removing empty substrings
-- sep is a single character separator but no magic pattern character
function mu.textSplit( s, sep )
local result = {}
if type( s ) ~= 'string' then
return result
end
for str in s:gmatch( '([^' .. sep .. ']+)' ) do
mu.tableInsert( result, mw.text.trim( str ) )
end
return result
end
local function encodeSpaces( s )
s = s:gsub( '[_%s]+', '_' )
return s
end
local function removeChars( s, pattern )
s = s:find( pattern ) and s:gsub( pattern, '' ) or s
return s
end
local function replaceWithSpace( s, pattern )
s = s:find( pattern ) and s:gsub( pattern, ' ' ) or s
return s
end
-- Splitting comma separated lists to a table and converting items
function mu.split( s )
local arr = {}
if not mu.isSet( s ) then
return arr
end
for i, str in ipairs( mu.textSplit( s, ',' ) ) do
arr[ encodeSpaces( str ) ] = 1
end
return arr
end
function mu.makeSpan( s, class, isBdi, attr, css )
return tostring( mw.html.create( isBdi and 'bdi' or 'span' )
:addClass( class )
:attr( attr or {} )
:css( css or {} )
:wikitext( s )
)
end
-- bdi and bdo tags are not working properly on all browsers. Adding marks
-- (lrm, rlm) is maybe the only way for a correct output
function mu.languageSpan( s, titleHint, page, country, addClass )
if not mu.isSet( s ) then
return ''
end
local bdi = mw.html.create( 'bdi' )
:addClass( addClass )
:wikitext( s )
local c = country.lang
if c == '' or c == page.lang then
return tostring( bdi )
end
local dir
local fStr = '%s'
if country.isRTL and not page.isRTL then
dir = 'rtl'
fStr = '‏%s‎'
elseif not country.isRTL and page.isRTL then
dir = 'ltr'
fStr = '‎%s‏'
end
return fStr:format( tostring( bdi
:addClass( 'voy-lang voy-lang-' .. c )
:attr( { title = mw.ustring.format( titleHint , country.langName ),
lang = c, dir = dir } )
) )
end
function mu.addWdClass( isFromWikidata )
return isFromWikidata and ' voy-wikidata-content' or ''
end
function mu.getAliases( tab, key )
local result = {}
if not tab then
return result
end
local v
for k, tb in pairs( tab ) do
v = tb[ key ]
if v then
if type( v ) == 'table' then
for i = 1, #v do
result[ v[ i ] ] = k
end
else
result[ v ] = k
end
end
end
return result
end
function mu.yesno( val )
return mi.yesno[ val:ulower() ]
end
-- check functions
local function emphasize( s )
return mw.ustring.format( mi.texts.emph, s )
end
-- args: template arguments consisting of argument name as key and a value
-- validKeys: table with argument name as key used by the script and
-- a string or a table of strings for argument names used by the local wiki
function mu.checkArguments( templateArgs, validKeys )
local args = {}
if not templateArgs or not validKeys or not next( validKeys ) then
return args
end
local keys = {} -- list of wiki-dependent parameter names
for key, params in pairs( validKeys ) do
if type( params ) == 'string' then
keys[ params ] = key
else
for i = 1, #params do
keys[ params[ i ] ] = key
end
end
end
local targetKey
for key, arg in pairs( templateArgs ) do
targetKey = keys[ key ]
if targetKey then
if args[ targetKey ] then -- prevents duplicates
table.insert( mu.duplicateAliases, emphasize( key ) )
else
args[ targetKey ] = arg
end
else
table.insert( mu.invalidParams, emphasize( key ) )
end
end
-- normalize values
for i, param in ipairs( mi.options.normalizeValues ) do
if mu.isSet( args[ param ] ) then
args[ param ] = replaceWithSpace( args[ param ]:ulower(), '[_%s]+' )
end
end
return args
end
local function removeNS( s, nsTable )
if not s:find( ':', 1, true ) then
return s
end
local t = s
for i = 1, #nsTable do
t = mw.ustring.gsub( t, '^' .. nsTable[ i ] .. ':', '' )
if s ~= t then
return t
end
end
return t
end
function mu.checkCommonsCategory( args )
-- remove namespace from category
if mu.isSet( args.commonscat ) then
args.commonscat = removeNS( args.commonscat, mi.texts.CategoryNS )
end
end
-- checking coordinates
function mu.checkCoordinates( args )
local function clearCoordinates()
args.lat, args.long = '', ''
end
local t
if type( args.lat ) == 'boolean' or type( args.long ) == 'boolean' then
clearCoordinates()
end
if args.lat == '' and args.long == '' then
return
elseif args.lat ~= '' and args.long == '' then
t = args.lat:find( ',', 1, true )
if t then
args.long = mw.text.trim( args.lat:sub( t + 1, #args.lat ) )
args.lat = mw.text.trim( args.lat:sub( 1, t - 1 ) )
end
end
if args.lat == '' or args.long == '' then
clearCoordinates()
mu.addMaintenance( 'wrongCoord' )
return
end
local dms = false
t = tonumber( args.lat )
if t then
args.lat = math.abs( t ) <= 90 and t or ''
else
t = cd.toDec( args.lat, 'lat', 6 )
args.lat = t.error == 0 and t.dec or ''
dms = args.lat ~= ''
end
if args.lat ~= '' then
t = tonumber( args.long )
if t then
args.long = ( t > -180 and t <= 180 ) and t or ''
else
t = cd.toDec( args.long, 'long', 6 )
args.long = t.error == 0 and t.dec or ''
dms = dms or args.long ~= ''
end
end
if args.lat == '' or args.long == '' then
clearCoordinates()
mu.addMaintenance( 'wrongCoord' )
elseif dms then
mu.addMaintenance( 'dmsCoordinate' )
end
end
-- check zoom level
function mu.checkZoom( args )
args.zoom = math.floor( tonumber( args.zoom ) or mi.map.defaultZoomLevel )
if args.zoom < 0 or args.zoom > mi.map.maxZoomLevel then
args.zoom = mi.map.defaultZoomLevel
end
end
-- image check
function mu.checkImage( args, entity )
if type( args.image ) == 'boolean' or args.image == '' then
return
end
-- formal checks
if args.image:find( '^https?:' ) then
args.image = ''
else
-- remove namespace
args.image = removeNS( args.image, mi.texts.FileNS )
local extensionExists = false
local im = args.image:lower()
for i = 1, #mi.fileExtensions do
if im:find( '%.' .. mi.fileExtensions[ i ] .. '$' ) then
extensionExists = true
break
end
end
if not extensionExists then
args.image = ''
end
end
if args.image == '' then
mu.addMaintenance( 'wrongImgName' )
return
end
local alreadyChecked = false
if mi.options.mediaCheck and args.image ~= '' then
if not mi.options.WDmediaCheck and entity then
-- check if image is stored in Wikidata
local imgs = wu.getValues( entity, mi.properties.image, nil )
for i = 1, #imgs do
if imgs[ i ] == args.image then
alreadyChecked = true
break
end
end
end
if not alreadyChecked then
-- expensive function call
local title = mw.title.new( 'Media:' .. args.image )
if not title or not title.exists then
mu.addMaintenance( 'missingImg', args.image )
args.image = ''
end
end
end
end
function mu.checkStatus( args )
args.statusTable = {}
local hash = {}
if mu.isSet( args.status ) then
local statusAliases = mu.getAliases( mi.statuses, 'alias' )
for i, t in ipairs( mu.textSplit( args.status, ',' ) ) do
t = encodeSpaces( t )
t = statusAliases[ t ] or t
if mi.statuses[ t ] then
if not hash[ t ] then
table.insert( args.statusTable, t )
hash[ t ] = 'x'
end
else
mu.addMaintenance( 'unknownStatus' )
end
end
if #args.statusTable > 1 then
table.sort( args.statusTable,
function( a, b )
local at = mi.statuses[ a ]
local bt = mi.statuses[ b ]
return ( at.g < bt.g ) or ( at.g == bt.g and a < b )
end
)
end
end
end
function mu.checkStyles( args )
if mu.isSet( args.styles ) then
if mi.nameStyles[ args.styles:lower() ] then
args.styles = args.styles:lower()
args.styleClass = ' voy-listing-name-style-' .. args.styles
args.styles = mi.nameStyles[ args.styles ]
end
else
args.styles = nil
end
end
function mu.checkId( args )
if mu.isSet( args.id ) and mu.isSet( args.wikidata ) then
mu.addMaintenance( 'wikidataWithId' )
args.id = ''
end
if mu.isSet( args.id ) and args.id:find( '[!-,.-/:-?[-^{-\127%z\1-\31]' ) then
mu.addMaintenance( 'wrongId' )
args.id = ''
end
end
function mu.checkLength( s, min, max )
return #s >= ( min or 0 ) and #s <= ( max or 1000 )
end
-- groups translation for map legend into Wiki language
local function translateGroup( group )
if not mu.isSet( group ) then
group = mt.types.error.group
end
local t = mg.groups[ group ]
if t then
t = t.map or t.label or t.alias or group
if type( t ) == 'table' then
t = t[ 1 ]
end
return t
end
return group
end
local function getTypeFromTypeAliases( aType )
if not mu.typeAliases then
mu.typeAliases = mu.getAliases( mt.types, 'alias' )
end
return mu.typeAliases[ aType ]
end
local function getGroupFromGroupAliases( group )
if not mu.groupAliases then
mu.groupAliases = mu.getAliases( mg.groups, 'alias' )
end
return mu.groupAliases[ group ]
end
-- getting marker type and group
function mu.checkTypeAndGroup( args )
local s
args.typeTable = {}
args.subtypeTable = {}
-- check group
if mu.isSet( args.group ) then
mu.addMaintenance( 'parameterUsed', 'group' )
s = mg.groups[ args.group ]
if not s then
s = getGroupFromGroupAliases( args.group )
if s then
args.group = s
s = mg.groups[ args.group ]
end
end
if not s then
mu.addMaintenance( 'unknownGroup' )
args.group = ''
elseif s.is and s.is == 'color' and mi.options.useTypeCateg then
mu.addMaintenance( 'group', args.group )
end
end
-- check type
if not mu.isSet( args.type ) then
args.type = mt.types.error.group
mu.addMaintenance( 'missingType' )
elseif args.type == mt.types.error.group then
mu.addMaintenance( 'unknownType', args.type )
end
if args.type == mt.types.error.group then
args.group = mt.types.error.group
else
-- split seperate types and analyse them
for i, t in ipairs( mu.textSplit( args.type, ',' ) ) do
-- try to find the type t in types or groups
t = encodeSpaces( t )
if not mt.types[ t ] then
t = getTypeFromTypeAliases( t ) or getGroupFromGroupAliases( t ) or t
end
s = mg.groups[ t ]
if s then -- type is a group itself
if s.is and s.is == 'color' then
if mi.options.excludeColorTypes then
args.group = mt.types.error.group
mu.addMaintenance( 'unknownType', t )
else
mu.addMaintenance( 'typeIsColor' )
end
elseif not mi.options.noTypeMsgs then
mu.addMaintenance( 'typeIsGroup' )
end
if args.group == '' then
args.group = t
end
else
s = mt.types[ t ]
if s then
if args.group == '' then
args.group = s.group
end
if mu.isSet( s.subtype ) then
table.insert( args.subtypeTable, t )
end
else
args.group = mt.types.error.group
mu.addMaintenance( 'unknownType', t )
end
end
table.insert( args.typeTable, t )
if mi.options.useTypeCateg then
mu.addMaintenance( 'type', t )
end
end
args.type = table.concat( args.typeTable, ',' )
end
args.groupTranslated = translateGroup( args.group )
mu.getColor( args )
end
local function isUrl( url )
uc = uc or require( 'Module:UrlCheck' )
return uc.isUrl( url, mi.options.skipPathCheck )
end
-- url check in args
function mu.checkUrl( args )
if not mu.isSet( args.url ) then
return
end
local c = isUrl( args.url ) -- getting result code
if c > 2 then
mu.addMaintenance( 'wrongUrl' )
args.url = ''
elseif c == 2 then -- URL contains IP address
mu.addMaintenance( 'urlWithIP' )
else
if args.url:find( 'twitter.com', 1, true ) then -- old X url
mu.addMaintenance( 'urlIsSocialMedia' )
args.url = ''
else
for i = 1, #mi.services do
if args.url:find( '[./]' .. mi.services[ i ].key .. '.com' ) then
mu.addMaintenance( 'urlIsSocialMedia' )
args.url = ''
break
end
end
end
end
end
-- type and group functions
-- getting a set of parameters for a given type
function mu.getTypeParams( aType )
return mt.types[ aType ]
end
function mu.idToType( id )
if not mu.typeIds then
mu.typeIds = mu.getAliases( mt.types, 'wd' ) -- Q id to type table
end
return mu.typeIds[ id ]
end
function mu.getTypeLabel( id )
if not mu.isSet( id ) then
return ''
end
if id:match( '^Q%d+$' ) then
id = mu.idToType( id )
if not id then
return ''
end
else
id = encodeSpaces( id )
end
local at, t
t = mt.types[ id ]
if not t then
t = getTypeFromTypeAliases( id )
t = t and mt.types[ t ]
end
if t then
t = t.label or id
at = t:find( ',', 1, true )
if at then
t = t:sub( 1, at - 1 )
end
else
t = replaceWithSpace( id, '_' )
end
return t
end
function mu.typeExists( aType )
return mt.types[ aType ] and aType or getTypeFromTypeAliases( aType )
end
-- check if the specified group can have events
function mu.groupWithEvents( group )
return mg.groups[ group ] and mg.groups[ group ].withEvents
end
-- see: https://www.w3.org/TR/WCAG20/#relativeluminancedef
local function hexToLinear( hex )
hex = tonumber( hex, 16 ) / 255.0
if hex <= 0.03928 then
return hex / 12.92
else
return ( ( hex + 0.055 ) / 1.055 ) ^ 2.4
end
end
-- relative luminance of a color
-- 6 digit hex color
local function hexToLuminance( color )
local r = hexToLinear( color:sub( 1, 2 ) )
local g = hexToLinear( color:sub( 3, 4 ) )
local b = hexToLinear( color:sub( 5, 6 ) )
return 0.2126 * r + 0.7152 * g + 0.0722 * b
end
local function isInverse( backgroundColor )
-- the luminance threshold should be greater than 0.2848 (i.e. magenta,
-- error, #FF00FF) and smaller than 0.4
-- the value chosen of 0.386 corresponds to a light magenta (#FF69FF) which
-- seems to be used for Wikimedia's map server
-- see: https://github.com/wikimedia/makizushi/blob/master/lib/color.js
local luminanceThreshold = 0.386
backgroundColor = backgroundColor:sub( 2 ) -- remove #
:gsub( '^(%x)(%x)(%x)$', '%1%1%2%2%3%3' )
return hexToLuminance( backgroundColor ) > luminanceThreshold
end
-- getting color from group in args
function mu.getColor( args )
local c = mg.groups[ args.group ] or mg.groups[ 'error' ]
args.color = c.color
args.inverse = isInverse( c.color )
end
-- Splitting comma separated lists to a table of key items
-- checking items with allowed key values of validValues table
local function splitAndCheck( s, validValues )
local values = {}
if not validValues then
return values, ''
end
local errors = {}
for item, v in pairs( mu.split( s ) ) do
-- value check
if validValues[ item ] then
values[ item ] = 1
else
table.insert( errors, item )
end
end
return values, table.concat( errors, mu.commaSeparator )
end
local function setCopyMarker( args, show )
if show.copy and ( mu.isSet( args.copyMarker ) or not mu.isSet( args.wikidata ) ) then
show.copy = nil
mu.addMaintenance( 'deleteShowCopy' )
end
if show.copy then
args.copyMarker = args.wikidata
end
if mu.isSet( args.copyMarker ) then
show.symbol = nil
end
end
-- treatment of social media services if Wikidata is available
local function setSocialMedia( args, value )
for i, service in ipairs( mi.services ) do
args[ service.key ] = value
end
end
function mu.getShow( default, args, validValues )
local show = mu.split( default )
local add, err = splitAndCheck( args.show, validValues )
if err ~= '' then
mu.addMaintenance( 'unknownShow', err )
end
-- maintenance
if add.inline then
show.inlineSelected = true
mu.addMaintenance( 'showInlineUsed' )
end
if add.poi then
mu.addMaintenance( 'showPoiUsed' ) -- is default
end
-- overwriting defaults
if add.none or add.coord or add.poi or add.all then
show.all, show.coord, show.poi = nil, nil, nil
end
-- merge show with add values
for key, value in pairs( add ) do
show[ key ] = value
end
if show.none then
show.none, show.all, show.coord, show.poi = nil, nil, nil, nil
end
if show.all then
show.all = nil
show.coord, show.poi = 1, 1
end
if show.noname then
show.noname, show.name = nil, nil
else
show.name = 1
end
setCopyMarker( args, show )
if args.wikidata ~= '' then
if show.socialmedia then
setSocialMedia( args, 'y' )
elseif show.nosocialmedia then
setSocialMedia( args, 'n' )
end
end
if not show.nosocialmedia then
show.socialmedia = 1
end
return show
end
-- removing line breaks and controls from parameter strings
function mu.removeCtrls( s, onlyInline )
local descrDiv = false -- div tag instead of span tag for description needed?
-- remove controls from tags
s = s:gsub( '(<[^>]+>)', function( t )
return replaceWithSpace( t, '[%z\1-\31]' )
end )
local t = removeChars( s, '[%z\1-\8\11\12\14-\31]' ) -- ctrl chars
t = replaceWithSpace( t, '[\9]' ) -- horizontal tab
t = replaceWithSpace( t, '</br%s*>' )
if onlyInline then
t = replaceWithSpace( t, '<br[^/>]*/*>' ) -- no line breaks
t = replaceWithSpace( t, '</*p[^/>]*/*>' ) -- no paragraphs
t = replaceWithSpace( t, '</*div[^/>]*/*>' ) -- no divs
t = mw.text.trim( replaceWithSpace( t, '[\10\13]' ) ) -- no line breaks
-- not %c because \127 is used for Mediawiki tags (strip markers `UNIQ)
else
descrDiv = t:find( '[\10\13]' ) or t:find( '<br[^/>]*/*>' ) or
t:find( '<p[^/>]*>' ) or t:find( '<div[^/>]*>' )
end
-- remove LTR and RTL marks
t = mw.ustring.gsub( t, '[]+', '' )
if descrDiv then
-- unify line breaks to Linux mode
t = t:gsub( '\13\10', '\10' ):gsub( '\13', '\10' )
-- replace line breaks by <br> in block mode
t = t:gsub( '([^>%]\10])\10+([^<%[\10])', '%1<br class="voy-listing-next-paragraph" />%2' )
end
return replaceWithSpace( t, '%s%s+' ), descrDiv
end
-- fetch data from Wikidata
function mu.getCoordinatesFromWikidata( args, fromWikidata, entity )
if not entity or ( args.lat ~= '' and args.long ~= '' ) then
return
end
-- center coordinates from Wikidata
local c = wu.getValue( entity, mi.properties.centerCoordinates )
if c == '' then
-- coordinates from Wikidata
c = wu.getValue( entity, mi.properties.coordinates )
end
-- search for headquarters location
if c == '' then
local tab = wu.getValuesWithQualifiers( entity, mi.properties.headquartersLoc,
nil, mi.properties.coordinates )
if #tab > 0 then
tab = tab[ 1 ][ mi.properties.coordinates ]
if tab and #tab > 0 then
c = tab[ 1 ]
mu.addMaintenance( 'headquarters' )
args.coordFrom = 'headquarters'
end
end
end
if c ~= '' then
args.lat, args.long = c.latitude, c.longitude
fromWikidata.lat = true
end
end
local function typeSearch( p31 )
-- p31: array of Wikidata values
if not p31 or #p31 == 0 then
return ''
end
local firstStep = true
local function compareLabels( ar )
if not ar then
return nil
elseif type( ar ) == 'string' then
ar = { ar }
end
for i, value in ipairs( ar ) do
if mu.isSet( value ) then
value = ( encodeSpaces( value ) )
if mt.types[ value ] then
return value
end
end
end
return nil
end
local function compareIds( ar )
local id, t
for i = 1, #ar do
id = ar[ i ].id
-- md: indexed array of q id - types relations
t = mu.idToType( id )
if t then
return t
end
-- checking English label and aliases
t = compareLabels( mw.wikibase.getLabelByLang( id, 'en' ) )
or compareLabels( wu.getAliases( id, 'en' ) )
if t then
if firstStep and not mi.options.noTypeMsgs then
firstStep = false
mu.addMaintenance( 'typeFromWDchain' )
end
return t
end
end
return nil
end
local aType = compareIds( p31 ) -- check p31 ids first, maybe step 2 is not nessary
if aType then
return aType
end
-- now functions becomes expensive because of multiple wu.getValues calls
local id, ids
firstStep = false
for i = 1, #p31 do -- step 2: analyse P279 chains of first ids
id = p31[ i ].id -- start id
local j = 0
repeat
ids = wu.getValues( id, mi.properties.subclassOf, nil )
if #ids > 0 then
aType = compareIds( ids )
if aType then
if not mi.options.noTypeMsgs then
mu.addMaintenance( 'typeFromWDchain' )
end
return aType
end
id = ids[ 1 ].id
end
j = j + 1
-- limit: maximum levels to analyse
until j >= mi.options.searchLimit or #ids == 0
end
return ''
end
function mu.getTypeFromWikidata( args, entity )
if mu.isSet( args.type ) then
return
end
local p31 = wu.getValues( entity, mi.properties.instanceOf )
if #p31 == 0 then
p31 = wu.getValues( entity, mi.properties.subclassOf )
end
args.type = typeSearch( p31 )
end
function mu.getCommonsCategory( args, entity )
-- getting commonscat from commonswiki sitelink before P373
-- because sitelink is checked by Wikidata
if type( args.commonscat ) == 'boolean' then
args.commonscat = ''
end
local t = wu.getSitelink( entity, 'commonswiki' ) or ''
if t:match( '^Category:.+$' ) then
t = t:gsub( '^[Cc]ategory:', '' )
else
t = wu.getValue( entity, mi.properties.commonsCategory )
if t == '' then
local id = wu.getId( entity, mi.properties.mainCategory )
if id ~= '' then
t = wu.getSitelink( id, 'commonswiki' ) or ''
t = t:gsub( '^[Cc]ategory:', '' )
end
end
end
if t ~= '' and args.commonscat ~= '' then
mu.addMaintenance( 'commonscatWD' )
end
if args.commonscat == '' then
args.commonscat = t
end
end
function mu.getLangTable( wikiLang, localLang )
local langs = { wikiLang }
for i, lang in ipairs( mi.langs ) do
table.insert( langs, lang )
end
if mu.isSet( localLang ) and localLang ~= wikiLang then
table.insert( langs, localLang )
end
return langs
end
-- getting names from Wikidata
function mu.getNamesFromWikidata( args, fromWikidata, page, country, entity )
-- getting official names
local officialNames =
wu.getMonolingualValues( entity, mi.properties.officialName )
if type( args.name ) == 'boolean' or args.name == '' then
args.name = ''
local langs = mu.getLangTable( page.lang )
for i, lang in ipairs( langs ) do
args.name = officialNames[ lang ]
if args.name then
break
end
end
-- if failed then get labels
if not mu.isSet( args.name ) then
for i, lang in ipairs( langs ) do
args.name = wu.getLabel( entity, lang, true ) -- no fallback
if args.name then
break
end
end
args.name = args.name or ''
end
if args.name ~= '' then
mu.addMaintenance( 'nameFromWD' )
fromWikidata.name = true
end
end
-- get local name if no name is available
if args.name == '' and
not ( type( args.nameLocal ) == 'string' and args.nameLocal ~= '' ) then
args.nameLocal = true
-- no local name if country and wiki language are identical
elseif args.nameLocal == true and page.lang == country.lang then
args.nameLocal = ''
end
if type( args.nameLocal ) == 'string' and args.nameLocal ~= '' then
-- keeping local name in any case for html data
args.addNameLocal = args.nameLocal
return
end
local nameLocal = officialNames[ country.lang ] or ''
if nameLocal == '' then
nameLocal = wu.getLabel( entity, country.lang, true ) or ''
end
if args.nameLocal == true then
args.nameLocal = nameLocal
if args.name == '' and args.nameLocal ~= '' then
args.name = args.nameLocal
args.nameLocal = ''
mu.addMaintenance( 'nameFromWD' )
fromWikidata.name = true
end
if args.name:ulower() == args.nameLocal:ulower() then
args.nameLocal = ''
end
fromWikidata.nameLocal = args.nameLocal ~= ''
elseif page.lang ~= country.lang and args.name ~= nameLocal then
args.addNameLocal = nameLocal
end
end
-- getting link to Wikivoyage
function mu.getArticleLink( args, entity, page )
local title, isRedirect =
wu.getCheckedSitelink( entity, page.lang .. page.globalProject )
if title and title ~= page.text then
args.wikiPage = title
if isRedirect == true then
args.linkIsRedirect = true
end
end
end
-- marker functions
-- returns a single data set from Module:Marker utilities/Maki icons
local function getMaki( key )
mm = mm or require( 'Module:Marker utilities/Maki icons' )
key = key:lower():gsub( '[_%s]+', '-' )
return mm.icons[ key ]
end
local function getMakiIconId( key )
if not mu.isSet( key ) then
return nil
end
key = key:lower():gsub( '[_%s]+', '-' )
if getMaki( key ) then
return key
end
key = mt.types[ key ] and mt.types[ key ].icon
if key and getMaki( key ) then
return key
end
return nil
end
local function addIconToMarker( args )
args.text = ( '[[File:Maki7-%s.svg|x14px|link=|class=noviewer]]' ):format( args.symbol )
args.isIcon = true
end
-- distinguishing marker symbols, default: number
local function makeMarkerProperties( args, show )
args.symbol = args.symbol or ''
local noSymbol = args.symbol == ''
if args.symbol == '' and show.poi and show.symbol then
args.symbol = getMakiIconId( args.typeTable[ 1 ] ) or ''
end
local isIcon = getMaki( args.symbol )
if args.symbol == '' or args.symbol == 'number' then
args.symbol = '-number-' .. args.group
elseif args.symbol == 'letter' then
args.symbol = '-letter-' .. args.group
elseif args.symbol:len() == 1 and args.symbol:match( '%w' ) then
args.text = args.symbol:upper()
mu.addMaintenance( 'numberUsed' )
elseif args.symbol ~= '' and args.text == '' and isIcon then
addIconToMarker( args )
elseif args.symbol ~= '' and not isIcon then
args.text = mi.texts.closeX
args.isIcon = true
args.group = 'error'
mu.getColor( args )
mu.addMaintenance( noSymbol and 'unknownMAKI' or 'unknownIcon' )
end
end
-- making marker symbol
function mu.makeMarkerSymbol( args, show, frame )
local title = args.givenName.all
local extraClasses = args.group == 'error' and ' voy-listing-map-is-error' or ''
if mu.isSet( args.copyMarker ) then
local copyClass = 'voy-listing-map voy-copy-marker plainlinks printNoLink' ..
extraClasses
return tostring( mw.html.create( 'span' )
:addClass( copyClass )
:css( colorAdjust )
-- display will be replaced by [[MediaWiki:Gadget-GeneralChanges.js]] script
:css( { display = 'none' } )
:attr( { ['data-copy-marker-attribute'] = args.copyMarker:match( 'Q%d+' )
and 'data-wikidata' or 'data-name', title = mi.texts.tooltip,
['data-copy-marker-content'] = args.copyMarker } )
)
end
makeMarkerProperties( args, show )
if args.isIcon then
extraClasses = extraClasses .. ' voy-listing-map-is-symbol' ..
-- set image color to white
( args.inverse and '' or ' voy-listing-map-inverse-img' )
end
local lon = tonumber( args.long )
local lat = tonumber( args.lat )
local tagArgs = {
zoom = tonumber( args.zoom ),
latitude = lat,
longitude = lon,
show = mg.showAll,
}
if mu.isSet( args.text ) then
tagArgs.text = args.text
tagArgs.class = 'no-icon'
end
if mu.isSet( args.mapGroup ) then
tagArgs.group, tagArgs.show = args.mapGroup, args.mapGroup
else
tagArgs.group = args.groupTranslated
end
if mu.isSet( args.image ) then
tagArgs.description = '[[File:' .. args.image .. '|100x100px|' .. title .. ']]'
end
local geoJson = {
type = 'Feature',
geometry = {
type = 'Point',
coordinates = { lon, lat }
},
properties = {
title = title,
description = tagArgs.description,
['marker-symbol'] = args.symbol,
['marker-color'] = args.color,
['marker-size'] = 'medium',
}
}
return tostring( mw.html.create( 'span' )
:addClass( 'voy-listing-map plainlinks printNoLink' .. extraClasses )
:attr( 'title', mi.texts.tooltip )
:css( colorAdjust )
-- color for print mode
:css( { ['background-color'] = args.color, color = args.inverse and '#000' or '#fff' } )
-- frame:extensionTag is expensive
:wikitext( frame:extensionTag( 'maplink', mw.text.jsonEncode( geoJson ), tagArgs ) )
)
end
-- icon functions
function mu.makeStatusIcons( args )
local result = ''
for i, v in ipairs( args.statusTable ) do
result = result .. mu.makeSpan( ' ', 'voy-listing-status voy-listing-status-' .. v,
false, { title = mi.statuses[ v ].label }, colorAdjust )
if mi.statuses[ v ].category then
result = result .. ( '[[Category:%s]]' ):format( mi.statuses[ v ].label )
end
end
return result
end
function mu.addLinkIcon( classes, link, title, text, mainClass )
local span = mu.makeSpan( ' ', nil, false, { title = title, ['data-icon'] = text },
colorAdjust ) -- space to keep the span tag
local lFormat = ( link:find( '^https?://' ) or link:find( '^//' ) )
and '[%s %s]' or '[[%s|%s]]'
local iconLink = mw.ustring.format( lFormat, link, span )
-- add leading space for wikidata icon which is necessary if visible
if text == 'wikidata' then
iconLink = mu.makeSpan( ' ', 'voy-listing-icon-with-space', true ) .. iconLink
end
mainClass = mainClass or 'voy-listing-icon'
return mu.makeSpan( iconLink, mainClass .. ' ' .. classes )
end
-- adding linked sister icons
local function addSisterIcons( icons, sisters, name, id )
local icon
for i, key in ipairs( { 'wikivoyage', 'wikipedia', 'commons', 'maps', 'wikidata' } ) do
if mu.isSet( sisters[ key ] ) then
icon = mu.addLinkIcon( 'voy-listing-sister-' .. key, sisters[ key ],
mw.ustring.format( mi.iconTitles[ key ], name, id ), key )
table.insert( icons, icon )
end
end
-- return true if only Wikidata icon
return mu.isSet( sisters.wikidata ) and #icons == 1
end
-- getting sister project links
local function getWikiLink( langArray, wiki, entity, wikilang )
local prefix = wiki == 'wiki' and 'w:' or 'voy:'
local link
for i, lang in ipairs( langArray ) do
if lang ~= '' then
link = wu.getFilteredSitelink( entity, lang .. wiki )
if link then
prefix = prefix .. ( lang ~= wikilang and ( lang .. ':' ) or '' )
return prefix .. link
end
end
end
return ''
end
-- adding Wikimedia sister project icons
local function makeSisterIcons( icons, args, page, country, entity )
local sisters = {
commons = '', -- link to Commons category
maps = '', -- link to Map Sources
wikidata = '', -- link to Wikidata
wikipedia = '', -- link to Wikipedia
wikivoyage = '', -- link to another branch, usually en, as a sister link
}
if mu.isSet( args.wikipedia ) then
sisters.wikipedia = 'w:' .. args.wikipedia
end
if mu.isSet( args.wikidata ) then
local langs = mu.getLangTable( page.lang, country.lang )
if sisters.wikipedia == '' then
sisters.wikipedia = getWikiLink( langs, 'wiki', entity, page.lang )
end
if args.wikiPage == '' then
table.remove( langs, 1 ) -- exclude page.lang
sisters.wikivoyage = getWikiLink( langs, page.globalProject, entity, page.lang )
if sisters.wikivoyage ~= '' then
mu.addMaintenance( 'linkToOtherWV' )
end
end
sisters.wikidata = 'd:' .. args.wikidata
end
if args.commonscat ~= '' then
sisters.commons = 'c:Category:' .. args.commonscat
end
if args.lat ~= '' and args.long ~= '' then
sisters.maps = mw.ustring.format( mi.map.coordURLformat, page.lang, args.latMs,
args.longMs, mw.uri.encode( country.extra ), mw.uri.encode( args.givenName.name ) )
end
return addSisterIcons( icons, sisters, args.givenName.name, args.wikidata )
end
-- creating social media icons including value check
local function makeSocial( icons, args, fromWikidata, name )
local domain, span, t, which
for i, service in ipairs( mi.services ) do
-- check values first
t = args[ service.key ] or ''
domain = type( service.url ) == 'string' and service.url or service.url[ 1 ]
domain = domain:gsub( 'com/.*', 'com/' )
if t ~= '' then
if t:match( '^http' ) then
if not t:find( 'https', 1, true ) then
t = t:gsub( '^http', 'https' )
mu.addMaintenance( 'wrongSocialUrl', service.key )
end
if isUrl( t ) > 1 or
not t:match( '^' .. domain .. '.+$' ) then
t = ''
mu.addMaintenance( 'wrongSocialUrl', service.key )
end
if t ~= '' and not fromWikidata[ service.key ] then
mu.addMaintenance( 'socialUrlUsed', service.key )
end
else
local match = false
local sp = service.pattern
if type( sp ) == 'string' then
sp = { sp }
end
for j = 1, #sp do
if mw.ustring.match( t, sp[ j ] ) then
match = true
which = j
break
end
end
if not match then
t = ''
mu.addMaintenance( 'wrongSocialId', service.key )
end
end
end
args[ service.key ] = t
-- create symbol link
if t ~= '' then
if not t:find( domain, 1, true ) then
-- multiple service urls
local formatStr = type( service.url ) == 'string' and service.url or
service.url[ which ]
t = mw.ustring.format( formatStr, t )
end
span = mu.addLinkIcon( 'voy-listing-social-media-' ..
service.key .. mu.addWdClass( fromWikidata[ service.key ] ), t,
mw.ustring.format( mi.iconTitles[ service.key ], name ), service.key,
'voy-listing-social-media' )
table.insert( icons, span )
end
end
end
function mu.makeIcons( args, page, country, entity, show, fromWikidata )
local icons = {}
-- Přidáme ikonu pro externí URL, pokud existuje
if mu.isSet(args.url) then
table.insert( icons, mu.addLinkIcon( 'voy-listing-url' .. mu.addWdClass('url'), args.url,
mi.iconTitles.internet or "Internetový odkaz", 'internet' ) )
end
if mi.options.showSisters and not show.nositelinks then
makeSisterIcons( icons, args, page, country, entity )
end
if show.socialmedia then
makeSocial( icons, args, fromWikidata, args.givenName.name )
end
return table.concat( icons, '' )
end
-- output functions
local function removeStars( args )
for i, param in ipairs( mi.options.noStarParams ) do
if mu.isSet( args[ param ] ) and args[ param ]:find( '*', 1, true ) then
args[ param ] = args[ param ]:gsub( '%*+', '' )
args[ param ] = mw.text.trim( args[ param ] )
mu.addMaintenance( 'nameWithStar' )
end
end
end
local function makeAnchorId( name )
if name and not name:match( '^Q%d+$' ) then
name = mw.uri.anchorEncode( name )
end
return mw.ustring.format( mi.texts.anchor, name )
end
-- getting name table with linked and unlinked names
local function getName( name, pageTitle )
local r = {
all = '', -- name or linked name
name = '', -- only name
pageTitle = '', -- if pageTitle ~= '' name is already linked
}
if type( name ) ~= 'string' or name == '' then
return r
end
local s
local t, c = mw.ustring.gsub( name, '^(.*)%[%[(.*)%]%](.*)$', '%2' )
if c > 0 then -- is / contains [[...]]
t = mw.text.trim( t )
r.all = '[[' .. t .. ']]'
s, c = mw.ustring.gsub( t, '^(.*)|(.*)$', '%2' )
if c > 0 then -- is [[...|...]]
r.name = mw.text.trim( s )
r.pageTitle = mw.ustring.gsub( t, '^(.*)|(.*)$', '%1' )
r.pageTitle = mw.text.trim( r.pageTitle )
else
r.name = t
r.pageTitle = t
end
else
r.name = name
r.all = name
if mu.isSet( pageTitle ) then
r.pageTitle = pageTitle
r.all = '[[' .. pageTitle .. '|' .. name .. ']]'
r.fromWD = true
end
end
removeStars( r, { 'name', 'all' } )
return r
end
-- create givenName, displayName tables
function mu.prepareNames( args )
local function simplifyString( s, length )
s = mw.ustring.sub( s, 1, length )
s = mw.ustring.gsub( s, "[%.'" .. '"“”„‟«»‘’‚‛‹›]', '' )
s = mw.ustring.gsub( s, '[-‐‑‒–—―]', ' ' )
return s:ulower():gsub( '%s%s+', ' ' )
end
local function removeDuplicate( value1, key2 )
if not mu.isSet( value1 ) or not mu.isSet( args[ key2 ] ) then
return
end
local minLen = math.min( mw.ustring.len( value1 ), mw.ustring.len( args[ key2 ] ) )
if simplifyString( value1, minLen ) == simplifyString( args[ key2 ], minLen ) then
args[ key2 ] = ''
end
end
-- use local name if name is not given
if args.name == '' and args.nameLocal ~= '' then
args.name = args.nameLocal
args.nameLocal = ''
end
if args.name == args.nameMap then
args.nameMap = ''
end
-- missing name
if args.name == '' then
args.name = mi.texts.missingName
mu.addMaintenance( 'missingNameMsg' )
end
-- names shall not contain tags or template calls
if args.name:find( '<', 1, true ) or args.name:find( '{{', 1, true ) or
args.nameMap:find( '<', 1, true ) or args.nameMap:find( '{{', 1, true ) or
args.nameLocal:find( '<', 1, true ) or args.nameLocal:find( '{{', 1, true ) then
mu.addMaintenance( 'malformedName' )
end
removeStars( args )
-- handling linked names like [[article|text]]
args.displayName = getName( args.name, args.wikiPage )
if mu.isSet( args.nameMap ) then
args.givenName = getName( args.nameMap, args.wikiPage )
else
-- real copy
args.givenName = {}
args.givenName.all = args.displayName.all
args.givenName.name = args.displayName.name
args.givenName.pageTitle = args.displayName.pageTitle
end
-- reset args.linkIsRedirect if Wikidata link is not used
-- args.linkIsRedirect is set by mu.getArticleLink()
if not args.displayName.fromWD then
args.linkIsRedirect = nil
end
-- remove identical names
removeDuplicate( args.givenName.name, 'nameLocal' )
removeDuplicate( args.givenName.name, 'alt' )
removeDuplicate( args.givenName.name, 'comment' )
removeDuplicate( args.nameLocal, 'alt' )
removeDuplicate( args.alt, 'comment' )
removeDuplicate( args.directions, 'directionsLocal' )
removeDuplicate( args.address, 'addressLocal' )
end
function mu.prepareCoordinates( args )
local dec
args.latDMS, dec, args.latMs = cd.getDMSString( args.lat, 4, 'lat', '', '', mi.map.defaultDmsFormat )
args.longDMS, dec, args.longMs = cd.getDMSString( args.long, 4, 'long', '', '', mi.map.defaultDmsFormat )
end
local function _makeAirport( code, args )
local span = mu.makeSpan( args[ code ],
'voy-listing-' .. code .. '-code' .. mu.addWdClass( true ) )
return mu.makeSpan( mw.ustring.format( mi.texts[ code ], span ),
'voy-listing-airport voy-listing-' .. code )
end
local function makeAirport( args, show )
if show.noairport then
return ''
else
local t = args.type:gsub( ',.*$', '' ) -- only first type
if mt.types[ t ] and not mt.types[ t ].useIATA then
return ''
end
end
if mu.isSet( args.iata ) then
return _makeAirport( 'iata', args )
elseif mu.isSet( args.icao ) then
return _makeAirport( 'icao', args )
else
return ''
end
end
-- creating a list of nick names etc.
local function makeNameAffix( args, page, country, addClass, show )
local result = {}
if mi.options.showLocalData then
if mu.isSet( args.nameLocal ) then
table.insert( result,
mu.languageSpan( args.nameLocal, mi.texts.hintName, page, country,
'voy-listing-name-local' .. addClass ) )
end
if mu.isSet( args.nameLatin ) then
table.insert( result, mu.makeSpan( args.nameLatin,
'voy-listing-name-latin', false, { title = mi.texts.hintLatin,
lang = mu.isSet( country.lang ) and ( country.lang .. '-Latn' ) or nil } ) )
end
end
for i, key in ipairs( { 'alt', 'comment' } ) do
if mu.isSet( args[ key ] ) then
table.insert( result, mu.makeSpan( args[ key ], 'voy-listing-' .. key ) )
end
end
mu.tableInsert( result, makeAirport( args, show ) )
if #result == 0 then
return ''
end
return mu.makeSpan( mu.parentheses( table.concat( result, mu.comma ) ),
'voy-listing-add-names p-nickname nickname' )
end
-- replace brackets in names
local function replaceBrackets( s )
s = s:gsub( '%[', '[' ):gsub( '%]', ']' )
return s
end
-- creating (linked) name and its affix
function mu.makeName( result, args, show, page, country, nameClass, localClass )
local s
local r = {}
nameClass = nameClass ..
( args.displayName.fromWD and ' voy-listing-link-from-wd' or '' )
-- clear redirect wiki link if required
if args.linkIsRedirect and not show.wikilink then
args.displayName.pageTitle = ''
args.displayName.all = args.displayName.name
args.linkIsRedirect = nil
nameClass = nameClass .. ' voy-listing-unused-redirect'
mu.addMaintenance( 'unusedRedirect' )
end
if args.linkIsRedirect then
nameClass = nameClass .. ' mw-redirect voy-listing-link-is-redirect'
mu.addMaintenance( 'linkIsRedirect' )
end
if mu.isSet( args.url ) and args.displayName.pageTitle == '' then
s = '[' .. args.url .. ' '
.. replaceBrackets( args.displayName.name ) .. ']'
else
s = args.displayName.all
end
if mu.isSet( args.nameExtra ) then
s = s .. ' ' .. args.nameExtra
end
-- insert name
if s ~= '' then
local attr = { style = args.styles }
s = mu.makeSpan( s, 'voy-listing-name p-name fn org' .. nameClass ..
( args.styleClass and args.styleClass or '' ), true, attr )
if mu.isSet( args.metadata ) then
s = s .. args.metadata
end
table.insert( r, s )
end
-- insert separate url icon
if mu.isSet( args.url ) and args.displayName.pageTitle ~= '' then
-- both article and web links
table.insert( r, mu.addLinkIcon( 'voy-listing-url', args.url,
mi.iconTitles.internet, 'internet' ) )
end
-- insert name affix
mu.tableInsert( r, makeNameAffix( args, page, country, localClass, show ) )
if #r > 0 then
table.insert( result, table.concat( r, mi.texts.space ) )
end
end
function mu.parentheses( s, trim )
if not mu.isSet( s ) then
return ''
end
local formatter = mi.texts.parentheses
if trim then
formatter = mw.text.trim( formatter )
end
return mw.ustring.format( formatter, s )
end
-- getting DMS coordinates
function mu.dmsCoordinates( args, page, country, fromWD, noBrackets )
local function coordSpan( title, text )
return mu.makeSpan( text, 'coordStyle', false, { title = title } )
end
local r = '[' .. mw.ustring.format( mi.map.coordURLformat, page.lang, args.latMs, args.longMs,
mw.uri.encode( country.extra ), mw.uri.encode( args.givenName.name ) ) ..
' ' .. coordSpan( mi.texts.latitude, args.latDMS ) ..
' ' .. coordSpan( mi.texts.longitude, args.longDMS ) .. ']'
r = noBrackets and r or mu.parentheses( r )
return mu.makeSpan( r, 'voy-listing-dms-coordinates printNoLink plainlinks'
.. mu.addWdClass( fromWD ) )
end
-- prepare value s for data attribute and replace all entities by characters
local function data( s )
return mu.isSet( s ) and mw.text.decode( s, true ) or nil
end
-- adding wrapper and microformats
function mu.makeWrapper( result, args, page, country, show, list, frame )
if not mu.isSet( args.nameLocal ) and mu.isSet( args.addNameLocal ) then
args.nameLocal = args.addNameLocal
end
if not mu.isSet( args.addressLocal ) and mu.isSet( args.addAddressLocal ) then
args.addressLocal = args.addAddressLocal
end
local wrapper = mw.html.create( show.inline and 'span' or 'div' )
:addClass( string.format( 'voy-%s vcard h-card', args.template ) )
if args.noGpx then
wrapper:addClass( 'voy-listing-no-gpx' )
end
if show.outdent and not show.inline then
wrapper:addClass( 'voy-listing-outdent' )
end
if show.inlineSelected or args.template == 'Marker' then
wrapper:addClass( 'voy-listing-inline' )
end
if mu.isSet( args.copyMarker ) or not show.poi then
wrapper:addClass( 'voy-without-marker' )
end
if #args.statusTable > 0 then
wrapper:addClass( 'voy-listing-with-status' )
end
if args.givenName.name ~= mi.texts.missingName then
wrapper:attr( 'data-name', data( args.givenName.name ) )
end
if not ( mu.isSet( args.copyMarker ) and args.copyMarker == args.wikidata ) then
local id = mu.isSet( args.wikidata ) and args.wikidata or args.id
if mu.isSet( id ) then
wrapper:attr( 'id', makeAnchorId( id ) )
end
end
local editClass = 'voy-listing-edit'
if mu.isSet( args.sectionFrom ) then
args.sectionFrom = replaceWithSpace( args.sectionFrom, '[_]+' )
if args.sectionFrom ~= page.text then
editClass = 'voy-listing-no-edit'
end
end
wrapper:addClass( editClass )
wrapper:attr( 'data-location', data( page.subpageText ) )
:attr( 'data-location-qid', page.entityId )
:attr( 'data-country', data( country.iso_3166 ) )
:attr( 'data-lang', data( country.lang ) )
:attr( 'data-country-calling-code', data( country.cc ) )
:attr( 'data-trunk-prefix', data( country.trunkPrefix ) )
:attr( 'data-currency', data( country.addCurrency ) )
:attr( 'data-coord-from', args.coordFrom )
local arg
for key, value in pairs( list ) do
if mu.isSet( args[ key ] ) then
arg = args[ key ]:gsub( '<[^<>]*>', '' ) -- remove html tags
wrapper:attr( value, data( arg ) )
end
end
if not show.name then
wrapper:node( mw.html.create( 'span' )
:addClass( 'voy-listing-name p-name fn org' )
:css( 'display', 'none' )
:wikitext( args.givenName.name )
)
end
wrapper:wikitext( result )
if not show.noCoord then
wrapper:node( mw.html.create( 'span' )
:addClass( 'voy-listing-coordinates p-geo geo' )
:css( 'display', 'none' )
:node( mw.html.create( 'span' )
:addClass( 'p-latitude latitude' )
:wikitext( args.lat )
)
:node( mw.html.create( 'span' )
:addClass( 'p-longitude longitude' )
:wikitext( args.long )
)
)
end
wrapper = tostring( wrapper )
-- adding coordinates to Mediawiki database
-- frame:callParserFunction is expensive
if not show.noCoord and mi.options.secondaryCoords then
wrapper = wrapper .. frame:callParserFunction{ name = '#coordinates',
args = { args.lat, args.long, country.extra, name = args.givenName.name } }
end
return wrapper
end
function mu.getPageData()
local page = mw.title.getCurrentTitle()
page.langObj = mw.getContentLanguage()
page.lang = page.langObj:getCode()
page.langName = mw.language.fetchLanguageName( page.lang, page.lang )
page.isRTL = page.langObj:isRTL()
page.entityId = mw.wikibase.getEntityIdForCurrentPage() -- can be nil
page.siteName = mw.site.siteName
page.globalProject = page.siteName:lower()
if page.globalProject == 'wikipedia' then
page.globalProject = 'wiki'
end
return page
end
return mu
8i0s7bwmhig1j2g67tmdkg9n0mzktd2
Modul:VCard/Params
828
1338
22087
17494
2026-05-20T09:42:30Z
LiMr
96
aktualizace na novější verzi
22087
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Params&oldid=1768060)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Params&oldid=1768060)
--[[
This module contains the parameter tables and definitions. Do not modify this
module. The translated values are stored in Module:vCard/i18n.
Not all parameters given in the ParMap table can be used by authors. They are
only for internal usage and will not be shown in the output (for instance
booking). Parameters for internal usage will be generated by the program or
fetched from Wikidata.
--]]
-- module import
local vi = require( 'Module:VCard/i18n' ) -- additional vCard options
return {
-- administration
moduleInterface = {
suite = 'vCard',
sub = 'Params',
serial = '2026-04-12',
item = 65455743
},
-- complete table of parameters
-- true: get it from Wikidata in any case
-- for parameter translations see Module:VCard/i18n
ParMap = {
address = '',
addressLang = '',
addressLocal = '',
agoda = true, -- Agoda.com
alt = '',
applemaps = true, -- Maps.Apple.com
auto = '',
before = '',
booking = true, -- Booking.com
checkin = '',
checkout = '',
color = '', -- internal use
comment = '',
commonscat = '',
content = '',
copyMarker = '',
country = '',
dav = true, -- Alpenverein.de
description = '',
directions = '',
directionsLocal = '',
email = '',
expedia = true, -- Expedia.com
facebook = '',
fax = '',
flickr = '',
foursquare = true, -- Foursquare.com
geonames = true, -- Geonames.org
googlemaps = '', -- Maps.Google.com
group = '',
histhotelsAm = true, -- HistoricHotels.org
histhotelsEu = true, -- HistoricHotelsOfEurope.com
histhotelsWw = true, -- HistoricHotelsWorldwide.com
hostelworld = true, -- Hostelworld.com
hotels = true, -- Hotels.com
hours = '',
iata = vi.options.showIata,
icao = vi.options.showIcao,
id = '', -- used if wikidata is missing
image = true,
instagram = '',
kayak = true, -- Kayak.com
lastedit = '',
lat = '',
leadingHotels = true, -- LHW.com
localLang = '',
long = '',
mapGroup = '',
mobile = '',
name = true,
nameExtra = '',
nameLatin = '',
nameLocal = '',
nameMap = '',
oeav = true, -- Alpenverein.at
osmNodeId = true,
osmRelationId = true,
osmWayId = true,
payment = '',
phone = '',
preferredHotels = true, -- PreferredHotels.com
price = '',
pzs = true, -- PZS.si (Slovenia)
recreation = true, -- Recreation.gov
relaisChateaux = true, -- RelaisChateaux.com
rss = true, -- web feed
sac = true, -- SAC-CAS.ch
sectionFrom = '',
show = vi.options.defaultShow,
skyscanner = true, -- Skyscanner.com
stationNumber = true, -- Intl. station number
status = '',
styles = '',
subtype = '',
subtypeAdd = true, -- internal use
symbol = '', -- internal use
text = '', -- internal use
tiktok = '',
tollfree = '',
trip = true, -- Trip.com
tripadvisor = true, -- Tripadvisor.com
type = '',
unesco = vi.options.showUnesco,
url = '',
urlMap = true, -- official map URL
urlTimetable = true, -- timetable/schedule URL
useIcon = '', -- internal use
wikidata = '',
wikipedia = '', -- deprecated
x = '',
youtube = '',
zoom = '',
date = '', -- for events
month = '',
year = '',
endDate = '',
endMonth = '',
endYear = '',
frequency = '',
location = ''
},
--[[
Wikidata properties and definitions for vCard parameters
p property or set of properties
f formatter string
c maximum count of results, default = 1
m concat mode (if c > 1), default concat with ', '
v value type,
empty: string value (i.e. default type),
id: string value of an id like Q1234567
idl: string value of the label of an id like Q1234567
il: language-dependent string value
iq: string value with qualifier ids
iqa: string value with qualifier ids, for comments in accessibility
iqp: string value with qualifier ids, for comments in policies
au: quantity consisting of amount and unit
pau: quantity consisting of amount (for P8733)
vq: string or table value with qualifiers ids and references
q table of qualifiers allowed, for value type id
l = lang: language dependent
wiki / local: monolingual text by wiki or local language
le = true: use date for lastedit parameter
t = phone type (landline, mobile)
--]]
ParWD = {
agoda = { p = 'P6008' },
applemaps = { p = 'P10046' },
booking = { p = 'P3607' },
checkin = { p = 'P8745', v = 'idl' },
checkout = { p = 'P8746', v = 'idl' },
dav = { p = 'P5757' },
directions = { p = 'P2795', v = 'il', l = 'wiki' },
directionsLocal = { p = 'P2795', v = 'il', l = 'local' },
email = { p = 'P968', v = 'vq', c = 5 },
expedia = { p = 'P5651' },
facebook = { p = { { p = 'P2013', f = 'https://www.facebook.com/%s' }, -- Facebook username
{ p = 'P1997', f = 'https://www.facebook.com/%s' }, -- Facebook places ID
{ p = 'P4003', f = 'https://www.facebook.com/pages/%s' }, -- Facebook page ID
{ p = 'P11705', f = 'https://www.facebook.com/pages/%s' } } }, -- Facebook numeric ID
fax = { p = 'P2900', v = 'vq', c = 3 },
flickr = { p = 'P3267', f = 'https://www.flickr.com/photos/%s' },
foursquare = { p = 'P1968' },
geonames = { p = 'P1566' },
googlemaps = { p = 'P3749' },
histhotelsAm = { p = 'P5734' },
histhotelsEu = { p = 'P5774' },
histhotelsWw = { p = 'P5735' },
hostelworld = { p = 'P10442' },
hotels = { p = 'P3898' },
iata = { p = 'P238', c = 3 },
icao = { p = 'P239' },
image = { p = { { p = 'P18' },
{ p = 'P3451' }, -- nighttime view
{ p = 'P8592' }, -- aerial view
{ p = 'P5775' } } }, -- interior image
instagram = { p = { { p = 'P2003', f = 'https://www.instagram.com/%s/' },
{ p = 'P4173', f = 'https://www.instagram.com/explore/locations/%s/' } } },
kayak = { p = 'P10547' },
leadingHotels = { p = 'P5834' },
mobile = { p = 'P1329', v = 'vq', c = 5, t = 'mobile' },
oeav = { p = 'P5759' },
osmNodeId = { p = 'P11693' },
osmRelationId = { p = 'P402' },
osmWayId = { p = 'P10689' },
payment = { p = 'P2851', v = 'id', c = 50, m = 'no' },
phone = { p = 'P1329', v = 'vq', c = 5, t = 'landline' },
preferredHotels = { p = 'P5890' },
price = { p = 'P2555', v = 'au', c = 10, le = true }, -- fee
pzs = { p = 'P5758' },
recreation = { p = 'P3714' },
relaisChateaux = { p = 'P5836' },
rss = { p = 'P1019' },
sac = { p = 'P5761' },
skyscanner = { p = 'P10487' },
stationNumber = { p = 'P954' }, -- intl station number
subtypeAdd = { p = { { p = 'P912', v = 'iqa', c = 50 }, -- has facility
{ p = 'P166', v = 'iq', c = 5, q = { 'Q2976556', 'Q20824563', 'Q104135230' } },
-- awards received (hotel rating, Michelin etc.)
{ p = 'P10290', v = 'iq', c = 3 }, -- hotel rating
{ p = 'P8733', v = 'pau' }, -- number of rooms
{ p = 'P2012', v = 'iq', c = 50 }, -- cuisine
{ p = 'P2846', v = 'iq' }, -- wheelchair
{ p = 'P2848', v = 'iq' }, -- WLAN
{ p = 'P5023', v = 'iqp', c = 10 } }, c = 100, m = 'no' }, -- activity policies
tiktok = { p = { { p = 'P7085', f = 'https://www.tiktok.com/@%s' }, -- TikTok username
{ p = 'P11559', f = 'https://www.tiktok.com/place/_-%s' } } }, -- TikTok place ID
trip = { p = 'P10425' },
tripadvisor = { p = 'P3134' },
x = { p = 'P2002', f = 'https://x.com/%s' },
unesco = { p = { { 'P757' }, -- World Heritage Site ID
{ p = 'P2614', v = 'id' } } }, -- World Heritage criteria
url = { p = { { p = 'P856', l = 'lang' }, -- URL
{ p = 'P973', l = 'lang' } } }, -- described at URL
urlMap = { p = 'P9601' },
urlTimetable = { p = 'P12677' },
youtube = { p = { { p = 'P11245', f = 'https://www.youtube.com/@%s' }, -- Youtube channel @ alias
{ p = 'P2397', f = 'https://www.youtube.com/channel/%s' } } } -- Youtube channel
},
-- additional parameters for auto = y
ParWDAdd = {
address = 1,
addressLocal = 1,
directions = 1,
directionsLocal = 1,
hours = 1,
nameLocal = 1
},
-- parameters to save in vCard wrapper tag
vcardData = {
addressLang = 'data-address-lang', -- language of address
addressLocal = 'data-address-local',
color = 'data-color',
commonscat = 'data-commonscat',
directionsLocal = 'data-directions-local',
group = 'data-group',
image = 'data-image',
mapGroup = 'data-map-group',
nameLocal = 'data-name-local',
rss = 'data-rss',
subtype = 'data-subtype',
symbol = 'data-symbol',
type = 'data-type',
url = 'data-url',
wikidata = 'data-wikidata',
agoda = 'data-agoda-com',
applemaps = 'data-apple-maps-id',
booking = 'data-booking-com',
dav = 'data-alpenverein-de',
expedia = 'data-expedia-com',
foursquare = 'data-foursquare-id',
geonames = 'data-geonames-id',
googlemaps = 'data-google-maps-cid',
histhotelsAm = 'data-historic-hotels-america',
histhotelsEu = 'data-historic-hotels-europe',
histhotelsWw = 'data-historic-hotels-worldwide',
hostelworld = 'data-hostelworld-com',
hotels = 'data-hotels-com',
kayak = 'data-kayak-com',
leadingHotels = 'data-leading-hotels',
oeav = 'data-alpenverein-at',
osmNodeId = 'data-osm-node-id',
osmRelationId = 'data-osm-relation-id',
osmWayId = 'data-osm-way-id',
preferredHotels = 'data-preferred-hotels',
pzs = 'data-pzs-si',
recreation = 'data-recreation-gov',
relaisChateaux = 'data-relais-chateaux',
sac = 'data-sac-cas-ch',
sectionFrom = 'data-section-from',
skyscanner = 'data-skyscanner-com',
stationNumber = 'data-station-number',
trip = 'data-trip-com',
tripadvisor = 'data-tripadvisor-com',
urlMap = 'data-map-url',
urlTimetable = 'data-timetable-url'
},
-- check if event
checkEvent = { 'date', 'month', 'year', 'endDate', 'endMonth', 'endYear',
'frequency', 'location' },
-- prevent local data if wiki language == country language
localData = { 'nameLocal', 'addressLocal', 'directionsLocal' },
-- phone numbers for fetching country data
phones = { 'phone', 'fax', 'mobile', 'tollfree' },
-- possible values for show parameter
show = {
all = 1,
coord = 1,
copy = 1,
inline = 1,
noairport = 1,
none = 1,
noperiod = 1,
nositelinks = 1,
nosocialmedia = 1,
outdent = 1,
poi = 1,
symbol = 1,
wikilink = 1
}
}
fwyqsdyh10mf0a2zo3p8kg68cn26bn7
Modul:VCard/i18n
828
1339
22088
17723
2026-05-20T09:59:30Z
LiMr
96
aktualizace na novější verzi
22088
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/i18n&oldid=1738007)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/i18n&oldid=1738007)
-- This module contains wiki-language specific strings to translate.
-- First table contains the arguments' parameter names, the second
-- one data name for the wrapping listing tag.
-- The following table is used for template's parameter localization.
-- The item value like 'address-lang' is the parameter name used in the template.
-- The key/index is used by the Marker module. Use value strings for localization.
return {
-- administration
moduleInterface = {
suite = 'vCard',
sub = 'i18n',
serial = '2026-01-03',
item = 65455749
},
p = {
address = { 'address', 'adresa' },
addressLang = { 'address-lang', 'jazyk adresy' },
addressLocal = { 'address-local', 'adresa lokálně', 'místní adresa' },
alt = 'alt',
auto = 'auto',
before = { 'before', 'předtím' },
checkin = { 'checkin', 'check in' },
checkout = { 'checkout', 'check out' },
comment = { 'comment', 'komentář' },
commonscat = { 'commonscat', 'commons' }, --funguje s chybami
copyMarker = { 'copy-marker', 'marker-copy' },
country = { 'country', 'země', 'stát' },
description = { 'description', 'content', 'popis' },
directions = { 'directions', 'směr' },
directionsLocal = { 'directions-local', 'směr lokálně', 'směr místní' },
email = { 'email', 'e-mail' },
facebook = 'facebook',
fax = 'fax',
flickr = 'flickr',
group = { 'group', 'skupina' },
googlemaps = { 'google-map', 'google-maps' },
hours = { 'hours', 'otevírací doba', 'otevřeno', 'hodiny' },
id = 'id',
image = { 'image', 'obrázek' },
instagram = 'instagram',
lastedit = { 'lastedit', 'last_edit', 'poslední editace', 'aktualizováno' },
lat = { 'lat', 'latitude', 'coord', 1, 'zeměpisná šířka', 'šířka'},
localLang = 'local-lang',
long = { 'long', 'lon', 'longitude', 2, 'zeměpisná délka', 'délka'},
mapGroup = { 'map-group', 'skupina mapy', },
mobile = { 'mobile', 'mobil' },
name = { 'name', 'název' },
-- nameExtra = { 'name-extra', 'název extra' },
nameLatin = { 'name-latin', 'name-roman', 'název latinkou' },
nameLocal = { 'name-local', 'název lokálně', 'místní název' },
nameMap = { 'name-map', 'název mapy' },
payment = { 'payment', 'platba' },
phone = { 'phone', 'telefon' },
price = { 'price', 'cena' },
sectionFrom = { 'section-from', 'výběr' },
show = { 'show', 'zobrazit' },
status = 'status',
styles = { 'styles', 'styly' },
subtype = { 'subtype', 'subtypes', 'subtyp', 'podtyp' },
tiktok = 'tiktok',
tollfree = { 'tollfree', 'zdarma', 'bezplatně' },
type = { 'type', 'types', 'typ', 'typy' },
url = { 'url', 'web' },
wikidata = { 'wikidata', 'Wikidata', 'wd', 'd' },
wikipedia = { 'wikipedia', 'wikipedie' },-- deprecated --funguje s chybami
x = { 'x', 'twitter' },
youtube = 'youtube',
zoom = 'zoom',
date = { 'date', 'datum' }, -- for events
month = { 'month', 'měsíc' },
year = { 'year', 'rok' },
endDate = { 'enddate', 'konec datum' },
endMonth = { 'endmonth', 'konec měsíc' },
endYear = { 'endyear', 'konec rok' },
frequency = { 'frequency', 'frekvence' },
location = { 'location', 'místo', 'lokace' },
},
-- additional vCard options
options = {
defaultAuto = true, -- vCard default auto mode
defaultShow = 'poi',
lasteditHours = true,
showIata = true, -- possible values true, false
showIcao = true,
showUnesco = true,
useMobile = true -- distinguish landline and mobile phones
}
}
odn09rnlkslyex8edh6u1a1dytlbhfq
Modul:LinkMail
828
1340
22096
17237
2026-05-20T11:26:20Z
LiMr
96
aktualizace na novější verzi
22096
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:LinkMail&oldid=1775629)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:LinkMail&oldid=1775629)
-- module variable and administration
local lm = {
moduleInterface = {
suite = 'LinkMail',
serial = '2026-05-17',
item = 65157414
}
}
-- module import
-- require( 'strict' )
local li = require( 'Module:Link utilities/i18n' )
local lu = require( 'Module:Link utilities' )
-- check single email address
function lm._isEmail( s )
local result = 2
if s == nil or type( s ) ~= 'string' or #s > 254 or s:find( '%s' ) or
s:find( '%.%.' ) or s:find( '%.@' ) or s:find( '@[%.%-]' ) or
s:find( '%-%.' ) or s:find( '%.%-' ) or s:match( '^%.' ) then
return 0
end
local repl, at = s:gsub( '@', '@' )
if at ~= 1 then
return 0
end
at = s:find( '@' )
local user = s:sub( 1, at - 1 )
local domain = s:sub( at + 1, #s )
if not user or not domain or #user > 64 or #domain > 253 then
return 0
end
-- handle user part
if not mw.ustring.match( user, "^[%w!#&'/=_`{|}~%^%$%%%+%-%*%.%?]+$" ) then
return 0
end
if not user:match( "^[%w!#&'/=_`{|}~%^%$%%%+%-%*%.%?]+$" ) then
result = 1
end
-- handle domain part
if not mw.ustring.match( domain, '^[%w%.%-]+%.%a%a+$' ) then
return 0
end
if not domain:match( '^[%w%.%-]+%.%a%a+$' ) then
result = 1
end
-- not yet analysed: texts in quotes in user part
-- added on demand
return result
end
function lm._linkMail( m, isDemo, ignoreUnicode )
m = mw.text.trim( m )
if m == '' then
return ''
end
local catPrefix = '[[Category:'
if isDemo then
catPrefix = ' [[:Category:'
end
local comment
m, comment = lu.extractComment( m )
m = m:gsub( 'mailto:', '' )
local isEmail = lm._isEmail( m )
local t
if isEmail > 0 then
t = '<span class="plainlinks nourlexpansion">[mailto:' .. m .. ' ' .. m .. ']</span>'
if isEmail == 1 and not ignoreUnicode then
t = t .. catPrefix .. li.categories.nonASCII
end
else
t = m .. catPrefix .. li.categories.invalidMail
end
if comment ~= '' then
t = t .. ' ' .. comment
end
return t
end
function lm.linkMailSet( args )
args.email = args.email or args[ 1 ] or ''
if args.email == '' then
return ''
end
local ns = mw.title.getCurrentTitle().namespace
local isDemo = ns == 10 or ns == 828
-- split separate email
local items = lu.splitItems( args.email, li.delimiters )
-- analyse emails
local result = ''
local i = 0
local s
for j, item in ipairs( items ) do
s = lm._linkMail( item, isDemo, args.ignoreUnicode )
if s ~= '' then
if result == '' then
result = s
else
if i == li.addMail then
result = result .. '<span class="voy-listing-add-contact">'
end
result = result .. li.texts.comma .. s
end
i = i + 1
end
end
if i > li.addMail then
result = result .. '</span>'
end
return result
end
-- #invoke call
function lm.linkMails( frame )
return lm.linkMailSet( frame.args )
end
-- template call
function lm.linkMailsTemplate( frame )
return lm.linkMailSet( frame:getParent().args )
end
return lm
dgvfqxddjkixjagbfj634r71ehe21be
Modul:LinkSkype
828
1341
22095
17238
2026-05-20T11:24:20Z
LiMr
96
aktualizace na novější verzi
22095
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:LinkSkype&oldid=1775698)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:LinkSkype&oldid=1775698)
-- module variable and administration
local ls = {
moduleInterface = {
suite = 'LinkSkype',
serial = '2026-05-17',
item = 65157314
}
}
-- module import
-- require( 'strict' )
local li = require( 'Module:Link utilities/i18n' )
local lu = require( 'Module:Link utilities' )
-- check single skype name
function ls.isSkypeName( s )
if not s or type( s ) ~= 'string' then
return 0
end
local user = s
local param
local q = s:find( '?', 1, true )
if q then
user = s:sub( 1, q - 1 )
param = s:sub( q + 1, #s )
if not li.params[ param ] then
return 0
end
end
if #user > 32 or #user < 6 then
return 0
end
if not user:match( "^%l[%l%d%.,_%-]+$" ) then
return 0
end
return 1
end
function ls.SkypeLink( m, isDemo )
m = mw.text.trim( m )
if m == '' then -- empty string
return ''
end
local catPrefix = '[[Category:'
if isDemo then
catPrefix = ' [[:Category:'
end
local comment
local t
m, comment = lu.extractComment( m )
m = m:gsub( 'skype:', '' )
if ls.isSkypeName( m ) > 0 then
t = '<span class="voy-listing-skype-link">' .. m ..'</span>'
-- skype: link is performed by a JavaSript: MediaWiki:VCard.js
else
t = m .. catPrefix .. li.categories.invalidSkype
end
if comment ~= '' then
t = t .. ' ' .. comment
end
return t
end
function ls.linkSkypeSet( args )
args.skype = args.skype or args[ 1 ] or ''
if args.skype == '' then
return ''
end
local ns = mw.title.getCurrentTitle().namespace
local isDemo = ns == 10 or ns == 828
-- split separate Skype names
local items = lu.splitItems( args.skype, li.delimiters, ';' )
-- analyse Skype names
local i = 0
local s
local result = ''
for j = 1, #items, 1 do
s = ls.SkypeLink( items[ j ], isDemo )
if s ~= '' then
if result == '' then
result = s
else
if i == li.addSkype then
result = result .. '<span class="voy-listing-add-contact">'
end
result = result .. li.texts.comma .. s
end
i = i + 1
end
end
if i > li.addSkype then
result = result .. '</span>'
end
return result
end
-- #invoke call
function ls.linkSkype( frame )
return ls.linkSkypeSet( frame.args )
end
-- template call
function ls.linkSkypeTemplate( frame )
return ls.linkSkypeSet( frame:getParent().args )
end
return ls
fgz7luzn92c5kkz8ugf58wdhwwyqbts
Šablona:VCard/styles.css
10
1344
22084
22082
2026-05-20T09:21:51Z
LiMr
96
aktualizace na novější verzi
22084
sanitized-css
text/css
/*
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Vorlage:VCard/styles.css&oldid=1775708)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Vorlage:VCard/styles.css&oldid=1775708)
vCard and Marker styles
Version: 2026-05-17
*/
/*
Styles for Marker and vCard templates
*/
div.voy-vCard {
margin-top: 0.5em;
}
li div.voy-vCard {
margin-top: 0;
}
.voy-listing-outdent {
margin-left: 22px;
text-indent: -22px;
}
li .voy-listing-outdent {
margin-left: 0;
text-indent: -22px;
}
.voy-listing-name {
font-weight: bold;
}
.voy-listing-name-style-station {
background-color: var(--voy-header-background-base,#f0f0f0);
color: var(--color-base,#202122);
border: 1px solid #ddd;
}
.voy-listing-name-latin, .voy-listing-comment, .voy-listing-directions, .voy-listing-phone-exception {
font-style: italic;
}
.voy-listing-directions .mw-selflink {
font-weight: normal;
}
.voy-listing-hours, .voy-listing-checkin, .voy-listing-checkout, .voy-listing-price,
.voy-listing-payment, .voy-listing-subtype {
color: #888;
}
.voy-listing-phone-number {
white-space: nowrap;
}
.voy-listing-add-contact {
display: none;
}
.voy-vCard .voy-flag-icon {
position: relative;
top: 2px;
}
/*
Status and listing icons
*/
.voy-listing-icon, .voy-listing-social-media {
white-space: nowrap;
}
.voy-listing-icon:before, .voy-listing-social-media:before {
content: ' ';
white-space: normal;
}
.voy-listing-sister-wikidata:before {
content: none;
}
.voy-listing-icon-with-space {
white-space: normal !important;
}
.voy-listing-status-item {
list-style-type: none;
list-style-image: none;
text-indent: -20px;
}
.voy-listing-status-item li {
list-style-type: inherit;
text-indent: 0;
}
.vcard span, .vcard div.voy-listing-content {
text-indent: 0;
}
.voy-listing-status, .voy-listing-icon span, .voy-listing-social-media span {
display: inline-block;
position: relative;
top: 2px;
background-repeat: no-repeat;
background-position: left bottom;
background-size: 16px;
width: 16px;
height: 16px;
white-space: nowrap;
padding-left: 16px;
box-sizing: border-box;
overflow: hidden;
color: transparent;
}
.voy-listing-status + .voy-listing-status {
margin-left: 4px;
}
@media print {
.voy-listing-icon a, .voy-listing-icon bdi, .voy-listing-social-media a {
display: none !important;
}
.voy-listing-icon:before, .voy-listing-social-media:before {
content: '';
}
}
/* status icons */
.voy-listing-status-none, .voy-listing-status-stub {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Symbol_plain_grey.svg/120px-Symbol_plain_grey.svg.png');
}
.voy-listing-status-outline {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Start-icon.svg/120px-Start-icon.svg.png');
}
.voy-listing-status-usable {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Symbol_keep_vote.svg/120px-Symbol_keep_vote.svg.png');
}
.voy-listing-status-guide {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/94/Symbol_support_vote.svg/120px-Symbol_support_vote.svg.png');
}
.voy-listing-status-star, .voy-listing-status-recommendation {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Symbol_star_gold.svg/120px-Symbol_star_gold.svg.png');
}
.voy-listing-status-top-sight, .voy-listing-status-top-hotel, .voy-listing-status-top-restaurant {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Symbol_star2.svg/120px-Symbol_star2.svg.png');
}
/* Wikimedia sister site icons */
.voy-listing-sister-commons span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/120px-Commons-logo.svg.png');
background-size: auto 16px;
width: 12px;
padding-left: 12px;
}
.voy-listing-sister-wikidata span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Wikidata-logo-without-paddings.svg/120px-Wikidata-logo-without-paddings.svg.png');
background-position: 0 4px;
}
.voy-listing-sister-wikipedia span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Antu_wikipedia.svg/120px-Antu_wikipedia.svg.png');
}
.voy-listing-sister-wikivoyage span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Wikivoyage-Logo-v3-icon.svg/120px-Wikivoyage-Logo-v3-icon.svg.png');
}
.voy-listing-sister-maps span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Antu_marble.svg/120px-Antu_marble.svg.png');
}
/* social-media site icons */
.voy-listing-social-media-facebook span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/b/b8/2021_Facebook_icon.svg/120px-2021_Facebook_icon.svg.png');
}
.voy-listing-social-media-flickr span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/44/Flickr.svg/120px-Flickr.svg.png');
}
.voy-listing-social-media-instagram span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/95/Instagram_logo_2022.svg/120px-Instagram_logo_2022.svg.png');
}
.voy-listing-social-media-rss span, .voy-listing-rss span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/43/Feed-icon.svg/120px-Feed-icon.svg.png');
}
.voy-listing-social-media-tiktok span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Iconoir_tiktok.svg/120px-Iconoir_tiktok.svg.png');
}
.voy-listing-social-media-x span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/c/ce/X_logo_2023.svg/120px-X_logo_2023.svg.png');
background-position: 0 2px;
}
.voy-listing-social-media-youtube span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/fd/YouTube_full-color_icon_%282024%29.svg/120px-YouTube_full-color_icon_%282024%29.svg.png');
background-position: 0 3px;
}
/* additional icons */
.voy-listing-url span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/7/70/Applications-internet.svg/120px-Applications-internet.svg.png');
}
.voy-listing-unesco span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/fd/WV-Unesco-icon-small.svg/120px-WV-Unesco-icon-small.svg.png');
}
@media screen {
html.skin-theme-clientpref-night .voy-listing-social-media-tiktok span,
html.skin-theme-clientpref-night .voy-listing-social-media-x span {
filter: invert(100%);
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .voy-listing-social-media-tiktok span,
html.skin-theme-clientpref-os .voy-listing-social-media-x span {
filter: invert(100%);
}
}
/* Wikidata icon is shown only for logged-in users. The class voy-user-login in
body tag is set by [[MediaWiki:InitListingTools.js]] script. */
.voy-listing-sister-wikidata a, .voy-listing-icon-with-space {
display: none;
}
body.voy-user-login .voy-listing-sister-wikidata a, body.voy-user-login .voy-listing-icon-with-space {
display: inline;
}
.voy-listing-subtype-icon + .voy-listing-subtype-icon {
margin-left: 2px;
}
.voy-listing-icon .external, .voy-listing-social-media .external, .voy-listing-url .external,
.voy-listing-rss .external {
color: #000;
background: none; /* unterdrücke Link-Symbol bei sozialen Medien */
padding-right: 0;
}
.voy-listing-content {
margin-top: 0.5em;
}
.voy-listing-content .voy-listing-next-paragraph { /* br-tag formatting in description */
display: block;
content: "";
margin-top: 0.5em;
}
.voy-listing-next-paragraph + div, .voy-listing-next-paragraph + style + div {
margin-top: 0 !important;
}
/*
Meta data
*/
.voy-listing-metadata {
font-size: 0.8em;
color: #888;
}
.voy-Marker .voy-listing-metadata {
display: none;
}
.voy-listing-metadata-item {
display: inline-block;
white-space: nowrap;
}
.voy-listing-outdated {
display: inline;
white-space: normal;
}
.voy-listing-item-dummy {
display: none;
}
.voy-listing-metadata-item:first-child:before,
.voy-listing-item-dummy + .voy-listing-metadata-item:before {
content: " (";
}
.voy-listing-metadata-item:after {
content: " | ";
}
.voy-listing-metadata-item:last-child:after {
content: ")";
}
.voy-listing-inline .voy-listing-metadata-item:before,
.voy-listing-inline .voy-listing-metadata-item:after {
content: "";
}
.voy-listing-inline .voy-listing-metadata-item {
box-sizing: border-box;
}
/* lastedit is not shown if the listing template is used within a text block.
voy-listing-inline is set in case of vCard parameter show = inline is set. */
.voy-listing-inline .voy-listing-lastedit {
display: none;
}
@media print {
.voy-listing-lastedit:after {
content: ")";
}
.voy-listing-inline .voy-listing-lastedit:after {
content: "";
}
}
.voy-listing-metadata-item button, .voy-listing-metadata .voy-listing-toSourcePage a {
display: inline-block;
border: none;
background-color: transparent;
color: #888;
font-family: sans-serif;
font-size: 1em;
cursor: pointer;
padding: 0;
}
.voy-listing-edit-button button, .voy-listing-metadata .voy-listing-toSourcePage a {
position: relative;
padding-left: 15px;
}
.voy-listing-info-button button {
position: relative;
padding-left: 12px;
}
.voy-listing-info-button button:before {
left: -2px;
top: -1px;
background-image: url( "//upload.wikimedia.org/wikipedia/commons/thumb/0/02/Maki-information-15.svg/120px-Maki-information-15.svg.png" );
background-size: 14px;
}
.voy-listing-metadata-item button:hover, .voy-listing-metadata-item button:focus,
.voy-listing-metadata-item button:active {
text-decoration: underline;
}
.voy-listing-inline .voy-listing-metadata-item button {
display: inline;
color: transparent;
}
.voy-listing-edit-button button:before, .voy-listing-toSourcePage a:before,
.voy-listing-info-button button:before {
content: "";
display: block;
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 15px;
background-repeat: no-repeat;
background-position: 0 25%;
background-size: 12px;
filter: opacity(0.45);
}
.voy-listing-edit-button button:before, .voy-listing-toSourcePage a:before {
background-image: url( "//upload.wikimedia.org/wikipedia/commons/thumb/8/8a/OOjs_UI_icon_edit-ltr.svg/120px-OOjs_UI_icon_edit-ltr.svg.png" );
}
.voy-listing-inline .voy-listing-edit-button,
.voy-listing-inline .voy-listing-info-button {
width: 1.5em;
padding-left: 2px;
clip-path: polygon(0 0, 1.5em 0, 1.5em 100%, 0% 100%);
/* Workaround for overflow: clip */
}
@media screen {
html.skin-theme-clientpref-night .voy-listing-edit-button button:before,
html.skin-theme-clientpref-night .voy-listing-info-button button:before,
html.skin-theme-clientpref-night .voy-listing-toSourcePage a:before {
filter: invert(0.5);
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .voy-listing-edit-button button:before,
html.skin-theme-clientpref-os .voy-listing-info-button button:before,
html.skin-theme-clientpref-os .voy-listing-toSourcePage a:before {
filter: invert(0.5);
}
}
@media print {
.voy-listing-metadata .voy-listing-toSourcePage {
display: none;
}
}
.voy-listing-inline .voy-listing-info-button {
padding-left: 5px;
}
@media print {
.voy-listing-info-button, .voy-listing-edit-button {
display: none;
}
}
/*
CSS properties for marker-symbol wrapper
*/
.voy-listing-map {
display: inline-block;
position: relative;
border-radius: 3px;
line-height: 1.15em;
top: -1px;
}
.voy-listing-map a.external:link, .voy-listing-map a.external:visited, .voy-listing-map a.external:hover,
.voy-listing-map a.external:active {
text-decoration: none;
}
.voy-listing-map .mw-kartographer-maplink {
display: inline-block;
min-width: 1.5em;
height: 1.3em;
line-height: 1.3em;
padding: 1px;
border-radius: 3px;
/* for marker-copy */
top: 0;
position: relative;
font-size: 0.85em;
font-weight: bold;
font-style: normal;
text-align: center;
vertical-align: middle;
}
.mw-kartographer-maplink img {
vertical-align: -15%;
}
.voy-listing-map-inverse-img.voy-listing-map-is-symbol .mw-kartographer-maplink img {
filter: invert(100%);
}
/*
For media with missing or limited pointer capabilities, i.e. for mobile
devices etc. Secondary devices are considered, too.
See: https://www.w3.org/TR/mediaqueries-4/#any-input
*/
.voy-listing-tooltip-mobile .mw-kartographer-maplink {
min-width: 3em;
}
@media print {
.voy-listing-map .mw-kartographer-maplink {
min-width: 1.5em;
}
}
body.skin-minerva .voy-listing-map .mw-kartographer-maplink,
body.skin-timeless .voy-listing-map .mw-kartographer-maplink {
vertical-align: 10%;
}
95eyf4kk9v1qiyypsh1lnujc50m0css
22086
22084
2026-05-20T09:37:43Z
LiMr
96
ruční úprava, která byla i v předchozí verzi
22086
sanitized-css
text/css
/*
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Vorlage:VCard/styles.css&oldid=1775708)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Vorlage:VCard/styles.css&oldid=1775708)
vCard and Marker styles
Version: 2026-05-17
*/
/*
Styles for Marker and vCard templates
*/
div.voy-vCard {
margin-top: 0.5em;
}
li div.voy-vCard {
margin-top: 0;
}
.voy-listing-outdent {
margin-left: 22px;
text-indent: -22px;
}
li .voy-listing-outdent {
margin-left: 0;
text-indent: -22px;
}
.voy-listing-name {
font-weight: bold;
}
.voy-listing-name-style-station {
background-color: var(--voy-header-background-base,#f0f0f0);
color: var(--color-base,#202122);
border: 1px solid #ddd;
}
.voy-listing-name-latin, .voy-listing-comment, .voy-listing-directions, .voy-listing-phone-exception {
font-style: italic;
}
.voy-listing-directions .mw-selflink {
font-weight: normal;
}
.voy-listing-hours, .voy-listing-checkin, .voy-listing-checkout, .voy-listing-price,
.voy-listing-payment, .voy-listing-subtype {
color: #888;
}
.voy-listing-phone-number {
white-space: nowrap;
}
.voy-listing-add-contact {
display: none;
}
.voy-vCard .voy-flag-icon {
position: relative;
top: 2px;
}
/*
Status and listing icons
*/
.voy-listing-icon, .voy-listing-social-media {
white-space: nowrap;
}
.voy-listing-icon:before, .voy-listing-social-media:before {
content: ' ';
white-space: normal;
}
.voy-listing-sister-wikidata:before {
content: none;
}
.voy-listing-icon-with-space {
white-space: normal !important;
}
.voy-listing-status-item {
list-style-type: none;
list-style-image: none;
text-indent: -20px;
}
.voy-listing-status-item li {
list-style-type: inherit;
text-indent: 0;
}
.vcard span, .vcard div.voy-listing-content {
text-indent: 0;
}
.voy-listing-status, .voy-listing-icon span, .voy-listing-social-media span {
display: inline-block;
position: relative;
top: 2px;
background-repeat: no-repeat;
background-position: left bottom;
background-size: 16px;
width: 16px;
height: 16px;
white-space: nowrap;
padding-left: 16px;
box-sizing: border-box;
overflow: hidden;
color: transparent;
}
.voy-listing-status + .voy-listing-status {
margin-left: 4px;
}
@media print {
.voy-listing-icon a, .voy-listing-icon bdi, .voy-listing-social-media a {
display: none !important;
}
.voy-listing-icon:before, .voy-listing-social-media:before {
content: '';
}
}
/* status icons */
.voy-listing-status-none, .voy-listing-status-stub {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Symbol_plain_grey.svg/120px-Symbol_plain_grey.svg.png');
}
.voy-listing-status-outline {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Start-icon.svg/120px-Start-icon.svg.png');
}
.voy-listing-status-usable {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Symbol_keep_vote.svg/120px-Symbol_keep_vote.svg.png');
}
.voy-listing-status-guide {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/94/Symbol_support_vote.svg/120px-Symbol_support_vote.svg.png');
}
.voy-listing-status-star, .voy-listing-status-recommendation {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Symbol_star_gold.svg/120px-Symbol_star_gold.svg.png');
}
.voy-listing-status-top-sight, .voy-listing-status-top-hotel, .voy-listing-status-top-restaurant {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Symbol_star2.svg/120px-Symbol_star2.svg.png');
}
/* Wikimedia sister site icons */
.voy-listing-sister-commons span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/120px-Commons-logo.svg.png');
background-size: auto 16px;
width: 12px;
padding-left: 12px;
}
.voy-listing-sister-wikidata span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Wikidata-logo-without-paddings.svg/120px-Wikidata-logo-without-paddings.svg.png');
background-position: 0 4px;
}
.voy-listing-sister-wikipedia span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Antu_wikipedia.svg/120px-Antu_wikipedia.svg.png');
}
.voy-listing-sister-wikivoyage span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Wikivoyage-Logo-v3-icon.svg/120px-Wikivoyage-Logo-v3-icon.svg.png');
}
.voy-listing-sister-maps span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Antu_marble.svg/120px-Antu_marble.svg.png');
}
/* social-media site icons */
.voy-listing-social-media-facebook span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/b/b8/2021_Facebook_icon.svg/120px-2021_Facebook_icon.svg.png');
}
.voy-listing-social-media-flickr span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/44/Flickr.svg/120px-Flickr.svg.png');
}
.voy-listing-social-media-instagram span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/95/Instagram_logo_2022.svg/120px-Instagram_logo_2022.svg.png');
}
.voy-listing-social-media-rss span, .voy-listing-rss span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/43/Feed-icon.svg/120px-Feed-icon.svg.png');
}
.voy-listing-social-media-tiktok span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Iconoir_tiktok.svg/120px-Iconoir_tiktok.svg.png');
}
.voy-listing-social-media-x span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/c/ce/X_logo_2023.svg/120px-X_logo_2023.svg.png');
background-position: 0 2px;
}
.voy-listing-social-media-youtube span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/fd/YouTube_full-color_icon_%282024%29.svg/120px-YouTube_full-color_icon_%282024%29.svg.png');
background-position: 0 3px;
}
/* additional icons */
.voy-listing-url span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/7/70/Applications-internet.svg/120px-Applications-internet.svg.png');
}
.voy-listing-unesco span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/fd/WV-Unesco-icon-small.svg/120px-WV-Unesco-icon-small.svg.png');
}
@media screen {
html.skin-theme-clientpref-night .voy-listing-social-media-tiktok span,
html.skin-theme-clientpref-night .voy-listing-social-media-x span {
filter: invert(100%);
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .voy-listing-social-media-tiktok span,
html.skin-theme-clientpref-os .voy-listing-social-media-x span {
filter: invert(100%);
}
}
/* Wikidata icon is shown only for logged-in users. The class voy-user-login in
body tag is set by [[MediaWiki:InitListingTools.js]] script. */
.voy-listing-sister-wikidata a, .voy-listing-icon-with-space {
display: inline; /* manuální úprava pro trvalé zobrazení (automatické skrytí nefunguje) */
}
body.voy-user-login .voy-listing-sister-wikidata a, body.voy-user-login .voy-listing-icon-with-space {
display: inline;
}
.voy-listing-subtype-icon + .voy-listing-subtype-icon {
margin-left: 2px;
}
.voy-listing-icon .external, .voy-listing-social-media .external, .voy-listing-url .external,
.voy-listing-rss .external {
color: #000;
background: none; /* unterdrücke Link-Symbol bei sozialen Medien */
padding-right: 0;
}
.voy-listing-content {
margin-top: 0.5em;
}
.voy-listing-content .voy-listing-next-paragraph { /* br-tag formatting in description */
display: block;
content: "";
margin-top: 0.5em;
}
.voy-listing-next-paragraph + div, .voy-listing-next-paragraph + style + div {
margin-top: 0 !important;
}
/*
Meta data
*/
.voy-listing-metadata {
font-size: 0.8em;
color: #888;
}
.voy-Marker .voy-listing-metadata {
display: none;
}
.voy-listing-metadata-item {
display: inline-block;
white-space: nowrap;
}
.voy-listing-outdated {
display: inline;
white-space: normal;
}
.voy-listing-item-dummy {
display: none;
}
.voy-listing-metadata-item:first-child:before,
.voy-listing-item-dummy + .voy-listing-metadata-item:before {
content: " (";
}
.voy-listing-metadata-item:after {
content: " | ";
}
.voy-listing-metadata-item:last-child:after {
content: ")";
}
.voy-listing-inline .voy-listing-metadata-item:before,
.voy-listing-inline .voy-listing-metadata-item:after {
content: "";
}
.voy-listing-inline .voy-listing-metadata-item {
box-sizing: border-box;
}
/* lastedit is not shown if the listing template is used within a text block.
voy-listing-inline is set in case of vCard parameter show = inline is set. */
.voy-listing-inline .voy-listing-lastedit {
display: none;
}
@media print {
.voy-listing-lastedit:after {
content: ")";
}
.voy-listing-inline .voy-listing-lastedit:after {
content: "";
}
}
.voy-listing-metadata-item button, .voy-listing-metadata .voy-listing-toSourcePage a {
display: inline-block;
border: none;
background-color: transparent;
color: #888;
font-family: sans-serif;
font-size: 1em;
cursor: pointer;
padding: 0;
}
.voy-listing-edit-button button, .voy-listing-metadata .voy-listing-toSourcePage a {
position: relative;
padding-left: 15px;
}
.voy-listing-info-button button {
position: relative;
padding-left: 12px;
}
.voy-listing-info-button button:before {
left: -2px;
top: -1px;
background-image: url( "//upload.wikimedia.org/wikipedia/commons/thumb/0/02/Maki-information-15.svg/120px-Maki-information-15.svg.png" );
background-size: 14px;
}
.voy-listing-metadata-item button:hover, .voy-listing-metadata-item button:focus,
.voy-listing-metadata-item button:active {
text-decoration: underline;
}
.voy-listing-inline .voy-listing-metadata-item button {
display: inline;
color: transparent;
}
.voy-listing-edit-button button:before, .voy-listing-toSourcePage a:before,
.voy-listing-info-button button:before {
content: "";
display: block;
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 15px;
background-repeat: no-repeat;
background-position: 0 25%;
background-size: 12px;
filter: opacity(0.45);
}
.voy-listing-edit-button button:before, .voy-listing-toSourcePage a:before {
background-image: url( "//upload.wikimedia.org/wikipedia/commons/thumb/8/8a/OOjs_UI_icon_edit-ltr.svg/120px-OOjs_UI_icon_edit-ltr.svg.png" );
}
.voy-listing-inline .voy-listing-edit-button,
.voy-listing-inline .voy-listing-info-button {
width: 1.5em;
padding-left: 2px;
clip-path: polygon(0 0, 1.5em 0, 1.5em 100%, 0% 100%);
/* Workaround for overflow: clip */
}
@media screen {
html.skin-theme-clientpref-night .voy-listing-edit-button button:before,
html.skin-theme-clientpref-night .voy-listing-info-button button:before,
html.skin-theme-clientpref-night .voy-listing-toSourcePage a:before {
filter: invert(0.5);
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .voy-listing-edit-button button:before,
html.skin-theme-clientpref-os .voy-listing-info-button button:before,
html.skin-theme-clientpref-os .voy-listing-toSourcePage a:before {
filter: invert(0.5);
}
}
@media print {
.voy-listing-metadata .voy-listing-toSourcePage {
display: none;
}
}
.voy-listing-inline .voy-listing-info-button {
padding-left: 5px;
}
@media print {
.voy-listing-info-button, .voy-listing-edit-button {
display: none;
}
}
/*
CSS properties for marker-symbol wrapper
*/
.voy-listing-map {
display: inline-block;
position: relative;
border-radius: 3px;
line-height: 1.15em;
top: -1px;
}
.voy-listing-map a.external:link, .voy-listing-map a.external:visited, .voy-listing-map a.external:hover,
.voy-listing-map a.external:active {
text-decoration: none;
}
.voy-listing-map .mw-kartographer-maplink {
display: inline-block;
min-width: 1.5em;
height: 1.3em;
line-height: 1.3em;
padding: 1px;
border-radius: 3px;
/* for marker-copy */
top: 0;
position: relative;
font-size: 0.85em;
font-weight: bold;
font-style: normal;
text-align: center;
vertical-align: middle;
}
.mw-kartographer-maplink img {
vertical-align: -15%;
}
.voy-listing-map-inverse-img.voy-listing-map-is-symbol .mw-kartographer-maplink img {
filter: invert(100%);
}
/*
For media with missing or limited pointer capabilities, i.e. for mobile
devices etc. Secondary devices are considered, too.
See: https://www.w3.org/TR/mediaqueries-4/#any-input
*/
.voy-listing-tooltip-mobile .mw-kartographer-maplink {
min-width: 3em;
}
@media print {
.voy-listing-map .mw-kartographer-maplink {
min-width: 1.5em;
}
}
body.skin-minerva .voy-listing-map .mw-kartographer-maplink,
body.skin-timeless .voy-listing-map .mw-kartographer-maplink {
vertical-align: 10%;
}
ldrr3wsu6gg5umpjemrthq00yb4z1ce
Modul:Marker utilities/Types
828
1345
22094
20758
2026-05-20T11:20:51Z
LiMr
96
aktualizace na novější verzi
22094
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities/Types&oldid=1764381)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities/Types&oldid=1764381)
--[[
Please use only quotation marks instead of apostrophs for JSON export.
Do not change this modul without need. A change causes the parsing of the
majority of articles. Wishes for new types should be discussed and collected
on Module talk:Marker utilities/Types.
Types should conform to tags in Openstreetmap, if possible.
New types must be entered in Template:Marker/XML and Template:vCard/XML, too.
--]]
return {
-- administration
moduleInterface = {
suite = "Marker utilities",
sub = "types",
serial = "2026-03-27",
item = 65444106
},
types = {
-- do not remove the following line
-- ##start
-- journey and mobility
aerialway = { group = "go", wd = "Q1424016", label = "lanovka" },
airline = { group = "go", wd = "Q46970", label = "letecká společnost" },
airport = { group = "go", wd = { "Q1248784", "Q62447", "Q644371" }, useIATA = "1", label = "letiště" },
airport_service = { group = "go", label = "letištní servis" },
bicycle_parking = { group = "go", wd = "Q16243822", label = "parkování kol" },
bicycle_rental = { alias = "bicycle_share", group = "go", wd = { "Q10611118", "Q1358919" }, label = "půjčovna kol", icon = "bicycle-share" },
bicycle_repair = { group = "go", wd = { "Q96983545", "Q112663579" }, label = "Fahrradreparatur" },
boat_sharing = { group = "go", wd = "Q4931514", label = "pronájem lodí" },
boat_trip = { group = "go", wd = "Q25040412", label = "výlet lodí" },
border_control = { group = "go", wd = "Q218719", label = "hraniční kontrola" },
bus = { alias = "bus_stop", group = "go", wd = { "Q953806", "Q494829" }, label = "zastávka autobusu" },
car_rental = { group = "go", wd = "Q291240", label = "půjčovna aut" },
car_repair = { group = "go", wd = "Q1310967", label = "autoservis" },
car_sharing = { group = "go", wd = "Q847201", label = "sdílení aut" },
charging_station = { group = "go", wd = { "Q2140665", "Q55956304" }, label = "nabíjecí stanice" },
cycle_track = { alias = "cycle_path", group = "go", wd = { "Q25037910", "Q221722" }, label = "cyklostezka" },
entrance = { group = "go", wd = "Q1137365", label = "Vstup" },
ferry = { group = "go", wd = { "Q100355757", "Q25653", "Q1478783" }, label = "přístaviště trajektů" },
ford = { group = "go", wd = "Q12743", label = "brod" },
fuel = { alias = "filling_station", group = "go", wd = "Q205495", label = "čerpací stanice" },
funicular = { group = "go", wd = "Q142031", label = "stanice lanovky" },
harbor = { alias = "port", group = "go", wd = { "Q44782", "Q283202" }, label = "přístav" },
heliport = { group = "go", wd = "Q502074", label = "heliport" },
junction = { alias = { "road_junction", "intersection" }, group = "go", wd = { "Q1788454", "Q285783" }, label = "křižovatka" },
landing_site = { group = "go", wd = "Q3631092", label = "přistávací plocha" },
left_luggage = { group = "go", wd = "Q21996814", label = "úschova zavazadel" },
light_railway = { alias = "lrt", group = "go", wd = "Q32680449", label = "zastávka levné železnice" },
marina = { group = "go", wd = "Q721207", label = "marina" },
monorail = { group = "go", wd = "Q187934", label = "stanice jednokolejky" },
motorbike_rental = { group = "go", label = "půjčovna motocyklů" },
motorway_junction = { group = "go", label = "dálniční křižovatka" },
parking = { group = "go", wd = "Q6501349", label = "parkování" },
parking_garage = { group = "go", wd = "Q13218805", label = "garáž" },
pier = { group = "go", wd = "Q863454", label = "molo" }, -- also jetty
public_transport = { group = "go", wd = "Q178512", label = "veřejná doprava" },
quay = { alias = "wharf", group = "go", wd = "Q828909", label = "přístaviště" },
rail = { alias = { "train", "railway", "railway_station" }, group = "go", wd = { "Q55488", "Q55678" }, label = "nádraží" },
scooter = { group = "go", wd = { "Q193234", "Q502057" }, label = "koloběžky" },
service_area = { group = "go", wd = "Q786014", label = "odpočívadlo" },
ship = { group = "go", wd = "Q11446", label = "loď" },
shipping_company = { group = "go", label = "rejdařství" },
shuttle_bus_service = { group = "go", label = "kyvadlová doprava" },
station = { group = "go", wd = "Q12819564", label = "stanice" },
suburban_rail = { alias = { "suburban_railway", "commuter_rail", "s-bahn" }, group = "go", wd = { "Q1412403", "Q95723" }, label = "stanice S-Bahn" },
subway = { alias = "metro", group = "go", wd = "Q928830", label = "stanice metra", icon = "rail-metro" },
taxi = { group = "go", wd = "Q1395196", label = "stanoviště taxi" },
terminal = { group = "go", wd = "Q849706", label = "terminál" },
toll_station = { group = "go", wd = "Q1364150", label = "mýtná stanice" },
tram = { group = "go", wd = "Q2175765", label = "zastávka tramvaje", icon = "rail-light" },
tunnel = { group = "go", wd = "Q44377", label = "tunel" },
waiting_room = { group = "go", wd = "Q674251", label = "čekárna" },
waypoint = { group = "go", wd = "Q138081", label = "traťový bod" },
-- group types
go = { group = "go", wd = { "Q334166", "Q740752" }, label = "doprava" },
-- sights: religious sites and monuments
altar = { group = "religion", wd = "Q101687", label = "oltář" },
bahai_temple = { group = "religion", wd = "Q1568313", label = "chrám Bahá'í" },
basilica = { group = "religion", wd = { "Q163687", "Q4846867" }, label = "bazilika" },
buddharupa = { group = "religion", wd = "Q1000809", label = "socha Buddhy", icon = "religious-buddhist" },
cathedral = { group = "religion", wd = "Q2977", label = "katedrála", icon = "religious-christian" },
chapel = { group = "religion", wd = "Q108325", label = "kaple", icon = "religious-christian" },
chapel_shrine = { group = "religion", wd = "Q14552192", label = "svatý dům" },
church = { group = "religion", wd = { "Q16970", "Q580499" }, label = "kostel", icon = "religious-christian" },
fire_temple = { group = "religion", wd = "Q115278", label = "chrám ohně" },
gurdwara = { group = "religion", wd = "Q337986", label = "gurdwara" },
hindu_temple = { group = "religion", wd = "Q842402", label = "hinduistický chrám" },
lak_mueang = { group = "religion", wd = "Q974127", label = "Lak Muang" },
lourdes_grotto = { group = "religion", wd = "Q1433032", label = "Lurdská jeskyně, Mariina jeskyně" },
mikveh = { group = "religion", wd = "Q211351", label = "mikve" },
minaret = { group = "religion", wd = "Q48356", label = "minaret" },
monastery = { group = "religion", wd = { "Q44613", "Q160742" }, label = "klášter" },
mosque = { group = "religion", wd = "Q32815", label = "mešita", icon = "religious-muslim" },
nunnery = { group = "religion", wd = "Q6021560", label = "ženský klášter" },
pagoda = { group = "religion", wd = "Q199451", label = "pagoda" },
pilgrimage_site = { group = "religion", wd = "Q15135589", label = "poutní místo" },
sanctuary = { group = "religion", wd = "Q29553", label = "svatyně" },
shinto_shrine = { group = "religion", wd = "Q845945", label = "šintoistická svatyně", icon = "religious-shinto" },
shrine = { group = "religion", wd = "Q697295", label = "svatyně" },
stupa = { group = "religion", wd = "Q180987", label = "stúpa" },
summit_cross = { group = "religion", wd = "Q361665", label = "vrcholový kříž" },
synagogue = { group = "religion", wd = "Q34627", label = "synagoga", icon = "religious-jewish" },
temple = { group = "religion", wd = { "Q44539", "Q927825", "Q58621988" }, label = "chrám" },
wat = { group = "religion", wd = "Q427287", label = "wat" },
wayside_cross = { group = "religion", wd = "Q2309609", label = "kříž u cesty" },
wayside_shrine = { group = "religion", wd = { "Q3395121", "Q12661150" }, label = "boží muka" },
religion = { alias = "religious_site", group = "religion", wd = "Q1370598", label = "náboženské místo" },
-- sights: natural
animal_shelter = { group = "nature", wd = "Q1411287", label = "Tierheim" },
animal_stable = { alias = "stable", group = "nature", wd = { "Q214252", "Q1207909" }, label = "chlév" },
aquarium = { group = "nature", wd = "Q2281788", label = "akvárium" },
bay = { group = "nature", wd = { "Q39594", "Q17018380" }, label = "zátoka" },
botanical_garden = { group = "nature", wd = "Q167346", label = "botanická zahrada" },
canal = { group = "nature", wd = "Q12284", label = "kanál" },
canyon = { group = "nature", wd = "Q150784", label = "kaňon, soutěska" },
cape = { group = "nature", wd = "Q185113", label = "mys" },
cave = { group = "nature", wd = "Q35509", label = "jeskyně" },
cliff = { group = "nature", wd = "Q107679", label = "útes" },
coast = { group = "nature", wd = "Q93352", label = "pobřeží" },
crater = { group = "nature", wd = "Q3240715", label = "kráter" },
crocodile_farm = { group = "nature", wd = "Q25691", label = "krokodýlí farma" },
depression = { group = "nature", wd = "Q190429", label = "sníženina" },
desert = { group = "nature", wd = "Q8514", label = "poušť" },
dive_site = { group = "nature", wd = "Q2141554", label = "potápěčská lokalita" },
dog_park = { group = "nature", wd = "Q38516", label = "psí park" },
dolphinarium = { group = "nature", wd = "Q491675", label = "delfinárium" },
dune = { group = "nature", wd = "Q25391", label = "duna" },
dyke = { group = "nature", wd = "Q105190", label = "hráz" },
farm = { group = "nature", wd = "Q131596", label = "statek" },
fish_pond = { group = "nature", wd = "Q1265665", label = "rybník" },
fjord = { group = "nature", wd = "Q45776", label = "fjord" },
forest = { group = "nature", wd = "Q4421", label = "les" },
garden = { group = "nature", wd = "Q1107656", label = "zahrada" },
geyser = { group = "nature", wd = "Q83471", label = "gejzír" },
glacier = { group = "nature", wd = "Q35666", label = "ledovec" },
greenhouse = { group = "nature", wd = "Q165044", label = "Gewächshaus, Treibhaus" },
gulf = { group = "nature", wd = "Q1322134", label = "záliv" },
habitat = { group = "nature", label = "místo výskytu" },
heath = { group = "nature", wd = "Q27590", label = "Heide" },
hill = { group = "nature", wd = "Q54050", label = "kopec" },
horticulture = { group = "nature", wd = "Q48803", label = "hortikultura" },
hot_spring = { group = "nature", wd = "Q177380", label = "termální pramen" },
island = { group = "nature", wd = "Q23442", label = "ostrov" },
lagoon = { group = "nature", wd = "Q187223", label = "laguna" },
lake = { group = "nature", wd = "Q23397", label = "jezero" },
landscape = { group = "nature", wd = "Q107425", label = "krajina" },
mangrove = { group = "nature", wd = "Q19756", label = "mangrov" },
meadow = { group = "nature", wd = "Q7777019", label = "louka" },
mountain = { group = "nature", wd = "Q8502", label = "hora" },
mountain_chain = { group = "nature", wd = "Q2624046", label = "pohoří" },
mountain_pass = { group = "nature", wd = "Q133056", label = "průsmyk" },
mountain_range = { group = "nature", wd = "Q46831", label = "pohoří" },
national_park = { group = "nature", wd = "Q46169", label = "národní park" },
natural_heritage = { group = "nature", wd = "Q386426", label = "přírodní dědictví" },
natural_monument = { group = "nature", wd = "Q23790", label = "Přírodní památka" },
nature_reserve = { group = "nature", wd = { "Q158454", "Q179049", "Q473972", "Q759421", "Q20268756" }, label = "přírodní rezervace" },
oasis = { group = "nature", wd = "Q43742", label = "oáza" },
palaeontological_site = { group = "nature", wd = "Q9096832", label = "paleontologické naleziště" },
park = { group = "nature", wd = { "Q22698", "Q728904" }, label = "park" },
peninsula = { group = "nature", wd = "Q34763", label = "poloostrov" },
plantation = { group = "nature", wd = "Q188913", label = "plantáž" },
plateau = { group = "nature", wd = "Q75520", label = "náhorní plošina" },
protected_area = { alias = "protectorate", group = "nature", wd = "Q473972", label = "chráněná oblast" },
reef = { group = "nature", wd = "Q184358", label = "rif" },
reservoir = { group = "nature", wd = "Q131681", label = "přehradní nádrž" },
river = { group = "nature", wd = "Q4022", label = "řeka" },
river_mouth = { group = "nature", wd = "Q1233637", label = "ústí" },
rock = { group = "nature", wd = { "Q1404150", "Q8063" }, label = "útes" },
sea = { group = "nature", wd = "Q165", label = "moře" },
spring = { group = "nature", wd = "Q124714", label = "pramen" },
steppe = { group = "nature", wd = "Q123991", label = "step" },
strait = { group = "nature", wd = "Q37901", label = "průliv" },
stream = { group = "nature", wd = "Q47521", label = "potok" },
stud = { group = "nature", wd = "Q108696", label = "hřebčín" },
summit = { group = "nature", wd = "Q207326", label = "vrchol" },
tree = { group = "nature", wd = "Q10884", label = "strom" },
valley = { group = "nature", wd = "Q39816", label = "údolí" },
volcano = { group = "nature", wd = "Q8072", label = "vulkán" },
waterfall = { group = "nature", wd = "Q34038", label = "vodopád" },
wetland = { group = "nature", wd = "Q170321", label = "mokřad" },
zoo = { group = "nature", wd = "Q43501", label = "zoo" },
nature = { group = "nature", wd = "Q7860", label = "příroda" },
-- sights: arts, historic
amphitheater = { group = "see", wd = "Q54831", label = "amfiteátr" },
aqueduct = { group = "see", wd = "Q474", label = "akvadukt" },
archaeological_site = { group = "see", wd = "Q839954", label = "archeologické naleziště" },
architecture = { group = "see", wd = "Q12271", label = "architektura" },
archive = { group = "see", wd = { "Q166118", "Q635719", "Q27032363" }, label = "archiv" },
artwork = { group = "see", wd = "Q838948", label = "umělecké dílo" },
bakehouse = { group = "see", wd = "Q798436", label = "pekárna" },
barracks = { group = "see", wd = "Q131263", label = "kasárny" },
boat_lift = { group = "see", wd = "Q14908", label = "lodní výtah" },
bridge = { group = "see", wd = "Q12280", label = "most" },
building = { group = "see", wd = { "Q41176", "Q811979" }, label = "budova" },
building_complex = { group = "see", wd = { "Q1497364", "Q18247357" }, label = "komplex budov" },
bunker = { group = "see", wd = "Q91122", label = "bunkr" },
cannon = { group = "see", wd = "Q81103", label = "kanon" },
castle = { group = "see", wd = "Q23413", label = "hrad" },
cellar = { group = "see", wd = "Q234852", label = "sklep" },
cemetery = { alias = "necropolis", group = "see", wd = "Q39614", label = "hřbitov" },
cenotaph = { group = "see", wd = "Q321053", label = "Kenotaf, falešný hrob" },
chateau = { alias = "château", group = "see", wd = "Q751876", label = "zámek" },
city_center = { group = "see", wd = "Q1468524", label = "centrum města" },
city_wall = { group = "see", wd = "Q16748868", label = "městské hradby" },
collection = { group = "see", wd = { "Q2668072", "Q7328910" }, label = "sbírka" },
column = { group = "see", wd = { "Q4817", "Q51845395", "Q1930585" }, label = "soup" },
communication_tower = { group = "see", wd = { "Q11166728", "Q1798641" }, label = "vysílač" },
crematorium = { group = "see", wd = "Q157570", label = "krematorium" },
cultural_heritage = { group = "see", wd = "Q210272", label = "kulturní dědictví" },
dam = { group = "see", wd = "Q12323", label = "přehrada" },
domain = { group = "see", wd = "Q155231", label = "panství" },
embankment_dam = { group = "see", wd = "Q1244922", label = "hráz" },
exhibition = { group = "see", wd = "Q464980", label = "výstava" },
exhibition_hall = { group = "see", wd = { "Q57659484", "Q3364296" }, label = "výstavní síň" },
factory = { group = "see", wd = "Q83405", label = "továrna" },
fort = { group = "see", wd = "Q57831", label = "pevnost" },
fountain = { group = "see", wd = "Q483453", label = "fontána" },
gallery = { group = "see", wd = "Q1007870", label = "Galerie", icon = "art-gallery" },
gate = { group = "see", wd = "Q53060", label = "brána" },
ghost_town = { group = "see", wd = "Q74047", label = "město duchů" },
graduation_tower = { group = "see", wd = "Q1541226", label = "gradovna" },
grave = { group = "see", wd = "Q173387", label = "hrob" },
hall = { group = "see", wd = "Q240854", label = "hala" },
handicraft = { group = "see", wd = "Q52105", label = "ruční práce" },
high_rise = { alias = "skyscraper", group = "see", wd = { "Q18142", "Q11303" }, label = "výšková budova, mrakodrap" },
historic_district = { group = "see", wd = "Q15243209", label = "historická čtvrť", icon = "historic" },
house = { group = "see", wd = "Q3947", label = "dům" },
hydraulic_structure = { group = "see", wd = "Q2466889", label = "vodní dílo" },
landmark = { group = "see", wd = "Q2319498", label = "orientační bod" },
lighthouse = { group = "see", wd = "Q39715", label = "maják" },
lock = { group = "see", wd = "Q105731", label = "plavební komora" },
mausoleum = { group = "see", wd = "Q162875", label = "mauzoleum" },
megalithic_tomb = { group = "see", wd = { "Q10521078", "Q101659" }, label = "megalitická hrobka, dolmen, mohyla" },
memorial = { group = "see", wd = "Q5003624", label = "památník" },
mill = { group = "see", wd = "Q44494", label = "mlýn" },
mine = { group = "see", wd = "Q820477", label = "důl" }, -- including surface mining
mining_museum = { group = "see", wd = "Q819426", label = "důlní muzeum" },
monument = { group = "see", wd = "Q4989906", label = "monument" },
museum = { group = "see", wd = "Q33506", label = "muzeum" },
museum_ship = { group = "see", wd = "Q575727", label = "lodní muzeum" },
national_monument = { group = "see", wd = "Q893745", label = "národní památník" },
obelisk = { group = "see", wd = "Q170980", label = "obelisk" },
observatory = { group = "see", wd = { "Q1254933", "Q62832" }, label = "observatoř" },
old_town = { group = "see", wd = "Q676050", label = "staré město", icon = "historic" },
open_air_museum = { group = "see", wd = "Q756102", label = "skanzen" },
palace = { group = "see", wd = "Q16560", label = "palác" },
pavilion = { alias = "arbor", group = "see", wd = { "Q276173", "Q23457088", "Q961082" }, label = "pavilon" },
pedestrian = { group = "see", wd = "Q369730", label = "chodec" },
planetarium = { group = "see", wd = "Q148319", label = "planetárium" },
power = { group = "see", wd = "Q159719", label = "energie" }, -- power station, transformers, towers etc.
promenade = { group = "see", wd = "Q787113", label = "promenáda" },
pyramid = { group = "see", wd = "Q12516", label = "pyramida" },
quarry = { group = "see", wd = "Q15115254", label = "lom" },
road = { group = "see", wd = { "Q34442", "Q83620" }, label = "ulice, silnice" }, -- including street and lane
rock_art = { group = "see", wd = "Q1211146", label = "kamenné umění" },
ruins = { group = "see", wd = "Q109607", label = "ruiny" },
shipyard = { group = "see", wd = "Q190928", label = "loděnice" },
spaceport = { group = "see", wd = "Q194188", label = "kosmodrom" },
square = { group = "see", wd = "Q174782", label = "náměstí" },
statue = { group = "see", wd = "Q179700", label = "socha" },
stele = { group = "see", wd = "Q178743", label = "stéla" },
stolperstein = { group = "see", wd = "Q314003", label = "kameny zmizelých" }, -- Stolpersteine
technical_monument = { group = "see", wd = "Q1516537", label = "technická památka" },
tomb = { group = "see", wd = { "Q381885", "Q6023295" }, label = "hrobka" },
tower = { group = "see", wd = "Q12518", label = "věž" },
town_hall = { group = "see", wd = "Q543654", label = "radnice" },
tumulus = { group = "see", wd = "Q34023", label = "mohyla" },
viaduct = { group = "see", wd = "Q181348", label = "viadukt" },
wall = { group = "see", wd = "Q42948", label = "zeď" },
war_grave = { group = "see", wd = "Q90717531", label = "válečný hrob" },
war_memorial = { group = "see", wd = "Q575759", label = "válečný památník, válečný pomník" },
watermill = { group = "see", wd = "Q185187", label = "vodní mlýn" },
weather_station = { group = "see", wd = "Q190107", label = "meteorologická stanice" },
weir = { group = "see", wd = "Q1066997", label = "jez" },
well = { group = "see", wd = "Q43483", label = "studna" },
windmill = { group = "see", wd = "Q38720", label = "větrný mlýn" },
wreck = { group = "see", wd = "Q852190", label = "lodní vrak" },
-- group types
see = { group = "see", wd = "Q570116", label = "pamětihodnost" },
-- culture
arena = { group = "do", wd = "Q641226", label = "aréna" },
arts_center = { group = "do", wd = "Q2190251", label = "centrum umění" },
bird_watching = { group = "do", wd = "Q685629", label = "pozorovna ptáků" },
bullring = { group = "do", wd = "Q1193438", label = "býčí aréna" },
cabaret = { group = "do", wd = "Q131183", label = "kabaret" },
cinema = { group = "do", wd = "Q41253", label = "kino" },
circus = { group = "do", wd = "Q47928", label = "cirkus" },
concert_hall = { group = "do", wd = "Q1060829", label = "koncertní síň" },
conference_center = { group = "do", wd = "Q1378975", label = "kongresové centrum" },
cultural_center = { group = "do", wd = "Q1329623", label = "kulturní centrum" },
edutainment = { group = "do", wd = "Q1153173", label = "zábavné vzdělávání" },
event = { group = "do", wd = "Q1190554", label = "událost" },
event_venue = { group = "do", wd = "Q18674739", label = "dějiště událostí" },
fair = { group = "do", wd = { "Q57305", "Q2948561" }, label = "veletrh" },
festival = { group = "do", wd = "Q132241", label = "festival" },
heritage_railway = { group = "do", wd = "Q420962", label = "historická železnice" },
karaoke = { group = "do", wd = "Q229345", label = "karaoke" },
lazy_river = { group = "do", wd = "Q3220071", label = "Lazy River" },
[ "multi-purpose_hall" ] = { group = "do", wd = { "Q1763828", "Q2400020" }, label = "víceúčelový sál" },
music = { group = "do", wd = "Q638", label = "hudba" }, -- different types of music theaters
opera_house = { group = "do", wd = "Q153562", label = "operní scéna" },
puppet_theater = { group = "do", wd = "Q3982337", label = "loutkové divadlo" },
recording_studio = { group = "do", wd = "Q746369", label = "nahrávací studio" },
sightseeing_flight = { alias = "pleasure_flight", group = "do", wd = "Q1425541", label = "vyhlídkový let" },
theater = { group = "do", wd = { "Q11635", "Q24354" }, label = "divadlo", icon = "theatre" }, -- speech theater, theater in general
themed_travel = { group = "do", label = "tematické výlety" },
wildlife_observation = { group = "do", wd = { "Q28455557", "Q241741" }, label = "pozorování zvířat" },
-- recreation
amusement_park = { group = "do", wd = "Q194195", label = "zábavní park" },
attraction = { group = "do", wd = "Q2800000", label = "atrakce" },
ballooning = { group = "do", wd = "Q805325", label = "let balónem" },
brine_bath = { group = "do", wd = "Q1316853", label = "solné lázně" },
casino = { group = "do", wd = "Q133215", label = "kasino" },
entertainment = { group = "do", wd = "Q173799", label = "zábava" },
escape_game = { group = "do", wd = "Q1201679", label = "úniková hra" },
falconry_display = { group = "do", wd = "Q1169958", label = "sokolnická expozice" },
game = { group = "do", wd = "Q11410", label = "hra" },
massage = { group = "do", wd = "Q179415", label = "masáž" },
onsen = { group = "do", wd = "Q655311", label = "Onsen" },
picnic = { group = "do", wd = "Q506294", label = "piknik", icon = "picnic-site" },
playground = { group = "do", wd = "Q11875349", label = "dětské hřiště" },
public_bath = { group = "do", wd = "Q785952", label = "veřejné lázně" },
ropes_course = { group = "do", wd = "Q1939700", label = "lanový park" },
sauna = { group = "do", wd = "Q57036", label = "sauna" },
spa = { alias = "wellness", group = "do", wd = "Q6882870", label = "lázně" },
theme_park = { group = "do", wd = "Q2416723", label = "tematický park" },
thermal_bath = { group = "do", wd = "Q1004887", label = "termální lázně" },
water_park = { group = "do", wd = { "Q740326", "Q118559331" }, label = "aquapark" },
water_playground = { group = "do", wd = "Q19984194", label = "vodní hřiště" },
youth_center = { group = "do", wd = "Q1302299", label = "klub mládeže" },
-- sports and fitness
["9pin"] = { group = "do", wd = "Q706199", label = "kuželky" },
["10pin"] = { alias = "bowling", group = "do", wd = "Q172809", label = "bowling", icon = "bowling-alley" },
athletics_track = { group = "do", wd = { "Q1004435", "Q37025296", "Q121072018" }, label = "atletická dráha" },
archery = { group = "do", wd = "Q108429", label = "lukostřelba" },
badminton = { group = "do", wd = "Q7291", label = "badminton" },
barefoot_path = { group = "do", wd = "Q2143241", label = "bosá stezka" },
baseball = { group = "do", wd = { "Q5369", "Q701629" }, label = "baseball" },
basketball_court = { group = "do", wd = "Q2341939", label = "basketbalové hřiště" },
beach = { group = "do", wd = "Q40080", label = "pláž" },
beachvolleyball = { group = "do", wd = "Q4543", label = "plážový volejbal" },
bicycle_route = { group = "do", wd = { "Q353027", "Q102307360" }, label = "cyklotrasa" },
billiards = { group = "do", wd = "Q3341285", label = "kulečník" },
bmx = { group = "do", wd = "Q215184", label = "BMX" },
boat_rental = { group = "do", wd = "Q25384001", label = "půjčovna lodí" },
bobsleigh = { group = "do", wd = "Q177275", label = "bobování" },
bouldering = { group = "do", wd = "Q852989", label = "bouldering" },
boules = { group = "do", wd = "Q895060", label = "koulové sporty" },
bungee_jumping = { group = "do", wd = "Q193847", label = "bungee jumping" },
canoe = { group = "do", wd = "Q171529", label = "kánoe" }, -- Kanu, Kayak
canyoning = { group = "do", wd = "Q206091", label = "canyoning" },
city_beach = { group = "do", wd = "Q7900097", label = "městská pláž" }, -- incl. beach club
court = { group = "do", wd = "Q41487", label = "soud" },
cricket = { group = "do", wd = "Q5375", label = "kriket" },
cycling = { group = "do", wd = "Q53121", label = "cyklistika" },
dive_center = { alias = { "dive_centre", "diving center" }, group = "do", wd = "Q3664857", label = "potápěčské centrum" },
downhill = { group = "do", wd = { "Q319899", "Q121071424" }, label = "lyžování", icon = "skiing" }, -- alpine/downhill ski route
extreme_sports = { group = "do", wd = "Q309162", label = "extrémní sport" },
fishing = { group = "do", wd = "Q14373", label = "rybaření" },
fitness_center = { alias = "gym", group = "do", wd = { "Q1065656", "Q30750411" }, label = "posilovna", icon = "fitness-centre" },
football_pitch = { group = "do", wd = "Q105755419", label = "fotbalové hřiště" },
gliding = { group = "do", wd = "Q624161", label = "plachtění" },
golf = { group = "do", wd = { "Q5377", "Q3177122" }, label = "golf" },
hiking = { alias = "trekking", group = "do", wd = "Q12014035", label = "turistika" },
horse_racing = { group = "do", wd = "Q187916", label = "dostihy" },
horse_riding = { alias = "equestrian", group = "do", wd = { "Q179226", "Q902378" }, label = "ježdění na koni" },
hunting = { group = "do", wd = "Q36963", label = "lov" },
ice_hockey = { group = "do", wd = "Q41466", label = "lední hokej" },
ice_rink = { group = "do", wd = "Q1282870", label = "ledová plocha" },
ice_skating = { group = "do", wd = "Q779272", label = "bruslení" },
ice_stadium = { group = "do", wd = "Q12019965", label = "zimní stadion" },
indoor_pool = { group = "do", wd = "Q357380", label = "krytý bazén" },
karting = { group = "do", wd = "Q192420", label = "karting" },
kitesurfing = { group = "do", wd = "Q219554", label = "kitesurfing" },
laser_tag = { group = "do", wd = "Q998303", label = "laserová hra" },
leisure_center = { group = "do", wd = "Q30313989", label = "volnočasové centrum" },
minigolf = { group = "do", wd = "Q754796", label = "minigolf" },
mountain_biking = { group = "do", wd = { "Q520611", "Q223705" }, label = "horské kolo" },
mountain_hiking = { alias = "hillwalking", group = "do", wd = "Q1762646", label = "horská turistika" },
mountaineering = { alias = "mountain_climbing", group = "do", wd = "Q22857", label = "lezení" },
motocross = { group = "do", wd = "Q215862", label = "motokros" },
nordic = { group = "do", wd = "Q216613", label = "klasické lyžování" }, -- nordic/cross country ski trail
orienteering = { group = "do", wd = "Q29358", label = "orientační sporty" },
outdoor_chess = { group = "do", wd = { "Q115997054", "Q110079" }, label = "venkovní šachy" },
outdoor_pool = { group = "do", wd = "Q13586493", label = "venkovní bazén" },
paintball = { group = "do", wd = "Q192832", label = "paintball" },
parachuting = { alias = "skydiving", group = "do", wd = "Q193210", label = "parašutismus" },
paragliding = { group = "do", wd = "Q178380", label = "paragliding" },
pedalo = { group = "do", wd = "Q1335189", label = "šlapadlo" },
petanque = { group = "do", wd = { "Q189317", "Q114646415" }, label = "pétanque" },
polo = { group = "do", wd = "Q134211", label = "pólo" },
quad_bike = { group = "do", wd = "Q3926537", label = "čtyřkolka" },
racetrack = { group = "do", wd = "Q1777138", label = "závodiště" },
rafting = { group = "do", wd = "Q207238", label = "rafting" }, -- including whitewater rafting
roller_skating = { group = "do", wd = "Q1707432", label = "bruslení na kolečkových bruslích" }, -- including inline roller skating
rowing = { group = "do", wd = "Q159354", label = "veslování" },
running = { group = "do", wd = "Q3694569", label = "běh" },
sailing = { group = "do", wd = "Q192520", label = "plachtění" },
sandboarding = { group = "do", wd = "Q570459", label = "sandboarding" },
scuba_diving = { group = "do", wd = "Q1096878", label = "potápění" },
shooting_range = { group = "do", wd = "Q521839", label = "střelnice" },
skatepark = { group = "do", wd = "Q909906", label = "skatepark" },
ski_jumping = { group = "do", wd = "Q7718", label = "skok na lyžích" },
ski_school = { group = "do", wd = "Q2292514", label = "lyžařská škola" },
skitour = { group = "do", wd = "Q1075998", label = "skialpinismus" },
sledding = { group = "do", wd = "Q3266340", label = "sáňkování" },
snorkeling = { group = "do", wd = "Q2471422", label = "šnorchlování" },
snow_park = { group = "do", wd = "Q3141488", label = "snowpark" },
soccer = { group = "do", wd = "Q2736", label = "fotbal" },
summer_toboggan = { group = "do", wd = "Q3266345", label = "bobová dráha" },
sports = { group = "do", wd = "Q349", label = "sport" },
sports_venue = { group = "do", wd = { "Q1076486", "Q121071543", "Q120169931" }, label = "sportoviště" },
squash = { group = "do", wd = { "Q121072153", "Q121085278" }, label = "squash" },
stadium = { group = "do", wd = { "Q483110", "Q37025296" }, label = "stadion" },
standup_paddle_boarding = { alias = "sup", group = "do", wd = "Q2035123", label = "paddleboard" },
surfing = { group = "do", wd = "Q159992", label = "surfing" },
swimming = { group = "do", wd = "Q6388", label = "plavání" },
swimming_pool = { group = "do", wd = "Q200023", label = "bazén" },
table_tennis = { group = "do", wd = "Q3930", label = "stolní tenis" },
tennis = { alias = "tennis_court", group = "do", wd = { "Q847", "Q741118" }, label = "tenis" },
toboggan = { group = "do", wd = "Q56611604", label = "tobogán" },
tour = { group = "do", label = "prohlídka" },
trail = { alias = "hiking_trail", group = "do", wd = { "Q2143825", "Q628179" }, label = "pěší stezka" },
trampoline_park = { group = "do", wd = "Q107338221", label = "trampolínový park" },
triathlon = { group = "do", wd = "Q10980", label = "triatlon" },
velodrome = { group = "do", wd = "Q830528", label = "velodrom", icon = "racetrack-cycling" },
wakeboarding = { group = "do", wd = "Q376040", label = "wakeboarding" },
water_skiing = { group = "do", wd = "Q472827", label = "vodní lyžování" },
water_sports = { group = "do", wd = "Q61065", label = "vodní sporty" },
winter_sports = { group = "do", wd = "Q204686", label = "zimní sporty" },
-- group types
["do"] = { group = "do", label = "aktivity" },
-- shopping
alcohol_shop = { group = "buy", wd = "Q2632011", label = "obchod s alkoholem" },
antiquarian = { group = "buy", wd = "Q582794", label = "antikvariát" },
atm = { group = "buy", wd = "Q81235", label = "bankomat" },
bakery = { group = "buy", wd = "Q274393", label = "pekárna" },
bank = { group = "buy", wd = "Q22687", label = "banka" },
beverages = { group = "buy", wd = "Q47504516", label = "prodejna nápojů" },
bike_shop = { group = "buy", wd = "Q26721034", label = "prodejna kol" },
book_seller = { alias = "book_shop", group = "buy", wd = "Q200764", label = "knihkupectví" },
boutique = { group = "buy", wd = "Q1068824", label = "butik" },
business_park = { group = "buy", wd = "Q338313", label = "obchodní park" },
butchery = { group = "buy", wd = "Q13164546", label = "řeznictví" },
carpet_shop = { group = "buy", wd = "Q47516346", label = "obchod s koberci" },
cheesery = { group = "buy", wd = "Q3088348", label = "sýrárna" },
chemist = { alias = "drugstore", group = "buy", wd = "Q1260046", label = "drogerie" },
collector_shop = { group = "buy", label = "sběratelský obchod" },
computer_shop = { alias = "computer", wd = "Q43182520", group = "buy", label = "obchod s počítači" },
cosmetics_shop = { group = "buy", wd = "Q47508166", label = "kosmetický obchod" },
crafts_shop = { group = "buy", wd = "Q101061294", label = "řemeslný obchod" },
currency_exchange = { group = "buy", wd = "Q2002539", label = "směnárna peněz" },
delicatessen = { group = "buy", wd = { "Q3231410", "Q48635101" }, label = "lahůdky" },
department_store = { group = "buy", wd = "Q216107", label = "obchodní dům" },
["duty-free_shop"] = { group = "buy", wd = "Q545609", label = "bezcelní obchod" },
fashion_store = { alias = "clothing_store", group = "buy", wd = "Q2090555", label = "obchod s oděvy", icon = "clothing-store" },
farm_shop = { group = "buy", wd = "Q1371823", label = "farmářský obchod " },
flea_market = { group = "buy", wd = "Q385870", label = "bleší trh" },
florist = { group = "buy", wd = "Q10431511", label = "květinářství" },
grocery = { group = "buy", wd = "Q1295201", label = "obchod s potravinami" },
hairdresser = { group = "buy", wd = "Q95856773", label = "kadeřník" },
industrial_park = { group = "buy", wd = "Q1662100", label = "průmyslový park" },
jewellery = { group = "buy", wd = "Q20708021", label = "šperkařství", icon = "jewelry-store" },
kiosk = { group = "buy", wd = "Q693369", label = "kiosek" },
livestock_market = { group = "buy", wd = "Q13592976", label = "Viehmarkt, Tiermarkt" },
mall = { group = "buy", wd = { "Q11315", "Q31374404" }, label = "obchodní centrum" },
market = { group = "buy", wd = "Q37654", label = "market" },
market_hall = { group = "buy", wd = "Q2080521", label = "tržnice" },
music_shop = { group = "buy", wd = "Q24284215", label = "obchod s muzikou" },
optician = { group = "buy", wd = "Q80144507", label = "optika" },
outdoor_retailer = { group = "buy", label = "venkovní prodejce" },
outlet = { group = "buy", wd = "Q76470", label = "outlet" },
pastry_shop = { alias = "confectionery", group = "buy", wd = "Q47505416", label = "cukrárna" },
photo_store = { group = "buy", wd = "Q57262241", label = "fotografický obchod" },
second_hand = { group = "buy", wd = "Q2925872", label = "second hand" },
shoe_shop = { group = "buy", wd = "Q7500021", label = "obuvnictví", icon = "shoe" },
shop = { group = "buy", wd = "Q213441", label = "obchod" },
shopping_arcade = { alias = "shopping_passage", group = "buy", wd = "Q97495053", label = "nákupní pasáž, nákupní centrum" },
shopping_district = { group = "buy", wd = "Q27095213", label = "nákupní čtvrť" },
shopping_street = { group = "buy", wd = "Q21000333", label = "nákupní ulice" },
souvenir_shop = { group = "buy", wd = "Q865693", label = "obchod se suvenýry" },
sports_shop = { group = "buy", wd = "Q47516567", label = "sportovní obchod" },
supermarket = { group = "buy", wd = "Q180846", label = "supermarket" },
ticket_shop = { alias = { "box_office", "ticket_sales", "ticket_office" }, group = "buy", wd = { "Q47519615", "Q877435", "Q100681367" }, label = "prodej vstupenek" },
vending_machine = { group = "buy", wd = "Q211584", label = "prodejní automat" },
watersports_shop = { group = "buy", label = "obchod s vodními sporty" },
-- group types
buy = { group = "buy", label = "nakupování" },
-- cuisine, eating
agriculture = { group = "eat", wd = "Q11451", label = "zemědělství" },
bistro = { group = "eat", wd = "Q866742", label = "bistro" },
brasserie = { group = "eat", wd = "Q1581509", label = "pivnice" },
cafe = { group = "eat", wd = "Q30022", label = "kavárna" },
cafeteria = { group = "eat", wd = "Q8463304", label = "kafeteria" },
canteen = { group = "eat", wd = "Q54957790", label = "jídelna" },
community_kitchen = { group = "eat", wd = "Q28854744", label = "komunitní kuchyně" },
fast_food = { group = "eat", wd = "Q1751429", label = "fast food" },
fish_restaurant = { group = "eat", wd = "Q125216847", label = "rybí restaurace" },
food = { group = "eat", wd = { "Q2095", "Q736427" }, label = "potraviny" },
grill_site = { group = "eat", wd = "Q1546788", label = "grilovací místo" },
ice_cream = { group = "eat", wd = "Q1311064", label = "zmrzlinárna" },
izakaya = { group = "eat", wd = "Q1193068", label = "izakaja" },
pizzeria = { group = "eat", wd = "Q1501212", label = "pizzerie", icon = "restaurant-pizza" },
restaurant = { group = "eat", wd = "Q11707", label = "restaurace" },
seafood_restaurant = { alias = "seafood", group = "eat", wd = "Q17102985", label = "restaurace s mořskými plody", icon = "restaurant-seafood" },
snack_bar = { group = "eat", wd = "Q1318768", label = "občerstvení" },
steak_house = { group = "eat", wd = "Q3109696", label = "steak house" },
street_food = { group = "eat", wd = "Q1316209", label = "pouliční jídlo" },
takeaway = { group = "eat", wd = { "Q154383", "Q506946" }, label = "jídlo s sebou" },
tavern = { group = "eat", wd = { "Q154250", "Q2387565" }, label = "taverna" },
teahouse = { group = "eat", wd = "Q1072166", label = "čajovna" },
wine_tavern = { group = "eat", wd = { "Q2556304", "Q1922416" }, label = "vinárna, vinotéka, vinný bar" },
-- group types
eat = { group = "eat", wd = { "Q27038993", "Q27077054" }, label = "jídlo" },
-- drinking, going out
bar = { group = "drink", wd = "Q187456", label = "bar" },
beer_garden = { group = "drink", wd = "Q857909", label = "pivní zahrada", icon = "beer" },
brewery = { group = "drink", wd = "Q131734", label = "pivovar" },
club = { group = "drink", label = "klub" },
discotheque = { group = "drink", wd = "Q1228895", label = "diskotéka" },
distillery = { group = "drink", wd = "Q1251750", label = "palírna" },
drinking_hall = { group = "drink", wd = "Q4101440", label = "vinárna" },
drinking_water = { group = "drink", wd = "Q7892", label = "pitná voda" },
nightclub = { group = "drink", wd = "Q622425", label = "noční klub" },
pub = { group = "drink", wd = { "Q19754932", "Q12341378" }, label = "krčma" },
vineyard = { group = "drink", wd = "Q22715", label = "vinice" },
wine_cellar = { group = "drink", wd = "Q22995", label = "vinný sklep" },
winery = { group = "drink", wd = "Q20181766", label = "vinařství" },
-- group types
drink = { group = "drink", wd = "Q5307737", label = "pití" },
-- accommodation
appartment = { group = "sleep", wd = "Q617839", label = "aparthotel" },
alpine_hut = { group = "sleep", wd = "Q182676", label = "horská chata" },
bed_and_bike = { group = "sleep", label = "postel a kolo" },
bnb = { group = "sleep", subtype = "y", wd = "Q367914", label = "postel a snídaně", icon = "lodging" },
boarding_house = { group = "sleep", subtype = "y", wd = { "Q1558858", "Q1065252" }, label = "penzion" },
boutique_hotel = { group = "sleep", wd = "Q259618", label = "Boutique hotel" },
campsite = { group = "sleep", wd = "Q832778", label = "kemp" },
caravan_site = { group = "sleep", label = "karavanový kemp" },
chalet = { group = "sleep", label = "chata" },
ecolodge = { group = "sleep", wd = "Q3577646", label = "ekolodge" },
group_accomodation = { group = "sleep", label = "skupinové ubytování" },
guest_house = { group = "sleep", wd = "Q2460422", label = "penzion" },
holiday_flat = { group = "sleep", wd = "Q336532", label = "prázdninový pronájem" },
hostel = { group = "sleep", wd = "Q654772", label = "hostel", icon = "lodging" },
hotel = { group = "sleep", wd = { "Q27686", "Q63099748" }, label = "hotel", icon = "lodging" },
hotel_garni = { group = "sleep", subtype = "y", wd = "Q1631103", label = "hotel garni", icon = "lodging" },
hut = { group = "sleep", wd = "Q5784097", label = "chata" },
lodge = { group = "sleep", wd = "Q56439882", label = "Lodge" },
motel = { group = "sleep", wd = "Q216212", label = "motel", icon = "lodging" },
resort = { group = "sleep", wd = "Q875157", label = "rezort" },
wilderness_hut = { group = "sleep", wd = "Q17087359", label = "chata v divočině" },
youth_hostel = { group = "sleep", wd = "Q1589077", label = "mládežnická ubytovna" },
-- group types
sleep = { group = "sleep", wd = "Q5056668", label = "ubytování" },
-- people
children = { group = "other", wd = "Q7569", label = "děti" },
-- health
animal_hospital = { group = "health", wd = "Q1706476", label = "veterinární klinika" },
defibrillator = { group = "health", wd = "Q1450682", label = "defibrilátor" },
dental_emergency_service = { group = "health", label = "zubařská pohotovost" },
dentist = { group = "health", wd = "Q2979300", label = "zubař" },
diving_chamber = { alias = "", group = "health", wd = "Q549046", label = "hyperbarická komora" },
doctor = { alias ="surgery", group = "health", wd = "Q718966", label = "doktor" },
emergency = { alias = "emergency_department", group = "health", wd = "Q1295316", label = "urgentní příjem pacientů" },
emergency_medical_services = { group = "health", wd = "Q860447", label = "zdravotnická záchranná služba" },
first_aid = { group = "health", wd = "Q133981", label = "první pomoc" },
health = { group = "health", wd = "Q12147", label = "zdraví" },
health_center = { alias = "clinic", group = "health", wd = { "Q569500", "Q1774898" }, label = "zdravotnické středisko" },
hospital = { group = "health", wd = { "Q16917", "Q180370" }, label = "nemocnice" },
kneipp_facility = { group = "health", wd = "Q66425029", label = "Kneippova lázeň" },
laboratory = { group = "health", wd = { "Q483242", "Q112203425" }, label = "laboratoř" },
["medical_on-call_service"] = { group = "health", label = "lékařská pohotovost" },
naturopathy = { group = "health", wd = "Q213403", label = "naturopatie" },
nursing_home = { group = "health", wd = "Q837142", label = "dům s pečovatelskou službou" },
pharmacy = { group = "health", wd = "Q13107184", label = "lékárna" },
pharmacy_on_standby_duty = { group = "health", label = "lékárna s pohotovostní službou" },
rehabilitation = { group = "health", wd = "Q2795791", label = "rehabilitace" },
rescue_center = { group = "health", label = "záchranná stanice" },
veterinary = { group = "health", wd = "Q15850915", label = "veterina" },
-- teaching & learning
academy = { group = "other", wd = "Q162633", label = "akademie" },
boarding_school = { group = "other", wd = { "Q269770", "Q125783335" }, label = "internátní škola" },
bookcase = { group = "other", wd = "Q215857", label = "knihovna" },
college = { group = "other", wd = "Q189004", label = "univerzita" },
community_center = { group = "other", wd = "Q77115", label = "komunitní centrum" },
cooking_class = { group = "other", label = "kurz vaření" },
education = { alias = "learn", group = "other", wd = "Q8434", label = "vzdělávání" },
folk_high_school = { group = "other", wd = "Q170087", label = "střední lidová škola" },
gymnasium = { group = "other", wd = "Q55043", label = "gymnázium" },
institute = { group = "other", wd = "Q1664720", label = "institut" },
kindergarten = { group = "other", wd = "Q126807", label = "mateřská škola" },
language_school = { group = "other", wd = "Q897403", label = "jazyková škola" },
library = { group = "other", wd = { "Q7075", "Q6503358", "Q2061246" }, label = "knihovna" },
nursery = { group = "other", wd = "Q20174673", label = "jesle" },
school = { group = "other", wd = "Q3914", label = "škola" },
university = { group = "other", wd = "Q3918", label = "univerzita" },
-- administration and uncategorized
administration = { group = "other", wd = { "Q327333", "Q5283295" }, label = "administrativa" },
association = { alias = "society", group = "other", wd = { "Q48204", "Q15911314" }, label = "Verein" },
business_development_agency = { group = "other", label = "společnost pro ekonomický rozvoj" },
checkpoint = { group = "other", wd = "Q88871664", label = "kontrolní bod" },
company = { group = "other", wd = "Q6881511", label = "společnost" },
consulate = { group = "other", wd = "Q7843791", label = "konzulát" },
coworking_space = { group = "other", wd = "Q97307779", label = "coworkingový prostor" },
customs = { group = "other", wd = "Q182290", label = "celní správa" },
cultural_organisation = { group = "other", wd = "Q29918292", label = "kulturní asociace" },
embassy = { group = "other", wd = "Q3917681", label = "ambasáda" },
emergency_call = { group = "other", wd = "Q694554", label = "tísňová linka", icon = "emergency-phone" },
fire_brigade = { group = "other", wd = "Q6498663", label = "hasičský sbor", icon = "fire-station" },
government = { group = "other", wd = "Q16831714", label = "vládní budova" },
guide = { group = "other", wd = "Q14290559", label = "průvodce" },
hotline = { group = "other", wd = "Q1482145", label = "helpline" },
internet_cafe = { group = "other", wd = "Q272399", label = "internetová kavárna" },
laundry = { group = "other", wd = "Q12893467", label = "prádelna" },
list = { group = "other", wd = { "Q12139612", "Q13406463" }, label = "seznam" },
lost_and_found = { group = "other", wd = "Q15983979", label = "ztráty a nálezy" },
military = { group = "other", wd = "Q8473", label = "armáda" },
mobile_telephony = { group = "other", wd = "Q47516435", label = "prodejna mobilních telefonů" },
newspaper = { group = "other", wd = "Q11032", label = "noviny" },
office = { group = "other", wd = "Q182060", label = "kancelář" },
organisation = { group = "other", wd = "Q43229", label = "organizace" },
passport_office = { group = "other", label = "pasový úřad" },
payphone = { group = "other", wd = "Q900977", label = "Münzfernsprecher", icon = "telephone" },
phone = { group = "other", wd = "Q11035", label = "telefon", icon = "telephone" },
police = { group = "other", wd = "Q35535", label = "policie" },
post = { group = "other", wd = "Q35054", label = "pošta" },
register_office = { alias = { "standesamt", "registry_office" }, group = "other", wd = { "Q745221", "Q29127138", "Q206946" }, label = "matrika" },
relief_organisation = { group = "other", wd = "Q708676", label = "charitativní organizace" },
roadside_assistance = { group = "other", wd = "Q337810", label = "asistenční služby" },
shelter = { group = "other", wd = { "Q7493941", "Q989946" }, label = "přístřešek" },
toilet = { group = "other", wd = "Q7857", label = "záchody" },
tour_operator = { group = "other", wd = "Q133744", label = "cestovní kancelář" },
tourism_authority = { group = "other", label = "úřad pro cestovní ruch" },
tourist_information = { alias = "visitor_center", group = "other", wd = { "Q1587716", "Q18411786" }, label = "turistické informace", icon = "information" },
travel_agency = { group = "other", wd = "Q217107", label = "cestovní kancelář" },
weblink = { group = "other", wd = "Q102014", label = "hyperlink" },
wlan = { group = "other", wd = "Q334765", label = "WiFi hotspot" },
work = { group = "other", wd = "Q6958747", label = "práce" },
-- group types
other = { group = "other", label = "jiné" },
listing = { group = "other", label = "výpis" },
-- populated areas
city = { group = "populated", wd = "Q515", label = "město" },
fraction = { group = "populated", label = "část obce" },
holiday_resort = { group = "populated", wd = "Q3077815", label = "rekreační středisko" },
municipality = { group = "populated", wd = { "Q15284", "Q17376095", "Q562061" }, label = "obec" },
quarter = { alias = "neighborhood", group = "populated", wd = { "Q2983893", "Q253019" }, label = "čtvrť města" },
refugee_camp = { group = "populated", wd = "Q622499", label = "uprchlický tábor" },
settlement = { group = "populated", wd = "Q486972", label = "sídelní útvar" },
town = { group = "populated", wd = "Q3957", label = "město" },
village = { group = "populated", wd = "Q532", label = "vesnice" },
-- views
observation_tower = { group = "view", wd = "Q1440300", label = "rozhledna" },
scenic_view = { group = "view", label = "výhled", icon = "attraction" },
viewpoint = { group = "view", wd = "Q6017969", label = "vyhlídka" },
-- areas
adm1st = { group = "area", wd = "Q10864048", label = "správní jednotka 1. úrovně" },
adm2nd = { group = "area", wd = "Q13220204", label = "správní jednotka 2. úrovně" },
adm3rd = { group = "area", wd = "Q13221722", label = "správní jednotka 3. úrovně" },
country = { group = "area", wd = "Q6256", label = "stát" },
district = { group = "area", wd = "Q149621", label = "distrikt" },
region = { group = "area", wd = "Q82794", label = "region" },
surroundings = { group = "area", wd = "Q2920644", label = "okolí" },
vicinity = { group = "area", wd = "Q16968816", label = "sousedství" },
-- error
error = { group = "error", wd = "Q29485", label = "chyba" }
-- do not remove the following line
-- ##end
}
}
hgpso0wkwt7zlt4iywwm4491wth3wiu
Modul:CountryData2
828
1346
22100
17245
2026-05-20T11:39:43Z
LiMr
96
aktualizace na novější verzi
22100
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:CountryData&oldid=1775619)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:CountryData&oldid=1775619)
-- pravděpodobně duplicita s modul:CountyData, který však nefunguje pro zprovoznění šablony:Bod
-- CountryData module
-- module variable and administration
local cm = {
moduleInterface = {
suite = 'CountryData',
serial = '2026-05-17',
item = 65431301
}
}
-- module import
-- require( 'strict' )
local cg = mw.loadData( 'Module:CountryData/Geography' )
local cu = mw.loadData( 'Module:CountryData/Currencies' ) -- additional currency symbols
local wu = require( 'Module:Wikidata utilities' )
local properties = {
continent = 'P30',
country = 'P17',
countryCode = 'P474',
currency = 'P38',
iso3166_1 = 'P297',
iso3166_2 = 'P300',
iso639 = 'P218',
locatedIn = 'P131',
officialLanguage = 'P37',
partOf = 'P361'
}
local exceptions = {
Q145 = '^+44' -- UK
}
local currencyformatters = {}
local function isSet( arg )
return arg and arg ~= ''
end
local function _getCountry( tab, id )
local item = tab[ id ]
if item and item.id then
item = tab[ item.id ]
end
if not item then
return nil
end
local c = {}
for k, v in pairs( item ) do -- item is read only
c[ k ] = v
end
if c and not c.id then
c.id = id
end
return c
end
local function getCountry( id )
return _getCountry( cg.countries, id )
end
local function getAdminEntity( id )
return _getCountry( cg.adminEntities, id )
end
local function getCountryTable( id )
return getAdminEntity( id ) or getCountry( id ) -- nil or table
end
local function checkTable( id )
if id == nil or id == '' then
return nil
end
return getCountryTable( id ) -- nil or table
end
local function checkTableFromEntity( anEntity )
if not anEntity then
return nil
end
local id, t
for i, prop in ipairs( { properties.locatedIn, properties.country, properties.partOf } ) do
for j, val in ipairs( wu.getValues( anEntity, prop ) ) do
id = val.id
t = checkTable( id )
if t then
return t
end
end
end
return nil
end
function cm.getDataFromTables( vcEntity, wikidata )
-- article id
local articleId = mw.wikibase.getEntityIdForCurrentPage()
-- article lemma
local t = cg.articles[ articleId ]
if t then
return getCountryTable( t )
end
-- if country or admin unit itself
if wikidata then
t = checkTable( wikidata )
if t then
return t
end
end
if not articleId and not vcEntity then
return nil
end
-- vCard entity
if vcEntity then
t = checkTableFromEntity( vcEntity )
if t then
return t
end
end
-- article entity
if articleId then
t = checkTable( articleId ) or checkTableFromEntity( articleId )
if t then
return t
end
end
-- not found in tables, get it now all from Wikidata
return nil
end
-- getting data for vCard
local function _getCountryDataByIso( iso_3166 )
for i, tab in ipairs( { 'countries', 'adminEntities' } ) do
for id, c in pairs( cg[ tab ] ) do
if c.iso_3166 and c.iso_3166 == iso_3166 then
local country = {}
for k, v in pairs( c ) do
country[ k ] = v
end
country.id = id
return country
end
end
end
return nil
end
local function _getCountryData( vcEntity, iso_3166, wikidata )
local t = cm.getDataFromTables( vcEntity, wikidata )
if t then
return t
end
-- use template country parameter iso_3166
if isSet( iso_3166 ) and iso_3166:match( '%a%a' ) then
t = _getCountryDataByIso( iso_3166:upper() )
if t then
return t
end
end
-- not found in CountryData table
-- return default country dataset if not in main namespace
if mw.title.getCurrentTitle().namespace ~= 0 and cg.articles[ '_default' ] then
return getCountry( cg.articles[ '_default' ] )
end
-- getting data from country entity
local country = {
id = wu.getId( vcEntity, properties.country ),
iso_3166 = '',
cont = '',
cc = '',
lang = '',
currency = '',
country = '',
show = '',
unknownCountry = isSet( iso_3166 )
}
local coEntity = country.id ~= '' and mw.wikibase.getEntity( country.id )
if coEntity then
country.fromWD = true
country.iso_3166 = wu.getValue( coEntity, properties.iso3166_1 ):upper()
country.cont = cg.continents[ wu.getId( coEntity, properties.continent ) ] or ''
country.cc = wu.getValue( coEntity, properties.countryCode ) -- country calling code
t = wu.getId( coEntity, properties.officialLanguage )
if t ~= '' then
country.lang = wu.getValue( t, properties.iso639 ):lower()
end
country.currency = wu.getId( coEntity, properties.currency )
end
return country
end
-- getting county data from country calling code
function cm.getCountryFromPhones( tab )
local country = {
id = '',
cont = '',
iso_3166 = '',
cc = '',
lang = '',
currency = '',
country = '',
show = ''
}
-- prepare phone numbers
for i = #tab, 1, -1 do
tab[ i ] = tab[ i ]:gsub( '^00', '+' )
:gsub( '^%+%+', '+' )
:gsub( '[^%+0-9A-Z]', '' )
if not tab[ i ]:match( '^%+%d%d%d%d' ) then
table.remove( tab, i )
end
end
if #tab == 0 then
return country
end
-- exceptions fur multiple used country calling codes
for i = 1, #tab, 1 do
for wdId, pattern in pairs( exceptions ) do
if tab[ i ]:match( pattern ) then
return getCountry( wdId )
end
end
end
-- make country calling codes table
local ccodes = {}
for i, cgTab in ipairs( { cg.countries, cg.adminEntities } ) do
for key, val in pairs( cgTab ) do
if val.cc and val.cc ~= '' then
ccodes[ val.cc:gsub( '-', '' ) ] = key
end
end
end
-- look for country code in phone numbers
local q
for i, phone in ipairs( tab ) do
phone = phone:sub( 1, 5 )
repeat
q = ccodes[ phone ]
phone = phone:sub( 1, -2 )
until phone == '' or q
if q then
country = getCountryTable( q )
break
end
end
return country
end
function cm.getCountryFromWeb( tab )
local at, count, domain, country, toplevel
for i, address in ipairs( tab ) do
address = mw.text.trim( address )
domain = ''
address, count = address:gsub( '^https?://', '' )
if count == 0 then
address, count = address:gsub( '^//', '' )
end
if count == 1 then -- it is maybe a web domain
domain = address
at = domain:find( '/' )
if at then
domain = domain:sub( 1, at - 1 )
end
else -- is maybe an email address
address, count = address:gsub( '@', '@' )
if count == 1 then
domain = address:gsub( '^.*@', '' )
end
end
if domain ~= '' then
-- get two letters country TLD
toplevel, count = domain:gsub( '^.*%.(%a%a)$', '%1' )
if count == 1 then
country = _getCountryDataByIso( toplevel:upper() )
if country then
return country
end
end
end
end
return {
id = '',
cont = '',
iso_3166 = '',
cc = '',
lang = '',
currency = '',
country = '',
show = ''
}
end
-- adding language-dependent parameters
function cm.setLanguageParams( langCode, wikiLang, country )
if langCode ~= '' then
country.lang = langCode
country.unknownLanguage = true
country.langName = mw.language.fetchLanguageName( langCode, wikiLang ) or ''
if country.langName ~= '' then
country.unknownLanguage = false
country.isRTL = mw.getLanguage( langCode ):isRTL()
end
end
end
-- main getCountryData function
-- entity: Wikidata entity or Wikidata id
-- phones: table of phone numbers with country calling code
-- iso_3166: is given by country parameter of listing/marker templates
-- wikidata: Wikidata id
-- web: table of urls and/or mail addressess
function cm.getCountryData( entity, phones, iso_3166, wikidata, web )
local country = _getCountryData( entity, iso_3166, wikidata )
if country.id == '' and web and #web > 0 then
country = cm.getCountryFromWeb( web )
end
if country.id == '' and phones and #phones > 0 then
country = cm.getCountryFromPhones( phones )
end
local c = cu.currencies[ country.currency ]
country.currency = c and c.iso or ''
country.addCurrency = country.currency
if c and c.add and c.add ~= '' then
country.addCurrency = country.addCurrency
.. ( country.addCurrency ~= '' and ', ' or '' ) .. c.add
end
country.unknownLanguage = true
cm.setLanguageParams( country.lang, mw.getContentLanguage():getCode(), country )
return country
end
-- getting first-order administrative-territorial entity code
function cm.getAdm1st( countryId )
local entityId = mw.wikibase.getEntityIdForCurrentPage()
if not entityId or not countryId or countryId == '' then
return nil
end
local i = 0
local iso3166_2
while entityId ~= '' and not getAdminEntity( entityId )
and not getCountry( entityId ) and i < 5 do
iso3166_2 = wu.getValue( entityId, properties.iso3166_2 )
if iso3166_2 ~= '' then
return iso3166_2
end
-- getting next administrative territorial entity
entityId = wu.getId( entityId, properties.locatedIn )
i = i + 1
end
end
function cm.getCategories( formatStr )
return wu.getCategories( formatStr )
end
-- getting data for LinkPhone
function cm.getCountryCode()
local t = cm.getDataFromTables( nil )
if t then
return t.cc, t.phoneDigits or 2
else
return '', 2
end
end
-- returns a single data set from Module:CountryData/Currencies
function cm.getCurrency( key )
return cu.currencies[ key ]
end
function cm.getCurrencyFormatter( qId )
qId = qId:upper()
if currencyformatters[ qId ] then
return currencyformatters[ qId ]
elseif qId:match( '^%a%a%a$' ) then -- ISO code
qId = cu.isoToQid[ qId ]
end
local currency = cu.currencies[ qId ]
if currency then
local formatter, unit
if currency.f then
formatter = currency.f
else
formatter = cu.currencies.default or '%s unit'
unit = currency.add and currency.add:gsub( ',.*', '' )
or currency.iso
formatter = formatter:gsub( 'unit', unit )
end
currencyformatters[ qId ] = formatter
currencyformatters[ currency.iso ] = formatter
return formatter
end
return nil
end
return cm
dacem5x9g12sewvrfo4had008pydpon
Modul:CountryData/Geography
828
1347
22101
18765
2026-05-20T11:43:21Z
LiMr
96
aktualizace na novější verzi
22101
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:CountryData/Geography&oldid=1695115)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:CountryData/Geography&oldid=1695115)
-- Preventing expensive Wikidata calls
return {
-- administration
moduleInterface = {
suite = 'CountryData',
sub = 'Geography',
serial = '2025-06-22',
item = 65433242
},
-- wiki-specific exceptions for articles with many vCard calls or topic articles
-- to prevent data retrieval on the base of article's Wikidata qualifier id
articles = {
_default = "Q183", -- DE
Q24879 = "Q183", -- Bremen
Q2814 = "Q183", -- Halle (Saale)
Q452401 = "Q183", -- Deutsche Fachwerkstraße
Q1741 = "Q40", -- Wien -> AT
Q19386 = "Q25227", -- ABC-Inseln -> AN
Q5604 = "Q30", -- Arizona/Frank Lloyd Wright -> US
Q15112104= "Q79", -- Hamada -> EG
Q214077 = "Q801", -- Via Dolorosa -> IL
-- historic regions
Q564882 = "Q36", -- Dobriner Land -> PL
Q661110 = "Q36", -- Glatzer Ländchen
Q178813 = "Q38", -- Herculaneum -> IT
Q283680 = "Q43", -- Karkemisch -> TR
Q672344 = "Q36", -- Kulmer Land
Q22880 = "Q183", -- Kurpfalz
Q1801987 = "Q36", -- Lande Lauenburg und Bütow
Q158445 = "Q183", -- Mecklenburg-Schwerin
Q819411 = "Q36", -- Neumark -> PL
Q767089 = "Q23681", -- Salamis -> Nordzypern
Q1294629 = "Q407199", -- Samaria -> PS
Q151005 = "Q183", -- Völkerschlacht
Q159626 = "Q183", -- Württemberg
},
-- continent list
continents = {
Q15 = "af",
Q51 = "an",
Q48 = "as",
Q3960 = "au",
Q46 = "eu",
Q49 = "na",
Q538 = "oc",
Q18 = "sa"
},
-- countries list sorted by ISO 3166 code
-- add contains additional show parameters link all, inline
-- de-wiki: exceptions: at, ch, de, it: show = "inline"
countries = {
Q244165 = { cont = "as", iso_3166 = "", cc = "+37447", lang = "hy", currency = "Q130498", country = "Republika Arcach" }, -- Náhorní Karabach
Q228 = { cont = "eu", iso_3166 = "AD", cc = "+376", lang = "ca", currency = "Q4916", country = "Andorra" },
Q878 = { cont = "as", iso_3166 = "AE", cc = "+971", lang = "ar", currency = "Q200294", country = "Spojené arabské emiráty" },
Q889 = { cont = "as", iso_3166 = "AF", cc = "+93", lang = "ps", currency = "Q199471", country = "Afghánistán" },
Q781 = { cont = "na", iso_3166 = "AG", cc = "+1-268", lang = "en", currency = "Q26365", country = "Antigua a Barbuda" },
Q222 = { cont = "eu", iso_3166 = "AL", cc = "+355", lang = "sq", currency = "Q125999", country = "Albánie" },
Q399 = { cont = "as", iso_3166 = "AM", cc = "+374", lang = "hy", currency = "Q130498", country = "Arménie" },
Q916 = { cont = "af", iso_3166 = "AO", cc = "+244", lang = "pt", currency = "Q200337", country = "Angola" },
Q1555938 = { cont = "an", iso_3166 = "AQ", cc = "", lang = "en", currency = "", country = "Antarktida" },
Q21590062= { id = "Q1555938" },
Q414 = { cont = "sa", iso_3166 = "AR", cc = "+54", lang = "es", currency = "Q199578", country = "Argentina" },
Q40 = { cont = "eu", iso_3166 = "AT", cc = "+43", lang = "de", currency = "Q4916", show = "inline", country = "Rakousko" },
Q408 = { cont = "au", iso_3166 = "AU", cc = "+61", lang = "en", currency = "Q259502", country = "Austrálie" },
Q227 = { cont = "as", iso_3166 = "AZ", cc = "+994", lang = "az", currency = "Q483725", country = "Ázerbájdžán" },
Q225 = { cont = "eu", iso_3166 = "BA", cc = "+387", lang = "bs", currency = "Q179620", country = "Bosna a Hercegovina" },
Q244 = { cont = "na", iso_3166 = "BB", cc = "+1-246", lang = "en", currency = "Q194351", country = "Barbados" },
Q902 = { cont = "as", iso_3166 = "BD", cc = "+880", lang = "bn", currency = "Q194453", country = "Bangladéš" },
Q31 = { cont = "eu", iso_3166 = "BE", cc = "+32", lang = "nl", currency = "Q4916", country = "Belgie" },
Q29999 = { id = "Q31" },
Q965 = { cont = "af", iso_3166 = "BF", cc = "+226", lang = "fr", currency = "Q861690", country = "Burkina Faso" },
Q219 = { cont = "eu", iso_3166 = "BG", cc = "+359", lang = "bg", currency = "Q172540", country = "Bulharsko" },
Q398 = { cont = "as", iso_3166 = "BH", cc = "+973", lang = "ar", currency = "Q201871", country = "Bahrajn" },
Q967 = { cont = "af", iso_3166 = "BI", cc = "+257", lang = "fr", currency = "Q238007", country = "Burundi" },
Q962 = { cont = "af", iso_3166 = "BJ", cc = "+229", lang = "fr", currency = "Q861690", country = "Benin" },
Q921 = { cont = "as", iso_3166 = "BN", cc = "+673", lang = "ms", currency = "Q206319", country = "Brunej" },
Q750 = { cont = "sa", iso_3166 = "BO", cc = "+591", lang = "es", currency = "Q200737", country = "Bolívie" },
Q155 = { cont = "sa", iso_3166 = "BR", cc = "+55", lang = "pt", currency = "Q173117", country = "Brazílie" },
Q778 = { cont = "na", iso_3166 = "BS", cc = "+1-242", lang = "en", currency = "Q194339", country = "Bahamy" },
Q917 = { cont = "as", iso_3166 = "BT", cc = "+975", lang = "dz", currency = "Q201799", country = "Bhútán" },
Q963 = { cont = "af", iso_3166 = "BW", cc = "+267", lang = "en", currency = "Q186794", country = "Botswana" },
Q184 = { cont = "eu", iso_3166 = "BY", cc = "+375", lang = "be", currency = "Q160680", country = "Bělorusko" },
Q242 = { cont = "na", iso_3166 = "BZ", cc = "+501", lang = "en", currency = "Q275112", country = "Belize" },
Q16 = { cont = "na", iso_3166 = "CA", cc = "+1", lang = "en", currency = "Q1104069", country = "Kanada" },
Q974 = { cont = "af", iso_3166 = "CD", cc = "+243", lang = "fr", currency = "Q4734", country = "Konžská demokratická republika" },
Q929 = { cont = "af", iso_3166 = "CF", cc = "+236", lang = "fr", currency = "Q847739", country = "Středoafrická republika" },
Q971 = { cont = "af", iso_3166 = "CG", cc = "+242", lang = "fr", currency = "Q847739", country = "Kongo" },
Q39 = { cont = "eu", iso_3166 = "CH", cc = "+41", lang = "de", currency = "Q25344", show = "inline", country = "Švýcarsko" },
Q1008 = { cont = "af", iso_3166 = "CI", cc = "+225", lang = "fr", currency = "Q861690", country = "Pobřeží slonoviny" },
Q26988 = { cont = "oc", iso_3166 = "CK", cc = "+682", lang = "en", currency = "Q1472704", country = "Cookovy ostrovy" },
Q298 = { cont = "sa", iso_3166 = "CL", cc = "+56", lang = "es", currency = "Q200050", country = "Chile" },
Q1009 = { cont = "af", iso_3166 = "CM", cc = "+237", lang = "fr", currency = "Q847739", country = "Kamerun" },
Q148 = { cont = "as", iso_3166 = "CN", cc = "+86", lang = "zh", currency = "Q39099", country = "Čína" },
Q739 = { cont = "sa", iso_3166 = "CO", cc = "+57", lang = "es", currency = "Q244819", country = "Kolumbie" },
Q800 = { cont = "na", iso_3166 = "CR", cc = "+506", lang = "es", currency = "Q242915", country = "Kostarika" },
Q241 = { cont = "na", iso_3166 = "CU", cc = "+53", lang = "es", currency = "Q201505", country = "Kuba" },
Q1011 = { cont = "af", iso_3166 = "CV", cc = "+238", lang = "pt", currency = "Q4591", country = "Kapverdy" },
Q229 = { cont = "eu", iso_3166 = "CY", cc = "+357", lang = "el", currency = "Q4916", country = "Kypr" },
Q213 = { cont = "eu", iso_3166 = "CZ", cc = "+420", lang = "cs", currency = "Q131016", country = "Česko" },
Q183 = { cont = "eu", iso_3166 = "DE", cc = "+49", lang = "de", currency = "Q4916", show = "inline", country = "Německo" },
Q977 = { cont = "af", iso_3166 = "DJ", cc = "+253", lang = "fr", currency = "Q4594", country = "Džibutsko" },
Q35 = { cont = "eu", iso_3166 = "DK", cc = "+45", lang = "da", currency = "Q25417", country = "Dánsko" },
Q756617 = { id = "Q35" },
Q784 = { cont = "na", iso_3166 = "DM", cc = "+1-767", lang = "en", currency = "Q26365", country = "Dominika" },
Q786 = { cont = "na", iso_3166 = "DO", cc = "+1-809", lang = "es", currency = "Q242922", country = "Dominikánská republika" },
Q262 = { cont = "af", iso_3166 = "DZ", cc = "+213", lang = "fr", currency = "Q199674", country = "Alžírsko" },
Q736 = { cont = "sa", iso_3166 = "EC", cc = "+593", lang = "es", currency = "Q4917", country = "Ekvádor" },
Q191 = { cont = "eu", iso_3166 = "EE", cc = "+372", lang = "et", currency = "Q4916", country = "Estonsko" },
Q79 = { cont = "af", iso_3166 = "EG", cc = "+20", lang = "ar", currency = "Q199462", phoneDigits = 4, show = "all", country = "Egypt" },
Q6250 = { cont = "af", iso_3166 = "EH", cc = "+212", lang = "ar", currency = "Q200192", country = "Západní Sahara" },
Q40362 = { id = "Q6250" },
Q986 = { cont = "af", iso_3166 = "ER", cc = "+291", lang = "ti", currency = "Q171503", country = "Eritrea" },
Q29 = { cont = "eu", iso_3166 = "ES", cc = "+34", lang = "es", currency = "Q4916", country = "Španělsko" },
Q115 = { cont = "af", iso_3166 = "ET", cc = "+251", lang = "am", currency = "Q206243", show = "all", country = "Etiopie" },
Q33 = { cont = "eu", iso_3166 = "FI", cc = "+358", lang = "fi", currency = "Q4916", country = "Finsko" },
Q712 = { cont = "oc", iso_3166 = "FJ", cc = "+679", lang = "fj", currency = "Q4592", country = "Fidži" },
Q702 = { cont = "oc", iso_3166 = "FM", cc = "+691", lang = "en", currency = "Q4917", country = "Mikronésie" },
Q4628 = { cont = "eu", iso_3166 = "FO", cc = "+298", lang = "da", currency = "Q191068", country = "Faerské ostrovy" },
Q142 = { cont = "eu", iso_3166 = "FR", cc = "+33", lang = "fr", currency = "Q4916", country = "Francie" },
Q1000 = { cont = "af", iso_3166 = "GA", cc = "+241", lang = "fr", currency = "Q847739", country = "Gabon" },
Q145 = { cont = "eu", iso_3166 = "GB", cc = "+44", lang = "en-gb", currency = "Q25224", country = "Velká Británie" },
Q124653007 = { id = "Q145" },
Q769 = { cont = "na", iso_3166 = "GD", cc = "+1-473", lang = "en", currency = "Q26365", country = "Grenada" },
Q230 = { cont = "as", iso_3166 = "GE", cc = "+995", lang = "ka", currency = "Q4608", country = "Gruzie" },
Q117 = { cont = "af", iso_3166 = "GH", cc = "+233", lang = "en", currency = "Q183530", country = "Ghana" },
Q1005 = { cont = "af", iso_3166 = "GM", cc = "+220", lang = "en", currency = "Q202885", country = "Gambie" },
Q1006 = { cont = "af", iso_3166 = "GN", cc = "+224", lang = "fr", currency = "Q213311", country = "Guinea" },
Q983 = { cont = "af", iso_3166 = "GQ", cc = "+240", lang = "es", currency = "Q847739", country = "Rovníková Guinea" },
Q41 = { cont = "eu", iso_3166 = "GR", cc = "+30", lang = "el", currency = "Q4916", country = "Řecko" },
Q774 = { cont = "na", iso_3166 = "GT", cc = "+502", lang = "es", currency = "Q207396", country = "Guatemala" },
Q1007 = { cont = "af", iso_3166 = "GW", cc = "+245", lang = "pt", currency = "Q861690", country = "Guinea-Bissau" },
Q734 = { cont = "sa", iso_3166 = "GY", cc = "+592", lang = "en", currency = "Q213005", country = "Guyana" },
Q783 = { cont = "na", iso_3166 = "HN", cc = "+504", lang = "es", currency = "Q4719", phoneDigits = 4, country = "Honduras" },
Q224 = { cont = "eu", iso_3166 = "HR", cc = "+385", lang = "hr", currency = "Q4916", country = "Chorvatsko" },
Q790 = { cont = "na", iso_3166 = "HT", cc = "+509", lang = "fr", currency = "Q203955", country = "Haiti" },
Q28 = { cont = "eu", iso_3166 = "HU", cc = "+36", lang = "hu", currency = "Q47190", country = "Maďarsko" },
Q252 = { cont = "as", iso_3166 = "ID", cc = "+62", lang = "id", currency = "Q41588", country = "Indonésie" },
Q27 = { cont = "eu", iso_3166 = "IE", cc = "+353", lang = "ga", currency = "Q4916", country = "Irsko" },
Q801 = { cont = "as", iso_3166 = "IL", cc = "+972", lang = "he", currency = "Q131309", country = "Izrael" },
Q575187 = { id = "Q801" },
Q668 = { cont = "as", iso_3166 = "IN", cc = "+91", lang = "hi", currency = "Q80524", country = "Indie" },
Q796 = { cont = "as", iso_3166 = "IQ", cc = "+964", lang = "ar", currency = "Q193094", country = "Irák" },
Q794 = { cont = "as", iso_3166 = "IR", cc = "+98", lang = "fa", currency = "Q188608", country = "Írán" },
Q189 = { cont = "eu", iso_3166 = "IS", cc = "+354", lang = "is", currency = "Q131473", country = "Island" },
Q38 = { cont = "eu", iso_3166 = "IT", cc = "+39", lang = "it", currency = "Q4916", show = "inline", country = "Itálie" },
Q766 = { cont = "na", iso_3166 = "JM", cc = "+1-876", lang = "en", currency = "Q209792", country = "Jamajka" },
Q810 = { cont = "as", iso_3166 = "JO", cc = "+962", lang = "ar", currency = "Q203722", country = "Jordánsko" },
Q17 = { cont = "as", iso_3166 = "JP", cc = "+81", lang = "ja", currency = "Q8146", country = "Japonsko" },
Q114 = { cont = "af", iso_3166 = "KE", cc = "+254", lang = "sw", currency = "Q202882", country = "Keňa" },
Q813 = { cont = "as", iso_3166 = "KG", cc = "+996", lang = "ky", currency = "Q35881", country = "Kyrgyzstán" },
Q424 = { cont = "as", iso_3166 = "KH", cc = "+855", lang = "km", currency = "Q204737", country = "Kambodža" },
Q710 = { cont = "oc", iso_3166 = "KI", cc = "+686", lang = "en", currency = "Q1049963", country = "Kiribati" },
Q970 = { cont = "af", iso_3166 = "KM", cc = "+269", lang = "ar", currency = "Q267264", country = "Komory" },
Q763 = { cont = "na", iso_3166 = "KN", cc = "+1-869", lang = "en", currency = "Q26365", country = "Svatý Kryštof a Nevis" },
Q423 = { cont = "as", iso_3166 = "KP", cc = "+850", lang = "ko", currency = "Q106720", country = "Severní Korea" },
Q884 = { cont = "as", iso_3166 = "KR", cc = "+82", lang = "ko", currency = "Q202040", country = "Jižní Korea" },
Q817 = { cont = "as", iso_3166 = "KW", cc = "+965", lang = "ar", currency = "Q193098", country = "Kuvajt" },
Q232 = { cont = "as", iso_3166 = "KZ", cc = "+7", lang = "kk", currency = "Q173751", country = "Kazachstán" },
Q819 = { cont = "as", iso_3166 = "LA", cc = "+856", lang = "lo", currency = "Q200055", country = "Laos" },
Q822 = { cont = "as", iso_3166 = "LB", cc = "+961", lang = "ar", currency = "Q201880", country = "Libanon" },
Q760 = { cont = "na", iso_3166 = "LC", cc = "+1-758", lang = "en", currency = "Q26365", country = "Svatá Lucie" },
Q347 = { cont = "eu", iso_3166 = "LI", cc = "+423", lang = "de", currency = "Q25344", country = "Lichtenštejnsko" },
Q854 = { cont = "as", iso_3166 = "LK", cc = "+94", lang = "si", currency = "Q4596", country = "Srí Lanka" },
Q1014 = { cont = "af", iso_3166 = "LR", cc = "+231", lang = "en", currency = "Q242988", country = "Libérie" },
Q1013 = { cont = "af", iso_3166 = "LS", cc = "+266", lang = "en", currency = "Q208039", country = "Lesotho" },
Q37 = { cont = "eu", iso_3166 = "LT", cc = "+370", lang = "lt", currency = "Q4916", country = "Litva" },
Q32 = { cont = "eu", iso_3166 = "LU", cc = "+352", lang = "lb", currency = "Q4916", country = "Lucembursko" },
Q211 = { cont = "eu", iso_3166 = "LV", cc = "+371", lang = "lv", currency = "Q4916", country = "Lotyšsko" },
Q1016 = { cont = "af", iso_3166 = "LY", cc = "+218", lang = "ar", currency = "Q190699", country = "Libye" },
Q1028 = { cont = "af", iso_3166 = "MA", cc = "+212", lang = "ar", currency = "Q200192", country = "Maroko" },
Q235 = { cont = "eu", iso_3166 = "MC", cc = "+377", lang = "fr", currency = "Q4916", country = "Monako" },
Q217 = { cont = "eu", iso_3166 = "MD", cc = "+373", lang = "mo", currency = "Q181129", country = "Moldavsko" },
Q236 = { cont = "eu", iso_3166 = "ME", cc = "+382", lang = "sr-me", currency = "Q4916", country = "Černá Hora" },
Q1019 = { cont = "af", iso_3166 = "MG", cc = "+261", lang = "mg", currency = "Q4584", country = "Madagaskar" },
Q709 = { cont = "oc", iso_3166 = "MH", cc = "+692", lang = "en", currency = "Q4917", country = "Marshallovy ostrovy" },
Q221 = { cont = "eu", iso_3166 = "MK", cc = "+389", lang = "mk", currency = "Q177875", country = "Severní Makedonie" },
Q912 = { cont = "af", iso_3166 = "ML", cc = "+223", lang = "fr", currency = "Q861690", country = "Mali" },
Q836 = { cont = "as", iso_3166 = "MM", cc = "+95", lang = "my", currency = "Q201875", country = "Myanmar" },
Q711 = { cont = "as", iso_3166 = "MN", cc = "+976", lang = "mn", currency = "Q183435", country = "Mongolsko" },
Q16644 = { cont = "oc", iso_3166 = "MP", cc ="+1-670", lang = "en", currency = "Q4917", country = "Severní Mariany" },
Q1025 = { cont = "af", iso_3166 = "MR", cc = "+222", lang = "ar", currency = "Q207024", country = "Mauritánie" },
Q233 = { cont = "eu", iso_3166 = "MT", cc = "+356", lang = "mt", currency = "Q4916", country = "Malta" },
Q1027 = { cont = "af", iso_3166 = "MU", cc = "+230", lang = "en", currency = "Q212967", country = "Mauricius" },
Q826 = { cont = "as", iso_3166 = "MV", cc = "+960", lang = "dv", currency = "Q206600", country = "Maledivy" },
Q1020 = { cont = "af", iso_3166 = "MW", cc = "+265", lang = "en", currency = "Q211694", country = "Malawi" },
Q96 = { cont = "na", iso_3166 = "MX", cc = "+52", lang = "es", currency = "Q4730", country = "Mexiko" },
Q833 = { cont = "as", iso_3166 = "MY", cc = "+60", lang = "ms", currency = "Q163712", country = "Malajsie" },
Q1029 = { cont = "af", iso_3166 = "MZ", cc = "+222", lang = "pt", currency = "Q200753", country = "Mosambik" },
Q1030 = { cont = "af", iso_3166 = "NA", cc = "+264", lang = "en", currency = "Q202462", country = "Namibie" },
Q1032 = { cont = "af", iso_3166 = "NE", cc = "+227", lang = "fr", currency = "Q861690", country = "Niger" },
Q1033 = { cont = "af", iso_3166 = "NG", cc = "+234", lang = "en", currency = "Q203567", country = "Nigérie" },
Q811 = { cont = "na", iso_3166 = "NI", cc = "+505", lang = "es", currency = "Q207312", country = "Nikaragua" },
Q55 = { cont = "eu", iso_3166 = "NL", cc = "+31", lang = "nl", currency = "Q4916", country = "Nizozemsko" },
Q20 = { cont = "eu", iso_3166 = "NO", cc = "+47", lang = "no", currency = "Q132643", country = "Norsko" },
Q837 = { cont = "as", iso_3166 = "NP", cc = "+977", lang = "ne", currency = "Q202895", country = "Nepál" },
Q697 = { cont = "oc", iso_3166 = "NR", cc = "+674", lang = "na", currency = "Q259502", country = "Nauru" },
Q34020 = { cont = "oc", iso_3166 = "NU", cc = "+683", lang ="niu", currency = "Q1472704", country = "Niue" },
Q664 = { cont = "oc", iso_3166 = "NZ", cc = "+64", lang = "en", currency = "Q1472704", country = "Nový Zéland" },
Q23681 = { cont = "eu", iso_3166 = "", cc = "+90-392", lang = "tr", currency = "Q172872", country = "Severokyperská turecká republika" },
Q842 = { cont = "as", iso_3166 = "OM", cc = "+968", lang = "ar", currency = "Q272290", country = "Omán" },
Q804 = { cont = "na", iso_3166 = "PA", cc = "+507", lang = "es", currency = "Q210472", country = "Panama" },
Q419 = { cont = "sa", iso_3166 = "PE", cc = "+51", lang = "es", currency = "Q204656", country = "Peru" },
Q691 = { cont = "oc", iso_3166 = "PG", cc = "+675", lang = "ho", currency = "Q200759", country = "Papua Nová Guinea" },
Q928 = { cont = "as", iso_3166 = "PH", cc = "+63", lang = "fil", currency = "Q17193", country = "Filipíny" },
Q843 = { cont = "as", iso_3166 = "PK", cc = "+92", lang = "ur", currency = "Q188289", country = "Pákistán" },
Q36 = { cont = "eu", iso_3166 = "PL", cc = "+48", lang = "pl", currency = "Q123213", country = "Polsko" },
Q407199 = { cont = "as", iso_3166 = "PS", cc = "+970", lang = "ar", currency = "Q203722", country = "Palestina" },
Q23792 = { id = "Q407199" },
Q42620 = { id = "Q407199" },
Q219060 = { id = "Q407199" },
Q45 = { cont = "eu", iso_3166 = "PT", cc = "+351", lang = "pt", currency = "Q4916", country = "Portugalsko" },
Q695 = { cont = "oc", iso_3166 = "PW", cc = "+680", lang = "en", currency = "Q4917", country = "Palau" },
Q733 = { cont = "sa", iso_3166 = "PY", cc = "+595", lang = "es", currency = "Q207514", country = "Paraguay" },
Q846 = { cont = "as", iso_3166 = "QA", cc = "+974", lang = "ar", currency = "Q206386", country = "Katar" },
Q218 = { cont = "eu", iso_3166 = "RO", cc = "+40", lang = "ro", currency = "Q131645", country = "Rumunsko" },
Q403 = { cont = "eu", iso_3166 = "RS", cc = "+381", lang = "sr", currency = "Q172524", country = "Srbsko" },
Q159 = { cont = "eu", iso_3166 = "RU", cc = "+7", lang = "ru", currency = "Q41044", country = "Rusko" },
Q1037 = { cont = "af", iso_3166 = "RW", cc = "+250", lang = "rw", currency = "Q4741", country = "Rwanda" },
Q851 = { cont = "as", iso_3166 = "SA", cc = "+966", lang = "ar", currency = "Q199857", country = "Saúdská Arábie" },
Q685 = { cont = "oc", iso_3166 = "SB", cc = "+677", lang = "en", currency = "Q4597", country = "Šalomounovy ostrovy" },
Q1042 = { cont = "af", iso_3166 = "SC", cc = "+248", lang = "en", currency = "Q4595", country = "Seychely" },
Q1049 = { cont = "af", iso_3166 = "SD", cc = "+249", lang = "ar", currency = "Q271206", show = "all", country = "Súdán" },
Q34 = { cont = "eu", iso_3166 = "SE", cc = "+46", lang = "sv", currency = "Q122922", country = "Švédsko" },
Q334 = { cont = "as", iso_3166 = "SG", cc = "+65", lang = "en", currency = "Q190951", country = "Singapur" },
Q215 = { cont = "eu", iso_3166 = "SI", cc = "+386", lang = "sl", currency = "Q4916", country = "Slovinsko" },
Q214 = { cont = "eu", iso_3166 = "SK", cc = "+421", lang = "sk", currency = "Q4916", country = "Slovensko" },
Q1044 = { cont = "af", iso_3166 = "SL", cc = "+232", lang = "en", currency = "Q122922", country = "Sierra Leone" },
Q238 = { cont = "eu", iso_3166 = "SM", cc = "+378", lang = "it", currency = "Q4916", country = "San Marino" },
Q1041 = { cont = "af", iso_3166 = "SN", cc = "+221", lang = "fr", currency = "Q861690", country = "Senegal" },
Q1045 = { cont = "af", iso_3166 = "SO", cc = "+252", lang = "so", currency = "Q4603", country = "Somálsko" },
Q730 = { cont = "sa", iso_3166 = "SR", cc = "+597", lang = "nl", currency = "Q202036", country = "Surinam" },
Q958 = { cont = "af", iso_3166 = "SS", cc = "+211", lang = "en", currency = "Q244366", country = "Jižní Súdán" },
Q1039 = { cont = "af", iso_3166 = "ST", cc = "+239", lang = "pt", currency = "Q193712", country = "Svatý Tomáš a Princův ostrov" },
Q792 = { cont = "na", iso_3166 = "SV", cc = "+503", lang = "es", currency = "Q4917", country = "Salvador" },
Q858 = { cont = "as", iso_3166 = "SY", cc = "+963", lang = "ar", currency = "Q240468", country = "Sýrie" },
Q1050 = { cont = "af", iso_3166 = "SZ", cc = "+268", lang = "en", currency = "Q4823", country = "Svazijsko" },
Q657 = { cont = "af", iso_3166 = "TD", cc = "+235", lang = "ar", currency = "Q847739", country = "Čad" },
Q945 = { cont = "af", iso_3166 = "TG", cc = "+228", lang = "fr", currency = "Q861690", country = "Togo" },
Q869 = { cont = "as", iso_3166 = "TH", cc = "+66", lang = "th", currency = "Q177882", country = "Thajsko" },
Q863 = { cont = "as", iso_3166 = "TJ", cc = "+992", lang = "tg", currency = "Q199886", country = "Tádžikistán" },
Q574 = { cont = "as", iso_3166 = "TL", cc = "+670", lang = "pt", currency = "Q4917", country = "Východní Timor" },
Q874 = { cont = "as", iso_3166 = "TM", cc = "+993", lang = "tk", currency = "Q486637", country = "Turkmenistán" },
Q948 = { cont = "af", iso_3166 = "TN", cc = "+216", lang = "ar", currency = "Q4602", country = "Tunisko" },
Q678 = { cont = "oc", iso_3166 = "TO", cc = "+676", lang = "to", currency = "Q4613", country = "Tonga" },
Q43 = { cont = "eu", iso_3166 = "TR", cc = "+90", lang = "tr", currency = "Q172872", country = "Turecko" },
Q754 = { cont = "na", iso_3166 = "TT", cc = "+1-868", lang = "en", currency = "Q242890", country = "Trinidad a Tobago" },
Q672 = { cont = "oc", iso_3166 = "TV", cc = "+688", lang = "tvl", currency = "Q4406", country = "Tuvalu" },
Q865 = { cont = "as", iso_3166 = "TW", cc = "+886", lang = "zh", currency = "Q208526", country = "Tchaj-wan" },
Q924 = { cont = "af", iso_3166 = "TZ", cc = "+255", lang = "sw", currency = "Q4589", country = "Tanzanie" },
Q907112 = { cont = "eu", iso_3166 = "", cc = "+373", lang = "ru", currency = "Q200979", country = "Podněstří" }, -- také Podněstersko
Q212 = { cont = "eu", iso_3166 = "UA", cc = "+380", lang = "uk", currency = "Q81893", country = "Ukrajina" },
Q1036 = { cont = "af", iso_3166 = "UG", cc = "+256", lang = "sw", currency = "Q4598", country = "Uganda" },
Q30 = { cont = "na", iso_3166 = "US", cc = "+1", lang = "en-us", currency = "Q4917", phoneDigits = 4, country = "Spojené státy americké" },
Q77 = { cont = "sa", iso_3166 = "UY", cc = "+598", lang = "es", currency = "Q209272", country = "Uruguay" },
Q265 = { cont = "as", iso_3166 = "UZ", cc = "+998", lang = "uz", currency = "Q487888", country = "Uzbekistán" },
Q237 = { cont = "eu", iso_3166 = "VA", cc = "+39", lang = "it", currency = "Q4916", country = "Vatikán" },
Q757 = { cont = "na", iso_3166 = "VC", cc = "+1-784", lang = "en", currency = "Q26365", country = "Svatý Vincenc a Grenadiny" },
Q717 = { cont = "sa", iso_3166 = "VE", cc = "+58", lang = "es", currency = "Q56349362", country = "Venezuela" },
Q881 = { cont = "as", iso_3166 = "VN", cc = "+84", lang = "vi", currency = "Q192090", country = "Vietnam" },
Q686 = { cont = "oc", iso_3166 = "VU", cc = "+678", lang = "en", currency = "Q207523", country = "Vanuatu" },
Q683 = { cont = "oc", iso_3166 = "WS", cc = "+685", lang = "sm", currency = "Q4588", country = "Samoa" },
Q1246 = { cont = "eu", iso_3166 = "XK", cc = "+383", lang = "sq", currency = "Q4916", country = "Kosovo" },
Q805 = { cont = "as", iso_3166 = "YE", cc = "+967", lang = "ar", currency = "Q240512", country = "Jemen" },
Q258 = { cont = "af", iso_3166 = "ZA", cc = "+27", lang = "en", currency = "Q181907", country = "Jihoafrická republika" },
Q953 = { cont = "af", iso_3166 = "ZM", cc = "+260", lang = "en", currency = "Q21596813", country = "Zambie" },
Q954 = { cont = "af", iso_3166 = "ZW", cc = "+263", lang = "en", currency = "Q4917", country = "Zimbabwe" }
},
-- list of administrative entities usually outside of their home countries.
-- These entities are favored over its home countries.
adminEntities = {
-- extraterritorial areas
Q25228 = { cont = "na", iso_3166 = "AI", cc = "+1-264", lang = "en", currency = "Q26365", country = "Anguilla" },
Q25227 = { cont = "na", iso_3166 = "AN", cc = "+599", lang = "nl", currency = "Q4917", country = "Nizozemské Antily" },
Q16641 = { cont = "oc", iso_3166 = "AS", cc = "+1-684", lang = "en", currency = "Q4917", country = "Americká Samoa" },
Q21203 = { cont = "na", iso_3166 = "AW", cc = "+297", lang = "nl", currency = "Q232270", country = "Aruba" },
Q5689 = { cont = "eu", iso_3166 = "AX", cc ="+358-18", lang = "sv", currency = "Q4916", country = "Alandy" },
Q25362 = { cont = "na", iso_3166 = "BL", cc = "+590", lang = "fr", currency = "Q4916", country = "Svatý Bartoloměj" },
Q23635 = { cont = "na", iso_3166 = "BM", cc = "+1-441", lang = "en", currency = "Q210478", country = "Bermudy" },
Q26180 = { cont = "na", iso_3166 = "BQ-SE", cc = "+599", lang = "nl", currency = "Q4917", country = "Nizozemské Antily" }, -- Sint Eustatius, +599-3
Q25528 = { cont = "na", iso_3166 = "BQ-SA", cc = "+599", lang = "nl", currency = "Q4917", country = "Nizozemské Antily" }, -- Saba, +599-4
Q25396 = { cont = "na", iso_3166 = "BQ-BO", cc = "+599", lang = "nl", currency = "Q4917", country = "Nizozemské Antily" }, -- Bonaire, +599-7
Q23408 = { cont = "an", iso_3166 = "BV", cc = "", lang = "", currency = "", country = "Bouvetův ostrov" },
Q36004 = { cont = "oc", iso_3166 = "CC", cc = "+61891", lang = "en", currency = "Q259502", country = "Kokosové ostrovy" },
Q25279 = { cont = "na", iso_3166 = "CW", cc = "+599-9", lang = "nl", currency = "Q522701", country = "Curaçao" },
Q31063 = { cont = "oc", iso_3166 = "CX", cc = "+61", lang = "en", currency = "Q259502", country = "Vánoční ostrov" },
Q9648 = { cont = "sa", iso_3166 = "FK", cc = "+500", lang = "en", currency = "Q330044", country = "Falklandy" },
Q3769 = { cont = "sa", iso_3166 = "GF", cc = "+594", lang = "fr", currency = "Q4916", country = "Francouzská Guyana" },
Q25230 = { cont = "eu", iso_3166 = "GG", cc = "+44", lang = "en-gb", currency = "Q25224", country = "Guernsey" },
Q1410 = { cont = "eu", iso_3166 = "GI", cc = "+350", lang = "en", currency = "Q41429", country = "Gibraltar" },
Q223 = { cont = "na", iso_3166 = "GL", cc = "+299", lang = "kl", currency = "Q25417", country = "Grónsko" },
Q695387 = { id = "Q223" }, -- Kommuneqarfik Sermersooq
Q478813 = { id = "Q223" }, -- Kommune Kujalleq
Q17012 = { cont = "na", iso_3166 = "GP", cc = "+590", lang = "fr", currency = "Q4916", country = "Guadeloupe" },
Q35086 = { cont = "an", iso_3166 = "GS", cc = "+500", lang = "en", currency = "Q25224", country = "Jižní Georgie a Jižní Sandwichovy ostrovy" },
Q16635 = { cont = "oc", iso_3166 = "GU", cc = "+1-671", lang = "en", currency = "Q4917", country = "Guam" },
Q8646 = { cont = "as", iso_3166 = "HK", cc = "+852", lang = "zh", currency = "Q31015", country = "Hongkong" },
Q131198 = { cont = "oc", iso_3166 = "HM", cc = "", lang = "en", currency = "", country = "Heardův ostrov a McDonaldovy ostrovy" },
Q9676 = { cont = "eu", iso_3166 = "IM", cc = "+44", lang = "en-gb", currency = "Q25224", country = "Ostrov Man" },
Q43448 = { cont = "af", iso_3166 = "IO", cc = "+246", lang = "en", currency = "Q25224", country = "Britské indickooceánské území" },
Q785 = { cont = "eu", iso_3166 = "JE", cc = "+44", lang = "en-gb", currency = "Q25224", country = "Jersey" },
Q5785 = { cont = "na", iso_3166 = "KY", cc = "+1-345", lang = "en", currency = "Q319885", country = "Kajmanské ostrovy" },
Q737765 = { id = "Q5785" }, -- Grand Cayman
Q4936407 = { id = "Q5785" }, -- Bodden Town District, Grand Cayman
Q126125 = { cont = "na", iso_3166 = "MF", cc = "+590", lang = "fr", currency = "Q4916", country = "Svatý Martin (francouzská část)" }, -- French overseas collectivity
Q14773 = { cont = "as", iso_3166 = "MO", cc = "+853", lang = "zh", currency = "Q241214", country = "Macau" },
Q17054 = { cont = "na", iso_3166 = "MQ", cc = "+596", lang = "fr", currency = "Q4916", country = "Martinik" },
Q13353 = { cont = "na", iso_3166 = "MS", cc = "+1-664", lang = "en", currency = "Q26365", country = "Montserrat" },
Q33788 = { cont = "oc", iso_3166 = "NC", cc = "+687", lang = "fr", currency = "Q214393", country = "Nová Kaledonie" },
Q31057 = { cont = "oc", iso_3166 = "NF", cc = "+6723", lang = "en", currency = "Q259502", country = "Norfolk" },
Q30971 = { cont = "oc", iso_3166 = "PF", cc = "+689", lang = "fr", currency = "Q214393", country = "Francouzská Polynésie" },
Q34617 = { cont = "na", iso_3166 = "PM", cc = "+508", lang = "fr", currency = "Q4916", country = "Saint Pierre a Miquelon" },
Q35672 = { cont = "oc", iso_3166 = "PN", cc = " +649", lang = "en", currency = "Q1472704", country = "Pitcairnovy ostrovy" },
Q1183 = { cont = "na", iso_3166 = "PR", cc = "+1-787", lang = "es", currency = "Q4917", country = "Portoriko" },
Q485112 = { cont = "af", iso_3166 = "SO", cc = "+252", lang = "so", currency = "Q4603", country = "Somálsko" },
Q17070 = { cont = "af", iso_3166 = "RE", cc = "+262", lang = "fr", currency = "Q4916", country = "Réunion" },
Q653514 = { id = "Q17070" }, -- Arrondissement Saint-Denis
Q47045 = { id = "Q17070" }, -- Saint-Denis
Q316887 = { id = "Q17070" }, -- Saint-Paul
Q612189 = { id = "Q17070" }, -- Arrondissement Saint-Paul
Q702426 = { id = "Q17070" }, -- Arrondissement Saint-Pierre
Q192184 = { cont = "af", iso_3166 = "SH", cc = "+290", lang = "en", currency = "Q374453", country = "Svatá Helena, Ascension a Tristan da Cunha" }, -- Sonderbehandlung Tristan da Cunha, Ascension, Gough-Insel
Q842829 = { cont = "eu", iso_3166 = "SJ", cc = "+47", lang = "no", currency = "Q4916", country = "Špicberky a Jan Mayen" },
Q34754 = { cont = "af", iso_3166 = "SO", cc = "+252", lang = "so", currency = "Q737384", country = "Somálsko" },
Q26273 = { cont = "na", iso_3166 = "SX", cc = "+1-721", lang = "nl", currency = "Q522701", country = "Svatý Martin (nizozemská část)" }, -- Sint Maarten
Q18221 = { cont = "na", iso_3166 = "TC", cc = "+1-649", lang = "en", currency = "Q4917", country = "Turks a Caicos" },
Q129003 = { cont = "an", iso_3166 = "TF", cc = "+262", lang = "fr", currency = "Q4916", country = "Francouzská jižní a antarktická území" },
Q36823 = { cont = "oc", iso_3166 = "TK", cc = "+690", lang ="tkl", currency = "Q1472704", country = "Tokelau" },
Q16645 = { cont = "oc", iso_3166 = "UM", cc = "", lang = "en", currency = "", country = "Menší odlehlé ostrovy USA" },
Q25305 = { cont = "na", iso_3166 = "VG", cc = "+1-284", lang = "en", currency = "Q4917", country = "Britské Panenské ostrovy" },
Q11703 = { cont = "na", iso_3166 = "VI", cc = "+1-340", lang = "en", currency = "Q4917", country = "Americké Panenské ostrovy" },
Q642481 = { id = "Q11703" }, -- Saint Croix
Q849441 = { id = "Q11703" }, -- Saint John
Q463937 = { id = "Q11703" }, -- Saint Thomas
Q35555 = { cont = "oc", iso_3166 = "WF", cc = "+681", lang = "fr", currency = "Q214393", country = "Wallis a Futuna" },
Q17063 = { cont = "af", iso_3166 = "YT", cc = "+262", lang = "fr", currency = "Q4916", country = "Mayotte" },
-- terrae nullius
Q620634 = { cont = "af", iso_3166 = "", cc = "", lang = "ar", currency = "", country = "Bir Tawil" },
-- Antarctica
Q140948 = { cont = "an", iso_3166 = "", cc = "", lang = "en", currency = "", country = "Jižní Shetlandy" },
}
}
hilpf5mbvi705615uxrs8263urekabv
Modul:UrlCheck
828
1350
22099
17255
2026-05-20T11:37:30Z
LiMr
96
aktualizace na novější verzi
22099
Scribunto
text/plain
-- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:UrlCheck&oldid=1775630)
-- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:UrlCheck&oldid=1775630)
-- module variable and administration
local uc = {
moduleInterface = {
suite = 'UrlCheck',
serial = '2026-05-17',
item = 40849609
}
}
function uc.ip4( address )
local parts = { address:match( '(%d+)%.(%d+)%.(%d+)%.(%d+)' ) }
if #parts == 4 then
for key, value in pairs( parts ) do
if tonumber( value ) < 0 or tonumber( value ) > 255 then
return false
end
end
return true -- ok
end
return false
end
function uc.isUrl( url, skipPathCheck )
-- return codes 0 through 2 reserved
if not url or type( url ) ~= 'string' then
return 3
end
local s = mw.text.trim( url )
if s == '' then
return 3
elseif #s > 2048 then -- limitation because of search engines or IE
return 4
elseif s:find( '%s' ) or s:find( '%c' ) or s:match( '^%.' ) then
return 5
end
-- https://max:muster@www.example.com:8080/index.html?p1=A&p2=B#ressource
-- protocol
local count
s, count = s:gsub( '^https?://', '' )
if count == 0 then
s, count = s:gsub( '^//', '' )
end
if count == 0 then -- missing or wrong protocol
return 6
end
local aPath = ''
local user
local password
local host
local port
local topLevel
-- split path from host
local at = s:find( '/' )
if at then
aPath = s:sub( at + 1, #s )
s = s:sub( 1, at - 1 )
if not s then
return 7
end
end
-- path check
if not skipPathCheck and aPath ~= '' then
if not aPath:match( "^[-A-Za-z0-9_.,~%%%+&:;#*?!'=()@/\128-\255]*$" ) then
return 23
end
end
if s:find( '%.%.' ) or s:find( '%.@' ) or s:find( '@[%.%-]' ) or s:find( '%-%.' )
or s:find( '%.%-' ) or s:find( '%./' ) or s:find( '/%.' ) then
return 8
end
-- user and password
s, count = s:gsub( '@', '@' )
if count > 1 then
return 9
elseif count == 1 then
at = s:find( '@' )
user = s:sub( 1, at - 1 )
host = s:sub( at + 1, #s )
if not user or not s then
return 10
end
user, count = user:gsub( ':', ':' )
if count > 1 then
return 11
elseif count == 1 then
at = user:find( ':' )
password = user:sub( at + 1, #user )
user = user:sub( 1, at - 1 )
if not user or not password then
return 12
elseif #user > 64 then
return 13
end
end
else
host = s
end
if host == '' then
return 14
end
-- host and port
host, count = host:gsub( ':', ':' )
if count > 1 then
return 15
elseif count == 1 then
at = host:find( ':' )
port = host:sub( at + 1, #host )
host = host:sub( 1, at - 1 )
if not host or not port then
return 16
elseif not port:match( '^[1-9]%d*$' ) or tonumber( port ) > 65535 then
return 17
end
end
-- handle host part
if #host > 253 then
return 18
end
-- getting top-level domain
at = host:match( '^.*()%.' ) -- find last dot
if not at then
return 19
end
topLevel = host:sub( at + 1, #host )
if not topLevel then
return 20
end
-- future: check of top-level domain
if uc.ip4( host ) then -- is ip4 address
return 2
elseif not ( mw.ustring.match( host, '^[ะ-๏%w%.%-]+%.%a%a+$' ) or
mw.ustring.match( host, '^[ะ-๏%w%.%-]+%.xn%-%-%w%w+$' ) ) then
-- Thai diacritical marks ะ (0E30) - ๏ (0E4F)
return 22
elseif not ( host:match( '^[%w%.%-]+%.%a%a+$' ) or
host:match( '^[%w%.%-]+%.xn%-%-%w%w+$' ) ) then
return 1 -- matches domain only in UTF 8 mode
end
return 0
end
function uc.uriEncodePath( url )
local at = url:find( '[^/]/[^/]' )
if at then
local domain = url:sub( 1, at + 1 )
local aPath = url:sub( at + 2, #url )
url = domain .. mw.uri.encode( aPath, 'PATH' )
end
return url
end
function uc.checkUrl( frame )
local args = frame.args
local pArgs = frame:getParent().args
args.url = args.url or pArgs.url or ''
args.show = args.show or pArgs.show or ''
local result = uc.isUrl( args.url, false )
if args.show:lower() == 'msg' then
local ui = mw.loadData( 'Module:UrlCheck/i18n')
if ui[ result ] then
return ui[ result ]
else
return ui.unknown
end
end
return result
end
function uc.encodePath( frame )
local args = frame.args
local pArgs = frame:getParent().args
args.url = args.url or args[ 1 ] or pArgs.url or pArgs[ 1 ] or ''
return uc.uriEncodePath( args.url )
end
return uc
bhaco5p7902e7csdkt070t2z4tvz47t
Diskuse s uživatelem:Pujcsilode
3
1844
22083
2026-05-20T09:03:40Z
LiMr
96
nová sekce /* Český Krumlov - propagace */
22083
wikitext
text/x-wiki
== Český Krumlov - propagace ==
Dobrý den, vámi přidaná informace v článku [[Český Krumlov]] je příliš propagační a vložená za komerčním účelem. Přesto se můžeme domluvit na nějakém kompromisu:
* Zmíněné informace se krásně hodí do článku [[Vltava]], kde se o sjíždění Vltavy píše detailně, ale úplně tam chybí právě ta možnost, že si lze lodě někde půjčit.
* Nepoužívejte prosím první osobu. Wikicesty nepůjčují lodě - to ta vaše společnost :)
* V článku [[Český Krumlov]] ale může zůstat informace o tom, že existuje možnost splutí Vltavy a že se dá přímo v Českém Krumlově půjčit loď. Žádné detailnější informace o půjčovně, protože to by bylo už duplikování. Naopak tam udělat odkaz na půjčovnu do článku Vltava, kde se čtenář dozví detaily.
Udělejte prosím úpravu nejpozději do konce měsíce. Děkuji [[Uživatel:LiMr|LiMr]] ([[Diskuse s uživatelem:LiMr|diskuse]]) 20. 5. 2026, 11:03 (CEST)
oxc041lymnmyihcf2n3b5omadg2y7ap