モジュール:学校コード検査

local p = {}
function p.Main( frame )
	-- 何も入力されてない場合、何も返さない
	if frame.args1 == nil or frame.args1 == "" then
		return ""
	else
	local targetid = frame.args1
	
	-- アルファベット大文字1 ＋　半角数字12桁から構成されているか確認
	if #targetid == 13 and string.match( targetid , "%u%d%d%d%d%d%d%d%d%d%d%d%d" ) ~= nil then
		-- それら13桁を分割
		local c_type = string.sub( targetid , 1 , 2 )
		local c_pref = string.sub( targetid , 3 , 4 )
		local c_div = string.sub( targetid , 5 , 5 )
		local c_scnf = string.sub( targetid , 6 , 6 )
		local c_ckd = string.sub( targetid , 13 , 13 )
		
		-- 最初2桁が「学校種」のいずれかに合致するか確認
		if ( c_type == "A1" or c_type == "A2" or c_type == "B1" or c_type == "C1" or c_type == "C2" or c_type == "D1" or c_type == "D2" or c_type == "E1" or c_type == "F1" or c_type == "F2" or c_type == "G1" or c_type == "H1" or c_type == "H2" ) and
		-- 3~4桁目が都道府県番号01~47のいずれかに合致するか確認
		( string.match( c_pref , "01-9" ) ~= nil or string.match( c_pref , "1-30-9" ) ~= nil or string.match( c_pref , "40-7" ) ~= nil ) and
		-- 5桁目が「設置区分」1〜3のいずれかに合致するか確認
		( c_div == "1" or c_div == "2" or c_div == "3" ) and
		-- 学校番号の確認。2桁目以降の数字に制限はないため、1桁目が0でないことのみ確認
		c_scnf ~= "0" then
			
			-- 検査数字の確認
			local ck_1 = 0
			local ck_2 = ""
				if string.sub( targetid , 1 , 1 ) == "A" then
					ck_2 = 1
				elseif string.sub( targetid , 1 , 1 ) == "B" then
					ck_2 = 2
				elseif string.sub( targetid , 1 , 1 ) == "C" then
					ck_2 = 3
				elseif string.sub( targetid , 1 , 1 ) == "D" then
					ck_2 = 4
				elseif string.sub( targetid , 1 , 1 ) == "E" then
					ck_2 = 5
				elseif string.sub( targetid , 1 , 1 ) == "F" then
					ck_2 = 6
				elseif string.sub( targetid , 1 , 1 ) == "G" then
					ck_2 = 7
				elseif string.sub( targetid , 1 , 1 ) == "H" then
					ck_2 = 8
				end
			local ck_3 = tonumber( string.sub( targetid , 2 , 2 ) )
			local ck_4 = tonumber( string.sub( targetid , 3 , 3 ) )
			local ck_5 = tonumber( string.sub( targetid , 4 , 4 ) )
			local ck_6 = tonumber( string.sub( targetid , 5 , 5 ) )
			local ck_7 = tonumber( string.sub( targetid , 6 , 6 ) )
			local ck_8 = tonumber( string.sub( targetid , 7 , 7 ) )
			local ck_9 = tonumber( string.sub( targetid , 8 , 8 ) )
			local ck_10 = tonumber( string.sub( targetid , 9 , 9 ) )
			local ck_11 = tonumber( string.sub( targetid , 10 , 10 ) )
			local ck_12 = tonumber( string.sub( targetid , 11 , 11 ) )
			local ck_13 = tonumber( string.sub( targetid , 12 , 12 ) )
			
			local ckd_1 = ck_1
			local ckd_2 = ""
			local ckd_3 = ck_3
			local ckd_4 = ""
			local ckd_5 = ck_5
			local ckd_6 = ""
			local ckd_7 = ck_7
			local ckd_8 = ""
			local ckd_9 = ck_9
			local ckd_10 = ""
			local ckd_11 = ck_11
			local ckd_12 = ""
			local ckd_13 = ck_13
			
			if ck_2 * 2 >= 10 then
				ckd_2 = ck_2 * 2 - 9
			else
				ckd_2 = ck_2 * 2
			end
			
			if ck_4 * 2 >= 10 then
				ckd_4 = ck_4 * 2 - 9
			else
				ckd_4 = ck_4 * 2
			end
			if ck_6 * 2 >= 10 then
				ckd_6 = ck_6 * 2 - 9
			else
				ckd_6 = ck_6 * 2
			end
			if ck_8 * 2 >= 10 then
				ckd_8 = ck_8 * 2 - 9
			else
				ckd_8 = ck_8 * 2
			end
			if ck_10 * 2 >= 10 then
				ckd_10 = ck_10 * 2 - 9
			else
				ckd_10 = ck_10 * 2
			end
			if ck_12 * 2 >= 10 then
				ckd_12 = ck_12 * 2 - 9
			else
				ckd_12 = ck_12 * 2
			end
			
			local ckd_sum = ckd_1 + ckd_2 + ckd_3 + ckd_4 + ckd_5 + ckd_6 + ckd_7 + ckd_8 + ckd_9 + ckd_10 + ckd_11 + ckd_12 + ckd_13
			local ckd_mod = ckd_sum % 10
			local ckd_result = ""
			if ckd_mod == 0 then
				ckd_result = 0
			else
				ckd_result = 10 - ckd_mod
			end
			
			if ckd_result == tonumber( c_ckd ) then
				return frame.args1
			else
				return ""
			end
		else
			return ""
		end
	else
		return ""
	end
	end
end
return p