モジュール:Find sources
このLuaモジュールは155,000以上のページで使われています。 余計な混乱やサーバーへの負荷を避けるために、どんな変更でも最初はモジュールのサンドボックス・サブページ、テストケース・サブページで試すべきです。そうすれば、試した変更を1度の編集でこのモジュールに加えることができます。しかし、最初にあなたの提案した変更を、この項目のノートで議論するようにお願いします。 |
このモジュールは編集者の文献検索を手伝う検索リンクの一覧を生成します。{{Find sources}}などのテンプレートを実装しており、新しいリンクの追加は簡単にできます。
使用法
ウィキテキストから呼び出す
ウィキテキストで使用する場合、一般的には{{Find sources}}などのテンプレートを経由しますが、#invokeで直接呼び出すこともできます。例:
{{#invoke:Find sources|テンプレート|キーワード1|キーワード2|...}}
- テンプレートは呼び出すテンプレートの名前を指定します(入力必須)。名前空間は入力せず、大文字と小文字は区別されます。例えば、Template:Find sourcesの場合は必ず「Find sources」と指定します(「find sources」ではエラーになります)。
- キーワード1、キーワード2は検索キーワードを指定します。1つ目のキーワードは引用符(
"
)つき(完全一致検索)で、それ以降のキーワードは引用符はつきません。キーワードは省略でき、1つも指定しなかった場合はページ名が検索キーワードになります。
title引数を指定することで、特定のページ名を検索キーワードに変換することができます。曖昧さ回避の括弧つきの場合、括弧の前が引用符("
)つきで、括弧の中身が2つ目以降のキーワードになります。
{{#invoke:Find sources|テンプレート|title=タイトル}}
- テンプレートは上記と同じく、呼び出すテンプレートの名前を指定します(入力必須)。名前空間は入力せず、大文字と小文字は区別されます。例えば、Template:Find sourcesの場合は必ず「Find sources」と指定します(「find sources」ではエラーになります)。
- タイトルは検索キーワードに変換されるページ名です。キーワードが省略された場合に使用されるページ名と同様の扱いになります。
Luaから呼び出す
まず、モジュールを読み込みます。
local mFindSources = require('Module:Find sources')
続いて、下記のように関数を呼び出すことで検索リンクが返ってきます。
mFindSources._main(template, searchTerms)
- templateは#ウィキテキストから呼び出すと同様にテンプレート名を指定します(入力必須)。
- searchTermsは検索キーワードの配列を指定します。配列に含まれる値はそれぞれ検索キーワードを指定します。また、
title
のキーのみを含むテーブルが指定された場合、#ウィキテキストから呼び出す節でtitle引数を使用した場合と同一になります。この引数は省略できます。
例:
mFindSources._main('Find sources', {'アルベルト・アインシュタイン', '-"マリリン・モンロー"', '相対性理論', '科学'})
テンプレートを呼び出す
このモジュールで実装されたテンプレートは下記の通り。
テンプレート | 説明 | 例 | 設定 |
---|---|---|---|
Find sources | 主にノートページで使用される、全般的な出典検索テンプレート。 | 出典検索?: "キーワード" – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · ジャパンサーチ · dlib.jp · ウィキペディア図書館 | テンプレート設定、説明文 |
Find sources mainspace | 標準名前空間においてTemplate:特筆性などで使用される出典検索テンプレート。 | 出典検索?: "キーワード" – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL | テンプレート設定、説明文 |
Find sources video games japanese language | コンピュータゲーム記事のノートページで使用される出典検索テンプレート。 | ゲーム出典検索?: "キーワード" – Automaton · GameBusiness.jp · GameWatch · 4gamer · 電撃 · ファミ通 | テンプレート設定、説明文 |
新しいテンプレートの作成
このモジュールを利用する新しいテンプレートを作成する場合、設定モジュールとテンプレート自体を作成する必要があります。
テンプレートの設定モジュール
設定モジュールの名称は「モジュール:Find source/templates/テンプレート名」のようにしてください。例えば、Template:Find sourcesの設定モジュールはモジュール:Find sources/templates/Find sourcesにあります。なお、大文字と小文字は区別されます。
設定モジュールの内容は下記のようにしてください:
return {
blurb = "出典検索: $1 – $2",
introLink = {code = 'google'},
links = {
{code = 'google news', display = 'ニュース'},
{code = 'google scholar', display = 'スカラー'}
},
separator = '、',
isUsedInMainspace = true,
class = 'custom-class',
style = 'color: green; font-size: 110%;'
}
- blurb - テンプレートが生成する文字列のひな形を指定します(入力必須)。ひな形には$1と$2を含めるようにしてください。$1は1つ目のリンクを、$2はそれ以降のリンクを表します。
- introLink - 1つ目のリンクの#リンクテーブルを指定します(省略可)。リンクテーブルにdisplayのキーが含まれていない場合、代わりに検索キーワードが表示されます。blurb引数の$1に該当します。
- links - #リンクテーブルの配列を指定します(入力必須)。blurb引数の$2に該当します。
- separator - 検索リンクの区切り文字を指定します(省略可)。省略した場合、MediaWiki:Dot-separatorで指定された文字が使用されます。
- isUsedInMainspace - 記事名前空間(標準名前空間)で使用するテンプレートの場合、trueを指定します。指定しなかったテンプレートが記事名前空間で使用された場合、エラーメッセージが表示され、Category:誤った名前空間にテンプレートのあるページに追加されます。
- class - 表示する文字に適用するCSSクラス(省略可)。plainlinksクラスは既定で適用されます。
- style - 表示する文字に適用するCSSスタイル(省略可)。
設定モジュールを作成した後、新しいテンプレートがこのページに表示されるよう、モジュール:Find sources/templatesを更新してください。
リンクテーブル
設定モジュールのintroLinkとlinks引数にはリンクテーブルを指定します。リンクテーブルではcodeとdisplay引数を指定しますが、code引数は下記の一覧から選んでください(入力必須)。display引数はリンクに表示する文字を指定します(省略可)。display引数を省略した場合、introLinkのリンクは検索キーワードを、linksのリンクは検索リンクの設定モジュールにある既定値を表示します。
現時点で使用できる検索リンクのcodeは下記の通り。
コード | 説明 | 例 | 設定 | 備考 |
---|---|---|---|---|
.doc | DOCファイル | doc | リンク設定、説明文 | Google 検索でDOCファイルに限定して検索します。 |
4gamer | 4Gamer.net | 4gamer | リンク設定、説明文 | サイト内の記事検索。 |
Automaton | AUTOMATON | Automaton | リンク設定、説明文 | ゲームメディア『AUTOMATON』サイト内の記事検索。 |
J-STAGE | J-STAGE | J-STAGE | リンク設定、説明文 | 大量の日本語論文データがあり、オープンアクセスの論文も多数。主に科学系をカバー。 |
NDL | NDL | NDL | リンク設定、説明文 | 国立国会図書館を検索します。 |
ac.jp | ac.jpドメイン | ac.jp | リンク設定、説明文 | Google 検索でac.jpドメインに限定して検索します。 |
cinii | CiNii | CiNii | リンク設定、説明文 | 大量の日本語論文データがあり、オープンアクセスの論文も多数。 |
dlib.jp | dlib.jp | dlib.jp | リンク設定、説明文 | ディープライブラリプロジェクト。日本の図書館を検索します。 |
edu | eduドメイン | edu | リンク設定、説明文 | Google 検索でeduドメインに限定して検索します。 |
gamewatch | GAME Watch | gamewatch | リンク設定、説明文 | サイト内の記事検索。 |
go.jp | go.jpドメイン | go.jp | リンク設定、説明文 | Google 検索でgo.jpドメインに限定して検索します。 |
Google 検索 | リンク設定、説明文 | トピックによってはページランクにより資料を探すのが難しくなっています。 | ||
google books | Google ブックス | 書籍 | リンク設定、説明文 | 一部の書籍では本文までサーチし、日本語圏でも一定の有用性があります。 |
google news | Google ニュース | ニュース | リンク設定、説明文 | 時事的なトピック、社会的に話題になるようなトピック向け。 |
google scholar | Google Scholar | スカラー | リンク設定、説明文 | 主に英語圏の論文検索向けで、日本語圏の網羅性は高くありません。 |
japan search | ジャパンサーチ | ジャパンサーチ | リンク設定、説明文 | 日本の図書館や研究機関のデータベースを検索できます。 |
PDFファイル | リンク設定、説明文 | Google 検索でPDFファイルに限定して検索します。 | ||
ppt | PPTファイル | ppt | リンク設定、説明文 | Google 検索でPPTファイルに限定して検索します。 |
wikipedia library | ウィキペディア図書館 | ウィキペディア図書館 | リンク設定、説明文 | 検索リンクではなく、ウィキペディア図書館で閲覧できる文献の一覧ページになっています。 |
ファミ通 | ファミ通 | ファミ通 | リンク設定、説明文 | サイト内の記事検索。 |
電撃 | 電撃オンライン | 電撃 | リンク設定、説明文 | サイト内の記事検索。 |
テンプレートページ
テンプレートページは下記のように作成してください。
{{#invoke:Find sources|テンプレート名}}<noinclude> {{#invoke:Find sources/autodoc|テンプレート名}} </noinclude>
上記のように作成することで、テンプレートが正しく動くとともに解説文が自動生成されます。テンプレートにはテンプレート名を入力してください。なお、先頭の名前空間「Template:」は入力せず、大文字と小文字は区別されます。
自動生成される解説文を使用しない場合は代わりに下記のように作成して、/docサブページも作成してください。
{{#invoke:Find sources|template}}<noinclude> {{documentation}} </noinclude>
検索リンクの追加
新しい検索リンクを追加する場合、検索リンクの設定モジュールを作成します。設定モジュールの名前は「モジュール:Find sources/links/code」(codeにはリンクコードを指定します)のようにしてください。リンクコードはわかりやすくて短いものを指定してください。また、英数字を使用する場合は全て小文字にしてください。例えば、Google 検索のリンクコードは「google」で、その設定モジュールはモジュール:Find sources/links/googleにあります。
検索リンクの設定モジュールは下記のようになっています。
return {
url = '//www.google.com/search?q=$1',
display = 'Google',
separator = ','
}
- url - 検索リンクのリンク先(入力必須)。「$1」は検索キーワードを表します。
- display - 検索リンクに表示する文字の既定値(入力必須)。テンプレート側で表示する文字を指定しなかった場合に使用されます。
- separator - 検索キーワードの区切り文字(省略可)。既定値は「+」(半角スペースをURL向けにエンコードした文字)。
設定モジュールを作成した後、新しい検索リンクがこのページに表示されるよう、モジュール:Find sources/linksを更新してください。
解説文の自動生成
このモジュールを使用したテンプレートの解説文はモジュール:Find sources/autodocで自動生成することができます。自動生成には下記のページの内容が使われます。
- Template:Find sources documentation - 解説文のひな形
- テンプレートの設定モジュール - リンクコードの一覧と記事名前空間における使用可否
- テンプレートの説明文 - テンプレートの説明文とショートカット
- 検索リンクの説明文 - 検索リンクの説明文
テンプレートの説明文
テンプレートの説明文ページはテンプレートの設定モジュールの/autodocサブページとして作成します。テンプレート自体の出力に影響せず、説明文を出力するときに使われるだけなので、保護する必要性は低いです。下記のように指定します。
return {
shortcuts = {'ショートカット1', 'ショートカット2'},
description = '[[Wikipedia:削除依頼|削除依頼]]用',
docIntro = 'このテンプレートは[[Wikipedia:削除依頼|削除依頼]]に表示される検索リンクを生成します。'
}
- shortcuts - テンプレートショートカットの配列。解説文では{{Template shortcut}}を用いて表示します。
- description - テンプレートの説明文。テンプレートを呼び出すの節で表示されます。
- docIntro - 解説文のひな形の冒頭にある説明文の代わりに表示する説明(省略可)。既定で表示される説明文は「このテンプレートは出典資料検索用のリンクを生成します。」です。
検索リンクの説明文
検索リンクの説明文ページは検索リンクの設定モジュールの/autodocサブページとして作成します。検索リンク自体の出力に影響せず、説明文を出力するときに使われるだけなので、保護する必要性は低いです。下記のように指定します。
return {
description = '[[Google]]社が提供する検索エンジン',
notes = 'もっとも一般的に使用される検索リンク'
}
- description - 検索リンクの説明文(入力推奨)。テンプレートの解説文で表示される検索リンクの一覧と、このページの#リンクテーブルの節で使用されます。
- notes - 備考(省略可)。このページの#リンクテーブルの節で使用されます。
設定
このモジュールで使用されるメッセージはModule:Find sources/configとModule:Find sources/autodoc/configにあります。このモジュールをほかの言語に翻訳する場合に使用できます。なお、翻訳する場合はテンプレートやリンクの設定モジュールも翻訳するようにしてください。
-- This module implements {{find sources}} and other similar templates, and
-- also provides a mechanism to easily create new source-finding templates.
-- Define constants
local ROOT_PAGE = 'Module:Find sources'
local TEMPLATE_ROOT = ROOT_PAGE .. '/templates/' -- for template config modules
local LINK_ROOT = ROOT_PAGE .. '/links/' -- for link config modules
local CONFIG_PAGE = ROOT_PAGE .. '/config' -- for global config
-- Load required modules
local checkType = require('libraryUtil').checkType
local cfg = mw.loadData(CONFIG_PAGE)
local p = {}
local function maybeLoadData(page)
local success, data = pcall(mw.loadData, page)
return success and data
end
local function substituteParams(msg, ...)
return mw.message.newRawMessage(msg, ...):plain()
end
local function renderSearchString(searchTerms, separator, transformFunc)
-- This takes a table of search terms and turns it into a search string
-- that can be used in a URL or in a display value. The transformFunc
-- parameter can be used to transform each search term in some way (for
-- example, URL-encoding them).
local searchStrings = {}
for i, s in ipairs(searchTerms) do
searchStrings[i] = s
end
if transformFunc then
for i, s in ipairs(searchStrings) do
searchStrings[i] = transformFunc(s)
end
end
return table.concat(searchStrings, separator)
end
function p._renderLink(code, searchTerms, display)
-- Renders the external link wikicode for one link, given the link code,
-- a table of search terms, and an optional display value.
-- Get link config.
local linkCfg = maybeLoadData(LINK_ROOT .. code)
if not linkCfg then
error(string.format(
"'%s'は[[%s]]にリンク設定がないので無効なリンク引数です。",
code,
LINK_ROOT .. code
))
end
-- Make URL.
local url
do
local separator = linkCfg.separator or "+"
local searchString = renderSearchString(
searchTerms,
separator,
mw.uri.encode
)
url = substituteParams(linkCfg.url, searchString)
end
return string.format('[%s %s]', url, display or linkCfg.display)
end
function p._main(template, args)
-- The main access point from Lua.
checkType('_main', 1, template, 'string')
checkType('_main', 2, args, 'table', true)
args = args or {}
local title = mw.title.getCurrentTitle()
-- Get the template config.
local templateCfgPage = TEMPLATE_ROOT .. template
local templateCfg = maybeLoadData(templateCfgPage)
if not templateCfg then
error(string.format(
"テンプレート名'%s'に対応する設定モジュール[[%s]]が見つかりませんでした。",
template, templateCfgPage
))
end
-- Namespace check.
if not templateCfg.isUsedInMainspace and title.namespace == 0 then
local formatString = '<strong class="error">%s</strong>'
if cfg['namespace-error-category'] then
formatString = formatString .. '[[%s:%s]]'
end
return string.format(
formatString,
cfg['namespace-error'],
mw.site.namespaces[14].name,
cfg['namespace-error-category']
)
end
-- Get the search terms from the arguments.
local searchTerms = {}
for i, s in ipairs(args) do
searchTerms[i] = s
end
if not searchTerms[1] then
-- Use the current subpage name as the default search term, unless
-- another title is provided. If the page uses a disambiguator like
-- "Foo (bar)", make "Foo" the first term and "bar" the second.
local searchTitle = args.title or title.subpageText
local term, dab = searchTitle:match('^(.*) (%b())$')
if dab then
dab = dab:sub(2, -2) -- Remove parens
end
if term and dab then
searchTerms[1] = term
searchTerms[2] = dab
else
searchTerms[1] = searchTitle
end
end
searchTerms[1] = '"' .. searchTerms[1] .. '"'
-- Make the intro link
local introLink
if templateCfg.introLink then
local code = templateCfg.introLink.code
local display = templateCfg.introLink.display or renderSearchString(
searchTerms,
' '
)
introLink = p._renderLink(code, searchTerms, display)
else
introLink = ''
end
-- Make the other links
local links = {}
local separator = templateCfg.separator or cfg['default-separator']
local sep = ''
for i, t in ipairs(templateCfg.links) do
links[i] = sep .. p._renderLink(t.code, searchTerms, t.display) ..
(t.afterDisplay or '')
sep = t.separator or separator
end
links = table.concat(links)
-- Make the blurb.
local blurb = substituteParams(templateCfg.blurb, introLink, links)
local span = mw.html.create('span')
span
:addClass('plainlinks')
:addClass(templateCfg.class)
:cssText(templateCfg.style)
:wikitext(blurb)
return tostring(span)
end
setmetatable(p, { __index = function(t, template)
-- The main access point from #invoke.
-- Invocations will look like {{#invoke:Find sources|template name}},
-- where "template name" is a subpage of [[Module:Find sources/templates]].
local tname = template
if tname:sub(-8) == '/sandbox' then
-- This makes {{Find sources/sandbox|Albert Einstein}} work.
tname = tname:sub(1, -9)
end
return function(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = mw.site.namespaces[10].name .. ':' .. tname
})
return t._main(template, args)
end
end})
return p