Module:City
Lua
CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules
SummarySummary
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 templatesUsing this module from templates
citycity
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 Paris
Using this module from Lua codeUsing 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_city
Usage:
city_str = City(place,lang)
See AlsoSee Also
- {{City}}
- Module:City/data - data structure cataloging all known city names
Code
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 "place" 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
local page_name = place
if page.redirectTarget then
page_name = page.redirectTarget.prefixedText
end
item = mw.wikibase.getEntityIdForTitle( page_name )
link = "[[" .. page_name .. "]]"
if item then
return item, link
end
end
page = mw.title.new( place, 'category' )
if page and page.exists then
local resolve_redirect = require("Module:Resolve category redirect").rtarget
place = resolve_redirect(place)
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
return item, link
end
end
-- === STEP 4: Check if "place" matches an interwiki link to a Wikipedia
-- page with the link label matching the full page name that is linked to a
-- Wikidata item ===
local langcode, pagename = mw.ustring.match(place, "^%[%[w?:(.+):(.+)|%2%]%]$")
if langcode and pagename then
item = mw.wikibase.getEntityIdForTitle( pagename, langcode .. 'wiki' )
link = place
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