UNPKG

@ringring/gsm

Version:

A utility library for short messages and mobile communication

75 lines 2.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.unicodeReplace = exports.characterCount = exports.createParts = void 0; const gsm = require("gsm"); const constants_1 = require("./constants"); /** * Create message terminated (MT) parts to be sent to SMPPP linkers * * @param body message as string * @param opts optional options (unicode: boolean) * @returns {string[]} array of strings * * @example * createParts('Hello World') // ['Hello World'] */ function createParts(body, opts) { const parts = gsm(body); if (opts?.unicode && body.length > 70) { parts.sms_count = Math.ceil(body.length / 67); // eslint-disable-next-line no-plusplus for (let i = 0; i < parts.sms_count; i++) { parts.parts[i] = body.substring(i * 67, (i + 1) * 67); } } return parts.parts; } exports.createParts = createParts; /** * Return the character length of given content * * * @see [String.length](https://mdn.io/Reference/Global_Objects/String/length) * * @example * characterCount('€') // 2 (GSM 03.38, 7bit) * characterCount('€', { unicode: true }) // 1 (UCS2, unicode) * * @param content message content * @param opts.unicode boolean, if true, count as unicode instead of GSM 03.38 * @param opts.unicode boolean, if true, count as unicode instead of GSM 03.38 */ function characterCount(content, opts) { return content .split('') .map((char) => { const count = opts?.unicode ? 1 : constants_1.charset7bit[char] || 1; return count; }) .reduce((acc, value) => acc + value, 0); } exports.characterCount = characterCount; /** * Replace invalid unicode characters with sane equivalence or question mark (?) * * @example * // character with sane replacements * unicodeReplace('ýô') // 'yo' * // Invalid characters * unicodeReplace('A你Z') // 'A??Z' * // Valid characters * unicodeReplace('ΘΞÆæß') // 'ΘΞÆæß' * * @param content message content */ function unicodeReplace(content) { let parsed = content; const regex = /[^a-zA-Z' \d@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ!"#¤%&()*+,\-./:;<=>?¡ÄÖÑܧ¿äöñüà\f^{}\\[~\]|€]/gm; Object.keys(constants_1.GSM_MAP).forEach((c) => { parsed = parsed.replaceAll(c, constants_1.GSM_MAP[c]); }); parsed = parsed.replace(regex, '?'); return parsed; } exports.unicodeReplace = unicodeReplace; //# sourceMappingURL=index.js.map