mirror of https://github.com/thumbsup/thumbsup
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.5 KiB
JavaScript
115 lines
3.5 KiB
JavaScript
var fs = require('fs-extra')
|
|
var path = require('path')
|
|
var async = require('async')
|
|
var less = require('less')
|
|
var template = require('./template')
|
|
|
|
var DIR_PUBLIC = path.join(__dirname, '..', '..', 'public')
|
|
var DIR_TEMPLATES = path.join(__dirname, '..', '..', 'templates')
|
|
|
|
exports.build = function (rootAlbum, opts, callback) {
|
|
// create the right renderer (theme, download path, etc...)
|
|
var renderer = template.create(opts)
|
|
|
|
function website (callback) {
|
|
// create top level gallery
|
|
var gallery = {
|
|
home: rootAlbum,
|
|
css: opts.css ? path.basename(opts.css) : null,
|
|
title: opts.title,
|
|
titleWords: opts.title.split(' '),
|
|
footer: opts.footer,
|
|
thumbSize: opts.thumbSize,
|
|
largeSize: opts.largeSize,
|
|
googleAnalytics: opts.googleAnalytics
|
|
}
|
|
// render entire album hierarchy
|
|
var tasks = renderAlbum(gallery, [], rootAlbum)
|
|
async.parallel(tasks, callback)
|
|
}
|
|
|
|
function renderAlbum (gallery, breadcrumbs, album) {
|
|
// render this album
|
|
var thisAlbumTask = renderTemplate(album.path, 'album', {
|
|
gallery: gallery,
|
|
breadcrumbs: breadcrumbs,
|
|
album: album
|
|
})
|
|
var tasks = [thisAlbumTask]
|
|
// and all nested albums
|
|
album.albums.forEach(function (nested) {
|
|
var nestedAlbumsTasks = renderAlbum(gallery, breadcrumbs.concat([album]), nested)
|
|
Array.prototype.push.apply(tasks, nestedAlbumsTasks)
|
|
})
|
|
return tasks
|
|
}
|
|
|
|
function renderTemplate (targetPath, templateName, data) {
|
|
// render a given HBS template
|
|
var fullPath = path.join(opts.output, targetPath)
|
|
var targetFolder = path.dirname(targetPath)
|
|
var contents = renderer.render(templateName, data, targetFolder)
|
|
return function (next) {
|
|
fs.mkdirpSync(path.dirname(fullPath))
|
|
fs.writeFile(fullPath, contents, next)
|
|
}
|
|
}
|
|
|
|
function support (callback) {
|
|
// copy all external JS/CSS
|
|
var dest = path.join(opts.output, 'public')
|
|
fs.copy(DIR_PUBLIC, dest, callback)
|
|
}
|
|
|
|
function lightGallery (callback) {
|
|
// note: this module might be deduped
|
|
// so we can't assume it's in the local node_modules
|
|
var lgPackage = require.resolve('lightgallery/package.json')
|
|
var src = path.join(path.dirname(lgPackage), 'dist')
|
|
var dest = path.join(opts.output, 'public', 'light-gallery')
|
|
fs.copy(src, dest, callback)
|
|
}
|
|
|
|
function videoJS (callback) {
|
|
var src = nodeModulePath('video.js', 'dist')
|
|
var dest = path.join(opts.output, 'public', 'videojs')
|
|
fs.mkdirsSync(dest)
|
|
try {
|
|
fs.copySync(path.join(src, 'video.js'), path.join(dest, 'video.js'))
|
|
fs.copySync(path.join(src, 'video-js.min.css'), path.join(dest, 'video-js.min.css'))
|
|
fs.copySync(path.join(src, 'font'), path.join(dest, 'font'))
|
|
} catch (ex) {
|
|
return callback(ex)
|
|
}
|
|
callback()
|
|
}
|
|
|
|
function renderStyles (callback) {
|
|
var themeFile = path.join(DIR_TEMPLATES, 'themes', opts.theme, 'theme.less')
|
|
var themeLess = fs.readFileSync(themeFile, 'utf-8')
|
|
if (opts.css) {
|
|
themeLess += '\n' + fs.readFileSync(opts.css, 'utf-8')
|
|
}
|
|
less.render(themeLess, function (err, output) {
|
|
if (err) return callback(err)
|
|
var dest = path.join(opts.output, 'public', 'style.css')
|
|
fs.writeFile(dest, output.css, callback)
|
|
})
|
|
}
|
|
|
|
async.series([
|
|
support,
|
|
website,
|
|
lightGallery,
|
|
videoJS,
|
|
renderStyles
|
|
], function (err) {
|
|
callback(err)
|
|
})
|
|
}
|
|
|
|
function nodeModulePath (pkg, file) {
|
|
var packagePath = require.resolve(`${pkg}/package.json`)
|
|
return path.join(path.dirname(packagePath), file)
|
|
}
|