Skip to content

Instantly share code, notes, and snippets.

@nicklasnygren
Last active August 29, 2015 14:14
Show Gist options
  • Save nicklasnygren/82b4477d41de7a4e6131 to your computer and use it in GitHub Desktop.
Save nicklasnygren/82b4477d41de7a4e6131 to your computer and use it in GitHub Desktop.
Node.js definition aligner
#!/usr/bin/env node
process.stdin.resume();
process.stdin.setEncoding('utf8');
var isObjExp = /^\s*[^:^\/]+\s*:\s*[^\/]/;
var objExp = /^\s*([^:]+):\s*/;
var objSpaceExp = /^\s*([^:]+\s*):/;
var varExp = /^\s*([^=]+)\s*=[^=]/;
var varSpaceExp = /^\s*([^=]+\s*)=[^=]/;
var wordExp, spaceExp, symbol, symbolExp, paddedSymbolExp;
var firstLineIdx = 0;
var lines = [];
var longest = 0;
var output = '';
var longestIndent = 0;
var getIndent = function (line) {
var word = line.match(/([^\s])/);
if (!word || !word.length) { return 0; }
return line.indexOf(word[1]);
};
var getLength = function (line) {
var len;
if (typeof line !== 'string') { return 0; }
len = line.match(wordExp);
return (len && len.length > 0) ? len[1].length : 0;
};
var getHighest = function (acc, num) {
return (!acc || num > acc) ? num : acc;
}
var getPaddedLine = function (line, varExpr) {
if (!varExpr || !varExpr.length) { return line; }
var res = varExpr;
var indent = getIndent(line);
while (res.length + indent <= longest + longestIndent) {
res += ' ';
}
return line.replace(varExpr, res);
};
var removePadding = function (line) {
if (line.indexOf('{') !== -1) { return line; }
return line.replace(paddedSymbolExp, symbol)
};
var addPadding = function (line) {
if (line.indexOf('{') !== -1) { return line; }
return line.
replace(spaceExp, getPaddedLine).
replace(symbolExp, symbol + ' ');
}
var processInput = function (input) {
lines = input.split('\n');
if (lines.length) {
do {
if (isObjExp.test(lines[firstLineIdx])
&& (lines[firstLineIdx].indexOf('=') === -1
|| (lines[firstLineIdx].indexOf('=') > lines[firstLineIdx].indexOf(':')))) {
wordExp = objExp;
spaceExp = objSpaceExp;
symbol = ':';
}
else if (varExp.test(lines[firstLineIdx])) {
wordExp = varExp;
spaceExp = varSpaceExp;
symbol = '=';
}
firstLineIdx++;
}
while (!symbol || firstLineIdx < lines.length);
symbolExp = new RegExp('(' + symbol + '\\s*)');
paddedSymbolExp = new RegExp('(\\s*' + symbol + '\\s*)');
longest = lines.
map(removePadding).
map(getLength).
reduce(getHighest);
longestIndent = lines.
map(getIndent).
reduce(getHighest);
return lines.
map(removePadding).
map(addPadding).
join('\n');
}
return input;
};
process.stdin.on('data', function (input) {
process.stdout.write(processInput(input));
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment