モジュール:SNS-Utils/sandbox
表示
これはモジュール:SNS-Utils (差分)のモジュール・サンドボックスページです。 対応するテストケース・サブページ (実行) もご確認ください。 |
このモジュールは現在、Template‐ノート:Twitter#Luaモジュール化提案で仕様の話し合いが行われています。 |
このモジュールは現在有効性の検証のための試験実装の段階にあります(2016年5月)。 採用されるか否かは未定なので、標準名前空間(記事)や標準名前空間で現に参照されているテンプレート(及びモジュール)では使用しないでください。 |
はじめに
[編集]このモジュールは、{{twitter}},{{facebook}}や{{instagram}} とそれに関連した POST 系({{twitter status}} and likewise )で共通して使用される機能を提供します。
提供する機能
- Wikidata 上のプロパティから ID を参照(例:Xのユーザー名 、 idProp=P2002)
- Wikidata 上のプロパティから URL フォーマットを参照した整形(例:書式指定URL、 formatterProp=P1630))
- 参照する Wikidata 上の項目を明示的に切替(例:ウィキペディア (Q52)、from=Q52;既定値は現在の項目)
- Wikidata 上のプロパティの未登録や値の不一致を検査して追跡カテゴリに登録
- ラベル文字列の lang 属性の展開(<span xml:lang="{{{lang}}}" lang="{{{lang}}}">ラベル文字列</span>、{{lang}}相当)
- ラベル文字列が ’ (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 = (@ |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 = (@ |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= (|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
引数 | 説明 | 型 | 状態 | |
---|---|---|---|---|
アカウント | id
|
アカウント名。
|
行 | postやstatusもidを使う。 |
リンク文字列 | name
|
記事本文に表示するリンクの文字列。
|
行 | -- |
言語コード | lang
|
記事本文に表示するリンクの文字列の言語コードを明示する時に使います。
|
言語コード(ISO-639)(en, ja, fr, ain など) | -- |
アカウントウィキデータプロパティ | idProp
|
記事本文に表示するリンクの文字列。
|
行 | fromでウィキデータの項目を明示することができる。 |
リンク元URL | formatter
|
URLのフォーマット。$1 が id で置き換えられる。
formatterPropとは排他関係。 |
行 | -- |
ウィキデータ項目 | form
|
ウィキデータを参照して id やURLのフォーマットを取得する時の項目を明示します(ウィキペディアであればQ52)。
idProp,formatterPropと併用します。 |
行 | name の既定値とすべきか検討中({{label}}に相当)。 |
URLウィキデータプロパティ | formatterProp
|
ウィキデータを参照してURLのフォーマットを取得する時にプロパティを指定します。
formatterとは排他関係。 |
行 | -- |
アカウントに前置するコンテンツ | account_pre
|
リンクの右にアカウントを補う時に、リンクとアカウントの間に挟むコンテンツ
account_postと両方定義しないとアカウントも表示されない。 |
行 | -- |
アカウントに後置するコンテンツ | account_post
|
リンクの右にアカウントを補う時に、アカウントとページの間に挟むコンテンツ
account_preと両方定義しないとアカウントも表示されない。 |
行 | -- |
ページ | page
|
右端に表示するページ案内(ツイッターアカウントなら Twitter)
省略すると、 ' - 'も表示しない。 |
行 | ' - ' は、account_postで兼用可能と考え検討中。 |
追跡カテゴリ | category
|
「ウィキデータで未定義」「ウィキデータと値が違う」などの追跡を行います(仕様未定につき未実装) | ||
文字列生成関数 | proc
|
Luaモジュールでのみ有効。 文字列を返す関数オブジェクトを与えます。この関数には、処理済みの id , name , account などが渡ります。
|
関数オブジェクト | {{twitter status}}や{{facebook post}}のように追加の引数が必要な場合を考え id url name などの予約パラメータ以外は文字列生成関数にそのまま渡されます(未実装)。 |
文字列生成マイクロテンプレート | templ
|
テンプレートでのみ有効。 文字列を返すテンプレートの名前を与えます。このテンプレートには、処理済みの id , name , account などが渡ります。
|
テンプレート名 | {{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;