gappleto97/p2p-project

View on GitHub
docs/docs_walker.js

Summary

Maintainability
C
7 hrs
Test Coverage
var fs = require('fs');
var path = require('path');

function walk(dir, done) {
    var results = [];
    fs.readdir(dir, function(err, list) {
        if (err) return done(err);
        var pending = list.length;
        if (!pending) return done(null, results);
        list.forEach(function(file) {
            file = path.resolve(dir, file);
            file = path.relative(dir, file);
            fs.stat(file, function(err, stat) {
                if (stat && stat.isDirectory()) {
                    walk(file, function(err, res) {
                        results = results.concat(res);
                        if (!--pending) done(null, results);
                    });
                } else {
                    results.push(file);
                    if (!--pending) done(null, results);
                }
            });
        });
    });
};


function execAll(re, string) {
    var match = null;
    var matches = [];
    // For each match in the string:
    while (match = re.exec(string)) {
        matches.push(match.slice());  // Push a copy of it onto the return array
    }
    return matches;
}

var folder_map = {
    js_src: "javascript",
    jv_src: "java",
    cp_src: "cpp",
    c_src: "c"
};
var find_relevant_comments = /\/\*\*\r?\n(?:(?:(?![\n\r])\s)*\*([^\r\n]*)\r?\n)*\s*\*\//g;  // http://regexr.com/3eb1d
var extract_lines = /(?:(?![\n\r])\s)*\*[ ]?([^\r\n\*\/][^\r\n]*)?\r?\n/g;  // http://regexr.com/3ecnv

function gen_walker(folder) {
    return function done(err, res) {
        if (err) throw err;
        var docs_folder = path.resolve('docs', folder_map[folder]);
        for (var i = 0; i < res.length; i++)  {
            var file = path.resolve('.', folder, res[i]);
            try {
                if (fs.lstatSync(file).isDirectory())   {
                    continue;
                }
            }
            catch (e) {
                continue;
            }
            var ending = res[i].substr(res[i].lastIndexOf(".") && res[i].indexOf("wrapper") < 0);
            if (ending === ".cpp" || ending === ".c")
                continue;
            var file_dest_name = res[i].substr(0, res[i].lastIndexOf(".")) + ".rst";
            var file_dest = path.resolve(docs_folder, file_dest_name);
            var string = fs.readFileSync(file);
            var comments = execAll(find_relevant_comments, string);
            var content = "";
            for (var j = 0; j < comments.length; j++) {
                var lines = execAll(extract_lines, comments[j]);
                for (var h = 0; h < lines.length; h++)  {
                    if (lines[h][1] === undefined)     {
                        content += "\n";
                    }
                    else    {
                        content += lines[h][1] + "\n";
                    }
                }
            }
            content += "\n\n";
            var options = { flag : 'w' };
            fs.writeFile(file_dest, content, options, (err) => {
                if (err && err.code !== 'ENOENT')
                    throw err;
            });
        }
    }
}

walk('js_src', gen_walker('js_src'));
walk('jv_src', gen_walker('jv_src'));
walk('cp_src', gen_walker('cp_src'));
walk('c_src', gen_walker('c_src'));

// walk(dir, function(err, results) {
//       if (err) throw err;
//       console.log(results);
//     });