モジュール:Check ncid
このLuaモジュールは、
- 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| 検査 対象 の識別子 }}
テンプレートからerror
を
他 のモジュールから使用 する
local result = require('モジュール:Check ncid').check_ncid(id) -- idは検査 対象 の文字 列
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