diff --git a/src/core/lib/Gsm7.mjs b/src/core/lib/Gsm7.mjs index bed2220d..f321e2a5 100644 --- a/src/core/lib/Gsm7.mjs +++ b/src/core/lib/Gsm7.mjs @@ -138,7 +138,7 @@ let charsets = { 090F 091E 0928 ? 093D 094D o 097F `, - //A.3.7 Kannada National Language Locking Shift Table + // A.3.7 Kannada National Language Locking Shift Table Kannada: ` 0000 0C90 SP 0 0CAC 0CBE 0CD5 p 0C82 0000 ! 1 0CAD 0CBF a q @@ -277,7 +277,7 @@ let charsets = { 067A 0689 . 0634 0645 064F n 0656 067C 068A 0698 ? 0646 0657 o 0670 ` -} +}; let extensions = { // 6.2.1.1 GSM 7 bit default alphabet extension table @@ -321,7 +321,7 @@ let extensions = { `, // A.2.2 Spanish National Language Single Shift Table - Spanish: ` + Spanish: ` 0000 0000 0000 0000 | 0000 0000 0000 0000 0000 0000 0000 Á 0000 á 0000 0000 0000 0000 0000 0000 0000 0000 0000 @@ -561,44 +561,44 @@ let extensions = { - 06F2 0612 ] N 0000 0000 0000 / 06F3 \\ 06D4 O 0000 0000 0000 ` -} +}; // Special characters in previous tables let specials = { - '1)': '\x1b', - '3)': '\x0c', - '4)': '\r', - 'SP': ' ', - 'CR': '\r', - 'LF': '\n' -} + "1)": "\x1b", + "3)": "\x0c", + "4)": "\r", + "SP": " ", + "CR": "\r", + "LF": "\n" +}; /** * Converting 3GPP tables in charsets and extensions OPTION arrays */ function convertCharTable(chars) { - console.assert(chars.length==128) - let conv = new Array(128); + console.assert(chars.length===128); + const conv = new Array(128); for (let i=0; i<128; i++) { - let char = chars[~~(i/16) + (i%16)*8]; - if (char in specials) { - char = specials[char]; - } - if (char.length == 4) { - char = String.fromCodePoint(Number("0x" + char)); - } - conv[i] = char; + let char = chars[~~(i/16) + (i%16)*8]; + if (char in specials) { + char = specials[char]; + } + if (char.length === 4) { + char = String.fromCodePoint(Number("0x" + char)); + } + conv[i] = char; } return conv; } -export var CHARSET_OPTIONS = []; +export const CHARSET_OPTIONS = []; for (const lang in charsets) { - let charset = convertCharTable(charsets[lang].trim().split(/\s+/)); + const charset = convertCharTable(charsets[lang].trim().split(/\s+/)); CHARSET_OPTIONS.push({name: lang, value: charset}); } -export var EXTENSION_OPTIONS = []; +export const EXTENSION_OPTIONS = []; for (const lang in extensions) { - let extension = convertCharTable(extensions[lang].trim().split(/\s+/)); + const extension = convertCharTable(extensions[lang].trim().split(/\s+/)); EXTENSION_OPTIONS.push({name: lang, value: extension}); } charsets = undefined; @@ -617,51 +617,52 @@ specials = undefined; */ export function toGsm7(text, charset, extension, CRpad) { if (!text) return []; - if (charset == 'Default') { + if (charset === "Default") { charset = CHARSET_OPTIONS[0].value; } - if (extension == 'Default') { + if (extension === "Default") { extension = EXTENSION_OPTIONS[0].value; } // step #1 : encoding with given charset and extension - let codePoints = []; - for (let char of text) { - let c = charset.indexOf(char); - if (c==-1) { - c = extension.indexOf(char); - if (c==-1) { - throw new OperationError("character '" + char + "' is not present in current charset+extension.
" + - "A real device would encode this SMS using UCS-2 (UTF-16)"); - } - codePoints.push(0x1b); - } - codePoints.push(c); + const codePoints = []; + for (const char of text) { + let c = charset.indexOf(char); + if (c===-1) { + c = extension.indexOf(char); + if (c===-1) { + throw new OperationError("character '" + char + "' is not present in current charset+extension.
" + + "A real device would encode this SMS using UCS-2 (UTF-16)"); + } + codePoints.push(0x1b); + } + codePoints.push(c); } // optional step #2: final CR to cope with unexpected encoding of 0x00 or to affirm a wanted final CR if (CRpad) { - if ((codePoints.length % 8 == 7) || ((codePoints.length % 8 == 0) && codePoints[codePoints.length-1] == 13)) { + if ((codePoints.length % 8 === 7) || ((codePoints.length % 8 === 0) && codePoints[codePoints.length-1] === 13)) { codePoints.push(13); - } + } } // step #3: 7bit packing - let sms = []; + const sms = []; + let mod; + let previous; for (let i = 0; i < codePoints.length; i++) { - var previous; - let c = codePoints[i]; - var mod = i % 8; - if (mod == 0) { - previous = c; - } else { - let b = ((c << (8 - mod)) & 0xff) + previous; - previous = c >> mod; - sms.push(b) - } + const c = codePoints[i]; + mod = i % 8; + if (mod === 0) { + previous = c; + } else { + const b = ((c << (8 - mod)) & 0xff) + previous; + previous = c >> mod; + sms.push(b); + } } - if (mod != 7) { - sms.push(previous); + if (mod !== 7) { + sms.push(previous); } return sms; } @@ -677,55 +678,55 @@ export function toGsm7(text, charset, extension, CRpad) { * @returns {string} */ export function fromGsm7(sms, charset, extension, CRpad) { - if (sms.length == 0) return ""; - if (charset == 'Default') { + if (sms.length === 0) return ""; + if (charset === "Default") { charset = CHARSET_OPTIONS[0].value; } - if (extension == 'Default') { + if (extension === "Default") { extension = EXTENSION_OPTIONS[0].value; } // step #1: 7bit unpacking - let codePoints = []; + const codePoints = []; let previousBits = 0; for (let i = 0; i < sms.length; i++) { - let b = sms[i]; - let mod = i % 7; - let c = previousBits + ((b << mod) & 0x7f); - previousBits = b >> (7-mod); - codePoints.push(c); - if (mod==6) { - c = previousBits; - previousBits = 0; - codePoints.push(c); - } + const b = sms[i]; + const mod = i % 7; + let c = previousBits + ((b << mod) & 0x7f); + previousBits = b >> (7-mod); + codePoints.push(c); + if (mod===6) { + c = previousBits; + previousBits = 0; + codePoints.push(c); + } } // optional step #2: remove final CR when on octet boundary if (CRpad) { - if ((codePoints.length % 8 == 0) && codePoints[codePoints.length-1] == 13) { + if ((codePoints.length % 8 === 0) && codePoints[codePoints.length-1] === 13) { codePoints.pop(); - } + } } // step #3: decoding with given charset and extension - let text = []; + const text = []; let esc = false; - for (let c of codePoints) { - if (esc) { - let char = extension[c]; - if (char=='\x00') { - char = charset[c]; - } else if (char=='\x1b') { - char = ' '; - } - text.push(char); - esc = false; - } else if (c==0x1b) { - esc = true; - } else { - text.push(charset[c]); - } + for (const c of codePoints) { + if (esc) { + let char = extension[c]; + if (char === "\x00") { + char = charset[c]; + } else if (char === "\x1b") { + char = " "; + } + text.push(char); + esc = false; + } else if (c === 0x1b) { + esc = true; + } else { + text.push(charset[c]); + } } return text.join(""); }