Dokumentation für das Modul LinkPhone[Ansicht] [Bearbeiten] [Versionsgeschichte] [Aktualisieren]

Das Modul stellt Funktionen zur Verlinkung von Telefonnummern bereit. Faxnummern werden überprüft, aber nicht verlinkt. Kommentare müssen hinter der Telefonnummer in Klammern angefügt werden.

Das Modul benutzt das Modul Modul:Link utilities/i18n zur Internationalisierung. Die Bedeutung der Teilarrays wird dort beschrieben.

Versionsbezeichnung auf Wikidata: 2024-06-30 Ok!

Benötigte weitere Module

Dieses Modul benötigt folgende weitere Module: Link utilities • Link utilities/i18n • Link utilities/Phone numbers

Verwendung in anderen Modulen

Dieses Modul ist notwendig für die Ausführung folgender Module. Bei Anpassungen sollte die Funktionstüchtigkeit der folgenden Module geprüft werden. Benutze dazu auch diese Tracking-Kategorie um Fehler zu finden, die sich dann auf Artikel auswirken:

Wartungskategorien

Beispiele

Text Code Ergebnis
+49 123 2 567.890 App. 5 {{#invoke:Phone|linkPhone|+49 123 2 567.890 App. 5}} +49 123 2 567.890 App. 5
+49 123 2 567.890 App. 5 {{#invoke:Phone|linkPhone|+49 123 2 567.890 App. 5|isFax=true}} +49 123 2 567.890 App. 5
+49 123 / 2 567.890 {{#invoke:Phone|linkPhone|+49 123 / 2 567.890}} +49 123 / 2 567.890 Category:Kontakt: Telefon mit Schrägstrich Telefon mit Schrägstrich
++49 (123) 2 56 78 90 ext. 34 (Bar) {{#invoke:Phone|linkPhone|++49 (123) 2 56 78 90 ext. 34 (Bar)}} +49 (123) 2 56 78 90 ext. 34 (Bar)
++49 0123 2 56 78 90 ext. 34 (Bar) {{#invoke:Phone|linkPhone|++49 0123 2 56 78 90 ext. 34 (Bar)|cc=+49}} +49 (0)123 2 56 78 90 ext. 34 (Bar)
+49 (0)123 2 56 78 90;ext=34 {{#invoke:Phone|linkPhone|1=+49 (0)123 2 56 78 90;ext=34}} +49 (0)123 2 56 78 90 ext 34
+49 (123) 2 56 78 90 Bar {{#invoke:Phone|linkPhone|+49 (123) 2 56 78 90 Bar}} +49 (123) 2 56 78 90 Bar Category:Kontakt: Ungültiges Telefonformat Ungültiges Telefonformat
+49 (0)123 VOYAGE {{#invoke:Phone|linkPhone|+''49'' (0)123 VOYAGE}} +49 (0)123 VOYAGE
(0)123 256 78 90 {{#invoke:Phone|linkPhone|(0)123 256 78 90}} (0)123 256 78 90 Category:Kontakt: Telefon ohne Ländervorwahl Telefon ohne Ländervorwahl
(0)123 256 78 90 {{#invoke:Phone|linkPhone|(0)123 256 78 90|cc=+49}} (0)123 256 78 90
123 256 78 90 (Bar) {{#invoke:Phone|linkPhone|123 256 78 90 (Bar)|cc=+49}} 123 256 78 90 (Bar) Category:Kontakt: Ungültiges Telefonformat Ungültiges Telefonformat
+49 (123) 2 56 78 90 (Lobby Bar), 0049 (123) 2 56 78 90 (Oasis Restaurant) {{#invoke:Phone|linkPhone|+49 (123) 2 56 78 90 (Lobby und Bar), 0049 (123) 2 56 78 91 (Restaurant)}} +49 (123) 2 56 78 90 (Lobby und Bar), +49 (123) 2 56 78 91 (Restaurant)
+49 (123) 2 56 78 90 oder +49 (123) 2 56 78 91 {{#invoke:Phone|linkPhone|+49 (123) 2 56 78 90 oder +49 (123) 2 56 78 91}} +49 (123) 2 56 78 90, +49 (123) 2 56 78 91
(212) 307 4100 (USA) {{#invoke:Phone|linkPhone|(212) 307 4100 (USA)|cc=+1}} (212) 307 4100 (USA)
+49-345-1234567 {{#invoke:Phone|linkPhone|+49-345-1234567|format=true}} +49 (0)345 123 45 67
+20-92-1234567 {{#invoke:Phone|linkPhone|+20-92-1234567|format=true|size=4}} +20 (0)92 123 4567
0800 12 34 56 (gebührenfrei) {{#invoke:Phone|linkPhone|0800 12 34 56 (gebührenfrei)|isTollfree=true}} 0800 12 34 56 (gebührenfrei)
112 {{LinkPhone | phone = 112 }} 112 Category:Kontakt: Telefon ohne Ländervorwahl Telefon ohne Ländervorwahl
112 {{LinkPhone | phone = 112 | cc=+49}} 112
112 {{LinkPhone | phone = 112 (Notruf) }} 112 (Notruf)
0900 12 34 56 (teure Servicenummer) {{#invoke:Phone|linkPhone|0900 12 34 56 (teure Servicenummer)}} 0900 12 34 56 (teure Servicenummer)

Fehlersuche

Im Fehlerfall wird neben der Fehlerkategorie auch ein ausgeblendeter Fehlertext hinter der Telefonnummer ausgegeben.

Beschreibung der Funktionen

local function formatNumber( number, size ) 
number: string;
size: integer >= 0;

Die Funktion formatiert die anzuzeigende Telefonnummer, die meist aus Wikidata bezogen wird. Die Bindestriche werden durch Leerräume ersetzt, die letzte Zifferngruppe wird mit Leerräumen aufgelockert und dadurch besser lesbar gemacht, und es wird, falls nötig, eine Verkehrsausscheidungsziffer an die Ortsvorwahl angefügt. Wenn size Null ist, werden keine Leerzeichen eingefügt.

local function checkNumberMatch( key, number ) 
key: string;
number: string;

Die Funktion prüft, ob die Telefonnummer einem Muster aus dem Array exceptions entspricht. Der Schlüssel, key, tollfree liefert Muster für gebührenfreie Nummern, service für Servicenummern und alle anderen Schlüssel Muster für länderspezifische Sondernummern. service erhält als Nummer den Kommentar zu einer Telefonnummer, wobei die Muster an beliebiger Stelle im Kommentar vorkommen können.

function lp.linkPhoneNumber(s, args) 
s: string;
args: arguments array;

Die Funktion prüft und verlinkt eine einzelne Telefonnummer.

function lp.linkPhoneNumbers(args) 
args: arguments array;

Die Funktion spaltet eine Liste von Telefonnummern auf und übergibt jede einzelne Telefonnummer an lp.linkPhoneNumber.

  • extensions – Tabelle mit Mustern für Apparatekennzeichnern.
  • noZero – Tabelle mit den Landesvorwahlen der Länder oder Regionen, in denen keine Verkehrsausscheidungsziffer 0 verwendet wird.
  • exceptions – Tabelle mit Mustern für Telefonnummern, die ohne Landesvorwahl verwendet werden (können) und üblicherweise auch nur im Inland gültig sind. Im Fall des Schlüssels service muss einer der genannten Zeichenketten im Kommentar zur Telefonnummer stehen. Die Telefonnummern gebührenfreier Dienste (tollfree) müssen mit einem Muster des Schlüssels tollfree übereinstimmen. Für jedes Land einzeln mit der Landesvorwahl als Schlüssel kann ein Satz von Sondernummern angegeben werden, die ohne Landesvorwahl gültig sind und daher nur im Inland verwendet werden können.
  • formattingWikidatatrue erlaubt die Formatierung von Telefonnummern, die vorwiegend aus Wikidata stammen. Die Bindestriche werden durch Leerräume ersetzt, die letzte Zifferngruppe wird mit Leerräumen aufgelockert und dadurch besser lesbar gemacht, und es wird, falls nötig, eine Verkehrsausscheidungsziffer an die Ortsvorwahl angefügt.
  • addZerostrue schaltet die Behandlung von Verkehrsausscheidungsziffern ein. Bei Bedarf wird die Landesvorwahl ergänzt und die Verkehrsausscheidungsziffer 0 eingeklammert. Im Fall von false müssen alle Telefonnummern eine Landesvorwahl, aber in keinem Fall eine Verkehrsausscheidungsziffer besitzen.
Hinweise
-- module variable and administration local lp = { 	moduleInterface = { 		suite  = 'LinkPhone', 		serial = '2024-06-30', 		item   = 16354802 	} }  -- module import -- require( 'strict' ) local li = require( 'Module:Link utilities/i18n' ) local ln = require( 'Module:Link utilities/Phone numbers' ) local lu = require( 'Module:Link utilities' )  local function formatNumber( number, size ) 	if not li.options.formattingWikidata then 		return number 	end  	local pos, first, last, newLast, country, localCode, i  	number = number:gsub( '-', ' ' ) 	i, pos = number:find( '.* ' ) -- find last space 	if size > 0 and pos then 		first = number:sub( 1, pos ) 		last = number:sub( pos + 1, #number ) 		newLast = '' 		if tonumber( last ) then -- inserting additional spaces 			while ( #last > size + 1 ) do 				if newLast == '' then 					newLast = last:sub( -size ) 				else 					newLast = last:sub( -size ) .. ' ' .. newLast 				end 				last = last:sub( 1, #last - size ) 			end 			if newLast ~= '' then 				last = last .. ' ' .. newLast 			end 		end 		pos, i = first:find( ' ' ) 		if li.options.addZeros and pos and ( pos ~= #first ) then 			country = first:sub( 1, pos - 1 ) 			localCode = first:sub( pos + 1, #first ) 			if not ln.noZero[ country ] then 				localCode = localCode:gsub( '[%(%)]', '' ) 				if localCode:sub( 1, 1 ) == '0' then 					localCode = '(0)' .. localCode:sub( 2, #localCode )  				else 					localCode = '(0)' .. localCode 				end 				first = country .. ' ' .. localCode 			end 		end 		number = first .. last 	end 	return number end  -- look for phone-number patterns which are valid local numbers local function checkNumberMatch( key, number ) 	local ar = ln.exceptions[ key ] 	if not ar then 		return false 	end 	for i = 1, #ar, 1 do 		if number:find( ar[ i ] ) then 			return true 		end 	end 	return false end  local function extractExtension( number ) 	local ext = '' 	local t 	for i, extension in ipairs( li.extensions ) do 		t = mw.ustring.gsub( number, '^.*(' .. extension .. ')$', '%1' ) 		if t ~= number then 			ext = t:gsub( '%s*=', ' ' ) -- RFC 3966 			number = mw.ustring.gsub( number, '[%s%c]*(' .. extension .. ')$', '' ) 			break 		end 	end 	return number, ext end  -- handle a single phone number s function lp.linkPhoneNumber( s, args, isDemo ) 	local number = mw.text.trim( s ) 	if number == '' then 		return '' 	end 	local catPrefix = isDemo and ' [[:Category:' or '[[Category:'  	local ext = '' 	local extraCats = '' 	local comment, t 	args.cc = args.cc:gsub( '%-', '' )  	number, comment = lu.extractComment( number ) 	number, ext = extractExtension( number )  	-- normalize country calling code 	number = number:gsub( '^00+', '+' ) 		:gsub( '^%+%++', '+' )  	-- add country calling code, remove lead zero 	if args.cc ~= '' then 		if li.options.withCountryCode and number:sub( 1, 1 ) ~= '+' then 			number = args.cc .. ' ' .. number 		end 		if li.options.preventLeadZero and not ln.noZero[ args.cc ] then 			number = number:gsub( '^(%' .. args.cc .. '%s+)%(+0%)+', '%1' ) 				:gsub( '%(+', '' ):gsub( '%)+', '' ) 		end 	end  	local exception = checkNumberMatch( args.cc, 		mw.ustring.gsub( number, "[  '/%.%-%)]", '' ) )  	-- formatting phone numbers retrieved from Wikidata 	if args.format and not exception then 		number = formatNumber( number, args.size ) 	end  	if li.options.addZeros and not ln.zeroExceptions[ args.cc ] and not number:find( '^00' ) then 		number = number:gsub( '^0', '(0)' ) 	end 	if li.options.addZeros and args.cc ~= '' and not ln.zeroExceptions[ args.cc ] then 		number = number:gsub( '^(%' .. args.cc .. ')( *)0', '%1%2(0)' ) 	end  	-- plain is number for link 	local plain = number 	-- check if slashes are used 	if plain:find( '/', 1, true ) then 		extraCats = catPrefix .. li.categories.withSlash 	end  	-- remove delimiters -.()/' and spaces 	-- including thin space 	plain = mw.ustring.gsub( plain, "[  '/%.%-%)]", '' )  	-- handling country code including ++49, 0049 etc. 	if plain:sub( 1, 1 ) == '+' then 		plain = plain:gsub( '%(0', '' ) -- zero in parenthesis 			:gsub( '%(', '' ) 	else 		plain = plain:gsub( '%(0', '0' ) 		if comment ~= '' and checkNumberMatch( 'service', comment ) then 			exception = true 			number = number:gsub( '[%(%)]', '' ) 		elseif args.isTollfree and checkNumberMatch( 'tollfree', plain ) then 			exception = true 			number = number:gsub( '[%(%)]', '' ) 		elseif checkNumberMatch( args.cc, plain ) then 			exception = true 		elseif args.cc ~= '' then 			if ln.noZero[ args.cc ] then 				plain = args.cc .. plain:gsub( '^%(', '' ) 			elseif plain:sub( 1, 1 ) == '0' then 				plain = args.cc .. plain:gsub( '^0', '' ) 			else 				return s .. catPrefix .. li.categories.invalid 			end 		else 			return s .. catPrefix .. li.categories.noCC 		end 	end  	-- minimum 5 characters including country code 	if not exception and #plain < 5 then 		return s .. catPrefix .. li.categories.invalid 	end  	-- lower case letters for numbers are not allowed 	if plain:find( '%l' ) then 		return s .. catPrefix .. li.categories.invalid 	elseif plain:find( '%u' ) then 		-- substitude letters 		local letters = { '', '[A-C]', '[D-F]', '[G-I]', '[J-L]', '[M-O]', 			'[P-S]', '[T-V]', '[W-Z]' } 		for i = 2, 9 do 			plain = plain:gsub( letters[ i ], '' .. i ) 		end 	end  	-- remove zero from local area code 	if args.cc ~= '' and not ln.zeroExceptions[ args.cc ] then 		plain = plain:gsub( args.cc .. '0', args.cc ) 	end  	-- final test 	if not exception and not plain:match( '^%+%d+$' ) then 		return s .. catPrefix .. li.categories.invalid 	end  	-- assemble number, link, ext, comment, and categories 	t = '<span data-phone="' .. plain .. '" class="listing-phone-number' 	if not args.isFax then 		t = t .. ' plainlinks nourlexpansion' 		number = ( '[tel:%s %s]' ):format( plain, number ) 	end 	if exception then 		t = t .. ' listing-phone-exception" title="' .. li.categories.onlyDomestic 	end 	t = t .. '">' .. number .. '</span>'  	return t .. ( ext ~= '' and ( ' ' .. ext ) or '' ) .. 		( comment ~= '' and ( ' ' .. comment ) or '' ) .. extraCats end  function lp.linkPhoneNumbers( args ) 	local addNum = li.addNum 	if args.isFax then 		addNum = li.addNumFax 	end 	args.cc = args.cc:gsub( '^00', '+' ):gsub( '^%+%++', '+' )  	local ns     = mw.title.getCurrentTitle().namespace 	local isDemo = ns == 10 or ns == 828  	-- split separate numbers 	local items = lu.splitItems( args.phone, li.delimiters )  	-- analyse phone numbers 	local result = '' 	local i = 0 	local s 	for j, item in ipairs( items ) do 		s = lp.linkPhoneNumber( item, args, isDemo ) 		if s ~= '' then 			if result == '' then 				result = s 			else 				if i == addNum then 					result = result .. '<span class="listing-add-contact">' 				end 				result = result .. li.texts.comma .. s 			end 			i = i + 1 		end 	end 	if i > addNum then 		result = result .. '</span>' 	end 	return result; end  function lp.getTrunkPrefix( cc ) 	return ln.noZero[ cc ] and '' or '0' end  return lp