aboutsummaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorMihai Bazon <mihai.bazon@gmail.com>2015-03-29 12:38:06 +0300
committerMihai Bazon <mihai.bazon@gmail.com>2015-03-29 12:38:06 +0300
commit43991f8d2faa5101bf98473e11eda5516c878b98 (patch)
treef160a7330677302625ae5774883a92f92d55df52 /bin
parent6b82069e1ababc461a52830fa2c076aa8017a09e (diff)
downloadtracifyjs-43991f8d2faa5101bf98473e11eda5516c878b98.tar.gz
tracifyjs-43991f8d2faa5101bf98473e11eda5516c878b98.zip
Add tool to extract property names
Diffstat (limited to 'bin')
-rwxr-xr-xbin/extract-props.js77
1 files changed, 77 insertions, 0 deletions
diff --git a/bin/extract-props.js b/bin/extract-props.js
new file mode 100755
index 00000000..a5b61458
--- /dev/null
+++ b/bin/extract-props.js
@@ -0,0 +1,77 @@
+#! /usr/bin/env node
+
+"use strict";
+
+var U2 = require("../tools/node");
+var fs = require("fs");
+var yargs = require("yargs");
+var ARGS = yargs
+ .describe("o", "Output file")
+ .argv;
+var files = ARGS._.slice();
+var output = {
+ vars: {},
+ props: {}
+};
+
+if (ARGS.o) try {
+ output = JSON.parse(fs.readFileSync(ARGS.o, "utf8"));
+} catch(ex) {}
+
+files.forEach(getProps);
+
+if (ARGS.o) {
+ fs.writeFileSync(ARGS.o, JSON.stringify(output, null, 2), "utf8");
+} else {
+ console.log("%s", JSON.stringify(output, null, 2));
+}
+
+function getProps(filename) {
+ var code = fs.readFileSync(filename, "utf8");
+ var ast = U2.parse(code);
+
+ ast.walk(new U2.TreeWalker(function(node){
+ if (node instanceof U2.AST_ObjectKeyVal) {
+ add(node.key);
+ }
+ else if (node instanceof U2.AST_ObjectProperty) {
+ add(node.key.name);
+ }
+ else if (node instanceof U2.AST_Dot) {
+ add(node.property);
+ }
+ else if (node instanceof U2.AST_Sub) {
+ addStrings(node.property);
+ }
+ }));
+
+ function addStrings(node) {
+ var out = {};
+ try {
+ (function walk(node){
+ node.walk(new U2.TreeWalker(function(node){
+ if (node instanceof U2.AST_Seq) {
+ walk(node.cdr);
+ return true;
+ }
+ if (node instanceof U2.AST_String) {
+ add(node.value);
+ return true;
+ }
+ if (node instanceof U2.AST_Conditional) {
+ walk(node.consequent);
+ walk(node.alternative);
+ return true;
+ }
+ throw out;
+ }));
+ })(node);
+ } catch(ex) {
+ if (ex !== out) throw ex;
+ }
+ }
+
+ function add(name) {
+ output.props[name] = true;
+ }
+}