モジュール:Official website

    提供:ManyoWiki

    このモジュールについての説明文ページを モジュール:Official website/doc に作成できます

    local makeUrl = require('Module:URL')._url
    
    local p = {}
    
    -- Wrapper for pcall which returns nil on failure.
    local function quickPcall(func)
    	local success, result = pcall(func)
    	if success then
    		return result
    	end
    end
    
    -- Gets the rank for a Wikidata property table. Returns 1, 0 or -1, in
    -- order of rank.
    local function getRank(prop)
    	local rank = prop.rank
    	if rank == 'preferred' then
    		return 1
    	elseif rank == 'normal' then
    		return 0
    	elseif rank == 'deprecated' then
    		return -1
    	else
    		-- No rank or undefined rank is treated as "normal".
    		return 0
    	end
    end
    
    -- Finds whether a Wikidata property is qualified as being in Japanese.
    local function isJapanese(prop)
    	local ret = quickPcall(function ()
    		for i, lang in ipairs(prop.qualifiers.P407) do
    			if lang.datavalue.value['numeric-id'] == 5287 then
    				return true
    			end
    		end
    		return false
    	end)
    	return ret == true
    end
    
    -- If prop is ended, return true.
    local function isEnded(prop)
    	if prop.qualifiers == nil then
    		return false
    	end
    	local a = prop.qualifiers.P582
    	if a == nil then
    		return false
    	end
    	return true
    end
    
    -- Fetches the official website URL from Wikidata.
    local fetchWikidataUrl
    fetchWikidataUrl = function()
    	-- Get objects for all official sites on Wikidata.
    	local websites = quickPcall(function ()
    		return mw.wikibase.getEntityObject().claims.P856
    	end)
    
    	-- Clone the objects in case other code needs them in their original order.
    	websites = websites and mw.clone(websites) or {}
    
    	-- Add the table index to the objects in case it is needed in the sort.
    	for i, website in ipairs(websites) do
    		website._index = i
    	end
    
    	-- Sort the websites, first by highest rank, and then by websites in the
    	-- Japanese language, then by the website's original position in the
    	-- property list. When we are done, get the URL from the highest-sorted
    	-- object.
    	table.sort(websites, function(ws1, ws2)
    		local r1 = getRank(ws1)
    		local r2 = getRank(ws2)
    		if r1 ~= r2 then
    			return r1 > r2
    		end
    		local e1 = isJapanese(ws1)
    		local e2 = isJapanese(ws2)
    		if e1 ~= e2 then
    			return e1
    		end
    		local f1 = isEnded(ws1)
    		local f2 = isEnded(ws2)
    		if f1 == true and f2 == false then
    			return false
    		end
    		if f2 == true and f1 == false then
    			return true
    		end
    		return ws1._index < ws2._index
    	end)
    	local url = quickPcall(function ()
    		return websites[1].mainsnak.datavalue.value
    	end)
    
    	-- Cache the result so that we only do the heavy lifting once per #invoke.
    	fetchWikidataUrl = function ()
    		return url
    	end
    
    	return url
    end
    
    -- Render the URL link, plus other visible output.
    local function renderUrl(options)
    	if not options.url and not options.wikidataurl then
    		return '<strong class="error">' ..
    			'URLが見つかりません。ここでURLを指定するかウィキデータに追加してください。' ..
    			'</strong>'
    	end
    	local ret = {}
    	ret[#ret + 1] = string.format(
    		'<span class="official-website">%s</span>',
    		makeUrl(options.url or options.wikidataurl, options.display)
    	)
    --	if options.wikidataurl and not options.url then
    --		local entity = mw.wikibase.getEntityObject() or {}
    --		local qid = entity.id
    --		if qid then
    --			ret[#ret + 1] = '[[File:Blue pencil.svg |frameless |text-top |10px |alt=Edit this at Wikidata |link=https://www.wikidata.org/wiki/' .. qid .. '#P856|Edit this at Wikidata]]'
    --		end
    --	end
    	if options.format == 'flash' then
    		ret[#ret + 1] = mw.getCurrentFrame():expandTemplate{
    			title = 'Link note',
    			args = {note = '要[[Adobe Flash Player]]'}
    		}
    	end
    	if options.mobile then
    		ret[#ret + 1] = '(' .. makeUrl(options.mobile, '携帯') .. ')'
    	end
    	return table.concat(ret, ' ')
    end
    
    -- Render the tracking category.
    local function renderTrackingCategory(url, wikidataurl)
    	if mw.title.getCurrentTitle().namespace ~= 0 then
    		return ''
    	end
    	local category
    	if not url and not wikidataurl then
    		category = 'URLが指定されていない公式ウェブサイト'
    	elseif not url and wikidataurl then
    		return ''
    	elseif url and wikidataurl then
    		if url:gsub('/%s*$', '') ~= wikidataurl:gsub('/%s*$', '') then
    			category = 'ウィキペディアとウィキデータで異なる公式ウェブサイト'
    		end
    	else
    		category = 'ウィキデータにない公式ウェブサイト'
    	end
    	return category and string.format('[[Category:%s]]', category) or ''
    end
    
    function p._main(args)
    	local url = args[1] or args.URL or args.url
    	local wikidataurl = fetchWikidataUrl()
    	local formattedUrl = renderUrl{
    		url = url,
    		wikidataurl = wikidataurl,
    		display = args[2] or args.name or '公式ウェブサイト',
    		format = args.format,
    		mobile = args.mobile
    	}
    	return formattedUrl .. renderTrackingCategory(url, wikidataurl)
    end
    
    function p.main(frame)
    	local args = require('Module:Arguments').getArgs(frame, {
    		wrappers = 'Template:Official website'
    	})
    	return p._main(args)
    end
    
    return p