2014-07-25 3 views
1

Я пишу небольшое приложение CMS, используя NodeJS и Jade. По разным причинам я хочу хранить файлы шаблонов Jade в базе данных (например, MongoDB), а не на диске.Как продлить шаблоны Jade, которые не хранятся на диске?

Это прекрасно работает для простого, автономного шаблона Jade: я могу просто получить строку Jade из базы данных и jade.compile.

Однако, если шаблон extends еще один шаблон, я, кажется, вынужден хранить мои шаблоны на диске. От jade.js:

parseExtends: function(){ 
    var fs = _dereq_('fs'); 

    var path = this.resolvePath(this.expect('extends').val.trim(), 'extends'); 
    if ('.jade' != path.substr(-5)) path += '.jade'; 

    var str = fs.readFileSync(path, 'utf8'); 
    ... 

Так extends ключевое слово явно предполагает, что расширенный шаблон хранится на диске.

Что является самым простым способом позволить шаблонам Jade расширять другие шаблоны, которые хранятся в базе данных - или в любом другом репозитории?

+0

Я хотел бы разветвить проект Jade из github и реализовать его функциональность, иначе вы можете получить запрос – InferOn

ответ

2

Кажется, что это может быть выполнено by overriding parseExtends and parseImports.

Однако вам потребуется какое-то синхронное хранилище, так как Jade делает всю компиляцию синхронно. То есть никаких обратных вызовов.

я в конце концов «решил» это путем предварительной выборки всех шаблонов и хранить их в templateMap объекте:

{ 
    "path": "/templates/frontpage.jade", 
    "content": "<html><body>Here's some Jade</body></html>" 
}, 
... 

Тогда перекрывая parseExtends и parseImports так, что они ищут пути шаблона в templateMap, а не на диске :

jade.Parser.prototype.parseExtends = function() { 
    var path = this.expect('extends').val.trim(); 
    path = Path.normalize(path).replace("\\", "/"); // Necessary on Windows 
    var self = this; 
    var str = templatesMap[path]; 
    if (!str) { 
     return callback(new RendererError("Could not find template " + path)); 
    } 
    var parser = new this.constructor(str, path, this.options); 

    parser.blocks = this.blocks; 
    parser.contexts = this.contexts; 
    self.extending = parser; 
    return new Nodes.Literal(''); 
} 
Смежные вопросы