UNPKG

cejs

Version:

A JavaScript module framework that is simple to use.

463 lines 695 kB
<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 $ <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 c