UNPKG

locutus

Version:

Locutus other languages' standard libraries to JavaScript for fun and educational purposes

71 lines (70 loc) 2.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.convert_uuencode = convert_uuencode; const is_scalar_ts_1 = require("../var/is_scalar.js"); function convert_uuencode(str) { // discuss at: https://locutus.io/php/convert_uuencode/ // original by: Ole Vrijenhoek // bugfixed by: Kevin van Zonneveld (https://kvz.io) // bugfixed by: Brett Zamir (https://brett-zamir.me) // reimplemented by: Ole Vrijenhoek // example 1: convert_uuencode("test\ntext text\r\n") // returns 1: "0=&5S=`IT97AT('1E>'0-\"@\n`\n" const chr = function (c) { return String.fromCharCode(c); }; if (!str || str === '') { return chr(0); } else if (!(0, is_scalar_ts_1.is_scalar)(str)) { return false; } const source = String(str); let c = 0; let u = 0; let a = 0; let encoded = ''; let tmp1 = ''; let tmp2 = ''; let bytes = []; // divide string into chunks of 45 characters const chunk = function () { bytes = source .substr(u, 45) .split('') .map((char) => char.charCodeAt(0)); return bytes.length || 0; }; while ((c = chunk()) !== 0) { u += 45; // New line encoded data starts with number of bytes encoded. encoded += chr(c + 32); // Convert each char in bytes[] to a byte for (const byte of bytes) { tmp1 = byte.toString(2); while (tmp1.length < 8) { tmp1 = '0' + tmp1; } tmp2 += tmp1; } while (tmp2.length % 6) { tmp2 = tmp2 + '0'; } for (let i = 0; i <= tmp2.length / 6 - 1; i++) { tmp1 = tmp2.substr(a, 6); if (tmp1 === '000000') { encoded += chr(96); } else { encoded += chr(parseInt(tmp1, 2) + 32); } a += 6; } a = 0; tmp2 = ''; encoded += '\n'; } // Add termination characters encoded += chr(96) + '\n'; return encoded; }