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-01-07 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

TextCodeErgebnis
+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 [[Modul:Link utilities/i18n|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ü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 administrationlocal lp = {moduleInterface = {suite  = 'LinkPhone',serial = '2024-01-07',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 thenreturn numberendlocal pos, first, last, newLast, country, localCode, inumber = number:gsub( '-', ' ' )i, pos = number:find( '.* ' ) -- find last spaceif size > 0 and pos thenfirst = number:sub( 1, pos )last = number:sub( pos + 1, #number )newLast = ''if tonumber( last ) then -- inserting additional spaceswhile ( #last > size + 1 ) doif newLast == '' thennewLast = last:sub( -size )elsenewLast = last:sub( -size ) .. ' ' .. newLastendlast = last:sub( 1, #last - size )endif newLast ~= '' thenlast = last .. ' ' .. newLastendendpos, i = first:find( ' ' )if li.options.addZeros and pos and ( pos ~= #first ) thencountry = first:sub( 1, pos - 1 )localCode = first:sub( pos + 1, #first )if not ln.noZero[ country ] thenlocalCode = localCode:gsub( '[%(%)]', '' )if localCode:sub( 1, 1 ) == '0' thenlocalCode = '(0)' .. localCode:sub( 2, #localCode ) elselocalCode = '(0)' .. localCodeendfirst = country .. ' ' .. localCodeendendnumber = first .. lastendreturn numberend-- look for phone-number patterns which are valid local numberslocal function checkNumberMatch( key, number )local ar = ln.exceptions[ key ]if not ar thenreturn falseendfor i = 1, #ar, 1 doif number:find( ar[ i ] ) thenreturn trueendendreturn falseendlocal function extractExtension( number )local ext = ''local tfor i, extension in ipairs( li.extensions ) dot = mw.ustring.gsub( number, '^.*(' .. extension .. ')$', '%1' )if t ~= number thenext = t:gsub( '%s*=', ' ' ) -- RFC 3966number = mw.ustring.gsub( number, '[%s%c]*(' .. extension .. ')$', '' )breakendendreturn number, extend-- handle a single phone number sfunction lp.linkPhoneNumber( s, args, isDemo )local number = mw.text.trim( s )if number == '' thenreturn ''endlocal catPrefix = isDemo and ' [[:Category:' or '[[Category:'local ext = ''local extraCats = ''local comment, targs.cc = args.cc:gsub( '%-', '' )number, comment = lu.extractComment( number )number, ext = extractExtension( number )-- normalize country calling codenumber = number:gsub( '^00+', '+' ):gsub( '^%+%++', '+' )-- add country calling code, remove lead zeroif args.cc ~= '' thenif li.options.withCountryCode and number:sub( 1, 1 ) ~= '+' thennumber = args.cc .. ' ' .. numberendif li.options.preventLeadZero and not ln.noZero[ args.cc ] thennumber = number:gsub( '^(%' .. args.cc .. '%s+)%(+0%)+', '%1' ):gsub( '%(+', '' ):gsub( '%)+', '' )endend-- formatting phone numbers retrieved from Wikidataif args.format thennumber = formatNumber( number, args.size )endif li.options.addZeros and not ln.zeroExceptions[ args.cc ] and not number:find( '^00' ) thennumber = number:gsub( '^0', '(0)' )endif li.options.addZeros and args.cc ~= '' and not ln.zeroExceptions[ args.cc ] thennumber = number:gsub( '^(%' .. args.cc .. ')( *)0', '%1%2(0)' )end-- plain is number for linklocal plain = number-- check if slashes are usedif plain:find( '/', 1, true ) thenextraCats = catPrefix .. li.categories.withSlashend-- remove delimiters -.()/' and spaces-- including thin spaceplain = mw.ustring.gsub( plain, "[  '/%.%-%)]", '' )local exception = false-- handling country code including ++49, 0049 etc.if plain:sub( 1, 1 ) == '+' thenplain = plain:gsub( '%(0', '' ) -- zero in parenthesis:gsub( '%(', '' )elseplain = plain:gsub( '%(0', '0' )if comment ~= '' and checkNumberMatch( 'service', comment ) thenexception = truenumber = number:gsub( '[%(%)]', '' )elseif args.isTollfree and checkNumberMatch( 'tollfree', plain ) thenexception = truenumber = number:gsub( '[%(%)]', '' )elseif checkNumberMatch( args.cc, plain ) thenexception = trueelseif args.cc ~= '' thenif ln.noZero[ args.cc ] thenplain = args.cc .. plain:gsub( '^%(', '' )elseif plain:sub( 1, 1 ) == '0' thenplain = args.cc .. plain:gsub( '^0', '' )elsereturn s .. catPrefix .. li.categories.invalidendelsereturn s .. catPrefix .. li.categories.noCCendend-- minimum 5 characters including country codeif not exception and #plain < 5 thenreturn s .. catPrefix .. li.categories.invalidend-- lower case letters for numbers are not allowedif plain:find( '%l' ) thenreturn s .. catPrefix .. li.categories.invalidelseif plain:find( '%u' ) then-- substitude letterslocal letters = { '', '[A-C]', '[D-F]', '[G-I]', '[J-L]', '[M-O]','[P-S]', '[T-V]', '[W-Z]' }for i = 2, 9 doplain = plain:gsub( letters[ i ], '' .. i )endend-- remove zero from local area codeif args.cc ~= '' and not ln.zeroExceptions[ args.cc ] thenplain = plain:gsub( args.cc .. '0', args.cc )end-- final testif not exception and not plain:match( '^%+%d+$' ) thenreturn s .. catPrefix .. li.categories.invalidend-- assemble number, link, ext, comment, and categoriest = '<span data-phone="' .. plain .. '" class="listing-phone-number'if not args.isFax thent = t .. ' plainlinks nourlexpansion'number = ( '[tel:%s %s]' ):format( plain, number )endif exception thent = t .. ' listing-phone-exception" title="' .. li.categories.onlyDomesticendt = t .. '">' .. number .. '</span>'return t .. ( ext ~= '' and ( ' ' .. ext ) or '' ) ..( comment ~= '' and ( ' ' .. comment ) or '' ) .. extraCatsendfunction lp.linkPhoneNumbers( args )local addNum = li.addNumif args.isFax thenaddNum = li.addNumFaxendargs.cc = args.cc:gsub( '^00', '+' ):gsub( '^%+%++', '+' )local ns     = mw.title.getCurrentTitle().namespacelocal isDemo = ns == 10 or ns == 828-- split separate numberslocal items = lu.splitItems( args.phone, li.delimiters )-- analyse phone numberslocal result = ''local i = 0local sfor j, item in ipairs( items ) dos = lp.linkPhoneNumber( item, args, isDemo )if s ~= '' thenif result == '' thenresult = selseif i == addNum thenresult = result .. '<span class="listing-add-contact">'endresult = result .. li.texts.comma .. sendi = i + 1endendif i > addNum thenresult = result .. '</span>'endreturn result;endfunction lp.getTrunkPrefix( cc )return ln.noZero[ cc ] and '' or '0'endreturn lp