UNPKG

locutus

Version:

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

101 lines (100 loc) 3.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.strtr = strtr; const krsort_ts_1 = require("../array/krsort.js"); const ini_set_ts_1 = require("../info/ini_set.js"); function strtr(str, trFrom, trTo) { // discuss at: https://locutus.io/php/strtr/ // original by: Brett Zamir (https://brett-zamir.me) // input by: uestla // input by: Alan C // input by: Taras Bogach // input by: jpfle // bugfixed by: Kevin van Zonneveld (https://kvz.io) // bugfixed by: Kevin van Zonneveld (https://kvz.io) // bugfixed by: Brett Zamir (https://brett-zamir.me) // bugfixed by: Brett Zamir (https://brett-zamir.me) // example 1: var $trans = {'hello' : 'hi', 'hi' : 'hello'} // example 1: strtr('hi all, I said hello', $trans) // returns 1: 'hello all, I said hi' // example 2: strtr('äaabaåccasdeöoo', 'äåö','aao') // returns 2: 'aaabaaccasdeooo' // example 3: strtr('ääääääää', 'ä', 'a') // returns 3: 'aaaaaaaa' // example 4: strtr('http', 'pthxyz','xyzpth') // returns 4: 'zyyx' // example 5: strtr('zyyx', 'pthxyz','xyzpth') // returns 5: 'http' // example 6: strtr('aa', {'a':1,'aa':2}) // returns 6: '2' let fr = ''; let i = 0; let j = 0; let lenStr = 0; let lenFrom = 0; let sortByReference = false; let istr = ''; const tmpFrom = []; const tmpTo = []; let ret = ''; let match = false; // Received replace_pairs? // Convert to normal trFrom->trTo chars if (typeof trFrom === 'object' && !Array.isArray(trFrom)) { // Not thread-safe; temporarily set to true // @todo: Don't rely on ini here, use internal krsort instead sortByReference = (0, ini_set_ts_1.ini_set)('locutus.sortByReference', false); const sorted = (0, krsort_ts_1.krsort)(trFrom); (0, ini_set_ts_1.ini_set)('locutus.sortByReference', sortByReference); if (typeof sorted === 'object') { for (fr in sorted) { if (sorted.hasOwnProperty(fr)) { tmpFrom.push(fr); tmpTo.push(sorted[fr]); } } } trFrom = tmpFrom; trTo = tmpTo; } // Walk through subject and replace chars when needed lenStr = str.length; lenFrom = typeof trFrom === 'string' ? trFrom.length : trFrom.length; const fromStr = typeof trFrom === 'string' ? trFrom : null; const fromArr = Array.isArray(trFrom) ? trFrom : null; const toStr = typeof trTo === 'string' ? trTo : null; const toArr = Array.isArray(trTo) ? trTo : null; for (i = 0; i < lenStr; i++) { match = false; if (fromStr) { istr = str.charAt(i); for (j = 0; j < lenFrom; j++) { if (istr === fromStr.charAt(j)) { match = true; break; } } } else if (fromArr) { for (j = 0; j < lenFrom; j++) { const fromVal = fromArr[j]; if (fromVal === undefined) { continue; } if (str.substr(i, fromVal.length) === fromVal) { match = true; // Fast forward i = i + fromVal.length - 1; break; } } } if (match) { ret += toStr ? toStr.charAt(j) : toArr ? toArr[j] : ''; } else { ret += str.charAt(i); } } return ret; }