var fs = require('fs'); module.exports = function(file_path, callback){ var insertTabs = function(num_tabs) { var result = ''; for(var i = 0; i < num_tabs; i++){ result += '\t'; } return result; } var emptyHTMLStack = function(html_stack){ var result = ''; while(html_stack.length > 0){ result += html_stack.pop(); } return result; } var popHTMLStack = function(html_stack, current_line_num_tabs, previous_line_num_tabs){ var result = html_stack.pop(); for(var i = previous_line_num_tabs; i > current_line_num_tabs; i--){ result += html_stack.pop(); result += html_stack.pop(); } return result; } var parseFile = function(data, callback){ var previous_line_num_tabs = -1; var lines = data.split('\n'); var html = ''; var html_stack = []; for(var i = 0; i < lines.length; i++){ if(lines[i] !== ''){ var tabs_array = lines[i].split('\t'); var current_line_num_tabs = tabs_array.length - 1; if(current_line_num_tabs > previous_line_num_tabs){ html += insertTabs(current_line_num_tabs * 2) + '\n'); } else if (current_line_num_tabs === previous_line_num_tabs) { html += html_stack.pop(); } else if(current_line_num_tabs < previous_line_num_tabs){ html += popHTMLStack(html_stack, current_line_num_tabs, previous_line_num_tabs); } html += insertTabs((current_line_num_tabs * 2) + 1) + '
  • \n'; html += insertTabs((current_line_num_tabs * 2) + 2) + tabs_array[tabs_array.length - 1] + '\n'; html_stack.push(insertTabs((current_line_num_tabs * 2) + 1) + '
  • \n'); previous_line_num_tabs = current_line_num_tabs; } } html += emptyHTMLStack(html_stack); callback(html); } fs.readFile(file_path, 'utf8', function(err, data){ if(err){ console.log(err); } else { parseFile(data, function(html){ var result = '\n'; result += html; result += ''; callback(result); }); } }); };