Blame view

mustache/js/index.js 3.7 KB
5a739853   patrick.he   commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  var arg = require('argh').argv; //read & parse arguements
  var engine_name = "hogan";//('engine' in arg && arg['engine'] == "mustache") ? "mustache" : "hogan";//hogan or mustache
  var engine = require("hogan.js")//require(engine_name == "hogan" ? "hogan.js" : "mustache")
    , fs    = require('fs')
    , extend= require('xtend')
    , AutoLoader = require('./classes/autoload-'+engine_name+'.js');
  
  var output_folder = 'output_folder' in arg ? arg['output_folder'] : 'output'
  
  var path_parts = output_folder.split(/[\\\/]/g);
  var new_folder = '';
  for(var p in path_parts) {
    var tmp = path_parts[p].replace(/^\s+/g, '').replace(/\s+$/g, '');
    new_folder = new_folder + tmp + "/";
    if( !fs.existsSync(__dirname+'/'+new_folder) ) fs.mkdir(__dirname+'/'+new_folder);
  }
  
  
  var compressor;
  try {
  	compressor = "compress" in arg && require('yuicompressor');
  } catch(e) {
  	compressor = null;//unable to resolve, means yuicompressor is not available
  }
  
  var path = 
  {
   data : __dirname + '/../app/data',
   views : __dirname + '/../app/views',
   base : '..',
   assets : '../assets',
   images : '../assets/images',
   minified: ''
  }
  
  for(var p in path) {
  	if ('path_'+p in arg) path[p] = arg['path_'+p]
  }
  
  
  var site = JSON.parse(fs.readFileSync(path['data']+'/common/site.json' , 'utf-8'));//this site some basic site variables
  site['protocol'] = 'http:'
  //override config file with command line options
  for(var k in site) {
  	if (k in arg) site[k] = arg[k]
  }
  if(site['protocol'] == false) site['protocol'] = '';
  
  
  
  var Sidenav_Class = require('./classes/Sidenav')
  var sidenav = new Sidenav_Class()
  
  var Page_Class = require('./classes/Page')
  var Indentation = require('./classes/Indent')
  var autoload = new AutoLoader(engine , path);
  
  if(site['development'] == true) {
   site['ace_scripts'] = [];
   var scripts = JSON.parse(fs.readFileSync(__dirname + '/../../assets/js/ace/scripts.json' , 'utf-8'));
   if(site['ajax'] == true) scripts['ace.ajax-content.js'] = true;
   for(var name in scripts)
     if(scripts.hasOwnProperty(name) && scripts[name] == true) {
  	 site['ace_scripts'].push(name);
     }
  }
  
  
  
  //iterate over all pages and generate the static html file
  var page_views_folder = path["views"]+"/pages";
  if(fs.existsSync(page_views_folder) && (stats = fs.statSync(page_views_folder)) && stats.isDirectory()) {
  	var files = fs.readdirSync(page_views_folder)
  	files.forEach(function (name) {
  		var filename;//file name, which we use as the variable name
  		if (! (filename = name.match(/(.+?)\.(mustache|html)$/)) ) return;
  		var page_name = filename[1];
  		
  		generate(page_name);
  	})
  }
  
  
  function generate(page_name) {
  	var page = new Page_Class( {'engine':engine, 'path':path, 'name':page_name, 'type':'page', 'compressor': compressor} );
  	page.initiate(function() {
  		var layout_name = page.get_var('layout');
  		var layout = new Page_Class( {'engine':engine, 'path':path, 'name':layout_name, 'type':'layout'} );
  		layout.initiate();
  		if(layout.get_var('sidebar_items'))
  		{
  			sidenav.set_items(layout.get_var('sidebar_items'));
  			sidenav.mark_active_item(page_name);
  		}
  
  
  		var context = { "page":page.get_vars() , "layout":layout.get_vars(), "path" : path , "site" : site }
  		context['breadcrumbs'] = sidenav.get_breadcrumbs();
  		context['createLinkFunction'] = function() {
  			return function(text) {
  				return text+'.html';
  			}
  		}
  
  		autoload.set_params(page.get_name() , layout_name);
  
  		var rendered_output = layout.get_template().render(context);//engine_name == "hogan" ? layout.get_template().render(context) : (layout.get_template())(context)
  		Indentation(rendered_output , site['onpage_help'], false, function(result) {
  			var output_file = output_folder+'/'+page_name+'.html';
  			fs.writeFileSync( __dirname + '/'+output_file , result, 'utf-8' );
  			console.log(output_file);
  		})
  	});
  
  }