Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var fs = require("fs");
- var path = require("path");
- var tokenizer = require("js-tokenizer");
- // Get directory
- var targetDir = process.argv[2];
- var outputFile = targetDir + "/events_map.txt";
- var fileCount = 0, dirCount = 0, errCount = 0;
- var globalEventMap = {};
- var filesToParse = [];
- $ = {};
- $.each = function(obj, func)
- {
- var keys = Object.keys(obj);
- keys.sort();
- for (var i = 0; i < keys.length; i++)
- {
- var key = keys[i];
- func(key, obj[key]);
- }
- };
- function scanJS(path, name)
- {
- fileCount++;
- var str = fs.readFileSync(path, { "encoding": "UTF8" });
- var tokenArray;
- try
- {
- tokenArray = tokenizer(str);
- }
- catch (err)
- {
- console.warn("Could not tokenise '" + path + "'... " + err.stack);
- errCount++;
- return;
- }
- //console.log(something);
- // RS.Events.publish(RS.Felt.Something.MyEvent);
- // 'RS', '.', 'Events', '.', 'publish', '(', ..., ',', ..., ')', ';'
- // Find the start of a event library call
- for (var i = 0; i < tokenArray.length - 6; i++)
- {
- if (tokenArray[i] === 'RS'
- && tokenArray[i+1] === '.'
- && tokenArray[i+2] === 'Events'
- && tokenArray[i+3] === '.')
- {
- // Identify publish or subscribe
- if (tokenArray[i+4] === 'publish'
- && tokenArray[i+5] === '(')
- {
- var eventName = findEventName(tokenArray, i+6);
- var eventMap = globalEventMap[eventName] || (globalEventMap[eventName] = {});
- var eventPublishers = eventMap["publishers"] || (eventMap["publishers"] = {});
- eventPublishers[name] = (eventPublishers[name] || 0) + 1;
- }
- else if (tokenArray[i+4] === 'subscribe'
- && tokenArray[i+5] === '(')
- {
- var eventName = findEventName(tokenArray, i+6);
- var eventMap = globalEventMap[eventName] || (globalEventMap[eventName] = {});
- var eventSubscribers = eventMap["subscribers"] || (eventMap["subscribers"] = {});
- eventSubscribers[name] = (eventSubscribers[name] || 0) + 1;
- }
- }
- }
- //console.log(str.length);
- }
- function scanDir(dir)
- {
- dirCount++;
- var items = fs.readdirSync(dir);
- for (var i = 0; i < items.length; i++)
- {
- var item = items[i];
- var absPath = dir + "/" + item
- var ext = path.extname(item);
- if (ext == ".js")
- {
- //scanJS(absPath, item);
- //return;
- filesToParse.push({ "name": item, "path": absPath });
- }
- else
- {
- var stat = null;
- try
- {
- stat = fs.lstatSync(absPath);
- }
- catch (err) {};
- if (stat && stat.isDirectory())
- {
- scanDir(absPath);
- }
- }
- }
- };
- function resolveNameConflicts()
- {
- var conflictCount = -1;
- var resolveAttempts = 0;
- while (conflictCount != 0)
- {
- resolveAttempts++;
- if (resolveAttempts > 5)
- {
- console.warn("Exceeded maximum name conflict resolve attempt count...");
- break;
- }
- conflictCount = 0;
- var conflictMap = {};
- for (var i = 0; i < filesToParse.length; i++)
- {
- var fileInfo = filesToParse[i];
- if (conflictMap[fileInfo.name] && !fileInfo.ignoreConflicts)
- {
- conflictCount++;
- fileInfo.conflicted = true;
- conflictMap[fileInfo.name].conflicted = true;
- }
- else
- {
- conflictMap[fileInfo.name] = fileInfo;
- }
- }
- for (var i = 0; i < filesToParse.length; i++)
- {
- var fileInfo = filesToParse[i];
- if (fileInfo.conflicted)
- {
- if (fileInfo.name === fileInfo.path)
- {
- fileInfo.ignoreConflicts = true;
- }
- else
- {
- fileInfo.conflictResolveAttempts = (fileInfo.conflictResolveAttempts || 0) + 1;
- var spl = fileInfo.path.split('/');
- var newName = "";
- for (var j = spl.length - (fileInfo.conflictResolveAttempts+1); j < spl.length; j++)
- {
- newName += spl[j];
- if (j < spl.length - 1) newName += '/';
- }
- console.log("Resolved '" + fileInfo.name + "' into '" + newName + "'");
- fileInfo.name = newName;
- }
- fileInfo.conflicted = null;
- }
- }
- }
- }
- function parseFiles()
- {
- for (var i = 0; i < filesToParse.length; i++)
- {
- var fileInfo = filesToParse[i];
- scanJS(fileInfo.path, fileInfo.name);
- }
- }
- function findEventName(tokenArr, startIdx)
- {
- // Loop till we find a commo
- var str = "";
- for (var i = startIdx; i < tokenArr.length; i++)
- {
- var token = tokenArr[i];
- if (token == ',' || token == ')') break;
- str += token;
- }
- return str.trim();
- };
- function dumpEventMap()
- {
- var header = "";
- var body = "";
- var eventCount = 0;
- $.each(globalEventMap, function(key, val)
- {
- eventCount++;
- body += (key + ":\n");
- if (val.publishers)
- {
- body += "\tPublishers:\n";
- $.each(val.publishers, function(key, val)
- {
- body += "\t\t";
- body += key;
- body += " (" + val + " locations)\n";
- });
- }
- if (val.subscribers)
- {
- body += "\tSubscribers:\n";
- $.each(val.subscribers, function(key, val)
- {
- body += "\t\t";
- body += key;
- body += "\n";
- });
- }
- body += "\n";
- });
- header += "== Event Map ==\n";
- header += "Created on " + (new Date()).toString() + " by AnalyseEvents.js\n\n";
- header += "There are " + eventCount + " documented events:\n\n";
- return header + body;
- }
- scanDir(targetDir);
- resolveNameConflicts();
- parseFiles();
- var str = dumpEventMap();
- if (fs.existsSync(outputFile)) fs.unlinkSync(outputFile);
- fs.writeFileSync(outputFile, str);
- console.log("Scanned " + fileCount + " files and " + dirCount + " directories.");
- if (errCount > 0)
- {
- console.log("Out of these, " + errCount + " wern't parsed due to tokeniser errors.");
- }
Advertisement
Add Comment
Please, Sign In to add comment