Module:City

From Multilingual Bookbinding Dictionary
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


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