Documentation for this module may be created at ሞድዩል:Wikidata/Formats/doc

local p = {}
local ti = mw.language.new('ti')
local tablesModule				= require('Module:Tables') 
	local tableElement 			= tablesModule.element
	local onTable       		= tablesModule.on
	local insertInTable			= tablesModule.put
local wikidataModule			= require('Module:Wikidata')
	local getWikidataProperty	= wikidataModule.getProperty
	local wikidataDataFormat	= wikidataModule.dataFormat
local toLinkURL					= require('Module:URL').toLink

function p.formatCoor(value)
    local coorstring = value
    return frame:preprocess('{{coord|' .. coorstring[tostring('latitude')] ..'|'.. coorstring[tostring('longitude')] .. '|format=dms}}')
end

function p.unitFormat(value, options)
	amount = mw.ustring.gsub(value.value['amount'], '+','')
	unit = mw.wikibase.label(mw.ustring.gsub(value.value['unit'], '^.-/(Q%d+)$', '%1'))
	if unit and tonumber(amount) > 1 then
		textUnit = mw.ustring.gsub(unit, '(%S+)', plural)
	end

	if not unit or (options['unitFormat'] and options['unitFormat'] == 'ቁጽሪ') then
		return tonumber(amount)
	elseif unit and options['unitFormat'] and options['unitFormat'] == 'ደቓይቕ' and unit == 'ካልኢት' then
		local seconds = tostring(tonumber(amount)%60)
		if mw.ustring.len(seconds) == 1 then seconds = '0' .. seconds end
		return math.floor(tonumber(amount)/60) .. ':' .. seconds .. ' ' .. 'ደቓይቕ'
	else
		return p.numberFormat(amount) .. ((textUnit and ' ' .. textUnit) or '')
	end
end

function p.numberFormat(value, options)

	if value['amount'] then value = mw.ustring.gsub(value['amount'], '+', '') end

	if not tonumber(value) then return value end

	local Format = value
	while true do  
		Format, k = string.gsub(Format, "^(-?%d+)(%d%d%d)", '%1 %2')
		if (k==0) then
			break
		end
	end
	return Format
end

-- Qualifier formats

function p.periodFormat(value, options)
	if not value then
		return
	end
	
	local startYear, endYear
	local startDate, endDate
	local dateOptions= {['textFormat']='uppercase', ['dateFormat'] = 'year', ['link']='no'}

    local startDates = value['P580']
    local endDates   = value['P582']
    local istartDate = 1
    local iendDate   = 1
    
    if not startDates and not endDates then
    	return
    end
    
    local periods    = {}

	if startDates and startDates[1] then
		--if true then return require('Module:Tables').tostring(startDates[1]) end
	    startYear = formatDataWikidata(startDates[1],dateOptions , {})
	    startDate= startYear -- for now
	end
	
	if endDates and endDates[1] then
	    endYear  = formatDataWikidata(endDates[1], dateOptions, {})
	    endDate = endYear -- for now
	end
	
    while startDate or endDate do -- For each period
    	if startDate and endDate and tonumber(startDate) and tonumber(endDate) and (tonumber(startDate) <= tonumber(endDate)) then
    		if startYear == endYear then
    			table.insert(periods, startYear)
    		else
    			table.insert(periods, startYear .. '-' .. endYear)
    		end
		    istartDate = istartDate + 1
		    iendDate    = iendDate    + 1
		    
		    if startDates[istartDate] then
		    	startYear = formatDataWikidata(startDates[istartDate],dateOptions , {})
		    	startDate= startYear -- for now
		    else
		    	startYear	= nil
		    	startDate= nil
		    end
		    
		    if endDates[iendDate] then
		    	endYear = formatDataWikidata(endDates[iendDate],dateOptions , {})
		    	endDate= endYear -- for now
		    else
		    	endYear	= nil
		    	endDate= nil
		    end		    
		elseif startYear then
			table.insert(periods, 'ካብ ' .. startYear)
			
			istartDate = istartDate + 1
		    if startDates[istartDate] then
		    	startYear = formatDataWikidata(startDates[istartDate],dateOptions , {})
		    	startDate= startYear -- for now
		    else
		    	startYear	= nil
		    	startDate= nil
		    end			
		elseif endYear then
			table.insert(periods, 'ክሳብ ' .. endYear)
		    iendDate    = iendDate    + 1			
			
		    if endDates[iendDate] then
		    	endYear = formatDataWikidata(endDates[iendDate],dateOptions , {})
		    	endDate= endYear -- for now
		    else
		    	endYear	= nil
		    	endDate= nil
		    end				
		end
    end
	
	return table.concat(periods, '፣ ')
end

-- Internal functions

-- The following functions do much the same as the function
-- entityIdFormat of the Wikidata module.
-- p.getData fetches the entity data and p.toLink formats it.

function p.getData(value)
	if value and value['numeric-id'] then
	    local idEntity = 'Q' .. value['numeric-id']

        local label  = mw.wikibase.label( idEntity )
        local link    = mw.wikibase.sitelink( idEntity )	
        
        return link, label, idEntity 
    end
end

