From 0e54e6c33d92fa70d6addf0dd7087b7af6811ed9 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Thu, 17 Mar 2022 15:49:11 -0400 Subject: [PATCH 1/6] replace .substr(a,b) with .substring(a,a+b) --- package.json | 5 ++- tasks/replace_substr.js | 84 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 tasks/replace_substr.js diff --git a/package.json b/package.json index 50b92e960bd..c2a04b46e21 100644 --- a/package.json +++ b/package.json @@ -32,9 +32,10 @@ "use-draftlogs": "node tasks/use_draftlogs.js", "empty-draftlogs": "node tasks/empty_draftlogs.js", "empty-dist": "node tasks/empty_dist.js", - "build": "npm run empty-dist && npm run preprocess && npm run find-strings && npm run bundle && npm run extra-bundles basic && npm run extra-bundles cartesian && npm run extra-bundles geo && npm run extra-bundles gl2d && npm run extra-bundles gl3d && npm run extra-bundles mapbox && npm run extra-bundles finance && npm run locales && npm run schema dist && npm run stats", + "build": "npm run empty-dist && npm run preprocess && npm run find-strings && npm run bundle && npm run extra-bundles basic && npm run extra-bundles cartesian && npm run extra-bundles geo && npm run extra-bundles gl2d && npm run extra-bundles gl3d && npm run extra-bundles mapbox && npm run extra-bundles finance && npm run locales && npm run schema dist && npm run replace-substr && npm run stats", + "replace-substr": "node ./tasks/replace_substr.js", "regl-codegen": "node devtools/regl_codegen/server.js", - "cibuild": "npm run empty-dist && npm run preprocess && node tasks/cibundle.js", + "cibuild": "npm run empty-dist && npm run preprocess && node tasks/cibundle.js && npm run replace-substr -- build", "watch": "node tasks/watch.js", "lint": "eslint --version && eslint .", "lint-fix": "eslint . --fix || true", diff --git a/tasks/replace_substr.js b/tasks/replace_substr.js new file mode 100644 index 00000000000..c4e1e245d60 --- /dev/null +++ b/tasks/replace_substr.js @@ -0,0 +1,84 @@ +'use strict'; + +// Replace .substr(a, ?b) with .substring(a, (a)+b) +// +// String.prototype.substr() is deprecated! +// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr + +var fs = require('fs'); +var allFolders = ['dist/']; +if(process.argv.indexOf('build') !== -1) allFolders.push('build/'); + +for(var k = 0; k < allFolders.length; k++) { + var folder = allFolders[k]; + var allFilenames = fs.readdirSync(folder); + + for(var i = 0; i < allFilenames.length; i++) { + var filename = allFilenames[i]; + var len = filename.length; + if(filename.substring(len - 3) === '.js') { + var f = folder + filename; + var str = fs.readFileSync(f, {encoding: 'utf8', flag: 'r+'}); + fs.writeFileSync(f, replaceSubstr(str), 'utf8'); + console.log('Overwritten:' + f); + } + } +} + +function replaceSubstr(str) { + var i0; + while(i0 !== -1) { + i0 = str.indexOf('.substr('); + if(i0 === -1) return str; + + var args = []; + var text = ''; + var k = 0; + + // step into the function + var i = i0 + 7; + var p = 1; // open parentheses + while(p > 0) { + i++; + + var c = str.charAt(i); + if(!c) break; + if(p === 1 && ( + c === ',' || + c === ')' + )) { + args[k++] = text; + text = ''; + } else { + text += c; + } + + if(c === '(') p++; + if(c === ')') p--; + } + + // console.log(str.substring(i0, i + 1)); + // console.log(args); + + var startStr = args[0]; + var lengthStr = args[1]; + var out = '.substring(' + startStr; + + if(lengthStr !== undefined) { + out += ','; + if(+startStr !== 0) { + out += '(' + startStr + ')+'; + } + out += lengthStr; + } + + out += ')'; + + // console.log(out) + // console.log('__'); + + str = str.substring(0, i0) + out + str.substring(i + 1); + } + + return str; +} From d43d35f4b79e47ded94367ba136e5a423bb0d005 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Fri, 18 Mar 2022 12:10:39 -0400 Subject: [PATCH 2/6] speedup .substr( search using previous position --- tasks/replace_substr.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/replace_substr.js b/tasks/replace_substr.js index c4e1e245d60..2208e2745f2 100644 --- a/tasks/replace_substr.js +++ b/tasks/replace_substr.js @@ -26,9 +26,9 @@ for(var k = 0; k < allFolders.length; k++) { } function replaceSubstr(str) { - var i0; + var i0 = 0; while(i0 !== -1) { - i0 = str.indexOf('.substr('); + i0 = str.indexOf('.substr(', i0); if(i0 === -1) return str; var args = []; From 5d4b3081eb0cbc7e73e9ab1ce597accac1e52e18 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Fri, 18 Mar 2022 12:18:37 -0400 Subject: [PATCH 3/6] restrict overwrites to plotly*.js files --- tasks/replace_substr.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tasks/replace_substr.js b/tasks/replace_substr.js index 2208e2745f2..fade627e4c0 100644 --- a/tasks/replace_substr.js +++ b/tasks/replace_substr.js @@ -16,11 +16,17 @@ for(var k = 0; k < allFolders.length; k++) { for(var i = 0; i < allFilenames.length; i++) { var filename = allFilenames[i]; var len = filename.length; - if(filename.substring(len - 3) === '.js') { + if( + filename.substring(0, 6) === 'plotly' && + filename.substring(len - 3) === '.js' + ) { var f = folder + filename; var str = fs.readFileSync(f, {encoding: 'utf8', flag: 'r+'}); - fs.writeFileSync(f, replaceSubstr(str), 'utf8'); - console.log('Overwritten:' + f); + var newStr = replaceSubstr(str); + if(newStr !== str) { + fs.writeFileSync(f, newStr, 'utf8'); + console.log('Overwritten: ' + f); + } } } } From 32d21b7ac9e4280be316ab24dac4c11328e9d70f Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Fri, 18 Mar 2022 16:23:15 -0400 Subject: [PATCH 4/6] replace substr during creation of bundles --- package.json | 5 ++- tasks/util/browserify_wrapper.js | 19 +++++++---- .../substr2substring.js} | 33 +++---------------- 3 files changed, 19 insertions(+), 38 deletions(-) rename tasks/{replace_substr.js => util/substr2substring.js} (60%) diff --git a/package.json b/package.json index 04ded877160..4116969b97f 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,9 @@ "use-draftlogs": "node tasks/use_draftlogs.js", "empty-draftlogs": "node tasks/empty_draftlogs.js", "empty-dist": "node tasks/empty_dist.js", - "replace-substr": "node ./tasks/replace_substr.js", - "build": "npm run empty-dist && npm run preprocess && npm run find-strings && npm run bundle && npm run extra-bundles && npm run locales && npm run schema dist && npm run replace-substr && npm run stats", + "build": "npm run empty-dist && npm run preprocess && npm run find-strings && npm run bundle && npm run extra-bundles && npm run locales && npm run schema dist && npm run stats", "regl-codegen": "node devtools/regl_codegen/server.js", - "cibuild": "npm run empty-dist && npm run preprocess && node tasks/cibundle.js && npm run replace-substr -- build", + "cibuild": "npm run empty-dist && npm run preprocess && node tasks/cibundle.js", "watch": "node tasks/watch.js", "lint": "eslint --version && eslint .", "lint-fix": "eslint . --fix || true", diff --git a/tasks/util/browserify_wrapper.js b/tasks/util/browserify_wrapper.js index b0364a6682b..2741cc0a6c5 100644 --- a/tasks/util/browserify_wrapper.js +++ b/tasks/util/browserify_wrapper.js @@ -4,6 +4,7 @@ var path = require('path'); var browserify = require('browserify'); var minify = require('minify-stream'); var derequire = require('derequire'); +var substr2substring = require('./substr2substring'); var through = require('through2'); var strictD3 = require('./strict_d3'); @@ -78,7 +79,7 @@ module.exports = function _bundle(pathToIndex, pathToBundle, opts, cb) { }; bundleStream - .pipe(applyDerequire()) + .pipe(modify()) .pipe(minify(minifyOpts)) .pipe(fs.createWriteStream(pathToMinBundle)) .on('finish', function() { @@ -89,7 +90,7 @@ module.exports = function _bundle(pathToIndex, pathToBundle, opts, cb) { if(pathToBundle) { bundleStream - .pipe(applyDerequire()) + .pipe(modify()) .pipe(fs.createWriteStream(pathToBundle)) .on('finish', function() { logger(pathToBundle); @@ -103,13 +104,19 @@ function logger(pathToOutput) { console.log(log); } -function applyDerequire() { - var buf = ''; +function modify() { + var str = ''; return through(function(chunk, enc, next) { - buf += chunk.toString(); + str += chunk.toString(); next(); }, function(done) { - this.push(derequire(buf)); + this.push( + derequire( // require >> _dereq_ + substr2substring( // substr >> substring + str + ) + ) + ); done(); }); } diff --git a/tasks/replace_substr.js b/tasks/util/substr2substring.js similarity index 60% rename from tasks/replace_substr.js rename to tasks/util/substr2substring.js index fade627e4c0..83a47ba5817 100644 --- a/tasks/replace_substr.js +++ b/tasks/util/substr2substring.js @@ -5,35 +5,10 @@ // String.prototype.substr() is deprecated! // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr -var fs = require('fs'); -var allFolders = ['dist/']; -if(process.argv.indexOf('build') !== -1) allFolders.push('build/'); - -for(var k = 0; k < allFolders.length; k++) { - var folder = allFolders[k]; - var allFilenames = fs.readdirSync(folder); - - for(var i = 0; i < allFilenames.length; i++) { - var filename = allFilenames[i]; - var len = filename.length; - if( - filename.substring(0, 6) === 'plotly' && - filename.substring(len - 3) === '.js' - ) { - var f = folder + filename; - var str = fs.readFileSync(f, {encoding: 'utf8', flag: 'r+'}); - var newStr = replaceSubstr(str); - if(newStr !== str) { - fs.writeFileSync(f, newStr, 'utf8'); - console.log('Overwritten: ' + f); - } - } - } -} - -function replaceSubstr(str) { +module.exports = function substr2substring(str) { var i0 = 0; while(i0 !== -1) { + // assuming there is no white space after substr i0 = str.indexOf('.substr(', i0); if(i0 === -1) return str; @@ -73,7 +48,7 @@ function replaceSubstr(str) { if(lengthStr !== undefined) { out += ','; if(+startStr !== 0) { - out += '(' + startStr + ')+'; + out += '(' + startStr + ') + '; } out += lengthStr; } @@ -87,4 +62,4 @@ function replaceSubstr(str) { } return str; -} +}; From 448bb457f170bc32bb469e964d57ce3737939adf Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Fri, 18 Mar 2022 17:09:55 -0400 Subject: [PATCH 5/6] also convert substr in watchified_bundle --- tasks/util/watchified_bundle.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tasks/util/watchified_bundle.js b/tasks/util/watchified_bundle.js index d9652bf2ce9..10c1b3a9a9b 100644 --- a/tasks/util/watchified_bundle.js +++ b/tasks/util/watchified_bundle.js @@ -3,7 +3,9 @@ var fs = require('fs'); var browserify = require('browserify'); var watchify = require('watchify'); var prettySize = require('prettysize'); +var through = require('through2'); +var substr2substring = require('../../tasks/util/substr2substring'); var constants = require('./constants'); var common = require('./common'); @@ -50,6 +52,7 @@ module.exports = function makeWatchifiedBundle(strict, onFirstBundleCallback) { firstBundle = false; } }) + .pipe(modify()) .pipe( fs.createWriteStream(constants.pathToPlotlyBuild) ); @@ -81,3 +84,18 @@ function formatBundleMsg(b, bundleName) { console.log(msgParts.join(' ')); }); } + +function modify() { + var str = ''; + return through(function(chunk, enc, next) { + str += chunk.toString(); + next(); + }, function(done) { + this.push( + substr2substring( // substr >> substring + str + ) + ); + done(); + }); +} From 62d3331e4ab527ea540f15c281a784fc71bf7be8 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Tue, 22 Mar 2022 09:36:47 -0400 Subject: [PATCH 6/6] use slice instead of substring to avoid flipping start & end --- tasks/util/browserify_wrapper.js | 4 ++-- tasks/util/{substr2substring.js => substr2slice.js} | 10 +++++----- tasks/util/watchified_bundle.js | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) rename tasks/util/{substr2substring.js => substr2slice.js} (83%) diff --git a/tasks/util/browserify_wrapper.js b/tasks/util/browserify_wrapper.js index 2741cc0a6c5..2b12ce28767 100644 --- a/tasks/util/browserify_wrapper.js +++ b/tasks/util/browserify_wrapper.js @@ -4,7 +4,7 @@ var path = require('path'); var browserify = require('browserify'); var minify = require('minify-stream'); var derequire = require('derequire'); -var substr2substring = require('./substr2substring'); +var substr2slice = require('./substr2slice'); var through = require('through2'); var strictD3 = require('./strict_d3'); @@ -112,7 +112,7 @@ function modify() { }, function(done) { this.push( derequire( // require >> _dereq_ - substr2substring( // substr >> substring + substr2slice( // substr >> slice str ) ) diff --git a/tasks/util/substr2substring.js b/tasks/util/substr2slice.js similarity index 83% rename from tasks/util/substr2substring.js rename to tasks/util/substr2slice.js index 83a47ba5817..2ac033d0060 100644 --- a/tasks/util/substr2substring.js +++ b/tasks/util/substr2slice.js @@ -1,11 +1,11 @@ 'use strict'; -// Replace .substr(a, ?b) with .substring(a, (a)+b) +// Replace .substr(a, ?b) with .slice(a, (a)+b) // // String.prototype.substr() is deprecated! // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr -module.exports = function substr2substring(str) { +module.exports = function substr2slice(str) { var i0 = 0; while(i0 !== -1) { // assuming there is no white space after substr @@ -38,12 +38,12 @@ module.exports = function substr2substring(str) { if(c === ')') p--; } - // console.log(str.substring(i0, i + 1)); + // console.log(str.slice(i0, i + 1)); // console.log(args); var startStr = args[0]; var lengthStr = args[1]; - var out = '.substring(' + startStr; + var out = '.slice(' + startStr; if(lengthStr !== undefined) { out += ','; @@ -58,7 +58,7 @@ module.exports = function substr2substring(str) { // console.log(out) // console.log('__'); - str = str.substring(0, i0) + out + str.substring(i + 1); + str = str.slice(0, i0) + out + str.slice(i + 1); } return str; diff --git a/tasks/util/watchified_bundle.js b/tasks/util/watchified_bundle.js index 10c1b3a9a9b..43dc2fa20ab 100644 --- a/tasks/util/watchified_bundle.js +++ b/tasks/util/watchified_bundle.js @@ -5,7 +5,7 @@ var watchify = require('watchify'); var prettySize = require('prettysize'); var through = require('through2'); -var substr2substring = require('../../tasks/util/substr2substring'); +var substr2slice = require('../../tasks/util/substr2slice'); var constants = require('./constants'); var common = require('./common'); @@ -92,7 +92,7 @@ function modify() { next(); }, function(done) { this.push( - substr2substring( // substr >> substring + substr2slice( // substr >> slice str ) );