@sap/odata-v4
Version:
OData V4.0 server library
157 lines (147 loc) • 8.84 kB
JavaScript
'use strict';
const MIN_SUPPLEMENTARY_CODE_POINT = 0x10000;
const MAX_CODE_POINT = 0x10FFFF;
const CODE_POINT_DIGIT_ZERO = 0x0030;
const CODE_POINT_DIGIT_NINE = 0x0039;
const CODE_POINT_LATIN_CAPITAL_LETTER_A = 0x0041;
const CODE_POINT_LATIN_CAPITAL_LETTER_Z = 0x005A;
const CODE_POINT_LOW_LINE = 0x005F;
const CODE_POINT_LATIN_SMALL_LETTER_A = 0x0061;
const CODE_POINT_LATIN_SMALL_LETTER_Z = 0x007A;
const CODE_POINT_LATIN_CAPITAL_LETTER_A_WITH_GRAVE = 0x00C0;
const CODE_POINT_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS = 0x00D6;
const CODE_POINT_LATIN_CAPITAL_LETTER_O_WITH_STROKE = 0x00D8;
const CODE_POINT_LATIN_SMALL_LETTER_O_WITH_DIAERESIS = 0x00F6;
const CODE_POINT_LATIN_SMALL_LETTER_O_WITH_STROKE = 0x00F8;
const CODE_POINT_MODIFIER_LETTER_REVERSED_GLOTTAL_STOP = 0x02C1;
const CODE_POINT_GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS = 0x0388;
const CODE_POINT_GREEK_LUNATE_EPSILON_SYMBOL = 0x03F5;
const CODE_POINT_GREEK_CAPITAL_LETTER_SHO = 0x03F7;
const CODE_POINT_CYRILLIC_SMALL_LETTER_KOPPA = 0x0481;
const CODE_POINT_CYRILLIC_CAPITAL_LETTER_SHORT_I_WITH_TAIL = 0x048A;
const CODE_POINT_CYRILLIC_SMALL_LETTER_EL_WITH_DESCENDER = 0x052F;
const CODE_POINT_HEBREW_LETTER_ALEF = 0x05D0;
const CODE_POINT_HEBREW_LIGATURE_YIDDISH_DOUBLE_YOD = 0x05F2;
const CODE_POINT_ARABIC_LETTER_KASHMIRI_YEH = 0x0620;
const CODE_POINT_ARABIC_LETTER_YEH = 0x064A;
const CODE_POINT_ARABIC_INDIC_DIGIT_ZERO = 0x0660;
const CODE_POINT_ARABIC_INDIC_DIGIT_NINE = 0x0669;
const CODE_POINT_ARABIC_LETTER_ALEF_WASLA = 0x0671;
const CODE_POINT_ARABIC_LETTER_YEH_BARREE_WITH_HAMZA_ABOVE = 0x06D3;
const CODE_POINT_THAI_CHARACTER_KO_KAI = 0x0E01;
const CODE_POINT_THAI_CHARACTER_SARA_A = 0x0E30;
const CODE_POINT_THAI_DIGIT_ZERO = 0x0E50;
const CODE_POINT_THAI_DIGIT_NINE = 0x0E59;
const CODE_POINT_LATIN_CAPITAL_LETTER_A_WITH_RING_BELOW = 0x1E00;
const CODE_POINT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PROSGEGRAMMENI = 0x1FBC;
const CODE_POINT_GREEK_SMALL_LETTER_ETA_WITH_VARIA_AND_YPOGEGRAMMENI = 0x1FC2;
const CODE_POINT_GREEK_CAPITAL_LETTER_ETA_WITH_PROSGEGRAMMENI = 0x1FCC;
const CODE_POINT_GREEK_SMALL_LETTER_IOTA_WITH_VRACHY = 0x1FD0;
const CODE_POINT_GREEK_CAPITAL_LETTER_IOTA_WITH_OXIA = 0x1FDB;
const CODE_POINT_GREEK_SMALL_LETTER_UPSILON_WITH_VRACHY = 0x1FE0;
const CODE_POINT_GREEK_CAPITAL_LETTER_RHO_WITH_DASIA = 0x1FEC;
const CODE_POINT_GREEK_SMALL_LETTER_OMEGA_WITH_VARIA_AND_YPOGEGRAMMENI = 0x1FF2;
const CODE_POINT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PROSGEGRAMMENI = 0x1FFC;
const CODE_POINT_HIRAGANA_LETTER_SMALL_A = 0x3041;
const CODE_POINT_HIRAGANA_LETTER_SMALL_KE = 0x3096;
const CODE_POINT_KATAKANA_LETTER_SMALL_A = 0x30A1;
const CODE_POINT_KATAKANA_LETTER_VO = 0x30FA;
const CODE_POINT_CJK_IDEOGRAPH_EXTENSION_A_FIRST = 0x3400;
const CODE_POINT_CJK_IDEOGRAPH_EXTENSION_A_LAST = 0x4DB5;
const CODE_POINT_CJK_IDEOGRAPH_FIRST = 0x4E00;
const CODE_POINT_CJK_IDEOGRAPH_LAST = 0x9FEF;
const CODE_POINT_HANGUL_SYLLABLE_FIRST = 0xAC00;
const CODE_POINT_HANGUL_SYLLABLE_LAST = 0xD7A3;
/**
* Character utils for JavaScript
*/
class Character {
/**
* Determines whether the specified character (Unicode code point) is in the supplementary character range.
* See https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isSupplementaryCodePoint(int)
* See http://www.2ality.com/2013/09/javascript-unicode.html
* @param {number} codePoint The code point to test
* @returns {boolean} Return true if the codepoint is a supplementary codePoint, else false
*/
static isSupplementaryCodePoint(codePoint) {
return codePoint >= MIN_SUPPLEMENTARY_CODE_POINT && codePoint <= MAX_CODE_POINT;
}
/**
* Return true if the provided code point is a valid Unicode identifier start character.
* @param {number} codePoint the code point
* @returns {boolean} true if the codepoint is a valid Unicode identifier start character, else false
*/
static isUnicodeIdentifierStart(codePoint) {
// Because we do not have access to Unicode character classes,
// we use a subset of the allowed characters.
// See also OData v4.0 part3 CSDL specification, section 17.2.
return Character.isLetter(codePoint);
}
/**
* Return true if the provided code point is a valid Unicode identifier character.
* @param {number} codePoint the code point
* @returns {boolean} true if the codepoint is a valid Unicode identifier character, else false
*/
static isUnicodeIdentifierPart(codePoint) {
// Because we do not have access to Unicode character classes,
// we use a subset of the allowed characters.
// See also OData v4.0 part3 CSDL specification, section 17.2.
return Character.isLetter(codePoint)
|| codePoint === CODE_POINT_LOW_LINE
|| Character.isDigit(codePoint);
}
/**
* Return true if the provided code point is a valid Unicode letter character.
* Currently only letters deemed important enough are supported.
* @param {number} codePoint the code point
* @returns {boolean} true if the codepoint is a valid Unicode letter character, else false
*/
static isLetter(codePoint) {
return codePoint >= CODE_POINT_LATIN_CAPITAL_LETTER_A && codePoint <= CODE_POINT_LATIN_CAPITAL_LETTER_Z
|| codePoint >= CODE_POINT_LATIN_SMALL_LETTER_A && codePoint <= CODE_POINT_LATIN_SMALL_LETTER_Z
|| codePoint >= CODE_POINT_LATIN_CAPITAL_LETTER_A_WITH_GRAVE
&& codePoint <= CODE_POINT_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS
|| codePoint >= CODE_POINT_LATIN_CAPITAL_LETTER_O_WITH_STROKE
&& codePoint <= CODE_POINT_LATIN_SMALL_LETTER_O_WITH_DIAERESIS
|| codePoint >= CODE_POINT_LATIN_SMALL_LETTER_O_WITH_STROKE
&& codePoint <= CODE_POINT_MODIFIER_LETTER_REVERSED_GLOTTAL_STOP
|| codePoint >= CODE_POINT_GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS
&& codePoint <= CODE_POINT_GREEK_LUNATE_EPSILON_SYMBOL
|| codePoint >= CODE_POINT_GREEK_CAPITAL_LETTER_SHO && codePoint <= CODE_POINT_CYRILLIC_SMALL_LETTER_KOPPA
|| codePoint >= CODE_POINT_CYRILLIC_CAPITAL_LETTER_SHORT_I_WITH_TAIL
&& codePoint <= CODE_POINT_CYRILLIC_SMALL_LETTER_EL_WITH_DESCENDER
|| codePoint >= CODE_POINT_HEBREW_LETTER_ALEF && codePoint <= CODE_POINT_HEBREW_LIGATURE_YIDDISH_DOUBLE_YOD
|| codePoint >= CODE_POINT_ARABIC_LETTER_KASHMIRI_YEH && codePoint <= CODE_POINT_ARABIC_LETTER_YEH
|| codePoint >= CODE_POINT_ARABIC_LETTER_ALEF_WASLA
&& codePoint <= CODE_POINT_ARABIC_LETTER_YEH_BARREE_WITH_HAMZA_ABOVE
|| codePoint >= CODE_POINT_THAI_CHARACTER_KO_KAI && codePoint <= CODE_POINT_THAI_CHARACTER_SARA_A
|| codePoint >= CODE_POINT_LATIN_CAPITAL_LETTER_A_WITH_RING_BELOW
&& codePoint <= CODE_POINT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PROSGEGRAMMENI
|| codePoint >= CODE_POINT_GREEK_SMALL_LETTER_ETA_WITH_VARIA_AND_YPOGEGRAMMENI
&& codePoint <= CODE_POINT_GREEK_CAPITAL_LETTER_ETA_WITH_PROSGEGRAMMENI
|| codePoint >= CODE_POINT_GREEK_SMALL_LETTER_IOTA_WITH_VRACHY
&& codePoint <= CODE_POINT_GREEK_CAPITAL_LETTER_IOTA_WITH_OXIA
|| codePoint >= CODE_POINT_GREEK_SMALL_LETTER_UPSILON_WITH_VRACHY
&& codePoint <= CODE_POINT_GREEK_CAPITAL_LETTER_RHO_WITH_DASIA
|| codePoint >= CODE_POINT_GREEK_SMALL_LETTER_OMEGA_WITH_VARIA_AND_YPOGEGRAMMENI
&& codePoint <= CODE_POINT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PROSGEGRAMMENI
|| codePoint >= CODE_POINT_HIRAGANA_LETTER_SMALL_A && codePoint <= CODE_POINT_HIRAGANA_LETTER_SMALL_KE
|| codePoint >= CODE_POINT_KATAKANA_LETTER_SMALL_A && codePoint <= CODE_POINT_KATAKANA_LETTER_VO
|| codePoint >= CODE_POINT_CJK_IDEOGRAPH_EXTENSION_A_FIRST
&& codePoint <= CODE_POINT_CJK_IDEOGRAPH_EXTENSION_A_LAST
|| codePoint >= CODE_POINT_CJK_IDEOGRAPH_FIRST && codePoint <= CODE_POINT_CJK_IDEOGRAPH_LAST
|| codePoint >= CODE_POINT_HANGUL_SYLLABLE_FIRST && codePoint <= CODE_POINT_HANGUL_SYLLABLE_LAST;
}
/**
* Return true if the provided code point is a valid Unicode digit character.
* Currently only digits deemed important enough are supported.
* @param {number} codePoint the code point
* @returns {boolean} true if the codepoint is a valid Unicode digit character, else false
*/
static isDigit(codePoint) {
return codePoint >= CODE_POINT_DIGIT_ZERO && codePoint <= CODE_POINT_DIGIT_NINE
|| codePoint >= CODE_POINT_ARABIC_INDIC_DIGIT_ZERO && codePoint <= CODE_POINT_ARABIC_INDIC_DIGIT_NINE
|| codePoint >= CODE_POINT_THAI_DIGIT_ZERO && codePoint <= CODE_POINT_THAI_DIGIT_NINE;
}
}
module.exports = Character;