UNPKG

rinco

Version:

A static website generator

219 lines (199 loc) 7.42 kB
'use strict'; var fs = require('./fs'); var config = require('./constants'); var compile = require('./compile'); var render = require('./render') var it = require('./interpreter'); var htmlmin = require('html-minifier').minify; var m = {}; var sh = require('shelljs'); require('colors'); m.generateUncss = function () { try { require('uncss'); } catch (e) { sh.echo('Ops,\nYou need to install UNCSS npm module.'.yellow); return; } sh.echo('Copying public files...'); m.public() sh.echo('[ok]'.green); sh.echo('-------------------------------------------------------'); sh.echo('Building html files...'); m.analizer(function (css, js, html) { sh.echo('[ok]'.green); sh.echo('-------------------------------------------------------'); sh.echo('Building js files...'); m.js(js); sh.echo('[ok]'.green); sh.echo('-------------------------------------------------------'); sh.echo('Building css files...'); m.css(css); sh.echo('[ok]'.green); sh.echo('-------------------------------------------------------'); sh.echo('Optimizing image files...'); sh.echo('-------------------------------------------------------'); m.img(); setTimeout(function() { m.uncss(html) }, 3000); }); }; m.generate = function () { sh.echo('Copying public files...'); m.public() sh.echo('[ok]'.green); sh.echo('-------------------------------------------------------'); sh.echo('Building html files...'); m.analizer(function (css, js, html) { sh.echo('[ok]'.green); sh.echo('-------------------------------------------------------'); sh.echo('Building js files...'); m.js(js) sh.echo('[ok]'.green); sh.echo('-------------------------------------------------------'); sh.echo('Building css files...'); m.css(css) sh.echo('[ok]'.green); sh.echo('-------------------------------------------------------'); sh.echo('Optimizing image files...'); sh.echo('-------------------------------------------------------'); m.img(); }); }; m.uncss = function (files) { var uncss = require('uncss'); sh.echo('(UNCSS) - Optimizing css file...'.yellow); files = files.map(function (file) { return fs.path.join(config.BUILD_DIR, file); }); var options = { htmlroot: '/build', timeout : 3000, ignore : ['#added_at_runtime', /test\-[0-9]+/], stylesheets : ['assets/css/style.css'], report : true }; uncss(files, options, function (error, output) { if(error) { console.log(error); return } var Clean = require('clean-css'); output = new Clean().minify(output).styles; fs.file.write(fs.path.join(config.BUILD_DIR, 'assets', 'css', 'style.css'), output); sh.echo('[ok]'.green); sh.echo('-------------------------------------------------------'); }); } m.js = function (files) { compile.tojs(files, function (js) { var uglify = require('uglify-js'); js = uglify.minify(js, {fromString: true}).code; fs.file.write(fs.path.join(config.BUILD_DIR, 'assets', 'js','script.js'), js); }); }; m.css = function (files) { compile.tocss(files, function (css) { sh.echo('Minifying css file...'); var Clean = require('clean-css'); css = new Clean().minify(css).styles; fs.file.write(fs.path.join(config.BUILD_DIR, 'assets', 'css','style.css'), css); sh.echo('[ok]'.green); sh.echo('-------------------------------------------------------'); }); }; m.public = function () { fs.dir.read(config.PUBLIC_DIR, function (file) { console.log(fs.path.join(config.BUILD_DIR, 'public', file)); console.log(file); fs.file.cp(fs.path.join(config.PUBLIC_DIR,file), fs.path.join(config.BUILD_DIR, file)); }); }; m.htmlMinify = function (str) { // return str.replace(/<!--.*-->/g, '').replace(/\s+/g, ' ').replace(/>\s+</g, '><'); return htmlmin(str, { removeAttributeQuotes: false, preserveLineBreaks:true, removeEmptyAttributes:true, removeScriptTypeAttributes:true, removeStyleLinkTypeAttributes:true, removeComments:true, collapseWhitespace:true, conservativeCollapse:true }); }; m.analizer = function (fn) { var css=[], js=[], html=[]; fs.dir.read(config.PAGES_DIR, function (filename, length, index) { config.INFO.action = 'build'; //Ignoring files if(filename[0] !== '_') { render.file(fs.path.join(config.PAGES_DIR, filename), function (content) { content = parse_template(content) content = m.link(content); fs.file.write(fs.path.join(config.BUILD_DIR, filename), m.htmlMinify(content)); html.push(filename); }, ["rinco_reload", 'rinco_css', 'rinco_js']); } if(length-1 === index) { fn.call(null, css, js, html); } }); function parse_template(content) { var files = []; [{ start:'<r-css', end:'/>'}].map(function (tag) { content = it.parse(content, tag, function (prc) { if(fs.file.exist(fs.path.join(config.CSS_DIR, prc.trim()))) { if(css.indexOf(prc.trim()) === -1) { css.push(prc.trim()); } } else { return "File: " + fs.path.join(config.CSS_DIR, prc.trim()); } return ''; }); }); [{ start:'<r-js', end:'/>'}].map(function (tag) { content = it.parse(content, tag, function (prc) { if(fs.file.exist(fs.path.join(config.JS_DIR, prc.trim()))) { if(js.indexOf(prc.trim()) === -1) { js.push(prc.trim()); } } else { return "File: " + fs.path.join(config.JS_DIR, prc.trim()); } return ''; }); }); return content; } }; m.link = function (content) { content = content.toString().replace(/(\<\/head\>)/, function (match, head) { var script = ' <link rel="stylesheet" href="' + config.USER_CONFIG.path_build + 'assets/css/style.css">'; return script + "\n" + head; }); content = content.toString().replace(/(\<\/body\>)/, function (match, body) { var script = '<script src="' + config.USER_CONFIG.path_build + 'assets/js/script.js" charset="utf-8"></script>'; return script + "\n" + body; }); return content; }; m.img = function () { var Imagemin = require('imagemin'); new Imagemin() .src(fs.path.join(config.IMG_DIR,'*.{gif,jpg,png,svg}')) .dest(fs.path.join(config.BUILD_DIR,'assets','img')) .use(Imagemin.jpegtran({progressive: true})) .use(Imagemin.gifsicle({interlaced: true})) .use(Imagemin.optipng({optimizationLevel: 3})) .use(Imagemin.svgo()) .run(function (err, files) { files.map(function (file) { console.log(file); sh.echo('[ok]'.green); }); }); }; module.exports = m;