モジュール:Marker
表示
このモジュールは多くのページで使用されており、変更はすぐにプロジェクト全体に反映されます。変更は事前にサンドボックス、またはあなたの利用者名前空間でテストしてください。テストした変更は、このページに1回の編集で挿入する必要があります。実装する前に、ノートページであらかじめ変更について合意形成してください。 |
このテンプレートは、以下のLuaモジュールを使用しています。 |
地図にマーカーを表示するモジュール。使用する際は{{Marker}}を呼び出してください。
関数
function mk.marker( frame )
テンプレートに与えられたパラメータを確認し、マーカーを表示します。使用可能なパラメータについてはテンプレート:Marker/docを参照してください。また、技術情報に関してはこちらをご覧ください。
使用状況
このモジュールを使用しているテンプレートは以下の通りです:
この解説は、モジュール:Marker/docから呼び出されています。 (編集 | 履歴) 編集者は、このモジュールをサンドボックス (編集 | 差分)とテストケース (作成)で試すことができます。(解説) このモジュールのサブページ一覧。 |
-- module variable and administration
local mk = {
moduleInterface = {
suite = 'Marker',
serial = '2024-10-06',
item = 40852170
}
}
-- module import
local mi = require( 'Module:Marker utilities/i18n' )
local mu = require( 'Module:Marker utilities' )
local mp = require( 'Module:Marker/Params' )
local cm = require( 'Module:CountryData' )
local wu = require( 'Module:Wikidata utilities' )
-- adding from-WD class
local function addWdClass( key )
return mu.addWdClass( mp.wdContent[ key ] )
end
-- taking mp.ynCheckList into account
local function checkYn( args )
local s
for i, key in ipairs( mp.ynCheckList ) do
args[ key ] = args[ key ] or ''
s = mu.yesno( args[ key ] )
if s then -- 'y' or 'n'
args[ key ] = ''
mp.wdContent[ key ] = ( s == 'y' ) and true or nil
elseif args[ key ] ~= '' then
mp.wdContent[ key ] = nil
end
end
end
local function initialParametersCheck( frame )
local entity = nil
local wrongQualifier = false
local show = {}
-- checking keys and copying values to args
local args = mu.checkArguments( frame:getParent().args, mp.p )
-- removing control characters
local descrDiv
for key, v in pairs( mp.p ) do
if args[ key ] and args[ key ] ~= '' then
args[ key ], descrDiv = mu.removeCtrls( args[ key ], true )
else
args[ key ] = ''
end
end
-- checking Wikidata entitity
if args.wikidata ~= '' then
-- args.wikidata, entity, wrongQualifier = wu.getEntityId( args.wikidata or '' )
args.wikidata, entity, wrongQualifier = wu.getEntity( args.wikidata or '' )
if wrongQualifier then
mu.addMaintenance( 'wrongQualifier' )
elseif args.wikidata ~= '' then
mu.addMaintenance( 'wikidata' )
end
end
-- making web addresses table
local web = {}
mu.tableInsert( web, args.url )
-- getting country-specific technical parameters
local country = cm.getCountryData( entity, nil, args.country, args.wikidata, web )
if country.unknownCountry then
mu.addMaintenance( 'unknownCountry' )
end
-- for map support
country.extra = mi.map.defaultSiteType
if mu.isSet( country.iso_3166 ) then
country.extra = country.extra .. '_region:' .. country.iso_3166
end
-- checking show parameter
show = mu.getShow( mp.defaultShow, args, mp.show )
-- y/n allow/disallow output
if not mu.isSet( args.nameLocal ) then
args.nameLocal = 'n'
end
checkYn( args )
args.noGpx = mu.yesno( args.noGpx ) == 'y'
mu.checkStatus( args )
mu.checkStyles( args )
-- checking coordinates and converting DMS to decimal coordinates if necessary
mu.checkCoordinates( args )
mu.checkZoom( args )
-- removing namespace from category
mu.checkCommonsCategory( args )
for i, param in ipairs( mi.options.parameters ) do
if mu.isSet( args[ param ] ) then
mu.addMaintenance( 'parameterUsed', param )
end
end
return args, entity, show, country
end
-- getting data from Wikidata
local function getDataFromWikidata( args, show, page, country, entity )
local function singleProperty( propDef, maxCount )
local v = wu.getValues( entity, propDef.p, maxCount )
if propDef.f then
for i = 1, #v, 1 do -- formatting
if mu.isSet( v[ i ] ) then
v[ i ] = propDef.f:format( v [ i ] )
end
end
end
return v
end
local function getValues( propDef )
local v
local maxCount = propDef.c or 1
local tp = type( propDef.p )
if tp == 'string' then
v = singleProperty( propDef, maxCount )
elseif tp == 'table' then
for i, sngl in ipairs( propDef.p ) do
if type( sngl ) == 'table' then
v = singleProperty( sngl, maxCount )
if #v > 0 then
break
end
end
end
end
return table.concat( v, ', ' )
end
if args.wikidata == '' then
return
end
mu.getTypeFromWikidata( args, entity )
args.nameLocal = mp.wdContent.nameLocal or args.nameLocal
mu.getNamesFromWikidata( args, mp.wdContent, page, country, entity )
mu.getCoordinatesFromWikidata( args, mp.wdContent, entity )
mu.getCommonsCategory( args, entity )
if show.name then
mu.getArticleLink( args, entity, page )
end
-- getting more values from Wikidata
local p
for key, value in pairs( mp.wdContent ) do
p = mp.wd[ key ]
if p and not mu.isSet( args[ key ] ) then
args[ key ] = getValues( p )
mp.wdContent[ key ] = args[ key ] ~= ''
end
end
end
local function finalParametersCheck( args, show, country, entity )
-- creating givenName, displayName tables
mu.prepareNames( args )
-- coordinates are neccessary
show.noCoord = args.lat == '' or args.long == ''
if show.noCoord then
show.name = 1
show.poi = false
show.coord = false
mu.addMaintenance( 'missingCoord' )
end
-- getting Marker type, group, and color
mu.checkTypeAndGroup( args )
-- image check
if not mp.wdContent.image or mi.options.WDmediaCheck then
mu.checkImage( args, entity )
end
mu.checkUrl( args )
args.commonscat = args.commonscat:gsub( ' ', '_' )
end
local function insertCoordinates( result, args, country, noBrackets )
mu.tableInsert( result, mu.dmsCoordinates( args.lat, args.long,
args.givenName.name, mp.wdContent.lat, country.extra, noBrackets ) )
end
-- distinguishing marker symbols, default: number
local function makeMarkerProperties( args, show )
if args.symbol == '' and show.poi and show.symbol then
args.symbol = mu.getMakiIconId( args.typeTable[ 1 ] ) or ''
end
local isIcon = mu.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
mu.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( 'unknownIcon' )
end
end
local function makeMetadata()
if mi.options.markerMetadata then
return tostring( mw.html.create( 'span' )
:attr( 'class', 'listing-metadata listing-metadata-items' )
:wikitext( '' )
)
else
return ''
end
end
local function makeMarkerAndName( args, show, page, country, entity, frame )
local result = {} -- output string table, wrapper is added later
-- adding status icons
mu.tableInsert( result, mu.makeStatusIcons( args ) )
-- adding marker symbol
if show.poi or mu.isSet( args.copyMarker ) then
makeMarkerProperties( args, show )
table.insert( result, mu.makeMarkerSymbol( args, frame ) ..
( show.name and '' or makeMetadata() ) )
end
-- adding name, airport code, sister-project icons, and coordinate
if show.name then
local r = {}
local nameClass = addWdClass( 'name' )
if not show.noCoord and not show.poi and not show.coord then
nameClass = nameClass .. ' listing-without-marker'
end
args.metadata = makeMetadata()
if args.displayName.all ~= '' or args.nameExtra ~= '' or args.nameLocal ~= '' then
mu.makeName( r, args, show, page, country, nameClass, addWdClass( 'nameLocal' ) )
elseif args.url ~= '' then
table.insert( r, mu.makeSpan( '[' .. args.url .. ']', 'listing-url' ) )
end
r = table.concat( r, mi.texts.space )
local icons = {}
local onlyWikidata = mi.options.showSisters and not show.nositelinks and
mu.makeSisterIcons( icons, args, page, country, entity )
mu.makeSocial( icons, args, mp.wdContent, args.givenName.name )
if #icons > 0 then
r = r .. ( onlyWikidata and '' or mi.texts.space ) .. table.concat( icons, '' )
end
mu.tableInsert( result, r )
-- adding coordinate if requested and available
if show.coord then
insertCoordinates( result, args, country )
end
-- adding coordinate only
elseif show.coord then
insertCoordinates( result, args, country, true )
end
return table.concat( result, mi.texts.space )
end
local function makeMaintenance( page )
if mi.nsNoMaintenance[ page.namespace ] then
return ''
end
local r= mu.getMaintenance()
if mi.options.usePropertyCateg then
local m = mi.maintenance.properties -- format string
r = r .. ( wu and wu.getCategories( m ) or '' )
.. mu.getCategories( m ) .. cm.getCategories( m )
end
return r
end
-- main marker function
function mk.marker( frame )
mu.initMaintenance()
local page = mu.getPageData()
-- copying frame:getParent().args to template arguments, args, parameter check
-- returning Wikidata entity and display options
local args, mkEntity, show, country = initialParametersCheck( frame )
show.inline = true
-- associated Wikivoyage page of the location in current Wikivoyage branch
-- possibly modified by mu.getArticleLink()
args.wikiPage = ''
args.template = 'Marker'
getDataFromWikidata( args, show, page, country, mkEntity )
-- parameter check after data import from Wikidata
finalParametersCheck( args, show, country, mkEntity )
-- generating output
local result = makeMarkerAndName( args, show, page, country, mkEntity, frame )
-- removing succeeding brackets
result = result:gsub( '%)(</span>)%s*(<span [^>]*>)%(', '%1; %2' )
return mu.makeWrapper( result, args, page, country, show, mp.markerData, frame )
.. makeMaintenance( page )
end
return mk