211 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*jshint -W054 */
 | |
| (function (exports) {
 | |
|   "use strict";
 | |
| 
 | |
|   var cores = {},
 | |
|     Desi = exports.Desirae || require("desirae").Desirae,
 | |
|     path = exports.path || require("path");
 | |
|   cores.lint = function (desi, env, collection, entity) {
 | |
|     // TODO splice
 | |
|     //desi.content.collections = desi.content.collections.filter(function (entity) {
 | |
|     // TODO throw for any files that don't have a registered renderer
 | |
|     if (!entity.yml) {
 | |
|       if (!desi.config.empty_frontmatter) {
 | |
|         throw new Error(
 | |
|           "no frontmatter for " +
 | |
|             (entity.path || entity.name) +
 | |
|             "." +
 | |
|             "Set `config.yml.empty_frontmatter: include|skip` to ignore this error."
 | |
|         );
 | |
|       }
 | |
| 
 | |
|       if ("include" === desi.config.empty_frontmatter) {
 | |
|         entity.yml = {};
 | |
|       } else if ("skip" === desi.config.empty_frontmatter) {
 | |
|         return false;
 | |
|       } else {
 | |
|         throw new Error(
 | |
|           "unrecognize option " +
 | |
|             desi.config.empty_frontmatter +
 | |
|             " for `config.yml.empty_frontmatter: include|skip`."
 | |
|         );
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (!entity.body || !entity.body.trim()) {
 | |
|       if (!desi.config.empty_body) {
 | |
|         throw new Error(
 | |
|           "empty content file " +
 | |
|             (entity.path || entity.name) +
 | |
|             ". Set `config.yml.empty_body: include|skip` to ignore this error."
 | |
|         );
 | |
|       }
 | |
| 
 | |
|       if ("include" === desi.config.empty_body) {
 | |
|         entity.body = "";
 | |
|       } else if ("skip" === desi.config.empty_body) {
 | |
|         return false;
 | |
|       } else {
 | |
|         throw new Error(
 | |
|           "unrecognize option " +
 | |
|             desi.config.empty_frontmatter +
 | |
|             " for `config.yml.empty_body: include|skip`."
 | |
|         );
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return true;
 | |
|     //});
 | |
|   };
 | |
| 
 | |
|   cores.root = function (desi, env, collection, entity) {
 | |
|     entity.yml = entity.yml || {};
 | |
| 
 | |
|     entity.layout = entity.yml.layout || "__page__";
 | |
| 
 | |
|     // _root is not subject to the same permalink rules as collections,
 | |
|     // so we just go ahead and define that here
 | |
|     if (/^index\.\w+$/.test(entity.path)) {
 | |
|       entity.permalink = "/";
 | |
|     } else {
 | |
|       entity.permalink =
 | |
|         entity.yml.permalink || entity.path.replace(/\.\w+$/, "/");
 | |
|       entity.redirects = entity.redirects || [];
 | |
|       entity.redirects.push(entity.permalink.replace(/\/$/, "/index.html"));
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   cores.normalize = function (desi, env, collection, entity) {
 | |
|     entity.title =
 | |
|       entity.yml.title || Desi.firstCap(entity.name.replace(/\.\w+$/, ""));
 | |
|     entity.date = entity.yml.date;
 | |
| 
 | |
|     if (!entity.date) {
 | |
|       // TODO tell YAML parser to keep the date a string
 | |
|       entity.date = new Date(
 | |
|         entity.yml.created_at ||
 | |
|           entity.yml.time ||
 | |
|           entity.yml.updated_at ||
 | |
|           entity.createdDate ||
 | |
|           entity.lastModifiedDate
 | |
|       ).toISOString();
 | |
|     }
 | |
|     if ("object" === typeof entity.date) {
 | |
|       entity.date = entity.date.toISOString();
 | |
|     }
 | |
| 
 | |
|     entity.updated_at = entity.yml.updated_at || entity.lastModifiedDate;
 | |
| 
 | |
|     entity.published_at = Desi.fromLocaleDate(
 | |
|       entity.date || entity.lastModifiedDate
 | |
|     );
 | |
|     entity.year = entity.published_at.year;
 | |
|     entity.month = entity.published_at.month;
 | |
|     entity.day = entity.published_at.day;
 | |
|     entity.hour = entity.published_at.hour;
 | |
|     entity.twelve_hour = entity.published_at.twelve_hour;
 | |
|     entity.meridian = entity.published_at.meridian;
 | |
|     entity.minute = entity.published_at.minute;
 | |
|     // let's just agree that that's too far
 | |
|     //entity.second = entity.published_at.second;
 | |
| 
 | |
|     entity.slug = Desi.slugify(entity.title);
 | |
|     entity.slug_path = Desi.slugifyPath(entity.relativePath);
 | |
|     entity.slugPath = Desi.slugifyPath(entity.relativePath);
 | |
|     // TODO type checking like below
 | |
|     entity.redirects =
 | |
|       (Array.isArray(entity.yml.redirects) && entity.yml.redirects) || [];
 | |
| 
 | |
|     // categories
 | |
|     if (Array.isArray(entity.yml.categories)) {
 | |
|       entity.categories = entity.yml.categories;
 | |
|     } else if ("string" === typeof entity.yml.categories) {
 | |
|       entity.categories = [entity.yml.categories];
 | |
|     } else if ("string" === typeof entity.yml.category) {
 | |
|       entity.categories = [entity.yml.category];
 | |
|     } else {
 | |
|       entity.categories = [];
 | |
|     }
 | |
| 
 | |
|     // tags
 | |
|     if (Array.isArray(entity.yml.tags)) {
 | |
|       entity.tags = entity.yml.tags;
 | |
|     } else if ("string" === typeof entity.yml.tags) {
 | |
|       entity.tags = [entity.yml.tags];
 | |
|     } else {
 | |
|       entity.tags = [];
 | |
|     }
 | |
| 
 | |
|     entity.permalink = entity.permalink || entity.yml.permalink;
 | |
| 
 | |
|     if (!entity.permalink) {
 | |
|       // try the fallback_permalink first (because we're looking at files that don't have yml)
 | |
|       // then try the normal permalink (because :filename -> :title and whatnot, so it'll work)
 | |
|       entity.permalink = Desi.permalinkify(
 | |
|         desi,
 | |
|         collection.fallback_permalink || collection.permalink,
 | |
|         entity
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     /*
 | |
|     if (!/\.x?html?$/.test(entity.permalink)) {
 | |
|       entity.htmllink = path.join(entity.permalink, 'index.html');
 | |
|     }
 | |
|     */
 | |
| 
 | |
|     // relative to the site
 | |
|     entity.relative_file = path
 | |
|       .join(env.base_path, entity.permalink)
 | |
|       .replace(/\/$/, "/index.html");
 | |
|     entity.relative_href = path
 | |
|       .join(env.base_path, entity.permalink)
 | |
|       .replace(/\/index\.html$/, "/");
 | |
|     entity.relative_link = entity.relative_href;
 | |
| 
 | |
|     entity.url =
 | |
|       env.base_url +
 | |
|       path.join(env.base_path, entity.permalink).replace(/\/index\.html$/, "/");
 | |
|     entity.canonical_url =
 | |
|       env.base_url +
 | |
|       path.join(env.base_path, entity.permalink).replace(/\/index\.html$/, "/");
 | |
|     entity.production_url =
 | |
|       desi.site.base_url +
 | |
|       path
 | |
|         .join(desi.site.base_path, entity.permalink)
 | |
|         .replace(/\/index\.html$/, "/");
 | |
|     entity.relative_url = path
 | |
|       .join(env.base_path, entity.permalink)
 | |
|       .replace(/\/index\.html$/, "/");
 | |
| 
 | |
|     if (
 | |
|       env.explicitIndexes ||
 | |
|       env.explicitIndices ||
 | |
|       env.explicit_indexes ||
 | |
|       env.explicit_indices
 | |
|     ) {
 | |
|       // NOTE: file_url is NOT replaced
 | |
|       ["url", "canonical_url", "production_url", "relative_url"].forEach(
 | |
|         function (url) {
 | |
|           entity[url] = entity[url].replace(/\/$/, "/index.html");
 | |
|         }
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     // i.e. bootstrap, hero page, darkly
 | |
|     entity.theme = entity.theme || entity.yml.theme;
 | |
|     entity.layout = entity.layout || entity.yml.layout;
 | |
|     entity.swatch = entity.swatch || entity.yml.swatch;
 | |
|   };
 | |
| 
 | |
|   cores.disqus = function (desi, env, collection, entity) {
 | |
|     var yml = entity.yml;
 | |
|     if (yml.uuid) {
 | |
|       entity.disqus_identifier = yml.uuid;
 | |
|     }
 | |
|     entity.disqus_url = entity.production_url;
 | |
|   };
 | |
| 
 | |
|   exports.DesiraeTransformCore = cores.DesiraeTransformCore = cores;
 | |
| })(("undefined" !== typeof exports && exports) || window);
 |