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 ( ) ;
} ] ) ;