69 lines
No EOL
1.3 KiB
JavaScript
69 lines
No EOL
1.3 KiB
JavaScript
"use strict";
|
|
|
|
function last(array) {
|
|
return array[array.length - 1];
|
|
}
|
|
|
|
var brackets = {
|
|
/**
|
|
* Parse string to nodes tree
|
|
*/
|
|
parse: function parse(str) {
|
|
var current = [''];
|
|
var stack = [current];
|
|
|
|
for (var i = 0; i < str.length; i++) {
|
|
var sym = str[i];
|
|
|
|
if (sym === '(') {
|
|
current = [''];
|
|
last(stack).push(current);
|
|
stack.push(current);
|
|
continue;
|
|
}
|
|
|
|
if (sym === ')') {
|
|
stack.pop();
|
|
current = last(stack);
|
|
current.push('');
|
|
continue;
|
|
}
|
|
|
|
current[current.length - 1] += sym;
|
|
}
|
|
|
|
return stack[0];
|
|
},
|
|
|
|
/**
|
|
* Generate output string by nodes tree
|
|
*/
|
|
stringify: function stringify(ast) {
|
|
var result = '';
|
|
|
|
for (var _iterator = ast, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
|
|
var _ref;
|
|
|
|
if (_isArray) {
|
|
if (_i >= _iterator.length) break;
|
|
_ref = _iterator[_i++];
|
|
} else {
|
|
_i = _iterator.next();
|
|
if (_i.done) break;
|
|
_ref = _i.value;
|
|
}
|
|
|
|
var i = _ref;
|
|
|
|
if (typeof i === 'object') {
|
|
result += "(" + brackets.stringify(i) + ")";
|
|
continue;
|
|
}
|
|
|
|
result += i;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
};
|
|
module.exports = brackets; |