得鹿梦鱼 得鹿梦鱼

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;};