| import { |
| ambiguousMinimalCodePoint, |
| ambiguousMaximumCodePoint, |
| ambiguousRanges, |
| |
| fullwidthMinimalCodePoint, |
| fullwidthMaximumCodePoint, |
| fullwidthRanges, |
| |
| halfwidthMinimalCodePoint, |
| halfwidthMaximumCodePoint, |
| halfwidthRanges, |
| |
| narrowMinimalCodePoint, |
| narrowMaximumCodePoint, |
| narrowRanges, |
| |
| wideMinimalCodePoint, |
| wideMaximumCodePoint, |
| wideRanges, |
| } from './lookup-data.js'; |
| import {isInRange} from './utilities.js'; |
| |
| const commonCjkCodePoint = 0x4E_00; |
| const [wideFastPathStart, wideFastPathEnd] = /* #__PURE__ */ findWideFastPathRange(wideRanges); |
| |
| // Use a hot-path range so common `isWide` calls can skip binary search. |
| // The range containing U+4E00 covers common CJK ideographs; |
| // fallback to the largest range for resilience to Unicode table changes. |
| function findWideFastPathRange(ranges) { |
| let fastPathStart = ranges[0]; |
| let fastPathEnd = ranges[1]; |
| |
| for (let index = 0; index < ranges.length; index += 2) { |
| const start = ranges[index]; |
| const end = ranges[index + 1]; |
| |
| if ( |
| commonCjkCodePoint >= start |
| && commonCjkCodePoint <= end |
| ) { |
| return [start, end]; |
| } |
| |
| if ((end - start) > (fastPathEnd - fastPathStart)) { |
| fastPathStart = start; |
| fastPathEnd = end; |
| } |
| } |
| |
| return [fastPathStart, fastPathEnd]; |
| } |
| |
| export const isAmbiguous = codePoint => { |
| if ( |
| codePoint < ambiguousMinimalCodePoint |
| || codePoint > ambiguousMaximumCodePoint |
| ) { |
| return false; |
| } |
| |
| return isInRange(ambiguousRanges, codePoint); |
| }; |
| |
| export const isFullWidth = codePoint => { |
| if ( |
| codePoint < fullwidthMinimalCodePoint |
| || codePoint > fullwidthMaximumCodePoint |
| ) { |
| return false; |
| } |
| |
| return isInRange(fullwidthRanges, codePoint); |
| }; |
| |
| const isHalfWidth = codePoint => { |
| if ( |
| codePoint < halfwidthMinimalCodePoint |
| || codePoint > halfwidthMaximumCodePoint |
| ) { |
| return false; |
| } |
| |
| return isInRange(halfwidthRanges, codePoint); |
| }; |
| |
| const isNarrow = codePoint => { |
| if ( |
| codePoint < narrowMinimalCodePoint |
| || codePoint > narrowMaximumCodePoint |
| ) { |
| return false; |
| } |
| |
| return isInRange(narrowRanges, codePoint); |
| }; |
| |
| export const isWide = codePoint => { |
| if ( |
| codePoint >= wideFastPathStart |
| && codePoint <= wideFastPathEnd |
| ) { |
| return true; |
| } |
| |
| if ( |
| codePoint < wideMinimalCodePoint |
| || codePoint > wideMaximumCodePoint |
| ) { |
| return false; |
| } |
| |
| return isInRange(wideRanges, codePoint); |
| }; |
| |
| export function getCategory(codePoint) { |
| if (isAmbiguous(codePoint)) { |
| return 'ambiguous'; |
| } |
| |
| if (isFullWidth(codePoint)) { |
| return 'fullwidth'; |
| } |
| |
| if (isHalfWidth(codePoint)) { |
| return 'halfwidth'; |
| } |
| |
| if (isNarrow(codePoint)) { |
| return 'narrow'; |
| } |
| |
| if (isWide(codePoint)) { |
| return 'wide'; |
| } |
| |
| return 'neutral'; |
| } |