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

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
Category:Modules for general use Category:Modules subject to page protection