Files
rappaurio-sae501_502/app/node_modules/cejs/_documents/JsDoc/symbols/src/D__USB_cgi-bin_lib_JS_ce.origin.js.html
2023-09-25 13:27:24 +02:00

3987 lines
679 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"> <style>
.KEYW {color: #933;}
.COMM {color: #bbb; font-style: italic;}
.NUMB {color: #393;}
.STRN {color: #393;}
.REGX {color: #339;}
.line {border-right: 1px dotted #666; color: #666; font-style: normal;}
</style></head><body><pre><span class='line'> 1</span> <span class="TOKN"></span><span class="WHIT">
<span class='line'> 2</span> </span><span class="COMM">/*
<span class='line'> 3</span> 本檔案為自動生成,請勿編輯!
<span class='line'> 4</span> This file is auto created from _structure\structure.js, base.js, module.js, initialization.js
<span class='line'> 5</span> by tool: build main script.
<span class='line'> 6</span> */</span><span class="WHIT">
<span class='line'> 7</span>
<span class='line'> 8</span>
<span class='line'> 9</span> </span><span class="COMM">//&lt;![CDATA[</span><span class="WHIT">
<span class='line'> 10</span>
<span class='line'> 11</span>
<span class='line'> 12</span> </span><span class="COMM">/**
<span class='line'> 13</span> * @name JavaScript framework: CeL base loader
<span class='line'> 14</span> * @fileoverview
<span class='line'> 15</span> * Colorless echo JavaScript kit/library base loader.
<span class='line'> 16</span> * 本檔案包含了呼叫其他 library 需要用到的 function以及常用 base functions。&lt;br/>
<span class='line'> 17</span> * A JavaScript module framework that is simple to use.&lt;br/>
<span class='line'> 18</span> * 本計畫希望能建立一個能簡單上手的 JavaScript 模組架構。
<span class='line'> 19</span> * &lt;br/>
<span class='line'> 20</span> * 2002-, kanashimi &lt;kanasimi@gmail.com>.&lt;br/>
<span class='line'> 21</span> * &lt;br/>
<span class='line'> 22</span> * This file is in tab wide of 4 chars, documentation with JsDoc Toolkit (&lt;a href="http://code.google.com/p/jsdoc-toolkit/wiki/TagReference">tags&lt;/a>).&lt;br/>
<span class='line'> 23</span> * &lt;br/>
<span class='line'> 24</span> * &lt;br/>Please visit &lt;a href="http://lyrics.meicho.com.tw/program/">Colorless echo program room&lt;/a> for more informations.
<span class='line'> 25</span> * @since 自 function.js 0.2 改寫
<span class='line'> 26</span> * @since JavaScript 1.2
<span class='line'> 27</span> * @since 2010/1/9 00:01:52 建立
<span class='line'> 28</span> * @author kanasimi@gmail.com
<span class='line'> 29</span> * @version $Id: ce.js,v 0.2 2009/11/26 18:37:11 kanashimi Exp $
<span class='line'> 30</span> */</span><span class="WHIT">
<span class='line'> 31</span>
<span class='line'> 32</span>
<span class='line'> 33</span> </span><span class="COMM">/*
<span class='line'> 34</span> 引用:參照
<span class='line'> 35</span> function addCode
<span class='line'> 36</span>
<span class='line'> 37</span> CeL.module
<span class='line'> 38</span>
<span class='line'> 39</span>
<span class='line'> 40</span> 駝峰式大小寫命名規則 CamelCase → embedded_underscore/Snake case
<span class='line'> 41</span>
<span class='line'> 42</span>
<span class='line'> 43</span> 單一JS引用
<span class='line'> 44</span> // [function.js]_iF
<span class='line'> 45</span> function _iF(){}_iF.p='HKCU\\Software\\Colorless echo\\function.js.path';if(typeof WScript=="object")try{eval(getU((new ActiveXObject("WScript.Shell")).RegRead(_iF.p)));}catch(e){}
<span class='line'> 46</span> function getU(p,enc){var o;try{o=new ActiveXObject('Microsoft.XMLHTTP');}catch(e){o=new XMLHttpRequest();}if(o)with(o){open('GET',p,false);if(enc&&o.overrideMimeType)overrideMimeType('text/xml;charset='+enc);send(null);return responseText;}}
<span class='line'> 47</span> // [function.js]End
<span class='line'> 48</span>
<span class='line'> 49</span>
<span class='line'> 50</span> 初始化:參照
<span class='line'> 51</span> initialization of function.js
<span class='line'> 52</span>
<span class='line'> 53</span> http://www.w3school.com.cn/html5/html5_script.asp
<span class='line'> 54</span> &lt;script type="text/javascript" async="true" src="path/to/function.js">&lt;/script>
<span class='line'> 55</span> &lt;script type="application/javascript;version=1.7" async="true" src="path/to/function.js">&lt;/script>
<span class='line'> 56</span>
<span class='line'> 57</span> JSDoc:
<span class='line'> 58</span> http://code.google.com/p/jsdoc-toolkit/w/list
<span class='line'> 59</span> http://jsdoc.sourceforge.net/
<span class='line'> 60</span>
<span class='line'> 61</span> Javadoc:
<span class='line'> 62</span> http://java.sun.com/j2se/javadoc/writingdoccomments/
<span class='line'> 63</span>
<span class='line'> 64</span> VSdoc:
<span class='line'> 65</span> JScript IntelliSense in Visual Studio
<span class='line'> 66</span> http://weblogs.asp.net/bleroy/archive/2007/04/23/the-format-for-javascript-doc-comments.aspx
<span class='line'> 67</span> http://blogs.msdn.com/b/webdevtools/archive/2008/11/07/hotfix-to-enable-vsdoc-js-intellisense-doc-files-is-now-available.aspx
<span class='line'> 68</span> Create JScript XML Code Comments
<span class='line'> 69</span> http://msdn.microsoft.com/zh-tw/library/bb514138.aspx
<span class='line'> 70</span> http://blog.miniasp.com/post/2010/04/Visual-Studio-2010-jQuery-Development-Tips.aspx
<span class='line'> 71</span>
<span class='line'> 72</span> */</span><span class="WHIT">
<span class='line'> 73</span>
<span class='line'> 74</span>
<span class='line'> 75</span>
<span class='line'> 76</span> </span><span class="COMM">/*
<span class='line'> 77</span> TODO
<span class='line'> 78</span>
<span class='line'> 79</span> 本 library 大量使用了 arguments.callee但這與 ECMAScript design principles 不甚相符,需要避免。
<span class='line'> 80</span> http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript
<span class='line'> 81</span> http://wiki.ecmascript.org/doku.php?id=es3.1:design_principles
<span class='line'> 82</span>
<span class='line'> 83</span>
<span class='line'> 84</span> reset environment (__defineSetter__, __defineGetter__, ..)
<span class='line'> 85</span> in case of
<span class='line'> 86</span> &lt;a href="http://haacked.com/archive/2009/06/25/json-hijacking.aspx" accessdate="2009/12/2 0:7">JSON Hijacking&lt;/a>,
<span class='line'> 87</span> &lt;a href="http://blog.miniasp.com/post/2009/11/JavaScript-JSON-Hijacking.aspx" accessdate="2009/12/2 0:18">在 Web 2.0 時代必須重視 JavaScript/JSON Hijacking 攻擊&lt;/a>,
<span class='line'> 88</span> etc.
<span class='line'> 89</span> */</span><span class="WHIT">
<span class='line'> 90</span>
<span class='line'> 91</span>
<span class='line'> 92</span> </span><span class="COMM">//try{</span><span class="WHIT">
<span class='line'> 93</span>
<span class='line'> 94</span>
<span class='line'> 95</span>
<span class='line'> 96</span>
<span class='line'> 97</span>
<span class='line'> 98</span>
<span class='line'> 99</span> </span><span class="COMM">/*
<span class='line'>100</span> TODO
<span class='line'>101</span> 將 module_name 改成 arguments
<span class='line'>102</span> http://threecups.org/?p=129
<span class='line'>103</span>
<span class='line'>104</span> listen language change event
<span class='line'>105</span> play board
<span class='line'>106</span>
<span class='line'>107</span> use &lt;a href="http://prototyp.ical.ly/index.php/2007/03/01/javascript-design-patterns-1-the-singleton/" accessdate="2010/4/25 0:23" title="prototyp.ical.ly &amp;raquo; Javascript Design Patterns - 1. The Singleton">Singleton pattern&lt;/a>,
<span class='line'>108</span> Module 模式或單例模式(&lt;a href="http://zh.wikipedia.org/wiki/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F" accessdate="2010/4/25 0:25" title="单例模式">Singleton&lt;/a>&lt;a href="http://www.comsharp.com/GetKnowledge/zh-CN/TeamBlogTimothyPage_K950.aspx" accessdate="2010/4/25 0:24" title="那些相见恨晚的 JavaScript 技巧 - 基于 COMSHARP CMS">為 Douglas Crockford 所推崇&lt;/a>,並被大量應用在 Yahoo User Interface Library YUI。
<span class='line'>109</span>
<span class='line'>110</span> http://wiki.forum.nokia.com/index.php/JavaScript_Performance_Best_Practices
<span class='line'>111</span> http://ioio.name/core-javascript-pitfalls.html
<span class='line'>112</span>
<span class='line'>113</span> CommonJS
<span class='line'>114</span> http://www.heliximitate.cn/studyblog/archives/tag/commonjs
<span class='line'>115</span>
<span class='line'>116</span> */</span><span class="WHIT">
<span class='line'>117</span>
<span class='line'>118</span>
<span class='line'>119</span> </span><span class="COMM">/*
<span class='line'>120</span> TODO
<span class='line'>121</span>
<span class='line'>122</span>
<span class='line'>123</span>
<span class='line'>124</span> //module
<span class='line'>125</span>
<span class='line'>126</span> //typeof CeL_id === 'string' && typeof this[CeL_id] === 'function' &&
<span class='line'>127</span> typeof CeL === 'function' && CeL.setup_module({
<span class='line'>128</span> name:[module_name],
<span class='line'>129</span> require:[function_name,module_name],
<span class='line'>130</span>
<span class='line'>131</span> code:function(CeL){
<span class='line'>132</span>
<span class='line'>133</span> var private_value=1;
<span class='line'>134</span>
<span class='line'>135</span> function module_function_1(arg) {
<span class='line'>136</span> ;
<span class='line'>137</span> }
<span class='line'>138</span> module_function_1.required='';
<span class='line'>139</span>
<span class='line'>140</span>
<span class='line'>141</span> function module_class_1(arg) {
<span class='line'>142</span> ;
<span class='line'>143</span> }
<span class='line'>144</span>
<span class='line'>145</span> function get_value(){
<span class='line'>146</span> return private_value;
<span class='line'>147</span> }
<span class='line'>148</span>
<span class='line'>149</span> module_class_1.prototype.print=function(){};
<span class='line'>150</span> module_class_1.print=function(){};
<span class='line'>151</span>
<span class='line'>152</span>
<span class='line'>153</span> return {module_function_1,module_class_1};
<span class='line'>154</span>
<span class='line'>155</span> }
<span class='line'>156</span>
<span class='line'>157</span> });
<span class='line'>158</span>
<span class='line'>159</span> 2011/7/31 21:18:01
<span class='line'>160</span>
<span class='line'>161</span>
<span class='line'>162</span>
<span class='line'>163</span>
<span class='line'>164</span> */</span><span class="WHIT">
<span class='line'>165</span>
<span class='line'>166</span> </span><span class="COMM">//void(</span><span class="WHIT">
<span class='line'>167</span> </span><span class="COMM">//typeof CeL !== 'function' &&</span><span class="WHIT">
<span class='line'>168</span> </span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>169</span> </span><span class="COMM">/*
<span class='line'>170</span> * We can redefine native values only for undefined.&lt;br/>
<span class='line'>171</span> * http://weblogs.asp.net/bleroy/archive/2006/08/02/Define-undefined.aspx&lt;br/>
<span class='line'>172</span> * &lt;br/>
<span class='line'>173</span> * Will speed up references to undefined, and allows redefining its name. (from jQuery)&lt;br/>
<span class='line'>174</span> * &lt;br/>
<span class='line'>175</span> * 用在比較或是 return undefined&lt;br/>
<span class='line'>176</span> * 在舊的 browser 中undefined 可能不存在。
<span class='line'>177</span> */</span><span class="WHIT">
<span class='line'>178</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>179</span>
<span class='line'>180</span> </span><span class="COMM">/*
<span class='line'>181</span> * ECMA-262 5th edition, ECMAScript 5 strict mode
<span class='line'>182</span> * http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
<span class='line'>183</span> * http://davidflanagan.com/Talks/es5/slides.html
<span class='line'>184</span> * http://kangax.github.com/es5-compat-table/
<span class='line'>185</span> */</span><span class="WHIT">
<span class='line'>186</span> </span><span class="STRN">'use strict'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>187</span>
<span class='line'>188</span>
<span class='line'>189</span> </span><span class="COMM">//if(typeof global !== 'function') throw new Error('No global object specified!');</span><span class="WHIT">
<span class='line'>190</span>
<span class='line'>191</span>
<span class='line'>192</span> </span><span class="KEYW">var</span><span class="WHIT">
<span class='line'>193</span> </span><span class="WHIT"> </span><span class="NAME">library_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'CeL'</span><span class="WHIT">
<span class='line'>194</span>
<span class='line'>195</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>196</span> * default debug level
<span class='line'>197</span> * @type {Integer}
<span class='line'>198</span> * @ignore
<span class='line'>199</span> */</span><span class="WHIT">
<span class='line'>200</span> </span><span class="WHIT"> </span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">debug</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT">
<span class='line'>201</span>
<span class='line'>202</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>203</span> * library version
<span class='line'>204</span> * @type {String}
<span class='line'>205</span> * @ignore
<span class='line'>206</span> */</span><span class="WHIT">
<span class='line'>207</span> </span><span class="WHIT"> </span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">version</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'2011.08.04'</span><span class="WHIT">
<span class='line'>208</span>
<span class='line'>209</span> </span><span class="WHIT"> </span><span class="COMM">//,window</span><span class="WHIT">
<span class='line'>210</span>
<span class='line'>211</span> </span><span class="WHIT"> </span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">old_namespace</span><span class="WHIT">
<span class='line'>212</span>
<span class='line'>213</span> </span><span class="WHIT"> </span><span class="COMM">// library base name-space</span><span class="WHIT">
<span class='line'>214</span> </span><span class="WHIT"> </span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">_</span><span class="WHIT">
<span class='line'>215</span>
<span class='line'>216</span> </span><span class="WHIT"> </span><span class="COMM">//, _base_function_to_extend</span><span class="WHIT">
<span class='line'>217</span>
<span class='line'>218</span> </span><span class="WHIT"> </span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">function_name_pattern</span><span class="WHIT">
<span class='line'>219</span> </span><span class="WHIT"> </span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>220</span>
<span class='line'>221</span>
<span class='line'>222</span> </span><span class="COMM">// members of library -----------------------------------------------</span><span class="WHIT">
<span class='line'>223</span> </span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>224</span>
<span class='line'>225</span>
<span class='line'>226</span> </span><span class="COMM">/**
<span class='line'>227</span> * Global Scope object&lt;br/>
<span class='line'>228</span> * 於 CeL.eval_code 使用
<span class='line'>229</span> * @ignore
<span class='line'>230</span> * @see
<span class='line'>231</span> * &lt;a href="http://stackoverflow.com/questions/3277182/how-to-get-the-global-object-in-javascript" accessdate="2011/8/6 10:7">How to get the Global Object in JavaScript? - Stack Overflow&lt;/a>
<span class='line'>232</span> */</span><span class="WHIT">
<span class='line'>233</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">global</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Function</span><span class="PUNC">(</span><span class="STRN">'return this'</span><span class="PUNC">)</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// isWeb()?window:this;</span><span class="WHIT">
<span class='line'>234</span>
<span class='line'>235</span> </span><span class="NAME">old_namespace</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">global</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">global</span><span class="PUNC">[</span><span class="NAME">library_name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>236</span>
<span class='line'>237</span>
<span class='line'>238</span> </span><span class="COMM">/*
<span class='line'>239</span> var _Global=(function(){return this;})();
<span class='line'>240</span> _Global.JustANumber=2; // var _GlobalPrototype=_Global.constructor.prototype;_GlobalPrototype.JustANumber=2;
<span class='line'>241</span> if(typeof _Global=='undefined')_Global=this;
<span class='line'>242</span> for(i in _Global)alert(i);
<span class='line'>243</span> */</span><span class="WHIT">
<span class='line'>244</span>
<span class='line'>245</span> </span><span class="COMM">// 若已經定義過,跳過。因為已有對 conflict 的對策,因此跳過。</span><span class="WHIT">
<span class='line'>246</span> </span><span class="COMM">//if(global[library_name] !== undefined) return;</span><span class="WHIT">
<span class='line'>247</span>
<span class='line'>248</span>
<span class='line'>249</span> </span><span class="COMM">/**
<span class='line'>250</span> * Will speed up references to DOM: window, and allows redefining its name. (from jQuery)
<span class='line'>251</span> * @ignore
<span class='line'>252</span> */</span><span class="WHIT">
<span class='line'>253</span> </span><span class="COMM">//window = this;</span><span class="WHIT">
<span class='line'>254</span>
<span class='line'>255</span>
<span class='line'>256</span> </span><span class="COMM">/**
<span class='line'>257</span> * 本 JavaScript framework 的框架基本宣告&lt;br/>
<span class='line'>258</span> * base name-space declaration of JavaScript library framework
<span class='line'>259</span> * @example
<span class='line'>260</span> * // load library
<span class='line'>261</span> * &lt;script type="text/javascript" src="../ce.js">&lt;/script>
<span class='line'>262</span> * // 預防 initialization 到一半彈出警告視窗,所以設大一點。
<span class='line'>263</span> * CeL.log.max_length = 20;
<span class='line'>264</span> * // set debug
<span class='line'>265</span> * CeL.set_debug();
<span class='line'>266</span> *
<span class='line'>267</span> * // 判別是否已經 load 過
<span class='line'>268</span> * if(typeof CeL !== 'function' || CeL.Class !== 'CeL')
<span class='line'>269</span> * ; // CeL has not been loaded
<span class='line'>270</span> * @name CeL
<span class='line'>271</span> * @class Colorless echo JavaScript kit/library: base name-space declaration
<span class='line'>272</span> */</span><span class="WHIT">
<span class='line'>273</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>274</span> </span><span class="WHIT"> </span><span class="COMM">// function CeL: library root</span><span class="WHIT">
<span class='line'>275</span> </span><span class="WHIT"> </span><span class="COMM">// declaration for debug</span><span class="WHIT">
<span class='line'>276</span> </span><span class="WHIT"> </span><span class="COMM">//this.global = arguments[0] || arguments.callee.ce_doc;</span><span class="WHIT">
<span class='line'>277</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.init.apply</span><span class="PUNC">(</span><span class="NAME">global</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>278</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>279</span>
<span class='line'>280</span>
<span class='line'>281</span> </span><span class="COMM">// name-space 歸屬設定</span><span class="WHIT">
<span class='line'>282</span>
<span class='line'>283</span> </span><span class="COMM">/**
<span class='line'>284</span> * Map over main name-space in case of overwrite (from jQuery)
<span class='line'>285</span> * @ignore
<span class='line'>286</span> */</span><span class="WHIT">
<span class='line'>287</span> </span><span class="NAME">global</span><span class="PUNC">[</span><span class="NAME">library_name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>288</span>
<span class='line'>289</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>290</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>291</span> </span><span class="NAME">get_old_namespace</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>292</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">old_namespace</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>293</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>294</span>
<span class='line'>295</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>296</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>297</span> </span><span class="NAME">recover_namespace</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>298</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">old_namespace</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>299</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">global</span><span class="PUNC">[</span><span class="NAME">library_name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>300</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>301</span> </span><span class="WHIT"> </span><span class="NAME">global</span><span class="PUNC">[</span><span class="NAME">library_name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">old_namespace</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>302</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>303</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>304</span>
<span class='line'>305</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">_.prototype</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>306</span> </span><span class="WHIT"> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>307</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>308</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>309</span> * framework main prototype definition
<span class='line'>310</span> * for JSDT: 有 prototype 才會將之當作 Class
<span class='line'>311</span> */</span><span class="WHIT">
<span class='line'>312</span> </span><span class="WHIT"> </span><span class="NAME">prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>313</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>314</span>
<span class='line'>315</span>
<span class='line'>316</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>317</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>318</span> </span><span class="COMM">/**
<span class='line'>319</span> * JavaScript library framework main class name.
<span class='line'>320</span> * @see &lt;a href="http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf">ECMA-262&lt;/a>: Object.Class: A string value indicating the kind of this object.
<span class='line'>321</span> * @constant
<span class='line'>322</span> */</span><span class="WHIT">
<span class='line'>323</span> </span><span class="NAME">Class</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">library_name</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>324</span>
<span class='line'>325</span>
<span class='line'>326</span>
<span class='line'>327</span>
<span class='line'>328</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>329</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>330</span> </span><span class="COMM">/**
<span class='line'>331</span> * 本 library 專用之 evaluate()。
<span class='line'>332</span> *
<span class='line'>333</span> * 若在 function 中 eval 以獲得 local variable在舊 browser 中須加 var。
<span class='line'>334</span> * e.g., 'var local_variable=' + ..
<span class='line'>335</span> * 不加 var 在舊 browser 中會變成 global 變數。
<span class='line'>336</span> * @param code script code to evaluate
<span class='line'>337</span> * @returns value that evaluate process returned
<span class='line'>338</span> * @see window.eval === window.parent.eval
<span class='line'>339</span> * http://stackoverflow.com/questions/3277182/how-to-get-the-global-object-in-javascript
<span class='line'>340</span> */</span><span class="WHIT">
<span class='line'>341</span> </span><span class="NAME">eval_code</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">eval_code</span><span class="PUNC">(</span><span class="NAME">code</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>342</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>343</span> JSC eval() takes an optional second argument which can be 'unsafe'.
<span class='line'>344</span> Mozilla/SpiderMonkey eval() takes an optional second argument which is the scope object for new symbols.
<span class='line'>345</span>
<span class='line'>346</span> use window.execScript(code,"JavaScript") in IE: window.execScript() 將直接使用全局上下文環境因此execScript(Str)中的字符串Str可以影響全局變量。——也包括聲明全局變量、函數以及對象構造器。
<span class='line'>347</span> */</span><span class="WHIT">
<span class='line'>348</span> </span><span class="WHIT"> </span><span class="COMM">//this.debug(global.eval, 2);</span><span class="WHIT">
<span class='line'>349</span> </span><span class="WHIT"> </span><span class="COMM">//this.debug(global && global.eval && global.eval !== arguments.callee);</span><span class="WHIT">
<span class='line'>350</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">global</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">global.eval</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">global.eval</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">eval_code</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">global.eval.call</span><span class="PUNC">(</span><span class="NAME">global</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">code</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">eval</span><span class="PUNC">(</span><span class="NAME">code</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>351</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>352</span>
<span class='line'>353</span>
<span class='line'>354</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>355</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>356</span> </span><span class="COMM">/**
<span class='line'>357</span> * evaluate @ Global scope.
<span class='line'>358</span> * By the ECMA-262, new Function() will 'Pass in the Global Environment as the Scope parameter.'
<span class='line'>359</span> * copy from jQuery core.js
<span class='line'>360</span> * @param code script code to evaluate
<span class='line'>361</span> * @returns value that evaluate process returned
<span class='line'>362</span> * @see
<span class='line'>363</span> * &lt;a href="http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context" accessdate="2011/8/6 8:56">Eval JavaScript in a global context | Java.net&lt;/a>
<span class='line'>364</span> * use execScript on Internet Explorer
<span class='line'>365</span> */</span><span class="WHIT">
<span class='line'>366</span> </span><span class="NAME">global_eval</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Function</span><span class="PUNC">(</span><span class="STRN">'code'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'return '</span><span class="WHIT">
<span class='line'>367</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">global.execScript</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'global.execScript('</span><span class="WHIT">
<span class='line'>368</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">global.eval</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'global.eval.call(global,'</span><span class="WHIT">
<span class='line'>369</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">window</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">window.eval</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'window.eval.call(window,'</span><span class="WHIT">
<span class='line'>370</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'eval.call(null,'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>371</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'code);'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>372</span>
<span class='line'>373</span>
<span class='line'>374</span>
<span class='line'>375</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>376</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>377</span> </span><span class="COMM">/**
<span class='line'>378</span> * simple evaluates to get value of specified variable identifier name.
<span class='line'>379</span> * 不使用 eval().
<span class='line'>380</span> * @param {String} variable_name variable identifier name. e.g., /[a-z\d$_]+(.[a-z\d_]+)+/i
<span class='line'>381</span> * @param {Object|Function} [name_space] initialize name-space. default: global
<span class='line'>382</span> * @returns value of specified variable identifier name
<span class='line'>383</span> * @since 2010/1/1 18:11:40
<span class='line'>384</span> * @note
<span class='line'>385</span> * 'namespace' 是 JScript.NET 的保留字
<span class='line'>386</span> *
<span class='line'>387</span> * 在兩個子層(a.b.c)下,這樣作效率較差 @User agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.29 Safari/533.4:
<span class='line'>388</span> * function(v){try{return(new Function('return('+v+')'))();}catch(e){}}
<span class='line'>389</span> */</span><span class="WHIT">
<span class='line'>390</span> </span><span class="NAME">get_variable</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">variable_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>391</span> </span><span class="WHIT"> </span><span class="COMM">//this.debug('get value of [' + variable_name + ']');</span><span class="WHIT">
<span class='line'>392</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">variable_name</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">variable_name</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>393</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">variable_name</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>394</span>
<span class='line'>395</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>396</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: 可處理 e.g., obj1 . obj2 [ ' obj3.4 * \[ ' ] [''] . obj5 [ " obj6 \" \' \] . " ]</span><span class="WHIT">
<span class='line'>397</span> </span><span class="WHIT"> </span><span class="COMM">// or detect obj1 .. obj2</span><span class="WHIT">
<span class='line'>398</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">variable_name.split</span><span class="PUNC">(</span><span class="STRN">'.'</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>399</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">s.length</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>400</span> </span><span class="WHIT"> </span><span class="NAME">v</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT">
<span class='line'>401</span> </span><span class="WHIT"> </span><span class="COMM">//this.env.global</span><span class="WHIT">
<span class='line'>402</span> </span><span class="WHIT"> </span><span class="NAME">global</span><span class="WHIT">
<span class='line'>403</span> </span><span class="WHIT"> </span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>404</span> </span><span class="WHIT"> </span><span class="COMM">//this.debug('global.' + this.Class + ' = ' + this.env.global[this.Class]);</span><span class="WHIT">
<span class='line'>405</span>
<span class='line'>406</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>407</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>408</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>409</span> </span><span class="WHIT"> </span><span class="COMM">// this.debug('to [' + s[i] + ']: ' + v[s[i]]),</span><span class="WHIT">
<span class='line'>410</span> </span><span class="WHIT"> </span><span class="NAME">v</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">v</span><span class="PUNC">[</span><span class="NAME">s</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">]</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>411</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>412</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>413</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>414</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">[</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'&lt;em>'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">[</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'&lt;/em>&lt;span class="debug_weaken">'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>415</span> </span><span class="WHIT"> </span><span class="COMM">//alert(this.log.buffer.length+','+this.log.max_length+'\n'+this.debug);</span><span class="WHIT">
<span class='line'>416</span> </span><span class="WHIT"> </span><span class="NAME">this.debug</span><span class="PUNC">(</span><span class="STRN">'Cannot get [&lt;span title="'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">variable_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'">'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">s.join</span><span class="PUNC">(</span><span class="STRN">'.'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'&lt;/span>&lt;/span>]!'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'get_variable'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>417</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>418</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>419</span>
<span class='line'>420</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">v</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>421</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>422</span>
<span class='line'>423</span>
<span class='line'>424</span>
<span class='line'>425</span>
<span class='line'>426</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>427</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>428</span> </span><span class="COMM">/**
<span class='line'>429</span> * 取得執行 script 之 path, 在 .hta 中取代 WScript.ScriptFullName。
<span class='line'>430</span> * @returns {String} 執行 script 之 path
<span class='line'>431</span> * @returns '' unknown environment
<span class='line'>432</span> */</span><span class="WHIT">
<span class='line'>433</span> </span><span class="NAME">get_script_full_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>434</span> </span><span class="WHIT"> </span><span class="COMM">// 在 IE8, IE9 中get_object_type.call(WScript) 為 '[object Object]' !!</span><span class="WHIT">
<span class='line'>435</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">WScript</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this.is_Object</span><span class="PUNC">(</span><span class="NAME">WScript</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">WScript</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'Windows Script Host'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>436</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">WScript.ScriptFullName</span><span class="WHIT">
<span class='line'>437</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">location</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">location</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">window.location</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">unescape</span><span class="PUNC">(</span><span class="NAME">location.pathname</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>438</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>439</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>440</span>
<span class='line'>441</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>442</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>443</span> </span><span class="COMM">/**
<span class='line'>444</span> * 取得執行 script 之名稱
<span class='line'>445</span> * @returns {String} 執行 script 之 名稱
<span class='line'>446</span> * @returns '' unknown environment
<span class='line'>447</span> */</span><span class="WHIT">
<span class='line'>448</span> </span><span class="NAME">get_script_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>449</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>450</span>
<span class='line'>451</span> </span><span class="WHIT"> </span><span class="COMM">// 在 IE8, IE9 中get_object_type.call(WScript) 為 '[object Object]' !!</span><span class="WHIT">
<span class='line'>452</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">WScript</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT">
<span class='line'>453</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this.is_Object</span><span class="PUNC">(</span><span class="NAME">WScript</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">WScript</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'Windows Script Host'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>454</span> </span><span class="WHIT"> </span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">WScript.ScriptName</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>455</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n.lastIndexOf</span><span class="PUNC">(</span><span class="STRN">'.'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>456</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">n.slice</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>457</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>458</span>
<span class='line'>459</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">location</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">location</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">window.location</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>460</span> </span><span class="WHIT"> </span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">unescape</span><span class="PUNC">(</span><span class="NAME">location.pathname</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n.lastIndexOf</span><span class="PUNC">(</span><span class="STRN">'.'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>461</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n.lastIndexOf</span><span class="PUNC">(</span><span class="STRN">'\\'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>462</span> </span><span class="WHIT"> </span><span class="COMM">// location.pathname 在 .hta 中會回傳 '\' 形式的 path</span><span class="WHIT">
<span class='line'>463</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n.lastIndexOf</span><span class="PUNC">(</span><span class="STRN">'/'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>464</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">n.slice</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">n.slice</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>465</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>466</span>
<span class='line'>467</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">document</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">document</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">window.document</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">document.title</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>468</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>469</span>
<span class='line'>470</span>
<span class='line'>471</span>
<span class='line'>472</span>
<span class='line'>473</span> </span><span class="COMM">/*
<span class='line'>474</span> 測試各 type:
<span class='line'>475</span>
<span class='line'>476</span> undefined:
<span class='line'>477</span> 變數值存在且變數 'undefined' 存在時: variable === undefined
<span class='line'>478</span> 否則: typeof(variable) === 'undefined'
<span class='line'>479</span>
<span class='line'>480</span> number, boolean, string:
<span class='line'>481</span> typeof(variable) === '~'
<span class='line'>482</span>
<span class='line'>483</span> ** NaN
<span class='line'>484</span> ** int/float
<span class='line'>485</span>
<span class='line'>486</span> object:
<span class='line'>487</span> null
<span class='line'>488</span>
<span class='line'>489</span> 不同frame中的Array擁有不同的constructor
<span class='line'>490</span> */</span><span class="WHIT">
<span class='line'>491</span> </span><span class="COMM">/**
<span class='line'>492</span> * A cache to the function we use to get the type of specified value.&lt;br/>
<span class='line'>493</span> * Get the [[Class]] property of this object.&lt;br/>
<span class='line'>494</span> * 不使用 Object.toString() 是怕被 overridden
<span class='line'>495</span> * @type {Function}
<span class='line'>496</span> * @inner
<span class='line'>497</span> */</span><span class="WHIT">
<span class='line'>498</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">get_object_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Object.prototype.toString</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>499</span>
<span class='line'>500</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>501</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>502</span> </span><span class="COMM">/**
<span class='line'>503</span> * 判斷為何種 type。主要用在 Error, DOMException 等 native object 之判別。
<span class='line'>504</span> * @param value variable or class instance to test
<span class='line'>505</span> * @param {String} [want_type] type to compare: number, string, boolean, undefined, object, function
<span class='line'>506</span> * @param {Boolean} [get_Class] get the class name of a class(function) instance.
<span class='line'>507</span> * @returns {Boolean} The type is matched.
<span class='line'>508</span> * @returns {String} The type of value
<span class='line'>509</span> * @returns {undefined} error occurred
<span class='line'>510</span> * @example
<span class='line'>511</span> * CeL.is_type(value_to_test, 'Array');
<span class='line'>512</span> * @since 2009/12/14 19:50:14
<span class='line'>513</span> * @see
<span class='line'>514</span> * &lt;a href="http://lifesinger.org/blog/2009/02/javascript-type-check-2/" accessdate="2009/12/6 19:10">JavaScript类型检测小结 - 岁月如歌&lt;/a>&lt;br/>
<span class='line'>515</span> * &lt;a href="http://thinkweb2.com/projects/prototype/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/" accessdate="2009/12/6 19:10">Perfection kills &raquo; `instanceof` considered harmful (or how to write a robust `isArray`)&lt;/a>
<span class='line'>516</span> */</span><span class="WHIT">
<span class='line'>517</span> </span><span class="NAME">is_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">want_type</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">get_Class</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>518</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>519</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">want_type</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">want_type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>520</span> </span><span class="WHIT"> </span><span class="NAME">want_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>521</span>
<span class='line'>522</span> </span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>523</span>
<span class='line'>524</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">get_Class</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>525</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>526</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'function'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">value.Class</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>527</span> </span><span class="WHIT"> </span><span class="COMM">// get the class name of a class</span><span class="WHIT">
<span class='line'>528</span> </span><span class="WHIT"> </span><span class="COMM">// 若 value 為 function 時,測試其本身之 Class。</span><span class="WHIT">
<span class='line'>529</span> </span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">value.Class</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>530</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'function'</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>531</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="STRN">'constructor'</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">get_Class</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">value.constructor</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">Class</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>532</span> </span><span class="WHIT"> </span><span class="COMM">// get the class name of a class instance</span><span class="WHIT">
<span class='line'>533</span> </span><span class="WHIT"> </span><span class="COMM">// 若 value 為 function 且無 Class或為 object 時,測試其 constructor 之 Class。</span><span class="WHIT">
<span class='line'>534</span> </span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">get_Class.Class</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>535</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">get_Class</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.get_function_name</span><span class="PUNC">(</span><span class="NAME">get_Class</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>536</span> </span><span class="WHIT"> </span><span class="COMM">// get Class by function name</span><span class="WHIT">
<span class='line'>537</span> </span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">get_Class</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>538</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>539</span> </span><span class="WHIT"> </span><span class="NAME">this.err</span><span class="PUNC">(</span><span class="NAME">this.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.is_type: Fault to get ths class name of value!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>540</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>541</span>
<span class='line'>542</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>543</span> </span><span class="WHIT"> </span><span class="COMM">// type maybe 'unknown' or 'date'!</span><span class="WHIT">
<span class='line'>544</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">want_type</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">want_type.toLowerCase</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>545</span>
<span class='line'>546</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>547</span> </span><span class="WHIT"> </span><span class="NAME">get_Class</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">get_object_type.call</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>548</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>549</span> </span><span class="WHIT"> </span><span class="NAME">this.err</span><span class="PUNC">(</span><span class="NAME">this.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.is_type: Fault to get object type of value!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>550</span> </span><span class="WHIT"> </span><span class="NAME">get_Class</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>551</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>552</span>
<span class='line'>553</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">want_type</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>554</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">get_Class</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">want_type.charAt</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'['</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">want_type</span><span class="WHIT">
<span class='line'>555</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'[object '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">want_type</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>556</span>
<span class='line'>557</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">want_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">get_Class.match</span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>558</span> </span><span class="WHIT"> </span><span class="REGX">/^\[object ([^\]]+)\]$/</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>559</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">want_type</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>560</span>
<span class='line'>561</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>562</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>563</span>
<span class='line'>564</span>
<span class='line'>565</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>566</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>567</span> </span><span class="COMM">/**
<span class='line'>568</span> * get a type test function
<span class='line'>569</span> * @param {String} want_type object type to compare
<span class='line'>570</span> * @param {String} [toString_reference] a reference name to Object.prototype.toString
<span class='line'>571</span> * @returns {Function} type test function
<span class='line'>572</span> * @since 2009/12/20 08:38:26
<span class='line'>573</span> * @example
<span class='line'>574</span> * // 大量驗證時,推薦另外在本身 scope 中造出捷徑:
<span class='line'>575</span> * this.OtS = Object.prototype.toString;
<span class='line'>576</span> * var is_Array = CeL.object_tester('Array', 'OtS');
<span class='line'>577</span> * // test
<span class='line'>578</span> * if(is_Array(value))
<span class='line'>579</span> * // it's really a native Array
<span class='line'>580</span> * ;
<span class='line'>581</span> */</span><span class="WHIT">
<span class='line'>582</span> </span><span class="NAME">object_tester</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">want_type</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">toString_reference</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>583</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">t</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'[object '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">want_type</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>584</span>
<span class='line'>585</span> </span><span class="COMM">/*
<span class='line'>586</span> return new Function('v', 'return "' + t + '"==='
<span class='line'>587</span> + (toString_reference ||
<span class='line'>588</span> // 在 Google Chrome 中 'Object.prototype.toString' 可以與其 reference 同速度,但其他的 reference 會快些。
<span class='line'>589</span> 'Object.prototype.toString'
<span class='line'>590</span> //'get_object_type'
<span class='line'>591</span> )
<span class='line'>592</span> + '.call(v);');
<span class='line'>593</span> */</span><span class="WHIT">
<span class='line'>594</span>
<span class='line'>595</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">toString_reference</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="WHIT">
<span class='line'>596</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">toString_reference</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>597</span> </span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Function</span><span class="PUNC">(</span><span class="STRN">'v'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'return "'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">t</span><span class="WHIT">
<span class='line'>598</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'"==='</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">toString_reference</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.call(v);'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>599</span>
<span class='line'>600</span> </span><span class="WHIT"> </span><span class="COMM">// slow@Chrome</span><span class="WHIT">
<span class='line'>601</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">t</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">get_object_type.call</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>602</span> </span><span class="WHIT"> </span><span class="COMM">// faster@Chrome</span><span class="WHIT">
<span class='line'>603</span> </span><span class="WHIT"> </span><span class="COMM">//: new Function('v', 'return "' + t + '"===Object.prototype.toString.call(v);');</span><span class="WHIT">
<span class='line'>604</span>
<span class='line'>605</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>606</span>
<span class='line'>607</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>608</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>609</span> </span><span class="COMM">/**
<span class='line'>610</span> * Test if the value is a native Array.
<span class='line'>611</span> * @param v value to test
<span class='line'>612</span> * @returns {Boolean} the value is a native Array.
<span class='line'>613</span> * @since 2009/12/20 08:38:26
<span class='line'>614</span> */</span><span class="WHIT">
<span class='line'>615</span> </span><span class="NAME">is_Array</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
<span class='line'>616</span> </span><span class="WHIT"> </span><span class="COMM">// _.object_tester('Array');</span><span class="WHIT">
<span class='line'>617</span> </span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>618</span> </span><span class="WHIT"> </span><span class="COMM">// instanceof 比 Object.prototype.toString 快</span><span class="WHIT">
<span class='line'>619</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">v</span><span class="WHIT"> </span><span class="KEYW">instanceof</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="WHIT">
<span class='line'>620</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">get_object_type.call</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'[object Array]'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>621</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>622</span>
<span class='line'>623</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>624</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>625</span> </span><span class="COMM">/**
<span class='line'>626</span> * Test if the value is a native Object.
<span class='line'>627</span> * TODO:
<span class='line'>628</span> * test null
<span class='line'>629</span> * @param v value to test
<span class='line'>630</span> * @returns {Boolean} the value is a native Object.
<span class='line'>631</span> * @since 2009/12/20 08:38:26
<span class='line'>632</span> */</span><span class="WHIT">
<span class='line'>633</span> </span><span class="NAME">is_Object</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
<span class='line'>634</span> </span><span class="WHIT"> </span><span class="COMM">// Object.prototype.toString.call(undefined) === '[object Object]' @ MSIE 6.0</span><span class="WHIT">
<span class='line'>635</span> </span><span class="WHIT"> </span><span class="NAME">get_object_type.call</span><span class="PUNC">(</span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'[object Object]'</span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>636</span> </span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>637</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">v</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="WHIT">
<span class='line'>638</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">get_object_type.call</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'[object Object]'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>639</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>640</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
<span class='line'>641</span> </span><span class="WHIT"> </span><span class="COMM">//_.object_tester('Object');</span><span class="WHIT">
<span class='line'>642</span> </span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>643</span> </span><span class="WHIT"> </span><span class="COMM">// 非如此不得與 jQuery 平起平坐…</span><span class="WHIT">
<span class='line'>644</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">get_object_type.call</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'[object Object]'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>645</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>646</span>
<span class='line'>647</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>648</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>649</span> </span><span class="COMM">/**
<span class='line'>650</span> * Test if the value is a native Function.
<span class='line'>651</span> * @param v value to test
<span class='line'>652</span> * @returns {Boolean} the value is a native Function.
<span class='line'>653</span> * @since 2009/12/20 08:38:26
<span class='line'>654</span> */</span><span class="WHIT">
<span class='line'>655</span> </span><span class="NAME">is_Function</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
<span class='line'>656</span> </span><span class="WHIT"> </span><span class="COMM">//_.object_tester('Function');</span><span class="WHIT">
<span class='line'>657</span> </span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>658</span> </span><span class="WHIT"> </span><span class="COMM">// typeof 比 Object.prototype.toString 快,不過得注意有些 native object 可能 type 是 'function',但不具有 function 特性。</span><span class="WHIT">
<span class='line'>659</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">get_object_type.call</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'[object Function]'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>660</span>
<span class='line'>661</span> </span><span class="WHIT"> </span><span class="COMM">// 須注意,在 firefox 3 中typeof [object HTMLObjectElement] 之外的 HTMLElement 皆 === 'function'</span><span class="WHIT">
<span class='line'>662</span> </span><span class="WHIT"> </span><span class="COMM">// 因此光用 typeof() === 'function' 而執行下去會得出 [XPCWrappedNative_NoHelper] Component is not available</span><span class="WHIT">
<span class='line'>663</span> </span><span class="WHIT"> </span><span class="COMM">//return typeof v === 'function' || get_object_type.call(v) === '[object Function]';</span><span class="WHIT">
<span class='line'>664</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>665</span>
<span class='line'>666</span>
<span class='line'>667</span> </span><span class="WHIT"> </span><span class="COMM">//----------------------------------------------------------------------------------------------------------------------------------------------------------//</span><span class="WHIT">
<span class='line'>668</span>
<span class='line'>669</span>
<span class='line'>670</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>671</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>672</span> </span><span class="COMM">/**
<span class='line'>673</span> * 取得/設定環境變數 enumeration&lt;br/>
<span class='line'>674</span> * (雖然不喜歡另開 name-space但以 2009 當下的 JsDoc Toolkit 來說,似乎沒辦法創造 enumeration。
<span class='line'>675</span> * @class 環境變數 (environment variables) 與程式會用到的 library 相關變數 / configuration。
<span class='line'>676</span> * @param {String} name 環境變數名稱
<span class='line'>677</span> * @param value 環境變數之值
<span class='line'>678</span> * @returns 舊環境變數之值
<span class='line'>679</span> * @memberOf CeL
<span class='line'>680</span> */</span><span class="WHIT">
<span class='line'>681</span> </span><span class="NAME">env</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">env</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>682</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">name</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>683</span> </span><span class="WHIT"> </span><span class="COMM">//return undefined;</span><span class="WHIT">
<span class='line'>684</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>685</span>
<span class='line'>686</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">env</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">v</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>687</span>
<span class='line'>688</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">arguments.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>689</span> </span><span class="WHIT"> </span><span class="COMM">//if (typeof value !== 'undefined') _s[name] = value;</span><span class="WHIT">
<span class='line'>690</span>
<span class='line'>691</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">v</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>692</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>693</span>
<span class='line'>694</span>
<span class='line'>695</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>696</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>697</span> </span><span class="COMM">/**
<span class='line'>698</span> * Setup environment variables
<span class='line'>699</span> * @param {String} [OS_type] type of OS
<span class='line'>700</span> * @param {Boolean} [reset] reset the environment variables
<span class='line'>701</span> * @returns {Object} environment variables set
<span class='line'>702</span> */</span><span class="WHIT">
<span class='line'>703</span> </span><span class="NAME">initial_env</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">OS_type</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">reset</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>704</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">reset</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>705</span> </span><span class="WHIT"> </span><span class="NAME">this.env</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>706</span>
<span class='line'>707</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">OS</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">env</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.env</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>708</span>
<span class='line'>709</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>710</span> * default extension of script file.
<span class='line'>711</span> * 設定成 '.' 時由 CeL.get_script_base_path 設定
<span class='line'>712</span> * @type String
<span class='line'>713</span> * @see
<span class='line'>714</span> * &lt;a href="http://soswitcher.blogspot.com/2009/05/blogger-host-javascript-file-for-free.html" accessdate="2010/3/11 23:30">Blogger - Host Javascript File for Free - Blogger,Javascript - Blogger Blog by Switcher&lt;/a>
<span class='line'>715</span> * @name CeL.env.script_extension
<span class='line'>716</span> */</span><span class="WHIT">
<span class='line'>717</span> </span><span class="WHIT"> </span><span class="NAME">env.script_extension</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">WScript</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'.'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'.js'</span><span class="PUNC">;</span><span class="COMM">//'.txt'</span><span class="WHIT">
<span class='line'>718</span>
<span class='line'>719</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>720</span> * library main file base name
<span class='line'>721</span> * @name CeL.env.main_script_name
<span class='line'>722</span> * @type String
<span class='line'>723</span> */</span><span class="WHIT">
<span class='line'>724</span> </span><span class="WHIT"> </span><span class="NAME">env.main_script_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'ce'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>725</span>
<span class='line'>726</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>727</span> * library main file name&lt;br/>
<span class='line'>728</span> * full path: {@link CeL.env.registry_path} + {@link CeL.env.main_script}
<span class='line'>729</span> * @example:
<span class='line'>730</span> * CeL.log('full path: ['+CeL.env.registry_path+CeL.env.main_script+']');
<span class='line'>731</span> * @name CeL.env.main_script
<span class='line'>732</span> * @type String
<span class='line'>733</span> */</span><span class="WHIT">
<span class='line'>734</span> </span><span class="WHIT"> </span><span class="NAME">env.main_script</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">env.main_script_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">env.script_extension</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>735</span>
<span class='line'>736</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>737</span> * module 中的這 member 定義了哪些 member 不被 extend
<span class='line'>738</span> * @name CeL.env.not_to_extend_keyword
<span class='line'>739</span> * @type String
<span class='line'>740</span> */</span><span class="WHIT">
<span class='line'>741</span> </span><span class="WHIT"> </span><span class="NAME">env.not_to_extend_keyword</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'no_extend'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>742</span>
<span class='line'>743</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>744</span> * 本 library source 檔案使用之 encoding&lt;br/>
<span class='line'>745</span> * 不使用會產生語法錯誤
<span class='line'>746</span> * @name CeL.env.source_encoding
<span class='line'>747</span> * @type String
<span class='line'>748</span> */</span><span class="WHIT">
<span class='line'>749</span> </span><span class="WHIT"> </span><span class="NAME">env.source_encoding</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'UTF-16'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>750</span>
<span class='line'>751</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>752</span> * default global object.
<span class='line'>753</span> * 有可能為 undefined!
<span class='line'>754</span> * @name CeL.env.global
<span class='line'>755</span> * @type Object
<span class='line'>756</span> */</span><span class="WHIT">
<span class='line'>757</span> </span><span class="WHIT"> </span><span class="NAME">env.global</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">global</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>758</span>
<span class='line'>759</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>760</span> * creator group / 組織名稱 organization name
<span class='line'>761</span> * @name CeL.env.organization
<span class='line'>762</span> * @type String
<span class='line'>763</span> */</span><span class="WHIT">
<span class='line'>764</span> </span><span class="WHIT"> </span><span class="NAME">env.organization</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'Colorless echo'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>765</span>
<span class='line'>766</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>767</span> * 在 registry 中存放 library 資料的 base path
<span class='line'>768</span> * @name CeL.env.registry_base
<span class='line'>769</span> * @type String
<span class='line'>770</span> */</span><span class="WHIT">
<span class='line'>771</span> </span><span class="WHIT"> </span><span class="NAME">env.registry_base</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'HKCU\\Software\\'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">env.organization</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\\'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this.Class</span><span class="WHIT">
<span class='line'>772</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\\'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>773</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>774</span> * 在 registry 中存放 library 在 File System 中的 base path 的 key name
<span class='line'>775</span> * @name CeL.env.registry_base
<span class='line'>776</span> * @type String
<span class='line'>777</span> */</span><span class="WHIT">
<span class='line'>778</span> </span><span class="WHIT"> </span><span class="NAME">env.registry_path_key_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">env.registry_base</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'path'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>779</span> </span><span class="WHIT"> </span><span class="COMM">//if(typeof WScript === 'object')</span><span class="WHIT">
<span class='line'>780</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>781</span> </span><span class="WHIT"> </span><span class="COMM">//WScript.Echo(env.registry_path_key_name);</span><span class="WHIT">
<span class='line'>782</span>
<span class='line'>783</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>784</span> * 存放在 registry 中的 path通常指的是 library 在 File System 中的 base path
<span class='line'>785</span> * @name CeL.env.registry_path
<span class='line'>786</span> * @type String
<span class='line'>787</span> */</span><span class="WHIT">
<span class='line'>788</span> </span><span class="WHIT"> </span><span class="NAME">env.registry_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">WScript.CreateObject</span><span class="PUNC">(</span><span class="STRN">"WScript.Shell"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>789</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">RegRead</span><span class="PUNC">(</span><span class="NAME">env.registry_path_key_name</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>790</span> </span><span class="WHIT"> </span><span class="COMM">// 去除 filename</span><span class="WHIT">
<span class='line'>791</span> </span><span class="WHIT"> </span><span class="COMM">//.replace(/[^\\\/]+$/, '')</span><span class="WHIT">
<span class='line'>792</span> </span><span class="WHIT"> </span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>793</span> </span><span class="WHIT"> </span><span class="COMM">//this.debug(env.registry_path);</span><span class="WHIT">
<span class='line'>794</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>795</span> </span><span class="WHIT"> </span><span class="COMM">// this.warn(e.message);</span><span class="WHIT">
<span class='line'>796</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>797</span>
<span class='line'>798</span>
<span class='line'>799</span> </span><span class="WHIT"> </span><span class="COMM">//條件式編譯(条件コンパイル) for version>=4, 用 /*@ and @*/ to 判別</span><span class="WHIT">
<span class='line'>800</span> </span><span class="WHIT"> </span><span class="COMM">/*@cc_on
<span class='line'>801</span> @if(@_PowerPC||@_mac)
<span class='line'>802</span> OS='Mac';
<span class='line'>803</span> @else
<span class='line'>804</span> @if(@_win32||@_win64||@_win16)
<span class='line'>805</span> OS='DOS';
<span class='line'>806</span> @else
<span class='line'>807</span> OS='unix'; // unknown
<span class='line'>808</span> @end
<span class='line'>809</span> @end@*/</span><span class="WHIT">
<span class='line'>810</span>
<span class='line'>811</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>812</span> * 本次執行所在 OS 平台
<span class='line'>813</span> * @name CeL.env.OS
<span class='line'>814</span> * @type String
<span class='line'>815</span> */</span><span class="WHIT">
<span class='line'>816</span> </span><span class="WHIT"> </span><span class="NAME">env.OS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">OS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">OS_type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">OS_type</span><span class="WHIT">
<span class='line'>817</span> </span><span class="WHIT"> </span><span class="COMM">// 假如未設定則取預設值</span><span class="WHIT">
<span class='line'>818</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">OS</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">'unix'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>819</span>
<span class='line'>820</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>821</span> * 文件預設 new line
<span class='line'>822</span> * @name CeL.env.new_line
<span class='line'>823</span> * @type String
<span class='line'>824</span> */</span><span class="WHIT">
<span class='line'>825</span> </span><span class="WHIT"> </span><span class="NAME">env.new_line</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">OS</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'unix'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'\n'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">OS</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'Mac'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'\r'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'\r\n'</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// in VB: vbCrLf</span><span class="WHIT">
<span class='line'>826</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>827</span> * file system 預設 path separator&lt;br/>
<span class='line'>828</span> * platform-dependent path separator character, 決定目錄(directory)分隔
<span class='line'>829</span> * @name CeL.env.path_separator
<span class='line'>830</span> * @type String
<span class='line'>831</span> */</span><span class="WHIT">
<span class='line'>832</span> </span><span class="WHIT"> </span><span class="NAME">env.path_separator</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">OS</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'unix'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'/'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'\\'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>833</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>834</span> * 預設 module name separator
<span class='line'>835</span> * @name CeL.env.module_name_separator
<span class='line'>836</span> * @type String
<span class='line'>837</span> */</span><span class="WHIT">
<span class='line'>838</span> </span><span class="WHIT"> </span><span class="NAME">env.module_name_separator</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'.'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>839</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>840</span> * path_separator in 通用(regular)運算式
<span class='line'>841</span> * @name CeL.env.path_separator_RegExp
<span class='line'>842</span> * @type RegExp
<span class='line'>843</span> */</span><span class="WHIT">
<span class='line'>844</span> </span><span class="WHIT"> </span><span class="NAME">env.path_separator_RegExp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.to_RegExp_pattern</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="WHIT">
<span class='line'>845</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">to_RegExp_pattern</span><span class="PUNC">(</span><span class="NAME">env.path_separator</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>846</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">env.path_separator</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'\\'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'\\'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">env.path_separator</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>847</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>848</span> * 預設語系
<span class='line'>849</span> * 0x404:中文-台灣,0x0411:日文-日本
<span class='line'>850</span> * @name CeL.env.locale
<span class='line'>851</span> * @see &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.globalization.cultureinfo(VS.80).aspx">CultureInfo 類別&lt;/a>
<span class='line'>852</span> * @type Number
<span class='line'>853</span> */</span><span class="WHIT">
<span class='line'>854</span> </span><span class="WHIT"> </span><span class="NAME">env.locale</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0x404</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>855</span>
<span class='line'>856</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>857</span> * script name
<span class='line'>858</span> * @name CeL.env.script_name
<span class='line'>859</span> * @type String
<span class='line'>860</span> */</span><span class="WHIT">
<span class='line'>861</span> </span><span class="WHIT"> </span><span class="NAME">env.script_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.get_script_name</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>862</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>863</span> * base path of script.
<span class='line'>864</span> * TODO
<span class='line'>865</span> * 以 reg 代替
<span class='line'>866</span> * @name CeL.env.script_base_path
<span class='line'>867</span> * @type String
<span class='line'>868</span> */</span><span class="WHIT">
<span class='line'>869</span> </span><span class="WHIT"> </span><span class="NAME">env.script_base_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.get_script_full_name</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>870</span> </span><span class="WHIT"> </span><span class="COMM">// 去除 filename</span><span class="WHIT">
<span class='line'>871</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/[^\\\/]+$/</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>872</span>
<span class='line'>873</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>874</span> * Legal identifier name in RegExp.
<span class='line'>875</span> * 這 pattern 會佔去兩個筆紀錄: first letter, and least.
<span class='line'>876</span> * .replace(/_/ [g],'for first letter')
<span class='line'>877</span> * .replace(/\\d/,'for least')
<span class='line'>878</span> * 這邊列出的只是合法 identifier 的*子集*,且未去除 reserved words!
<span class='line'>879</span> * 請注意實際判別須加入 ^..$
<span class='line'>880</span> *
<span class='line'>881</span> * 不用 \d 而用 0-9 是因為 \d 還包括了 MATHEMATICAL BOLD DIGIT。
<span class='line'>882</span> * &lt;a href="http://blog.est.im/archives/3229" accessdate="2010/11/16 20:6">基于正则的URL匹配安全性考虑&lt;/a>
<span class='line'>883</span> * @name CeL.env.identifier_RegExp
<span class='line'>884</span> * @see
<span class='line'>885</span> * ECMA-262 7.6 Identifier Names and Identifiers
<span class='line'>886</span> * @type RegExp
<span class='line'>887</span> */</span><span class="WHIT">
<span class='line'>888</span> </span><span class="WHIT"> </span><span class="NAME">env.identifier_RegExp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="REGX">/([a-zA-Z$_]|\\u[0-9a-fA-F]{4})([a-zA-Z$_0-9]+|\\u[0-9a-fA-F]{4}){0,63}/</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>889</span>
<span class='line'>890</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>891</span> * Legal identifier name in String from env.identifier_RegExp.
<span class='line'>892</span> * @name CeL.env.identifier_String
<span class='line'>893</span> */</span><span class="WHIT">
<span class='line'>894</span> </span><span class="WHIT"> </span><span class="NAME">env.identifier_String</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">env.identifier_RegExp.source</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>895</span>
<span class='line'>896</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">env</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>897</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>898</span>
<span class='line'>899</span>
<span class='line'>900</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>901</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>902</span> </span><span class="COMM">// TODO</span><span class="WHIT">
<span class='line'>903</span> </span><span class="NAME">get_identifier_RegExp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">pattern</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">flag</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">add_for_first_letter</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">add_for_all_letter</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>904</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.env.identifier_String</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>905</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">add_for_first_letter</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>906</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">s.replace</span><span class="PUNC">(</span><span class="REGX">/_/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">add_for_first_letter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>907</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">add_for_all_letter</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>908</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">s.replace</span><span class="PUNC">(</span><span class="REGX">/0-9/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">add_for_all_letter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>909</span>
<span class='line'>910</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>911</span> </span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">get_object_type.call</span><span class="PUNC">(</span><span class="NAME">pattern</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'[object RegExp]'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">pattern.source</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">pattern</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>912</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/$identifier/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">flag</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>913</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>914</span>
<span class='line'>915</span>
<span class='line'>916</span> </span><span class="WHIT"> </span><span class="COMM">//----------------------------------------------------------------------------------------------------------------------------------------------------------//</span><span class="WHIT">
<span class='line'>917</span>
<span class='line'>918</span>
<span class='line'>919</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>920</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>921</span> </span><span class="COMM">/**
<span class='line'>922</span> * Tell if it's now debugging.
<span class='line'>923</span> * @param {Integer} [debug_level] if it's now in this debug level.
<span class='line'>924</span> * @returns {Boolean} It's now in specified debug level.
<span class='line'>925</span> * @returns {Number} It's now in what debug level (Integer).
<span class='line'>926</span> */</span><span class="WHIT">
<span class='line'>927</span> </span><span class="NAME">is_debug</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">debug_level</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>928</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">debug_level</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">debug</span><span class="WHIT">
<span class='line'>929</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">debug</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">debug_level</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>930</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>931</span>
<span class='line'>932</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>933</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>934</span> </span><span class="COMM">/**
<span class='line'>935</span> * Set debugging level
<span class='line'>936</span> * @param {Integer} [debug_level] The debugging level to set.
<span class='line'>937</span> * @type Integer
<span class='line'>938</span> * @returns {Number} debugging level now
<span class='line'>939</span> */</span><span class="WHIT">
<span class='line'>940</span> </span><span class="NAME">set_debug</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">debug_level</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>941</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">debug_level</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>942</span> </span><span class="WHIT"> </span><span class="NAME">debug</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">debug_level</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>943</span>
<span class='line'>944</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">debug_level</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">debug</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>945</span> </span><span class="WHIT"> </span><span class="NAME">debug</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>946</span>
<span class='line'>947</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">debug</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>948</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>949</span>
<span class='line'>950</span>
<span class='line'>951</span> </span><span class="COMM">/*
<span class='line'>952</span> CeL.extend(function f_name(){}, object || string, initial arguments);
<span class='line'>953</span> CeL.extend({name:function(){},.. }, object || string);
<span class='line'>954</span> CeL.extend([function1,function12,..], object || string);
<span class='line'>955</span>
<span class='line'>956</span> set .name
<span class='line'>957</span> */</span><span class="WHIT">
<span class='line'>958</span>
<span class='line'>959</span>
<span class='line'>960</span>
<span class='line'>961</span>
<span class='line'>962</span>
<span class='line'>963</span>
<span class='line'>964</span>
<span class='line'>965</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>966</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>967</span> </span><span class="COMM">/**
<span class='line'>968</span> * Get the hash key of text.
<span class='line'>969</span> * @param {String} text text to test
<span class='line'>970</span> * @returns {String} hash key
<span class='line'>971</span> */</span><span class="WHIT">
<span class='line'>972</span> </span><span class="NAME">_get_hash_key</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>973</span> </span><span class="WHIT"> </span><span class="COMM">//text = String(text);</span><span class="WHIT">
<span class='line'>974</span> </span><span class="WHIT"> </span><span class="COMM">//text = '' + text;</span><span class="WHIT">
<span class='line'>975</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">text.length</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">take</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">30</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">from</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NUMB">3</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>976</span> </span><span class="WHIT"> </span><span class="NAME">from</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">from</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>977</span> </span><span class="WHIT"> </span><span class="COMM">//this.log(from + '~' + l + ': ' + (l - from &lt; take ? text : text.substr(from, take)));</span><span class="WHIT">
<span class='line'>978</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">from</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">take</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">text</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">text.substr</span><span class="PUNC">(</span><span class="NAME">from</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">take</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>979</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>980</span>
<span class='line'>981</span>
<span class='line'>982</span> </span><span class="COMM">// for JScript&lt;=5</span><span class="WHIT">
<span class='line'>983</span> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>984</span> </span><span class="WHIT"> </span><span class="NAME">function_name_pattern</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="STRN">'^function[\\s\\n]+(\\w+)[\\s\\n]*\\('</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>985</span> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>986</span> </span><span class="WHIT"> </span><span class="NAME">function_name_pattern</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">emulate_function_name</span><span class="PUNC">(</span><span class="NAME">fs</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>987</span> </span><span class="WHIT"> </span><span class="NAME">fs</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">fs</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>988</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'function '</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>989</span>
<span class='line'>990</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">fs.indexOf</span><span class="PUNC">(</span><span class="NAME">l</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>991</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">l.length</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>992</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>993</span> </span><span class="WHIT"> </span><span class="STRN">' '</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>994</span> </span><span class="WHIT"> </span><span class="STRN">'\n'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>995</span> </span><span class="WHIT"> </span><span class="STRN">'\r'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>996</span> </span><span class="WHIT"> </span><span class="STRN">'\t'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT">
<span class='line'>997</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>998</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">fs.charAt</span><span class="PUNC">(</span><span class="NAME">l</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>999</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1000</span> </span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">fs.indexOf</span><span class="PUNC">(</span><span class="STRN">'('</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1001</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">fs.charAt</span><span class="PUNC">(</span><span class="PUNC">--</span><span class="NAME">r</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1002</span> </span><span class="WHIT"> </span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1003</span>
<span class='line'>1004</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT"> </span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fs.slice</span><span class="PUNC">(</span><span class="NAME">l</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1005</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1006</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1007</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1008</span> </span><span class="WHIT"> </span><span class="NAME">eval</span><span class="PUNC">(</span><span class="STRN">'RegExp = function(){};'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1009</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1010</span>
<span class='line'>1011</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1012</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1013</span> </span><span class="COMM">/**
<span class='line'>1014</span> * 獲得函數名
<span class='line'>1015</span> * @param {Function} fr function reference
<span class='line'>1016</span> * @param {String} ns name-space
<span class='line'>1017</span> * @param {Boolean} force_load force reload this name-space
<span class='line'>1018</span> * @returns
<span class='line'>1019</span> * @see
<span class='line'>1020</span> * 可能的話請改用 {@link CeL.native.parse_function}(F).funcName
<span class='line'>1021</span> * @since 2010/1/7 22:10:27
<span class='line'>1022</span> */</span><span class="WHIT">
<span class='line'>1023</span> </span><span class="NAME">get_function_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">fr</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ns</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">force_load</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1024</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.get_function_name</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>1025</span> </span><span class="WHIT"> </span><span class="COMM">// 初始化變數 'm'</span><span class="WHIT">
<span class='line'>1026</span> </span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ft</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">load</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1027</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">fr</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1028</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1029</span> </span><span class="WHIT"> </span><span class="NAME">fr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_s.caller</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1030</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1031</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: handle exception</span><span class="WHIT">
<span class='line'>1032</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1033</span>
<span class='line'>1034</span> </span><span class="WHIT"> </span><span class="COMM">// get function text (函數的解譯文字)</span><span class="WHIT">
<span class='line'>1035</span> </span><span class="WHIT"> </span><span class="COMM">// 不用 insteadof 是怕傳入奇怪的東西,例如 {string} script code</span><span class="WHIT">
<span class='line'>1036</span> </span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">fr</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1037</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'function'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1038</span> </span><span class="WHIT"> </span><span class="COMM">// 勿更改傳入之 argument</span><span class="WHIT">
<span class='line'>1039</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>1040</span> if ('toString' in fr) {
<span class='line'>1041</span> m = fr.toString;
<span class='line'>1042</span> delete fr.toString;
<span class='line'>1043</span> }
<span class='line'>1044</span> ft = String(fr);
<span class='line'>1045</span> if (m)
<span class='line'>1046</span> fr.toString = m;
<span class='line'>1047</span> */</span><span class="WHIT">
<span class='line'>1048</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: cache Function.prototype.toString</span><span class="WHIT">
<span class='line'>1049</span> </span><span class="WHIT"> </span><span class="NAME">ft</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Function.prototype.toString.call</span><span class="PUNC">(</span><span class="NAME">fr</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1050</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1051</span> </span><span class="WHIT"> </span><span class="COMM">// typeof fr === 'string'</span><span class="WHIT">
<span class='line'>1052</span> </span><span class="WHIT"> </span><span class="NAME">ft</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">fr</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1053</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>1054</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1055</span>
<span class='line'>1056</span> </span><span class="WHIT"> </span><span class="COMM">// 以函數的解譯文字獲得函數名</span><span class="WHIT">
<span class='line'>1057</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">function_name_pattern</span><span class="WHIT"> </span><span class="KEYW">instanceof</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>1058</span> </span><span class="WHIT"> </span><span class="COMM">// 包含引數: + '(' + (f ? m[2] : '') + ')';</span><span class="WHIT">
<span class='line'>1059</span> </span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ft.match</span><span class="PUNC">(</span><span class="NAME">function_name_pattern</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">m</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1060</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">function_name_pattern</span><span class="WHIT"> </span><span class="KEYW">instanceof</span><span class="WHIT"> </span><span class="NAME">Function</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>1061</span> </span><span class="WHIT"> </span><span class="NAME">function_name_pattern</span><span class="PUNC">(</span><span class="NAME">ft</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1062</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1063</span> </span><span class="WHIT"> </span><span class="COMM">//this.debug('matched ' + m, 1, this.Class + '.get_function_name');</span><span class="WHIT">
<span class='line'>1064</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">m</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1065</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1066</span> </span><span class="WHIT"> </span><span class="COMM">// 無法從 function code 本身得到 name 之資訊。</span><span class="WHIT">
<span class='line'>1067</span>
<span class='line'>1068</span> </span><span class="WHIT"> </span><span class="COMM">// 查詢是否是已註冊之 function</span><span class="WHIT">
<span class='line'>1069</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_s.b</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1070</span> </span><span class="WHIT"> </span><span class="NAME">load</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_s.ns</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1071</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>1072</span> </span><span class="WHIT"> </span><span class="NAME">_s.b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">_s.ns</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">load</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1073</span>
<span class='line'>1074</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">ns</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1075</span> </span><span class="WHIT"> </span><span class="NAME">ns</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1076</span>
<span class='line'>1077</span> </span><span class="WHIT"> </span><span class="COMM">// cache functions</span><span class="WHIT">
<span class='line'>1078</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">ns</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'function'</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">this.is_Object</span><span class="PUNC">(</span><span class="NAME">ns</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">ns.Class</span><span class="WHIT">
<span class='line'>1079</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">force_load</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">load</span><span class="PUNC">[</span><span class="NAME">ns.Class</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1080</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">ns</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1081</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">ns</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'function'</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1082</span> </span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._get_hash_key</span><span class="PUNC">(</span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">ns</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1083</span> </span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ns.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this.env.module_name_separator</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1084</span> </span><span class="WHIT"> </span><span class="COMM">//this.debug(m + ': ' + k + (', ' + ns[i]).slice(0, 200));</span><span class="WHIT">
<span class='line'>1085</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">m</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">load</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1086</span> </span><span class="WHIT"> </span><span class="NAME">load</span><span class="PUNC">[</span><span class="NAME">m</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1087</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1088</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1089</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">push</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT"> </span><span class="NAME">m</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ns</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1090</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1091</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1092</span> </span><span class="WHIT"> </span><span class="NAME">load</span><span class="PUNC">[</span><span class="NAME">ns.Class</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1093</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1094</span>
<span class='line'>1095</span> </span><span class="WHIT"> </span><span class="COMM">// 將函數與 cache 比對以獲得函數名</span><span class="WHIT">
<span class='line'>1096</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">this._get_hash_key</span><span class="PUNC">(</span><span class="NAME">ft</span><span class="PUNC">)</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1097</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">m.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1098</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">m</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1099</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="COMM">// typeof fr === 'function' &&</span><span class="WHIT">
<span class='line'>1100</span> </span><span class="WHIT"> </span><span class="NAME">fr</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1101</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">m</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1102</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">ft</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1103</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">m</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1104</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1105</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1106</span>
<span class='line'>1107</span>
<span class='line'>1108</span>
<span class='line'>1109</span>
<span class='line'>1110</span>
<span class='line'>1111</span>
<span class='line'>1112</span>
<span class='line'>1113</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1114</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1115</span> </span><span class="NAME">null_function</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1116</span>
<span class='line'>1117</span>
<span class='line'>1118</span> </span><span class="COMM">// Initialization</span><span class="WHIT">
<span class='line'>1119</span>
<span class='line'>1120</span> </span><span class="COMM">// temporary decoration in case we call for nothing and raise error</span><span class="WHIT">
<span class='line'>1121</span> </span><span class="NAME">_.debug</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.log</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1122</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>1123</span> * 請注意:
<span class='line'>1124</span> * _.log.buffer === this.log.buffer !== log.buffer
<span class='line'>1125</span> * 在 WScript 中 需要用 _.log其他則可用 log。
<span class='line'>1126</span> * 因此應該將所有類似的值指定給雙方,並注意非[常數]的情況。
<span class='line'>1127</span> */</span><span class="WHIT">
<span class='line'>1128</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.log</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1129</span> </span><span class="WHIT"> </span><span class="COMM">//_s.function_to_call.apply(null,arguments);</span><span class="WHIT">
<span class='line'>1130</span> </span><span class="WHIT"> </span><span class="COMM">//_s.function_to_call.apply(global, arguments);</span><span class="WHIT">
<span class='line'>1131</span>
<span class='line'>1132</span> </span><span class="WHIT"> </span><span class="NAME">_s.buffer.push</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1133</span>
<span class='line'>1134</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">_s.max_length</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1135</span> </span><span class="WHIT"> </span><span class="NAME">_s.max_length</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1136</span>
<span class='line'>1137</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">debug</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">_s.buffer.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">_s.max_length</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1138</span> </span><span class="WHIT"> </span><span class="NAME">_s.function_to_call.call</span><span class="PUNC">(</span><span class="NAME">global</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">_s.buffer.join</span><span class="PUNC">(</span><span class="STRN">'\n\n'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>1139</span> </span><span class="WHIT"> </span><span class="NAME">_s.buffer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1140</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1141</span>
<span class='line'>1142</span>
<span class='line'>1143</span> </span><span class="COMM">/*
<span class='line'>1144</span> * test:
<span class='line'>1145</span> * var k=function l(){alert(l.m);};k.m=1;alert(l.m+','+k.m);k();
<span class='line'>1146</span> *
<span class='line'>1147</span> * JScript 中
<span class='line'>1148</span> * k();
<span class='line'>1149</span> * 為 undefined, 其他會把 "l." 代換成 "k."
<span class='line'>1150</span> *
<span class='line'>1151</span> * @inner
<span class='line'>1152</span> */</span><span class="WHIT">
<span class='line'>1153</span> </span><span class="COMM">//_.debug.buffer = _.err.buffer = _.warn.buffer =</span><span class="WHIT">
<span class='line'>1154</span> </span><span class="NAME">_.log.buffer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1155</span>
<span class='line'>1156</span>
<span class='line'>1157</span> </span><span class="COMM">//_.debug.max_length = _.err.max_length = _.warn.max_length =</span><span class="WHIT">
<span class='line'>1158</span> </span><span class="NAME">_.log.max_length</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1159</span>
<span class='line'>1160</span>
<span class='line'>1161</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">max_log_length</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1162</span> </span><span class="COMM">//_.debug.function_to_call = _.err.function_to_call = _.warn.function_to_call =</span><span class="WHIT">
<span class='line'>1163</span> </span><span class="NAME">_.log.function_to_call</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
<span class='line'>1164</span> </span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">JSalert</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'function'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">JSalert</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
<span class='line'>1165</span> </span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">WScript</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">m</span><span class="PUNC">=</span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">m.length</span><span class="PUNC">></span><span class="NUMB">2</span><span class="PUNC">*</span><span class="NAME">max_log_length</span><span class="PUNC">)</span><span class="NAME">m</span><span class="PUNC">=</span><span class="NAME">m.slice</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">max_log_length</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">'\n\n..\n\n'</span><span class="PUNC">+</span><span class="NAME">m.slice</span><span class="PUNC">(</span><span class="PUNC">-</span><span class="NAME">max_log_length</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">WScript.Echo</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
<span class='line'>1166</span> </span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">alert</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">alert</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'function'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">m</span><span class="PUNC">=</span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">m.length</span><span class="PUNC">></span><span class="NUMB">2</span><span class="PUNC">*</span><span class="NAME">max_log_length</span><span class="PUNC">)</span><span class="NAME">m</span><span class="PUNC">=</span><span class="NAME">m.slice</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">max_log_length</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">'\n\n..\n\n'</span><span class="PUNC">+</span><span class="NAME">m.slice</span><span class="PUNC">(</span><span class="PUNC">-</span><span class="NAME">max_log_length</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">alert</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
<span class='line'>1167</span> </span><span class="WHIT"> </span><span class="NAME">_.null_function</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1168</span>
<span class='line'>1169</span>
<span class='line'>1170</span> </span><span class="NAME">_.initial_env</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1171</span>
<span class='line'>1172</span>
<span class='line'>1173</span> </span><span class="COMM">/*
<span class='line'>1174</span> var test_obj = _(2, 'test: Initialization');
<span class='line'>1175</span>
<span class='line'>1176</span> test_obj.test_print('OK!');
<span class='line'>1177</span> */</span><span class="WHIT">
<span class='line'>1178</span> </span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1179</span>
<span class='line'>1180</span>
<span class='line'>1181</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1182</span> </span><span class="PUNC">)</span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>1183</span> </span><span class="WHIT"> </span><span class="COMM">// In strict mode, this inside globe functions is undefined.</span><span class="WHIT">
<span class='line'>1184</span> </span><span class="WHIT"> </span><span class="COMM">// https://developer.mozilla.org/en/JavaScript/Strict_mode</span><span class="WHIT">
<span class='line'>1185</span> </span><span class="WHIT"> </span><span class="COMM">//this // || typeof window === 'undefined' || window</span><span class="WHIT">
<span class='line'>1186</span> </span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1187</span> </span><span class="COMM">//) // void(</span><span class="WHIT">
<span class='line'>1188</span> </span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1189</span>
<span class='line'>1190</span>
<span class='line'>1191</span>
<span class='line'>1192</span> </span><span class="WHIT"> </span><span class="COMM">//==========================================================================================================================================================//</span><span class="WHIT">
<span class='line'>1193</span>
<span class='line'>1194</span>
<span class='line'>1195</span>
<span class='line'>1196</span>
<span class='line'>1197</span>
<span class='line'>1198</span>
<span class='line'>1199</span> </span><span class="COMM">/*
<span class='line'>1200</span> TODO:
<span class='line'>1201</span>
<span class='line'>1202</span> 瘦身
<span class='line'>1203</span>
<span class='line'>1204</span> use -> using because of 'use' is a keyword of JScript.
<span class='line'>1205</span>
<span class='line'>1206</span> 等呼叫時才 initialization
<span class='line'>1207</span>
<span class='line'>1208</span>
<span class='line'>1209</span> http://headjs.com/#theory
<span class='line'>1210</span> Head JS :: The only script in your HEAD
<span class='line'>1211</span>
<span class='line'>1212</span>
<span class='line'>1213</span> do not use eval.
<span class='line'>1214</span> 以其他方法取代 eval 的使用。
<span class='line'>1215</span>
<span class='line'>1216</span> http://msdn.microsoft.com/en-us/library/2b36h1wa(VS.71).aspx
<span class='line'>1217</span> The arguments object is not available when running in fast mode, the default for JScript .NET. To compile a program from the command line that uses the arguments object, you must turn off the fast option by using /fast-. It is not safe to turn off the fast option in ASP.NET because of threading issues.
<span class='line'>1218</span>
<span class='line'>1219</span>
<span class='line'>1220</span> Multiversion Support
<span class='line'>1221</span> http://requirejs.org/docs/api.html
<span class='line'>1222</span>
<span class='line'>1223</span> */</span><span class="WHIT">
<span class='line'>1224</span>
<span class='line'>1225</span>
<span class='line'>1226</span> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">CeL</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'function'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
<span class='line'>1227</span> </span><span class="PUNC">(</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1228</span>
<span class='line'>1229</span> </span><span class="STRN">'use strict'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1230</span>
<span class='line'>1231</span>
<span class='line'>1232</span> </span><span class="COMM">//var _// JSDT:_module_</span><span class="WHIT">
<span class='line'>1233</span> </span><span class="COMM">//= this;</span><span class="WHIT">
<span class='line'>1234</span>
<span class='line'>1235</span>
<span class='line'>1236</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1237</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1238</span> </span><span class="COMM">/**
<span class='line'>1239</span> * 延展物件 (learned from jQuery):
<span class='line'>1240</span> * 將 from_name_space 下的 variable_set 延展/覆蓋到 name_space。
<span class='line'>1241</span> * @since 2009/11/25 21:17:44
<span class='line'>1242</span> * @param variable_set variable set
<span class='line'>1243</span> * @param {Object|Function} name_space extend to what name-space
<span class='line'>1244</span> * @param {Object|Function} from_name_space When inputing function names, we need a base name-space to search these functions.
<span class='line'>1245</span> * @returns library names-pace
<span class='line'>1246</span> * @see
<span class='line'>1247</span> * &lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/03/01/jquery-extend.aspx" accessdate="2009/11/17 1:24" title="jQuery.extend的用法 - 黑暗執行緒">jQuery.extend的用法&lt;/a>,
<span class='line'>1248</span> * &lt;a href="http://www.cnblogs.com/rubylouvre/archive/2009/11/21/1607072.html" accessdate="2010/1/1 1:40">jQuery源码学习笔记三 - Ruby's Louvre - 博客园&lt;/a>
<span class='line'>1249</span> */</span><span class="WHIT">
<span class='line'>1250</span> </span><span class="NAME">extend</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">extend</span><span class="PUNC">(</span><span class="NAME">variable_set</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">from_name_space</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1251</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">extend</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1252</span>
<span class='line'>1253</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1254</span> </span><span class="WHIT"> </span><span class="COMM">// 如果沒有指定擴展的對象,則擴展到 library 自身</span><span class="WHIT">
<span class='line'>1255</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_s.default_target</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1256</span>
<span class='line'>1257</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">from_name_space</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1258</span> </span><span class="WHIT"> </span><span class="NAME">from_name_space</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_s.default_target</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1259</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">variable_set</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">from_name_space</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1260</span> </span><span class="WHIT"> </span><span class="NAME">variable_set</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">from_name_space</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1261</span>
<span class='line'>1262</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">variable_set</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'function'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1263</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.parse_function</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1264</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1265</span> </span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="PUNC">(</span><span class="STRN">'Warning: Please include '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.parse_function() first!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1266</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1267</span>
<span class='line'>1268</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">variable_set</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1269</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">from_name_space</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1270</span> </span><span class="WHIT"> </span><span class="NAME">from_name_space</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1271</span>
<span class='line'>1272</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">from_name_space</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1273</span> </span><span class="WHIT"> </span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1274</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">variable_set</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">from_name_space</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1275</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('extend (' + (typeof variable_set) + ') ' + variable_set + '\n=' + from_name_space[variable_set] + '\n\nto:\n' + name_space);</span><span class="WHIT">
<span class='line'>1276</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">variable_set</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">from_name_space</span><span class="PUNC">[</span><span class="NAME">variable_set</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1277</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>1278</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1279</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">variable_set</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.get_variable</span><span class="PUNC">(</span><span class="NAME">variable_set</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1280</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug(variable_set + ' = ' + name_space[variable_set]);</span><span class="WHIT">
<span class='line'>1281</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">catch</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1282</span> </span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="PUNC">(</span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.extend:\n'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">e.message</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1283</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1284</span>
<span class='line'>1285</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">variable_set</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1286</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">name_space</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1287</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">variable_set.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1288</span> </span><span class="WHIT"> </span><span class="NAME">_s</span><span class="PUNC">(</span><span class="NAME">variable_set</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">from_name_space</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1289</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1290</span>
<span class='line'>1291</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">variable_set</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1292</span> </span><span class="WHIT"> </span><span class="COMM">//|| _.is_Function(variable_set)</span><span class="WHIT">
<span class='line'>1293</span> </span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1294</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">variable_set</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1295</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">from_name_space</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1296</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">from_name_space</span><span class="PUNC">[</span><span class="NAME">variable_set</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1297</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>1298</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">variable_set</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1299</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1300</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1301</span>
<span class='line'>1302</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1303</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1304</span>
<span class='line'>1305</span> </span><span class="COMM">//_.extend.default_target = _;</span><span class="WHIT">
<span class='line'>1306</span>
<span class='line'>1307</span>
<span class='line'>1308</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1309</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1310</span> </span><span class="COMM">/**
<span class='line'>1311</span> * workaround.
<span class='line'>1312</span> * 把 name_space 下的 function_name (name_space[function_name]) 換成 new_function。
<span class='line'>1313</span> * for Lazy Function Definition Pattern.
<span class='line'>1314</span> * 惰性求值Lazy Evaluation又稱懶惰求值、懶漢求值
<span class='line'>1315</span> * @example
<span class='line'>1316</span> * library_namespace.replace_function(_, 'to_SI_prefix', to_SI_prefix);
<span class='line'>1317</span> * @param name_space in which name-space
<span class='line'>1318</span> * @param {String} function_name name_space.function_name
<span class='line'>1319</span> * @param {Function} new_function replace to what function
<span class='line'>1320</span> * @returns new_function
<span class='line'>1321</span> * @see
<span class='line'>1322</span> * http://realazy.org/blog/2007/08/16/lazy-function-definition-pattern/,
<span class='line'>1323</span> * http://peter.michaux.ca/article/3556
<span class='line'>1324</span> */</span><span class="WHIT">
<span class='line'>1325</span> </span><span class="NAME">replace_function</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">name_space</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">function_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">new_function</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1326</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">name_space</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1327</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="COMM">//name_space = this;</span><span class="WHIT">
<span class='line'>1328</span>
<span class='line'>1329</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">old_function</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">function_name</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">new_function</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1330</span>
<span class='line'>1331</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: RegExp</span><span class="WHIT">
<span class='line'>1332</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'bool'</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'number'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1333</span> </span><span class="WHIT"> </span><span class="NAME">new_function</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Function</span><span class="PUNC">(</span><span class="STRN">'return'</span><span class="WHIT">
<span class='line'>1334</span> </span><span class="WHIT"> </span><span class="COMM">// 對 String 只是做簡單處理,勢必得再加強。</span><span class="WHIT">
<span class='line'>1335</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'"'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">type.replace</span><span class="PUNC">(</span><span class="REGX">/\\/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'\\'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/"/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'\"'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\n/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'\\n'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1336</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'"'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">' '</span><span class="PUNC">+</span><span class="NAME">type</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1337</span>
<span class='line'>1338</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">function_name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">new_function</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1339</span> </span><span class="WHIT"> </span><span class="COMM">// search for other extends</span><span class="WHIT">
<span class='line'>1340</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_</span><span class="PUNC">[</span><span class="NAME">function_name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">old_function</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1341</span> </span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">[</span><span class="NAME">function_name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">new_function</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1342</span>
<span class='line'>1343</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">new_function.apply</span><span class="PUNC">(</span><span class="NAME">name_space</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1344</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1345</span>
<span class='line'>1346</span>
<span class='line'>1347</span> </span><span class="WHIT"> </span><span class="COMM">//----------------------------------------------------------------------------------------------------------------------------------------------------------//</span><span class="WHIT">
<span class='line'>1348</span>
<span class='line'>1349</span> </span><span class="COMM">/**
<span class='line'>1350</span> * XMLHttpRequest object type cache.
<span class='line'>1351</span> * {Number} 0: no XMLHttpRequest, 1: new XMLHttpRequest_type(), 2: new ActiveXObject('Microsoft.XMLHTTP').
<span class='line'>1352</span> * @inner
<span class='line'>1353</span> * @ignore
<span class='line'>1354</span> */</span><span class="WHIT">
<span class='line'>1355</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">XMLHttpRequest_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1356</span> </span><span class="KEYW">try</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1357</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">XMLHttpRequest</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1358</span> </span><span class="WHIT"> </span><span class="NAME">XMLHttpRequest_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1359</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>1360</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1361</span> </span><span class="PUNC">}</span><span class="KEYW">catch</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1362</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1363</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">ActiveXObject</span><span class="PUNC">(</span><span class="STRN">'Microsoft.XMLHTTP'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1364</span> </span><span class="WHIT"> </span><span class="NAME">XMLHttpRequest_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1365</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">catch</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1366</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1367</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1368</span>
<span class='line'>1369</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">is_Opera</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">navigator</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT">
<span class='line'>1370</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">navigator.appName</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'Opera'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1371</span>
<span class='line'>1372</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1373</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1374</span> </span><span class="COMM">/**
<span class='line'>1375</span> * Get file resource by {@link XMLHttpRequest}&lt;br/>
<span class='line'>1376</span> * 依序載入 resource用於 include JavaScript 檔之類需求時,取得檔案內容之輕量級函數。&lt;br/>
<span class='line'>1377</span> * 除 Ajax本函數亦可用在 CScript 執行中。
<span class='line'>1378</span> * @example
<span class='line'>1379</span> * // get contents of [path/to/file]:
<span class='line'>1380</span> * var file_contents = CeL.get_file('path/to/file');
<span class='line'>1381</span> * @param {String} path URI / full path. &lt;em style="text-decoration:line-through;">不能用相對path&lt;/em>
<span class='line'>1382</span> * @param {String} [encoding] file encoding
<span class='line'>1383</span> * @returns {String} data content of path
<span class='line'>1384</span> * @returns {undefined} when error occurred: no Ajax function, ..
<span class='line'>1385</span> * @throws uncaught exception @ Firefox: 0x80520012 (NS_ERROR_FILE_NOT_FOUND), &lt;a href="http://www.w3.org/TR/2007/WD-XMLHttpRequest-20070227/#exceptions">NETWORK_ERR&lt;/a> exception
<span class='line'>1386</span> * @throws 'Access to restricted URI denied' 當 access 到上一層目錄時 @ Firefox
<span class='line'>1387</span> * @see
<span class='line'>1388</span> * &lt;a href=http://blog.joycode.com/saucer/archive/2006/10/03/84572.aspx">Cross Site AJAX&lt;/a>,
<span class='line'>1389</span> * &lt;a href="http://domscripting.com/blog/display/91">Cross-domain Ajax&lt;/a>,
<span class='line'>1390</span> * &lt;a href="http://forums.mozillazine.org/viewtopic.php?f=25&amp;t=737645" accessdate="2010/1/1 19:37">FF3 issue with iFrames and XSLT standards&lt;/a>,
<span class='line'>1391</span> * &lt;a href="http://kb.mozillazine.org/Security.fileuri.strict_origin_policy" accessdate="2010/1/1 19:38">Security.fileuri.strict origin policy - MozillaZine Knowledge Base&lt;/a>
<span class='line'>1392</span> * Chrome: &lt;a href="http://code.google.com/p/chromium/issues/detail?id=37586" title="between builds 39339 (good) and 39344 (bad)">NETWORK_ERR: XMLHttpRequest Exception 101&lt;/a>
<span class='line'>1393</span> */</span><span class="WHIT">
<span class='line'>1394</span> </span><span class="NAME">get_file</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">XMLHttpRequest_type</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">encoding</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1395</span> </span><span class="WHIT"> </span><span class="COMM">//with(typeof window.XMLHttpRequest=='undefined'?new ActiveXObject('Microsoft.XMLHTTP'):new XMLHttpRequest()){</span><span class="WHIT">
<span class='line'>1396</span>
<span class='line'>1397</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('XMLHttpRequest type: ' + XMLHttpRequest_type, 1, 'get_file');</span><span class="WHIT">
<span class='line'>1398</span>
<span class='line'>1399</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.get_file</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>1400</span> </span><span class="WHIT"> </span><span class="NAME">data</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>1401</span> </span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'GET'</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>1402</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>1403</span> * XMLHttpRequest object.
<span class='line'>1404</span> * Can't cache this object.
<span class='line'>1405</span> * @inner
<span class='line'>1406</span> * @ignore
<span class='line'>1407</span> */</span><span class="WHIT">
<span class='line'>1408</span> </span><span class="WHIT"> </span><span class="NAME">o</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">XMLHttpRequest_type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>1409</span> </span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">XMLHttpRequest</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1410</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">ActiveXObject</span><span class="PUNC">(</span><span class="STRN">'Microsoft.XMLHTTP'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1411</span>
<span class='line'>1412</span> </span><span class="WHIT"> </span><span class="COMM">// 4096: URL 長度限制,與瀏覽器有關。</span><span class="WHIT">
<span class='line'>1413</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">path.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">4096</span><span class="WHIT">
<span class='line'>1414</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">data</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path.match</span><span class="PUNC">(</span><span class="REGX">/^([^?]{6,200})\?(.+)$/</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1415</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">data</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">data</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">data</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'PUT'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1416</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>1417</span> </span><span class="WHIT"> </span><span class="NAME">data</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1418</span>
<span class='line'>1419</span> </span><span class="WHIT"> </span><span class="NAME">o.open</span><span class="PUNC">(</span><span class="NAME">type</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1420</span>
<span class='line'>1421</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">encoding</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">o.overrideMimeType</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1422</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>1423</span> * old: o.overrideMimeType('text/xml;charset='+encoding);
<span class='line'>1424</span> * 但這樣會被當作 XML 解析,產生語法錯誤。
<span class='line'>1425</span> */</span><span class="WHIT">
<span class='line'>1426</span> </span><span class="WHIT"> </span><span class="NAME">o.overrideMimeType</span><span class="PUNC">(</span><span class="STRN">'application/json;charset='</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">encoding</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1427</span>
<span class='line'>1428</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1429</span> </span><span class="WHIT"> </span><span class="COMM">// http://www.w3.org/TR/2007/WD-XMLHttpRequest-20070227/#dfn-send</span><span class="WHIT">
<span class='line'>1430</span> </span><span class="WHIT"> </span><span class="COMM">// Invoking send() without the data argument must give the same result as if it was invoked with null as argument.</span><span class="WHIT">
<span class='line'>1431</span> </span><span class="WHIT"> </span><span class="NAME">o.send</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1432</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">_s.error</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1433</span>
<span class='line'>1434</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1435</span> </span><span class="WHIT"> </span><span class="COMM">// Chome: XMLHttpRequest cannot load file:///X:/*.js. Cross origin requests are only supported for HTTP.</span><span class="WHIT">
<span class='line'>1436</span> </span><span class="WHIT"> </span><span class="COMM">// Opera 11.50: 不會 throw但是 .responseText === ''。</span><span class="WHIT">
<span class='line'>1437</span> </span><span class="WHIT"> </span><span class="COMM">// Apple Safari 3.0.3 may throw NETWORK_ERR: XMLHttpRequest Exception 101</span><span class="WHIT">
<span class='line'>1438</span> </span><span class="WHIT"> </span><span class="NAME">_s.error</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1439</span>
<span class='line'>1440</span> </span><span class="WHIT"> </span><span class="COMM">//_.warn(_.Class + '.get_file: Loading [' + path + '] failed: ' + e);</span><span class="WHIT">
<span class='line'>1441</span> </span><span class="WHIT"> </span><span class="COMM">//_.err(e);</span><span class="WHIT">
<span class='line'>1442</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('Loading [' + path + '] failed.');</span><span class="WHIT">
<span class='line'>1443</span>
<span class='line'>1444</span> </span><span class="WHIT"> </span><span class="COMM">//e.object = o; // [XPCWrappedNative_NoHelper] Cannot modify properties of a WrappedNative @ firefox</span><span class="WHIT">
<span class='line'>1445</span>
<span class='line'>1446</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">location</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT">
<span class='line'>1447</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">o</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path.match</span><span class="PUNC">(</span><span class="REGX">/:(\/\/)?([^\/]+)/</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1448</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">location.hostname</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1449</span> </span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="PUNC">(</span><span class="STRN">'get_file: 所要求檔案之 domain ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="WHIT">
<span class='line'>1450</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] 與所處之 domain ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">location.hostname</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] 不同!&lt;br/>\n您可能需要嘗試使用 '</span><span class="WHIT">
<span class='line'>1451</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.include_resource()!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1452</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Error</span><span class="PUNC">(</span><span class="STRN">'get_file: Different domain!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1453</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1454</span>
<span class='line'>1455</span> </span><span class="WHIT"> </span><span class="NAME">o</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.require_netscape_privilege</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="NAME">_s</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">arguments</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1456</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('require_netscape_privilege return [' + typeof (o) + ('] ' + o).slice(0, 200) + ' ' + (e === o ? '=' : '!') + '== ' + 'error (' + e + ')');</span><span class="WHIT">
<span class='line'>1457</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1458</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1459</span>
<span class='line'>1460</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1461</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1462</span>
<span class='line'>1463</span> </span><span class="WHIT"> </span><span class="COMM">// workaround for Opera: Opera 11.50: 不會 throw但是 .responseText === ''。</span><span class="WHIT">
<span class='line'>1464</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">o.responseText</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">''</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">is_Opera</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1465</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Error</span><span class="PUNC">(</span><span class="STRN">'get_file: Nothing get @ Opera'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1466</span>
<span class='line'>1467</span> </span><span class="WHIT"> </span><span class="COMM">// 當在 local 時,成功的話 status === 0。失敗的話除 IE 外status 亦總是 0。</span><span class="WHIT">
<span class='line'>1468</span> </span><span class="WHIT"> </span><span class="COMM">// status was introduced in Windows Internet Explorer 7. http://msdn.microsoft.com/en-us/library/ms534650%28VS.85%29.aspx</span><span class="WHIT">
<span class='line'>1469</span> </span><span class="WHIT"> </span><span class="COMM">// 因此,在 local 失敗時,僅 IE 可由 status 探測,其他得由 responseText 判別。</span><span class="WHIT">
<span class='line'>1470</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('Get [' + path + '], status: [' + o.status + '] ' + o.statusText);</span><span class="WHIT">
<span class='line'>1471</span>
<span class='line'>1472</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">o.status</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">3</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT"> </span><span class="NAME">o.status</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">o.responseText</span><span class="WHIT"> </span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">o.responseText</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1473</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1474</span> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1475</span> </span><span class="WHIT"> </span><span class="COMM">// No XMLHttpRequest object.</span><span class="WHIT">
<span class='line'>1476</span>
<span class='line'>1477</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Error</span><span class="PUNC">(</span><span class="STRN">'get_file: This browser does not support XMLHttpRequest.'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1478</span> </span><span class="WHIT"> </span><span class="COMM">// firefox: This function must return a result of type any.</span><span class="WHIT">
<span class='line'>1479</span> </span><span class="WHIT"> </span><span class="COMM">//return undefined;</span><span class="WHIT">
<span class='line'>1480</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1481</span>
<span class='line'>1482</span>
<span class='line'>1483</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1484</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1485</span> </span><span class="COMM">/**
<span class='line'>1486</span> * Ask privilege in mozilla projects: Firefox 2, 3.
<span class='line'>1487</span> * get_file() 遇到需要提高權限時使用。
<span class='line'>1488</span> * enablePrivilege 似乎只能在執行的 function 本身或 caller 呼叫才有效果,跳出函數即無效,不能 cache因此提供 callback。
<span class='line'>1489</span> * 就算按下「記住此決定」,重開瀏覽器後需要再重新授權。
<span class='line'>1490</span> * @param {String|Error} privilege privilege that asked 或因權限不足導致的 Error
<span class='line'>1491</span> * @param {Function|Array} callback|[callback,arguments] Run this callback if getting the privilege. If it's not a function but a number(經過幾層/loop層數), detect if there's a loop or run the caller.
<span class='line'>1492</span> * @returns OK / the return of callback
<span class='line'>1493</span> * @throws error
<span class='line'>1494</span> * @since 2010/1/2 00:40:42
<span class='line'>1495</span> */</span><span class="WHIT">
<span class='line'>1496</span> </span><span class="NAME">require_netscape_privilege</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">require_netscape_privilege</span><span class="PUNC">(</span><span class="NAME">privilege</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1497</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">require_netscape_privilege</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>1498</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>1499</span> * raise error.
<span class='line'>1500</span> * error 有很多種,所以僅以 'object' 判定。
<span class='line'>1501</span> * @inner
<span class='line'>1502</span> * @ignore
<span class='line'>1503</span> */</span><span class="WHIT">
<span class='line'>1504</span> </span><span class="WHIT"> </span><span class="NAME">re</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1505</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('Error: ' + m);</span><span class="WHIT">
<span class='line'>1506</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="NAME">privilege</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">privilege</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>1507</span> </span><span class="WHIT"> </span><span class="COMM">// Error object</span><span class="WHIT">
<span class='line'>1508</span> </span><span class="WHIT"> </span><span class="NAME">privilege</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
<span class='line'>1509</span> </span><span class="WHIT"> </span><span class="COMM">// new Error (message)</span><span class="WHIT">
<span class='line'>1510</span> </span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Error</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1511</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1512</span>
<span class='line'>1513</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">_s.enabled</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1514</span> </span><span class="WHIT"> </span><span class="NAME">re</span><span class="PUNC">(</span><span class="STRN">'Privilege requiring disabled.'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1515</span>
<span class='line'>1516</span> </span><span class="WHIT"> </span><span class="COMM">// test loop</span><span class="WHIT">
<span class='line'>1517</span> </span><span class="WHIT"> </span><span class="COMM">// 得小心使用: 指定錯可能造成 loop!</span><span class="WHIT">
<span class='line'>1518</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">32</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1519</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1520</span> </span><span class="WHIT"> </span><span class="COMM">// @Firefox 4: TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them</span><span class="WHIT">
<span class='line'>1521</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1522</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">f.caller</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1523</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: do not use arguments</span><span class="WHIT">
<span class='line'>1524</span> </span><span class="WHIT"> </span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">f.arguments.callee</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1525</span>
<span class='line'>1526</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1527</span> </span><span class="WHIT"> </span><span class="COMM">// It's looped</span><span class="WHIT">
<span class='line'>1528</span> </span><span class="WHIT"> </span><span class="NAME">re</span><span class="PUNC">(</span><span class="STRN">'Privilege requiring looped.'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1529</span>
<span class='line'>1530</span> </span><span class="WHIT"> </span><span class="NAME">callback</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1531</span>
<span class='line'>1532</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1533</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: handle exception</span><span class="WHIT">
<span class='line'>1534</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1535</span>
<span class='line'>1536</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1537</span>
<span class='line'>1538</span> </span><span class="WHIT"> </span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_s.enablePrivilege</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1539</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('enablePrivilege: ' + f);</span><span class="WHIT">
<span class='line'>1540</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">_s.enablePrivilege</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
<span class='line'>1541</span> </span><span class="WHIT"> </span><span class="NAME">_.get_variable</span><span class="PUNC">(</span><span class="STRN">'netscape.security.PrivilegeManager.enablePrivilege'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1542</span> </span><span class="WHIT"> </span><span class="COMM">// 更改設定,預防白忙。</span><span class="WHIT">
<span class='line'>1543</span> </span><span class="WHIT"> </span><span class="NAME">_s.enabled</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>1544</span> </span><span class="WHIT"> </span><span class="NAME">re</span><span class="PUNC">(</span><span class="STRN">'No enablePrivilege get.'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1545</span>
<span class='line'>1546</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_type</span><span class="PUNC">(</span><span class="NAME">privilege</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'DOMException'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1547</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">privilege.code</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1012</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1548</span> </span><span class="WHIT"> </span><span class="COMM">// http://jck11.pixnet.net/blog/post/11630232</span><span class="WHIT">
<span class='line'>1549</span> </span><span class="WHIT"> </span><span class="COMM">// Mozilla的安全機制是透過PrivilegeManager來管理透過PrivilegeManager的enablePrivilege()函式來開啟這項設定。</span><span class="WHIT">
<span class='line'>1550</span> </span><span class="WHIT"> </span><span class="COMM">// 須在open()之前呼叫enablePrivilege()開啟UniversalBrowserRead權限。</span><span class="WHIT">
<span class='line'>1551</span>
<span class='line'>1552</span> </span><span class="WHIT"> </span><span class="COMM">// http://code.google.com/p/ubiquity-xforms/wiki/CrossDomainSubmissionDeployment</span><span class="WHIT">
<span class='line'>1553</span> </span><span class="WHIT"> </span><span class="COMM">// Or: In the URL type "about:config", get to "signed.applets.codebase_principal_support" and change its value to true.</span><span class="WHIT">
<span class='line'>1554</span>
<span class='line'>1555</span> </span><span class="WHIT"> </span><span class="COMM">// 由任何網站或視窗讀取私密性資料</span><span class="WHIT">
<span class='line'>1556</span> </span><span class="WHIT"> </span><span class="NAME">privilege</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'UniversalBrowserRead'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1557</span>
<span class='line'>1558</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">privilege</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">privilege</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1559</span> </span><span class="WHIT"> </span><span class="NAME">re</span><span class="PUNC">(</span><span class="STRN">'Unknown privilege.'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1560</span>
<span class='line'>1561</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('privilege: ' + privilege);</span><span class="WHIT">
<span class='line'>1562</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1563</span> </span><span class="WHIT"> </span><span class="COMM">//_.log(_.Class + '.require_netscape_privilege: Asking privilege [' + privilege + ']..');</span><span class="WHIT">
<span class='line'>1564</span> </span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">(</span><span class="NAME">privilege</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1565</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1566</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">privilege</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'UniversalBrowserRead'</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">_.is_local</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1567</span> </span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="PUNC">(</span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.require_netscape_privilege: User denied privilege ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">privilege</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'].'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1568</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1569</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1570</span>
<span class='line'>1571</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('OK. Get [' + privilege + ']');</span><span class="WHIT">
<span class='line'>1572</span>
<span class='line'>1573</span>
<span class='line'>1574</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">callback</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1575</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('再執行一次 caller..');</span><span class="WHIT">
<span class='line'>1576</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1577</span> </span><span class="WHIT"> </span><span class="NAME">callback</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_s.caller</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1578</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1579</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: handle exception</span><span class="WHIT">
<span class='line'>1580</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1581</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">callback.apply</span><span class="PUNC">(</span><span class="NAME">_</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback.arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1582</span>
<span class='line'>1583</span> </span><span class="COMM">/* i = callback.apply(_, callback.arguments);
<span class='line'>1584</span> _.debug(('return ' + i).slice(0, 200));
<span class='line'>1585</span> return i;
<span class='line'>1586</span> */</span><span class="WHIT">
<span class='line'>1587</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1588</span> </span><span class="WHIT"> </span><span class="COMM">// 已審查過,為 function</span><span class="WHIT">
<span class='line'>1589</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1590</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1591</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">apply</span><span class="PUNC">(</span><span class="NAME">_</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1592</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1593</span>
<span class='line'>1594</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1595</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1596</span> </span><span class="COMM">/**
<span class='line'>1597</span> * 當需要要求權限時,是否執行。(這樣可能彈出對話框)
<span class='line'>1598</span> * Firefox 5 之後,就算要求了,對 local 也沒用,甚至會 hang 住掛掉,因此取消了。
<span class='line'>1599</span> * @type Boolean
<span class='line'>1600</span> */</span><span class="WHIT">
<span class='line'>1601</span> </span><span class="NAME">require_netscape_privilege.enabled</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1602</span>
<span class='line'>1603</span>
<span class='line'>1604</span> </span><span class="WHIT"> </span><span class="COMM">//----------------------------------------------------------------------------------------------------------------------------------------------------------//</span><span class="WHIT">
<span class='line'>1605</span>
<span class='line'>1606</span>
<span class='line'>1607</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1608</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1609</span> </span><span class="COMM">/**
<span class='line'>1610</span> * 得知 script file 之相對 base path
<span class='line'>1611</span> * @param {String} JSFN script file name
<span class='line'>1612</span> * @returns {String} relative base path
<span class='line'>1613</span> * @example
<span class='line'>1614</span> * &lt;script type="text/javascript" src="../baseFunc.js">&lt;/script>
<span class='line'>1615</span> * // 引數為本.js檔名。若是更改.js檔名亦需要同步更動此值
<span class='line'>1616</span> * var basePath=get_script_base_path('baseFunc.js');
<span class='line'>1617</span> * perl: use File::Basename;
<span class='line'>1618</span> */</span><span class="WHIT">
<span class='line'>1619</span> </span><span class="NAME">get_script_base_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">JSFN</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1620</span> </span><span class="WHIT"> </span><span class="COMM">//alert(JSFN);</span><span class="WHIT">
<span class='line'>1621</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">JSFN</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1622</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">location</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>1623</span> </span><span class="WHIT"> </span><span class="COMM">// location.pathname</span><span class="WHIT">
<span class='line'>1624</span> </span><span class="WHIT"> </span><span class="NAME">location.href</span><span class="WHIT">
<span class='line'>1625</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">WScript</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">WScript.ScriptFullName</span><span class="WHIT">
<span class='line'>1626</span> </span><span class="WHIT"> </span><span class="COMM">// 用在把檔案拉到此檔上時不方便</span><span class="WHIT">
<span class='line'>1627</span> </span><span class="WHIT"> </span><span class="COMM">//: typeof WshShell === 'object' ? WshShell.CurrentDirectory</span><span class="WHIT">
<span class='line'>1628</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/[^\/\\]+$/</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1629</span>
<span class='line'>1630</span> </span><span class="WHIT"> </span><span class="COMM">// We don't use is_Object or so.</span><span class="WHIT">
<span class='line'>1631</span> </span><span class="WHIT"> </span><span class="COMM">// 通常會傳入的,都是已經驗證過的值,不會出現需要特殊認證的情況。</span><span class="WHIT">
<span class='line'>1632</span> </span><span class="WHIT"> </span><span class="COMM">// 因此精確繁複的驗證只用在可能輸入奇怪引數的情況。</span><span class="WHIT">
<span class='line'>1633</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">document</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1634</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1635</span>
<span class='line'>1636</span> </span><span class="WHIT"> </span><span class="COMM">// form dojo: d.config.baseUrl = src.substring(0, m.index);</span><span class="WHIT">
<span class='line'>1637</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">o</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.getElementsByTagName</span><span class="PUNC">(</span><span class="STRN">'script'</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">o.length</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">I</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1638</span>
<span class='line'>1639</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1640</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1641</span> </span><span class="WHIT"> </span><span class="COMM">// o[i].src 多是 full path, o[i].getAttribute('src') 僅取得其值,因此可能是相對的。</span><span class="WHIT">
<span class='line'>1642</span> </span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">getAttribute</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">getAttribute</span><span class="PUNC">(</span><span class="STRN">'src'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1643</span> </span><span class="WHIT"> </span><span class="NAME">I</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">j.lastIndexOf</span><span class="PUNC">(</span><span class="NAME">JSFN</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1644</span> </span><span class="WHIT"> </span><span class="COMM">//alert(j + ',' + JSFN + ',' + I);</span><span class="WHIT">
<span class='line'>1645</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">I</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1646</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: dirty hack</span><span class="WHIT">
<span class='line'>1647</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.env.script_extension</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'.'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1648</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">j.slice</span><span class="PUNC">(</span><span class="NAME">I</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">JSFN.length</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1649</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'js'</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'txt'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1650</span> </span><span class="WHIT"> </span><span class="NAME">_.env.script_extension</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>1651</span> </span><span class="WHIT"> </span><span class="NAME">_.env.main_script</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1652</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1653</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1654</span> </span><span class="WHIT"> </span><span class="COMM">// 遇到奇怪的 extension</span><span class="WHIT">
<span class='line'>1655</span> </span><span class="WHIT"> </span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1656</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1657</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1658</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: test 是否以 JSFN 作為結尾</span><span class="WHIT">
<span class='line'>1659</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">j.slice</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">I</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1660</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1661</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1662</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1663</span>
<span class='line'>1664</span> </span><span class="WHIT"> </span><span class="COMM">//_.log()</span><span class="WHIT">
<span class='line'>1665</span>
<span class='line'>1666</span> </span><span class="WHIT"> </span><span class="COMM">// b || './'</span><span class="WHIT">
<span class='line'>1667</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1668</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1669</span>
<span class='line'>1670</span>
<span class='line'>1671</span> </span><span class="WHIT"> </span><span class="COMM">//----------------------------------------------------------------------------------------------------------------------------------------------------------//</span><span class="WHIT">
<span class='line'>1672</span>
<span class='line'>1673</span>
<span class='line'>1674</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1675</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1676</span> </span><span class="COMM">/**
<span class='line'>1677</span> * test 是否符合 module pattern.
<span class='line'>1678</span> * TODO: improve
<span class='line'>1679</span> * @param {String} test_string string to test
<span class='line'>1680</span> * @returns {Boolean} 是否符合 module pattern
<span class='line'>1681</span> */</span><span class="WHIT">
<span class='line'>1682</span> </span><span class="NAME">is_module_pattern</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">test_string</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1683</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.env.module_identifier_RegExp</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1684</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">r</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1685</span> </span><span class="WHIT"> </span><span class="COMM">// initial module_identifier_RegExp</span><span class="WHIT">
<span class='line'>1686</span> </span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.env.identifier_RegExp.source</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1687</span> </span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.env.module_identifier_RegExp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="STRN">'^'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT">
<span class='line'>1688</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'(\\.'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">')*$'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1689</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1690</span>
<span class='line'>1691</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">r.test</span><span class="PUNC">(</span><span class="NAME">test_string</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1692</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1693</span>
<span class='line'>1694</span>
<span class='line'>1695</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1696</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1697</span> </span><span class="COMM">/**
<span class='line'>1698</span> * test function.request 的項目是否為 module.
<span class='line'>1699</span> * TODO
<span class='line'>1700</span> * 現在還有很大問題!
<span class='line'>1701</span> * @param {String} resource_string resource to test
<span class='line'>1702</span> * @returns {Boolean} resource 是否為 module (true: is module, false: is URL?)
<span class='line'>1703</span> */</span><span class="WHIT">
<span class='line'>1704</span> </span><span class="NAME">request_item_maybe_module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">resource_string</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1705</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">resource_string.charAt</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'.'</span><span class="WHIT">
<span class='line'>1706</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">resource_string.charAt</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'/'</span><span class="WHIT">
<span class='line'>1707</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">resource_string.indexOf</span><span class="PUNC">(</span><span class="STRN">':'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="WHIT">
<span class='line'>1708</span> </span><span class="WHIT"> </span><span class="COMM">// || resource_string.indexOf('%')!==-1</span><span class="WHIT">
<span class='line'>1709</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="REGX">/\.(js|css)$/i</span><span class="PUNC">.</span><span class="NAME">test</span><span class="PUNC">(</span><span class="NAME">resource_string</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
<span class='line'>1710</span> </span><span class="WHIT"> </span><span class="REGX">/\.$/</span><span class="PUNC">.</span><span class="NAME">test</span><span class="PUNC">(</span><span class="NAME">resource_string</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1711</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.is_module_pattern</span><span class="PUNC">(</span><span class="NAME">resource_string</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1712</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1713</span>
<span class='line'>1714</span>
<span class='line'>1715</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">library_base_path</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1716</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1717</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1718</span> </span><span class="COMM">/**
<span class='line'>1719</span> * get the path of specified module.
<span class='line'>1720</span> * @example
<span class='line'>1721</span> * // 存放 data 的 path
<span class='line'>1722</span> * path = library_namespace.get_module_path(this, '');
<span class='line'>1723</span> *
<span class='line'>1724</span> * @param {String} module_name module name
<span class='line'>1725</span> * @param {String} file_name 取得在同一目錄下檔名為 file_name 之 path。若填入 '' 可取得 parent 目錄。
<span class='line'>1726</span> * @returns {String} module path
<span class='line'>1727</span> */</span><span class="WHIT">
<span class='line'>1728</span> </span><span class="NAME">get_module_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">file_name</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1729</span> </span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">get_module_name</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1730</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">m</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1731</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.split_module_name</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1732</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1733</span>
<span class='line'>1734</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('load [' + module_name + ']', 1, 'get_module_path');</span><span class="WHIT">
<span class='line'>1735</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">module_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">library_base_path</span><span class="WHIT">
<span class='line'>1736</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">library_base_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
<span class='line'>1737</span> </span><span class="WHIT"> </span><span class="NAME">_.env.registry_path</span><span class="WHIT">
<span class='line'>1738</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.get_script_base_path</span><span class="PUNC">(</span><span class="NAME">_.env.main_script</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1739</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.get_script_base_path</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1740</span> </span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1741</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('library_base_path: ' + library_base_path, 1, 'get_module_path');</span><span class="WHIT">
<span class='line'>1742</span>
<span class='line'>1743</span> </span><span class="WHIT"> </span><span class="NAME">module_path</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">m.join</span><span class="PUNC">(</span><span class="REGX">/\//</span><span class="PUNC">.</span><span class="NAME">test</span><span class="PUNC">(</span><span class="NAME">module_path</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="STRN">'/'</span><span class="PUNC">:</span><span class="STRN">'\\'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">_.env.script_extension</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1744</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('module_path: ' + module_path, 1, 'get_module_path');</span><span class="WHIT">
<span class='line'>1745</span>
<span class='line'>1746</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">file_name</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1747</span> </span><span class="WHIT"> </span><span class="NAME">module_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module_path.replace</span><span class="PUNC">(</span><span class="REGX">/[^\/]+$/</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">file_name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1748</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.getFP</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1749</span> </span><span class="WHIT"> </span><span class="NAME">module_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.getFP</span><span class="PUNC">(</span><span class="NAME">module_path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1750</span>
<span class='line'>1751</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug(module_name + ': return [' + module_path + ']', 1, 'get_module_path');</span><span class="WHIT">
<span class='line'>1752</span>
<span class='line'>1753</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">module_path</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1754</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1755</span>
<span class='line'>1756</span>
<span class='line'>1757</span> </span><span class="COMM">/*
<span class='line'>1758</span> sample to test:
<span class='line'>1759</span>
<span class='line'>1760</span> ./a/b
<span class='line'>1761</span> ./a/b/
<span class='line'>1762</span> ../a/b
<span class='line'>1763</span> ../a/b/
<span class='line'>1764</span> a/../b ./b
<span class='line'>1765</span> a/./b a/b
<span class='line'>1766</span> /../a/b /a/b
<span class='line'>1767</span> /./a/b /a/b
<span class='line'>1768</span> /a/./b /a/b
<span class='line'>1769</span> /a/../b /b
<span class='line'>1770</span> /a/../../../b /b
<span class='line'>1771</span> /a/b/.. /a
<span class='line'>1772</span> /a/b/../ /a/
<span class='line'>1773</span> a/b/.. a
<span class='line'>1774</span> a/b/../ a/
<span class='line'>1775</span> a/.. .
<span class='line'>1776</span> ./a/b/../../../a.b/../c ../c
<span class='line'>1777</span> ../../../a.b/../c ../../../c
<span class='line'>1778</span>
<span class='line'>1779</span> */</span><span class="WHIT">
<span class='line'>1780</span>
<span class='line'>1781</span> </span><span class="COMM">// 2009/11/23 22:12:5</span><span class="WHIT">
<span class='line'>1782</span> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1783</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1784</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1785</span> </span><span class="NAME">deprecated_simplify_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1786</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1787</span> </span><span class="WHIT"> </span><span class="COMM">// 去除前後空白</span><span class="WHIT">
<span class='line'>1788</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path.replace</span><span class="PUNC">(</span><span class="REGX">/\s+$|^\s+/</span><span class="PUNC">,</span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\/\/+/g</span><span class="PUNC">,</span><span class="STRN">'/'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1789</span>
<span class='line'>1790</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">is_absolute</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'/'</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">path.charAt</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1791</span>
<span class='line'>1792</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="PUNC">=</span><span class="NAME">path.replace</span><span class="PUNC">(</span><span class="REGX">/\/\.(\/|$)/g</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">$0</span><span class="PUNC">,</span><span class="NAME">$1</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">$1</span><span class="PUNC">;</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1793</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1794</span> </span><span class="WHIT"> </span><span class="NAME">_.debug</span><span class="PUNC">(</span><span class="STRN">'1. '</span><span class="PUNC">+</span><span class="NAME">p</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1795</span>
<span class='line'>1796</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path.replace</span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>1797</span> </span><span class="WHIT"> </span><span class="REGX">/\/([^\/]+)\/\.\.(\/|$)/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">$0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">$1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">$2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1798</span> </span><span class="WHIT"> </span><span class="NAME">alert</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT"> </span><span class="NAME">$0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">$1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">$2</span><span class="WHIT"> </span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">join</span><span class="PUNC">(</span><span class="STRN">'\n'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1799</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">$1</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'..'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">$0</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">$2</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1800</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1801</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1802</span> </span><span class="WHIT"> </span><span class="NAME">_.debug</span><span class="PUNC">(</span><span class="STRN">'2. '</span><span class="PUNC">+</span><span class="NAME">p</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1803</span>
<span class='line'>1804</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">is_absolute</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1805</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path.replace</span><span class="PUNC">(</span><span class="REGX">/^(\/\.\.)+/g</span><span class="PUNC">,</span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1806</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>1807</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path.replace</span><span class="PUNC">(</span><span class="REGX">/^(\.\/)+/g</span><span class="PUNC">,</span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1808</span> </span><span class="WHIT"> </span><span class="NAME">_.debug</span><span class="PUNC">(</span><span class="STRN">'3. '</span><span class="PUNC">+</span><span class="NAME">p</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1809</span>
<span class='line'>1810</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">path</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1811</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'.'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1812</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1813</span>
<span class='line'>1814</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1815</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1816</span>
<span class='line'>1817</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1818</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1819</span> </span><span class="COMM">/**
<span class='line'>1820</span> * 轉化所有 /., /.., //
<span class='line'>1821</span> * @since 2009/11/23 22:32:52
<span class='line'>1822</span> * @param {String} path 欲轉化之 path
<span class='line'>1823</span> * @returns {String} path
<span class='line'>1824</span> */</span><span class="WHIT">
<span class='line'>1825</span> </span><span class="NAME">simplify_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1826</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1827</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">is_absolute</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">head</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1828</span>
<span class='line'>1829</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT">
<span class='line'>1830</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/^[\w\d\-]+:\/\//</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">$0</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">head</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1831</span> </span><span class="WHIT"> </span><span class="COMM">// 去除前後空白</span><span class="WHIT">
<span class='line'>1832</span> </span><span class="WHIT"> </span><span class="COMM">//.replace(/\s+$|^\s+/g,'')</span><span class="WHIT">
<span class='line'>1833</span> </span><span class="WHIT"> </span><span class="COMM">//.replace(/\/\/+/g,'/')</span><span class="WHIT">
<span class='line'>1834</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">split</span><span class="PUNC">(</span><span class="STRN">'/'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1835</span>
<span class='line'>1836</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1837</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path.length</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1838</span> </span><span class="WHIT"> </span><span class="NAME">is_absolute</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">path</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1839</span>
<span class='line'>1840</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">l</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1841</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'.'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1842</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1843</span>
<span class='line'>1844</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'..'</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1845</span> </span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">=</span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1846</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="PUNC">(</span><span class="NAME">j</span><span class="PUNC">></span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1847</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">[</span><span class="PUNC">--</span><span class="NAME">j</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">!=</span><span class="STRN">'..'</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1848</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// 相消</span><span class="WHIT">
<span class='line'>1849</span> </span><span class="WHIT"> </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1850</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1851</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1852</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1853</span>
<span class='line'>1854</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">is_absolute</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">path</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1855</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'.'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1856</span>
<span class='line'>1857</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path.join</span><span class="PUNC">(</span><span class="STRN">'/'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1858</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\/\/+/g</span><span class="PUNC">,</span><span class="STRN">'/'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1859</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="NAME">is_absolute</span><span class="PUNC">?</span><span class="WHIT"> </span><span class="REGX">/^(\/\.\.)+/g</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="REGX">/^(\.\/)+/g</span><span class="PUNC">,</span><span class="STRN">''</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1860</span> </span><span class="WHIT"> </span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1861</span>
<span class='line'>1862</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">path</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1863</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'.'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1864</span>
<span class='line'>1865</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">head</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1866</span> </span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">head</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1867</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1868</span>
<span class='line'>1869</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1870</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1871</span>
<span class='line'>1872</span>
<span class='line'>1873</span>
<span class='line'>1874</span> </span><span class="COMM">/**
<span class='line'>1875</span> * 載入 module 時執行 extend 工作
<span class='line'>1876</span> * @param module
<span class='line'>1877</span> * @param extend_to
<span class='line'>1878</span> * @param {Function} callback
<span class='line'>1879</span> * @returns
<span class='line'>1880</span> * @inner
<span class='line'>1881</span> * @ignore
<span class='line'>1882</span> */</span><span class="WHIT">
<span class='line'>1883</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">extend_module_member</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1884</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1885</span>
<span class='line'>1886</span> </span><span class="WHIT"> </span><span class="COMM">//typeof name_space !== 'undefined' && _.debug(name_space);</span><span class="WHIT">
<span class='line'>1887</span> </span><span class="WHIT"> </span><span class="COMM">// 處理 extend to what name-space</span><span class="WHIT">
<span class='line'>1888</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">extend_to</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT">
<span class='line'>1889</span> </span><span class="WHIT"> </span><span class="COMM">// 若是在 .setup_module 中的話,可以探測得到 name_space忘了</span><span class="WHIT">
<span class='line'>1890</span> </span><span class="WHIT"> </span><span class="COMM">//|| typeof name_space !== 'function'</span><span class="WHIT">
<span class='line'>1891</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">extend_to</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1892</span> </span><span class="WHIT"> </span><span class="COMM">// 預設會 extend 到 library 本身下</span><span class="WHIT">
<span class='line'>1893</span> </span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1894</span>
<span class='line'>1895</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">extend_to</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.get_module</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1896</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ns</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">kw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.env.not_to_extend_keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">no_extend</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1897</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('load [' + module + ']:\nextend\n' + ns);</span><span class="WHIT">
<span class='line'>1898</span>
<span class='line'>1899</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">kw</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">ns</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1900</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ns</span><span class="PUNC">[</span><span class="NAME">kw</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1901</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">l.indexOf</span><span class="PUNC">(</span><span class="STRN">','</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1902</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">l.split</span><span class="PUNC">(</span><span class="STRN">','</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1903</span>
<span class='line'>1904</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1905</span> </span><span class="WHIT"> </span><span class="NAME">no_extend</span><span class="PUNC">[</span><span class="NAME">l</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1906</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">l</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1907</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1908</span> </span><span class="WHIT"> </span><span class="COMM">// WScript.Echo('no_extend '+l[i]),</span><span class="WHIT">
<span class='line'>1909</span> </span><span class="WHIT"> </span><span class="NAME">no_extend</span><span class="PUNC">[</span><span class="NAME">l</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1910</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">l</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1911</span> </span><span class="WHIT"> </span><span class="NAME">no_extend</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1912</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1913</span>
<span class='line'>1914</span> </span><span class="WHIT"> </span><span class="NAME">no_extend</span><span class="PUNC">[</span><span class="NAME">kw</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1915</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1916</span>
<span class='line'>1917</span> </span><span class="WHIT"> </span><span class="COMM">// '*': 完全不 extend</span><span class="WHIT">
<span class='line'>1918</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">no_extend</span><span class="PUNC">[</span><span class="STRN">'*'</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1919</span> </span><span class="WHIT"> </span><span class="NAME">no_extend.Class</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1920</span> </span><span class="WHIT"> </span><span class="COMM">// this: 連 module 本身都不 extend 到 library name-space 下</span><span class="WHIT">
<span class='line'>1921</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">no_self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'this'</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">no_extend</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1922</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">no_self</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1923</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">no_extend</span><span class="PUNC">[</span><span class="STRN">'this'</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1924</span>
<span class='line'>1925</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1926</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">ns</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1927</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">no_extend</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1928</span> </span><span class="WHIT"> </span><span class="NAME">l.push</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1929</span>
<span class='line'>1930</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('load [' + module + ']:\nextend\n' + l + '\n\nto:\n' + (extend_to.Class || extend_to));</span><span class="WHIT">
<span class='line'>1931</span> </span><span class="WHIT"> </span><span class="NAME">_.extend</span><span class="PUNC">(</span><span class="NAME">l</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ns</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1932</span>
<span class='line'>1933</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>1934</span> * extend module itself.
<span class='line'>1935</span> * e.g., .net.web -> .web
<span class='line'>1936</span> */</span><span class="WHIT">
<span class='line'>1937</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">no_self</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.split_module_name</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1938</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">i.pop</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1939</span> </span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ns</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1940</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1941</span>
<span class='line'>1942</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1943</span>
<span class='line'>1944</span>
<span class='line'>1945</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1946</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">(</span><span class="NAME">undefined</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1947</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1948</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1949</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1950</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1951</span>
<span class='line'>1952</span>
<span class='line'>1953</span>
<span class='line'>1954</span>
<span class='line'>1955</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1956</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1957</span> </span><span class="COMM">/**
<span class='line'>1958</span> * 不使用 eval 的方法get the module namespace of specific module name.
<span class='line'>1959</span> * @param {String} module_name module name
<span class='line'>1960</span> * @returns null some error occurred
<span class='line'>1961</span> * @returns namespace of specific module name
<span class='line'>1962</span> */</span><span class="WHIT">
<span class='line'>1963</span> </span><span class="NAME">get_module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1964</span> </span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.split_module_name.call</span><span class="PUNC">(</span><span class="NAME">_</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1965</span>
<span class='line'>1966</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: test module_name.length</span><span class="WHIT">
<span class='line'>1967</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1968</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1969</span>
<span class='line'>1970</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module_name.length</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1971</span> </span><span class="WHIT"> </span><span class="COMM">// 一層一層 call name-space</span><span class="WHIT">
<span class='line'>1972</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>1973</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1974</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">module_name</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">]</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1975</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>1976</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1977</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>1978</span>
<span class='line'>1979</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1980</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>1981</span>
<span class='line'>1982</span>
<span class='line'>1983</span>
<span class='line'>1984</span>
<span class='line'>1985</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>1986</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>1987</span> </span><span class="COMM">/**
<span class='line'>1988</span> * 載入 module。
<span class='line'>1989</span> * &lt;p>
<span class='line'>1990</span> * 本函數會預先準備好下層 module 定義時的環境,但請盡量先 call 上層 name-space
<span class='line'>1991</span> * 再定義下層的,否則可能會出現問題,如 memory leak 等。
<span class='line'>1992</span> * &lt;/p>
<span class='line'>1993</span> *
<span class='line'>1994</span> * @param {String}
<span class='line'>1995</span> * [module_name]
<span class='line'>1996</span> * &lt;p>
<span class='line'>1997</span> * module name to register: 本 module 之 name(id)
<span class='line'>1998</span> * &lt;/p>
<span class='line'>1999</span> * @param {Function}
<span class='line'>2000</span> * code_for_including
<span class='line'>2001</span> * &lt;p>
<span class='line'>2002</span> * 若欲 include 整個 module 時,需囊括之 code。
<span class='line'>2003</span> * &lt;/p>
<span class='line'>2004</span> * code_for_including(
<span class='line'>2005</span> * {Function} library_namespace: namespace of library,
<span class='line'>2006</span> * load_arguments: 呼叫時之 argument(s)
<span class='line'>2007</span> * )
<span class='line'>2008</span> * @returns null
<span class='line'>2009</span> * &lt;p>
<span class='line'>2010</span> * invalid module
<span class='line'>2011</span> * &lt;/p>
<span class='line'>2012</span> * @returns {Object}
<span class='line'>2013</span> * &lt;p>
<span class='line'>2014</span> * 下層 module 之 name-space
<span class='line'>2015</span> * &lt;/p>
<span class='line'>2016</span> * @returns undefined
<span class='line'>2017</span> * &lt;p>
<span class='line'>2018</span> * something error, e.g., 未成功 loadcode_for_including
<span class='line'>2019</span> * return null, ..
<span class='line'>2020</span> * &lt;/p>
<span class='line'>2021</span> */</span><span class="WHIT">
<span class='line'>2022</span> </span><span class="NAME">setup_module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">parent_module_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2023</span> </span><span class="WHIT"> </span><span class="COMM">// adapt arguments</span><span class="WHIT">
<span class='line'>2024</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">allow_inherit</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2025</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>2026</span> * translate {String} code_for_including to function
<span class='line'>2027</span> */</span><span class="WHIT">
<span class='line'>2028</span> </span><span class="WHIT"> </span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2029</span> </span><span class="WHIT"> </span><span class="COMM">// null module constructor</span><span class="WHIT">
<span class='line'>2030</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2031</span> </span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2032</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2033</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2034</span>
<span class='line'>2035</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2036</span> </span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
<span class='line'>2037</span> </span><span class="WHIT"> </span><span class="COMM">// (new Function(code_for_including)).bind(CeL)</span><span class="WHIT">
<span class='line'>2038</span> </span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Function</span><span class="PUNC">(</span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2039</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2040</span>
<span class='line'>2041</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2042</span> </span><span class="WHIT"> </span><span class="NAME">name</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2043</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2044</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2045</span> </span><span class="WHIT"> </span><span class="NAME">code_for_including.module_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2046</span>
<span class='line'>2047</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2048</span> </span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2049</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: 不設定時會從呼叫時之 path (directory + file name) 取得</span><span class="WHIT">
<span class='line'>2050</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2051</span>
<span class='line'>2052</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2053</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2054</span> </span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">name_space.code</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2055</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">name_space.code</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2056</span> </span><span class="WHIT"> </span><span class="NAME">name</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2057</span>
<span class='line'>2058</span> </span><span class="WHIT"> </span><span class="NAME">_.extend</span><span class="PUNC">(</span><span class="NAME">name_space</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2059</span>
<span class='line'>2060</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>2061</span> </span><span class="WHIT"> </span><span class="NAME">name</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2062</span>
<span class='line'>2063</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">code_for_including.module_name</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2064</span> </span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="PUNC">(</span><span class="STRN">'The module name is not specified!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2065</span> </span><span class="WHIT"> </span><span class="NAME">_.debug</span><span class="PUNC">(</span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2066</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2067</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2068</span>
<span class='line'>2069</span> </span><span class="WHIT"> </span><span class="COMM">// sub module</span><span class="WHIT">
<span class='line'>2070</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">code_for_including.sub_module</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2071</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">_.env.module_name_separator</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2072</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2073</span> </span><span class="WHIT"> </span><span class="NAME">_.setup_module</span><span class="PUNC">(</span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2074</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2075</span>
<span class='line'>2076</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('prepare to setup module [' + module_name + ']', 1, 'setup_module');</span><span class="WHIT">
<span class='line'>2077</span>
<span class='line'>2078</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>2079</span> * 測試 dependency list 是不是皆已 loaded。
<span class='line'>2080</span> * 會合併 parent module 之 request。
<span class='line'>2081</span> * &lt;dl>
<span class='line'>2082</span> * &lt;dt>依 (module name-space).require 設定 dependency list&lt;/dt>
<span class='line'>2083</span> * &lt;dd>(module name-space).require_module = module name[]&lt;/dd>
<span class='line'>2084</span> * &lt;dd>(module name-space).require_variable = {variable_name: full_name_with_module_name}&lt;/dd>
<span class='line'>2085</span> * &lt;dd>(module name-space).require_URL = URL[]&lt;/dd>
<span class='line'>2086</span> * &lt;/dl>
<span class='line'>2087</span> * TODO:
<span class='line'>2088</span> * 就算輸入 module path 亦可自動判別出為 module 而非普通 resource。
<span class='line'>2089</span> */</span><span class="WHIT">
<span class='line'>2090</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">require</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.parse_require</span><span class="PUNC">(</span><span class="NAME">code_for_including.require</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">code_for_including.require_separator</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">parent_module_name</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">module_require_chain</span><span class="PUNC">[</span><span class="NAME">parent_module_name</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">URL_to_load</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module_to_load</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2091</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">require</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2092</span> </span><span class="WHIT"> </span><span class="NAME">_.extend</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2093</span> </span><span class="WHIT"> </span><span class="NAME">require_module</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'module_to_load'</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2094</span> </span><span class="WHIT"> </span><span class="NAME">require_variable</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'variable'</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2095</span> </span><span class="WHIT"> </span><span class="NAME">require_URL</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'URL_to_load'</span><span class="WHIT">
<span class='line'>2096</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">require</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2097</span>
<span class='line'>2098</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">require.module_to_load</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2099</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">require.module_to_load.length</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2100</span> </span><span class="WHIT"> </span><span class="NAME">module_to_load</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">require.module_to_load</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2101</span>
<span class='line'>2102</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">require.URL_to_load</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2103</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">require.URL_to_load.length</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2104</span> </span><span class="WHIT"> </span><span class="NAME">URL_to_load</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">require.URL_to_load</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2105</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2106</span>
<span class='line'>2107</span>
<span class='line'>2108</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">module_to_load</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">URL_to_load</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2109</span>
<span class='line'>2110</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('module [' + (typeof module_name === 'string' ? module_name: undefined) + '] need to load:\n' + module_to_load, 1, 'setup_module');</span><span class="WHIT">
<span class='line'>2111</span>
<span class='line'>2112</span> </span><span class="WHIT"> </span><span class="COMM">// check 登錄</span><span class="WHIT">
<span class='line'>2113</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">module_require_chain</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2114</span> </span><span class="WHIT"> </span><span class="COMM">// 可能是循環參照(circular dependencies),還是執行 module code_for_including</span><span class="WHIT">
<span class='line'>2115</span> </span><span class="WHIT"> </span><span class="COMM">// 若本身已經在需求名單中則放行,避免相互需要造成堆疊空間不足(Out of stack space)或 Stack overflow。</span><span class="WHIT">
<span class='line'>2116</span> </span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="PUNC">(</span><span class="STRN">'Skip to load dependencies ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_to_load</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] of module ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] because the module is already in the require chain.\nmodule 正在需求鏈中。也許是循環參照(circular dependencies)'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2117</span>
<span class='line'>2118</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2119</span>
<span class='line'>2120</span> </span><span class="WHIT"> </span><span class="COMM">// 登錄: module_name 正在 call。若由其他 module call 的,那就登錄此 parent module。</span><span class="WHIT">
<span class='line'>2121</span> </span><span class="WHIT"> </span><span class="NAME">module_require_chain</span><span class="PUNC">[</span><span class="NAME">parent_module_name</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">require</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2122</span>
<span class='line'>2123</span> </span><span class="WHIT"> </span><span class="COMM">// include required modules</span><span class="WHIT">
<span class='line'>2124</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">module_to_load</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">_.use</span><span class="PUNC">(</span><span class="NAME">module_to_load</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2125</span> </span><span class="WHIT"> </span><span class="COMM">// 若有未載入之 dependencies則不載入 module。</span><span class="WHIT">
<span class='line'>2126</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">_.is_local</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.is_debug</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2127</span> </span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="PUNC">(</span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.setup_module: Module ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] fault to load dependencies ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_to_load</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']. You have to load it later.'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2128</span>
<span class='line'>2129</span> </span><span class="WHIT"> </span><span class="COMM">// throw and wait .include_resource() to call callback(path, module_name)</span><span class="WHIT">
<span class='line'>2130</span> </span><span class="WHIT"> </span><span class="COMM">// 為了預防後面還有 code 而繼續執行下去,所以採用 throw 而非 return。</span><span class="WHIT">
<span class='line'>2131</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Error</span><span class="PUNC">(</span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.setup_module: Module ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] 無法以 Ajax load required module!\nrequired module list: ['</span><span class="PUNC">+</span><span class="NAME">module_to_load</span><span class="PUNC">+</span><span class="STRN">']'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2132</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2133</span>
<span class='line'>2134</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">URL_to_load</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2135</span> </span><span class="WHIT"> </span><span class="COMM">// 嘗試直接載入</span><span class="WHIT">
<span class='line'>2136</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">URL_to_load</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2137</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2138</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.get_file</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">URL_to_load</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2139</span> </span><span class="WHIT"> </span><span class="NAME">_.eval_code</span><span class="PUNC">(</span><span class="NAME">l</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2140</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>2141</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2142</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2143</span> </span><span class="WHIT"> </span><span class="NAME">_</span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">err</span><span class="PUNC">(</span><span class="STRN">'module ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] load URL ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT">
<span class='line'>2144</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] error. You have to load it later.'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2145</span> </span><span class="WHIT"> </span><span class="COMM">// return and wait .include_resource() to call callback(path, module_name)</span><span class="WHIT">
<span class='line'>2146</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Error</span><span class="PUNC">(</span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.setup_module: module ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] 無法以 Ajax load required URL ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2147</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2148</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2149</span>
<span class='line'>2150</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2151</span>
<span class='line'>2152</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2153</span> </span><span class="WHIT"> </span><span class="COMM">// else 所有需求皆已在 queue 中,因此最後總**有機會(不包括發生錯誤的情況!)**會被 load故 skip。</span><span class="WHIT">
<span class='line'>2154</span>
<span class='line'>2155</span>
<span class='line'>2156</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">module_name_list</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.split_module_name</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2157</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">module_name_list</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2158</span> </span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="PUNC">(</span><span class="STRN">'Illegal module name: ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2159</span> </span><span class="WHIT"> </span><span class="NAME">_.debug</span><span class="PUNC">(</span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2160</span>
<span class='line'>2161</span> </span><span class="WHIT"> </span><span class="COMM">// 執行完清除載入中之登錄</span><span class="WHIT">
<span class='line'>2162</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">module_require_chain</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2163</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">module_require_chain</span><span class="PUNC">[</span><span class="NAME">module_name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2164</span>
<span class='line'>2165</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2166</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2167</span>
<span class='line'>2168</span> </span><span class="WHIT"> </span><span class="COMM">// 若皆載入: 準備執行 module code_for_including</span><span class="WHIT">
<span class='line'>2169</span> </span><span class="WHIT"> </span><span class="COMM">// 一層一層準備好、預定義 name-space</span><span class="WHIT">
<span class='line'>2170</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module_name_list.length</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2171</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module_name_list</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2172</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>2173</span> * &lt;code>
<span class='line'>2174</span> * _.debug('預先定義 module [' + _.to_module_name(module_name.slice(0, i + 1)) + ']'),
<span class='line'>2175</span> * &lt;/code>
<span class='line'>2176</span> */</span><span class="WHIT">
<span class='line'>2177</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Function</span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>2178</span> </span><span class="WHIT"> </span><span class="STRN">'// null constructor for module '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
<span class='line'>2179</span> </span><span class="WHIT"> </span><span class="NAME">_.to_module_name</span><span class="PUNC">(</span><span class="NAME">module_name_list.slice</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2180</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2181</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2182</span> </span><span class="WHIT"> </span><span class="COMM">// name_space 這時是 module 的 parent module。</span><span class="WHIT">
<span class='line'>2183</span>
<span class='line'>2184</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>2185</span> </span><span class="WHIT"> </span><span class="COMM">// 尚未被定義或宣告過</span><span class="WHIT">
<span class='line'>2186</span> </span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module_name_list</span><span class="PUNC">[</span><span class="NAME">l</span><span class="PUNC">]</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT">
<span class='line'>2187</span> </span><span class="WHIT"> </span><span class="COMM">// 可能是之前簡單定義過,例如被上面處理過。這時重新定義,並把原先的 member 搬過來。</span><span class="WHIT">
<span class='line'>2188</span> </span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">Class</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2189</span>
<span class='line'>2190</span> </span><span class="WHIT"> </span><span class="COMM">// 保留原先的 name-spacefor 重新定義</span><span class="WHIT">
<span class='line'>2191</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2192</span>
<span class='line'>2193</span> </span><span class="WHIT"> </span><span class="COMM">// extend code, 起始 name-space</span><span class="WHIT">
<span class='line'>2194</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2195</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>2196</span> * 真正執行 module code.
<span class='line'>2197</span> * &lt;code>
<span class='line'>2198</span> * _.debug('including code of [' + _.to_module_name(module_name) + ']..'),
<span class='line'>2199</span> * &lt;/code>
<span class='line'>2200</span> * TODO: code_for_including(_, load_arguments)
<span class='line'>2201</span> */</span><span class="WHIT">
<span class='line'>2202</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">code_for_including.call</span><span class="PUNC">(</span><span class="NAME">code_for_including</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2203</span> </span><span class="WHIT"> </span><span class="NAME">i.prototype.constructor</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2204</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="STRN">'allow_inherit'</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2205</span> </span><span class="WHIT"> </span><span class="NAME">allow_inherit</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">i.allow_inherit</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2206</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">i.allow_inherit</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2207</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2208</span> </span><span class="WHIT"> </span><span class="COMM">//code_for_including.toString = function() { return '[class_template ' + name + ']'; };</span><span class="WHIT">
<span class='line'>2209</span> </span><span class="WHIT"> </span><span class="COMM">//i.toString = function() { return '[class ' + name + ']'; };</span><span class="WHIT">
<span class='line'>2210</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2211</span> </span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="PUNC">(</span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.setup_module: load module ['</span><span class="WHIT">
<span class='line'>2212</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">_.to_module_name</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] error!\n'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">e.message</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2213</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2214</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2215</span>
<span class='line'>2216</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2217</span> </span><span class="WHIT"> </span><span class="COMM">// error?</span><span class="WHIT">
<span class='line'>2218</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2219</span>
<span class='line'>2220</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2221</span>
<span class='line'>2222</span> </span><span class="WHIT"> </span><span class="COMM">// 把原先的 member 搬過來</span><span class="WHIT">
<span class='line'>2223</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">l</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2224</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">l.Class</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2225</span> </span><span class="WHIT"> </span><span class="COMM">// may use: _.extend()</span><span class="WHIT">
<span class='line'>2226</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2227</span> </span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2228</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2229</span> </span><span class="WHIT"> </span><span class="NAME">name_space.Class</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.to_module_name</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2230</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2231</span>
<span class='line'>2232</span> </span><span class="COMM">/*
<span class='line'>2233</span> l=[];
<span class='line'>2234</span> for(i in name_space)
<span class='line'>2235</span> l.push(i);
<span class='line'>2236</span> WScript.Echo('Get members:\n'+l.join(', '));
<span class='line'>2237</span> */</span><span class="WHIT">
<span class='line'>2238</span>
<span class='line'>2239</span> </span><span class="WHIT"> </span><span class="COMM">// 執行完清除載入中之登錄</span><span class="WHIT">
<span class='line'>2240</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">module_require_chain</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2241</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">module_require_chain</span><span class="PUNC">[</span><span class="NAME">module_name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2242</span>
<span class='line'>2243</span> </span><span class="WHIT"> </span><span class="NAME">set_loaded</span><span class="PUNC">(</span><span class="NAME">name_space.Class</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">allow_inherit</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2244</span>
<span class='line'>2245</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('module [' + module_name + '] 設定 OK.', 1, 'setup_module');</span><span class="WHIT">
<span class='line'>2246</span>
<span class='line'>2247</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">name_space</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2248</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2249</span>
<span class='line'>2250</span>
<span class='line'>2251</span>
<span class='line'>2252</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2253</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2254</span> </span><span class="COMM">/**
<span class='line'>2255</span> * 是否 cache code。
<span class='line'>2256</span> * 若不是要重構 code 則不需要。
<span class='line'>2257</span> * undefined: 依照預設
<span class='line'>2258</span> * Boolean: 明確設定,但如此即無法繼承。
<span class='line'>2259</span> * @type Boolean, undefined
<span class='line'>2260</span> */</span><span class="WHIT">
<span class='line'>2261</span> </span><span class="NAME">cache_code</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="COMM">/*_.is_debug() || */</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2262</span>
<span class='line'>2263</span> </span><span class="COMM">/**
<span class='line'>2264</span> * cache 已經 include 之函式或 class。
<span class='line'>2265</span> * loaded_module[module_name] =
<span class='line'>2266</span> * undefined: 尚未載入。
<span class='line'>2267</span> * {Boolean} true 已經載入,但未 cache code。
<span class='line'>2268</span> * {Function} code 已經載入,這是 cache 了的 code。
<span class='line'>2269</span> * @inner
<span class='line'>2270</span> * @ignore
<span class='line'>2271</span> * @type Object
<span class='line'>2272</span> */</span><span class="WHIT">
<span class='line'>2273</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">loaded_module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2274</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2275</span>
<span class='line'>2276</span>
<span class='line'>2277</span> </span><span class="COMM">/**
<span class='line'>2278</span> * 紀錄 **正在 load** 之 module 所需之 dependency list。
<span class='line'>2279</span> * module_require_chain[module_name] = [未載入之 dependency list by .parse_require()] requesting now.
<span class='line'>2280</span> *
<span class='line'>2281</span> * ** 這一項僅在 .setup_module() 發現 dependency list 尚未載入完時,預防循環 request 而用。
<span class='line'>2282</span> * @inner
<span class='line'>2283</span> * @ignore
<span class='line'>2284</span> * @type Object
<span class='line'>2285</span> */</span><span class="WHIT">
<span class='line'>2286</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">module_require_chain</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2287</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2288</span>
<span class='line'>2289</span>
<span class='line'>2290</span>
<span class='line'>2291</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2292</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2293</span> </span><span class="COMM">/**
<span class='line'>2294</span> * 將輸入的 string 分割成各 module 單元。&lt;br/>
<span class='line'>2295</span> * need environment_adapter()&lt;br/>
<span class='line'>2296</span> * ** 並沒有對 module 做完善的審核!
<span class='line'>2297</span> * @param {String} module_name module name
<span class='line'>2298</span> * @returns {Array} module unit array
<span class='line'>2299</span> */</span><span class="WHIT">
<span class='line'>2300</span> </span><span class="NAME">split_module_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2301</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('[' + module_name + ']→[' + module_name.replace(/\.\.+|\\\\+|\/\/+/g, '.').split(/\.|\\|\/|::/) + ']');</span><span class="WHIT">
<span class='line'>2302</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2303</span> </span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT">
<span class='line'>2304</span> </span><span class="WHIT"> </span><span class="COMM">//.replace(/\.\.+|\\\\+|\/\/+/g, '.')</span><span class="WHIT">
<span class='line'>2305</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/[\\\/]/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'.'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2306</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">split</span><span class="PUNC">(</span><span class="REGX">/[.\\\/]|::/</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2307</span>
<span class='line'>2308</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">module_name.length</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2309</span> </span><span class="WHIT"> </span><span class="COMM">// 去除 library name</span><span class="WHIT">
<span class='line'>2310</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">module_name.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2311</span> </span><span class="WHIT"> </span><span class="NAME">module_name.shift</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2312</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2313</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>2314</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2315</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2316</span>
<span class='line'>2317</span>
<span class='line'>2318</span> </span><span class="COMM">/**
<span class='line'>2319</span> * 取得建構 code 之 module name。不以 library name 起始。
<span class='line'>2320</span> * // get_module_name()
<span class='line'>2321</span> * code_for_including.module_name === 'module_name';
<span class='line'>2322</span> * // _.to_module_name()
<span class='line'>2323</span> * library_name.module_parent.module_child.Class === 'library_name.module_parent.module_child' === 'library_name.module_name';
<span class='line'>2324</span> * TODO:
<span class='line'>2325</span> * 有效率的整合 get_module_name() 與 _.to_module_name()
<span class='line'>2326</span> * @param code_for_including
<span class='line'>2327</span> * @returns {String} module name
<span class='line'>2328</span> */</span><span class="WHIT">
<span class='line'>2329</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">get_module_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2330</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('module_name: ' + (_.is_Function(code_for_including) && code_for_including.module_name ? code_for_including.module_name : code_for_including), 1, 'get_module_name');</span><span class="WHIT">
<span class='line'>2331</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('Class: ' + (_.is_Function(code_for_including) && code_for_including.Class ? code_for_including.Class : code_for_including), 1, 'get_module_name');</span><span class="WHIT">
<span class='line'>2332</span>
<span class='line'>2333</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">code_for_including.module_name</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>2334</span> </span><span class="WHIT"> </span><span class="NAME">code_for_including.module_name</span><span class="WHIT">
<span class='line'>2335</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2336</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2337</span>
<span class='line'>2338</span>
<span class='line'>2339</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2340</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2341</span> </span><span class="COMM">/**
<span class='line'>2342</span> * 取得 module 之 name。以 library name 起始。
<span class='line'>2343</span> * @returns {String} module name start with library name
<span class='line'>2344</span> */</span><span class="WHIT">
<span class='line'>2345</span> </span><span class="NAME">to_module_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">separator</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2346</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2347</span> </span><span class="WHIT"> </span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module.Class</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2348</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">_.env.main_script_name</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2349</span> </span><span class="WHIT"> </span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.Class</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2350</span>
<span class='line'>2351</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2352</span> </span><span class="WHIT"> </span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.split_module_name</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2353</span>
<span class='line'>2354</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2355</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2356</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">separator</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2357</span> </span><span class="WHIT"> </span><span class="NAME">separator</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.env.module_name_separator</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2358</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">_.Class</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2359</span> </span><span class="WHIT"> </span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">separator</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2360</span> </span><span class="WHIT"> </span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module.join</span><span class="PUNC">(</span><span class="NAME">separator</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2361</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2362</span>
<span class='line'>2363</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">name</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2364</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2365</span>
<span class='line'>2366</span>
<span class='line'>2367</span>
<span class='line'>2368</span> </span><span class="COMM">//TODO</span><span class="WHIT">
<span class='line'>2369</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2370</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2371</span> </span><span class="NAME">get_require</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">func</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2372</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">func</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">func</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2373</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">func.require</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2374</span>
<span class='line'>2375</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">func</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">loaded_module</span><span class="PUNC">[</span><span class="NAME">_.to_module_name</span><span class="PUNC">(</span><span class="NAME">func</span><span class="PUNC">)</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2376</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">func.require_module</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2377</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2378</span>
<span class='line'>2379</span> </span><span class="COMM">//TODO</span><span class="WHIT">
<span class='line'>2380</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2381</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2382</span> </span><span class="NAME">unload_module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2383</span> </span><span class="WHIT"> </span><span class="COMM">/// &lt;returns>error&lt;/returns></span><span class="WHIT">
<span class='line'>2384</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">_.is_debug</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2385</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Error</span><span class="PUNC">(</span><span class="STRN">'UNDO'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2386</span>
<span class='line'>2387</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2388</span>
<span class='line'>2389</span>
<span class='line'>2390</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2391</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2392</span> </span><span class="COMM">/**
<span class='line'>2393</span> * 判斷 module 是否存在,
<span class='line'>2394</span> * TODO
<span class='line'>2395</span> * 以及是否破損。
<span class='line'>2396</span> * @param {String} module_name module name
<span class='line'>2397</span> * @param {Array} module_name module name list
<span class='line'>2398</span> * @returns {Boolean} 所指定 module 是否全部存在以及良好。
<span class='line'>2399</span> */</span><span class="WHIT">
<span class='line'>2400</span> </span><span class="NAME">is_loaded</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2401</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2402</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module_name.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2403</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">loaded_module</span><span class="PUNC">[</span><span class="NAME">_.to_module_name</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2404</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2405</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2406</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2407</span>
<span class='line'>2408</span> </span><span class="WHIT"> </span><span class="COMM">// var _s = arguments.callee;</span><span class="WHIT">
<span class='line'>2409</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('test ' + _.to_module_name(module_name));</span><span class="WHIT">
<span class='line'>2410</span>
<span class='line'>2411</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>2412</span> var code = loaded_module[_.to_module_name(module_name)], sub_module, prefix;
<span class='line'>2413</span> if (_.is_Function(code) && (sub_module = code.sub_module)) {
<span class='line'>2414</span> sub_module = sub_module.split('|');
<span class='line'>2415</span> prefix = module_name + _.env.module_name_separator;
<span class='line'>2416</span> for ( var i = 0, l = module_name.length; i &lt; l; i++){
<span class='line'>2417</span> _.debug('check [' + prefix + sub_module[i] + ']', 1, 'is_loaded');
<span class='line'>2418</span> if (!_.is_loaded(prefix + sub_module[i]))
<span class='line'>2419</span> return false;
<span class='line'>2420</span> }
<span class='line'>2421</span> return true;
<span class='line'>2422</span> }
<span class='line'>2423</span> */</span><span class="WHIT">
<span class='line'>2424</span>
<span class='line'>2425</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="PUNC">!</span><span class="NAME">loaded_module</span><span class="PUNC">[</span><span class="NAME">_.to_module_name</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2426</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2427</span>
<span class='line'>2428</span>
<span class='line'>2429</span>
<span class='line'>2430</span> </span><span class="COMM">/**
<span class='line'>2431</span> * 設定登記 module 已載入。
<span class='line'>2432</span> * @inner
<span class='line'>2433</span> * @private
<span class='line'>2434</span> */</span><span class="WHIT">
<span class='line'>2435</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">set_loaded</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2436</span> </span><span class="WHIT"> </span><span class="NAME">cache_code</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2437</span> </span><span class="WHIT"> </span><span class="COMM">// _.debug(_.to_module_name(module_name));</span><span class="WHIT">
<span class='line'>2438</span> </span><span class="WHIT"> </span><span class="NAME">loaded_module</span><span class="PUNC">[</span><span class="NAME">_.to_module_name</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.cache_code</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="WHIT">
<span class='line'>2439</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">cache_code</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.cache_code</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2440</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2441</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2442</span>
<span class='line'>2443</span>
<span class='line'>2444</span>
<span class='line'>2445</span>
<span class='line'>2446</span>
<span class='line'>2447</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">get_include_resource</span><span class="PUNC">(</span><span class="NAME">split</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2448</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">document</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">document.getElementsByTagName</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2449</span> </span><span class="WHIT"> </span><span class="COMM">// document!=='object': 誤在非 HTML 環境執行,卻要求 HTML 環境下的 resource</span><span class="WHIT">
<span class='line'>2450</span> </span><span class="WHIT"> </span><span class="COMM">//if(typeof document==='object')_.warn(_.Class + ".include_resource: Can't load [" + path + "]!");</span><span class="WHIT">
<span class='line'>2451</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2452</span>
<span class='line'>2453</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">nodes</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.getElementsByTagName</span><span class="PUNC">(</span><span class="STRN">'script'</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">h</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">hn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">count</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2454</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">split</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2455</span> </span><span class="WHIT"> </span><span class="NAME">h</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2456</span> </span><span class="WHIT"> </span><span class="NAME">script</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2457</span> </span><span class="WHIT"> </span><span class="NAME">css</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2458</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2459</span> </span><span class="WHIT"> </span><span class="NAME">hn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">h.script</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2460</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>2461</span> </span><span class="WHIT"> </span><span class="NAME">hn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">h</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2462</span>
<span class='line'>2463</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">nodes.length</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2464</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2465</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.simplify_path</span><span class="PUNC">(</span><span class="NAME">nodes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2466</span> </span><span class="WHIT"> </span><span class="NAME">hn</span><span class="PUNC">[</span><span class="NAME">p</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">count</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2467</span>
<span class='line'>2468</span> </span><span class="WHIT"> </span><span class="NAME">nodes</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.getElementsByTagName</span><span class="PUNC">(</span><span class="STRN">'link'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2469</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">split</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2470</span> </span><span class="WHIT"> </span><span class="NAME">hn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">l.css</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2471</span>
<span class='line'>2472</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">nodes.length</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2473</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2474</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.simplify_path</span><span class="PUNC">(</span><span class="NAME">nodes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">href</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2475</span> </span><span class="WHIT"> </span><span class="NAME">hn</span><span class="PUNC">[</span><span class="NAME">p</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">count</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2476</span>
<span class='line'>2477</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT"> </span><span class="NAME">h</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">count</span><span class="WHIT"> </span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2478</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2479</span>
<span class='line'>2480</span> </span><span class="COMM">/**
<span class='line'>2481</span> * 已經 include_resource 了哪些 JavaScript 檔(存有其路徑).
<span class='line'>2482</span> * included_path[path] =
<span class='line'>2483</span> * undefined: 尚未載入。
<span class='line'>2484</span> * true 已經載入。
<span class='line'>2485</span> *
<span class='line'>2486</span> * TODO:
<span class='line'>2487</span> * included_path[index] = [time stamp, path],
<span class='line'>2488</span> * @inner
<span class='line'>2489</span> * @ignore
<span class='line'>2490</span> * @type Object
<span class='line'>2491</span> */</span><span class="WHIT">
<span class='line'>2492</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">included_path</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2493</span>
<span class='line'>2494</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">included_path_init</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2495</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">get_include_resource</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2496</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2497</span> </span><span class="WHIT"> </span><span class="NAME">included_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2498</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">included_path</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2499</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2500</span>
<span class='line'>2501</span>
<span class='line'>2502</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2503</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2504</span> </span><span class="NAME">is_included</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2505</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">included_path</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">included_path_init</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NAME">path</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2506</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2507</span>
<span class='line'>2508</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">set_included</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">timeout_id</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2509</span> </span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">included_path</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">included_path_init</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NAME">path</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">timeout_id</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2510</span> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2511</span>
<span class='line'>2512</span> </span><span class="NAME">get_included</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2513</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">included_path</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">included_path_init</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NAME">path</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2514</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2515</span>
<span class='line'>2516</span>
<span class='line'>2517</span>
<span class='line'>2518</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2519</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2520</span> </span><span class="COMM">/**
<span class='line'>2521</span> * include resource of module.
<span class='line'>2522</span> * @example
<span class='line'>2523</span> * // 外部程式使用時,通常用在 include 相對於 library 本身路徑固定的檔案。
<span class='line'>2524</span> * // 例如 file_name 改成相對於 library 本身來說的路徑。
<span class='line'>2525</span> * CeL.include_module_resource('../../game/game.css');
<span class='line'>2526</span> *
<span class='line'>2527</span> * library_namespace.include_module_resource('select_input.css', this);
<span class='line'>2528</span> *
<span class='line'>2529</span> * @param {String} file_name 與 module 位於相同目錄下的 resource file name
<span class='line'>2530</span> * @param {String} [module_name] 呼叫的 module name。未提供則設成 library base path此時 file_name 為相對於 library 本身路徑的檔案。
<span class='line'>2531</span> * @returns
<span class='line'>2532</span> * @since 2010/1/1-2 13:58:09
<span class='line'>2533</span> */</span><span class="WHIT">
<span class='line'>2534</span> </span><span class="NAME">include_module_resource</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">file_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2535</span> </span><span class="WHIT"> </span><span class="COMM">//var m = _.split_module_name.call(_, module_name);</span><span class="WHIT">
<span class='line'>2536</span> </span><span class="WHIT"> </span><span class="COMM">//if (m)m[m.length - 1] = file_name;</span><span class="WHIT">
<span class='line'>2537</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">_.include_resource.call</span><span class="PUNC">(</span><span class="NAME">_</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2538</span> </span><span class="WHIT"> </span><span class="NAME">_.get_module_path</span><span class="PUNC">(</span><span class="NAME">get_module_name</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.Class</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">file_name</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2539</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2540</span>
<span class='line'>2541</span>
<span class='line'>2542</span>
<span class='line'>2543</span> </span><span class="WHIT"> </span><span class="COMM">//----------------------------------------------------------------------------------------------------------------------------------------------------------//</span><span class="WHIT">
<span class='line'>2544</span>
<span class='line'>2545</span>
<span class='line'>2546</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2547</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2548</span> </span><span class="COMM">/**
<span class='line'>2549</span> * Include specified module.&lt;br/>
<span class='line'>2550</span> *
<span class='line'>2551</span> * 會先嘗試以依序載入(asynchronous)的方式取得 module。
<span class='line'>2552</span> * 無法以 Ajax 載入時,若未設定 callback會回傳錯誤。若設定 callback會以同步(synchronous)的方式載入 module於載入完成執行 callback。
<span class='line'>2553</span> * 若因為 browser 安全性設定而無法取得則會回傳 -1表示將以同步的方式載入 module。因為 module 尚未載入,在此階段尚無法判別此 module 所需之 dependency list。此 list 會被作為引數傳入 callback。
<span class='line'>2554</span> *
<span class='line'>2555</span> * 注意:以下的 code 中CeL.warn 不一定會被執行(可能會、可能不會),因為執行時 log 可能尚未被 include。&lt;br/>
<span class='line'>2556</span> * 此時應該改用 CeL.set_run('application.log', callback);&lt;br/>
<span class='line'>2557</span> * code in head/script/:
<span class='line'>2558</span> * &lt;code>
<span class='line'>2559</span> * CeL.use('code.log');
<span class='line'>2560</span> * CeL.warn('WARNING message');
<span class='line'>2561</span> * &lt;/code>
<span class='line'>2562</span> * ** 在指定 callback 時 name_space 無效!
<span class='line'>2563</span> * ** 預設會 extend 到 library 本身之下!
<span class='line'>2564</span> * @param {String} module module name
<span class='line'>2565</span> * @param {Function} [callback] callback function | [callback, 進度改變時之 function (TODO)]
<span class='line'>2566</span> * @param {Object|Boolean} [extend_to] extend to which name-space&lt;br/>
<span class='line'>2567</span> * false: just load, don't extend to library name-space&lt;br/>
<span class='line'>2568</span> * this: extend to global&lt;br/>
<span class='line'>2569</span> * object: extend to specified name-space that you can use [name_space]._func_ to run it&lt;br/>
<span class='line'>2570</span> * (others, including undefined): extend to root of this library. e.g., call CeL._function_name_ and we can get the specified function.
<span class='line'>2571</span> * @returns {Error}
<span class='line'>2572</span> * @returns -1 will execute callback after load, 不代表 load module 了!
<span class='line'>2573</span> * @returns {undefined} no error, OK
<span class='line'>2574</span> * @example
<span class='line'>2575</span> * CeL.use('code.log', function(){..});
<span class='line'>2576</span> * CeL.use(['code.log', 'code.debug']);
<span class='line'>2577</span> * @note
<span class='line'>2578</span> * 'use' 是 JScript.NET 的保留字.
<span class='line'>2579</span> */</span><span class="WHIT">
<span class='line'>2580</span> </span><span class="NAME">use</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">requires</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">force</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2581</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">requires</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module_path</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2582</span>
<span class='line'>2583</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('load [' + module + ']');</span><span class="WHIT">
<span class='line'>2584</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">module</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2585</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2586</span>
<span class='line'>2587</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>2588</span> if (arguments.length > 3) {
<span class='line'>2589</span> l = arguments.length;
<span class='line'>2590</span> name_space = arguments[--l];
<span class='line'>2591</span> callback = arguments[--l];
<span class='line'>2592</span> --l;
<span class='line'>2593</span> for (i = 0; i &lt; l; i++)
<span class='line'>2594</span> _s.call(_, arguments[i], callback, name_space);
<span class='line'>2595</span> return;
<span class='line'>2596</span> }
<span class='line'>2597</span> */</span><span class="WHIT">
<span class='line'>2598</span>
<span class='line'>2599</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2600</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">error</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2601</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2602</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">error</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_s.call</span><span class="PUNC">(</span><span class="NAME">_</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2603</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">error</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2604</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2605</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">(</span><span class="NAME">undefined</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2606</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2607</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2608</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2609</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2610</span>
<span class='line'>2611</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">force</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">_.is_loaded</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2612</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">module_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.get_module_path</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2613</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2614</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2615</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">(</span><span class="NAME">undefined</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2616</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2617</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2618</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2619</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2620</span>
<span class='line'>2621</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('load [' + module + ']:\ntry to load [' + module_path + ']');</span><span class="WHIT">
<span class='line'>2622</span>
<span class='line'>2623</span> </span><span class="WHIT"> </span><span class="COMM">// including code</span><span class="WHIT">
<span class='line'>2624</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2625</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2626</span> </span><span class="WHIT"> </span><span class="COMM">// _.debug('load ['+module_path+']');</span><span class="WHIT">
<span class='line'>2627</span> </span><span class="WHIT"> </span><span class="COMM">// _.debug('load ['+module_path+']:\n'+_.get_file(module_path, _.env.source_encoding));</span><span class="WHIT">
<span class='line'>2628</span> </span><span class="WHIT"> </span><span class="COMM">//WScript.Echo(_.eval);</span><span class="WHIT">
<span class='line'>2629</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.get_file</span><span class="PUNC">(</span><span class="NAME">module_path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">_.env.source_encoding</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2630</span> </span><span class="WHIT"> </span><span class="COMM">// eval @ global. 這邊可能會出現 security 問題。</span><span class="WHIT">
<span class='line'>2631</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: 以其他方法取代 eval 的使用。</span><span class="WHIT">
<span class='line'>2632</span> </span><span class="WHIT"> </span><span class="NAME">_.eval_code</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2633</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>2634</span> </span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="PUNC">(</span><span class="STRN">'Get no result from ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_path</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']! Some error occurred?'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2635</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2636</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2637</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2638</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2639</span>
<span class='line'>2640</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">i</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2641</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">extend_module_member</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2642</span>
<span class='line'>2643</span> </span><span class="WHIT"> </span><span class="COMM">// 依序載入失敗</span><span class="WHIT">
<span class='line'>2644</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">callback</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">window</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2645</span> </span><span class="WHIT"> </span><span class="COMM">// 不能直接用 .get_file(),得採用其他方法的狀況。但只在有 callback 時才 include否則當下 block 的都沒執行,可能出亂子。</span><span class="WHIT">
<span class='line'>2646</span> </span><span class="WHIT"> </span><span class="COMM">// ** 較新之 browser 通常需要使用 callback 的方法,不能使用 "CeL.use('module');_do_some_thing_;"!!</span><span class="WHIT">
<span class='line'>2647</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: 在指定 callback 時使 name_space 依然有效。</span><span class="WHIT">
<span class='line'>2648</span> </span><span class="WHIT"> </span><span class="NAME">_.include_resource</span><span class="PUNC">(</span><span class="NAME">module_path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2649</span> </span><span class="WHIT"> </span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">module</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2650</span> </span><span class="WHIT"> </span><span class="NAME">callback</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2651</span> </span><span class="WHIT"> </span><span class="NAME">extend_module_member</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2652</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2653</span> </span><span class="WHIT"> </span><span class="NAME">start</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Date</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2654</span> </span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">80</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2655</span> </span><span class="WHIT"> </span><span class="NAME">global</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">_</span><span class="WHIT">
<span class='line'>2656</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2657</span> </span><span class="WHIT"> </span><span class="COMM">// 正在 call(循環參照?)則強制 include</span><span class="WHIT">
<span class='line'>2658</span> </span><span class="WHIT"> </span><span class="NAME">module</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">module_require_chain</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2659</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: 一次指定多個 module 時可以知道進度,全部 load 完才 callback()。</span><span class="WHIT">
<span class='line'>2660</span> </span><span class="WHIT"> </span><span class="COMM">// 此時 callback=[callback, 進度改變時之 function]</span><span class="WHIT">
<span class='line'>2661</span> </span><span class="WHIT"> </span><span class="COMM">// return 進度 Object</span><span class="WHIT">
<span class='line'>2662</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2663</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2664</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2665</span>
<span class='line'>2666</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2667</span> </span><span class="WHIT"> </span><span class="COMM">//_.err(e);</span><span class="WHIT">
<span class='line'>2668</span>
<span class='line'>2669</span> </span><span class="WHIT"> </span><span class="COMM">// http://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.html</span><span class="WHIT">
<span class='line'>2670</span> </span><span class="WHIT"> </span><span class="COMM">// http://reference.sitepoint.com/javascript/DOMException</span><span class="WHIT">
<span class='line'>2671</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_type</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'DOMException'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">e.code</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1012</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2672</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">_.is_local</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.is_debug</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2673</span> </span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="PUNC">(</span><span class="NAME">_.Class</span><span class="WHIT">
<span class='line'>2674</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.use:\n'</span><span class="WHIT">
<span class='line'>2675</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">e.message</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\n'</span><span class="WHIT">
<span class='line'>2676</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_path</span><span class="WHIT">
<span class='line'>2677</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\n\n程式可能呼叫了一個'</span><span class="WHIT">
<span class='line'>2678</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_local</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'不存在的,\n或是繞經上層目錄'</span><span class="WHIT">
<span class='line'>2679</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'cross domain'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2680</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'的檔案?\n\n請嘗試使用相對路徑\n或加入 callback: '</span><span class="WHIT">
<span class='line'>2681</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">_.Class</span><span class="WHIT">
<span class='line'>2682</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.use(module, callback function, name_space)'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2683</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_type</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'Error'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e.number</span><span class="WHIT"> </span><span class="PUNC">&</span><span class="WHIT"> </span><span class="NUMB">0xFFFF</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="WHIT">
<span class='line'>2684</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.is_type</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'XPCWrappedNative_NoHelper'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2685</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="STRN">''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">e.message</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">indexOf</span><span class="PUNC">(</span><span class="STRN">'NS_ERROR_FILE_NOT_FOUND'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2686</span> </span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="PUNC">(</span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.use: 檔案可能不存在或存取被拒?\n['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_path</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
<span class='line'>2687</span> </span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.get_error_message</span><span class="WHIT">
<span class='line'>2688</span> </span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="STRN">'&lt;br/>'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">_.get_error_message</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2689</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'\n'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">e.message</span><span class="WHIT">
<span class='line'>2690</span> </span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2691</span> </span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2692</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">_.is_local</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.is_debug</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2693</span> </span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="PUNC">(</span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.use: Cannot load [&lt;a href="'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_path</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'">'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'&lt;/a>]!'</span><span class="WHIT">
<span class='line'>2694</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.get_error_message</span><span class="WHIT">
<span class='line'>2695</span> </span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="STRN">'&lt;br/>'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">_.get_error_message</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'&lt;br/>'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2696</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'\n['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e.constructor</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e.number</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e.number</span><span class="WHIT"> </span><span class="PUNC">&</span><span class="WHIT"> </span><span class="NUMB">0xFFFF</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">e.code</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">': '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">e.message</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\n'</span><span class="WHIT">
<span class='line'>2697</span> </span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2698</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'抱歉!在載入其他網頁時發生錯誤,有些功能可能失常。\n重新讀取(reload),或是過段時間再嘗試或許可以解決問題。'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2699</span> </span><span class="WHIT"> </span><span class="COMM">//_.log('Cannot load [' + module + ']!', _.log.ERROR, e);</span><span class="WHIT">
<span class='line'>2700</span>
<span class='line'>2701</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2702</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2703</span>
<span class='line'>2704</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2705</span>
<span class='line'>2706</span>
<span class='line'>2707</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2708</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2709</span> </span><span class="NAME">is_local</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2710</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">window</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT">
<span class='line'>2711</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">location</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="WHIT">
<span class='line'>2712</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">window.location</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">location</span><span class="WHIT">
<span class='line'>2713</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">location.protocol</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'file:'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2714</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2715</span>
<span class='line'>2716</span> </span><span class="COMM">/*
<span class='line'>2717</span> bad: sometimes doesn't work. e.g. Google Maps API in IE
<span class='line'>2718</span> push inside window.onload:
<span class='line'>2719</span> window.onload=function(){
<span class='line'>2720</span> include_resource(p);
<span class='line'>2721</span> setTimeout('init();',2000);
<span class='line'>2722</span> };
<span class='line'>2723</span>
<span class='line'>2724</span> way 3: ref. dojo.provide();, dojo.require();
<span class='line'>2725</span> document.write('&lt;script type="text/javascript" src="'+encodeURI(p)+'">&lt;\/script>');
<span class='line'>2726</span>
<span class='line'>2727</span> TODO:
<span class='line'>2728</span> encode
<span class='line'>2729</span>
<span class='line'>2730</span> */</span><span class="WHIT">
<span class='line'>2731</span> </span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2732</span>
<span class='line'>2733</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2734</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2735</span> </span><span class="COMM">/**
<span class='line'>2736</span> * Including other JavaScript/CSS files synchronously.
<span class='line'>2737</span> *
<span class='line'>2738</span> * TODO:
<span class='line'>2739</span> * timeout for giving up
<span class='line'>2740</span> * use document.createElementNS()
<span class='line'>2741</span> * http://headjs.com/#theory
<span class='line'>2742</span> *
<span class='line'>2743</span> * @param {String} resource path
<span class='line'>2744</span> * @param {Function|Object} callback
<span class='line'>2745</span> * use_write ? test function{return } : callback function(path)
<span class='line'>2746</span> * / {callback: callback function(path, module), module: module name, global: global object when run callback}
<span class='line'>2747</span> * @param {Boolean} [use_write] use document.write() instead of insert a element to &lt;head>
<span class='line'>2748</span> * @param {Number} [type] 1: is a .css file, others: script
<span class='line'>2749</span> */</span><span class="WHIT">
<span class='line'>2750</span> </span><span class="NAME">include_resource</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">include_resource</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">force</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">use_write</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2751</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.include_resource</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">t</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">h</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2752</span>
<span class='line'>2753</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2754</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">t</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">t</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2755</span> </span><span class="WHIT"> </span><span class="NAME">_s</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">[</span><span class="NAME">s</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">use_write</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2756</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2757</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2758</span>
<span class='line'>2759</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">force</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">arguments.length</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">3</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2760</span> </span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">force.timeout</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2761</span> </span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">force.type</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2762</span> </span><span class="WHIT"> </span><span class="NAME">use_write</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">force.use_write</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2763</span> </span><span class="WHIT"> </span><span class="NAME">force</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">force.force</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2764</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2765</span>
<span class='line'>2766</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">force</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">_.is_included</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2767</span> </span><span class="WHIT"> </span><span class="COMM">// 已經載入完成</span><span class="WHIT">
<span class='line'>2768</span> </span><span class="WHIT"> </span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">_s.wait_to_call</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2769</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2770</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2771</span> </span><span class="WHIT"> </span><span class="NAME">set_included</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2772</span>
<span class='line'>2773</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('Including [' + path + '].', 1, 'include_resource');</span><span class="WHIT">
<span class='line'>2774</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2775</span> </span><span class="WHIT"> </span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="REGX">/\.css$/i</span><span class="PUNC">.</span><span class="NAME">test</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2776</span>
<span class='line'>2777</span> </span><span class="WHIT"> </span><span class="NAME">t</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'text/'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'css'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'javascript'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2778</span> </span><span class="COMM">/*@cc_on
<span class='line'>2779</span> //use_write=1; // old old IE hack
<span class='line'>2780</span> @*/</span><span class="WHIT">
<span class='line'>2781</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">use_write</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2782</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2783</span> </span><span class="WHIT"> </span><span class="COMM">// Dynamic Loading / lazy loading</span><span class="WHIT">
<span class='line'>2784</span> </span><span class="WHIT"> </span><span class="COMM">// http://code.google.com/apis/ajax/documentation/#Dynamic</span><span class="WHIT">
<span class='line'>2785</span> </span><span class="WHIT"> </span><span class="COMM">// http://en.wikipedia.org/wiki/Futures_and_promises</span><span class="WHIT">
<span class='line'>2786</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.createElement</span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'link'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'script'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2787</span> </span><span class="WHIT"> </span><span class="NAME">s.type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">t</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2788</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2789</span> </span><span class="WHIT"> </span><span class="NAME">s.href</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2790</span> </span><span class="WHIT"> </span><span class="COMM">// s.media = 'all',//'print'</span><span class="WHIT">
<span class='line'>2791</span> </span><span class="WHIT"> </span><span class="NAME">s.rel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'stylesheet'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2792</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>2793</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: see jquery-1.4a2.js: globalEval</span><span class="WHIT">
<span class='line'>2794</span> </span><span class="WHIT"> </span><span class="COMM">// if (is_code) s.text = path;</span><span class="WHIT">
<span class='line'>2795</span> </span><span class="WHIT"> </span><span class="COMM">//s.setAttribute('src', path);</span><span class="WHIT">
<span class='line'>2796</span> </span><span class="WHIT"> </span><span class="NAME">s.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>2797</span> </span><span class="WHIT"> </span><span class="NAME">s.async</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2798</span>
<span class='line'>2799</span> </span><span class="WHIT"> </span><span class="NAME">s.width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">s.height</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2800</span>
<span class='line'>2801</span> </span><span class="WHIT"> </span><span class="COMM">// http://wiki.forum.nokia.com/index.php/JavaScript_Performance_Best_Practices</span><span class="WHIT">
<span class='line'>2802</span> </span><span class="WHIT"> </span><span class="COMM">// ** onload 在 local 好像無效</span><span class="WHIT">
<span class='line'>2803</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">done</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2804</span> </span><span class="WHIT"> </span><span class="NAME">s.onload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">s.onreadstatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2805</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2806</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('Loading [' + path + '] .. ' + this.readyState);</span><span class="WHIT">
<span class='line'>2807</span> </span><span class="WHIT"> </span><span class="COMM">// navigator.platform === 'PLAYSTATION 3' 時僅用 'complete'? from requireJS</span><span class="WHIT">
<span class='line'>2808</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">done</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.readyState</span><span class="WHIT"> </span><span class="COMM">/* 'readyState' in this ? this.readyState : e.type !== 'load' */</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'loaded'</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'complete'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2809</span> </span><span class="WHIT"> </span><span class="NAME">done</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2810</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('[' + (this.src || s.href) + '] loaded.');</span><span class="WHIT">
<span class='line'>2811</span>
<span class='line'>2812</span> </span><span class="WHIT"> </span><span class="COMM">//this.onload = this.onreadystatechange = null;</span><span class="WHIT">
<span class='line'>2813</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2814</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">this.onload</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2815</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2816</span> </span><span class="WHIT"> </span><span class="COMM">// error on IE57: Error: Object doesn't support this action</span><span class="WHIT">
<span class='line'>2817</span> </span><span class="WHIT"> </span><span class="NAME">this.onload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2818</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2819</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2820</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">this.onreadystatechange</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2821</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2822</span> </span><span class="WHIT"> </span><span class="COMM">// error on IE57: Error: Object doesn't support this action</span><span class="WHIT">
<span class='line'>2823</span> </span><span class="WHIT"> </span><span class="NAME">this.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2824</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2825</span>
<span class='line'>2826</span> </span><span class="WHIT"> </span><span class="COMM">// callback 完自動移除 .js。隨即移除會無效。 .css 移除會失效。</span><span class="WHIT">
<span class='line'>2827</span> </span><span class="WHIT"> </span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2828</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2829</span> </span><span class="WHIT"> </span><span class="NAME">h.removeChild</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2830</span> </span><span class="WHIT"> </span><span class="NAME">h</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2831</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2832</span>
<span class='line'>2833</span> </span><span class="WHIT"> </span><span class="COMM">// css 無 timeout 功能。</span><span class="WHIT">
<span class='line'>2834</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tid</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">get_included</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2835</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">tid</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2836</span> </span><span class="WHIT"> </span><span class="NAME">clearTimeout</span><span class="PUNC">(</span><span class="NAME">tid</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2837</span> </span><span class="WHIT"> </span><span class="NAME">set_included</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2838</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2839</span>
<span class='line'>2840</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2841</span> </span><span class="WHIT"> </span><span class="NAME">_s.wait_to_call</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2842</span>
<span class='line'>2843</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2844</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2845</span>
<span class='line'>2846</span> </span><span class="WHIT"> </span><span class="COMM">// HTML5: document.head === document.getElementsByTagName('head')[0]</span><span class="WHIT">
<span class='line'>2847</span> </span><span class="WHIT"> </span><span class="NAME">h</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.head</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">document.getElementsByTagName</span><span class="PUNC">(</span><span class="STRN">'head'</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT">
<span class='line'>2848</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">document.body.parentNode</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">document.body</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">appendChild</span><span class="PUNC">(</span><span class="NAME">document.createElement</span><span class="PUNC">(</span><span class="STRN">'head'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2849</span>
<span class='line'>2850</span> </span><span class="WHIT"> </span><span class="NAME">h.appendChild</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2851</span> </span><span class="WHIT"> </span><span class="COMM">//h.parentNode.insertBefore(s, h);</span><span class="WHIT">
<span class='line'>2852</span>
<span class='line'>2853</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('HTML:\n' + document.getElementsByTagName('html')[0].innerHTML);</span><span class="WHIT">
<span class='line'>2854</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>2855</span> * from jquery-1.4a2.js:
<span class='line'>2856</span> * Use insertBefore instead of appendChild to circumvent an IE6 bug
<span class='line'>2857</span> * when using globalEval and a base node is found.
<span class='line'>2858</span> * This arises when a base node is used (#2709).
<span class='line'>2859</span> * @see
<span class='line'>2860</span> * http://github.com/jquery/jquery/commit/d44c5025c42645a6e2b6e664b689669c3752b236
<span class='line'>2861</span> * 不過這會有問題: 後加的 CSS file 優先權會比較高。因此,可以的話還是用 appendChild。
<span class='line'>2862</span> */</span><span class="WHIT">
<span class='line'>2863</span> </span><span class="WHIT"> </span><span class="COMM">//h.insertBefore(s, h.firstChild);</span><span class="WHIT">
<span class='line'>2864</span>
<span class='line'>2865</span> </span><span class="WHIT"> </span><span class="COMM">// css 無 timeout 功能。</span><span class="WHIT">
<span class='line'>2866</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2867</span> </span><span class="WHIT"> </span><span class="NAME">set_included</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2868</span> </span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="PUNC">(</span><span class="STRN">'include_resource: Loading failed (timeout '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">' ms): ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2869</span> </span><span class="WHIT"> </span><span class="COMM">// 自動移除 .js。</span><span class="WHIT">
<span class='line'>2870</span> </span><span class="WHIT"> </span><span class="NAME">h.removeChild</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2871</span> </span><span class="WHIT"> </span><span class="NAME">h</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2872</span>
<span class='line'>2873</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2874</span> </span><span class="WHIT"> </span><span class="NAME">_s.wait_to_call</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2875</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">timeout</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.is_local</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NUMB">2000</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">8000</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2876</span>
<span class='line'>2877</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2878</span>
<span class='line'>2879</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2880</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2881</span>
<span class='line'>2882</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('Writing code for [' + path + '].');</span><span class="WHIT">
<span class='line'>2883</span> </span><span class="WHIT"> </span><span class="COMM">// 直接寫入,若非正在 load 頁面時使用會出問題!</span><span class="WHIT">
<span class='line'>2884</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">use_write</span><span class="WHIT">
<span class='line'>2885</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">use_write</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="WHIT"> </span><span class="COMM">// && TODO: 正在 load 頁面</span><span class="WHIT">
<span class='line'>2886</span> </span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2887</span> </span><span class="WHIT"> </span><span class="NAME">document.write</span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>2888</span> </span><span class="WHIT"> </span><span class="STRN">'&lt;link type="'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">t</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'" rel="stylesheet" href="'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'">&lt;\/link>'</span><span class="WHIT">
<span class='line'>2889</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'&lt;script type="'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">t</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'" src="'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">path</span><span class="WHIT">
<span class='line'>2890</span> </span><span class="WHIT"> </span><span class="COMM">// language="JScript"</span><span class="WHIT">
<span class='line'>2891</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'">&lt;\/script>'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2892</span>
<span class='line'>2893</span> </span><span class="WHIT"> </span><span class="COMM">// 若是到這邊還沒 load會造成問題。</span><span class="WHIT">
<span class='line'>2894</span> </span><span class="WHIT"> </span><span class="COMM">//set_included(path);</span><span class="WHIT">
<span class='line'>2895</span>
<span class='line'>2896</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2897</span> </span><span class="WHIT"> </span><span class="NAME">_s.wait_to_call</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2898</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2899</span>
<span class='line'>2900</span>
<span class='line'>2901</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>2902</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>2903</span> </span><span class="COMM">/**
<span class='line'>2904</span> * 準備 callback
<span class='line'>2905</span> * @inner
<span class='line'>2906</span> * @private
<span class='line'>2907</span> * @ignore
<span class='line'>2908</span> */</span><span class="WHIT">
<span class='line'>2909</span> </span><span class="NAME">include_resource.wait_to_call</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">failed</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2910</span> </span><span class="WHIT"> </span><span class="COMM">//alert('include_resource.wait_to_call:\n' + _.to_module_name(callback.module));</span><span class="WHIT">
<span class='line'>2911</span>
<span class='line'>2912</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2913</span> </span><span class="WHIT"> </span><span class="COMM">// 不是 module僅僅為指定 function 的話,直接等一下再看看。</span><span class="WHIT">
<span class='line'>2914</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: 等太久時 error handle</span><span class="WHIT">
<span class='line'>2915</span> </span><span class="WHIT"> </span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2916</span> </span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">failed</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2917</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">200</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2918</span>
<span class='line'>2919</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">callback.global</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2920</span> </span><span class="WHIT"> </span><span class="COMM">// 是 module。</span><span class="WHIT">
<span class='line'>2921</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">callback.global.is_loaded</span><span class="PUNC">(</span><span class="NAME">callback.module</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2922</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Date</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">callback.start</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">callback.timeout</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2923</span> </span><span class="WHIT"> </span><span class="COMM">// 依 callback 的類型處理 callback</span><span class="WHIT">
<span class='line'>2924</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">callback.callback</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2925</span> </span><span class="WHIT"> </span><span class="COMM">// 直接執行</span><span class="WHIT">
<span class='line'>2926</span> </span><span class="WHIT"> </span><span class="NAME">callback.callback</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback.module</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">failed</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2927</span>
<span class='line'>2928</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">callback.callback</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>2929</span> </span><span class="WHIT"> </span><span class="COMM">// load 另一個 module</span><span class="WHIT">
<span class='line'>2930</span> </span><span class="WHIT"> </span><span class="NAME">_.use</span><span class="PUNC">(</span><span class="NAME">callback.callback</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2931</span> </span><span class="WHIT"> </span><span class="COMM">// TODO</span><span class="WHIT">
<span class='line'>2932</span> </span><span class="WHIT"> </span><span class="COMM">// else..</span><span class="WHIT">
<span class='line'>2933</span>
<span class='line'>2934</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2935</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>2936</span> * 還沒載入完成,所以再等一下。 the function it self, not 'this'.
<span class='line'>2937</span> * @inner
<span class='line'>2938</span> * @ignore
<span class='line'>2939</span> */</span><span class="WHIT">
<span class='line'>2940</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.include_resource.wait_to_call</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">_t</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">_a</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">arguments</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2941</span> </span><span class="WHIT"> </span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>2942</span> </span><span class="WHIT"> </span><span class="NAME">_s.apply</span><span class="PUNC">(</span><span class="NAME">_t</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">_a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2943</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">50</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2944</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>2945</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>2946</span>
<span class='line'>2947</span> </span><span class="COMM">//if (_.is_Function(include_resource))</span><span class="WHIT">
<span class='line'>2948</span> </span><span class="COMM">// _.extend(null, include_resource, _.include_resource);</span><span class="WHIT">
<span class='line'>2949</span>
<span class='line'>2950</span>
<span class='line'>2951</span>
<span class='line'>2952</span> </span><span class="COMM">/*
<span class='line'>2953</span>
<span class='line'>2954</span> CeL.set_run(running sequence: [commands]|[required sequence])
<span class='line'>2955</span> [commands]/動作串
<span class='line'>2956</span> [],
<span class='line'>2957</span> function_to_run
<span class='line'>2958</span> [optional] {object} function_to_run.config
<span class='line'>2959</span> 執行次序:
<span class='line'>2960</span> [optional: run_first, on load required] function_to_run.run_first = function(is prepared?): [bool] time (ms) to re-check
<span class='line'>2961</span> [optional] function_to_run.require = [require sequence]
<span class='line'>2962</span> [optional: prepared, before trigger] function_to_run.before_load = function()
<span class='line'>2963</span> [optional] waiting for function_to_run.trigger =
<span class='line'>2964</span> 觸發時機/trigger action time
<span class='line'>2965</span> [string] action name | number = 0
<span class='line'>2966</span> onload: 'load' (default), {number} timeout (ms)
<span class='line'>2967</span> function_to_run.send_argument = (default: auto detect)
<span class='line'>2968</span> function_to_run = function() event handler
<span class='line'>2969</span> TODO: after_load
<span class='line'>2970</span>
<span class='line'>2971</span> [required sequence]/前置條件/先備條件/prerequisite/necessary
<span class='line'>2972</span> {string} library module name to import, {string} file path(image/JavaScript files/CSS), {number} timeout (ms)
<span class='line'>2973</span>
<span class='line'>2974</span> .charAt(0)==='.' || .charAt(0)==='/' || .indexOf(':')!==-1
<span class='line'>2975</span> //|| .indexOf('%')!==-1
<span class='line'>2976</span> || /\.(js|css)$/i →URL
<span class='line'>2977</span>
<span class='line'>2978</span> i=env.identifier_RegExp.source;
<span class='line'>2979</span> env.module_identifier_RegExp=new RegExp('^'+i+'(\\.'+i+')*$'); →module
<span class='line'>2980</span>
<span class='line'>2981</span> else→URL
<span class='line'>2982</span>
<span class='line'>2983</span> ∴'path1.sub1.sub2'→'./path1.sub1.sub2'
<span class='line'>2984</span>
<span class='line'>2985</span>
<span class='line'>2986</span>
<span class='line'>2987</span> CeL.set_run.error=function(message){
<span class='line'>2988</span> ;
<span class='line'>2989</span> };
<span class='line'>2990</span> CeL.set_run.load={resource:status};
<span class='line'>2991</span>
<span class='line'>2992</span> CeL.use('module_name');
<span class='line'>2993</span> CeL.load('resource path');
<span class='line'>2994</span>
<span class='line'>2995</span>
<span class='line'>2996</span> 2011/6/22 17:43:50,2011/7/31 00:11:52
<span class='line'>2997</span>
<span class='line'>2998</span>
<span class='line'>2999</span>
<span class='line'>3000</span>
<span class='line'>3001</span>
<span class='line'>3002</span>
<span class='line'>3003</span>
<span class='line'>3004</span> .set_run(running sequence)
<span class='line'>3005</span>
<span class='line'>3006</span>
<span class='line'>3007</span> // 同步 loading set: 可同時 load 的 {String|Function} module/path/function
<span class='line'>3008</span> synchronous_group = {
<span class='line'>3009</span> //check: {Function},
<span class='line'>3010</span>
<span class='line'>3011</span> // .to_run 會先執行,而後 delete
<span class='line'>3012</span> to_run[]: [{Function} function],
<span class='line'>3013</span> // to load
<span class='line'>3014</span> to_load_path{}: [{String} path],
<span class='line'>3015</span> // 有幾個 resources 需要 load
<span class='line'>3016</span> path_count: integer count of to_load_path,
<span class='line'>3017</span> to_load_module{}: [{String} module],
<span class='line'>3018</span> module_count: integer count of to_load_module,
<span class='line'>3019</span>
<span class='line'>3020</span> // 可能闕如: 下一組
<span class='line'>3021</span> next_group: next synchronous_group{},
<span class='line'>3022</span>
<span class='line'>3023</span> // 可能闕如: timeout 用
<span class='line'>3024</span> start_time: integer,
<span class='line'>3025</span> // 已設定之 timeout (ms)
<span class='line'>3026</span> timeout: integer,
<span class='line'>3027</span>
<span class='line'>3028</span> // 可能闕如: 臨時新增用,是為了預防有 call C但 dependency 為 A→B→C 的情況。重複使用 queue 但不檢查 require 可能造成 B 與 C 被放在同一 synchronous_group。
<span class='line'>3029</span> require: {}
<span class='line'>3030</span> };
<span class='line'>3031</span>
<span class='line'>3032</span>
<span class='line'>3033</span>
<span class='line'>3034</span>
<span class='line'>3035</span> 臨時/後續/後來新增:
<span class='line'>3036</span>
<span class='line'>3037</span> 原先 C,E]
<span class='line'>3038</span> 發現B→C [B,E]→[C]
<span class='line'>3039</span> 發現D→E [B,D]→[E]→[C]
<span class='line'>3040</span> 發現A→B [A,D]→[B]→[E]→[C]
<span class='line'>3041</span>
<span class='line'>3042</span> 2011/8/8 00:07:06
<span class='line'>3043</span>
<span class='line'>3044</span>
<span class='line'>3045</span>
<span class='line'>3046</span> */</span><span class="WHIT">
<span class='line'>3047</span>
<span class='line'>3048</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>3049</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>3050</span> </span><span class="COMM">/**
<span class='line'>3051</span> * control/setup source codes to run.
<span class='line'>3052</span> * 基本上使用同步(synchronous)的方式,除非所需資源已經載入,或是有辦法以 {@link XMLHttpRequest} 取得資源。
<span class='line'>3053</span> *
<span class='line'>3054</span> * @example
<span class='line'>3055</span> * sr = CeL.set_run;
<span class='line'>3056</span> * sr('module_name', function(){
<span class='line'>3057</span> * // ...
<span class='line'>3058</span> * });
<span class='line'>3059</span> *
<span class='line'>3060</span> * TODO:
<span class='line'>3061</span> * sr('module_name', function(){
<span class='line'>3062</span> * CeL.import('module_name', {module_function_1:0});
<span class='line'>3063</span> *
<span class='line'>3064</span> * CeL.module_function_1('11') === module_function_1('11');
<span class='line'>3065</span> *
<span class='line'>3066</span> * var instance=new CeL.module_name.module_class_1;
<span class='line'>3067</span> * instance.print(112);
<span class='line'>3068</span> * });
<span class='line'>3069</span> *
<span class='line'>3070</span> *
<span class='line'>3071</span> * @param running sequence: list of
<span class='line'>3072</span> * {Function} function to run/欲執行之 function → change .to_run
<span class='line'>3073</span> * | {Integer} timeout (ms): 僅能保證上次 function 執行至此次 function 一定會等超過這段時間 → change .start_time, .timeout
<span class='line'>3074</span> * | {String} library module name to import → change .to_load_module, .module_count
<span class='line'>3075</span> * | {String} URL/file path (image/JavaScript files/CSS) → change .to_load_path, .path_count
<span class='line'>3076</span> * | {Array} 另一組同時 loading set: [{String|Function|Integer}, ..] → 拆開全部當作同時 loading
<span class='line'>3077</span> * | TODO: {Object} loading with additional config
<span class='line'>3078</span> *
<span class='line'>3079</span> * @since 2011/8/4 22:31:47
<span class='line'>3080</span> */</span><span class="WHIT">
<span class='line'>3081</span> </span><span class="NAME">set_run</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3082</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('process ' + arguments.length + ' items.', 2, '.set_run');</span><span class="WHIT">
<span class='line'>3083</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">arguments.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3084</span> </span><span class="WHIT"> </span><span class="COMM">//Array.prototype.slice.call(arguments)</span><span class="WHIT">
<span class='line'>3085</span> </span><span class="WHIT"> </span><span class="NAME">check_run</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3086</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3087</span>
<span class='line'>3088</span>
<span class='line'>3089</span> </span><span class="COMM">/**
<span class='line'>3090</span> * main process.
<span class='line'>3091</span> *
<span class='line'>3092</span> * @param {Arguments} work_queue
<span class='line'>3093</span> * sequence of set_run.arguments. 不修改 work_queue===set_run.arguments直接以 work_queue_index 為開始值。
<span class='line'>3094</span> * @param {Integer} work_queue_index
<span class='line'>3095</span> * index of work queue
<span class='line'>3096</span> * @param {Object}
<span class='line'>3097</span> * [synchronous_group] 正在 running 的 set.
<span class='line'>3098</span> *
<span class='line'>3099</span> * @since 2011/8/4 22:31:47
<span class='line'>3100</span> * 2011/8/8 23:27:15, 2011/8/11 18:29:51 rewrite
<span class='line'>3101</span> */</span><span class="WHIT">
<span class='line'>3102</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">check_run</span><span class="PUNC">(</span><span class="NAME">work_queue</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">work_queue_index</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">synchronous_group</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3103</span>
<span class='line'>3104</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">work_queue_length</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">work_queue.length</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">work_set</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3105</span> </span><span class="WHIT"> </span><span class="COMM">// 沒有累積的 synchronous_group 時,才繼續處理指定的工作。否則先處理之。</span><span class="WHIT">
<span class='line'>3106</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">synchronous_group</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3107</span>
<span class='line'>3108</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">work_set</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">work_queue</span><span class="PUNC">[</span><span class="NAME">work_queue_index</span><span class="PUNC">++</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3109</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">work_queue_index</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">work_queue_length</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3110</span> </span><span class="WHIT"> </span><span class="NAME">_.debug</span><span class="PUNC">(</span><span class="STRN">'處理完畢: ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">work_queue_length</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">Array.prototype.slice.call</span><span class="PUNC">(</span><span class="NAME">work_queue</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'check_run'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3111</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3112</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3113</span>
<span class='line'>3114</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">to_run</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">to_load_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">path_count</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">to_load_module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module_count</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3115</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3116</span> * 增加項目至當前的 synchronous_group.
<span class='line'>3117</span> */</span><span class="WHIT">
<span class='line'>3118</span> </span><span class="WHIT"> </span><span class="NAME">add_item</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3119</span> </span><span class="WHIT"> </span><span class="COMM">// TODO</span><span class="WHIT">
<span class='line'>3120</span> </span><span class="WHIT"> </span><span class="COMM">// {Object} loading with additional config</span><span class="WHIT">
<span class='line'>3121</span>
<span class='line'>3122</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3123</span> </span><span class="WHIT"> </span><span class="COMM">// {Array} 另一組同時 loading set: [{String|Function|Integer}, ..] →</span><span class="WHIT">
<span class='line'>3124</span> </span><span class="WHIT"> </span><span class="COMM">// 拆開全部當作同時 loading</span><span class="WHIT">
<span class='line'>3125</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">item</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3126</span> </span><span class="WHIT"> </span><span class="NAME">add_item</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3127</span>
<span class='line'>3128</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3129</span> </span><span class="WHIT"> </span><span class="COMM">// {Function} function to run → to_run</span><span class="WHIT">
<span class='line'>3130</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">item.require</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3131</span> </span><span class="WHIT"> </span><span class="COMM">// TODO</span><span class="WHIT">
<span class='line'>3132</span> </span><span class="WHIT"> </span><span class="COMM">// check if the function require something first.</span><span class="WHIT">
<span class='line'>3133</span> </span><span class="WHIT"> </span><span class="NAME">to_run.push</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3134</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>3135</span> </span><span class="WHIT"> </span><span class="NAME">to_run.push</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3136</span>
<span class='line'>3137</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">item</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3138</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.request_item_maybe_module</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3139</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: 若是已 cached 則跳過。</span><span class="WHIT">
<span class='line'>3140</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('treat resource [' + item + '] as module ' + module_count, 2, 'check_run');</span><span class="WHIT">
<span class='line'>3141</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">item</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">to_load_module</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">_.is_loaded</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3142</span> </span><span class="WHIT"> </span><span class="NAME">to_load_module</span><span class="PUNC">[</span><span class="NAME">item</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module_count</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3143</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">item</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">to_load_path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">_.is_included</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3144</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('treat resource [' + item + '] as URL ' + path_count, 2, 'check_run');</span><span class="WHIT">
<span class='line'>3145</span> </span><span class="WHIT"> </span><span class="NAME">to_load_path</span><span class="PUNC">[</span><span class="NAME">item</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">path_count</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3146</span>
<span class='line'>3147</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">item</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3148</span> </span><span class="WHIT"> </span><span class="COMM">// {Integer} timeout</span><span class="WHIT">
<span class='line'>3149</span> </span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">item</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3150</span>
<span class='line'>3151</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3152</span> </span><span class="WHIT"> </span><span class="COMM">// 其他都將被忽略!</span><span class="WHIT">
<span class='line'>3153</span> </span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="PUNC">(</span><span class="STRN">'check_run: Unknown item: ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">item</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3154</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3155</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3156</span>
<span class='line'>3157</span> </span><span class="WHIT"> </span><span class="COMM">// add item to synchronous_group</span><span class="WHIT">
<span class='line'>3158</span> </span><span class="WHIT"> </span><span class="NAME">add_item</span><span class="PUNC">(</span><span class="NAME">work_set</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3159</span>
<span class='line'>3160</span> </span><span class="WHIT"> </span><span class="COMM">// 初始化 initialization synchronous_group</span><span class="WHIT">
<span class='line'>3161</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3162</span>
<span class='line'>3163</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">timeout</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3164</span> </span><span class="WHIT"> </span><span class="COMM">// 設定好時間</span><span class="WHIT">
<span class='line'>3165</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.start_time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Date</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3166</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.timeout</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3167</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">to_run.length</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3168</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_run</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">to_run</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3169</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">path_count</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3170</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.path_count</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">path_count</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3171</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_load_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">to_load_path</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3172</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">module_count</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3173</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.module_count</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module_count</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3174</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_load_module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">to_load_module</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3175</span>
<span class='line'>3176</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug(module_count + '個同步載入 resource 設定完畢。', 2, 'check_run');</span><span class="WHIT">
<span class='line'>3177</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3178</span>
<span class='line'>3179</span>
<span class='line'>3180</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('開始處理當前的 synchronous_group, work_queue ' + work_queue_index + '/' + work_queue_length, 2, 'check_run');</span><span class="WHIT">
<span class='line'>3181</span>
<span class='line'>3182</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">index</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3183</span>
<span class='line'>3184</span> </span><span class="COMM">/*
<span class='line'>3185</span>
<span class='line'>3186</span> 臨時/後續/後來新增:
<span class='line'>3187</span> 如果 check 發現 _path_ dependencies 尚未 load則把 dependencies 加入 to_load_path|to_load_module去除 (to_load_path|to_load_module)[_path_]
<span class='line'>3188</span> 新增一 synchronous_group next_group.(to_load_path|to_load_module) = _path_ 並設置 synchronous_group.require{} = dependencies
<span class='line'>3189</span>
<span class='line'>3190</span> 原先 C,E]
<span class='line'>3191</span> 發現B→C [B,E]→[C]
<span class='line'>3192</span> 發現D→E [B,D]→[E]→[C]
<span class='line'>3193</span> 發現A→B [A,D]→[B]→[E]→[C]
<span class='line'>3194</span>
<span class='line'>3195</span> */</span><span class="WHIT">
<span class='line'>3196</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3197</span> * 臨時/後續新增項目至當前的 synchronous_group.
<span class='line'>3198</span> * callback 用.
<span class='line'>3199</span> */</span><span class="WHIT">
<span class='line'>3200</span> </span><span class="WHIT"> </span><span class="NAME">afterwards_add</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">item_is_path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3201</span>
<span class='line'>3202</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT">
<span class='line'>3203</span> </span><span class="WHIT"> </span><span class="NAME">require</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>3204</span> </span><span class="WHIT"> </span><span class="NAME">_.parse_require</span><span class="PUNC">(</span><span class="NAME">item.require</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">item.require_separator</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
<span class='line'>3205</span> </span><span class="WHIT"> </span><span class="COMM">/** module */</span><span class="WHIT">
<span class='line'>3206</span> </span><span class="WHIT"> </span><span class="NAME">module_require_chain</span><span class="PUNC">[</span><span class="NAME">item</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3207</span>
<span class='line'>3208</span> </span><span class="WHIT"> </span><span class="NAME">to_load_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">require.URL_to_load</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3209</span> </span><span class="WHIT"> </span><span class="NAME">to_load_module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">require.module_to_load</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3210</span>
<span class='line'>3211</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">to_load_path</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">to_load_module</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3212</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3213</span>
<span class='line'>3214</span>
<span class='line'>3215</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">changed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3216</span>
<span class='line'>3217</span> </span><span class="WHIT"> </span><span class="COMM">// 把 dependencies: URL 加入 synchronous_group</span><span class="WHIT">
<span class='line'>3218</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">to_load_path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3219</span> </span><span class="WHIT"> </span><span class="COMM">// synchronous_group 可能並沒有 .path_count</span><span class="WHIT">
<span class='line'>3220</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">synchronous_group.path_count</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3221</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_load_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3222</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.path_count</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3223</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>3224</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_load_path</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3225</span>
<span class='line'>3226</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">to_load_path</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3227</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">to_load_path</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3228</span> </span><span class="WHIT"> </span><span class="NAME">_.debug</span><span class="PUNC">(</span><span class="STRN">'URL load dependency: ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']→['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">item</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'check_run.afterwards_add'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3229</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3230</span> </span><span class="WHIT"> </span><span class="COMM">// 假如是同一批的 M1, M2 都需要 P0則跑到 M2 時 P0 不需要設定第二次,但需要把 M2 移到下一批次。</span><span class="WHIT">
<span class='line'>3231</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.next_group</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">item</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">n.to_load_path</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3232</span> </span><span class="WHIT"> </span><span class="NAME">n.to_load_path</span><span class="PUNC">[</span><span class="NAME">item</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3233</span> </span><span class="WHIT"> </span><span class="NAME">n.path_count</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3234</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3235</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_debug</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.is_debug</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3236</span> </span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="PUNC">(</span><span class="STRN">'check_run.afterwards_add: 無法把 URL ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">item</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] 移到下一批次: 下一批次'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'不存在'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'已有此 URL'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3237</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3238</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>3239</span> </span><span class="WHIT"> </span><span class="COMM">// 因為是指向 Object因此不需要再設定 synchronous_group.to_load_path。為防節外生枝直接改 .path_count不 cache。</span><span class="WHIT">
<span class='line'>3240</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">synchronous_group.path_count</span><span class="PUNC">++</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">changed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">load_URL</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3241</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3242</span>
<span class='line'>3243</span> </span><span class="WHIT"> </span><span class="COMM">//show_set('after afterwards_add URL dependency changed');</span><span class="WHIT">
<span class='line'>3244</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3245</span>
<span class='line'>3246</span> </span><span class="WHIT"> </span><span class="COMM">// 把 dependencies: module 加入 synchronous_group</span><span class="WHIT">
<span class='line'>3247</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">to_load_module</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3248</span> </span><span class="WHIT"> </span><span class="COMM">// synchronous_group 可能並沒有 .module_count</span><span class="WHIT">
<span class='line'>3249</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">synchronous_group.module_count</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3250</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_load_module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3251</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.module_count</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3252</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>3253</span> </span><span class="WHIT"> </span><span class="COMM">// s: 當前欲載入之 module</span><span class="WHIT">
<span class='line'>3254</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_load_module</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3255</span>
<span class='line'>3256</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">to_load_module</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3257</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">to_load_module</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3258</span> </span><span class="WHIT"> </span><span class="NAME">_.debug</span><span class="PUNC">(</span><span class="STRN">'module load dependency: ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']→['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">item</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'check_run.afterwards_add'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3259</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3260</span> </span><span class="WHIT"> </span><span class="COMM">// 假如是同一批的 M1, M2 都需要 M0則跑到 M2 時 M0 不需要設定第二次,但需要把 M2 移到下一批次。</span><span class="WHIT">
<span class='line'>3261</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.next_group</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">item</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">n.to_load_module</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3262</span> </span><span class="WHIT"> </span><span class="NAME">n.to_load_module</span><span class="PUNC">[</span><span class="NAME">item</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3263</span> </span><span class="WHIT"> </span><span class="NAME">n.module_count</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3264</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3265</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_debug</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.is_debug</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3266</span> </span><span class="WHIT"> </span><span class="NAME">_.warn</span><span class="PUNC">(</span><span class="STRN">'check_run.afterwards_add: 無法把 module ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">item</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] 移到下一批次: 下一批次'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'已有此 module'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'不存在'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3267</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3268</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>3269</span> </span><span class="WHIT"> </span><span class="COMM">// 因為是指向 Object因此不需要再設定 synchronous_group.to_load_module。為防節外生枝直接改 .module_count不 cache。</span><span class="WHIT">
<span class='line'>3270</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">synchronous_group.module_count</span><span class="PUNC">++</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">changed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">load_module</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3271</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3272</span>
<span class='line'>3273</span> </span><span class="WHIT"> </span><span class="COMM">//show_set('after afterwards_add module dependency changed');</span><span class="WHIT">
<span class='line'>3274</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3275</span>
<span class='line'>3276</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">changed</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">item</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3277</span> </span><span class="WHIT"> </span><span class="COMM">//show_set('準備將 [' + item + '] 從 synchronous_group 搬到 next_group');</span><span class="WHIT">
<span class='line'>3278</span>
<span class='line'>3279</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.next_group</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3280</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3281</span> </span><span class="WHIT"> </span><span class="NAME">next_group</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT">
<span class='line'>3282</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3283</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3284</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3285</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="STRN">'timeout'</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">synchronous_group</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3286</span> </span><span class="WHIT"> </span><span class="NAME">_.extend</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3287</span> </span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3288</span> </span><span class="WHIT"> </span><span class="NAME">start_time</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT">
<span class='line'>3289</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">synchronous_group</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3290</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3291</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.next_group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3292</span>
<span class='line'>3293</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">item_is_path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3294</span> </span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">s.to_load_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NAME">item</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3295</span> </span><span class="WHIT"> </span><span class="NAME">s.path_count</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3296</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">item</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3297</span> </span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">s.to_load_module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NAME">item</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3298</span> </span><span class="WHIT"> </span><span class="NAME">s.module_count</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3299</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3300</span> </span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">s.to_run</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">push</span><span class="PUNC">(</span><span class="NAME">item</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3301</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3302</span> </span><span class="WHIT"> </span><span class="COMM">//else warn();</span><span class="WHIT">
<span class='line'>3303</span>
<span class='line'>3304</span> </span><span class="WHIT"> </span><span class="COMM">//show_set('已將 [' + item + '] 從 synchronous_group 搬到 next_group');</span><span class="WHIT">
<span class='line'>3305</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>3306</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3307</span>
<span class='line'>3308</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3309</span>
<span class='line'>3310</span> </span><span class="WHIT"> </span><span class="COMM">// debug 用</span><span class="WHIT">
<span class='line'>3311</span> </span><span class="WHIT"> </span><span class="COMM">//TODO: Object.keys(obj)</span><span class="WHIT">
<span class='line'>3312</span> </span><span class="WHIT"> </span><span class="COMM">// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys</span><span class="WHIT">
<span class='line'>3313</span> </span><span class="WHIT"> </span><span class="NAME">get_Object_key</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">o</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3314</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">o</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3315</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3316</span> </span><span class="WHIT"> </span><span class="COMM">//if (!_.is_Object(o)) return;</span><span class="WHIT">
<span class='line'>3317</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3318</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3319</span> </span><span class="WHIT"> </span><span class="NAME">l.push</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3320</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3321</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3322</span>
<span class='line'>3323</span> </span><span class="WHIT"> </span><span class="COMM">// debug 用</span><span class="WHIT">
<span class='line'>3324</span> </span><span class="WHIT"> </span><span class="NAME">show_set</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">from</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3325</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">_.is_debug</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3326</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ptr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">s_data</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT"> </span><span class="STRN">'預計先後載入同步載入組: '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">from</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3327</span> </span><span class="WHIT"> </span><span class="KEYW">do</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3328</span> </span><span class="WHIT"> </span><span class="NAME">d</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ptr.to_load_module</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">get_Object_key</span><span class="PUNC">(</span><span class="NAME">ptr.to_load_module</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3329</span> </span><span class="WHIT"> </span><span class="NAME">s_data.push</span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>3330</span> </span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>3331</span> </span><span class="WHIT"> </span><span class="STRN">'['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">ptr.module_count</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">d.length</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">ptr.module_count</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'&lt;em>登記 '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">ptr.module_count</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">' != 實際 '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">d.length</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'&lt;/em>'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] '</span><span class="WHIT">
<span class='line'>3332</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">d.join</span><span class="PUNC">(</span><span class="STRN">' &lt;span style="color:#f00">|&lt;/span> '</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3333</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'&lt;span style="color:#888">(none: 此同步載入組無預計載入之 module)&lt;/span>'</span><span class="WHIT">
<span class='line'>3334</span> </span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3335</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">ptr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ptr.next_group</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3336</span> </span><span class="WHIT"> </span><span class="NAME">_.debug</span><span class="PUNC">(</span><span class="NAME">s_data.join</span><span class="PUNC">(</span><span class="STRN">'&lt;br/>'</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'check_run.show_set'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3337</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3338</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3339</span>
<span class='line'>3340</span> </span><span class="WHIT"> </span><span class="COMM">//check module_require_chain{module_name}</span><span class="WHIT">
<span class='line'>3341</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3342</span> * 載入間執行之 function.
<span class='line'>3343</span> * 有未載入之 dependencies僅能從 callback 傳入此 module 所需之 dependency list 來處置。
<span class='line'>3344</span> * TODO: 確認若是load錯誤時會不會跳過 check_loading 不執行。
<span class='line'>3345</span> */</span><span class="WHIT">
<span class='line'>3346</span> </span><span class="WHIT"> </span><span class="NAME">check_loading</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3347</span> </span><span class="WHIT"> </span><span class="NAME">load_module</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">load_URL</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3348</span> </span><span class="WHIT"> </span><span class="NAME">move_to_next_group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3349</span>
<span class='line'>3350</span> </span><span class="WHIT"> </span><span class="COMM">// synchronous_group.to_run: 若要處理 .to_run 的 require則 check_loading() 還是需要設定。</span><span class="WHIT">
<span class='line'>3351</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">work_queue_index</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">work_queue_length</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_run</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3352</span> </span><span class="WHIT"> </span><span class="NAME">check_loading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3353</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug((module_name ? 'module [' + module_name + ']/all ' + synchronous_group.module_count : path ? 'path [' + path + ']/all ' + synchronous_group.path_count : '沒有尚未 load 的 resource') + (synchronous_group.timeout ? ', timeout ' + synchronous_group.timeout : ''), 1, 'check_run.check_loading');</span><span class="WHIT">
<span class='line'>3354</span> </span><span class="WHIT"> </span><span class="COMM">//show_set('check_loading start');</span><span class="WHIT">
<span class='line'>3355</span>
<span class='line'>3356</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3357</span>
<span class='line'>3358</span> </span><span class="WHIT"> </span><span class="COMM">// is module</span><span class="WHIT">
<span class='line'>3359</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_load_module</span><span class="PUNC">[</span><span class="NAME">module_name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3360</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.module_count</span><span class="PUNC">--</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3361</span>
<span class='line'>3362</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">_.is_loaded</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3363</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">module_require_chain</span><span class="PUNC">[</span><span class="NAME">module_name</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3364</span> </span><span class="WHIT"> </span><span class="NAME">afterwards_add</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3365</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>3366</span> </span><span class="WHIT"> </span><span class="COMM">// 若有不存在的 module因為會以 .include_resource 載入,在 MSIE 中會 throw。</span><span class="WHIT">
<span class='line'>3367</span> </span><span class="WHIT"> </span><span class="COMM">// 可以由判別 browser 改善此體驗。</span><span class="WHIT">
<span class='line'>3368</span> </span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="PUNC">(</span><span class="STRN">'check_run.check_loading: Cannot load module ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3369</span>
<span class='line'>3370</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3371</span>
<span class='line'>3372</span> </span><span class="WHIT"> </span><span class="COMM">// is path, 無法判別是否成功 included。</span><span class="WHIT">
<span class='line'>3373</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_load_path</span><span class="PUNC">[</span><span class="NAME">path</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3374</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group.path_count</span><span class="PUNC">--</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3375</span>
<span class='line'>3376</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3377</span>
<span class='line'>3378</span> </span><span class="WHIT"> </span><span class="COMM">// 可能因為循環參照(circular dependencies),這邊的 module 之前已經 load 過,因此需要再作 check。</span><span class="WHIT">
<span class='line'>3379</span> </span><span class="WHIT"> </span><span class="COMM">// .. pass</span><span class="WHIT">
<span class='line'>3380</span> </span><span class="WHIT"> </span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3381</span>
<span class='line'>3382</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">synchronous_group.module_count</span><span class="WHIT">
<span class='line'>3383</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">synchronous_group.path_count</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3384</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.timeout</span><span class="WHIT">
<span class='line'>3385</span> </span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Date</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">synchronous_group.start_time</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3386</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.next_group</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3387</span> </span><span class="WHIT"> </span><span class="NAME">move_to_next_group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3388</span>
<span class='line'>3389</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('Move to next synchronous load group. 本同步載入組已全部載入,' + (synchronous_group ? '進入下一同步載入組。' : work_queue_index &lt; work_queue.length ? '繼續下一組指定的工作 [' + work_queue_index + '/' + work_queue.length + ']。' : '本次指定的 ' + work_queue_index + ' 項工作已全部執行完成。') + (timeout > 4 ? 'timeout ' + timeout + ' 超過 4ms設定 timeout。' : ''), 1, 'check_run.check_loading');</span><span class="WHIT">
<span class='line'>3390</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">timeout</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">4</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3391</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: setTimeout 可能不存在!</span><span class="WHIT">
<span class='line'>3392</span> </span><span class="WHIT"> </span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3393</span> </span><span class="WHIT"> </span><span class="NAME">check_run</span><span class="PUNC">(</span><span class="NAME">work_queue</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">work_queue_index</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3394</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3395</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">timeout</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3396</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>3397</span> </span><span class="WHIT"> </span><span class="NAME">check_run</span><span class="PUNC">(</span><span class="NAME">work_queue</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">work_queue_index</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3398</span> </span><span class="WHIT"> </span><span class="NAME">synchronous_group</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3399</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('設定完畢', 1, 'check_run.check_loading');</span><span class="WHIT">
<span class='line'>3400</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3401</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3402</span>
<span class='line'>3403</span> </span><span class="WHIT"> </span><span class="NAME">load_module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3404</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('[' + module_name + ']', 1, 'check_run.load_module');</span><span class="WHIT">
<span class='line'>3405</span> </span><span class="WHIT"> </span><span class="COMM">// .use 會先試試 .get_file()</span><span class="WHIT">
<span class='line'>3406</span> </span><span class="WHIT"> </span><span class="NAME">_.use</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">check_loading</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3407</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3408</span>
<span class='line'>3409</span> </span><span class="WHIT"> </span><span class="NAME">load_URL</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">URL</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">encoding</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3410</span> </span><span class="WHIT"> </span><span class="COMM">// 準備載入 resource. ** 在已經 loaded 的情況下有可能直接就執行完 return!</span><span class="WHIT">
<span class='line'>3411</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('[' + URL + ']', 1, 'check_run.load_URL');</span><span class="WHIT">
<span class='line'>3412</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="REGX">/\.js$/i</span><span class="PUNC">.</span><span class="NAME">test</span><span class="PUNC">(</span><span class="NAME">URL</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3413</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3414</span> </span><span class="WHIT"> </span><span class="COMM">// 對 .js 先試試 .get_file()</span><span class="WHIT">
<span class='line'>3415</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">t</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.get_file</span><span class="PUNC">(</span><span class="NAME">URL</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">encoding</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3416</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('Get [' + t + ']', 2, 'check_run.load_URL');</span><span class="WHIT">
<span class='line'>3417</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">t</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3418</span> </span><span class="WHIT"> </span><span class="COMM">// eval @ global. 這邊可能會出現 security 問題。</span><span class="WHIT">
<span class='line'>3419</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: 以其他方法取代 eval 的使用。</span><span class="WHIT">
<span class='line'>3420</span> </span><span class="WHIT"> </span><span class="NAME">_.eval_code</span><span class="PUNC">(</span><span class="NAME">t</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3421</span>
<span class='line'>3422</span> </span><span class="WHIT"> </span><span class="NAME">check_loading</span><span class="PUNC">(</span><span class="NAME">URL</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3423</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3424</span>
<span class='line'>3425</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3426</span> </span><span class="WHIT"> </span><span class="COMM">//_.err(e);</span><span class="WHIT">
<span class='line'>3427</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3428</span>
<span class='line'>3429</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('需要作同步 loading resource [' + URL + ']', 1, 'check_run.load_URL');</span><span class="WHIT">
<span class='line'>3430</span> </span><span class="WHIT"> </span><span class="NAME">_.include_resource</span><span class="PUNC">(</span><span class="NAME">URL</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">check_loading</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3431</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3432</span>
<span class='line'>3433</span> </span><span class="WHIT"> </span><span class="COMM">// 把能處理的 .to_run function 先執行處理,而後早點 delete 以釋放空間。</span><span class="WHIT">
<span class='line'>3434</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_run</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3435</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">index</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3436</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3437</span> </span><span class="WHIT"> </span><span class="COMM">// 已經過鑑別,這邊的都是 Function</span><span class="WHIT">
<span class='line'>3438</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">[</span><span class="NAME">index</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3439</span>
<span class='line'>3440</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3441</span> </span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="PUNC">(</span><span class="STRN">'check_run: '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">e.message</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3442</span> </span><span class="WHIT"> </span><span class="NAME">_.debug</span><span class="PUNC">(</span><span class="STRN">'&lt;code>'</span><span class="WHIT">
<span class='line'>3443</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="STRN">''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">[</span><span class="NAME">index</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\n/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'&lt;br />'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3444</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'&lt;/code>'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3445</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3446</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('把能處理的 function 先處理完了刪除synchronous_group.to_run 的資料。', 2);</span><span class="WHIT">
<span class='line'>3447</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_run</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3448</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3449</span>
<span class='line'>3450</span>
<span class='line'>3451</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_load_module</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3452</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">index</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3453</span> </span><span class="WHIT"> </span><span class="NAME">load_module</span><span class="PUNC">(</span><span class="NAME">index</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3454</span>
<span class='line'>3455</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">move_to_next_group</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3456</span> </span><span class="WHIT"> </span><span class="COMM">// 在上一個 load_module() 呼叫 check_loading() 時,可能因為 synchronous_group = synchronous_group.next_group 使得 synchronous_group 已轉換到下一 synchronous load group。</span><span class="WHIT">
<span class='line'>3457</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3458</span>
<span class='line'>3459</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">synchronous_group.to_load_path</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3460</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">index</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3461</span> </span><span class="WHIT"> </span><span class="NAME">load_URL</span><span class="PUNC">(</span><span class="NAME">index</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3462</span>
<span class='line'>3463</span>
<span class='line'>3464</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">move_to_next_group</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">check_loading</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">synchronous_group.module_count</span><span class="WHIT">
<span class='line'>3465</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">synchronous_group.path_count</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3466</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('[' + work_queue_index + '/' + work_queue_length + '] 沒有尚未 load 的 resource (例如只輸入 timeout 或每個 resource 皆 loaded),手動執行 check_loading。', 1, 'check_run');</span><span class="WHIT">
<span class='line'>3467</span> </span><span class="WHIT"> </span><span class="NAME">check_loading</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3468</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3469</span>
<span class='line'>3470</span> </span><span class="WHIT"> </span><span class="COMM">// 開始蟄伏, waiting for callback</span><span class="WHIT">
<span class='line'>3471</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3472</span>
<span class='line'>3473</span>
<span class='line'>3474</span>
<span class='line'>3475</span> </span><span class="WHIT"> </span><span class="COMM">//----------------------------------------------------------------------------------------------------------------------------------------------------------//</span><span class="WHIT">
<span class='line'>3476</span>
<span class='line'>3477</span>
<span class='line'>3478</span>
<span class='line'>3479</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>3480</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>3481</span> </span><span class="COMM">/**
<span class='line'>3482</span> * module 中模擬 inherit 時使用。
<span class='line'>3483</span> *
<span class='line'>3484</span> * TODO:
<span class='line'>3485</span> * 同步載入功能
<span class='line'>3486</span> * @param {String} parent_module_name 欲繼承的 module_name
<span class='line'>3487</span> * @param initial_arguments 繼承時的 initial arguments
<span class='line'>3488</span> * @returns
<span class='line'>3489</span> * @see
<span class='line'>3490</span> * &lt;a href="http://fillano.blog.ithome.com.tw/post/257/17355" accessdate="2010/1/1 0:6">Fillano's Learning Notes | 物件導向Javascript - 實作繼承的效果&lt;/a>,
<span class='line'>3491</span> * &lt;a href="http://www.crockford.com/javascript/inheritance.html" accessdate="2010/1/1 0:6">Classical Inheritance in JavaScript&lt;/a>
<span class='line'>3492</span> */</span><span class="WHIT">
<span class='line'>3493</span> </span><span class="NAME">inherit</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">parent_module_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">initial_arguments</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3494</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">_.cache_code</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">_.cache_code</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3495</span> </span><span class="WHIT"> </span><span class="NAME">_.debug</span><span class="PUNC">(</span><span class="STRN">'inherit: cache code did not setted but try to inherit module!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3496</span>
<span class='line'>3497</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">loaded_module</span><span class="PUNC">[</span><span class="NAME">_.to_module_name</span><span class="PUNC">(</span><span class="NAME">parent_module_name</span><span class="PUNC">)</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3498</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3499</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Function</span><span class="PUNC">(</span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3500</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">code_for_including.call</span><span class="PUNC">(</span><span class="NAME">code_for_including</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">_</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">initial_arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3501</span>
<span class='line'>3502</span> </span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="PUNC">(</span><span class="STRN">'inherit: ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">parent_module_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] did not catched!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3503</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3504</span> </span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="PUNC">(</span><span class="STRN">'inherit: running of ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">parent_module_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] error!'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3505</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3506</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3507</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3508</span>
<span class='line'>3509</span>
<span class='line'>3510</span>
<span class='line'>3511</span>
<span class='line'>3512</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>3513</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>3514</span> </span><span class="COMM">/**
<span class='line'>3515</span> * 解析 dependency list 以獲得所需之 module/path/variable name..
<span class='line'>3516</span> *
<span class='line'>3517</span> * @param {Array|String}
<span class='line'>3518</span> * dependency_list
<span class='line'>3519</span> * &lt;p>
<span class='line'>3520</span> * list of dependency function/module/variable required. module 須以
<span class='line'>3521</span> * CeL.env.module_name_separator ('.') 結尾。若輸入 String則以 separator 或 '|' 分割。
<span class='line'>3522</span> * &lt;/p>
<span class='line'>3523</span> * @returns {Object} result { variable: {variable_name: full_name}, module:
<span class='line'>3524</span> * {module name: loaded or not}, module_to_load: [], URL: {}}
<span class='line'>3525</span> * @returns {Number} error_no
<span class='line'>3526</span> * @since 2011/8/6 22:10:57
<span class='line'>3527</span> */</span><span class="WHIT">
<span class='line'>3528</span> </span><span class="NAME">parse_require</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">dependency_list</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">separator</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">base_require</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3529</span>
<span class='line'>3530</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">dependency_list</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3531</span> </span><span class="WHIT"> </span><span class="COMM">// is_Object(undefined) === true!</span><span class="WHIT">
<span class='line'>3532</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3533</span>
<span class='line'>3534</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">dependency_list</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3535</span> </span><span class="WHIT"> </span><span class="NAME">dependency_list</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">dependency_list.split</span><span class="PUNC">(</span><span class="NAME">separator</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">'|'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3536</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">_.is_Array</span><span class="PUNC">(</span><span class="NAME">dependency_list</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">dependency_list</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3537</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3538</span>
<span class='line'>3539</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">module_name_separator</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.env.module_name_separator</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3540</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3541</span> * variable name under module
<span class='line'>3542</span> */</span><span class="WHIT">
<span class='line'>3543</span> </span><span class="WHIT"> </span><span class="NAME">var_name</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3544</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3545</span> * 解析出要 extend 到 'this' 下的 variables。
<span class='line'>3546</span> * variable_hash[variable name] = 所在 module name.
<span class='line'>3547</span> */</span><span class="WHIT">
<span class='line'>3548</span> </span><span class="WHIT"> </span><span class="COMM">//variable_hash = {},</span><span class="WHIT">
<span class='line'>3549</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3550</span> * 解析出要 extend 到 'this' 下的 variables。
<span class='line'>3551</span> * variable_full_name[variable name] = variable full name.
<span class='line'>3552</span> */</span><span class="WHIT">
<span class='line'>3553</span> </span><span class="WHIT"> </span><span class="NAME">variable_full_name</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3554</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3555</span> * 解析出的 URL paths.
<span class='line'>3556</span> * URL_hash[URL] = loaded or not;
<span class='line'>3557</span> */</span><span class="WHIT">
<span class='line'>3558</span> </span><span class="WHIT"> </span><span class="NAME">URL_hash</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3559</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3560</span> * 解析出需要 load 的 URL paths.
<span class='line'>3561</span> */</span><span class="WHIT">
<span class='line'>3562</span> </span><span class="WHIT"> </span><span class="NAME">URL_to_load</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3563</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3564</span> * dependency_list 中指定的 module。
<span class='line'>3565</span> * module_hash[module name] = loaded or not
<span class='line'>3566</span> */</span><span class="WHIT">
<span class='line'>3567</span> </span><span class="WHIT"> </span><span class="NAME">module_hash</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3568</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3569</span> * 已 load 的 module。
<span class='line'>3570</span> */</span><span class="WHIT">
<span class='line'>3571</span> </span><span class="WHIT"> </span><span class="COMM">//module_loaded = [],</span><span class="WHIT">
<span class='line'>3572</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3573</span> * 要 load 的 module。
<span class='line'>3574</span> */</span><span class="WHIT">
<span class='line'>3575</span> </span><span class="WHIT"> </span><span class="NAME">module_to_load</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3576</span>
<span class='line'>3577</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.is_Object</span><span class="PUNC">(</span><span class="NAME">base_require</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3578</span> </span><span class="WHIT"> </span><span class="NAME">variable_full_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">base_require.variable</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3579</span> </span><span class="WHIT"> </span><span class="NAME">URL_hash</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">base_require.URL</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3580</span> </span><span class="WHIT"> </span><span class="NAME">URL_to_load</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">base_require.URL_to_load</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3581</span> </span><span class="WHIT"> </span><span class="NAME">module_hash</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">base_require.module</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3582</span> </span><span class="WHIT"> </span><span class="NAME">module_to_load</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">base_require.module_to_load</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3583</span>
<span class='line'>3584</span> </span><span class="WHIT"> </span><span class="COMM">//variable_hash = {};</span><span class="WHIT">
<span class='line'>3585</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3586</span> </span><span class="WHIT"> </span><span class="NAME">variable_full_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3587</span> </span><span class="WHIT"> </span><span class="NAME">URL_hash</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3588</span> </span><span class="WHIT"> </span><span class="NAME">URL_to_load</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3589</span> </span><span class="WHIT"> </span><span class="NAME">module_hash</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3590</span> </span><span class="WHIT"> </span><span class="NAME">module_to_load</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3591</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3592</span>
<span class='line'>3593</span> </span><span class="WHIT"> </span><span class="COMM">// 解析 dependency_list將所須 functions/modules 置於 variable_hash/module_hash 中。</span><span class="WHIT">
<span class='line'>3594</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">dependency_list</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3595</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.request_item_maybe_module</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">dependency_list</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3596</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.split_module_name</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3597</span>
<span class='line'>3598</span> </span><span class="WHIT"> </span><span class="COMM">// 類似 'data.split_String_to_Object' 的形式,為 function。</span><span class="WHIT">
<span class='line'>3599</span> </span><span class="WHIT"> </span><span class="COMM">// 類似 'data.' 的形式,為 module。</span><span class="WHIT">
<span class='line'>3600</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">var_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module.pop</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3601</span> </span><span class="WHIT"> </span><span class="NAME">variable_full_name</span><span class="PUNC">[</span><span class="NAME">var_name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>3602</span> </span><span class="WHIT"> </span><span class="COMM">//variable_hash[var_name] =</span><span class="WHIT">
<span class='line'>3603</span> </span><span class="WHIT"> </span><span class="NAME">_.to_module_name</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3604</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">module_name_separator</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">var_name</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3605</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('load module [' + _.to_module_name(module) + ']' + (var_name ? '.' + var_name : ''));</span><span class="WHIT">
<span class='line'>3606</span>
<span class='line'>3607</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('test module ['+module.join(module_name_separator)+']: '+_.get_variable(module.join(module_name_separator),_));</span><span class="WHIT">
<span class='line'>3608</span>
<span class='line'>3609</span> </span><span class="WHIT"> </span><span class="COMM">// 不用 _.to_module_name因為會加油添醋。</span><span class="WHIT">
<span class='line'>3610</span> </span><span class="WHIT"> </span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">module.join</span><span class="PUNC">(</span><span class="NAME">module_name_separator</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3611</span>
<span class='line'>3612</span> </span><span class="WHIT"> </span><span class="COMM">// 確定是否還沒載入,必須 load。還沒載入則放在 module_to_load[] 中。</span><span class="WHIT">
<span class='line'>3613</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">module</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">module_hash</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3614</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">module_hash</span><span class="PUNC">[</span><span class="NAME">module</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.is_loaded</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3615</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('module [' + module + '] need to load first.'),</span><span class="WHIT">
<span class='line'>3616</span> </span><span class="WHIT"> </span><span class="NAME">module_to_load.push</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3617</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3618</span>
<span class='line'>3619</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">URL_hash</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">URL_hash</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.is_included</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3620</span> </span><span class="WHIT"> </span><span class="NAME">URL_to_load.push</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3621</span>
<span class='line'>3622</span>
<span class='line'>3623</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3624</span> </span><span class="WHIT"> </span><span class="COMM">//require : dependency_list,</span><span class="WHIT">
<span class='line'>3625</span> </span><span class="WHIT"> </span><span class="NAME">variable</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">variable_full_name</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3626</span>
<span class='line'>3627</span> </span><span class="WHIT"> </span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">module_hash</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3628</span> </span><span class="WHIT"> </span><span class="COMM">//module_loaded : module_loaded,</span><span class="WHIT">
<span class='line'>3629</span> </span><span class="WHIT"> </span><span class="NAME">module_to_load</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">module_to_load</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3630</span>
<span class='line'>3631</span> </span><span class="WHIT"> </span><span class="NAME">URL</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">URL_hash</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3632</span> </span><span class="WHIT"> </span><span class="NAME">URL_to_load</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">URL_to_load</span><span class="WHIT">
<span class='line'>3633</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3634</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3635</span>
<span class='line'>3636</span>
<span class='line'>3637</span> </span><span class="COMM">/*
<span class='line'>3638</span> //這得要直接貼在標的 scope 內才有用。
<span class='line'>3639</span> var no_strict_variable_use = (function() {
<span class='line'>3640</span> var v, i = 0;
<span class='line'>3641</span> try {
<span class='line'>3642</span> // find a undefined var_name
<span class='line'>3643</span> for (;;)
<span class='line'>3644</span> eval(v = 'tmp_' + i++);
<span class='line'>3645</span> } catch (i) {
<span class='line'>3646</span> }
<span class='line'>3647</span>
<span class='line'>3648</span> eval('var ' + v + '=1;');
<span class='line'>3649</span>
<span class='line'>3650</span> try {
<span class='line'>3651</span> // OK 表示在 eval 中可以設定 var.
<span class='line'>3652</span> // 若是 'use strict'; 則不可在 eval() 中置 var.
<span class='line'>3653</span> return eval(v);
<span class='line'>3654</span> } catch (i) {
<span class='line'>3655</span> }
<span class='line'>3656</span> })();
<span class='line'>3657</span> */</span><span class="WHIT">
<span class='line'>3658</span>
<span class='line'>3659</span> </span><span class="COMM">// http://closure-compiler.appspot.com/</span><span class="WHIT">
<span class='line'>3660</span> </span><span class="COMM">// 這得要直接貼在標的 scope 內才有用。</span><span class="WHIT">
<span class='line'>3661</span> </span><span class="COMM">//var no_strict_variable_use=function(){var a,b=9;try{for(;;)eval(a="t_"+b++)}catch(c){}eval("var "+a+"=1;");try{return eval(a)}catch(d){}}();</span><span class="WHIT">
<span class='line'>3662</span>
<span class='line'>3663</span> </span><span class="NAME">CeL</span><span class="WHIT">
<span class='line'>3664</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>3665</span> </span><span class="COMM">/**
<span class='line'>3666</span> * module 中需要 include function/module/variable 時設定 local variables 使用。&lt;br/>
<span class='line'>3667</span> * 本函數將把所需 function include 至當前 namespace 下。
<span class='line'>3668</span> *
<span class='line'>3669</span> * TODO: 輸入 function name 即可
<span class='line'>3670</span> *
<span class='line'>3671</span> * @example
<span class='line'>3672</span> *
<span class='line'>3673</span> * // requires (inside module)
<span class='line'>3674</span> * // 事先定義 @ 'use strict';
<span class='line'>3675</span> * var split_String_to_Object;
<span class='line'>3676</span> * // 之所以需要使用 eval 是因為要 extend 至當前 namespace 下。
<span class='line'>3677</span> * // 若無法 load CeL.data將會 throw
<span class='line'>3678</span> * eval(library_namespace.use_function(this, 'data.split_String_to_Object'));
<span class='line'>3679</span> * // use it
<span class='line'>3680</span> * split_String_to_Object();
<span class='line'>3681</span> *
<span class='line'>3682</span> * // 不用 eval 的方法 1: function 預設都會 extend 至當前 library_namespace 下。
<span class='line'>3683</span> * library_namespace.use_function(this, 'data.split_String_to_Object');
<span class='line'>3684</span> * library_namespace.use_function(this, 'data.split_String_to_Object', false);
<span class='line'>3685</span> * // 若無法 load CeL.data將會 throw
<span class='line'>3686</span> * // use it
<span class='line'>3687</span> * library_namespace.split_String_to_Object();
<span class='line'>3688</span> *
<span class='line'>3689</span> * // 不用 eval 的方法 2: 設定 extend_to
<span class='line'>3690</span> * var o={};
<span class='line'>3691</span> * // 若無法 load CeL.data將會 throw
<span class='line'>3692</span> * library_namespace.use_function(this, 'data.split_String_to_Object', o);
<span class='line'>3693</span> * // use it
<span class='line'>3694</span> * o.split_String_to_Object();
<span class='line'>3695</span> *
<span class='line'>3696</span> * @param {Function|Object} name_space module name-space
<span class='line'>3697</span> * @param {Array|String} dependency_list list of dependency function/module/variable required. module 須以 '.' 結尾。若輸入 String則以 ',' 分割。
<span class='line'>3698</span> * @param {Function|Object} [extend_to] 若設定將把 variable extend 至 extend_to
<span class='line'>3699</span> *
<span class='line'>3700</span> * @returns {Number} error code
<span class='line'>3701</span> * 1: can't parse dependency_list
<span class='line'>3702</span> *
<span class='line'>3703</span> * @throws {Error} 有些 module 尚未載入。
<span class='line'>3704</span> *
<span class='line'>3705</span> * @since 2009/12/26 02:36:31
<span class='line'>3706</span> * 2009/12/31 22:21:23 add 類似 'data.' 的形式,為 module。
<span class='line'>3707</span> * 2010/6/14 22:58:18 避免相互 require
<span class='line'>3708</span> */</span><span class="WHIT">
<span class='line'>3709</span> </span><span class="NAME">use_function</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">name_space</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">optional_use</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">no_strict</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3710</span>
<span class='line'>3711</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">get_module_name</span><span class="PUNC">(</span><span class="NAME">name_space</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3712</span>
<span class='line'>3713</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('load function [' + dependency_list + ']' + (typeof module_name === 'string' && module_name ? ' from [' + module_name + ']' : ''));</span><span class="WHIT">
<span class='line'>3714</span>
<span class='line'>3715</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">variable_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">eval_code</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3716</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>3717</span> * 要 extend 到 name_space 下的 variables。
<span class='line'>3718</span> * variable_hash[variable name] = variable full name, 包括所在 module name.
<span class='line'>3719</span> */</span><span class="WHIT">
<span class='line'>3720</span> </span><span class="WHIT"> </span><span class="NAME">variable_hash</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">name_space.require_variable</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3721</span>
<span class='line'>3722</span> </span><span class="WHIT"> </span><span class="NAME">no_strict</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">no_strict</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">extend_to</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3723</span>
<span class='line'>3724</span> </span><span class="WHIT"> </span><span class="COMM">// 設定 required variables</span><span class="WHIT">
<span class='line'>3725</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">variable_name</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">variable_hash</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3726</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.get_variable</span><span class="PUNC">(</span><span class="NAME">variable_hash</span><span class="PUNC">[</span><span class="NAME">variable_name</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3727</span> </span><span class="WHIT"> </span><span class="COMM">//_.debug('指定 [' + variable_name + ']: ' + value));</span><span class="WHIT">
<span class='line'>3728</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">extend_to</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3729</span> </span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="PUNC">[</span><span class="NAME">variable_name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3730</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3731</span> </span><span class="WHIT"> </span><span class="NAME">no_strict</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">no_strict.push</span><span class="PUNC">(</span><span class="NAME">variable_name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3732</span>
<span class='line'>3733</span> </span><span class="WHIT"> </span><span class="NAME">eval_code.push</span><span class="PUNC">(</span><span class="STRN">'try{'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">variable_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'='</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
<span class='line'>3734</span> </span><span class="WHIT"> </span><span class="COMM">// 預防有保留字,所以用 bracket notation。例如 Chrome 中會出現 'Unexpected token native'。</span><span class="WHIT">
<span class='line'>3735</span> </span><span class="WHIT"> </span><span class="COMM">// Dot Notation and Square Bracket Notation in JavaScript http://www.dev-archive.net/articles/js-dot-notation/</span><span class="WHIT">
<span class='line'>3736</span> </span><span class="WHIT"> </span><span class="NAME">variable_hash</span><span class="PUNC">[</span><span class="NAME">variable_name</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\.([a-z\d_]+)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'["$1"]'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">';}catch(e){}'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3737</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3738</span>
<span class='line'>3739</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3740</span> </span><span class="WHIT"> </span><span class="COMM">// 可能因為循環參照(circular dependencies),事實上 required 並未 loaded。</span><span class="WHIT">
<span class='line'>3741</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">module_require_chain</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">_.is_debug</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3742</span> </span><span class="WHIT"> </span><span class="NAME">_.err</span><span class="PUNC">(</span><span class="NAME">_.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.use_function: load ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">variable_hash</span><span class="PUNC">[</span><span class="NAME">variable_name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] @ ['</span><span class="WHIT">
<span class='line'>3743</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">_.to_module_name</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] error: The module is not included or defined? You have to load they all later.'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3744</span>
<span class='line'>3745</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">extend_to</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3746</span> </span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="PUNC">[</span><span class="NAME">variable_name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3747</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3748</span> </span><span class="WHIT"> </span><span class="COMM">// 稍後求值,僅對 function 有效。</span><span class="WHIT">
<span class='line'>3749</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">_.get_variable</span><span class="PUNC">(</span><span class="NAME">variable_hash</span><span class="PUNC">[</span><span class="NAME">variable_name</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3750</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3751</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3752</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3753</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3754</span> </span><span class="WHIT"> </span><span class="NAME">no_strict</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">no_strict.push</span><span class="PUNC">(</span><span class="NAME">variable_name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3755</span>
<span class='line'>3756</span> </span><span class="WHIT"> </span><span class="COMM">// 稍後求值,僅對 function 有效。</span><span class="WHIT">
<span class='line'>3757</span> </span><span class="WHIT"> </span><span class="NAME">eval_code.push</span><span class="PUNC">(</span><span class="NAME">variable_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'=function(){try{return '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">variable_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'='</span><span class="WHIT">
<span class='line'>3758</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">variable_hash</span><span class="PUNC">[</span><span class="NAME">variable_name</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\.([a-z\d_]+)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'["$1"]'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3759</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">';}catch(e){}};'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3760</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3761</span>
<span class='line'>3762</span>
<span class='line'>3763</span> </span><span class="WHIT"> </span><span class="COMM">// delete it if doesn't exists</span><span class="WHIT">
<span class='line'>3764</span> </span><span class="WHIT"> </span><span class="COMM">//delete variable_hash[variable_name];</span><span class="WHIT">
<span class='line'>3765</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3766</span>
<span class='line'>3767</span> </span><span class="WHIT"> </span><span class="COMM">// 應注意 module_name 為保留字之類的情況,會掛在這邊 return 後的 eval。</span><span class="WHIT">
<span class='line'>3768</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">extend_to</span><span class="WHIT">
<span class='line'>3769</span> </span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">no_strict</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'var '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">no_strict.join</span><span class="PUNC">(</span><span class="STRN">','</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">';'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">eval_code.join</span><span class="PUNC">(</span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3770</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3771</span>
<span class='line'>3772</span>
<span class='line'>3773</span>
<span class='line'>3774</span> </span><span class="WHIT"> </span><span class="COMM">//----------------------------------------------------------------------------------------------------------------------------------------------------------//</span><span class="WHIT">
<span class='line'>3775</span>
<span class='line'>3776</span>
<span class='line'>3777</span> </span><span class="COMM">/**
<span class='line'>3778</span> * 為一些比較舊的版本或不同瀏覽器而做調適。
<span class='line'>3779</span> * @since 2010/1/14 17:58:31
<span class='line'>3780</span> * @inner
<span class='line'>3781</span> * @private
<span class='line'>3782</span> * @ignore
<span class='line'>3783</span> */</span><span class="WHIT">
<span class='line'>3784</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">environment_adapter</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3785</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>3786</span> * workaround:
<span class='line'>3787</span> * 理論上 '.'.split(/\./).length 應該是 2但 IE 58 中卻為 0!
<span class='line'>3788</span> * 用 .split('.') 倒是 OK.
<span class='line'>3789</span> * TODO:
<span class='line'>3790</span> * 應該增加可以管控與回復的手段,預防有時需要回到原有行為。
<span class='line'>3791</span> * @since 2010/1/1 19:03:40
<span class='line'>3792</span> */</span><span class="WHIT">
<span class='line'>3793</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="STRN">'.'</span><span class="PUNC">.</span><span class="NAME">split</span><span class="PUNC">(</span><span class="REGX">/\./</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">length</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3794</span> </span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3795</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_String_split</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">String.prototype.split</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3796</span> </span><span class="WHIT"> </span><span class="NAME">is_Regexp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.object_tester</span><span class="PUNC">(</span><span class="STRN">'RegExp'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3797</span> </span><span class="WHIT"> </span><span class="NAME">String.prototype.split</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">r</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3798</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">is_Regexp</span><span class="PUNC">(</span><span class="NAME">r</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>3799</span> </span><span class="WHIT"> </span><span class="NAME">_String_split.call</span><span class="PUNC">(</span><span class="NAME">this.valueOf</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>3800</span> </span><span class="WHIT"> </span><span class="NAME">r.global</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
<span class='line'>3801</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: 少了 multiline</span><span class="WHIT">
<span class='line'>3802</span> </span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">r.source</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">r.ignoreCase</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'ig'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'g'</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3803</span> </span><span class="WHIT"> </span><span class="STRN">'\0'</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'\0'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
<span class='line'>3804</span> </span><span class="WHIT"> </span><span class="NAME">_String_split.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3805</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3806</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3807</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3808</span>
<span class='line'>3809</span> </span><span class="NAME">environment_adapter</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3810</span>
<span class='line'>3811</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3812</span> </span><span class="COMM">// 不用 apply(),因為比較舊的瀏覽器沒有 apply()。</span><span class="WHIT">
<span class='line'>3813</span> </span><span class="PUNC">)</span><span class="PUNC">(</span><span class="NAME">CeL</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3814</span>
<span class='line'>3815</span>
<span class='line'>3816</span>
<span class='line'>3817</span>
<span class='line'>3818</span> </span><span class="WHIT"> </span><span class="COMM">//===========================================================================================================================================================//</span><span class="WHIT">
<span class='line'>3819</span>
<span class='line'>3820</span>
<span class='line'>3821</span>
<span class='line'>3822</span>
<span class='line'>3823</span> </span><span class="COMM">//args=args.concat(['turnCode.js']);</span><span class="WHIT">
<span class='line'>3824</span>
<span class='line'>3825</span> </span><span class="COMM">// 不作 initialization</span><span class="WHIT">
<span class='line'>3826</span> </span><span class="COMM">//CeL.no_initialization = 0;</span><span class="WHIT">
<span class='line'>3827</span>
<span class='line'>3828</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">CeL</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'function'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">CeL.env.script_name</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">CeL.env.main_script_name</span><span class="WHIT">
<span class='line'>3829</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">CeL.no_initialization</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3830</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3831</span> </span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3832</span> </span><span class="WHIT"> </span><span class="COMM">// WScript.Echo(CeL.env.script_name);</span><span class="WHIT">
<span class='line'>3833</span> </span><span class="WHIT"> </span><span class="COMM">// CeL.debug(CeL.env.script_name);</span><span class="WHIT">
<span class='line'>3834</span>
<span class='line'>3835</span>
<span class='line'>3836</span> </span><span class="WHIT"> </span><span class="COMM">// 將 path 寫入 registry</span><span class="WHIT">
<span class='line'>3837</span> </span><span class="WHIT"> </span><span class="NAME">CeL.use</span><span class="PUNC">(</span><span class="STRN">'application.OS.Windows'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3838</span> </span><span class="WHIT"> </span><span class="NAME">CeL.use</span><span class="PUNC">(</span><span class="STRN">'application.OS.Windows.registry'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3839</span> </span><span class="WHIT"> </span><span class="COMM">// CeL.debug(CeL.reg);</span><span class="WHIT">
<span class='line'>3840</span> </span><span class="WHIT"> </span><span class="COMM">//WScript.Echo(CeL.reg);</span><span class="WHIT">
<span class='line'>3841</span>
<span class='line'>3842</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">path_key_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">CeL.env.registry_path_key_name</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3843</span> </span><span class="WHIT"> </span><span class="COMM">// 此時 script 即為 main_script</span><span class="WHIT">
<span class='line'>3844</span> </span><span class="WHIT"> </span><span class="NAME">library_base_path</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">CeL.env.script_base_path</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3845</span> </span><span class="WHIT"> </span><span class="NAME">path_in_registry</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">CeL.reg.getValue</span><span class="PUNC">(</span><span class="NAME">path_key_name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">'(null)'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3846</span> </span><span class="WHIT"> </span><span class="COMM">//WScript.Echo('registry:\n' + path_in_registry + '\npath now:\n' + library_base_path);</span><span class="WHIT">
<span class='line'>3847</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">path_in_registry</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">library_base_path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3848</span> </span><span class="WHIT"> </span><span class="NAME">WScript.Echo</span><span class="PUNC">(</span><span class="STRN">'Change the base path of ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">CeL.Class</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] from:\n'</span><span class="WHIT">
<span class='line'>3849</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">path_in_registry</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\n to\n'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">library_base_path</span><span class="WHIT">
<span class='line'>3850</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\n\nkey name:\n'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">path_key_name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3851</span> </span><span class="WHIT"> </span><span class="NAME">CeL.reg.setValue.cid</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3852</span> </span><span class="WHIT"> </span><span class="NAME">CeL.reg.setValue</span><span class="PUNC">(</span><span class="NAME">path_key_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">library_base_path</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3853</span> </span><span class="WHIT"> </span><span class="NAME">CeL.reg.setValue</span><span class="PUNC">(</span><span class="NAME">CeL.env.registry_base</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'main_script'</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3854</span> </span><span class="WHIT"> </span><span class="NAME">library_base_path</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">CeL.env.script_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3855</span> </span><span class="WHIT"> </span><span class="NAME">CeL.reg.setValue.cid</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3856</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3857</span>
<span class='line'>3858</span>
<span class='line'>3859</span> </span><span class="WHIT"> </span><span class="COMM">// TODO</span><span class="WHIT">
<span class='line'>3860</span> </span><span class="WHIT"> </span><span class="COMM">// 拖曳檔案到本檔案上面時之處置。</span><span class="WHIT">
<span class='line'>3861</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>3862</span> </span><span class="WHIT"> </span><span class="COMM">// args instanceof Array</span><span class="WHIT">
<span class='line'>3863</span> </span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">args</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3864</span> </span><span class="WHIT"> </span><span class="COMM">// getEnvironment();</span><span class="WHIT">
<span class='line'>3865</span> </span><span class="WHIT"> </span><span class="COMM">// alert('Get arguments ['+args.length+']\n'+args.join('\n'));</span><span class="WHIT">
<span class='line'>3866</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">args.length</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3867</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">enc</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">backupDir</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">dBasePath</span><span class="PUNC">(</span><span class="STRN">'kanashimi\\www\\cgi-bin\\program\\log\\'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3868</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">fso.FolderExists</span><span class="PUNC">(</span><span class="NAME">backupDir</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3869</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3870</span> </span><span class="WHIT"> </span><span class="NAME">fso.CreateFolder</span><span class="PUNC">(</span><span class="NAME">backupDir</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3871</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3872</span> </span><span class="WHIT"> </span><span class="NAME">backupDir</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">dBasePath</span><span class="PUNC">(</span><span class="STRN">'kanashimi\\www\\cgi-bin\\game\\log\\'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3873</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3874</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">fso.FolderExists</span><span class="PUNC">(</span><span class="NAME">backupDir</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3875</span> </span><span class="WHIT"> </span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3876</span> </span><span class="WHIT"> </span><span class="NAME">fso.CreateFolder</span><span class="PUNC">(</span><span class="NAME">backupDir</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3877</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3878</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NUMB">2</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">alert</span><span class="PUNC">(</span><span class="STRN">'無法建立備份資料夾['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">backupDir</span><span class="WHIT">
<span class='line'>3879</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']\n接下來的操作將不會備份'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">48</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3880</span> </span><span class="WHIT"> </span><span class="NAME">WScript.Quit</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3881</span> </span><span class="WHIT"> </span><span class="NAME">backupDir</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3882</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3883</span> </span><span class="WHIT"> </span><span class="COMM">// addCode.report=true; // 是否加入報告</span><span class="WHIT">
<span class='line'>3884</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">args.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3885</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">dealShortcut</span><span class="PUNC">(</span><span class="NAME">args</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3886</span> </span><span class="WHIT"> </span><span class="PUNC">.</span><span class="NAME">match</span><span class="PUNC">(</span><span class="REGX">/\.(js|vbs|hta|s?html?|txt|wsf|pac)$/i</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3887</span> </span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">isFile</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3888</span> </span><span class="WHIT"> </span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">alert</span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>3889</span> </span><span class="WHIT"> </span><span class="STRN">'是否以預設編碼['</span><span class="WHIT">
<span class='line'>3890</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">enc</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">autodetectEncode</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">simpleFileDformat</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'內定語系('</span><span class="WHIT">
<span class='line'>3891</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">simpleFileDformat</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">')'</span><span class="WHIT">
<span class='line'>3892</span> </span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">enc</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']處理下面檔案?\n'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3893</span> </span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">3</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">32</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3894</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3895</span> </span><span class="WHIT"> </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3896</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">6</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3897</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">backupDir</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3898</span> </span><span class="WHIT"> </span><span class="NAME">fso.CopyFile</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">backupDir</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">getFN</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3899</span> </span><span class="WHIT"> </span><span class="NAME">addCode</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3900</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3901</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3902</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">alert</span><span class="PUNC">(</span><span class="STRN">'We will generate a reduced ['</span><span class="WHIT">
<span class='line'>3903</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">CeL.env.script_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']\n to ['</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">CeL.env.script_name</span><span class="WHIT">
<span class='line'>3904</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.reduced.js].\nBut it takes several time.'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>3905</span> </span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">32</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>3906</span> </span><span class="WHIT"> </span><span class="NAME">reduceScript</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">CeL.env.script_name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'.reduced.js'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3907</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="COMM">// else window.onload=init;</span><span class="WHIT">
<span class='line'>3908</span>
<span class='line'>3909</span> </span><span class="WHIT"> </span><span class="COMM">// CeL._iF=undefined;</span><span class="WHIT">
<span class='line'>3910</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>3911</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>3912</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: handle exception</span><span class="WHIT">
<span class='line'>3913</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>3914</span>
<span class='line'>3915</span>
<span class='line'>3916</span>
<span class='line'>3917</span> </span><span class="COMM">/*
<span class='line'>3918</span>
<span class='line'>3919</span> //test WinShell http://msdn.microsoft.com/en-us/library/bb787810(VS.85).aspx
<span class='line'>3920</span> if (0) {
<span class='line'>3921</span> alert(WinShell.Windows().Item(0).FullName);
<span class='line'>3922</span>
<span class='line'>3923</span> var i, cmd, t = '', objFolder = WinShell.NameSpace(0xa), objFolderItem = objFolder
<span class='line'>3924</span> .Items().Item(), colVerbs = objFolderItem.Verbs(); // 假如出意外objFolder==null
<span class='line'>3925</span> for (i = 0; i &lt; colVerbs.Count; i++) {
<span class='line'>3926</span> t += colVerbs.Item(i) + '\n';
<span class='line'>3927</span> if (('' + colVerbs.Item(i)).indexOf('&R') != -1)
<span class='line'>3928</span> cmd = colVerbs.Item(i);
<span class='line'>3929</span> }
<span class='line'>3930</span> objFolderItem.InvokeVerb('' + cmd);
<span class='line'>3931</span> alert('Commands:\n' + t);
<span class='line'>3932</span>
<span class='line'>3933</span> // objShell.NameSpace(FolderFrom).CopyHere(FolderTo,0); // copy folder
<span class='line'>3934</span> // objFolderItem=objShell.NameSpace(FolderFrom).ParseName("clock.avi");objFolderItem.Items().Item().InvokeVerb([動作]);
<span class='line'>3935</span> // objShell.NameSpace(FolderFromPath).Items.Item(mName).InvokeVerb();
<span class='line'>3936</span>
<span class='line'>3937</span> // Sets or gets the date and time that a file was last modified.
<span class='line'>3938</span> // http://msdn.microsoft.com/en-us/library/bb787825(VS.85).aspx
<span class='line'>3939</span> // objFolderItem.ModifyDate = "01/01/1900 6:05:00 PM";
<span class='line'>3940</span> // objShell.NameSpace("C:\Temp").ParseName("Test.Txt").ModifyDate =
<span class='line'>3941</span> // DateAdd("d", -1, Now()) CDate("19 October 2007")
<span class='line'>3942</span>
<span class='line'>3943</span> // Touch displays or sets the created, access, and modified times of one or
<span class='line'>3944</span> // more files. http://www.stevemiller.net/apps/
<span class='line'>3945</span> }
<span class='line'>3946</span>
<span class='line'>3947</span> //測試可寫入的字元:0-128,最好用1-127因為許多編輯器會將\0轉成' '\128又不確定
<span class='line'>3948</span> if (0) {
<span class='line'>3949</span> var t = '', f = 'try.js', i = 0;
<span class='line'>3950</span> for (; i &lt; 128; i++)
<span class='line'>3951</span> t += String.fromCharCode(i);
<span class='line'>3952</span> if (simpleWrite(f, t))
<span class='line'>3953</span> alert('Write error!\n有此local無法相容的字元?');
<span class='line'>3954</span> else if (simpleRead(f) != t)
<span class='line'>3955</span> alert('內容不同!');
<span class='line'>3956</span> else if (simpleWrite(f, dQuote(t) + ';'))
<span class='line'>3957</span> alert('Write error 2!\n有此local無法相容的字元?');
<span class='line'>3958</span> else if (eval(simpleRead(f)) != t)
<span class='line'>3959</span> alert('eval內容不同!');
<span class='line'>3960</span> else
<span class='line'>3961</span> alert('OK!');
<span class='line'>3962</span> }
<span class='line'>3963</span>
<span class='line'>3964</span> */</span><span class="WHIT">
<span class='line'>3965</span>
<span class='line'>3966</span>
<span class='line'>3967</span>
<span class='line'>3968</span>
<span class='line'>3969</span>
<span class='line'>3970</span> </span><span class="COMM">//}catch(e){WScript.Echo('There are some error in function.js!\n'+e.message);throw e;}</span><span class="WHIT">
<span class='line'>3971</span>
<span class='line'>3972</span>
<span class='line'>3973</span>
<span class='line'>3974</span> </span><span class="COMM">//CeL.use('code.log');</span><span class="WHIT">
<span class='line'>3975</span> </span><span class="COMM">//CeL.warn('test_print: ' + CeL.code.log.Class);</span><span class="WHIT">
<span class='line'>3976</span>
<span class='line'>3977</span>
<span class='line'>3978</span> </span><span class="COMM">//]]></span><span class="WHIT">
<span class='line'>3979</span>
<span class='line'>3980</span> </span></pre></body></html>