Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 71 additions & 20 deletions app/build/index.js
Original file line number Diff line number Diff line change
@@ -1,40 +1,83 @@
var debug = require("debug")("blot:build");
var basename = require("path").basename;
var isDraft = require("../sync/update/drafts").isDraft;
var Build = require("./single");
var BuildSingle = require("./single");
var BuildMultiple = require("./multiple");
var Prepare = require("./prepare");
var Thumbnail = require("./thumbnail");
var DateStamp = require("./prepare/dateStamp");
var moment = require("moment");
var converters = require("./converters");
var pathNormalizer = require("helper/pathNormalizer");

// This file cannot become a blog post because it is not
// a type that Blot can process properly.
function isConvertible(path) {
return converters.some(function (converter) {
return converter.is(path);
});
}

function isWrongType(path) {
var isWrong = true;
return !isConvertible(path);
}

converters.forEach(function (converter) {
if (converter.is(path)) isWrong = false;
});
function findMultiFolder(path) {
var normalized = pathNormalizer(path);
if (!normalized || normalized === "/") return null;

var segments = normalized.split("/").filter(Boolean);
var multiIndex = -1;

for (var i = segments.length - 1; i >= 0; i--) {
if (segments[i].slice(-1) === "+") {
multiIndex = i;
break;
}
}

if (multiIndex === -1) return null;

return isWrong;
var folderSegments = segments.slice(0, multiIndex + 1);
var entrySegments = folderSegments.map(stripTrailingPlus);

var folderPath = "/" + folderSegments.join("/");
var entryPath = "/" + entrySegments.join("/");

if (!entryPath || entryPath === "//") entryPath = "/";

return {
folderPath: folderPath,
entryPath: entryPath,
triggerPath: normalized,
};
}

function stripTrailingPlus(segment) {
if (!segment) return segment;
return segment.replace(/\+$/, "");
}

module.exports = function build(blog, path, callback) {
debug("Build:", process.pid, "processing", path);

if (isWrongType(path)) {
var multiInfo = findMultiFolder(path);
var entryPath = multiInfo ? multiInfo.entryPath : path;
var builder = multiInfo ? BuildMultiple : BuildSingle;
var buildArgument = multiInfo ? multiInfo : entryPath;

if (!multiInfo && isWrongType(entryPath)) {
var err = new Error("Path is wrong type to convert");
err.code = "WRONGTYPE";
return callback(err);
}

debug("Blog:", blog.id, path, " checking if draft");
isDraft(blog.id, path, function (err, is_draft) {
debug("Blog:", blog.id, entryPath, " checking if draft");
isDraft(blog.id, entryPath, function (err, is_draft) {
if (err) return callback(err);

debug("Blog:", blog.id, path, " attempting to build html");
Build(blog, path, function (
debug("Blog:", blog.id, entryPath, " attempting to build html");
builder(blog, buildArgument, function (
err,
html,
metadata,
Expand All @@ -44,8 +87,13 @@ module.exports = function build(blog, path, callback) {
) {
if (err) return callback(err);

debug("Blog:", blog.id, path, " extracting thumbnail");
Thumbnail(blog, path, metadata, html, function (err, thumbnail) {
metadata = metadata || {};
stat = stat || {};
dependencies = dependencies || [];
extras = extras || {};

debug("Blog:", blog.id, entryPath, " extracting thumbnail");
Thumbnail(blog, entryPath, metadata, html, function (err, thumbnail) {
// Could be lots of reasons (404?)
if (err || !thumbnail) thumbnail = {};

Expand All @@ -59,25 +107,25 @@ module.exports = function build(blog, path, callback) {
try {
entry = {
html: html,
name: basename(path),
path: path,
id: path,
name: basename(entryPath),
path: entryPath,
id: entryPath,
thumbnail: thumbnail,
draft: is_draft,
metadata: metadata,
size: stat.size,
size: typeof stat.size === "number" ? stat.size : 0,
dependencies: dependencies,
exif: (extras && extras.exif) || {},
dateStamp: DateStamp(blog, path, metadata),
updated: moment.utc(stat.mtime).valueOf(),
dateStamp: DateStamp(blog, entryPath, metadata),
updated: stat && stat.mtime ? moment.utc(stat.mtime).valueOf() : Date.now(),
};

if (entry.dateStamp === undefined) delete entry.dateStamp;

debug(
"Blog:",
blog.id,
path,
entryPath,
" preparing additional properties for",
entry.name
);
Expand All @@ -94,3 +142,6 @@ module.exports = function build(blog, path, callback) {
});
});
};

module.exports.isConvertible = isConvertible;
module.exports.findMultiFolder = findMultiFolder;
Loading