mirror of
https://github.com/GenderDysphoria/GenderDysphoria.fyi.git
synced 2025-11-25 12:32:42 +00:00
Refining engine targeting
This commit is contained in:
@@ -1,58 +1,105 @@
|
||||
const path = require('path');
|
||||
const Promise = require('bluebird');
|
||||
const fs = require('fs-extra');
|
||||
const getEngines = require('./engines');
|
||||
const { resolve, ROOT, ENGINE } = require('./resolve');
|
||||
const { map, uniq } = require('lodash');
|
||||
const { resolve, ROOT } = require('./resolve');
|
||||
const { siteInfo } = require(resolve('package.json'));
|
||||
|
||||
module.exports = exports = async function writePageContent (pages, posts, prod) {
|
||||
const engines = await getEngines(prod);
|
||||
const postIndex = await processPages(engines, posts, null, prod);
|
||||
await processPages(engines, pages, posts, prod);
|
||||
module.exports = exports = async function writePageContent (engines, pages, posts, prod) {
|
||||
const postIndex = index(posts, engines);
|
||||
await processPages(engines, [ ...posts, ...pages ], postIndex, prod);
|
||||
return postIndex;
|
||||
};
|
||||
|
||||
function index (posts, engines) {
|
||||
posts = posts.filter((p) => !p.draft);
|
||||
|
||||
siblings(posts);
|
||||
|
||||
// fill in post content
|
||||
posts.forEach((p) => { p.content = engines[p.type](p.source, pageState(p)); });
|
||||
|
||||
const reducedPosts = posts.map(pageJSON);
|
||||
|
||||
const authors = uniq(map(reducedPosts, 'author').flat()).sort((a, b) => (a.toUpperCase() > b.toUpperCase() ? 1 : -1));
|
||||
|
||||
const tagMap = reducedPosts.reduce((o, p) => Object.assign(o, p.tags), {});
|
||||
const tags = Object.keys(tagMap).sort().reduce((result, tagslug) => {
|
||||
result[tagslug] = tagMap[tagslug];
|
||||
return result;
|
||||
}, {});
|
||||
|
||||
return {
|
||||
posts: reducedPosts,
|
||||
authors,
|
||||
tags,
|
||||
latest: posts[0],
|
||||
};
|
||||
}
|
||||
|
||||
function siblings (posts) {
|
||||
let first, prev, next, last;
|
||||
for (let i = 0; i < posts.length; i++) {
|
||||
const post = posts[i];
|
||||
first = i > 0 && posts[0];
|
||||
prev = posts[i - 1] || false;
|
||||
next = posts[i + 1] || false;
|
||||
last = i < posts.length - 1 && posts[posts.length - 1];
|
||||
|
||||
post.siblings = {
|
||||
first: first && first.url,
|
||||
prev: prev && prev.url,
|
||||
next: next && next.url,
|
||||
last: last && last.url,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function pageState (page, posts) {
|
||||
return {
|
||||
...page,
|
||||
meta: { ...page.meta, ...page },
|
||||
page: {
|
||||
domain: siteInfo.domain,
|
||||
title: page.meta.title
|
||||
? (page.meta.title + (page.meta.subtitle ? ', ' + page.meta.subtitle : '') + ' :: ' + siteInfo.title)
|
||||
: siteInfo.title,
|
||||
description: page.meta.description || siteInfo.description,
|
||||
},
|
||||
site: siteInfo,
|
||||
local: {
|
||||
cwd: resolve(page.cwd),
|
||||
root: ROOT,
|
||||
basename: page.basename,
|
||||
},
|
||||
posts,
|
||||
};
|
||||
}
|
||||
|
||||
function pageJSON (post) {
|
||||
return {
|
||||
url: post.url,
|
||||
fullurl: post.fullurl,
|
||||
json: '/' + post.json,
|
||||
title: post.meta.title,
|
||||
subtitle: post.meta.subtitle,
|
||||
description: post.meta.description,
|
||||
date: post.dateCreated,
|
||||
titlecard: post.titlecard,
|
||||
tags: post.meta.tags,
|
||||
author: post.meta.author,
|
||||
siblings: post.sibling,
|
||||
};
|
||||
}
|
||||
|
||||
function processPages (engines, pages, posts, prod) {
|
||||
return Promise.map(pages, async (page) => {
|
||||
// page = new Page(page);
|
||||
|
||||
var data = {
|
||||
...page,
|
||||
meta: { ...page.meta, ...page },
|
||||
page: {
|
||||
domain: siteInfo.domain,
|
||||
title: page.meta.title
|
||||
? (page.meta.title + (page.meta.subtitle ? ', ' + page.meta.subtitle : '') + ' :: ' + siteInfo.title)
|
||||
: siteInfo.title,
|
||||
description: page.meta.description || siteInfo.description,
|
||||
},
|
||||
site: siteInfo,
|
||||
local: {
|
||||
cwd: resolve(page.cwd),
|
||||
root: ROOT,
|
||||
basename: page.basename,
|
||||
},
|
||||
posts,
|
||||
};
|
||||
const state = pageState(page, posts);
|
||||
const json = pageJSON(page);
|
||||
const html = String(engines[page.engine](page.source, state));
|
||||
|
||||
const json = {
|
||||
url: page.url,
|
||||
fullurl: page.fullurl,
|
||||
title: page.meta.title,
|
||||
subtitle: page.meta.subtitle,
|
||||
description: page.meta.description,
|
||||
date: page.dateCreated,
|
||||
titlecard: page.titlecard,
|
||||
tags: page.meta.tags,
|
||||
author: page.meta.author,
|
||||
};
|
||||
|
||||
const html = String(engines[page.engine](data.source, data));
|
||||
if (page.engine === ENGINE.MARKDOWN) {
|
||||
json.preview = String(engines.MARKDOWN_PREVIEW(data.source, data));
|
||||
page.content = String(engines.MARKDOWN_CONTENT(data.source, data));
|
||||
json.content = page.content;
|
||||
}
|
||||
json.content = page.content;
|
||||
|
||||
const output = resolve('dist', page.out);
|
||||
await fs.ensureDir(path.dirname(output));
|
||||
@@ -62,16 +109,5 @@ function processPages (engines, pages, posts, prod) {
|
||||
prod ? JSON.stringify(json) : JSON.stringify(json, null, 2),
|
||||
)),
|
||||
]);
|
||||
|
||||
return !page.draft && {
|
||||
url: page.url,
|
||||
json: page.json,
|
||||
title: page.meta.title,
|
||||
subtitle: page.meta.subtitle,
|
||||
description: page.meta.description,
|
||||
date: page.dateCreated,
|
||||
tags: page.meta.tags,
|
||||
author: page.meta.author,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user