6/18/ds/18js/lib/text_decoder_indexes.js

153 lines
4.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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