create post from command line

This commit is contained in:
AJ ONeal 2015-01-15 17:17:23 -07:00
parent 643e26673c
commit 4a135bafb1
5 changed files with 129 additions and 24 deletions

View File

@ -43,7 +43,7 @@ git submodule update
And now fire up Dear Desi to get started And now fire up Dear Desi to get started
``` ```
desi serve -b ~/my-desirae-blog desi serve -d ~/my-desirae-blog
``` ```
Now open up your evergreen browser to <http://local.dear.desi:65080> Now open up your evergreen browser to <http://local.dear.desi:65080>
@ -53,7 +53,7 @@ Commandline
Once you've done the initial setup in the browser, you can run `desi` from the commandline Once you've done the initial setup in the browser, you can run `desi` from the commandline
**NOTE:** You can omit the `-b` if you are already in your blog directory. **NOTE:** You can omit the `-d` if you are already in your blog directory.
Build Production Site Build Production Site
--------------------- ---------------------
@ -61,7 +61,7 @@ Build Production Site
You must set `base_path` and `base_url` in `site.yml` before attempting to build. You must set `base_path` and `base_url` in `site.yml` before attempting to build.
``` ```
desi build -b ~/my-desirae-blog desi build -d ~/my-desirae-blog
``` ```
Outputs to `~/my-desirae-blog/compiled` Outputs to `~/my-desirae-blog/compiled`
@ -70,7 +70,7 @@ Create a new Post
----------------- -----------------
``` ```
desi post "My First Post" -b ~/my-desirae-blog desi post "My First Post" -d ~/my-desirae-blog
``` ```
Outputs to `~/my-desirae-blog/posts/my-first-post.md` Outputs to `~/my-desirae-blog/posts/my-first-post.md`

View File

