2016-01-08 55 views
0

我想讀取模板,然後讀入零個或多個包含要注入模板的內容的文件。模板和內容都在Markdown中。從它看起來像Swig reasearch少量將會提供一個輕量級的標記,我可以使用Gulp:從磁盤讀取內容以插入模板

產生的功能將是這個樣子:

function assembleCharacterDocument(slug) { 
    return gulp.src('./templates/character-document.md') 
    .pipe(files2obj(['characters/'+slug+'/*.md'])) // read content for the character 
    .pipe(swig()) // == require('gulp-swig'); inject content into template 
    .pipe(md2pdf()) // convert Markdown to PDF - outside scope of this question 
    .pipe(gulp.dest('./products/characters/'+slug+'.pdf')); 
}); 

由於Swig需要普通老式對象爲其更換數據,我希望每個進來的文件都有文件名作爲對象的關鍵字。因此,舉例來說,我的替換數據對象將是這個樣子:

{ 
    "bio": content of characters/{slug}/bio.md, 
    "profile": content of characters/{slug}/profile.md, 
    "timeline": content of characters/{slug}/timeline.md, 
    etc. 
} 

什麼是files2obj()的內容?

回答

0

我最終放棄了Gulp管道,直接使用fs文件系統方法來完成我的任務。 (爲簡潔起見,省略了相關性。)

var templatePath = './templates/character-document.md'; 
var sourcePath = path.join("characters",charSlug); 
var targetCombinedMarkdownPath = path.join('products',charSlug+'.md'); 

fs.readdir(sourcePath,function (err, files) { 

    if (err) { throw err; } 

    var data = {}; 
    files.forEach(function(f) { 
    var check = /^(.*).md$/.exec(f); 
    if (check) { 
     data[check[1]] = fs.readFileSync(path.join(sourcePath,f),'utf8'); 
    } 
    }); 

    var engine = swig.compileFile(templatePath); 
    var combined = engine(data); 

    fs.writeFileSync(targetCombinedMarkdownPath, combined); 

    md2pdf({ 
    title: data.name || "CHARACTER NAME MISSING", 
    source: [targetCombinedMarkdownPath], 
    targetFilename: charSlug 
    }); 

}); 
0

嘗試gulp-swig。這是一個適用於Gulp的Swig插件,可用於文件流,因此您不必構建對象或執行任何自定義操作。

他們的Github page也顯示了一個很好的例子gulp-data,這可能對您有所幫助。

+0

我在問題中說我要使用Swig。這個問題不是關於解決模板問題,而是關於如何將文件放入Swig使用的對象中。 –

+0

@JayBienvenu對不起,你鏈接到Swig。我錯過了代碼中的評論,認爲它是咕嚕咕嚕。 – fotijr

+0

@JayBienvenu和gulp-swig Github,gulp-data聽起來好像會解決你的問題。 「通過新的gulp-data插件將數據注入到您的模板中,它會根據您需要的數據創建一個file.data屬性。」 – fotijr