Modul:LinkPhone
Die Dokumentation für dieses Modul kann unter Modul:LinkPhone/doc erstellt werden
-- module variable and administration local lp = { moduleInterface = { suite = 'LinkPhone', serial = '2022-10-22', item = 16354802 } } -- module import -- require( 'strict' ) local li = require( 'Module:Link utilities/i18n' ) local lu = require( 'Module:Link utilities' ) local zeroExceptions = { ['+34'] = '_', ['+39'] = '_', ['+378'] = '_' } local function formatNumber( number, size ) if not li.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.addZeros and pos and ( pos ~= #first ) then country = first:sub( 1, pos - 1 ) localCode = first:sub( pos + 1, #first ) if not li.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 local function checkNumberMatch( key, number ) local ar = li.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 -- 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 number, comment = lu.extractComment( number ) number = number:gsub( '^00+', '+' ) :gsub( '^%+%++', '+' ) -- extract extension for i, extension in ipairs( li.extensions ) do t = mw.ustring.gsub( number, '^.*(' .. extension .. ')$', '%1' ) if t ~= number then ext = t number = mw.ustring.gsub( number, '[%s%c]*(' .. extension .. ')$', '' ) end end if ext ~= '' then ext = ext:gsub( 'ext%s*=', 'ext. ' ) -- RFC 3966 end -- formatting phone numbers retrieved from Wikidata if args.format then number = formatNumber( number, args.size ) end if li.addZeros and not zeroExceptions[ args.cc ] and not number:find( '^00' ) then number = number:gsub( '^0', '(0)' ) end if li.addZeros and args.cc ~= '' and not 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, "[ '/%.%-%)]", '' ) args.cc = args.cc:gsub( '%-', '' ) local exception = false -- 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 li.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 plain = plain:gsub( '[A-C]', '2' ) :gsub( '[D-F]', '3' ) :gsub( '[G-I]', '4' ) :gsub( '[J-L]', '5' ) :gsub( '[M-O]', '6' ) :gsub( '[P-S]', '7' ) :gsub( '[T-V]', '8' ) :gsub( '[W-Z]', '9' ) end -- remove zero from local area code if args.cc ~= '' and not 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 if args.isFax then t = '<span class="listing-phone-number' if exception then t = t .. ' listing-phone-exception" title="' .. li.texts.onlyDomestic end t = t .. '" data-phone="' .. plain .. '">' .. number .. '</span>' else t = '<span class="plainlinks nourlexpansion listing-phone-number' if exception then t = t .. ' listing-phone-exception" title="' .. li.texts.onlyDomestic end t = t .. '" data-phone="' .. plain .. '">[tel:' .. plain .. ' ' .. number .. ']</span>' end if ext ~= '' then t = t .. ' ' .. ext end if comment ~= '' then t = t .. ' ' .. comment end return t .. 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 .. ', ' .. s end i = i + 1 end end if i > addNum then result = result .. '</span>' end return result; end function lp.getTrunkPrefix( cc ) return li.noZero[ cc ] or '0' end return lp