Modul:LinkPhone
Dieses Modul ist getestet und für den projektweiten Gebrauch geeignet. Es kann in Vorlagen benutzt und auf Hilfeseiten erläutert werden. Entwicklungen an dem Modul sollten auf LinkPhone/Test und die Anwendung auf der Spielwiese getestet werden, da wiederholte Trial-and-Error-Edits die Resourcen stark belasten können. |
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
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:
- Phone • Quickbar Ort • vCard
- Modul benötigt das Modul LinkPhone – Wartungskategorie, in der nochmals alle Module gelistet sind, die von diesem Modul abhängig sind.
Wartungskategorien
- Kategorie:Kontakt: Telefon ohne Ländervorwahl
- Kategorie:Kontakt: Ungültiges Telefonformat
- Kategorie:Kontakt: Telefon mit Schrägstrich
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
.
Auswahl Konstanten aus Modul:Link utilities/i18n
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üsselsservice
muss einer der genannten Zeichenketten im Kommentar zur Telefonnummer stehen. Die Telefonnummern gebührenfreier Dienste (tollfree) müssen mit einem Muster des Schlüsselstollfree
ü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.
formattingWikidata
– true 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.
addZeros
– true 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.
- Die obige Dokumentation wurde aus der Seite Modul:LinkPhone/Doku eingefügt. (bearbeiten | Versionsgeschichte) Die Kategorien für dieses Modul sollten in der Dokumentation eingetragen werden. Die Interwiki-Links sollten auf Wikidata eingepflegt werden.
- Liste der Unterseiten
-- 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