deardesi.js/views/post/post.js

188 lines
5.9 KiB
JavaScript
Raw Permalink Normal View History

2015-01-13 10:18:13 +00:00
'use strict';
angular.module('myApp.post', ['ngRoute'])
.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/post', {
templateUrl: 'views/post/post.html',
controller: 'PostCtrl as Post'
});
}])
.controller('PostCtrl'
2015-01-16 04:56:14 +00:00
, ['$scope', '$location', '$timeout', 'Desirae'
2015-01-16 00:17:23 +00:00
, function ($scope, $location, $timeout, DesiraeService) {
2015-01-13 10:18:13 +00:00
var scope = this
;
function init() {
2015-01-16 00:17:23 +00:00
DesiraeService.meta().then(function (desi) {
2015-01-15 06:41:52 +00:00
console.warn(desi);
2015-01-13 10:18:13 +00:00
scope.blogdir = desi.blogdir.path.replace(/^\/(Users|home)\/[^\/]+\//, '~/');
scope.site = desi.site;
2015-01-16 04:56:14 +00:00
scope.env = desi.site;
2015-01-13 10:18:13 +00:00
newPost();
updateDate();
}).catch(function (e) {
window.alert("An Error Occured. Most errors that occur in the init phase are parse errors in the config files or permissions errors on files or directories, but check the error console for details.");
console.error(e);
throw e;
});
scope.extensions = ['md', 'html'];
}
function newPost() {
scope.selected = {
format: 'md'
2015-01-13 11:55:16 +00:00
, permalink: "/article/new.html"
2015-01-13 10:18:13 +00:00
, uuid: window.uuid.v4()
, abspath: scope.blogdir
2015-01-16 04:56:14 +00:00
, sourcepath: ''
2015-01-13 10:18:13 +00:00
, post: {
yml: {
title: ""
2015-01-13 11:55:16 +00:00
, permalink: "/article/new.html"
2015-01-16 00:17:23 +00:00
, date: DesiraeService.toDesiDate(new Date())// "YYYY-MM-DD HH:MM pm" // TODO desirae
2015-01-13 10:18:13 +00:00
, updated: null
, description: ""
, categories: []
, tags: []
, theme: null
, layout: null
, swatch: null
}
}
};
scope.selected.date = scope.selected.post.yml.date;
scope.selected.post.frontmatter = window.jsyaml.dump(scope.selected.post.yml).trim();
}
scope.onChange = function () {
var post = scope.selected.post
, selected = scope.selected
;
post.yml.title = post.yml.title || '';
post.yml.description = post.yml.description || '';
2015-01-16 04:56:14 +00:00
scope.slug = post.yml.title.toLowerCase()
.replace(/["']/g, '')
.replace(/\W/g, '-')
.replace(/^-+/g, '')
.replace(/-+$/g, '')
.replace(/--/g, '-')
;
2015-01-13 10:18:13 +00:00
if (selected.permalink === post.yml.permalink) {
2015-01-16 04:56:14 +00:00
selected.permalink = '/articles/' + scope.slug + '/';
// + '.html' //+ selected.format
2015-01-13 10:18:13 +00:00
post.yml.permalink = selected.permalink;
}
2015-01-13 11:55:16 +00:00
/*
2015-01-13 10:18:13 +00:00
if (window.path.extname(post.yml.permalink) !== '.' + selected.format) {
post.yml.permalink = post.yml.permalink.replace(/\.\w+$/, '.' + selected.format);
}
2015-01-13 11:55:16 +00:00
*/
2015-01-13 10:18:13 +00:00
post.frontmatter = window.jsyaml.dump(post.yml).trim();
// TODO use some sort of filepath pattern in config.yml
2015-01-16 04:56:14 +00:00
selected.path = window.path.join((scope.env.compiled_path || 'compiled'), post.yml.permalink);
2015-01-13 11:55:16 +00:00
if (!/\.html?$/.test(selected.path)) {
selected.path = window.path.join(selected.path, 'index.html');
}
2015-01-13 21:50:17 +00:00
selected.url = window.path.join(scope.site.base_url + window.path.join(scope.site.base_path, post.yml.permalink));
2015-01-13 10:18:13 +00:00
selected.abspath = window.path.join(scope.blogdir, selected.path);
2015-01-16 04:56:14 +00:00
selected.sourcepath = window.path.join((selected.collection || 'posts'), scope.slug + '.' + selected.format);
2015-01-13 10:18:13 +00:00
};
scope.onFrontmatterChange = function () {
var data
2015-01-13 11:55:16 +00:00
, post
2015-01-13 10:18:13 +00:00
;
try {
if (!scope.selected.post.frontmatter || !scope.selected.post.frontmatter.trim()) {
throw new Error('deleted frontmatter');
}
data = window.jsyaml.load(scope.selected.post.frontmatter);
2015-01-13 11:55:16 +00:00
//scope.selected.format = data.permalink.replace(/.*\.(\w+$)/, '$1');
2015-01-13 10:18:13 +00:00
if (!data.permalink) {
data = scope.selected.permalink;
}
scope.selected.post.yml = data;
2015-01-13 11:55:16 +00:00
post = scope.selected.post;
2015-01-13 21:50:17 +00:00
2015-01-16 04:56:14 +00:00
scope.selected.path = window.path.join((scope.env.compiled_path || 'compiled'), post.yml.permalink);
2015-01-13 21:50:17 +00:00
if (!/\.html?$/.test(window.path.basename(post.yml.permalink))) {
scope.selected.path = window.path.join(scope.selected.path.replace(/\.w+$/, ''), 'index.html');
2015-01-13 11:55:16 +00:00
}
2015-01-13 21:50:17 +00:00
scope.selected.url = window.path.join(scope.site.base_url + window.path.join(scope.site.base_path, post.yml.permalink));
scope.selected.abspath = window.path.join(scope.blogdir, scope.selected.path);
2015-01-16 04:56:14 +00:00
scope.selected.sourcepath = window.path.join((scope.selected.collection || 'posts'), scope.slug + '.' + scope.selected.format);
2015-01-13 10:18:13 +00:00
} catch(e) {
console.error(e);
console.error('ignoring update that created parse error');
scope.selected.post.frontmatter = window.jsyaml.dump(scope.selected.post.yml).trim();
}
};
function updateDate() {
$timeout.cancel(scope.dtlock);
scope.dtlock = $timeout(function () {
if (scope.selected && scope.selected.date === scope.selected.post.yml.date) {
2015-01-16 00:17:23 +00:00
scope.selected.date = scope.selected.post.yml.date = DesiraeService.toDesiDate(new Date());
2015-01-13 10:18:13 +00:00
}
scope.onChange();
updateDate();
}, 60 * 1000);
}
scope.upsert = function () {
if (-1 === scope.extensions.indexOf(scope.selected.format)) {
window.alert('.' + scope.selected.format + ' is not a supported extension.\n\nPlease choose from: .' + scope.extensions.join(' .'));
return;
}
scope.selected.post.yml.uuid = scope.selected.uuid;
['updated', 'theme', 'layout', 'swatch'].forEach(function (key) {
if (!scope.selected.post.yml[key]) {
delete scope.selected.post.yml[key];
}
});
scope.onChange();
var files = []
;
files.push({
2015-01-16 04:56:14 +00:00
path: scope.selected.sourcepath
2015-01-13 10:18:13 +00:00
, contents:
'---\n'
+ scope.selected.post.frontmatter.trim()
+ '\n'
+ '---\n'
+ '\n'
+ scope.selected.post.body.trim()
});
2015-01-16 00:17:23 +00:00
DesiraeService.putFiles(files).then(function (results) {
2015-01-13 10:18:13 +00:00
console.log('TODO check for error');
2015-01-13 11:55:16 +00:00
console.log(files);
2015-01-13 10:18:13 +00:00
console.log(results);
$location.path('/build');
}).catch(function (e) {
$timeout.cancel(scope.dtlock);
console.error(scope.site);
console.error(e);
window.alert("Error Nation! :/");
throw e;
});
};
init();
}]);