Source: operations/Tidy.js

/**
 * Tidy operations.
 *
 * @author n1474335 [n1474335@gmail.com]
 * @copyright Crown Copyright 2016
 * @license Apache-2.0
 *
 * @namespace
 */
var Tidy = {

    /**
     * @constant
     * @default
     */
    REMOVE_SPACES : true,
    /**
     * @constant
     * @default
     */
    REMOVE_CARIAGE_RETURNS : true,
    /**
     * @constant
     * @default
     */
    REMOVE_LINE_FEEDS : true,
    /**
     * @constant
     * @default
     */
    REMOVE_TABS : true,
    /**
     * @constant
     * @default
     */
    REMOVE_FORM_FEEDS : true,
    /**
     * @constant
     * @default
     */
    REMOVE_FULL_STOPS : false,
    
    /**
     * Remove whitespace operation.
     *
     * @param {string} input
     * @param {Object[]} args
     * @returns {string}
     */
    run_remove_whitespace: function (input, args) {
        var remove_spaces = args[0],
            remove_cariage_returns = args[1],
            remove_line_feeds = args[2],
            remove_tabs = args[3],
            remove_form_feeds = args[4],
            remove_full_stops = args[5],
            data = input;
            
        if (remove_spaces) data = data.replace(/ /g, "");
        if (remove_cariage_returns) data = data.replace(/\r/g, "");
        if (remove_line_feeds) data = data.replace(/\n/g, "");
        if (remove_tabs) data = data.replace(/\t/g, "");
        if (remove_form_feeds) data = data.replace(/\f/g, "");
        if (remove_full_stops) data = data.replace(/\./g, "");
        return data;
    },
    
    
    /**
     * Remove null bytes operation.
     *
     * @param {byte_array} input
     * @param {Object[]} args
     * @returns {byte_array}
     */
    run_remove_nulls: function (input, args) {
        var output = [];
        for (var i = 0; i < input.length; i++) {
            if (input[i] !== 0) output.push(input[i]);
        }
        return output;
    },
    
    
    /**
     * @constant
     * @default
     */
    APPLY_TO_EACH_LINE : false,
    /**
     * @constant
     * @default
     */
    DROP_START : 0,
    /**
     * @constant
     * @default
     */
    DROP_LENGTH : 5,
    
    /**
     * Drop bytes operation.
     *
     * @param {byte_array} input
     * @param {Object[]} args
     * @returns {byte_array}
     */
    run_drop_bytes: function(input, args) {
        var start = args[0],
            length = args[1],
            apply_to_each_line = args[2];
            
        if (start < 0 || length < 0)
            throw "Error: Invalid value";
            
        if (!apply_to_each_line)
            return input.slice(0, start).concat(input.slice(start+length, input.length));
            
        // Split input into lines
        var lines = [],
            line = [];
            
        for (var i = 0; i < input.length; i++) {
            if (input[i] == 0x0a) {
                lines.push(line);
                line = [];
            } else {
                line.push(input[i]);
            }
        }
        lines.push(line);
        
        var output = [];
        for (i = 0; i < lines.length; i++) {
            output = output.concat(lines[i].slice(0, start).concat(lines[i].slice(start+length, lines[i].length)));
            output.push(0x0a);
        }
        return output.slice(0, output.length-1);
    },
    
    
    /**
     * @constant
     * @default
     */
    TAKE_START: 0,
    /**
     * @constant
     * @default
     */
    TAKE_LENGTH: 5,
    
    /**
     * Take bytes operation.
     *
     * @param {byte_array} input
     * @param {Object[]} args
     * @returns {byte_array}
     */
    run_take_bytes: function(input, args) {
        var start = args[0],
            length = args[1],
            apply_to_each_line = args[2];
            
        if (start < 0 || length < 0)
            throw "Error: Invalid value";
            
        if (!apply_to_each_line)
            return input.slice(start, start+length);
            
        // Split input into lines
        var lines = [],
            line = [];
            
        for (var i = 0; i < input.length; i++) {
            if (input[i] == 0x0a) {
                lines.push(line);
                line = [];
            } else {
                line.push(input[i]);
            }
        }
        lines.push(line);
        
        var output = [];
        for (i = 0; i < lines.length; i++) {
            output = output.concat(lines[i].slice(start, start+length));
            output.push(0x0a);
        }
        return output.slice(0, output.length-1);
    },
    
    
    /**
     * @constant
     * @default
     */
    PAD_POSITION : ["Start", "End"],
    /**
     * @constant
     * @default
     */
    PAD_LENGTH : 5,
    /**
     * @constant
     * @default
     */
    PAD_CHAR : " ",
    
    /**
     * Pad lines operation.
     *
     * @param {string} input
     * @param {Object[]} args
     * @returns {string}
     */
    run_pad: function(input, args) {
        var position = args[0],
            len = args[1],
            chr = args[2],
            lines = input.split("\n"),
            output = "",
            i = 0;
            
        if (position == "Start") {
            for (i = 0; i < lines.length; i++) {
                output += Utils.pad_left(lines[i], lines[i].length+len, chr) + "\n";
            }
        } else if (position == "End") {
            for (i = 0; i < lines.length; i++) {
                output += Utils.pad_right(lines[i], lines[i].length+len, chr) + "\n";
            }
        }
        
        return output.slice(0, output.length-1);
    },
    
};