tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

big5-decoder.js (2072B)


      1 function dec2char(n) {
      2 // converts a decimal number to a Unicode character
      3 // n: the dec codepoint value to be converted
      4 if (n <= 0xffff) {
      5 	out = String.fromCharCode(n);
      6 } else if (n <= 0x10ffff) {
      7 	n -= 0x10000;
      8 	out =
      9 		String.fromCharCode(0xd800 | (n >> 10)) +
     10 		String.fromCharCode(0xdc00 | (n & 0x3ff));
     11 } else out = "dec2char error: Code point out of range: " + n;
     12 return out;
     13 }
     14 
     15 function big5Decoder(stream) {
     16 stream = stream.replace(/%/g, " ");
     17 stream = stream.replace(/[\s]+/g, " ").trim();
     18 var bytes = stream.split(" ");
     19 for (var i = 0; i < bytes.length; i++) bytes[i] = parseInt(bytes[i], 16);
     20 var out = "";
     21 var lead, byte, offset, ptr, cp;
     22 var big5lead = 0x00;
     23 var endofstream = 2000000;
     24 var finished = false;
     25 
     26 while (!finished) {
     27 	if (bytes.length == 0) byte = endofstream;
     28 	else byte = bytes.shift();
     29 
     30 	if (byte == endofstream && big5lead != 0x00) {
     31 		big5lead = 0x00;
     32 		out += "�";
     33 		continue;
     34 	}
     35 	if (byte == endofstream && big5lead == 0x00) {
     36 		finished = true;
     37 		continue;
     38 	}
     39 
     40 	if (big5lead != 0x00) {
     41 		lead = big5lead;
     42 		ptr = null;
     43 		big5lead = 0x00;
     44 		if (byte < 0x7f) offset = 0x40;
     45 		else offset = 0x62;
     46 		if ((byte >= 0x40 && byte <= 0x7e) || (byte >= 0xa1 && byte <= 0xfe))
     47 			ptr = (lead - 0x81) * 157 + (byte - offset);
     48 		// "If there is a row in the table below whose first column is pointer, return the two code points listed in its second column"
     49 		switch (ptr) {
     50 			case 1133:
     51 				out += "Ê̄";
     52 				continue;
     53 			case 1135:
     54 				out += "Ê̌";
     55 				continue;
     56 			case 1164:
     57 				out += "ê̄";
     58 				continue;
     59 			case 1166:
     60 				out += "ê̌";
     61 				continue;
     62 		}
     63 		if (ptr == null) cp = null;
     64 		else cp = big5[ptr];
     65 		if (cp == null && byte >= 0x00 && byte <= 0x7f) {
     66 			bytes.unshift(byte);
     67 		}
     68 		if (cp == null) {
     69 			out += "�";
     70 			continue;
     71 		}
     72 		out += dec2char(cp);
     73 		continue;
     74 	}
     75 	if (byte >= 0x00 && byte <= 0x7f) {
     76 		out += dec2char(byte);
     77 		continue;
     78 	}
     79 	if (byte >= 0x81 && byte <= 0xfe) {
     80 		big5lead = byte;
     81 		continue;
     82 	}
     83 	out += "�";
     84 }
     85 return out;
     86 }