This commit is contained in:
ed 2021-12-22 10:44:27 +01:00
parent 4ccdb9a673
commit 8dac813b54

View File

@ -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
@ -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) {
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,20 +617,20 @@ 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) {
const codePoints = [];
for (const char of text) {
let c = charset.indexOf(char);
if (c==-1) {
if (c===-1) {
c = extension.indexOf(char);
if (c==-1) {
if (c===-1) {
throw new OperationError("character '" + char + "' is not present in current charset+extension.<br>" +
"A real device would encode this SMS using UCS-2 (UTF-16)");
}
@ -641,26 +641,27 @@ export function toGsm7(text, charset, extension, CRpad) {
// 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) {
const c = codePoints[i];
mod = i % 8;
if (mod === 0) {
previous = c;
} else {
let b = ((c << (8 - mod)) & 0xff) + previous;
const b = ((c << (8 - mod)) & 0xff) + previous;
previous = c >> mod;
sms.push(b)
sms.push(b);
}
}
if (mod != 7) {
if (mod !== 7) {
sms.push(previous);
}
return sms;
@ -677,24 +678,24 @@ 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;
const b = sms[i];
const mod = i % 7;
let c = previousBits + ((b << mod) & 0x7f);
previousBits = b >> (7-mod);
codePoints.push(c);
if (mod==6) {
if (mod===6) {
c = previousBits;
previousBits = 0;
codePoints.push(c);
@ -703,25 +704,25 @@ export function fromGsm7(sms, charset, extension, CRpad) {
// 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) {
for (const c of codePoints) {
if (esc) {
let char = extension[c];
if (char=='\x00') {
if (char === "\x00") {
char = charset[c];
} else if (char=='\x1b') {
char = ' ';
} else if (char === "\x1b") {
char = " ";
}
text.push(char);
esc = false;
} else if (c==0x1b) {
} else if (c === 0x1b) {
esc = true;
} else {
text.push(charset[c]);