snakeskin
Version:
Компилятор блочных шаблонов c поддержкой наследования.
90 lines (77 loc) • 3.37 kB
JavaScript
/*!
* API для работы с деревом шаблона
*/
/**
* Проверить наличие указанной директивы в цепочке структуры,
* начиная с активной
*
* @param {(string|!Object)} name - название директивы или таблица названий
* @param {Object=} [opt_obj=this.structure] - проверяемый объект
* @param {?boolean=} [opt_returnObj=false] - если true, то в качестве ответа
* вернётся ссылка на найденный объект (если таковой есть)
*
* @return {(boolean|string|!Object)}
*/
DirObj.prototype.has = function (name, opt_obj, opt_returnObj) {
var obj = opt_obj || this.structure;
while (true) {
let nm = obj.name;
if (name[nm] || nm === name) {
if (name[nm]) {
return opt_returnObj ? obj : nm;
}
return opt_returnObj ? obj: true;
} else if (obj.parent && obj.parent.name !== 'root') {
obj = obj.parent;
} else {
return false;
}
}
};
/**
* Проверить наличие указанной директивы в цепочке структуры
* (начальная активная директива исключается)
*
* @param {(string|!Object)} name - название директивы или таблица названий
* @param {?boolean=} [opt_returnObj=false] - если true, то в качестве ответа
* вернётся ссылка на найденный объект (если таковой есть)
*
* @return {(boolean|string|!Object)}
*/
DirObj.prototype.hasParent = function (name, opt_returnObj) {
if (this.structure.parent) {
return this.has(name, this.structure.parent, opt_returnObj);
}
return false;
};
/**
* Проверить наличие указанной директивы в цепочке блочной структуры
*
* @param {(string|!Object)} name - название директивы или таблица названий
* @param {?boolean=} [opt_returnObj=false] - если true, то в качестве ответа
* вернётся ссылка на найденный объект (если таковой есть)
*
* @return {(boolean|string|!Object)}
*/
DirObj.prototype.hasBlock = function (name, opt_returnObj) {
if (this.blockStructure) {
return this.has(name, this.blockStructure, opt_returnObj);
}
return false;
};
/**
* Проверить наличие указанной директивы в цепочке блочной структуры
* (начальная активная директива исключается)
*
* @param {(string|!Object)} name - название директивы или таблица названий
* @param {?boolean=} [opt_returnObj=false] - если true, то в качестве ответа
* вернётся ссылка на найденный объект (если таковой есть)
*
* @return {(boolean|string|!Object)}
*/
DirObj.prototype.hasParentBlock = function (name, opt_returnObj) {
if (this.blockStructure && this.blockStructure.parent) {
return this.has(name, this.blockStructure.parent, opt_returnObj);
}
return false;
};