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