202 lines
5.2 KiB
JavaScript
Executable File
202 lines
5.2 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
'use strict';
|
|
|
|
var PromiseA = require('bluebird')
|
|
, fs = PromiseA.promisifyAll(require('fs'))
|
|
, path = require('path')
|
|
, cli = require('cli')
|
|
, UUID = require('node-uuid')
|
|
, Desi
|
|
;
|
|
|
|
cli.parse({
|
|
blogdir: ['d', 'Where your blog is, i.e. ~/path/to/blog', 'string', './']
|
|
//, output: ['o', 'name of output directory within ~/path/to/blog', 'string', './compiled']
|
|
});
|
|
|
|
function init() {
|
|
Desi = require('desirae').Desirae;
|
|
|
|
Desi.registerDataMapper('ruhoh', require('desirae-datamap-ruhoh').DesiraeDatamapRuhoh);
|
|
Desi.registerDataMapper('ruhoh@2.6', require('desirae-datamap-ruhoh').DesiraeDatamapRuhoh);
|
|
}
|
|
|
|
function serve(blogdir) {
|
|
var http = require('http')
|
|
//, https = require('https')
|
|
, app = require('../server').create({ blogdir: blogdir })
|
|
, server
|
|
;
|
|
|
|
server = http.createServer(app).listen(65080, function () {
|
|
console.info("Listening from " + blogdir);
|
|
console.info("Listening on http://local.dear.desi:" + server.address().port);
|
|
});
|
|
//secureServer = https.createServer(app).listen(65043);
|
|
}
|
|
|
|
function build(blogdir) {
|
|
var desi = {}
|
|
, env = {}
|
|
;
|
|
|
|
env.working_path = env.blogdir = blogdir;
|
|
Desi.init(desi, env).then(function () {
|
|
env.url = desi.site.base_url + desi.site.base_path.replace(/^\/$/, '');
|
|
env.base_url = desi.site.base_url;
|
|
env.base_path = desi.site.base_path;
|
|
env.compiled_path = 'compiled';
|
|
//env.since = 0;
|
|
|
|
Desi.buildAll(desi, env).then(function () {
|
|
Desi.write(desi, env).then(function () {
|
|
console.info('Built and saved to ' + path.join(env.working_path, env.compiled_path));
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
function createPost(originalDir, blogdir, title, extra) {
|
|
if (!title) {
|
|
console.error("Usage desi post \"My First Post\"");
|
|
console.error("(you didn't specify a title)");
|
|
process.exit(1);
|
|
}
|
|
if (extra) {
|
|
console.error("Usage desi post \"My First Post\"");
|
|
console.error("(too many arguments - maybe you didn't put your title in quotes?)");
|
|
process.exit(1);
|
|
}
|
|
|
|
var env = {}
|
|
, post = {}
|
|
, slug
|
|
, filepath
|
|
, displaypath
|
|
;
|
|
|
|
env.working_path = env.blogdir = blogdir;
|
|
|
|
Desi._initFileAdapter(env).then(function () {
|
|
/*
|
|
Desi.init(desi, env).then(function () {
|
|
env.url = desi.site.base_url + desi.site.base_path.replace(/^\/$/, '');
|
|
env.base_url = desi.site.base_url;
|
|
env.base_path = desi.site.base_path;
|
|
env.compiled_path = 'compiled';
|
|
//env.since = 0;
|
|
*/
|
|
|
|
// TODO move this logic to desirae
|
|
post.title = title;
|
|
post.description = "";
|
|
post.date = Desi.toLocaleDate(new Date());
|
|
// TODO use site.permalink or collection.permalink or something like that
|
|
|
|
slug = post.title.toLowerCase()
|
|
.replace(/["']/g, '')
|
|
.replace(/\W/g, '-')
|
|
.replace(/^-+/g, '')
|
|
.replace(/-+$/g, '')
|
|
.replace(/--/g, '-')
|
|
;
|
|
|
|
// TODO as per config
|
|
post.permalink = path.join('/', 'articles', slug + '.html');
|
|
post.uuid = UUID.v4();
|
|
// TODO as per config for default collection and default format (jade, md, etc)
|
|
filepath = path.join(blogdir, (/*config.collection ||*/ 'posts'), slug + '.md');
|
|
displaypath = path.join(originalDir, 'posts', slug + '.md').replace(/^\/(Users|home)\/[^\/]+\//, '~/').replace(/ /g, '\\ ');
|
|
|
|
['updated', 'theme', 'layout', 'swatch'].forEach(function (key) {
|
|
if (!post[key]) {
|
|
delete post[key];
|
|
}
|
|
});
|
|
|
|
return Desi.fsapi.putFiles([{
|
|
path: filepath
|
|
, contents:
|
|
'---\n'
|
|
+ Desi.YAML.stringify(post).trim()
|
|
+ '\n'
|
|
+ '---\n'
|
|
+ '\n'
|
|
+ '\n'
|
|
}], { overwrite: false }).then(function (r) {
|
|
var err
|
|
;
|
|
|
|
if (r.error || r.errors.length) {
|
|
err = r.error || r.errors[0];
|
|
if (/exists/i.test(err.message)) {
|
|
console.error('');
|
|
console.error("Looks like that post already exists. Try a different name?");
|
|
console.error('');
|
|
console.error('');
|
|
} else {
|
|
throw err;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
console.log('');
|
|
console.log(displaypath);
|
|
console.log('');
|
|
console.log('vim ' + displaypath);
|
|
console.log('(or emacs ' + displaypath + ', if you swing that way)');
|
|
console.log('');
|
|
console.log('');
|
|
});
|
|
/*
|
|
});
|
|
*/
|
|
});
|
|
}
|
|
|
|
|
|
cli.main(function (args, options) {
|
|
init();
|
|
|
|
var command = args[0]
|
|
, blogdir = options.blogdir
|
|
, originalDir = blogdir
|
|
;
|
|
|
|
if (!blogdir) {
|
|
blogdir = path.resolve('./');
|
|
originalDir = './';
|
|
}
|
|
|
|
if (!fs.existsSync(path.join(options.blogdir, 'site.yml'))) {
|
|
console.error("Usage: desi [serve|init|post] -d ~/path/to/blog");
|
|
console.error("(if ~/path/to/blog doesn't yet exist or doesn't have config.yml, site.yml, etc, "
|
|
+ "try `deardesi init -d ~/path/to/blog'");
|
|
process.exit(1);
|
|
return;
|
|
}
|
|
|
|
if ('init' === command) {
|
|
console.error("`init' not yet implemented");
|
|
process.exit(1);
|
|
return;
|
|
}
|
|
else if ('build' === command) {
|
|
build(blogdir);
|
|
return;
|
|
}
|
|
else if ('post' === command) {
|
|
createPost(originalDir, blogdir, args[1], args[2]);
|
|
return;
|
|
}
|
|
else if ('serve' === command) {
|
|
serve(blogdir);
|
|
return;
|
|
}
|
|
else {
|
|
console.error("Usage: desi [serve|init|post] -d ~/path/to/blog");
|
|
return;
|
|
}
|
|
});
|