import * as v6 from './constants' ; import { sprintf } from 'sprintf-js' ; export function groupPossibilities ( possibilities ) { return sprintf ( '(%s)' , possibilities . join ( '|' ) ) ; } export function padGroup ( group ) { if ( group . length < 4 ) { return sprintf ( '0{0,%d}%s' , 4 - group . length , group ) ; } return group ; } export const ADDRESS_BOUNDARY = '[^A-Fa-f0-9:]' ; export function simpleRegularExpression ( groups ) { const zeroIndexes = [ ] ; groups . forEach ( ( group , i ) => { const groupInteger = parseInt ( group , 16 ) ; if ( groupInteger === 0 ) { zeroIndexes . push ( i ) ; } } ) ; const possibilities = zeroIndexes . map ( ( zeroIndex ) => groups . map ( ( group , i ) => { if ( i === zeroIndex ) { const elision = i === 0 || i === v6 . GROUPS - 1 ? ':' : '' ; return groupPossibilities ( [ padGroup ( group ) , elision ] ) ; } return padGroup ( group ) ; } ) . join ( ':' ) ) ; possibilities . push ( groups . map ( padGroup ) . join ( ':' ) ) ; return groupPossibilities ( possibilities ) ; } export function possibleElisions ( elidedGroups , moreLeft ? , moreRight ? ) { const left = moreLeft ? '' : ':' ; const right = moreRight ? '' : ':' ; const possibilities = [ ] ; if ( ! moreLeft && ! moreRight ) { possibilities . push ( '::' ) ; } if ( moreLeft && moreRight ) { possibilities . push ( '' ) ; } if ( ( moreRight && ! moreLeft ) || ( ! moreRight && moreLeft ) ) { possibilities . push ( ':' ) ; } possibilities . push ( sprintf ( '%s(:0{1,4}){1,%d}' , left , elidedGroups - 1 ) ) ; possibilities . push ( sprintf ( '(0{1,4}:){1,%d}%s' , elidedGroups - 1 , right ) ) ; possibilities . push ( sprintf ( '(0{1,4}:){%d}0{1,4}' , elidedGroups - 1 ) ) ; for ( let groups = 1 ; groups < elidedGroups - 1 ; groups ++ ) { for ( let position = 1 ; position < elidedGroups - groups ; position ++ ) { possibilities . push ( sprintf ( '(0{1,4}:){%d}:(0{1,4}:){%d}0{1,4}' , position , elidedGroups - position - groups - 1 ) ) ; } } return groupPossibilities ( possibilities ) ; }