モジュール:サンドボックス/本日晴天/仮リンク

require('strict')
local getArgs = require('モジュール:Arguments').getArgs
local yesno = require('モジュール:Yesno')
local lang_mapping = mw.loadData('モジュール:Wikipedia言語名/lang mapping')
local TEMPLATESTYLES = 'モジュール:サンドボックス/本日晴天/仮リンク/styles.css'
--------------------------------------------------------------------------------
-- BaseIllクラス（抽象クラス）
-- 日本語版記事の表示やカテゴリの出力などを実装
-- コンストラクタとmakeOtherLangLink()は派生クラスで実装する必要がある
--------------------------------------------------------------------------------
local BaseIll = {}
BaseIll.__index = BaseIll
function BaseIll:_init(args)
	-- 必須引数が指定されていない場合はエラーメッセージを表示する
	if args1 and args2 and args3 then
	else
		error('第1引数から第3引数までは必須です。')
	end
	
	self.args = args
	self.title = mw.title.new(args1)
	self.link = args1
	self.label = args.label
	self.preserve = yesno(args.preserve, true)
	self.preserveRedirect = self.preserve or yesno(args.redirect, true)
	
	self.jafix = args.jafix
	if self.jafix == '1' then
		self.jafix = '日本語版記事名を検討する必要があります。'
	end
	
	self.fixme = args.FIXME
	if self.fixme == '1' then
		self.fixme = 'このリンクは修正が必要です。'
	end
end
function BaseIll:setTitleStatus()
	if not self.title.exists then
		-- alt引数　alt1からalt4まで対応
		for i = 1, 4 do
			local altX = self.args'alt' .. i
			if not altX then
				break
			end
			local altXTitle = mw.title.new(altX)
			if altXTitle.exists then
				self.label = self.link
				self.title = altXTitle
				self.link = altX
				break
			end
		end
	end
	if self.title.exists then
		if self.fixme then
			-- FIXME引数指定
			self.titleStatus = 'fixme'
		elseif self.preserveRedirect and self.title.isRedirect then
			-- リダイレクトかつ、他言語版強制表示
			self.titleStatus = 'redirect'
		elseif self.preserve then
			-- 他言語版強制表示
			self.titleStatus = 'preserve'
		else
			self.titleStatus = 'resolved'
		end
	else
		self.titleStatus = 'unresolved'
	end
end
function BaseIll:export()
	local args = self.args
	local label = self.label
	local link = self.link
	
	local result = mw.html.create()
		:wikitext(
			mw.getCurrentFrame():extensionTag('templatestyles', , { src = TEMPLATESTYLES }),
			
		)
	
	if label and mw.title.equals(mw.title.new(label), self.title) then
		link = label
		label = nil
	end
	
	-- 日本語版の記事名を表示
	if yesno(self.args.nolink) and not self.title.exists then
		result:wikitext(mw.text.tag('span', { title = link }, label or link))
	else
		result:wikitext(, label)
		end
		result:wikitext()
	end
	
	if yesno(args.br, true) then
		result:wikitext()
	end
	
	result:wikitext(self:makeOtherLangLink())
	-- 訳語疑問点タグ
	if self.jafix then
		result:wikitext(
			'訳語疑問点'
			)
	end
	
	-- 要リンク修正タグ
	if self.fixme then
		result:wikitext('要リンク修正'
			)
	end
	
	result:wikitext()
	
	if args.this and not mw.title.equals(mw.title.new(args.this), mw.title.getCurrentTitle()) then
		-- args.thisが使われており、かつ現在のページ名がargs.thisの値と等しくない場合は
		-- カテゴリを付与しない
	else
		result:node(self:exportCategories())
	end
	
	return tostring(result)
end
function BaseIll:exportCategories()
	local sortkey
	local namespace = mw.title.getCurrentTitle().namespace
	
	if namespace % 2 == 0 then	-- ノートページ以外
		if namespace （'
		.. table.concat(t, '、')
		.. (args.add or )
		.. '）'
end
--------------------------------------------------------------------------------
-- IllVipnクラス（BaseIllを継承）
-- 用
-- 他言語版記事へのリンクを生成する部分を実装
--------------------------------------------------------------------------------
local IllVipn = setmetatable({}, { __index = BaseIll })
IllVipn.__index = IllVipn
function IllVipn.new(frame)
	local obj = setmetatable({}, IllVipn)
	obj:_init(getArgs(frame, { wrappers = '利用者:本日晴天/sandbox/Template:日本語版にない記事リンク', readOnly = true }))
	return obj
end
function IllVipn:makeOtherLangLink()
	local args = self.args
	local langCode = args2
	local pageName = args3
	
	-- 言語名を取得
	local langPage = lang_mapping.longlangCode 
	if not langPage then
		error('不明な言語コード"' .. langCode .. '"が指定されました。')
	end
	
	-- 言語短縮名を取得
	local langShort
	if (args.short == 'on') or yesno(args.short) then
		langShort = lang_mapping.shortlangCode
	end
	
	-- 言語名を表示
	local langLink
	if yesno(args.links) == false then
		langLink = langShort or langPage
	elseif langShort then
		langLink =  .. langShort .. 
	else
		langLink =  .. langPage .. 
	end
	
	return string.format(
		'（%s: %s%s）',
		langLink,
		langCode,
		langCode,
		pageName,
		args.interwikilabel or pageName,
		args.add or 
		)
end
--------------------------------------------------------------------------------
-- モジュールの出力
-- ill()は用、ill_vipn()は用
--------------------------------------------------------------------------------
local function ill(frame)
	local obj = Ill.new(frame)
	obj:setTitleStatus()
	return obj:export()
end
local function illVipn(frame)
	local obj = IllVipn.new(frame)
	obj:setTitleStatus()
	return obj:export()
end
return {
	ill = ill,
	ill_vipn = illVipn
}