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

このモジュールは、メールアドレスを整形し、メール用のリンクを付け加えます。

コメントはメールアドレスの後に括弧で囲んで追加する必要があります。認識できないエラーが出ている場合、メールアドレスに左から右のマーク(通常@の前後またはメールアドレスの末尾)などの目に見えない制御文字が含まれていたり、ハイフンの文字が間違っている可能性があります。ソフトハイフン(U+00AD:「­」)やハイフンマイナス(U+002D:「-」)ではなくハイフン(U+2010:「‐」)を使用してください。また、全角になっていないかも注意が必要です。

ウィキデータでのバージョン: 2023-12-08 問題なし

使用状況

このモジュールを使用しているモジュールは以下の通りです:

このモジュールを使用しているテンプレートは以下の通りです:

メンテナンスカテゴリ

このモジュールは以下のメンテナンスカテゴリを使用します:

使用例

メールアドレス ウィキ構文 出力
cafe@xyz.hotel.com {{#invoke:LinkMail|linkMails|cafe@xyz.hotel.com}} cafe@xyz.hotel.com
café@xyz.hotel.com {{#invoke:LinkMail|linkMails|café@xyz.hotel.com}} café@xyz.hotel.com Category:Unicode文字を含んだメールアドレス
info.main@xyz.hotel-abc.com {{#invoke:LinkMail|linkMails|info.main@xyz.hotel-abc.com (情報)}} info.main@xyz.hotel-abc.com (情報) Category:無効なフォーマットのメールアドレス メールアドレスのフォーマットが無効です
info@xyz.hotel.com, reservation@xyz.hotel.travel {{#invoke:LinkMail|linkMails|info@xyz.hotel.com, reservation@xyz.hotel.travel}} info@xyz.hotel.comreservation@xyz.hotel.travel
info@$xyz.hotel.com {{#invoke:LinkMail|linkMails|info@$xyz.hotel.com}} info@$xyz.hotel.com Category:無効なフォーマットのメールアドレス メールアドレスのフォーマットが無効です

エラーが発生した場合、メンテナンスカテゴリに加えてメールアドレスの後にエラーメッセージが表示されます。

関数

function lm._isEmail( s )
s: string;

メールアドレス s が有効なフォーマットかどうかを調べます。

function lm._linkMail( m, args, ignoreUnicode )
m: string;
args: arguments array;
ignoreUnicode: boolean;

渡されたメールアドレスの有効性を確認して、有効ならばリンクを付けて返します.

function lm.linkMailSet( args )
args: arguments array;

この関数は複数のメールアドレスを切り分け、1つずつlm.linkMailに渡します。

function lm.linkMails( frame )
frame: frame object;

この関数は、ウィキテキスト内でのマジックワード呼び出しのインターフェースを提供します。

function lm.linkMailsTemplate( frame )
frame: frame object;

この関数はテンプレート呼び出しのインターフェースを提供します。

変数

  • lm.categories — エラーメッセージと同じ名前のカテゴリを含む配列
  • lm.delimiters — 電話番号の様々な区切り文字を含む配列。この配列に半角カンマを入れる必要はありません。
  • lm.addNum — 実際に表示されるメールアドレスの数。余分なアドレス(何もしなければ非表示のアドレス)はHTMLのソースに入っており、CSSスタイルを使うことで表示できます。

CSSクラス

このモジュールは以下のCSSクラスを使用します:

  • error — エラーメッセージに付与されるクラス
  • listing-check-recommended — 推奨される注意事項のクラス
  • listing-add-contact — 非表示のメールアドレスのクラス。メールアドレスが既定の数以上ある場合、余ったアドレスは非表示になりますが、HTMLのソーステキストには追加されます。

関連項目

-- module variable and administration
local lm = {
	moduleInterface =  {
		suite  = 'LinkMail',
		serial = '2023-12-08',
		item   = 65157414
	}
}

-- module import
-- require( 'strict' )
local li = require( 'Module:Link utilities/i18n' )
local lu = require( 'Module:Link utilities' )

-- check single email address
function lm._isEmail( s )
	local result = 2

	if s == nil or type( s ) ~= 'string' or #s > 254 or s:find( '%s' ) or
		s:find( '%.%.' ) or s:find( '%.@' ) or s:find( '@[%.%-]' ) or
		s:find( '%-%.' ) or s:find( '%.%-' ) or s:match( '^%.' ) then
		return 0
	end
	local repl, at = s:gsub( '@', '@' )
    if at ~= 1 then
    	return 0
    end

	at = s:find( '@' )
	local user = s:sub( 1, at - 1 )
	local domain = s:sub( at + 1, #s )
    if not user or not domain or #user > 64 or #domain > 253 then
    	return 0
    end

	-- handle user part
	if not mw.ustring.match( user, "^[%w!#&'/=_`{|}~%^%$%%%+%-%*%.%?]+$" ) then
		return 0
	end
	if not user:match( "^[%w!#&'/=_`{|}~%^%$%%%+%-%*%.%?]+$" ) then
		result = 1
	end

	-- handle domain part
	if not mw.ustring.match( domain, '^[%w%.%-]+%.%a%a+$' ) then
		return 0
	end
	if not domain:match( '^[%w%.%-]+%.%a%a+$' ) then
		result = 1
	end

	-- not yet analysed: texts in quotes in user part
	-- added on demand

	return result
end

function lm._linkMail( m, isDemo, ignoreUnicode )
	m = mw.text.trim( m )
	if m == '' then
		return ''
	end
	local catPrefix = '[[Category:'
	if isDemo then
		catPrefix = ' [[:Category:'
	end

	local comment = ''
	m, comment = lu.extractComment( m )

	m = m:gsub( 'mailto:', '' )
	local isEmail = lm._isEmail( m )
	local t
	if isEmail > 0 then
		t = '<span class="plainlinks nourlexpansion">[mailto:' .. m .. ' ' .. m .. ']</span>'
		if isEmail == 1 and not ignoreUnicode then
			t = t .. catPrefix .. li.categories.nonASCII
		end
	else
		t = m .. catPrefix .. li.categories.invalidMail
	end
	if comment ~= '' then
		t = t .. ' ' .. comment
	end
	return t
end

function lm.linkMailSet( args )
	args.email = args.email or args[ 1 ] or ''
	if args.email == '' then
		return ''
	end

	local ns     = mw.title.getCurrentTitle().namespace
	local isDemo = ns == 10 or ns == 828

	-- split separate email
	local items = lu.splitItems( args.email, li.delimiters )
		
	-- analyse emails
	local result = ''
	local i = 0
	local s
	for j, item in ipairs( items ) do
		s = lm._linkMail( item, isDemo, args.ignoreUnicode )
		if s ~= '' then
			if result == '' then
				result = s
			else
				if i == li.addMail then
					result = result .. '<span class="listing-add-contact">'
				end
				result = result .. li.texts.comma .. s
			end
			i = i + 1
		end
	end
	if i > li.addMail then
		result = result .. '</span>'
	end
	return result
end

-- #invoke call
function lm.linkMails( frame )
	return lm.linkMailSet( frame.args )
end

-- template call
function lm.linkMailsTemplate( frame )
	return lm.linkMailSet( frame:getParent().args )
end

return lm