1+ const ejs = require ( "ejs" ) ;
2+ const fs = require ( "fs-extra" ) ;
3+ const parsePath = require ( 'parse-filepath' ) ;
4+ const matter = require ( 'gray-matter' ) ;
5+ const TemplateRender = require ( "./TemplateRender" ) ;
6+ const Layout = require ( "./Layout" ) ;
7+
8+ const cfg = require ( "../config.json" ) ;
9+
10+ function Template ( path , globalData ) {
11+ this . path = path ;
12+ this . inputContent = this . getInput ( ) ;
13+ this . parsed = parsePath ( path ) ;
14+ this . dir = this . parsed . dir . replace ( new RegExp ( "^" + cfg . dir . templates ) , "" ) ;
15+ this . frontMatter = this . getMatter ( ) ;
16+ this . data = this . mergeData ( globalData , this . frontMatter . data ) ;
17+ this . outputPath = this . getOutputPath ( ) ;
18+ }
19+ Template . prototype . getOutputPath = function ( ) {
20+ return cfg . dir . output + "/" + ( this . dir ? this . dir + "/" : "" ) + this . parsed . name + ".html" ;
21+ } ;
22+ Template . prototype . getInput = function ( ) {
23+ return fs . readFileSync ( this . path , "utf-8" ) ;
24+ } ;
25+ Template . prototype . getMatter = function ( ) {
26+ return matter ( this . inputContent ) ;
27+ } ;
28+ Template . prototype . mergeData = function ( globalData , pageData ) {
29+ let data = { } ;
30+ for ( let j in globalData ) {
31+ data [ j ] = globalData [ j ] ;
32+ }
33+ for ( let j in pageData ) {
34+ data [ j ] = pageData [ j ] ;
35+ }
36+ return data ;
37+ } ;
38+ Template . prototype . getPreRender = function ( ) {
39+ return this . frontMatter . content ;
40+ } ;
41+ Template . prototype . renderLayout = function ( tmpl , data ) {
42+ let layoutPath = ( new Layout ( tmpl . data . layout , cfg . dir . templates + "/_layouts" ) ) . getFullPath ( ) ;
43+
44+ console . log ( "Reading layout " + tmpl . data . layout + ":" , layoutPath ) ;
45+ let layout = new Template ( layoutPath , { } ) ;
46+ let layoutData = this . mergeData ( layout . data , data ) ;
47+ layoutData . _layoutContent = this . renderContent ( tmpl . getPreRender ( ) , data ) ;
48+ let rendered = layout . renderContent ( layout . getPreRender ( ) , layoutData ) ;
49+ if ( layout . data . layout ) {
50+ return this . renderLayout ( layout , layoutData ) ;
51+ }
52+
53+ return rendered ;
54+ } ;
55+ Template . prototype . renderContent = function ( str , data ) {
56+ return ( new TemplateRender ( this . path ) ) . getRenderFunction ( ) ( str , data ) ;
57+ } ;
58+ Template . prototype . render = function ( ) {
59+ if ( this . data . layout ) {
60+ return this . renderLayout ( this , this . data ) ;
61+ } else {
62+ return this . renderContent ( this . getPreRender ( ) , this . data ) ;
63+ }
64+ } ;
65+ Template . prototype . write = function ( ) {
66+ let err = fs . outputFileSync ( this . outputPath , this . render ( ) ) ;
67+ if ( err ) {
68+ throw err ;
69+ }
70+ console . log ( "Writing" , this . outputPath ) ;
71+ } ;
72+
73+ module . exports = Template ;
0 commit comments