このモジュールは、バージョン確認のために他モジュールを点検します。この関数は、一般的にはモジュールのインポートに使用されますが、ウィキボヤージュのモジュールにも提供されます。
関数
[編集]function fs._failsafe( version, moduleInterface )
パラメータ:
version
(bool or string or table
)nil or false
の時、バージョン確認はされず、モジュールに書かれているバージョンを参照します。string
が渡されている時、もしも'wikidata'
が渡されているならばウィキデータに保存されたバージョンを参照します。バージョン番号そのものが含まれている場合にはそのバージョンを使用します。取得したあるいは渡されたバージョン番号とモジュール内に書かれたバージョン番号を比較し、異なる場合は現在のバージョン番号が返り、そうでないならばfalse
が返ります。table
を渡された場合、frame
テーブルとして処理します。
moduleInterface
(table
)- モジュールの情報が入ったテーブル
戻り値:
- 現在のバージョンか、
false
が戻り値になります。
function fs.getModuleVersion( frame )
ウィキデータやモジュールに保存されたバージョンを提供し、可能ならばそれらが一致するか評価します。
moduleInterfaceの構造
[編集]local Modulname = { suite = 'Modulname', sub = 'Untermodul', serial = '2019-07-09', item = 12345678, -- ウィキデータID -- 以下も使われますが、何を想定したものかは不明です。 frame = false, ns = -9999, -- number; 現在の名前空間番号 nsDocs = -99999, -- number; 中央ドキュメントの名前空間番号 title = false, -- 現在のページのタイトルオブジェクト transl = false, subpages = ?, suffix = ?, swift = ?, start = ?, -- string; 定義されたpageDocRoot引数 script = ?, -- string; モジュール名(メイン) say = ?, -- string; メッセージキー specific = ?, -- string, optional; 追加の情報 collect = ?, lazy = ?, lead = ?, }
おそらくドイツ語版ウィキペディアのModul:Vorlage:LuaModuleDocにあるでしょう。
例
[編集]function fs._failsafe( nil, moduleInterface )
{{#invoke: {{BASEPAGENAME}} | failsafe }}
- モジュールからバージョンを提供します。
function fs._failsafe( 'wikidata', moduleInterface )
{{#invoke: {{BASEPAGENAME}} | failsafe | wikidata }}
- ウィキデータからバージョンを提供します。
function fs._failsafe( '2019-07-09', moduleInterface )
{{#invoke: {{BASEPAGENAME}} | failsafe | 2019-07-09 }}
- 渡されたバージョンとモジュールのバージョンを比較します。
{{#ifeq: {{#invoke:{{BASEPAGENAME}} | failsafe }} | {{#invoke:{{BASEPAGENAME}} | failsafe | wikidata }} | {{ombox | type = notice | image = [[Image:Blue check.svg|30px]] | text = モジュールは最新です }} }}
- ウィキデータに保存されているバージョンとモジュールに書かれているバージョンが一致するか評価します。
使用状況
[編集]このモジュールを使用しているテンプレートは以下の通りです:
この解説は、モジュール:Failsafe/docから呼び出されています。 (編集 | 履歴) 編集者は、このモジュールをサンドボックス (作成 | 複製)とテストケース (作成)で試すことができます。(解説) このモジュールのサブページ一覧。 |
-- module interface local Failsafe = { suite = 'Failsafe', serial = '2022-04-25', item = 65306115 } local strings = { docPage = 'doc', ok = '[[File:Artículo bueno.svg|16px|text-bottom|問題なし]]', notOk = '[[File:Symbol oppose vote.svg|15px|text-bottom|問題あり]][[Category:ウィキデータと実際のバージョンが異なるモジュール]]', versionText = 'ウィキデータでのバージョン:', noVersion = '有効なバージョンが見つかりませんでした' } -- modul variable and administration local fs = { moduleInterface = Failsafe } -- possible vaules of version -- nil, false: no version required -- string: string of version required -- table: frame table (template, #invoke) -- aModuleInterface -- table function fs._failsafe( version, aModuleInterface ) if type( aModuleInterface ) ~= 'table' then return false end local i, s, v -- check if version is a frame table if type( version ) == 'table' and type( version.args ) == 'table' then s = version.args[ 1 ] if not s and type( version.getParent ) == 'function' then i = version:getParent() if i then s = i.args[ 1 ] end end version = s end -- version should be a string if type( version ) == 'string' then -- check if empty string version = mw.text.trim( version ) if version == '' then version = nil end else version = nil end -- getting version from Wikidata if version == 'wikidata' then version = nil i = aModuleInterface.item if type( i ) == 'number' and i > 0 then s = mw.wikibase.getBestStatements( 'Q' .. i, 'P348' ) for i = 1, #s, 1 do if s[ i ].mainsnak.snaktype == 'value' then v = s[ i ].mainsnak.datavalue.value if v ~= '' then return v:gsub( '%.', '-' ) end end end end end if not aModuleInterface.serial then return false elseif not version or version <= aModuleInterface.serial then return aModuleInterface.serial else return false end end local function getModule( title ) return require( 'Module:' .. title ) end function fs.getModuleVersion( frame ) local result = strings.versionText .. ' ' .. strings.noVersion local fromModule, fromWikidata, m, success local title = mw.ustring.gsub( mw.title.getCurrentTitle().text, '/' .. strings.docPage, '' ) if title == 'Failsafe' then -- the module itself success = true m = fs else success, m = pcall( getModule, title ) end if success then if m.moduleInterface then fromModule = m.moduleInterface.serial fromWikidata = fs._failsafe( 'wikidata', m.moduleInterface ) end if fromWikidata or fromModule then result = strings.versionText .. ' <code>' .. ( fromWikidata or fromModule ) .. '</code>' if fromWikidata and fromModule then result = result .. ' ' .. ( fromWikidata == fromModule and strings.ok or strings.notOk ) end end end return result end return fs