text_decoder_indexes.js 4.7 KB

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