コンテンツにスキップ

モジュール:Check ncid

半永久的に拡張半保護されているモジュール
モジュールの解説[表示] [編集] [履歴] [キャッシュを破棄]

このLuaモジュールは、与えられた文字列がNII書誌ID(NCID)として適切かどうかを検査します。先頭・末尾の空白文字類を除去した後の文字列が以下に示す条件をすべて満たしていれば検査に合格します。

  • 10文字からなる
  • 先頭2文字は「AA」「AB」「AN」「BA」「BB」「BC」「BD」「BN」のいずれか
  • その次の7文字は0から9までのいずれかの数字
  • 末尾の1文字(チェックディジット)はXもしくは0から9までのいずれかの数字
  • https://catill.bitbucket.io/CM/furoku2_1.html の「ID及びBHNT(前後誌データID)」の項に記載されているデータチェックに適合する

使い方

#invokeで呼び出す

{{#invoke:Check ncid|main| 検査対象の識別子 }}

テンプレートから当モジュールを使用する場合は、上記のようにしてmain関数を呼び出してください。検査に合格すればmain関数は空文字列を返し、不合格であれば文字列のerrorを返します。したがってテンプレート側で#if文や#switch文などを記述すれば、合格の場合と不合格の場合で処理を分けることができます。

他のモジュールから使用する

local result = require('モジュール:Check ncid').check_ncid(id)  -- idは検査対象の文字列

他のモジュールから当モジュールを利用する場合は、check_ncid関数を呼び出すことで検査を行えます。check_ncid関数は第1引数に渡された文字列について検査を行い、検査に合格すればブール値のtrueを返し、不合格であればブール値のfalseを返します。

関連項目

require('strict')
local p = {}

function p.check_ncid(id)
	--[[
	-- NII書誌ID(NCID)の検査を行う
	-- 文字列idがNCIDとして有効であればtrueを、
	-- そうでなければfalseを返す
	-- 検査方法については https://catill.bitbucket.io/CM/furoku2_1.html の「ID及びBHNT(前後誌データID)」の項を参照
	]]--
	id = id:match('^%s*([AB][A-DN]%d%d%d%d%d%d%d[%dX])%s*$')
	if not id then return false end
	
	local c1, c2 = id:byte(1, 2)
	if c1 == 65 and (c2 == 67 or c2 == 68) then
		return false	-- 'AC'もしくは'AD'で始まるidは無効
	end
	
	local work = (c1 - 64) % 10 * 9 + (c2 - 64) % 10 * 8
	for i= 3, 9 do
		work = work + tonumber(id:sub(i, i)) * (10 - i)
	end
	local c = id:sub(10, 10)
	
	return work % 11 == (c == 'X' and 10 or tonumber(c))
end

function p.main(frame)
	return p.check_ncid(frame.args[1] or '') and '' or 'error'
end

return p