GB18030Encoder.js 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var encodings_1 = require("../../encoding/encodings");
  4. var finished_1 = require("../../encoding/finished");
  5. var indexes_1 = require("../../encoding/indexes");
  6. var terminology_1 = require("../../encoding/terminology");
  7. /**
  8. * @constructor
  9. * @implements {Encoder}
  10. * @param {{fatal: boolean}} options
  11. * @param {boolean=} gbk_flag
  12. */
  13. var GB18030Encoder = /** @class */ (function () {
  14. function GB18030Encoder(options, gbk_flag) {
  15. if (gbk_flag === void 0) { gbk_flag = undefined; }
  16. this.gbk_flag = gbk_flag;
  17. this.fatal = options.fatal;
  18. // gb18030's decoder has an associated gbk flag (initially unset).
  19. }
  20. /**
  21. * @param {Stream} stream Input stream.
  22. * @param {number} code_point Next code point read from the stream.
  23. * @return {(number|!Array.<number>)} Byte(s) to emit.
  24. */
  25. GB18030Encoder.prototype.handler = function (stream, code_point) {
  26. // 1. If code point is end-of-stream, return finished.
  27. if (code_point === terminology_1.end_of_stream)
  28. return finished_1.finished;
  29. // 2. If code point is an ASCII code point, return a byte whose
  30. // value is code point.
  31. if (terminology_1.isASCIICodePoint(code_point))
  32. return code_point;
  33. // 3. If code point is U+E5E5, return error with code point.
  34. if (code_point === 0xE5E5)
  35. return encodings_1.encoderError(code_point);
  36. // 4. If the gbk flag is set and code point is U+20AC, return
  37. // byte 0x80.
  38. if (this.gbk_flag && code_point === 0x20AC)
  39. return 0x80;
  40. // 5. Let pointer be the index pointer for code point in index
  41. // gb18030.
  42. var pointer = indexes_1.indexPointerFor(code_point, indexes_1.index('gb18030'));
  43. // 6. If pointer is not null, run these substeps:
  44. if (pointer !== null) {
  45. // 1. Let lead be Math.floor(pointer / 190) + 0x81.
  46. var lead = Math.floor(pointer / 190) + 0x81;
  47. // 2. Let trail be pointer % 190.
  48. var trail = pointer % 190;
  49. // 3. Let offset be 0x40 if trail is less than 0x3F and 0x41 otherwise.
  50. var offset = trail < 0x3F ? 0x40 : 0x41;
  51. // 4. Return two bytes whose values are lead and trail + offset.
  52. return [lead, trail + offset];
  53. }
  54. // 7. If gbk flag is set, return error with code point.
  55. if (this.gbk_flag)
  56. return encodings_1.encoderError(code_point);
  57. // 8. Set pointer to the index gb18030 ranges pointer for code
  58. // point.
  59. pointer = indexes_1.indexGB18030RangesPointerFor(code_point);
  60. // 9. Let byte1 be Math.floor(pointer / 10 / 126 / 10).
  61. var byte1 = Math.floor(pointer / 10 / 126 / 10);
  62. // 10. Set pointer to pointer − byte1 × 10 × 126 × 10.
  63. pointer = pointer - byte1 * 10 * 126 * 10;
  64. // 11. Let byte2 be Math.floor(pointer / 10 / 126).
  65. var byte2 = Math.floor(pointer / 10 / 126);
  66. // 12. Set pointer to pointer − byte2 × 10 × 126.
  67. pointer = pointer - byte2 * 10 * 126;
  68. // 13. Let byte3 be Math.floor(pointer / 10).
  69. var byte3 = Math.floor(pointer / 10);
  70. // 14. Let byte4 be pointer − byte3 × 10.
  71. var byte4 = pointer - byte3 * 10;
  72. // 15. Return four bytes whose values are byte1 + 0x81, byte2 +
  73. // 0x30, byte3 + 0x81, byte4 + 0x30.
  74. return [byte1 + 0x81,
  75. byte2 + 0x30,
  76. byte3 + 0x81,
  77. byte4 + 0x30];
  78. };
  79. return GB18030Encoder;
  80. }());
  81. exports.GB18030Encoder = GB18030Encoder;
  82. //# sourceMappingURL=GB18030Encoder.js.map