smirea

Coffeescript class tree generator

May 6th, 2014
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. var class_match_regexp = /^(?:\s*class\s+)([a-z._]+)(?:\s+extends\s+([a-z._]+))?$/i;
  3.  
  4. var fs = require('fs');
  5. var path = require('path');
  6. var depcalc = require('depcalc');
  7.  
  8. var files = recursive_readdir_sync('.');
  9.  
  10. var classes = {};
  11.  
  12. files = files.filter(function (filename) {
  13.   return path.extname(filename) == '.coffee';
  14. });
  15.  
  16. files.forEach(function (filename) {
  17.   var str = fs.readFileSync(filename).toString();
  18.   str.split('\n').forEach(function (line) {
  19.     var match = line.match(class_match_regexp);
  20.     if (!match) return;
  21.     classes[match[1]] = match[2] ? match[2] : null;
  22.   });
  23. });
  24.  
  25.  
  26. var deps = {};
  27.  
  28. Object.keys(classes).forEach(function (cls) {
  29.   if (classes[cls] == null) {
  30.     deps[cls] = [];
  31.     return;
  32.   }
  33.   deps[cls] = [cls];
  34.   deps[cls] = deps[cls].concat(get_deps(classes, classes[cls]));
  35. });
  36.  
  37. var tree = {};
  38.  
  39. Object.keys(deps).forEach(function (cls) {
  40.   var arr = deps[cls].reverse();
  41.   root = tree;
  42.   for (var i=0; i<arr.length; ++i) {
  43.     root[arr[i]] = root[arr[i]] || {};
  44.     root = root[arr[i]];
  45.   }
  46. });
  47.  
  48. var tab = '|   ';
  49. var output = [];
  50.  
  51. var iterate = function (tree, indent) {
  52.   var keys = Object.keys(tree);
  53.  
  54.   if (!keys.length) return;
  55.  
  56.   keys.sort().forEach(function (node) {
  57.     output.push(indent + node);
  58.     iterate(tree[node], indent + tab);
  59.   });
  60. };
  61.  
  62. iterate(tree, '');
  63.  
  64. console.log(output.join('\n'));
  65.  
  66. function get_deps (map, cls) {
  67.   var result = [cls];
  68.   var key = cls;
  69.   while (map[key]) {
  70.     result.push(map[key]);
  71.     key = map[key];
  72.   }
  73.   return result;
  74. }
  75.  
  76. function pick (object, value) {
  77.   var result = [];
  78.   return Object.keys(object).filter(function (key) {
  79.     return object[key] == value;
  80.   });
  81. }
  82.  
  83. function recursive_readdir_sync (root, _queue) {
  84.   _queue = _queue || [];
  85.  
  86.   var list = fs.readdirSync(root).map(function (name) { return path.join(root, name); });
  87.  
  88.   var dirs = list.filter(function (filepath) {
  89.     return fs.lstatSync(filepath).isDirectory();
  90.   });
  91.   dirs.forEach(function (filepath) { recursive_readdir_sync(filepath, _queue); });
  92.  
  93.   list.filter(function (filepath) {
  94.     return dirs.indexOf(filepath) === -1;
  95.   }).forEach(function (filepath) {
  96.     _queue.push(filepath);
  97.   });
  98.  
  99.   return _queue;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment