@@ -1815,4 +1815,81 @@ module ts {
18151815 export function getLocalSymbolForExportDefault ( symbol : Symbol ) {
18161816 return symbol && symbol . valueDeclaration && ( symbol . valueDeclaration . flags & NodeFlags . Default ) ? symbol . valueDeclaration . localSymbol : undefined ;
18171817 }
1818+
1819+ /**
1820+ * Replace each instance of non-ascii characters by one, two, three, or four escape sequences
1821+ * representing the UTF-8 encoding of the character, and return the expanded char code list.
1822+ */
1823+ function getExpandedCharCodes ( input : string ) : number [ ] {
1824+ let output : number [ ] = [ ] ;
1825+ let length = input . length ;
1826+ let leadSurrogate : number = undefined ;
1827+
1828+ for ( let i = 0 ; i < length ; i ++ ) {
1829+ let charCode = input . charCodeAt ( i ) ;
1830+
1831+ // handel utf8
1832+ if ( charCode < 0x80 ) {
1833+ output . push ( charCode ) ;
1834+ }
1835+ else if ( charCode < 0x800 ) {
1836+ output . push ( ( charCode >> 6 ) | 0B11000000 ) ;
1837+ output . push ( ( charCode & 0B00111111 ) | 0B10000000 ) ;
1838+ }
1839+ else if ( charCode < 0x10000 ) {
1840+ output . push ( ( charCode >> 12 ) | 0B11100000 ) ;
1841+ output . push ( ( ( charCode >> 6 ) & 0B00111111 ) | 0B10000000 ) ;
1842+ output . push ( ( charCode & 0B00111111 ) | 0B10000000 ) ;
1843+ }
1844+ else if ( charCode < 0x20000 ) {
1845+ output . push ( ( charCode >> 18 ) | 0B11110000 ) ;
1846+ output . push ( ( ( charCode >> 12 ) & 0B00111111 ) | 0B10000000 ) ;
1847+ output . push ( ( ( charCode >> 6 ) & 0B00111111 ) | 0B10000000 ) ;
1848+ output . push ( ( charCode & 0B00111111 ) | 0B10000000 ) ;
1849+ }
1850+ else {
1851+ Debug . assert ( false , "Unexpected code point" ) ;
1852+ }
1853+ }
1854+
1855+ return output ;
1856+ }
1857+
1858+ const base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ;
1859+
1860+ /**
1861+ * Converts a string to a base-64 encoded ASCII string.
1862+ */
1863+ export function convertToBase64 ( input : string ) : string {
1864+ var result = "" ;
1865+ let charCodes = getExpandedCharCodes ( input ) ;
1866+ let i = 0 ;
1867+ let length = charCodes . length ;
1868+ let byte1 : number , byte2 : number , byte3 : number , byte4 : number ;
1869+
1870+ while ( i < length ) {
1871+ // Convert every 6-bits in the input 3 character points
1872+ // into a base64 digit
1873+ byte1 = charCodes [ i ] >> 2 ;
1874+ byte2 = ( charCodes [ i ] & 0B00000011 ) << 4 | charCodes [ i + 1 ] >> 4 ;
1875+ byte3 = ( charCodes [ i + 1 ] & 0B00001111 ) << 2 | charCodes [ i + 2 ] >> 6 ;
1876+ byte4 = charCodes [ i + 2 ] & 0B00111111 ;
1877+
1878+ // We are out of characters in the input, set the extra
1879+ // digits to 64 (padding character).
1880+ if ( i + 1 >= length ) {
1881+ byte3 = byte4 = 64 ;
1882+ }
1883+ else if ( i + 2 >= length ) {
1884+ byte4 = 64 ;
1885+ }
1886+
1887+ // Write to the ouput
1888+ result += base64Digits . charAt ( byte1 ) + base64Digits . charAt ( byte2 ) + base64Digits . charAt ( byte3 ) + base64Digits . charAt ( byte4 ) ;
1889+
1890+ i += 3 ;
1891+ }
1892+
1893+ return result ;
1894+ }
18181895}
0 commit comments