モジュール:Find sources

半永久的に保護されているモジュール
モジュールの解説[表示] [編集] [履歴] [キャッシュを破棄]

このモジュールは編集者の文献検索を手伝う検索リンクの一覧を生成します。{{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 検索 Google リンク設定説明文 トピックによってはページランクにより資料を探すのが難しくなっています。
google books Google ブックス 書籍 リンク設定説明文 一部の書籍では本文までサーチし、日本語圏でも一定の有用性があります。
google news Google ニュース ニュース リンク設定説明文 時事的なトピック、社会的に話題になるようなトピック向け。
google scholar Google Scholar スカラー リンク設定説明文 主に英語圏の論文検索向けで、日本語圏の網羅性は高くありません。
japan search ジャパンサーチ ジャパンサーチ リンク設定説明文 日本の図書館や研究機関のデータベースを検索できます。
pdf PDFファイル 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で自動生成することができます。自動生成には下記のページの内容が使われます。

テンプレートの説明文

テンプレートの説明文ページはテンプレートの設定モジュールの/autodocサブページとして作成します。テンプレート自体の出力に影響せず、説明文を出力するときに使われるだけなので、保護する必要性は低いです。下記のように指定します。

return {
	shortcuts = {'ショートカット1', 'ショートカット2'},
	description = '[[Wikipedia:削除依頼|削除依頼]]用',
	docIntro = 'このテンプレートは[[Wikipedia:削除依頼|削除依頼]]に表示される検索リンクを生成します。'
}
  • shortcuts - テンプレートショートカットの配列。解説文では{{Template shortcut}}を用いて表示します。
  • description - テンプレートの説明文。テンプレートを呼び出すの節で表示されます。
  • docIntro - 解説文のひな形の冒頭にある説明文の代わりに表示する説明(省略可)。既定で表示される説明文は「このテンプレートは出典資料検索用のリンクを生成します。」です。

検索リンクの説明文

検索リンクの説明文ページは検索リンクの設定モジュールの/autodocサブページとして作成します。検索リンク自体の出力に影響せず、説明文を出力するときに使われるだけなので、保護する必要性は低いです。下記のように指定します。

return {
	description = '[[Google]]社が提供する検索エンジン',
	notes = 'もっとも一般的に使用される検索リンク'
}
  • description - 検索リンクの説明文(入力推奨)。テンプレートの解説文で表示される検索リンクの一覧と、このページの#リンクテーブルの節で使用されます。
  • notes - 備考(省略可)。このページの#リンクテーブルの節で使用されます。

設定

このモジュールで使用されるメッセージはModule:Find sources/configModule: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,
			'&nbsp;'
		)
		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