270 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			270 lines
		
	
	
		
			8.1 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,
 | |
|         path = window.path;
 | |
|       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: "",
 | |
|           fileepath: "",
 | |
|           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 (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 = path.join(
 | |
|           scope.env.compiled_path || "compiled",
 | |
|           post.yml.permalink
 | |
|         );
 | |
|         if (!/\.html?$/.test(selected.path)) {
 | |
|           selected.path = path.join(selected.path, "index.html");
 | |
|         }
 | |
| 
 | |
|         selected.url = path.join(
 | |
|           scope.site.base_url +
 | |
|             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 = path.join(scope.blogdir, selected.path);
 | |
|         selected.filepath = path.join(
 | |
|           selected.collection || "posts",
 | |
|           scope.slug + "." + selected.format
 | |
|         );
 | |
|         selected.sourcepath = 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 = path.join(
 | |
|             scope.env.compiled_path || "compiled",
 | |
|             post.yml.permalink
 | |
|           );
 | |
|           if (!/\.html?$/.test(path.basename(post.yml.permalink))) {
 | |
|             scope.selected.path = path.join(
 | |
|               scope.selected.path.replace(/\.w+$/, ""),
 | |
|               "index.html"
 | |
|             );
 | |
|           }
 | |
| 
 | |
|           scope.selected.url = path.join(
 | |
|             scope.site.base_url +
 | |
|               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 = path.join(
 | |
|             scope.blogdir,
 | |
|             scope.selected.path
 | |
|           );
 | |
|           scope.selected.sourcepath = path.join(
 | |
|             scope.blogdir,
 | |
|             scope.selected.collection || "posts",
 | |
|             scope.slug + "." + scope.selected.format
 | |
|           );
 | |
|           scope.selected.filepath = 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.filepath,
 | |
|           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();
 | |
|     },
 | |
|   ]);
 |