模組:Property

-- [[Module:Property]]

local p = {}

-- trim string
function trim(s)
	-- incase nil
	if s == nil then return '' end
	s = tostring(s)
	return s:gsub("^%s+", ""):gsub("%s+$", "")
end


-- Get the property of given wikidata entity.
-- 取得wikidata中指定實體項目的指定屬性。
-- [[:mw:Extension:Wikibase Client/Lua]]
function p.data(frame)
	if mw.wikibase == nil then
		-- translate: 'Not yet install Extension:Wikibase ?'
		return '未安裝 Extension:Wikibase ?'
	end

	local entity = trim(frame.args[2])
	if not entity:match('^[QP]%d{1,10}$') then
		entity = mw.wikibase.resolvePropertyId(entity) or entity
	end
	-- entity = mw.wikibase.getEntity(trim(frame.args[2]) or nil)
	if entity == '' then
		entity = mw.wikibase.getEntity()
		-- translate: No wikidata entity
		if entity == nil or entity.claims == nil then return '無本頁之數據' end
	else
		entity = mw.wikibase.getEntity(entity)
		if entity == nil then
			-- translate: No wikidata entity
			return '不存在此項目: ' .. frame.args[2]
		end
	end


	local property_id = trim(frame.args[1])

	if property_id == '' then
		-- https://www.mediawiki.org/wiki/Extension:Wikibase_Client/Lua#mw.wikibase.label
		local language = trim(frame.args[3])
		if language == '' then
			-- return mw.wikibase.label(entity.id)
			return entity:getLabel()
		end
		return entity:getLabel(language)
	end

	if property_id == 'id' then
		return entity.id
	end

	if property_id == 'link' then
		local language = trim(frame.args[3])
		if language == '' then language = 'en' end
		return entity:getSitelink(language .. 'wiki')
	end

	if not property_id:match('^P%d{1,10}$') then
		property_id = mw.wikibase.resolvePropertyId(property_id) or property_id
	end

	-- return entity:formatPropertyValues(property_id)


	local property = entity.claims[property_id]
	if property == nil then
		local prefix
		if trim(frame.args[2]) == '' then
			-- translate: The page
			prefix = '本頁'
		else
			-- translate: The entity
			prefix = '此項目 [[d:' .. trim(frame.args[2]) .. ']] '
		end
		-- translate: has no property:
		return prefix .. '不存在此屬性: ' .. property_id
	end

	-- TODO: check property[i]['rank']
	property = property[1]['mainsnak']['datavalue']

	-- ['datavalue']: e.g.,
	-- {"value":{'entity-type':'item','numeric-id':1647152},type:'wikibase-entityid'}
	-- {"value":{"amount":"+10","unit":"1","upperBound":"+10","lowerBound":"+10"},"type":"quantity"}
	-- {"value":{"time":"-0800-01-01T00:00:00Z","timezone":0,"before":0,"after":0,"precision":7,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"}

	property = property['value']

	if type(property) ~= 'table' then
		return property
	end

	if property['amount'] ~= nil then
		return tonumber(property['amount'])
	end

	if property['time'] ~= nil then
		-- local BCE, y, m, d = string.match(property['time'], '^([+\\-]?)0*([1-9]%d*)-0*([1-9]%d*)-0*([1-9]%d*)T')
		-- local BCE, y, m, d = property['time']:match('^([+\\-]?)0*([1-9]%d*)-0*([1-9]%d*)-0*([1-9]%d*)T')
		local BCE, y, m, d = property['time']:match('^([+\\-]?)(%d+)-(%d+)-0*(%d+)T')
		local unit
		if property['precision'] <= 7 then
			if property['precision'] == 7 then
				y = y / 100
				unit = '世紀'
			else
				y = y / 1000
				unit = '千紀'
			end
		else
			y = y - 0
		end
		if BCE == '-' then
			y = '前' .. y
		end
		if property['precision'] <= 7 then
			return y .. unit
		end
		if property['precision'] <= 9 then
			return y .. '年'
		end
		if property['precision'] <= 10 then
			return y..'年'..m..'月'
		end
		-- TODO: other precisions 精度 https://en.wikipedia.org/wiki/Module:Wikidata
		m = m - 0
		d = d - 0
		return y..'年'..m..'月'..d..'日'
	end

	if property['numeric-id'] ~= nil then
		return mw.wikibase.label('Q' .. property['numeric-id'])
	end

	-- TODO: other types
	-- https://www.mediawiki.org/wiki/Wikibase/API
	-- https://www.mediawiki.org/wiki/Wikibase/Indexing/RDF_Dump_Format#Value_representation
	-- translate: Can not parse the type: , please fix Module:property.
	return '尚無法處理此屬性: ' .. property_id .. ',請修改 Module:property。'
end


return p