モジュールの解説[表示] [編集] [履歴] [キャッシュを破棄]

はじめに 編集

このモジュールは、{{twitter}},{{facebook}}や{{instagram}} とそれに関連した POST 系({{twitter status}} and likewise )で共通して使用される機能を提供します。

提供する機能

  1. Wikidata 上のプロパティから ID を参照(例:Xのユーザー名 、 idProp=P2002)
  2. Wikidata 上のプロパティから URL フォーマットを参照した整形(例:書式指定URL、 formatterProp=P1630))
  3. 参照する Wikidata 上の項目を明示的に切替(例:ウィキペディア (Q52)、from=Q52;既定値は現在の項目)
  4. Wikidata 上のプロパティの未登録や値の不一致を検査して追跡カテゴリに登録
  5. ラベル文字列の lang 属性の展開(<span xml:lang="{{{lang}}}" lang="{{{lang}}}">ラベル文字列</span>、{{lang}}相当)
  6. ラベル文字列が ’ (id)’ で終わっていた場合の、重複表示抑制(Template:Twitter#使用例参照)。

機能と仕様(特にパラメータの仕様)は今後の議論により変更される可能性があります。

使用法 編集

{{#invoke:SNS-Utils|main| ... }} または require( 'モジュール:SNS-Utils' ).main( ... )

使用例(案) 編集

既存のテンプレートの互換実装例(提案段階なのでフォーマットや変数の仕様は変更される可能性があります)

{{Twitter}} ⇒ NAME (@ID) - X(旧Twitter)
テンプレートからの使用例(マイクロテンプレート版)
 {{#invoke:SNS-Utils|main
|id = {{{1|{{{id|}}}}}}        <!-- 別名処理の展開は呼び出し側で行う必要があります。 -->  
|name = {{{2|{{{name|}}}}}}
|lang = {{{lang|}}}
|idProp = P2002
|from = {{{from}}}
|formatterProp = P1630
|account_pre = &nbsp;(@
|account_post = )
|templ = Template:Twitter/tmpl
}}
Template:Twitter/tmplの内容[{{{url}}} {{{name}}}]{{{account}}} - Twitter
テンプレートからの使用例(穴埋め版)
{{#invoke:SNS-Utils|main
|id = {{{1|{{{id|}}}}}}
|name = {{{2|{{{name|}}}}}}
|lang = {{{lang|}}}
|idProp = P2002
|from = {{{from}}}
|formatterProp = P1630
|account_pre = &nbsp;(@
|account_post = )
|page = [[Twitter]]
}}
Luaモジュールからの使用例
require("Module:SNS-Utils").main({
			id = args[1] or args.id,
			name = args[2] or args.name,
			idProp = "P2002",
			formatterProp = "P1630",
			proc = ( function(a) 
				return mw.ustring.format('[%s %s] (@%s) - [[Twitter]]', a.url, a.name, a.id); 
				end )
			})
{{Facebook}} ⇒ NAME (ID) - Facebook
テンプレートからの使用例
{{#invoke:SNS-Utils|main|id={{{1|}}}|name={{{2|{{{name|}}}}}}|lang={{{lang|}}}|idProp=P2013|from={{{from}}}|formatterProp=P1630|page=[[Facebook]]}}
Luaモジュールからの使用例
require("Module:SNS-Utils").main({
			id = args[1] or args.id,
			name = args[2] or args.name,
			idProp = "P2013",
			formatterProp = "P1630",
			proc = ( function(a) 
				return mw.ustring.format('[%s %s] - [[Facebook]]', a.url, a.name); 
				end )
			})
{{Instagram}} ⇒ NAME (@ID) - Instagram
テンプレートからの使用例
{{#invoke:SNS-Utils|main|id={{{1|{{{id|}}}}}}|name={{{2|{{{name|}}}}}}|lang={{{lang|}}}|idProp=P2003|from={{{from}}}|formatterProp=P1630|account_pre=&nbsp;(|account_post=)|page=[[Instagram]]}}
Luaモジュールからの使用例
require("Module:SNS-Utils").main({
			id = args[1] or args.id,
			name = args[2] or args.name,
			idProp = "P2003",
			formatterProp = "P1630",
			proc = ( function(a) 
				return mw.ustring.format('[%s %s] (%s) - [[Instagram]]', a.url, a.name, a.id); 
				end )
			})
{{Ameba ブログ}} ⇒ NAME - Ameba Blog'
テンプレートからの使用例
{{#invoke:SNS-Utils|main|id={{{1|{{{id|}}}}}}|name={{{2|{{{name|}}}}}}|lang={{{lang|}}}|formatter=http://ameblo.jp/$1|page=[[アメーバブログ|Ameba Blog]]}}
Luaモジュールからの使用例
require("Module:SNS-Utils").main({
			id = args[1] or args.id,
			name = args[2] or args.name,
			proc = ( function(a) 
				return mw.ustring.format('[http://ameblo.jp/%s %s] - [[アメーバブログ|Ameba Blog]]', a.id, a.name); 
				end )
			})
{{twitter status}} ⇒ POST_LABEL'
テンプレートからの使用例
{{#invoke:SNS-Utils|main|id={{{1|}}}|name={{{3|}}}|lang={{{lang|}}}|formatter=https://twitter.com/$1/status/{{{2|}}}}}
Luaモジュールからの使用例
require("Module:SNS-Utils").main({
			id = args[1] or args.id,
			name = args[3] or args.name,
			proc = ( function(a) 
				return mw.ustring.format('[https://twitter.com/%s/status/%s %s]', a.id, args[2] or args.post, a.name); 
				end )
			})

引数(案) 編集

展開されるウィキコード:[URL name]account_preアカウントaccount_post - page

のmain関数の引数
引数 説明 状態
アカウント id アカウント名。
{{{id}}}
postやstatusもidを使う。
リンク文字列 name 記事本文に表示するリンクの文字列。
{{{2|{{{name|{{PAGENAME}}}}}}}}
--
言語コード lang 記事本文に表示するリンクの文字列の言語コードを明示する時に使います。
{{{lang}}}
言語コードISO-639)(en, ja, fr, ain など) --
アカウントウィキデータプロパティ idProp 記事本文に表示するリンクの文字列。
P2002
fromでウィキデータの項目を明示することができる。
リンク元URL formatter URLのフォーマット。$1 が id で置き換えられる。
https://twitter.com/$1

formatterPropとは排他関係。

--
ウィキデータ項目 form ウィキデータを参照して id やURLのフォーマットを取得する時の項目を明示します(ウィキペディアであればQ52)。
Q52

idPropformatterPropと併用します。

name の既定値とすべきか検討中({{label}}に相当)。
URLウィキデータプロパティ formatterProp ウィキデータを参照してURLのフォーマットを取得する時にプロパティを指定します。
P1630

formatterとは排他関係。

--
アカウントに前置するコンテンツ account_pre リンクの右にアカウントを補う時に、リンクとアカウントの間に挟むコンテンツ
&nbsp(@

account_postと両方定義しないとアカウントも表示されない。

--
アカウントに後置するコンテンツ account_post リンクの右にアカウントを補う時に、アカウントとページの間に挟むコンテンツ
)

account_preと両方定義しないとアカウントも表示されない。

--
ページ page 右端に表示するページ案内(ツイッターアカウントなら Twitter
[[Twitter]]

省略すると、 ' - 'も表示しない。

' - ' は、account_postで兼用可能と考え検討中。
追跡カテゴリ category 「ウィキデータで未定義」「ウィキデータと値が違う」などの追跡を行います(仕様未定につき未実装)
文字列生成関数 proc Luaモジュールでのみ有効。
文字列を返す関数オブジェクトを与えます。この関数には、処理済みの id, name, account などが渡ります。
function(a)
	return mw.ustring.format(
		'[%s %s] (@%s) - [[Twitter]]',
		a.url, a.name, a.id);  
end
関数オブジェクト {{twitter status}}や{{facebook post}}のように追加の引数が必要な場合を考え id url name などの予約パラメータ以外は文字列生成関数にそのまま渡されます(未実装)。
文字列生成マイクロテンプレート templ テンプレートでのみ有効。
文字列を返すテンプレートの名前を与えます。このテンプレートには、処理済みの id, name, account などが渡ります。
Twitter/templ
テンプレートの内容
[{{{url}}} {{{name}}}]{{{account}}} - [[Twitter]]
テンプレート名 {{twitter status}}や{{facebook post}}のように追加の引数が必要な場合を考え id url name などの予約パラメータ以外はマイクロテンプレートにそのまま渡される(未実装)。
-- id 
-- name 
-- lang
-- idProp
-- formatter
-- formatterProp
-- from
-- account_pre
-- account_post
-- category (no impl.)

local libraryUtil = require('libraryUtil')

local SNS_Utils = {};

local checkType = libraryUtil.checkType

local function v(val)
	if val and #val > 0 then
		return val;
	else
		return nil;
	end
end

local function getWikidataProperty(property, from )
    local entity = nil;
    if v(from) then
    	entity = mw.wikibase.getEntityObject(from);
    else
    	entity = mw.wikibase.getEntityObject();
    end
    if not entity then
        return nil;
    end
    local claims = entity.claims or {};
    local hasProp = claims[property];
    if not hasProp then
        return nil;
    end
    return hasProp[1].mainsnak.datavalue.value;
end	

function SNS_Utils.dump(frame)
	return mw.dumpObject(frame);
end

function SNS_Utils.main(frame)
	local args = frame.args or frame;
	local id = v(args.id) or getWikidataProperty(args.idProp, args.from);
	local formatterURL = v(args.formatter) or mw.text.decode(getWikidataProperty(args.formatterProp, args.idProp));
	local urlF = function(i) return mw.ustring.gsub(formatterURL or "No formatterURL", "$1", i) end
	local nameF = function() return v(args.name) or mw.ustring.gsub(mw.title.getCurrentTitle().text or "No Title", "%s+%b()$", "%1") end
	local langF = function(lang, contents)
		return lang and mw.ustring.format('<span xml:lang="%s" lang="%s">%s</span>', lang, lang, contents) or contents 
	end
--	if v(args.lang) then
--		name = langF(args.lang,nameF())
--	end
	local account = '';
	if args.account_pre or args.account_post then
		account = args.account_pre .. id .. args.account_post;
	end
	if mw.ustring.match(nameF(), account .. '$') then
		account = '';
	end
	
	local argsF = function() return {
		url = urlF(id), 
		urlF = urlF;
		name = langF(args.lang, nameF()), 
		lang = args.lang,
		id = id, 
		account = account,
		getWikidataProperty = getWikidataProperty,
		} end
	if args.proc then
		return args.proc(argsF());
	end
	if args.templ then
		return frame:expandTemplate{ title = args.templ, args = argsF() }
	end
	return mw.ustring.format(args.page and '[%s %s]%s - %s' or '[%s %s]%s',
			urlF(id),
			langF(args.lang, nameF()),
			account,
			args.page);
end

return SNS_Utils;