1 /**
   2  * @class コンストラクタ内でソースコードのパース処理を実行するクラスです。
   3  *        テンプレートの実行時点では、いくつかの静的プロパティを参照するためにだけ使用します。
   4  * @param [opt] <p class="org_comment">Used to override the commandline options. Useful for testing.</p>
   5  * @version $Id: JsDoc.js 773 2009-01-24 09:42:04Z micmath $
   6  */
   7 JSDOC.JsDoc = function(/**object*/ opt) {
   8     if (opt) {
   9         JSDOC.opt = opt;
  10     }
  11     
  12     if (JSDOC.opt.h) {
  13         JSDOC.usage();
  14         quit();
  15     }
  16     
  17     // defend against options that are not sane 
  18     if (JSDOC.opt._.length == 0) {
  19         LOG.warn("No source files to work on. Nothing to do.");
  20         quit();
  21     }
  22     if (JSDOC.opt.t === true || JSDOC.opt.d === true) {
  23         JSDOC.usage();
  24     }
  25     
  26     if (typeof JSDOC.opt.d == "string") {
  27         if (!JSDOC.opt.d.charAt(JSDOC.opt.d.length-1).match(/[\\\/]/)) {
  28             JSDOC.opt.d = JSDOC.opt.d+"/";
  29         }
  30         LOG.inform("Output directory set to '"+JSDOC.opt.d+"'.");
  31         IO.mkPath(JSDOC.opt.d);
  32     }
  33     if (JSDOC.opt.e) IO.setEncoding(JSDOC.opt.e);
  34     
  35     // the -r option: scan source directories recursively
  36     if (typeof JSDOC.opt.r == "boolean") JSDOC.opt.r = 10;
  37     else if (!isNaN(parseInt(JSDOC.opt.r))) JSDOC.opt.r = parseInt(JSDOC.opt.r);
  38     else JSDOC.opt.r = 1;
  39     
  40     // the -D option: define user variables
  41     var D = {};
  42     if (JSDOC.opt.D) {
  43         for (var i = 0; i < JSDOC.opt.D.length; i++) {
  44             var defineParts = JSDOC.opt.D[i].split(":", 2);
  45             if (defineParts) D[defineParts[0]] = defineParts[1];
  46         }
  47     }
  48     JSDOC.opt.D = D;
  49     // combine any conf file D options with the commandline D options
  50     if (defined(JSDOC.conf)) for (var c in JSDOC.conf.D) {
  51          if (!defined(JSDOC.opt.D[c])) {
  52              JSDOC.opt.D[c] = JSDOC.conf.D[c];
  53          }
  54      }
  55     
  56     // Give plugins a chance to initialize
  57     if (defined(JSDOC.PluginManager)) {
  58         JSDOC.PluginManager.run("onInit", JSDOC.opt);
  59     }
  60 
  61     JSDOC.opt.srcFiles = JSDOC.JsDoc._getSrcFiles();
  62     JSDOC.JsDoc._parseSrcFiles();
  63     JSDOC.JsDoc.symbolSet = JSDOC.Parser.symbols;
  64 }
  65 
  66 /**
  67  * @name JSDOC.JsDoc.symbolSet
  68  * @desc ソースコードのパースの結果生成されたシンボルセットオブジェクト
  69  * @type JSDOC.SymbolSet
  70  */
  71 
  72 /**
  73  * @name JSDOC.JsDoc.srcFiles
  74  * @desc 入力ファイルとして処理された全ファイルパスの配列
  75  * @type String[]
  76  */
  77 
  78 /**
  79     Retrieve source file list.
  80     @returns {String[]} The pathnames of the files to be parsed.
  81  */
  82 JSDOC.JsDoc._getSrcFiles = function() {
  83     JSDOC.JsDoc.srcFiles = [];
  84     
  85     var ext = ["js"];
  86     if (JSDOC.opt.x) {
  87         ext = JSDOC.opt.x.split(",").map(function($) {return $.toLowerCase()});
  88     }
  89     
  90     for (var i = 0; i < JSDOC.opt._.length; i++) {
  91         JSDOC.JsDoc.srcFiles = JSDOC.JsDoc.srcFiles.concat(
  92             IO.ls(JSDOC.opt._[i], JSDOC.opt.r).filter(
  93                 function($) {
  94                     var thisExt = $.split(".").pop().toLowerCase();
  95                     
  96                     if (JSDOC.opt.E) {
  97                         for(var n = 0; n < JSDOC.opt.E.length; n++) {
  98                             if ($.match(new RegExp(JSDOC.opt.E[n]))) {
  99                                 LOG.inform("Excluding " + $);
 100                                 return false; // if the file matches the regex then it's excluded.
 101                             }
 102                         }
 103                     }
 104                     
 105                     return (ext.indexOf(thisExt) > -1); // we're only interested in files with certain extensions
 106                 }
 107             )
 108         );
 109     }
 110     
 111     return JSDOC.JsDoc.srcFiles;
 112 }
 113 
 114 JSDOC.JsDoc._parseSrcFiles = function() {
 115     JSDOC.Parser.init();
 116     for (var i = 0, l = JSDOC.JsDoc.srcFiles.length; i < l; i++) {
 117         var srcFile = JSDOC.JsDoc.srcFiles[i];
 118         
 119         if (JSDOC.opt.v) LOG.inform("Parsing file: " + srcFile);
 120         
 121         try {
 122             var src = IO.readFile(srcFile);
 123         }
 124         catch(e) {
 125             LOG.warn("Can't read source file '"+srcFile+"': "+e.message);
 126         }
 127 
 128         var tr = new JSDOC.TokenReader();
 129         var ts = new JSDOC.TokenStream(tr.tokenize(new JSDOC.TextStream(src)));
 130 
 131         JSDOC.Parser.parse(ts, srcFile);
 132 
 133     }
 134     JSDOC.Parser.finish();
 135 
 136     if (JSDOC.PluginManager) {
 137         JSDOC.PluginManager.run("onFinishedParsing", JSDOC.Parser.symbols);
 138     }
 139 }
 140