动态加载玉模板

时间:2013-05-23 20:43:36

标签: view include express pug

我正在开发一个小型文档网站,内容存储在文件中。例如,我在chapter1.jade目录中有两个文件chapter2.jademodule1/

我想阅读module1/目录并动态包含其中的所有chapterX.jade个文件。

我试图做directory = fs.readDirSync('module1/'),然后在我看来:

each item in directory
  include item

但是jade include不支持动态值(即使`include#{item})也不起作用。你知道我怎么能实现这个吗?

编辑:我想在each循环下生成一些代码(锚点以便于链接),因此解决方案最好在视图中。我显然可以在包含的文件中手动添加锚点,但这并不理想。

由于

3 个答案:

答案 0 :(得分:1)

以下是我为使其发挥作用所做的简短版本。它使用jade Public API

var directory = __dirname+'/views/bla/'
  , files
  , renderedHTML = '';

if( !fs.existsSync(directory) ) {
  // directory doesn't exist, in my case I want a 404
  return res.status(404).send('404 Not found');
}

// get files in the directory
files = fs.readdirSync(directory);

files.forEach(function(file) {
  var template = jade.compile(fs.readFileSync(directory+file, 'utf8'));

  // some templating
  renderedHTML += '<section><a id="'+file+'" name="'+file+'" class="anchor">&nbsp;</a>'+template()+'</section>';
});

// render the actual view and pass it the pre rendered views
res.render('view', { 
  title: 'View',
  files: files,
  html: renderedHTML
})

视图只是呈现未转义的html变量:

div(class="component-doc-wrap")
  !{html}

答案 1 :(得分:0)

正如@ user1737909所说,用玉器是不可能的。

最好的方法(tho)是构建一个 Express Dynamic(查看)助手

在EXPRESS 3.XX中出现

检查这些:Jade - way to add dynamic includes

答案 2 :(得分:0)

除了kalemas回答,您还可以将您的包含内容写入包含在玉器中的文件。

在这个例子中,我将include包含在include_all.jade中。该文件包含在玉文件中。

如果不起作用,请检查路径; - )

e.g。 在你的app.js

var includes = "path/to/include1\n";
includes += "path/to/include2";
...
incPath = "path/to/include_all.jade";

fs.open(incPath,'w',function(err,fd){
if(err){
    throw 'error open file: ' + incPath +" "+ err;
}

var buffer = new Buffer(includes);
 fs.write(fd,buffer,0,buffer.length,null,function(err){
    if (err) 
        throw 'error writing file: ' +err;
    fs.close(fd,function(){
        console.log('file written ' + incPath);
    });
 });
});

在你的玉器文件中

include path/to/include_all.jade