モジュール:SignalinstWiki
このモジュールは、信号機Wiki内の独自テンプレート等で用いるLua関数群となっています。プログラミングに精通している方でLuaを読める方はこちらのメンテナンスも積極的に行っていただけると幸いです。逆に、普通に記事を書いたりする分には特にこちらを確認する必要はありません。
概要 編集
信号機Wiki内において独自に作成したテンプレートにおいて、そのテンプレート内で動的な情報を取得したりする場合において使用されます。信号機Wiki以外での利用は想定されていないため、ハードコーディングになっているものも散見されます。以下、各関数についての簡単な説明文を記します。
関数一覧 編集
全ての関数は、{{#invoke:SignalinstWiki|関数名|引数1|引数2|引数n|…}}から呼び出すことができます。
test(テスト用関数) 編集
通常使用しません。引数はありません。Hello Worldを返します。
getProperties(InfoBox Signal用) 編集
この関数は、「○○、××、△△」といった区切り文字によって区切られた複数のリストを加工し、Semantec MediaWikiのプロパティとして再利用可能な形に整形した書式を返します。
引数 編集
- propertyName: プロパティに使用する名前。通常タイトル。
- propertyValue: プロパティの列挙された値。変な文字が入っていると処理されません。
- propertySplit: 任意。区切り文字を指定します。この文字で区切られます。デフォルトは「、」です。
戻り値 編集
Semantec MediaWikiのプロパティとして有効な列挙文字列。
例 編集
{{#invoke:SignalinstWiki|getProperties|メーカー|小糸工業、京三製作所、日本信号、信号電材}}
→小糸工業、京三製作所、日本信号、信号電材
その他 編集
このドキュメントは実際のコードの最新の更新に追従できていない場合があります。ソースコードを読める方は直接モジュールを読んで理解していただいたほうがおそらく早いと思います。
何か不具合等がありましたらサーバー管理者までご連絡ください。
-- 万能系のLuaメソッドをモジュールとして定義する
local p = {} -- モジュール用パッケージを用意
--[[
テスト用関数
]]
function p.test(frame)
return "Hello World!"
end
--[[
指定した区切り文字で区切られたリストを認識し、その区切り文字で分解。
区切った後にその中身をSemantic Mediawikiのプロパティとして使用可能な
文字列にして返します。
例:「メーカー」というプロパティに「小糸工業、京三製作所、日本信号」と登録する場合
{{#invoke:SignalinstWiki|getProperties|メーカー|小糸工業、京三製作所、日本信号|、}}
]]
function p.getProperties(frame)
local propertyName = frame.args[1]
local propertyValue = frame.args[2]
local propertySplit = frame.args[3]
-- デフォルト値を指定
if propertyName == nil or propertyName == '' then return nil end
if propertyValue == nil or propertyValue == '' then return nil end
if propertySplit == nil or propertySplit == '' then propertySplit = "、" end
-- 元の propertyValue に「など」が含まれているかチェック
local hasNado = false
if string.find(propertyValue, "など") then
hasNado = true
end
-- Valueを分割
local splitValues = {}
local pattern = "(.-)" .. propertySplit
-- propertyValue の末尾に propertySplit を追加することで、最後の要素が正しく取得されるようにする
for part in string.gmatch(propertyValue .. propertySplit, pattern) do
-- 各要素の前後の空白をトリム(取り除く)
local trimmedPart = part:match("^%s*(.-)%s*$")
-- ここで「など」を空文字列に置き換える処理
-- 各部分から「など」を削除してからリストに追加する
trimmedPart = string.gsub(trimmedPart, "など", "")
if trimmedPart ~= '' then -- 空文字列でない場合のみ追加
table.insert(splitValues, trimmedPart)
end
end
-- Semantic Mediawiki のプロパティ形式に変換して連結する
local smwProperties = {}
for _, value in ipairs(splitValues) do
table.insert(smwProperties, "[[" .. propertyName .. "::" .. value .. "]]")
end
-- ここで最終的な文字列を構築
local finalOutput = table.concat(smwProperties, propertySplit)
-- もし元の propertyValue に「など」が含まれていた場合、最終出力の末尾に追加
if hasNado then
-- 結合された文字列が空でない場合のみ、区切り文字を付けて「など」を追加
if finalOutput ~= '' then
finalOutput = finalOutput .. "など"
else
-- 全くプロパティが生成されなかった場合でも「など」だけ返す
finalOutput = "など"
end
end
return finalOutput
end
function p.categoriesToTemplate(frame)
local args = {
title = "カテゴリ一覧",
opened = "False"
}
local categories = mw.text.trim(
frame:expandTemplate{ title = "カテゴリ一覧" } or ""
)
local i = 1
for category in mw.text.gsplit(categories, ",", true) do
category = mw.text.trim(category)
if category ~= "" then
local categoryName = mw.text.trim(
category:gsub("^カテゴリ:", "")
)
local pages = mw.text.trim(
frame:expandTemplate{
title = "カテゴリ別ページ一覧",
args = { category }
} or ""
)
args["header" .. i] = "[[:カテゴリ:"..categoryName.."|"..categoryName.."]]"
args["content" .. i] = pages
i = i + 1
end
end
return frame:expandTemplate{
title = "ナビゲーションボックス",
args = args
}
end
return p