nl_tokens: Resolves . and .. elements in a path with directory names
pl_tokens: function normalizeString ( <mask> , allowAboveRoot ) { var res = '' var lastSegmentLength = 0 var lastSlash = - 1 var dots = 0 var code for ( var i = 0 ; i <= path . length ; i += 1 ) { if ( i < path . length ) code = path . charCodeAt ( i ) else if ( code === CHAR_FORWARD_SLASH ) break else code = CHAR_FORWARD_SLASH if ( code === CHAR_FORWARD_SLASH ) { if ( lastSlash === i - 1 || dots === 1 ) { // NOOP } else if ( lastSlash !== i - 1 && dots === 2 ) { if ( res . length < 2 || lastSegmentLength !== 2 || res . charCodeAt ( res . length - 1 ) !== CHAR_DOT || res . charCodeAt ( res . length - 2 ) !== CHAR_DOT ) { if ( res . length > 2 ) { var lastSlashIndex = res . lastIndexOf ( '/' ) if ( lastSlashIndex !== res . length - 1 ) { if ( lastSlashIndex === - 1 ) { res = '' lastSegmentLength = 0 } else { res = res . slice ( 0 , lastSlashIndex ) lastSegmentLength = res . length - 1 - res . lastIndexOf ( '/' ) } lastSlash = i dots = 0 continue } } else if ( res . length === 2 || res . length === 1 ) { res = '' lastSegmentLength = 0 lastSlash = i dots = 0 continue } } if ( allowAboveRoot ) { if ( res . length > 0 ) res += '/..' else res = '..' lastSegmentLength = 2 } } else { if ( res . length > 0 ) res += '/' + path . slice ( lastSlash + 1 , i ) else res = path . slice ( lastSlash + 1 , i ) lastSegmentLength = i - lastSlash - 1 } lastSlash = i dots = 0 } else if ( code === CHAR_DOT && dots !== - 1 ) { ++ dots } else { dots = - 1 } } return res }