モジュール: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