function p.linkInOtherLanguage(link, label, language)
	local category = '[[መደብ:ዊኪፐድያ:Pages with Wikidata properties tagged in another language]]'
	
	if link and label then
		return label .. ' <small>([[:' .. language .. ':' .. link .. '|' .. language .. ']])</small>' .. category
	elseif label then
		return label .. ' <small>(' .. language .. ')</small>' .. category
	elseif link then
		return link .. ' <small>([[:' .. language .. ':' .. link .. '|' .. language .. ']])</small>' .. category
	end
end

local alreadyLinked = {}

function p.toLink(link, label, idEntity, options)
	if not link and not label and not idEntity then
		return
	end
	
	if options then
		-- Label options
		
		if options.label and options.label ~= 'null' then		-- To find out where it is used.
			label = options.label
		end
		
		--if options['nameSpace'] then link = options['nameSpace'] .. ':' .. link end
		
		--  Convert the first character to uppercase in his case    
		if label and options['uppercase'] == 'yes' then
			label = ti:ucfirst(label)
		end
		
		-- Link options
		if options['link'] ==  'no'  then
			-- No p.toLink
			link = nil
		elseif options['itMustExist'] == 'yes' then
			-- Do not return anything if the Wikipedia article is not informed
			if not link then
				return
			end
		elseif options['link'] ==  'yes' then
			if not link and label and not require('Module:Page').exists(label) then
				-- Take the label as a link if the corresponding article does not exist
				link   = label
			end			
		end
	end
	
	-- Do not link the same thing several times
	if link and alreadyLinked[link] then
		link = nil
	end
	
	-- As reported by the label or link
	local result
	
    if label and link and label ~= link then --Both if they are not the same
       result = '[[' .. link .. '|' .. label .. ']]'
       alreadyLinked[link] = true
    elseif link then    -- Just the link or ambps and they are the same
        result = '[[' .. link .. ']]'
        alreadyLinked[link] = true
    elseif label then  -- Only the label
        result = label
    elseif idEntity then -- Only the entity
       -- Get the Wikidata tag and link from the English, French or German Wikipedia
       local entity=mw.wikibase.getEntityObject(idEntity)
       
       --if true then return require('Module:Tables').tostring(entity) end

       if entity then
       		local language
       		for k, language in pairs({'en', 'fr', 'it', 'de'}) do
       	  		label = tableElement(entity, 'labels', language, 'value')
       	  		link   = tableElement(entity, 'sitelinks', language .. 'wiki', 'title')
       	  		if label or link then
       	     		result = p.linkInOtherLanguage(link, label, language)
       	     		break
       	  		end
       		end
       	end
       
        if not result then
        	return '[[:d:'.. idEntity .. '|unlabeled]]' .. 
              '[[መደብ:ዊኪፐድያ:Pages with unlabeled Wikidata properties]]'
        end
    end
    
    -- Add italics
    
    if options and options.italics == 'yes' then
    	result = "''" .. result .. "''"
    end
    
    return result
end

function p.formatId( value, options )
	local wikidata = require('Module:Wikidata')
    local id =  'Q'.. value['numeric-id']
    local options = {separator = '<br>',property = options.propertyValue, one = 'yes', entityId = id, textFormat = 'uppercase'}
    return wikidata.getProperty(options)
end

function p.formatFlagcountry( value, options )
	local flag = require('Module:Flag')
	local id =  'Q'.. value['numeric-id']
	local label = mw.wikibase.label( 'Q' .. value['numeric-id'] ) or ''
	local kind = mw.ustring.gsub(label,'(%D+)%sde%s%D+','%1')
	
	 if options.cut and options.cut ~= '' then
        coincidence = mw.ustring.find( es:lc(options.cut), es:lc(kind), plain )
    end
    if coincidence then
    	name = mw.ustring.gsub(label,'%D+%sde%s(%D+)','%1')
    elseif label and label ~= '' then
    	name = label
    end
    return flag.luaFlag(id, '20px', '', name)
end
function p.formatInfobox( value, options )
	local infobox = require('Module:Infobox')
	local options = {propertyValue='P31'} 
	local label  = p.formatId( value, options)
	options.cut = label
	local parameters = {
		child = 'yes',
		labelstyle1 = 'border:0;font-weight:100;padding:0px 7px',
		datastyle1 = 'border:0;font-weight:100;padding:0px 7px 0px 2px', 
		label1='&bull;&nbsp;'.. ti:ucfirst(label),
		data1 = p.formatFlagcountry(value, options)}
    return infobox.infobox(parameters)
end

function p.idFormat ( value, options )
	return value['numeric-id'] and 'Q' .. value['numeric-id']
end

--*****************************************************************************
-- Functions for URL data types
--*****************************************************************************

function p.URLFormat(value, options, mount)
	return toLinkURL(value)
end

function p.twitterFormat(value, options, mount)
	return '[https://twitter.com/' .. value .. ' ' .. value .. ']'
end

function p.facebookFormat(value, options, mount)
	return '[https://www.facebook.com/' .. value .. ' ' .. value .. ']'
end

--*****************************************************************************
-- Format aliases to use in template property
--*****************************************************************************
p['flag']      = p['formatFlag']
p['facebook']  = p['facebookFormat']
p['twitter']   = p['twitterFormat']
p['url']       = p['URLFormat']

return p