207 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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'
 | |
|   , ['$scope', '$location', '$timeout', 'Desirae'
 | |
|   , function ($scope, $location, $timeout, DesiraeService) {
 | |
|   var scope = this
 | |
|     ;
 | |
| 
 | |
|   function init() {
 | |
|     DesiraeService.meta().then(function (desi) {
 | |
|       /*
 | |
|       if (!scope.site.base_url) {
 | |
|         window.alert("Please go to the site tab and add a url first");
 | |
|         return;
 | |
|       }
 | |
|       */
 | |
|       scope.blogdir = desi.blogdir.path.replace(/^\/(Users|home)\/[^\/]+\//, '~/');
 | |
|       scope.site = desi.site;
 | |
|       scope.env = desi.site;
 | |
|       newPost();
 | |
| 
 | |
|       if (/dropbox/.test(scope.site.base_url)) {
 | |
|         scope.env.explicitIndexes = true;
 | |
|       }
 | |
| 
 | |
|       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'
 | |
|     , permalink: "/article/new.html"
 | |
|     , uuid: window.uuid.v4()
 | |
|     , abspath: scope.blogdir
 | |
|     , sourcepath: ''
 | |
|     , post: { 
 | |
|         yml: {
 | |
|           title: ""
 | |
|         , permalink: "/article/new.html"
 | |
|         , date: DesiraeService.toDesiDate(new Date())// "YYYY-MM-DD HH:MM pm" // TODO desirae
 | |
|         , 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 || '';
 | |
|     selected.title = post.yml.title;
 | |
|     post.yml.description = post.yml.description || '';
 | |
| 
 | |
|     scope.slug = post.yml.title.toLowerCase()
 | |
|       .replace(/["']/g, '')
 | |
|       .replace(/\W/g, '-')
 | |
|       .replace(/^-+/g, '')
 | |
|       .replace(/-+$/g, '')
 | |
|       .replace(/--/g, '-')
 | |
|       ;
 | |
| 
 | |
|     if (selected.permalink === post.yml.permalink) {
 | |
|       selected.permalink = '/articles/' + scope.slug + '/';
 | |
|       // + '.html' //+ selected.format
 | |
| 
 | |
|       post.yml.permalink = selected.permalink;
 | |
|     }
 | |
|     /*
 | |
|     if (window.path.extname(post.yml.permalink) !== '.' + selected.format) {
 | |
|      post.yml.permalink = post.yml.permalink.replace(/\.\w+$/, '.' + selected.format);
 | |
|     }
 | |
|     */
 | |
| 
 | |
|     post.frontmatter = window.jsyaml.dump(post.yml).trim();
 | |
| 
 | |
|     // TODO use some sort of filepath pattern in config.yml
 | |
|     selected.path = window.path.join((scope.env.compiled_path || 'compiled'), post.yml.permalink);
 | |
|     if (!/\.html?$/.test(selected.path)) {
 | |
|       selected.path = window.path.join(selected.path, 'index.html');
 | |
|     }
 | |
| 
 | |
|     selected.url = window.path.join(scope.site.base_url + window.path.join(scope.site.base_path, post.yml.permalink));
 | |
|     if (scope.env.explicitIndexes && /\/$/.test(selected.url)) {
 | |
|       selected.url += 'index.html';
 | |
|     }
 | |
|     selected.markdown   = '[' + selected.title + '](' + selected.url + ')';
 | |
|     selected.ahref      = '<a href="' + selected.url + '">' + selected.title + '</a>';
 | |
|     selected.abspath    = window.path.join(scope.blogdir, selected.path);
 | |
|     selected.sourcepath = window.path.join(scope.blogdir, (selected.collection || 'posts'), scope.slug + '.' + selected.format);
 | |
|   };
 | |
|   scope.onFrontmatterChange = function () {
 | |
|     var data
 | |
|       , post
 | |
|       ;
 | |
| 
 | |
|     try {
 | |
|       if (!scope.selected.post.frontmatter || !scope.selected.post.frontmatter.trim()) {
 | |
|         throw new Error('deleted frontmatter');
 | |
|       }
 | |
|       data = window.jsyaml.load(scope.selected.post.frontmatter);
 | |
|       //scope.selected.format = data.permalink.replace(/.*\.(\w+$)/, '$1');
 | |
|       if (!data.permalink) {
 | |
|         data = scope.selected.permalink;
 | |
|       }
 | |
|       scope.selected.post.yml = data;
 | |
| 
 | |
|       post = scope.selected.post;
 | |
| 
 | |
|       scope.selected.path = window.path.join((scope.env.compiled_path || 'compiled'), post.yml.permalink);
 | |
|       if (!/\.html?$/.test(window.path.basename(post.yml.permalink))) {
 | |
|         scope.selected.path = window.path.join(scope.selected.path.replace(/\.w+$/, ''), 'index.html');
 | |
|       }
 | |
| 
 | |
|       scope.selected.url = window.path.join(scope.site.base_url + window.path.join(scope.site.base_path, post.yml.permalink));
 | |
|       if (scope.env.explicitIndexes && /\/$/.test(scope.selected.url)) {
 | |
|         scope.selected.url += 'index.html';
 | |
|       }
 | |
|       scope.selected.abspath = window.path.join(scope.blogdir, scope.selected.path);
 | |
|       scope.selected.sourcepath = window.path.join((scope.selected.collection || 'posts'), scope.slug + '.' + scope.selected.format);
 | |
|     } 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) {
 | |
|         scope.selected.date = scope.selected.post.yml.date = DesiraeService.toDesiDate(new Date());
 | |
|       }
 | |
|       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({
 | |
|       path: scope.selected.sourcepath
 | |
|     , contents: 
 | |
|           '---\n'
 | |
|         + scope.selected.post.frontmatter.trim()
 | |
|         + '\n'
 | |
|         + '---\n'
 | |
|         + '\n'
 | |
|         + scope.selected.post.body.trim()
 | |
|     });
 | |
| 
 | |
|     DesiraeService.putFiles(files).then(function (results) {
 | |
|       console.log('TODO check for error');
 | |
|       console.log(files);
 | |
|       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();
 | |
| }]);
 |