153 lines
4.7 KiB
JavaScript
153 lines
4.7 KiB
JavaScript
import { inRange } from './text_decoder_utils.js'
|
||
import Indexes from './encoding-indexes.js'
|
||
|
||
//
|
||
// 6. Indexes
|
||
//
|
||
|
||
/**
|
||
* @param {number} pointer The |pointer| to search for.
|
||
* @param {(!Array.<?number>|undefined)} index The |index| to search within.
|
||
* @return {?number} The code point corresponding to |pointer| in |index|,
|
||
* or null if |code point| is not in |index|.
|
||
*/
|
||
export function indexCodePointFor(pointer, i) {
|
||
if (!i) return null
|
||
return i[pointer] || null
|
||
}
|
||
|
||
/**
|
||
* @param {number} code_point The |code point| to search for.
|
||
* @param {!Array.<?number>} i The |index| to search within.
|
||
* @return {?number} The first pointer corresponding to |code point| in
|
||
* |index|, or null if |code point| is not in |index|.
|
||
*/
|
||
export function indexPointerFor(code_point, i) {
|
||
var pointer = i.indexOf(code_point)
|
||
return pointer === -1 ? null : pointer
|
||
}
|
||
|
||
/**
|
||
* @param {string} name Name of the index.
|
||
*/
|
||
export default function index(name) {
|
||
return Indexes[name]
|
||
}
|
||
|
||
/**
|
||
* @param {number} pointer The |pointer| to search for in the gb18030 index.
|
||
* @return The code point corresponding to |pointer| in |index|,
|
||
* or null if |code point| is not in the gb18030 index.
|
||
*/
|
||
export function indexGB18030RangesCodePointFor(pointer) {
|
||
// 1. If pointer is greater than 39419 and less than 189000, or
|
||
// pointer is greater than 1237575, return null.
|
||
if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575))
|
||
return null
|
||
|
||
// 2. If pointer is 7457, return code point U+E7C7.
|
||
if (pointer === 7457) return 0xE7C7
|
||
|
||
// 3. Let offset be the last pointer in index gb18030 ranges that
|
||
// is equal to or less than pointer and let code point offset be
|
||
// its corresponding code point.
|
||
var offset = 0
|
||
var code_point_offset = 0
|
||
var idx = index('gb18030-ranges')
|
||
var i
|
||
for (i = 0; i < idx.length; ++i) {
|
||
/** @type {!Array.<number>} */
|
||
var entry = idx[i]
|
||
if (entry[0] <= pointer) {
|
||
offset = entry[0]
|
||
code_point_offset = entry[1]
|
||
} else {
|
||
break
|
||
}
|
||
}
|
||
|
||
// 4. Return a code point whose value is code point offset +
|
||
// pointer − offset.
|
||
return code_point_offset + pointer - offset
|
||
}
|
||
|
||
/**
|
||
* @param {number} code_point The |code point| to locate in the gb18030 index.
|
||
* @return {number} The first pointer corresponding to |code point| in the
|
||
* gb18030 index.
|
||
*/
|
||
export function indexGB18030RangesPointerFor(code_point) {
|
||
// 1. If code point is U+E7C7, return pointer 7457.
|
||
if (code_point === 0xE7C7) return 7457
|
||
|
||
// 2. Let offset be the last code point in index gb18030 ranges
|
||
// that is equal to or less than code point and let pointer offset
|
||
// be its corresponding pointer.
|
||
var offset = 0
|
||
var pointer_offset = 0
|
||
var idx = index('gb18030-ranges')
|
||
var i
|
||
for (i = 0; i < idx.length; ++i) {
|
||
/** @type {!Array.<number>} */
|
||
var entry = idx[i]
|
||
if (entry[1] <= code_point) {
|
||
offset = entry[1]
|
||
pointer_offset = entry[0]
|
||
} else {
|
||
break
|
||
}
|
||
}
|
||
|
||
// 3. Return a pointer whose value is pointer offset + code point
|
||
// − offset.
|
||
return pointer_offset + code_point - offset
|
||
}
|
||
|
||
/**
|
||
* @param {number} code_point The |code_point| to search for in the Shift_JIS
|
||
* index.
|
||
* @return {?number} The code point corresponding to |pointer| in |index|,
|
||
* or null if |code point| is not in the Shift_JIS index.
|
||
*/
|
||
export function indexShiftJISPointerFor(code_point) {
|
||
// 1. Let index be index jis0208 excluding all entries whose
|
||
// pointer is in the range 8272 to 8835, inclusive.
|
||
shift_jis_index = shift_jis_index ||
|
||
index('jis0208').map((cp, pointer) => {
|
||
return inRange(pointer, 8272, 8835) ? null : cp
|
||
})
|
||
const index_ = shift_jis_index
|
||
|
||
// 2. Return the index pointer for code point in index.
|
||
return index_.indexOf(code_point)
|
||
}
|
||
var shift_jis_index
|
||
|
||
/**
|
||
* @param {number} code_point The |code_point| to search for in the big5
|
||
* index.
|
||
* @return {?number} The code point corresponding to |pointer| in |index|,
|
||
* or null if |code point| is not in the big5 index.
|
||
*/
|
||
export function indexBig5PointerFor(code_point) {
|
||
// 1. Let index be index Big5 excluding all entries whose pointer
|
||
big5_index_no_hkscs = big5_index_no_hkscs ||
|
||
index('big5').map((cp, pointer) => {
|
||
return (pointer < (0xA1 - 0x81) * 157) ? null : cp
|
||
})
|
||
var index_ = big5_index_no_hkscs
|
||
|
||
// 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or
|
||
// U+5345, return the last pointer corresponding to code point in
|
||
// index.
|
||
if (code_point === 0x2550 || code_point === 0x255E ||
|
||
code_point === 0x2561 || code_point === 0x256A ||
|
||
code_point === 0x5341 || code_point === 0x5345) {
|
||
return index_.lastIndexOf(code_point)
|
||
}
|
||
|
||
// 3. Return the index pointer for code point in index.
|
||
return indexPointerFor(code_point, index_)
|
||
}
|
||
|
||
var big5_index_no_hkscs |