indexes.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var getArrayVal_1 = require("../helper/getArrayVal");
  4. var utilities_1 = require("./utilities");
  5. var encoding_indexes_provider_1 = require("./encoding-indexes-provider");
  6. /**
  7. * @param {number} pointer The |pointer| to search for.
  8. * @param {(!Array.<?number>|undefined)} index The |index| to search within.
  9. * @return {?number} The code point corresponding to |pointer| in |index|,
  10. * or null if |code point| is not in |index|.
  11. */
  12. function indexCodePointFor(pointer, index) {
  13. if (!index)
  14. return null;
  15. return index[pointer] || null;
  16. }
  17. exports.indexCodePointFor = indexCodePointFor;
  18. /**
  19. * @param {number} code_point The |code point| to search for.
  20. * @param {!Array.<?number>} index The |index| to search within.
  21. * @return {?number} The first pointer corresponding to |code point| in
  22. * |index|, or null if |code point| is not in |index|.
  23. */
  24. function indexPointerFor(code_point, index) {
  25. var pointer = index.indexOf(code_point);
  26. return pointer === -1 ? null : pointer;
  27. }
  28. exports.indexPointerFor = indexPointerFor;
  29. /**
  30. * @param {string} name Name of the index.
  31. * @return {(!Array.<number>|!Array.<Array.<number>>)}
  32. * */
  33. function index(name) {
  34. var encodingIndexes = encoding_indexes_provider_1.getEncodingIndexes();
  35. if (!encodingIndexes) {
  36. throw Error("Indexes missing." +
  37. " Did you forget to include encoding-indexes.js first?");
  38. }
  39. return encodingIndexes[name];
  40. }
  41. exports.index = index;
  42. /**
  43. * @param {number} pointer The |pointer| to search for in the gb18030 index.
  44. * @return {?number} The code point corresponding to |pointer| in |index|,
  45. * or null if |code point| is not in the gb18030 index.
  46. */
  47. function indexGB18030RangesCodePointFor(pointer) {
  48. // 1. If pointer is greater than 39419 and less than 189000, or
  49. // pointer is greater than 1237575, return null.
  50. if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575))
  51. return null;
  52. // 2. If pointer is 7457, return code point U+E7C7.
  53. if (pointer === 7457)
  54. return 0xE7C7;
  55. // 3. Let offset be the last pointer in index gb18030 ranges that
  56. // is equal to or less than pointer and let code point offset be
  57. // its corresponding code point.
  58. var offset = 0;
  59. var code_point_offset = 0;
  60. var idx = index('gb18030-ranges');
  61. for (var i = 0; i < idx.length; ++i) {
  62. /** @type {!Array.<number>} */
  63. var entry = getArrayVal_1.getArrayVal(idx[i]);
  64. if (entry[0] <= pointer) {
  65. offset = entry[0];
  66. code_point_offset = entry[1];
  67. }
  68. else {
  69. break;
  70. }
  71. }
  72. // 4. Return a code point whose value is code point offset +
  73. // pointer − offset.
  74. return code_point_offset + pointer - offset;
  75. }
  76. exports.indexGB18030RangesCodePointFor = indexGB18030RangesCodePointFor;
  77. /**
  78. * @param {number} code_point The |code point| to locate in the gb18030 index.
  79. * @return {number} The first pointer corresponding to |code point| in the
  80. * gb18030 index.
  81. */
  82. function indexGB18030RangesPointerFor(code_point) {
  83. // 1. If code point is U+E7C7, return pointer 7457.
  84. if (code_point === 0xE7C7)
  85. return 7457;
  86. // 2. Let offset be the last code point in index gb18030 ranges
  87. // that is equal to or less than code point and let pointer offset
  88. // be its corresponding pointer.
  89. var offset = 0;
  90. var pointer_offset = 0;
  91. var idx = index('gb18030-ranges');
  92. for (var i = 0; i < idx.length; ++i) {
  93. var idxVal = idx[i];
  94. /** @type {!Array.<number>} */
  95. var entry = getArrayVal_1.getArrayVal(idxVal);
  96. if (entry[1] <= code_point) {
  97. offset = entry[1];
  98. pointer_offset = entry[0];
  99. }
  100. else {
  101. break;
  102. }
  103. }
  104. // 3. Return a pointer whose value is pointer offset + code point
  105. // − offset.
  106. return pointer_offset + code_point - offset;
  107. }
  108. exports.indexGB18030RangesPointerFor = indexGB18030RangesPointerFor;
  109. /**
  110. * @param {number} code_point The |code_point| to search for in the Shift_JIS
  111. * index.
  112. * @return {?number} The code point corresponding to |pointer| in |index|,
  113. * or null if |code point| is not in the Shift_JIS index.
  114. */
  115. function indexShiftJISPointerFor(code_point) {
  116. // 1. Let index be index jis0208 excluding all entries whose
  117. // pointer is in the range 8272 to 8835, inclusive.
  118. shift_jis_index = shift_jis_index ||
  119. index('jis0208').map(function (code_point, pointer) {
  120. return utilities_1.inRange(pointer, 8272, 8835) ? null : code_point;
  121. });
  122. var index_ = shift_jis_index;
  123. // 2. Return the index pointer for code point in index.
  124. return index_.indexOf(code_point);
  125. }
  126. exports.indexShiftJISPointerFor = indexShiftJISPointerFor;
  127. var shift_jis_index;
  128. /**
  129. * @param {number} code_point The |code_point| to search for in the big5
  130. * index.
  131. * @return {?number} The code point corresponding to |pointer| in |index|,
  132. * or null if |code point| is not in the big5 index.
  133. */
  134. function indexBig5PointerFor(code_point) {
  135. // 1. Let index be index Big5 excluding all entries whose pointer
  136. big5_index_no_hkscs = big5_index_no_hkscs ||
  137. index('big5').map(function (code_point, pointer) {
  138. return (pointer < (0xA1 - 0x81) * 157) ? null : code_point;
  139. });
  140. var index_ = big5_index_no_hkscs;
  141. // 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or
  142. // U+5345, return the last pointer corresponding to code point in
  143. // index.
  144. if (code_point === 0x2550 || code_point === 0x255E ||
  145. code_point === 0x2561 || code_point === 0x256A ||
  146. code_point === 0x5341 || code_point === 0x5345) {
  147. return index_.lastIndexOf(code_point);
  148. }
  149. // 3. Return the index pointer for code point in index.
  150. return indexPointerFor(code_point, index_);
  151. }
  152. exports.indexBig5PointerFor = indexBig5PointerFor;
  153. var big5_index_no_hkscs;
  154. //# sourceMappingURL=indexes.js.map