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);
|