Module:City
Jump to navigation
Jump to search
Summary
This module is intended for showing names of places, like cities or countries, in the language of the user and with a link to wikipedia article in that language if
Using this module from templates
city
This module should only be called from {{City}} template. Please call that template to access this module. Also see {{City}} template for full documentation
Usage:
{{#invoke:City|city|place=...|lang=...|link=...}}
Parameters:
- 1
- place name
- lang
- language to show it in. Users language by default.
- link
- site to which the link should link to. Wikipedia by default. Other possible values:
commons,wikidata-deactivate all links
Example:
{{#invoke:City|city|place=Paris|lang=en}}produces Lua error in Module:Wikidata_label at line 283: attempt to index field 'wikibase' (a nil value).
Using this module from Lua code
In order to use the functions in this module from another Lua module you first have to import this module.
Example:
local City = require('Module:City')._city
_city
Usage:
city_str = City(place,lang)
See Also
- {{City}}
- Module:City/data - data structure cataloging all known city names
local p = {}
function p.qCode(place)
-- recover a q-code based on place name, also if one can link to a page on commons return such link
local item, link = nil, nil
-- === STEP 1: if "place" is empty than return nothing ==============
if (not place) or (place == "") then
return item, link
end
-- === STEP 2: Check if "place" holds a q-code or matches any of the hardwired names ==============
if string.match(place, "^Q%d+$") then
return place, link -- place string contains a q-code
else
-- if multiple calls to {{City}} from a single file, than mw.loadData should load [[Module:City/data]] only once
local LookupTable = mw.loadData("Module:City/data")
item = LookupTable[mw.ustring.lower(place)]
if item then
return item, link
end
end
-- === STEP 3: Check if {{{1}}} matches existing template, gallery or category and if so provide the link ===
if #place>=3 and #place<40 then
local page = mw.title.new( place, '' )
if page and page.exists then
item = mw.wikibase.getEntityIdForTitle( place )
link = "[[" .. place .. "]]"
if item then
return item, link
end
end
page = mw.title.new( place, 'category' )
if page and page.exists then
item = mw.wikibase.getEntityIdForTitle( 'Category:' .. place )
link = "[[:Category:" .. place .. "|" .. place .. "]]"
if item then
local entity = mw.wikibase.getEntityObject(item)
if entity then
local s = entity:getBestStatements( 'P31' )
if s[1] and s[1].mainsnak.datavalue.value.id=="Q4167836" then
-- if "instance of "(P31) = "Wikimedia category" (Q4167836)
s = entity:getBestStatements( 'P301' ) -- category's main topic
if s[1] then -- if property "category's main topic" (P301) is set
item = s[1].mainsnak.datavalue.value.id
else
item = nil
end
end
end
end
end
end
return item, link
end
function p._city(place, lang, link)
if (not place) or (place == "") then
return "" --if "place" is empty than do nothing
end
if string.match(place, "[%{%{|%[%[].+[%}%}|%]%]]") then
return place -- if "place" already has a link and if so than skip the rest of the template
end
-- Check if we can recover a q-code
local item, linkStr = p.qCode(place)
if item then
local wikidata = require("Module:Wikidata label")
return wikidata._getLabel(item, lang, link)
elseif linkStr then
return linkStr -- no q-code but we matched one of the galleries or categories
end
-- return as is
return place
end
function p.city(frame)
local args = frame.args
if not (args.lang and mw.language.isSupportedLanguage(args.lang)) then
args.lang = frame:callParserFunction( "int", "lang" ) -- get user's chosen language
end
if (not args.link) or (mw.text.trim(args.link) == "") then
args.link = "wikipedia"
end
args.place = mw.text.trim(args.place or '')
return p._city(args.place, args.lang, args.link)
end
return p