<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=7252</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=7252&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.».]]></description>
		<lastBuildDate>Tue, 31 Jul 2012 18:56:03 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=62226#p62226</link>
			<description><![CDATA[<p><a href="http://forum.script-coding.com/viewtopic.php?pid=60825#p60825">Да вот же она</a>, да и чуть выше пост был.</p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Tue, 31 Jul 2012 18:56:03 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=62226#p62226</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=62178#p62178</link>
			<description><![CDATA[<p>Re: Решение коллеги JSman лучше.</p><p>А ссылочку можно... поиск не помог.</p>]]></description>
			<author><![CDATA[null@example.com (RUVATA)]]></author>
			<pubDate>Mon, 30 Jul 2012 20:18:20 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=62178#p62178</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61602#p61602</link>
			<description><![CDATA[<p>Решение коллеги <strong>JSman</strong> лучше.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Mon, 16 Jul 2012 08:29:49 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61602#p61602</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61600#p61600</link>
			<description><![CDATA[<p>Подготовлена очередная редакция.<br />Милости прошу на <a href="http://habrahabr.ru/post/147850/">хабрахабр</a><br />подробнее см. первый пост в теме.</p>]]></description>
			<author><![CDATA[null@example.com (RUVATA)]]></author>
			<pubDate>Mon, 16 Jul 2012 07:31:53 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61600#p61600</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60900#p60900</link>
			<description><![CDATA[<p>Механизм переработан с учетом сделанных замечаний см. первый пост в топике.</p>]]></description>
			<author><![CDATA[null@example.com (RUVATA)]]></author>
			<pubDate>Wed, 13 Jun 2012 09:27:20 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60900#p60900</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60825#p60825</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>А вот ошибки времени выполнения скрипта в eval - абсолютно не информативны, так как покажут номер строки родительского файла, где описан вызов функции eval. Что значит, что таким способом подключаемые скрипты не отладишь. </p><p>Поэтому функции, подобно описанным в этой теме считаю, малополезными и ненадежными. В крайнем случае, один скрипт можно подключить по схеме open/read/eval. Если Вам необходимо много файлов - пишите wsf-файл.</p></blockquote></div><p>Вот оцените отладчик на JS (лучше смотреть в cscript либо отображать диалоговые окна моноширинным шрифтом). Думаю понравится <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.<br /></p><div class="codebox"><pre><code>var FSO = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);
var WshShell = new ActiveXObject(&quot;WScript.Shell&quot;);

var SC = WScript.CreateObject(&quot;ScriptControl&quot;);
SC.Language = &quot;JScript&quot;;
SC.AddObject(&quot;WScript&quot;, WScript);
SC.AddObject(&quot;__Global&quot;, this);

var CodeCache=&quot;&quot;, CurrentLib=WScript.ScriptFullName, CurrentAddCode=&quot;var require=function(Path){__Global.require(Path);}&quot;;

function ParseError()
{
  WScript.Echo([&quot;\nОшибка: «&quot;, SC.Error.Description, &quot;»\nв строке:\n&quot;, CurrentAddCode.split(/\r?\n/g)[SC.Error.Line-1], &quot;\n&quot;, new Array(SC.Error.Column).join(&quot;—&quot;)+&quot;^\n\n&quot;, &quot;Line: &quot;, SC.Error.Line, &quot;; Column: &quot;, SC.Error.Column, &quot;\n\nLib: &quot;+CurrentLib].join(&quot;&quot;));
  WScript.Echo(CurrentAddCode);
}

function require(Path)
{
  var ResultPath=Path;
  if (Path.indexOf(&quot;:&quot;)==-1) ResultPath = WshShell.CurrentDirectory+&quot;\\&quot;+Path;
  CurrentLib = ResultPath;
  var F=FSO.OpenTextFile(ResultPath, 1, 0);
  var Code = F.ReadAll();
  F.Close();
  CodeCache+=&quot;\n&quot;+ResultPath+&quot;\n&quot;+Code;
  SC.AddCode(CurrentAddCode=Code.replace(/\r?\n\r?\n/g,&quot;\n \n&quot;));
}
SC.AddCode(CurrentAddCode);

try {
  WshShell.CurrentDirectory = WScript.Arguments(0).replace(/\\[^\\]+$/,&quot;&quot;);
  SC.AddCode(&quot;require(WScript.Arguments(0));&quot;);  
} catch(e) {
  ParseError();
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Fri, 08 Jun 2012 18:22:15 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60825#p60825</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60815#p60815</link>
			<description><![CDATA[<div class="quotebox"><cite>JSman пишет:</cite><blockquote><p>не мусорить глобальное пространство. Плюс удобный контроль ошибок.</p></blockquote></div><p>Сомнительно. Файл подключается ради тех самых сущностей, которые в нем описаны. А вот ошибки времени выполнения скрипта в eval - абсолютно не информативны, так как покажут номер строки родительского файла, где описан вызов функции eval. Что значит, что таким способом подключаемые скрипты не отладишь. </p><p>Поэтому функции, подобно описанным в этой теме считаю, малополезными и ненадежными. В крайнем случае, один скрипт можно подключить по схеме open/read/eval. Если Вам необходимо много файлов - пишите wsf-файл.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 08 Jun 2012 03:30:49 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60815#p60815</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60814#p60814</link>
			<description><![CDATA[<p>Ну мне кажется, что можно проще код написать. Например так:<br /></p><div class="codebox"><pre><code>var FSO = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);
var WshShell = new ActiveXObject(&quot;WScript.Shell&quot;);

var SC = WScript.CreateObject(&quot;ScriptControl&quot;);
SC.Language = &quot;JScript&quot;;
SC.AddObject(&quot;WScript&quot;, WScript);
SC.AddObject(&quot;__Global&quot;, this);

function require(Path)
{
  var ResultPath=Path;
  if (Path.indexOf(&quot;:&quot;)==-1) ResultPath = WshShell.CurrentDirectory+&quot;\\&quot;+Path;
  var F=FSO.OpenTextFile(ResultPath, 1, 0);
  var Code = F.ReadAll();
  F.Close();
  
  SC.AddCode(Code);
}
SC.AddCode(&quot;var require=function(Path){__Global.require(Path);}&quot;);

WshShell.CurrentDirectory = WScript.Arguments(0).replace(/\\[^\\]+$/,&quot;&quot;);
require(WScript.Arguments(0));</code></pre></div><p>Думаю лучше ScriptControl использовать, чтобы не мусорить глобальное пространство. Плюс удобный контроль ошибок.</p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Thu, 07 Jun 2012 18:46:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60814#p60814</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60730#p60730</link>
			<description><![CDATA[<p>Полностью согласен с Вами, по поводу относительных путей...<br />это я обязательно переделаю... вы абсолютно правы, что я реализовал <br />не очевидный способ... (будем делать так как общепринято)<br />Вы конечно уже поправили, но не <strong>reqire</strong>, я взял из секции &quot;Пример&quot;, предыдущей версии <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> <br />ну и о главном <br /></p><div class="quotebox"><blockquote><p>То что я написал, это всего лишь сырой набросок того, что надо еще исправлять, улучшать и усложнять.</p></blockquote></div><p>я почти то же самое говорил постом ранее<br /></p><div class="quotebox"><blockquote><p>код не подвергался ни оптимизации, ни адаптации... в основном для удобства отладки писался более развернуто...</p></blockquote></div><p>Извиняюсь за резкий ответ на критику (обоснованную)... мой вариант был не из&nbsp; лучших, и тут собственно Ваш код... ну меня и понесло <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /></p><p>PS: я просмотрел Ваш вариант, кое что подало парочку идей... спасибо.</p>]]></description>
			<author><![CDATA[null@example.com (RUVATA)]]></author>
			<pubDate>Sun, 03 Jun 2012 20:23:34 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60730#p60730</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60729#p60729</link>
			<description><![CDATA[<div class="quotebox"><cite>RUVATA пишет:</cite><blockquote><p>С нетерпением жду РЕВАНШ</p></blockquote></div><p>Реванша не будет. Я не ставил цель сделать полноценный скрипт лучше чем у Вас. Я хотел показать, что можно было писать проще, понятнее и компактнее. То что я написал, это всего лишь сырой набросок того, что надо еще исправлять, улучшать и усложнять. В настоящее время функция может подгружать (на самом деле эмулировать, так же как и Ваша) внешний файл только на первом уровне. Вложенные (каскадные) подключения не реализованы. С чем Ваш скрипт оригинально справляется в рамках заданных правил кодирования. Но он пасует, когда (и не только !!!) скрипт будет подключен так (одинарные кавычки вместо двойных):<br /></p><div class="codebox"><pre><code>jsImport.include(&#039;\\Embedded\\Embedded2.js&#039;)</code></pre></div><p>Ваш скрипт реализует сложную систему обращения к внешним ресурсам:<br /></p><div class="quotebox"><cite>RUVATA пишет:</cite><blockquote><p>1) если необходимо подключить скрипт из той-же директории, то вид должен быть следующий<br />&quot;\\имя_скрипта.js&quot;<br />...</p></blockquote></div><p>На самом деле - это обращение к файлу,, расположенному в корневой директории текущего диска. Стандартно это выглядит так:<br /></p><div class="quotebox"><blockquote><p>файл из текущего каталога<br />filename.ext<br />.\filename.ext</p><p>файл из дочернего каталога<br />child\filename.ext</p><p>файл из родительского каталога<br />..\filename.ext</p><p>прямой доступ к файлу по абсолютному пути (без указания имени диска - значит в пределах текущего диска)<br />c:\dir1\dir2\filename.ext<br />\dir1\dir2\filename.ext</p><p>прямой доступ к файлу по относительному пути<br />..\dir2\filename.ext</p></blockquote></div><p>Выдуманный Вами способ доступа к объектам ФС сложный и запутанный. Полагаю, что Вы сами запутались в своих тестах. Полагаю, что Вам следует лучше готовится к подобного рода тестам и тщательно проверять сообщения об ошибках. <br /></p><div class="quotebox"><cite>RUVATA пишет:</cite><blockquote><p>получаем ошибку &quot;WOW - определение отсутствует&quot;</p></blockquote></div><p>такой ошибки не получите, потому что скрипт завершился с ошибкой, возникшей выше по тексту. Исправьте <strong>s/reqire/require/g</strong> и повторите свои тесты.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sun, 03 Jun 2012 18:37:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60729#p60729</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60671#p60671</link>
			<description><![CDATA[<p>Отлично, давайте бадаться... <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /> (по доброму, кодо-дескутировать)</p><p>Давайте же сравнивать... да начнется шоу!</p><p><strong>1)</strong> Строк кода (без пустых строк, с построчно раскрытыми блоками)<br />&nbsp; &nbsp; &nbsp;<strong>JScriptInclude</strong>&nbsp; - 60 строк&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp;<strong>&quot;функция эмуляции подключения...&quot;</strong> - 24 строки<br /><span class="bbu">JScriptInclude</span> - 0 баллов <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /><br /><span class="bbu">&quot;функция эмуляции подключения...&quot; </span>- 5 баллов <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /> (я бы даже 10 дал, но мы же по честному)</p><p><strong>2.1)</strong> Возможность использования абсолютного пути <br />Запускаем скрипт в каталоге D:\Main\test.js пытаемся подключить D:\Main\Embedded\Embedded.js с содержимым<br /></p><div class="codebox"><pre><code>var WOW = &quot;WOW it&#039;s work&quot;</code></pre></div><p><strong>JScriptInclude</strong>&nbsp; - Да&nbsp; &nbsp;<br /></p><div class="codebox"><pre><code>jsImport.include(&quot;D:\\MainDir\\Embedded\\Embedded.js&quot;)
eval(jsImport.initialization)
WScript.Echo(WOW)</code></pre></div><p><strong>&quot;функция эмуляции подключения...&quot;</strong> - Судя по всему&nbsp; - Да, но толку нет<br /></p><div class="codebox"><pre><code>reqire(&quot;D:\\MainDir\\Embedded\\Embedded.js&quot;)
eval(reqire.cache)
WScript.Echo(WOW)</code></pre></div><p>- получаем ошибку &quot;WOW - определение отсутствует&quot;<br /><span class="bbu">JScriptInclude</span> - 5 баллов <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /><br /><span class="bbu">&quot;функция эмуляции подключения...&quot; </span>- 0 баллов <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p><p>2.2) Возможность подключения скриптов из родительского каталога<br />Запускаем скрипт в каталоге D:\Main\test.js пытаемся подключить D:\Main\Embedded.js с содержимым<br /></p><div class="codebox"><pre><code>var WOW = &quot;WOW it&#039;s work&quot;</code></pre></div><p><strong>JScriptInclude</strong>&nbsp; - Да&nbsp; &nbsp;<br /></p><div class="codebox"><pre><code>jsImport.include(&quot;\\Embedded.js&quot;)
eval(jsImport.initialization)
WScript.Echo(WOW)</code></pre></div><p><strong>&quot;функция эмуляции подключения...&quot;</strong> - Судя по всему&nbsp; - Да, но толку нет<br /></p><div class="codebox"><pre><code>reqire(&quot;Embedded.js&quot;)
eval(reqire.cache)
WScript.Echo(WOW)</code></pre></div><p>- получаем ошибку &quot;WOW - определение отсутствует&quot;<br /><span class="bbu">JScriptInclude</span> - 5 баллов <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /><br /><span class="bbu">&quot;функция эмуляции подключения...&quot; </span>- 0 баллов <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p><p>2.3) Возможность подключения скриптов из дочернего каталога (вверх по лесу/древу каталогов)<br />Запускаем скрипт в каталоге D:\Main\test.js пытаемся подключить D:\Main\Embedded\Embedded.js с содержимым<br /></p><div class="codebox"><pre><code>var WOW = &quot;WOW it&#039;s work&quot;</code></pre></div><p><strong>JScriptInclude</strong>&nbsp; - Да&nbsp; &nbsp;<br /></p><div class="codebox"><pre><code>jsImport.include(&quot;\\Embedded\\Embedded.js&quot;)
eval(jsImport.initialization)
WScript.Echo(WOW)</code></pre></div><p><strong>&quot;функция эмуляции подключения...&quot;</strong> - Судя по всему НЕТ<br /></p><div class="codebox"><pre><code>reqire(&quot;Embedded.js&quot;)
eval(reqire.cache)
WScript.Echo(WOW)</code></pre></div><p>- пробовал и &quot;\\Embedded\\Embedded.js&quot; и &quot;Embedded\\Embedded.js&quot; и все равно ошибка &quot;File not found D:\Embedded\Embedded.js&quot; <br />ладно, не удивляемся идем дальше.<br /><span class="bbu">JScriptInclude</span> - 5 баллов <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /><br /><span class="bbu">&quot;функция эмуляции подключения...&quot; </span>- 0 баллов <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p><p>2.3) Возможность подключения скриптов из родительских каталогов (вниз по лесу/древу каталогов)<br />Запускаем скрипт в каталоге D:\Main\test.js пытаемся подключить D:\Embedded.js с содержимым<br /></p><div class="codebox"><pre><code>var WOW = &quot;WOW it&#039;s work&quot;</code></pre></div><p><strong>JScriptInclude</strong>&nbsp; - Да&nbsp; &nbsp;<br /></p><div class="codebox"><pre><code>jsImport.include(&quot;.\\Embedded.js&quot;)
eval(jsImport.initialization)
WScript.Echo(WOW)</code></pre></div><p><strong>&quot;функция эмуляции подключения...&quot;</strong> - НЕТ, она такую плюшку даже не предусматривает.<br /><span class="bbu">JScriptInclude</span> - 5 баллов <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /><br /><span class="bbu">&quot;функция эмуляции подключения...&quot; </span>- 0 баллов <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p><p><strong>3)</strong> Возможность каскадного импорта библиотек, т.е. импорт скриптов, которые подключаю другие скрипты через тот-же синтаксис, и механизм<br />Запускаем скрипт в каталоге D:\Main\test.js пытаемся подключить D:\Embedded.js с содержимым<br /></p><div class="codebox"><pre><code>jsImport.include(&quot;\\Embedded\\Embedded2.js&quot;) // D:\Main\Embedded\Embedded2.js - содержимое var WOW2 = &quot;WOW2 it&#039;s work&quot;
var WOW = &quot;WOW it&#039;s work&quot;</code></pre></div><p><strong>JScriptInclude</strong>&nbsp; - Да&nbsp; &nbsp;<br /></p><div class="codebox"><pre><code>jsImport.include(&quot;.\\Embedded.js&quot;)
eval(jsImport.initialization)
WScript.Echo(WOW)
WScript.Echo(WOW2)</code></pre></div><p><span class="bbu">JScriptInclude</span> - 5 баллов <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /><br /><span class="bbu">&quot;функция эмуляции подключения...&quot; </span>- 0 баллов <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p><p><a href="https://docs.google.com/open?id=0B9Qk-Y-8nzlKZGtUZFlVZmFzQXM">примеры</a> обоих скриптов с окружением для теста - дабы не быть голословным </p><p>итак подведем итоги: <br /><span class="bbu">JScriptInclude</span> - 25 баллов <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /><br /><span class="bbu">&quot;функция эмуляции подключения...&quot; </span>- 5 баллов <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /> (Учитывая что вообще ни разу не сделала то для чего предназначалась)</p><p>С нетерпением жду РЕВАНШ ! <img src="//forum.script-coding.com/img/smilies/lol.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (RUVATA)]]></author>
			<pubDate>Fri, 01 Jun 2012 23:20:20 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60671#p60671</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60670#p60670</link>
			<description><![CDATA[<div class="codebox"><pre><code>
/**
 * Функция эмуляции подключения файлов. Читает содержимое заданного файла. 
 * Если такой файл уже был &quot;подключен&quot;, то повторно чтение не производится. 
 *
 * В случае отсутствия файла вызывается встроенная функция require.error, 
 * которая (по умолчанию) бросает исключение с текстом об ошибке. При 
 * необходимости эту функцию можно переопределить. 
 *
 * Содержимое файла кешируется в переменной require.cache и передается 
 * функции eval для окончательного подключения всех загруженных файлов. 
 *
 * Пример:
 * require(&#039;A.js&#039;);
 * require(&#039;B.js&#039;);
 * eval(require.cache);
 *
 * @param  String   имя файла	
 * @param  Integer  формат открываемого файла
 *                  -2 - открыть используя системные настройки
 *                  -1 - открыть файл как Unicode
 *                   0 - открыть файл как ASCII (по умолчанию)
 */
function require(filespec, format)
{
	var fso = require.fso = require.fso || new ActiveXObject(&#039;Scripting.FileSystemObject&#039;);

	var filespec = fso.GetAbsolutePathName(filespec);

	if ( require.files.hasOwnProperty(filespec) ) {
		return;
	}

	if ( ! fso.FileExists(filespec) ) {
		require.error(&#039;File not found: &quot;&#039; + filespec + &#039;&quot;&#039;);
		return;
	}

	var content;
	
	var e;
	try {
		var h = fso.OpenTextFile(filespec, 1, false, format || 0);
		content = h.ReadAll();
		h.Close();
	} catch (e) {
		require.error(e.message);
		return;
	}

	require.files[filespec] = 1;
	require.cache = [require.cache, &#039;//!required: &#039; + filespec, content].join(&#039;\n&#039;);
};

/**
 * Функция бросает исключение. Вызывается при созникновении ошибок. 
 *
 * @param  String   текст ошибки
 */
require.error = function(msg)
{
	throw new Error(msg);
};

/**
 * Хэш, хранит список подключенных файлов. Используется для внутренних целей 
 * функцией require. 
 *
 * @var  Object
 */
require.files = {};

/**
 * Строковая переменная, хранит содержимое всех подключенных файлов. 
 * Значение переменной передается функции eval для окончательного подключения 
 * всех загруженных файлов. 
 *
 * @var  String
 */
require.cache = &#039;&#039;;</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 01 Jun 2012 22:17:38 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60670#p60670</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60668#p60668</link>
			<description><![CDATA[<p>Rumata, согласен <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /><br />можете предложить более лаконичный вариант ? я был бы рад... (и наверное не один я)</p><p>PS: код действительно сыроват... но с поставленной задачей справляется, не так ли ?<br />Если у меня дойдут руки - перепишу, нет, так может кто ни будь другой подсобит...<br />Тем более за неимением альтернатив - и в таком виде штука вполне пригодная (ИМХО)<br />Я ее реализовывал в первую очередь для собственных нужд, меня собственно и первый<br />вариант вполне себе устраивал...</p><p>PPS: </p><div class="quotebox"><blockquote><p>для такой простой задачи как прочитать внешний файл и выполнить его</p></blockquote></div><p>ИМХО - излишне критично, и предвзято...<br />просто прочитать файл и выполнить - это две строки кода<br /></p><div class="codebox"><pre><code>
var Sourse = fso.OpenTextFile(&quot;какой-то файл&quot;).ReadAll();
eval(Sourse)</code></pre></div><p>а раз я использовал 60 - строк, наверное на то есть причины... мне не хочется верить что здесь<br />меня принимают совсем за дурака <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /><br />код не подвергался ни оптимизации, ни адаптации... в основном для удобства отладки писался<br />более развернуто... (вменяемого дебагера для WSH-скриптов кроме как тащить себе монстра VisualStudio <br />я не нашел, хотя и не искал особо).</p><p>Оправдываюсь как маленький, честное слово, но я тут у Вас человек новый... <img src="//forum.script-coding.com/img/smilies/neutral.png" width="15" height="15" /> маленьким можно <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (RUVATA)]]></author>
			<pubDate>Fri, 01 Jun 2012 21:40:19 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60668#p60668</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60667#p60667</link>
			<description><![CDATA[<p>Очень много кода и много мусора (LoadedLibs, AlreadyLoaded и прочие глобальные объекты) для такой простой задачи как прочитать внешний файл и выполнить его.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 01 Jun 2012 21:31:05 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60667#p60667</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScriptInclude Gear - Механизм каскадного импорта скриптов/библиотек.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60664#p60664</link>
			<description><![CDATA[<p>Ура, Ура, Ура !!!<br />Возрадуйтесь товарищи <img src="//forum.script-coding.com/img/smilies/lol.png" width="15" height="15" /><br />готово - <a href="https://docs.google.com/open?id=0B0wnpMigiMOFOWpmdDg5emtrVGc">вот</a> Вам пример, новой инкарнации моего механизма <strong>JScriptInclude</strong>... распаковываем =&gt; заходим в <strong>MainDir</strong> =&gt; стартуем <strong>mainScript.js </strong>(наслаждаемся <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" />)<br />Теперь все подключаемое импортируется прямо в глобальный [[scope]](это скрытый объект-хранилище доступных сущностей &quot;область видимости&quot;, для тех кто ECMA не читал <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /> ), <br />Как и обещал - победил неудобство &quot;инкогнито&quot; объявления сущностей без ключевого слова <strong>var</strong> в основной стек <img src="//forum.script-coding.com/img/smilies/cool.png" width="15" height="15" /><br />цена сией победы, требование к выполнению <strong>eval(jsImport.initialization)</strong>, после описания подключений в вызывающем скрипте. <br />Есть лишь определенные требования к описанию относительных путей:<br />1) если необходимо подключить скрипт из той-же директории, то вид должен быть следующий<br />&quot;<strong>\\</strong>имя_скрипта<strong>.js</strong>&quot;<br />2) вглубь по лесу(древу каталогов), соответсвенно вида<br />&quot;<strong>\\</strong>каталог_вглубь<strong>\\</strong>имя_скрипта<strong>.js</strong>&quot;<br />3) вверх по лесу(древу каталогов), обозначается добавлением предшествующих точек, количество точек прямо пропорционально количеству шагов вверх по дереву каталогов, т.е.<br /><strong>...\\</strong>имя_скрипта<strong>.js</strong> выводит нас на три каталога вверх от родительского, например при <br />расположении вызывающего<strong> jsImport.include(&quot;...\\test.js&quot;)</strong> расположенного в <strong>D:\1\2\3\4\5\</strong><br />механизм будет пытаться импортировать <strong>D:\1\2\test.js</strong> </p><p>Желательно описывать сам механизм имменно в вызывающем скрипте, хотя если вы заметили написан он таким образом,<br />что даже если он и будет в подключаемом скрипте, ничего не произойдет.</p><p>Прошу Вас протестировать, сие ноу-хау <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /> ну и соответственно, если все &quot;бэнч!&quot;, то переписываю первый пост в теме.</p><p>Вот листинг <strong>mainScript.js</strong>, код механизма в таком виде занимает <strong>2,8 Кб</strong><br /></p><div class="codebox"><pre><code>
if (typeof jsImport == &quot;undefined&quot;){var jsImport = new Object(); jsImport.initialization = &quot;&quot;;};
if (typeof fso == &quot;undefined&quot;){var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;)};
if (typeof LoadedLibs == &quot;undefined&quot;){var LoadedLibs = []};
if (typeof SourseBuffer == &quot;undefined&quot;){SourseBuffer = [];}
 
 if(typeof  jsImport.include !== &quot;function&quot;){
        jsImport.include = function (TargetScript, ParentDir){
			if (typeof ParentDir == &quot;undefined&quot;){ParentDir = WScript.ScriptFullName.replace(/[^\\]+$/, &#039;&#039;);};
		 
			PathValidation(ParentDir)		
 
            for (i in LoadedLibs){
                if(i == TargetScript){AlreadyLoaded = true}
            };
 
            if(typeof AlreadyLoaded == &#039;undefined&#039; || AlreadyLoaded !== true){
                if(fso.FileExists(TargetScript)){				
                    var SourseBuffer = fso.OpenTextFile(TargetScript).ReadAll();
					var includeArray = includePharser()
					jsImport.initialization =  jsImport.initialization + SourseBuffer 										
						if(includeArray.length != 0){					
							for(i in includeArray){	
								jsImport.include(includeArray[i].replace(/\\\\/, &quot;\\&quot;), TargetScript.replace(/[^\\]+$/,&quot;&quot;))						
							};
						};					
					LoadedLibs.push(TargetScript)
					AlreadyLoaded = false;
                } else { 				
                    WScript.Echo(&quot;Target &quot; + TargetScript + &quot; not found&quot;)					
                };
 
                 function StepOutside(outside){
                    return outside.substring(0, outside.lastIndexOf(&quot;\\&quot;))
                };				
				
				function includePharser(){
					var pattern =  /jsImport.include\(&quot;(.*?)&quot;\)/g;
					var result;
					var includeArray = [];					
						while ( (result = pattern.exec(SourseBuffer)) != null) {
							includeArray.push(result[1])
							SourseBuffer = SourseBuffer.replace(result[0],&quot;&quot;)
							pattern.lastIndex = 0
						};
					return includeArray;
				};
				
				function PathValidation(ParentDir){		
					if(TargetScript.charAt(1) !== &quot;:&quot;){
						var dot = TargetScript.charAt(0)					   
						if(dot  == &quot;.&quot;){
							var OutsidePath = ParentDir, counter= -1;                    		 
								while(dot == &quot;.&quot;){
									counter++
									dot = TargetScript.charAt(counter);
									OutsidePath = StepOutside(OutsidePath);
								};		 
							TargetScript = OutsidePath + TargetScript.substring(counter);
							dot = &quot;undefined&quot;; counter = &quot;undefined&quot;; OutsidePath = &quot;undefined&quot;; AlreadyLoaded = &#039;undefined&#039;;
						} else {
							TargetScript = ParentDir + TargetScript.substring(1)
						};
					};
				};
				
            };
 
        };
    };
 
jsImport.include(&quot;\\EmbeddedDir\\EmbeddedScript.js&quot;)
jsImport.include(&quot;\\SecondIncludeTest.js&quot;)
eval(jsImport.initialization)
 
SecondIncludeFunction()
OutsideFunction()
EmbeddedFunction()
WScript.Echo(Embedded.Constant)
WScript.Echo(Embedded3)</code></pre></div><p>И минимизированный вариант кода механизма (для тех кому глаз режет <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />) код механизма в таком виде занимает <strong>2,05 Кб</strong><br /></p><div class="codebox"><pre><code>
if(typeof jsImport==&quot;undefined&quot;){var jsImport=new Object();jsImport.initialization=&quot;&quot;};if(typeof fso==&quot;undefined&quot;){var fso=new ActiveXObject(&quot;Scripting.FileSystemObject&quot;)};if(typeof LoadedLibs==&quot;undefined&quot;){var LoadedLibs=[]};if(typeof SourseBuffer==&quot;undefined&quot;){SourseBuffer=[]}if(typeof jsImport.include!==&quot;function&quot;){jsImport.include=function(TargetScript,ParentDir){if(typeof ParentDir==&quot;undefined&quot;){ParentDir=WScript.ScriptFullName.replace(/[^\\]+$/,&#039;&#039;)};PathValidation(ParentDir);for(i in LoadedLibs){if(i==TargetScript){AlreadyLoaded=true}};if(typeof AlreadyLoaded==&#039;undefined&#039;||AlreadyLoaded!==true){if(fso.FileExists(TargetScript)){var SourseBuffer=fso.OpenTextFile(TargetScript).ReadAll();var includeArray=includePharser();jsImport.initialization=jsImport.initialization+SourseBuffer;if(includeArray.length!=0){for(i in includeArray){jsImport.include(includeArray[i].replace(/\\\\/,&quot;\\&quot;),TargetScript.replace(/[^\\]+$/,&quot;&quot;))}};LoadedLibs.push(TargetScript);AlreadyLoaded=false}else{WScript.Echo(&quot;Target &quot;+TargetScript+&quot; not found&quot;)};function StepOutside(outside){return outside.substring(0,outside.lastIndexOf(&quot;\\&quot;))};function includePharser(){var pattern=/jsImport.include\(&quot;(.*?)&quot;\)/g;var result;var includeArray=[];while((result=pattern.exec(SourseBuffer))!=null){includeArray.push(result[1]);SourseBuffer=SourseBuffer.replace(result[0],&quot;&quot;);pattern.lastIndex=0};return includeArray};function PathValidation(ParentDir){if(TargetScript.charAt(1)!==&quot;:&quot;){var dot=TargetScript.charAt(0);if(dot==&quot;.&quot;){var OutsidePath=ParentDir,counter=-1;while(dot==&quot;.&quot;){counter++;dot=TargetScript.charAt(counter);OutsidePath=StepOutside(OutsidePath)};TargetScript=OutsidePath+TargetScript.substring(counter);dot=&quot;undefined&quot;;counter=&quot;undefined&quot;;OutsidePath=&quot;undefined&quot;;AlreadyLoaded=&#039;undefined&#039;}else{TargetScript=ParentDir+TargetScript.substring(1)}}}}}};</code></pre></div><p>ну и для совсем минималисов-параноиков минимализированный и обфусцированный, код механизма в таком виде занимает - <strong>1,66 Кб</strong><br /></p><div class="codebox"><pre><code>eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&#039;&#039;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#039;&#039;.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return&#039;\\w+&#039;};c=1};while(c--){if(k[c]){p=p.replace(new RegExp(&#039;\\b&#039;+e(c)+&#039;\\b&#039;,&#039;g&#039;),k[c])}}return p}(&#039;3(7 6==&quot;5&quot;){4 6=D O();6.o=&quot;&quot;};3(7 k==&quot;5&quot;){4 k=D V(&quot;M.G&quot;)};3(7 l==&quot;5&quot;){4 l=[]};3(7 8==&quot;5&quot;){8=[]}3(7 6.j!==&quot;d&quot;){6.j=d(2,a){3(7 a==&quot;5&quot;){a=u.F.h(/[^\\\\]+$/,\&#039;\&#039;)};x(a);C(i y l){3(i==2){f=w}};3(7 f==\&#039;5\&#039;||f!==w){3(k.H(2)){4 8=k.I(2).J();4 9=s();6.o=6.o+8;3(9.E!=0){C(i y 9){6.j(9[i].h(/\\\\\\\\/,&quot;\\\\&quot;),2.h(/[^\\\\]+$/,&quot;&quot;))}};l.A(2);f=R}z{u.S(&quot;T &quot;+2+&quot; U Q&quot;)};d t(n){B n.r(0,n.P(&quot;\\\\&quot;))};d s(){4 p=/6.j\\(&quot;(.*?)&quot;\\)/g;4 m;4 9=[];v((m=p.L(8))!=K){9.A(m[1]);8=8.h(m[0],&quot;&quot;);p.N=0};B 9};d x(a){3(2.q(1)!==&quot;:&quot;){4 e=2.q(0);3(e==&quot;.&quot;){4 c=a,b=-1;v(e==&quot;.&quot;){b++;e=2.q(b);c=t(c)};2=c+2.r(b);e=&quot;5&quot;;b=&quot;5&quot;;c=&quot;5&quot;;f=\&#039;5\&#039;}z{2=a+2.r(1)}}}}}};&#039;,58,58,&#039;||TargetScript|if|var|undefined|jsImport|typeof|SourseBuffer|includeArray|ParentDir|counter|OutsidePath|function|dot|AlreadyLoaded||replace||include|fso|LoadedLibs|result|outside|initialization|pattern|charAt|substring|includePharser|StepOutside|WScript|while|true|PathValidation|in|else|push|return|for|new|length|ScriptFullName|FileSystemObject|FileExists|OpenTextFile|ReadAll|null|exec|Scripting|lastIndex|Object|lastIndexOf|found|false|Echo|Target|not|ActiveXObject&#039;.split(&#039;|&#039;),0,{}))</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (RUVATA)]]></author>
			<pubDate>Fri, 01 Jun 2012 20:33:11 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60664#p60664</guid>
		</item>
	</channel>
</rss>
