187 lines
6.7 KiB
JavaScript
187 lines
6.7 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.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));
|