regenerate
前提
请优先阅读JavaScript 的内部字符编码了解相关知识。
codePointRange
U+000000 到 U+10FFFF =》 0x000000 到 0x10FFFF
var HIGH_SURROGATE_MIN = 0xd800; // 高代理最小值var HIGH_SURROGATE_MAX = 0xdbff; // 高代理最大值var LOW_SURROGATE_MIN = 0xdc00; // 低代理最小值var LOW_SURROGATE_MAX = 0xdfff; // 低代理最大值var regexNull = /\\x00[^0123456789]$/g;dataFromCodePoints
作用: 用于压缩代码点范围
实例: `dataFromCodePoints[1,2,3,5,6]` => [1,4,5,7]
var dataFromCodePoints = function codePoints { var index = -1; var length = codePoints.length; var max = length - 1; var result = []; var isStart = true; var tmp; var previous = 0; while ++index < length { tmp = codePoints[index]; if isStart { result.pushtmp; previous = tmp; isStart = false; } else { if tmp == previous + 1 { if index != max { previous = tmp; continue; } else { isStart = true; result.pushtmp + 1; } } else { // End the previous range and start a new one. result.pushprevious + 1, tmp; previous = tmp; } } } if !isStart { result.pushtmp + 1; } return result;};dataRmove
作用: 从一个由范围对[start, end]左闭右开 组成的数组中移除指定的代码点,并调整相关的范围对
实例1: `dataRemove[1,4,5,7], 2` => [1,2,3,4,5,7]
实例2: `dataRemove[1,4], 1` => [2,4]
实例1: `dataRemove[1,4], 3` => [1,3]
var dataRemove = functiondata, codePoint { var index = 0; var start; var end; var length = data.length; while index < length { start = data[index]; end = data[index + 1]; if codePoint >= start && codePoint < end { if codePoint == start { if end == start + 1 { data.spliceindex, 2; return data; } else { data[index] = codePoint + 1; return data; } } else if codePoint == end - 1 { data[index + 1] = codePoint; return data; } else { data.spliceindex, 2, start, codePoint, codePoint + 1, end; return data; } } index += 2; } return data;};dataRemoveRange
作用: 从一个由范围对[start, end]左闭右开 组成的数组中移除指定范围的的代码点,并调整相关的范围对
var dataRemoveRange = functiondata, rangeStart, rangeEnd { if rangeEnd < rangeStart { throw Error'无效范围'; } var index = 0; var start; var end; while index < data.length { start = data[index]; end = data[index + 1] - 1; if start > rangeEnd { return data; } if rangeStart <= start && rangeEnd >= end { data.spliceindex, 2; continue; } if rangeStart >= start && rangeEnd < end { if rangeStart == start { data[index] = rangeEnd + 1; data[index + 1] = end + 1; return data; } data.spliceindex, 2, start, rangeStart, rangeEnd + 1, end + 1; return data; } if rangeStart >= start && rangeStart <= end { data[index + 1] = rangeStart; } else if rangeEnd >= start && rangeEnd <= end { data[index] = rangeEnd + 1; return data; } index += 2; } return data;};dataAdd
将指定的代码点(codePoint)添加到一个由范围对[start, end]左闭右开 组成的数组中,并确保范围正确合并或扩展
var dataAdd = functiondata, codePoint { var index = 0; var start; var end; var lastIndex = null; var length = data.length; if codePoint < 0x0 codePoint > 0x10FFFF { throw RangeErrorERRORS.codePointRange; } while index < length { start = data[index]; end = data[index + 1]; if codePoint >= start && codePoint < end { return data; } if codePoint == start - 1 { data[index] = codePoint; return data; } if start > codePoint { data.splice lastIndex != null ? lastIndex + 2 : 0, 0, codePoint, codePoint + 1 ; return data; } if codePoint == end { if codePoint + 1 == data[index + 2] { data.spliceindex, 4, start, data[index + 3]; return data; } data[index + 1] = codePoint + 1; return data; } lastIndex = index; index += 2;}data.pushcodePoint, codePoint + 1;return data;};
dataAddData
合并2个代码点范围
var dataAddData = functiondataA, dataB { var index = 0; var start; var end; var data = dataA.slice; var length = dataB.length; while index < length { start = dataB[index]; end = dataB[index + 1] - 1; if start == end { data = dataAdddata, start; } else { data = dataAddRangedata, start, end; } index += 2; } return data;};dataRemoveData
移除代码点范围
var dataRemoveData = functiondataA, dataB { var index = 0; var start; var end; var data = dataA.slice; var length = dataB.length; while index < length { start = dataB[index]; end = dataB[index + 1] - 1; if start == end { data = dataRemovedata, start; } else { data = dataRemoveRangedata, start, end; } index += 2; } return data;};dataAddData
向一个表示 Unicode 码点范围的数组中添加一个新的范围,并确保所有范围保持有序且不重叠
var dataAddRange = functiondata, rangeStart, rangeEnd { if rangeEnd < rangeStart { throw ErrorERRORS.rangeOrder; } if rangeStart < 0x0 rangeStart > 0x10FFFF rangeEnd < 0x0 rangeEnd > 0x10FFFF { throw RangeErrorERRORS.codePointRange; } var index = 0; var start; var end; var added = false; var length = data.length; while index < length { start = data[index]; end = data[index + 1]; if added { if start == rangeEnd + 1 { data.spliceindex - 1, 2; return data; } if start > rangeEnd { return data; } if start >= rangeStart && start <= rangeEnd { if end > rangeStart && end - 1 <= rangeEnd { data.spliceindex, 2; index -= 2; } else { data.spliceindex - 1, 2; index -= 2; } } } else if start == rangeEnd + 1 start == rangeEnd { data[index] = rangeStart; return data; } else if start > rangeEnd { data.spliceindex, 0, rangeStart, rangeEnd + 1; return data; } else if rangeStart >= start && rangeStart < end && rangeEnd + 1 <= end { return data; } else if rangeStart >= start && rangeStart < end end == rangeStart { data[index + 1] = rangeEnd + 1; added = true; } else if rangeStart <= start && rangeEnd + 1 >= end { data[index] = rangeStart; data[index + 1] = rangeEnd + 1; added = true; } index += 2; } if !added { data.pushrangeStart, rangeEnd + 1; } return data;};dataContains
检查给定代码点是否包含在指定的代码点范围中
var dataContains = functiondata, codePoint { var index = 0; var length = data.length; var start = data[index]; var end = data[length - 1]; if length >= 2 { if codePoint < start codePoint > end { return false; } } // Iterate over the data per `start, end` pair. while index < length { start = data[index]; end = data[index + 1]; if codePoint >= start && codePoint < end { return true; } index += 2; } return false;};dataIntersection
计算两个代码点范围数组的交集,并返回一个新的代码点范围数组数组
var dataIntersection = functiondata, codePoints { var index = 0; var length = codePoints.length; var codePoint; var result = []; while index < length { codePoint = codePoints[index]; if dataContainsdata, codePoint { result.pushcodePoint; } ++index; } return dataFromCodePointsresult;};dataIsEmpty
检查给定的代码点范围数组是否为空
var dataIsEmpty = functiondata { return !data.length;}; dataIsSingleton
检查给定的代码点范围数组是否只有一个代码点
var dataIsSingleton = functiondata { return data.length == 2 && data[0] + 1 == data[1];}dataToArray
将给定的代码点范围数组转换为数组,实际的代码点
var dataToArray = functiondata { // Iterate over the data per `start, end` pair. var index = 0; var start; var end; var result = []; var length = data.length; while index < length { start = data[index]; end = data[index + 1]; while start < end { result.pushstart; ++start; } index += 2; } return result; };highSurrogate
获取高代理项
var highSurrogate = functioncodePoint { return parseInt floorcodePoint - 0x10000 / 0x400 + HIGH_SURROGATE_MIN, 10 ;} lowSurrogate
获取低代理项
var lowSurrogate = functioncodePoint { return parseInt codePoint - 0x10000 % 0x400 + LOW_SURROGATE_MIN, 10 ;} codePointToString
将代码点转换为字符串
var stringFromCharCode = String.fromCharCode;var codePointToString = functioncodePoint { var string; if codePoint == 0x09 { string = '\\t'; } else if codePoint == 0x0A { string = '\\n'; } else if codePoint == 0x0C { string = '\\f'; } else if codePoint == 0x0D { string = '\\r'; } else if codePoint == 0x2D { string = '\\x2D'; } else if codePoint == 0x5C { string = '\\\\'; } else if codePoint == 0x24 codePoint >= 0x28 && codePoint <= 0x2B codePoint == 0x2E codePoint == 0x2F codePoint == 0x3F codePoint >= 0x5B && codePoint <= 0x5E codePoint >= 0x7B && codePoint <= 0x7D { string = '\\' + stringFromCharCodecodePoint; } else if codePoint >= 0x20 && codePoint <= 0x7E { string = stringFromCharCodecodePoint; } else if codePoint <= 0xFF { string = '\\x' + padhexcodePoint, 2; } else { string = '\\u' + padhexcodePoint, 4; } return string;}; ≡