@ -4,6 +4,7 @@ var PromiseA = require('bluebird')
, fs = PromiseA.promisifyAll(require('fs')) , fs = PromiseA.promisifyAll(require('fs'))
, path = require('path') , path = require('path')
, cli = require('cli') , cli = require('cli')
, UUID = require('node-uuid')
; ;
cli.parse({ cli.parse({
@ -19,8 +20,8 @@ function serve(blogdir) {
; ;
server = http.createServer(app).listen(65080, function () { server = http.createServer(app).listen(65080, function () {
console.log("Listening from " + blogdir); console.info("Listening from " + blogdir);
console.log("Listening on http://local.dear.desi:" + server.address().port); console.info("Listening on http://local.dear.desi:" + server.address().port);
}); });
//secureServer = https.createServer(app).listen(65043); //secureServer = https.createServer(app).listen(65043);
} }
@ -41,25 +42,128 @@ function build(blogdir) {
Desi.buildAll(desi, env).then(function () { Desi.buildAll(desi, env).then(function () {
Desi.write(desi, env).then(function () { Desi.write(desi, env).then(function () {
console.log('Build Success!'); console.info('Built and saved to ' + path.join(env.wolking_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 Desi = require('desirae').Desirae
//, desi = {}
, 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) { cli.main(function (args, options) {
var command = args[0] var command = args[0]
, blogdir = options.blog , blogdir = options.blogdir
, originalDir = blogdir
; ;
if (!blogdir) { if (!blogdir) {
blogdir = path.resolve('./'); blogdir = path.resolve('./');
originalDir = './';
} }
if (!fs.existsSync(path.join(options.blog, 'site.yml'))) { if (!fs.existsSync(path.join(options.blogdir, 'site.yml'))) {
console.error("Usage: deardesi [serve|init|post] -b ~/path/to/blog"); 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, " console.error("(if ~/path/to/blog doesn't yet exist or doesn't have config.yml, site.yml, etc, "
+ "try `deardesi init -b ~/path/to/blog'"); + "try `deardesi init -d ~/path/to/blog'");
process.exit(1); process.exit(1);
return; return;
} }
@ -74,8 +178,7 @@ cli.main(function (args, options) {
return; return;
} }
else if ('post' === command) { else if ('post' === command) {
console.error("`post' not yet implemented"); createPost(originalDir, blogdir, args[1], args[2]);
process.exit(1);
return; return;
} }
else if ('serve' === command) { else if ('serve' === command) {
@ -83,7 +186,7 @@ cli.main(function (args, options) {
return; return;
} }
else { else {
console.error("Usage: deardesi [serve|init|post] -b ~/path/to/blog"); console.error("Usage: desi [serve|init|post] -d ~/path/to/blog");
return; return;
} }
}); });

View File

@ -7,8 +7,8 @@
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"bin": { "bin": {
"deardesi": "bin/deardesi.js" "deardesi": "bin/deardesi.js",
, "desi": "bin/deardesi.js" "desi": "bin/deardesi.js"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -44,8 +44,9 @@
"connect": "^3.3.4", "connect": "^3.3.4",
"connect-query": "^0.2.0", "connect-query": "^0.2.0",
"connect-send-json": "^1.0.0", "connect-send-json": "^1.0.0",
"desirae": "^0.9.1", "desirae": "^0.9.2",
"fs.extra": "^1.3.0", "fs.extra": "^1.3.0",
"node-uuid": "^1.4.2",
"require-yaml": "0.0.1", "require-yaml": "0.0.1",
"serve-static": "^1.8.0" "serve-static": "^1.8.0"
} }

View File

@ -17,7 +17,8 @@
<div class="row"> <div class="row">
<div class="col-lg-7"> <div class="col-lg-7">
<br/> <br/>
<iframe width="560" height="315" src="//www.youtube.com/embed/YZzhIIJmlE0" frameborder="0" allowfullscreen></iframe> <!--iframe width="560" height="315" src="//www.youtube.com/embed/YZzhIIJmlE0" frameborder="0" allowfullscreen></iframe-->
<img src="http://dropsha.re/files/fly6+.8/desi-parker-2.jpg"/>
<br/> <br/>
</div> </div>
<div class="col-lg-5"> <div class="col-lg-5">

View File

@ -9,13 +9,13 @@ angular.module('myApp.post', ['ngRoute'])
}]) }])
.controller('PostCtrl' .controller('PostCtrl'
, ['$scope', '$location', '$timeout', 'Desirae' , ['$scope', '$location', '$timeout', 'DesiraeService'
, function ($scope, $location, $timeout, Desirae) { , function ($scope, $location, $timeout, DesiraeService) {
var scope = this var scope = this
; ;
function init() { function init() {
Desirae.meta().then(function (desi) { DesiraeService.meta().then(function (desi) {
console.warn(desi); console.warn(desi);
scope.blogdir = desi.blogdir.path.replace(/^\/(Users|home)\/[^\/]+\//, '~/'); scope.blogdir = desi.blogdir.path.replace(/^\/(Users|home)\/[^\/]+\//, '~/');
scope.site = desi.site; scope.site = desi.site;
@ -41,7 +41,7 @@ angular.module('myApp.post', ['ngRoute'])
yml: { yml: {
title: "" title: ""
, permalink: "/article/new.html" , permalink: "/article/new.html"
, date: Desirae.toDesiDate(new Date())// "YYYY-MM-DD HH:MM pm" // TODO desirae , date: DesiraeService.toDesiDate(new Date())// "YYYY-MM-DD HH:MM pm" // TODO desirae
, updated: null , updated: null
, description: "" , description: ""
, categories: [] , categories: []
@ -128,7 +128,7 @@ angular.module('myApp.post', ['ngRoute'])
$timeout.cancel(scope.dtlock); $timeout.cancel(scope.dtlock);
scope.dtlock = $timeout(function () { scope.dtlock = $timeout(function () {
if (scope.selected && scope.selected.date === scope.selected.post.yml.date) { if (scope.selected && scope.selected.date === scope.selected.post.yml.date) {
scope.selected.date = scope.selected.post.yml.date = Desirae.toDesiDate(new Date()); scope.selected.date = scope.selected.post.yml.date = DesiraeService.toDesiDate(new Date());
} }
scope.onChange(); scope.onChange();
updateDate(); updateDate();
@ -163,7 +163,7 @@ angular.module('myApp.post', ['ngRoute'])
+ scope.selected.post.body.trim() + scope.selected.post.body.trim()
}); });
Desirae.putFiles(files).then(function (results) { DesiraeService.putFiles(files).then(function (results) {
console.log('TODO check for error'); console.log('TODO check for error');
console.log(files); console.log(files);
console.log(results); console.log(results);