(Translated by https://www.hiragana.jp/)
Wikipedia:Lua - Wikipedia

2013ねん3がつから追加ついかされたMediaWiki拡張かくちょう機能きのうScribunto」の実装じっそうにより、ウィキペディア日本語にほんごばんではプログラミング言語げんごLua利用りようしたスクリプトを作成さくせいすることが可能かのうになりました。おもテンプレート機能きのう向上こうじょうさせる目的もくてき使用しようされ、Luaのソースコードテンプレートんで、{{#invoke:}}という構文こうぶん使つかってすことができます。Scribunto拡張かくちょうは2022ねん3がつ時点じてんでLua 5.1.5をサポートしています。

Luaのソースコードは、モジュール空間くうかんれいモジュール:Bananas)にかれます。そして、かくモジュールを、テンプレートとしてべつなページからせるようになっています(たとえば、モジュール:Bananas/docでは、{{#invoke:Bananas|hello}}とくことで、「Hello, world!」という出力しゅつりょくています)。

モジュールを実行じっこうする

編集へんしゅう

ウィキペディア一般いっぱんてきなウィキページでモジュール実行じっこうするには#invokeというパーサー関数かんすう(→Help:マジックワード)を使用しようします。#invokeのかたテンプレートのそれとているが、若干じゃっかんちがうところがあります。すなわち、#invokeでは「関数かんすうめい」を指定していする必要ひつようがあります。関数かんすうとは入力にゅうりょく取得しゅとくして処理しょりおこない、出力しゅつりょくかえ一連いちれん命令めいれいであり[ちゅう 1]、テンプレートとていますが、1つのページには1つのテンプレートしか定義ていぎできないのにたいし、1つのLuaモジュールには複数ふくすう関数かんすう定義ていぎできます。

また、Luaモジュールを直接ちょくせつ実行じっこうすることはできず、かならずモジュールの関数かんすうを1つえらんで実行じっこうしなければなりません。モジュールは関数かんすうのコンテナにすぎず、それ自体じたいなにもしません。そのため、関数かんすうめい指定していする必要ひつようがあります。

ウィキページでモジュールを実行じっこうするには{{#invoke:モジュールめい|関数かんすうめい}}のようにきます。

たとえば、モジュール:Bananasの"hello"関数かんすう実行じっこうするためには下記かきのようにきます。

  • {{#invoke:Bananas|hello}} → Hello, world!

引数ひきすうわた

編集へんしゅう

モジュールに引数ひきすうわたすときのかたはテンプレートに引数ひきすうわたかたおなじです。しかし、1つのパイプ"|"のうしろにくのは関数かんすうめいなので、1つ名無なな引数ひきすうは2つのパイプのうしろにかれます: {{#invoke:モジュールめい|関数かんすうめい|1つ名無なな引数ひきすう|2つ名無なな引数ひきすう|引数ひきすうめい=引数ひきすう}}

たとえば、モジュール:BananasArgsの"hello"関数かんすうでは1つ名無なな引数ひきすう指定していによって出力しゅつりょくちがいます。

  • {{#invoke:BananasArgs|hello|Kate}} → Hello, Kate!
  • {{#invoke:BananasArgs|hello|Fred}} → Hello, Fred!

BananaArgsの"count_fruit"関数かんすうではbananasapples引数ひきすうれます。

  • {{#invoke:BananasArgs|count_fruit|apples=3|bananas=4}} → I have 4 bananas and 3 apples
  • {{#invoke:BananasArgs|count_fruit|bananas=5|apples=2}} → I have 5 bananas and 2 apples

おおくのモジュールには解説かいせつサブページがあり、使つかえる引数ひきすうとその効果こうか説明せつめいします。

サンプルモジュール

編集へんしゅう

Luaスクリプトの作成さくせい依頼いらい

編集へんしゅう

ウィキペディア日本語にほんごばん特定とくていのタスクをおこなうためにLuaスクリプトが必要ひつようになった場合ばあいプロジェクト:ウィキ技術ぎじゅつにて依頼いらい提出ていしゅつすることができます。

導入どうにゅうまでの経緯けいい

編集へんしゅう

Luaは長年ながねんにわたる議論ぎろんて、2012ねんにテストようとしてtest2.wikipedia.org導入どうにゅうされ、すべての編集へんしゅうしゃ試験しけん運用うんようすすめるらせがされました(2012ねん8がつのおらせ参照さんしょう)。その、Luaはウィキメディアのテストウィキとmediawiki.orgでの試験しけん運用うんようて、2013ねん2がつにウィキペディア英語えいごばん導入どうにゅうされ、3月にはウィキペディア日本語にほんごばん導入どうにゅうされました(2013ねん3がつのおらせ参照さんしょう)。

Luaはデータの解析かいせきしき演算えんざん文字もじ書式しょしきなどを、オブジェクト指向しこうとしておこなえるスクリプト言語げんごです。言語げんご自体じたい理解りかいしやすいようシンプルになっていますが、ひょう動的どうてき関数かんすう添字そえじ文字もじれつ使つかえる連想れんそう配列はいれつなど、複雑ふくざつ構造こうぞう使つかえるようになっています。再帰さいきのような複雑ふくざつ構造こうぞうもとれますが、いたずらに複雑ふくざつなモジュールをつくって、第三者だいさんしゃだれ理解りかいできない、ということがないように注意ちゅういしてください。

以下いかに、モジュール:HelloWorldにあります、Hello, World!プログラムのソースコードをしめします。

-- WikipediaのLuaモジュールは、外部がいぶからアクセスできる関数かんすうれる変数へんすう
-- 宣言せんげんからはじめる必要ひつようがあります。この変数へんすう名前なまえなんでもよく、変数へんすうにデータをれることもできます。
local p = {};

-- そして、変数へんすう関数かんすう追加ついかします。そうすることで、Wikipediaから#invokeしてせるようになります。
-- frame変数へんすうには、にWikipediaからわたされるデータがはいります。
p.hello = function( frame )

    -- ローカル変数へんすう宣言せんげんして"Hello World!"に初期しょき
    local str = "Hello World!"

    -- str変数へんすう中身なかみをWikipediaがわもどして関数かんすう脱出だっしゅつします。
    -- printのような関数かんすう使つかえないので、出力しゅつりょくはこのように文字もじれつがえでやりりします。
    return str

-- hello関数かんすうわり
end

-- モジュールのわりでは、関数かんすうふくんだ変数へんすうをWikipediaがわかえします。
return p

-- こうすれば、{{#invoke: HelloWorld | hello }}のようなかたちでこのモジュールを使つかえます。
-- #invokeでは、直後ちょくごにモジュール自体じたい名前なまえつぎ引数ひきすう関数かんすうめいわたします。

MediaWikiでLuaを使つかうえでのガイドが、mw:Extension:Scribunto/Lua reference manual/jaにあります(翻訳ほんやく途中とちゅう)。

ユニットテスト

編集へんしゅう

ウィキペディアにおけるLuaスクリプトのユニットテストをおこなうためのフレームワークはモジュール:UnitTestsにあります。このフレームワークでは特定とくてい入力にゅうりょくでスクリプトを実行じっこうし、出力しゅつりょく予想よそうおなじであるかを確認かくにんできます。ユニットテストはスクリプトの変更へんこうによりしょうじる問題もんだい早期そうき発見はっけんできます。

慣例かんれいでは特定とくていのモジュール(れい: モジュール:Bananas)のユニットテストはtestcasesサブページ(れい: モジュール:Bananas/testcases)にかれ、モジュール‐ノート:Bananas/testcases{{#invoke: Bananas/testcases | run_tests}}のように実行じっこうします。テストようメソッドの名前なまえかならず"test"ではじまります。下記かきModule:Bananas/testcasesより簡単かんたんれいを1つしるします。

-- [[Module:Bananas]]のユニットテストれいです。ノートをクリックして動作どうさ確認かくにんをしてください。
local p = require('Module:UnitTests')

function p:test_hello()
    self:preprocess_equals('{{#invoke:Bananas | hello}}', 'Hello, world!')
end

return p

ユニットテストが作成さくせいされたモジュールの一覧いちらん特別とくべつ:リンクもと/モジュール:UnitTestsをご参照さんしょうください。

Wikipedia固有こゆうのポイント

編集へんしゅう

概要がいよう

編集へんしゅう

Luaの入力にゅうりょくとしては、{{#invoke:}}わたされたテキストの引数ひきすうと、frameにある関数かんすうぐんだけがウィキペディアから情報じょうほうるために使つかえます。そして、Luaからの出力しゅつりょくでは、テンプレートなど{{...}}くようなものをふくむことはできません。さらに、Luaの実行じっこう時間じかんは10びょう以内いないという制限せいげんもあります(ページのソースをれば、処理しょり時間じかん確認かくにんできます)。また、通常つうじょうのLuaからけずってある関数かんすうもいろいろとあります(mw:Extension:Scribunto/Lua reference manual#Differences from standard Lua詳細しょうさいがあります)。

Luaへの入力にゅうりょく

編集へんしゅう

ScribuntoにおけるLuaの実行じっこうは、ページのパースおこなわれるので、ページにんだ情報じょうほう以外いがい使つかうこと、たとえば入力にゅうりょくボックスをつくって入力にゅうりょくさせるとか、マウスの位置いち検出けんしゅつするとかといったことは不可能ふかのうです。Luaの入力にゅうりょくとしては、のページをトランスクルードすることはできますが、SVGファイルをふくめメディアファイルやカテゴリの中身なかみ特別とくべつページ内容ないよう取得しゅとくできません。

ウィキテキスト

編集へんしゅう

いわゆるパイプのうらわざ[[Wikipedia:ヘルプ|]])は、Luaの出力しゅつりょくちゅうでは適用てきようされないので、[[Wikipedia:ヘルプ|ヘルプ]]のように省略しょうりゃくしないかたち必要ひつようがあります。また、~~~~署名しょめい展開てんかいされることもありません。べつなテンプレートのし、マジックワード、条件じょうけんぶんなど{{...}}くものや、<ref><nowiki>といった、MediaWikiがわ処理しょりするタグも、Luaの出力しゅつりょくちゅうでは処理しょりされません。

モジュールのインポート

編集へんしゅう

モジュール名前なまえ空間くうかんにあるべつのLuaスクリプトを使つかいたい場合ばあいrequire()使つかいます。

extern_hello=require("モジュール:HelloWorld")としてモジュールをんだじょうで、extern_hello.hello()のようにします。

Luaを使用しようするテンプレート

編集へんしゅう

Luaを使用しようするテンプレートの解説かいせつサブページには{{Lua}}テンプレートを追加ついかしてください。Luaが使用しようされていることを明示めいじできます。

注釈ちゅうしゃく

編集へんしゅう
  1. ^ ウィキページで実行じっこうする関数かんすうでは出力しゅつりょくを1つだけかえすことが大半たいはんです。出力しゅつりょくを2つ以上いじょうかえ関数かんすう一般いっぱんてきにはウィキページで実行じっこうすることを想定そうていしておらず、ほかのモジュールや引数ひきすう実行じっこうすることを想定そうていしています。

関連かんれん項目こうもく

編集へんしゅう

ウィキペディアないのページ

編集へんしゅう

MediaWikiにおける解説かいせつページ

編集へんしゅう