string-alter

String alter

StringAlter.js

Alters a string by replacing multiple range fragments in one fast pass. Works in node and browsers.

    var StringAlter = require("string-alter");
 
    var string =
        'let x = (a, b, c = 998) =>'
        + 'a + b + c;console.log(x(1, 1) === 1000)'
        + '\n'
        + 'console.log(((function(){return (a)=>a*22.032})())("321") === "321"*22.032)'
    ;
 
    var alter = new StringAlter(string);
    alter
        .replace(0, 3, "var")//'let' 
        .insert(8, "function")//'function ' + "(a, b" 
        .remove(13, 22)//', c = 998' 
        .remove(23, 26)//' =>' 
        .wrap(26, 35, "{", "}", {extend: true})
        .insert(26,
            "var " + alter.get(15, 16) + " = arguments[2];"      //var c = arguments[2]; 
            + "if(" + alter.get(15, 16) + " === void 0)"         //if(c === void 0) 
            + alter.get(15, 16) + " = " + alter.get(19, 22) + ";"//c = 998; 
        )
        .insert(26, "return ")//'return ' + "a + b + c;" 
        .insert(98, "function")//'function ' + "(a)" 
        .remove(101, 103)//'=>' 
        .wrap(103, 111, "{", "}", {extend: true})
        .insert(103, "return ")//'return ' + "a*22.032" 
    ;
    var result = alter.apply();
    result ===
        'var x = function(a, b)'
        + '{var c = arguments[2];if(c === void 0)c = 998;return a + b + c};console.log(x(1, 1) === 1000)'
        + '\n'
        + 'console.log(((function(){return function(a){return a*22.032}})())("321") === "321"*22.032)'
    ;
 

The fragments does not need to be sorted but must not overlap. More examples in test

var alter = new StringAlter(source: string, options: Object?);
// options is optional. See 'StringAlter options' 
alter.replace(from: number, to: number, str: string): StringAlter

Replace substring from between "from" and "to" positions to given one "str"

alter.insert(pos: number, str: string): StringAlter

Insert substring to "pos" position

alter.wrap(from: number, to: number, begin: string, end: string): StringAlter

Insert "begin" string to "from" position and "end" string to "to" position

alter.remove(from: number, to: number): StringAlter

Remove substring

alter.get(from: number, to: number): Object

Get substring from original string wrapped in special object with toString function

alter.apply(): string

Apply changes. Return result string

{
    policy: {}// see 'Changes policy' 
}
{
    "ruleName": resolve//resolve should be "allow" or "exclude", or any other value which will be interpreted as "error" 
}

This is a set of rules that can allow or exclude some unobvious changes

  • fromMoreThanTo (default: 'error') - when changes start position is is larger than end position
  • unUniqueRemove (default: 'error') - second remove call for already removed fragment (with the same method parameter values)
  • eraseInErase (default: 'allow') - remove or replace inside another remove or replace

Install using npm

npm install string-alter
var StringAlter = require("string-alter");

Clone the repo and include it in a script tag

git clone https://github.com/termi/StringAlter.git
<script src="StringAlter/dist/StringAlter.js"></script>

MIT