indexes.js 5.4 KB

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