1 (изменено: JSman, 2010-04-01 17:11:40)

Тема: JScript: хранение ресурсов в файле JScript

Довольно часто сталкиваемся с тем, что приходится в переменных хранить большие многострочные данные, которые в последующем будут использоваться в текущем js-файле без использования внешнего источника.

Рассмотрим фрагмент HTML-кода:

<html>
<head>
<title>Sample №0</title>
</head>

Стандартные способы его записи в коде:

Вариант 1:

var HTML = "<html>\
<head>\
<title>Sample №0</title>\
</head>\
";

Вариант 2:

var HTML = "<head>"+
"<title>Sample №0</title>"+
"</head>"

Вариант 3:

var HTML = ["<html>",
"<head>",
"<title>Sample №0</title>",
"</head>"].join("\n");

Я предлагаю хранить ресурсы в комментариях внутри функции:

function Resources() {
/*
<html>
<head>
<title>Sample №0</title>
</head>
<body>

</body>
</html>
*/

/*
Пример
многострочного
текста
*/
}

Эта функция содержит в себе два ресурса.

Для их извлечения воспользуемся функцией GetResource:

function GetResource(f, index)
{
    var e; 
    try {return f.toString().replace("*//*","*/ /*").split(/\/\*|\*\//)[index*2+1]} catch (e) {}
}

Параметр f — ссылка на функцию.
Параметр index — порядковый номер ресурса.

Пример использования:

function Resources() {
/*
<html>
<head>
<title>Sample №0</title>
</head>
<body>

</body>
</html>
*/

/*
Пример 
многострочного
текста
*/
}

function GetResource(o, index)
{
    var e; 
    try {return o.toString().split(/\/\*|\*\//)[index*2+1]} catch (e) {}
}

WSH.Echo(GetResource(Resources, 1));

Это был пример функции по работе с ресурсами в образовательных целях. Далее доведем эту возможность до ума.

2

Re: JScript: хранение ресурсов в файле JScript

Ресурс — это часть кода, находящегося внутри функции, начало которого маркеровано «/*[[» или «/*[имя ресурса[», а окончание — «]]*/».
Ресурсы бывают именованные и без имени. Ресурс без имени идентифицируется своим порядковым номером среди неименованных ресурсов. Индекс неименованных начинается с нуля.

Примеры ресурсов (2 ресурса без имени, а 1 с названием «код HTML»):

/*[[ресурс 0]]*/

/*[[ресурс 1]]*/

/*[код HTML[
<html>
<head>
<title>Sample №0</title>
</head>
<body>

</body>
</html>
]]*/

Доступ к таким ресурсам осуществляется двумя способами:
1. func.GetResource(ResourceName) в любом месте кода.
2. Или GetResource(ResourceName) для доступа к ресурсам текущей функции.

Function.prototype.GetResource = function (ResourceName)
{
    if (!this.Resources) 
    {
        var UnNamedResourceIndex = 0, _this = this;
        this.Resources = {};
        
        function f(match, resType, Content)
        {
            _this.Resources[(resType=="[[")?UnNamedResourceIndex++:resType.slice(1,-1)] = Content; 
        }
        this.toString().replace(/\/\*(\[(?:[^\[]+)?\[)((?:[\r\n]|.)*?)\]\]\*\//gi, f);
    }
    
    return this.Resources[ResourceName];
}

function GetResource(ResourceName)
{
    return arguments.callee.caller.GetResource(ResourceName);
}

Пример использования:

(function() {

    WSH.Echo( GetResource("код HTML"));
/*[[ресурс 0]]*/

/*[[ресурс 1]]*/

/*[код HTML[
<html>
<head>
<title>Sample №0</title>
</head>
<body>

</body>
</html>
]]*/

/*
Просто комментарий
*/
})();