forked from shadowfacts/shadowfacts.net
Add directory-based posts
This commit is contained in:
parent
88bfad10db
commit
92542b595e
|
@ -8,33 +8,73 @@ import { Page, PostMetadata } from "../metadata";
|
|||
import * as markdown from "../markdown";
|
||||
import layout from "../layout";
|
||||
|
||||
async function generatePostFromFile(postPath: string, additionalMetadata: object = {}): Promise<Page> {
|
||||
const page = await metadata.get(postPath);
|
||||
|
||||
for (const k in additionalMetadata) {
|
||||
if (additionalMetadata.hasOwnProperty(k)) page.metadata[k] = additionalMetadata[k];
|
||||
}
|
||||
|
||||
if (!(<PostMetadata>page.metadata).permalink) {
|
||||
let postMeta = <PostMetadata>page.metadata;
|
||||
postMeta.date = dateFns.parse(postMeta.date);
|
||||
postMeta.slug = postMeta.slug || slugify(postMeta.title);
|
||||
postMeta.permalink = `/${postMeta.date.getFullYear()}/${postMeta.slug}/`;
|
||||
}
|
||||
|
||||
if (page.metadata.source && page.metadata.source!.endsWith(".md")) {
|
||||
(<PostMetadata>page.metadata).wordCount = util.getWordCount(page.text);
|
||||
(<PostMetadata>page.metadata).readingTime = util.getReadingTime((<PostMetadata>page.metadata).wordCount);
|
||||
|
||||
page.text = markdown.render(page.text);
|
||||
}
|
||||
|
||||
page.text = util.render(page.text, { metadata: page.metadata }, postPath);
|
||||
|
||||
// todo: handle word count if not .md
|
||||
|
||||
if (!(<PostMetadata>page.metadata).excerpt) {
|
||||
const parts = page.text.split("<!-- excerpt-end -->");
|
||||
(<PostMetadata>page.metadata).excerpt = parts[0];
|
||||
}
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
async function generatePostFromDirectory(dir: string): Promise<Page> {
|
||||
const files = await fs.readdir(dir);
|
||||
|
||||
let indexPath: string;
|
||||
for (const f of files) {
|
||||
if (f.split(".")[0] === "index") {
|
||||
indexPath = path.join(dir, f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!indexPath) {
|
||||
throw new Error(`Unable to find index file for post: ${dir}`);
|
||||
}
|
||||
|
||||
return await generatePostFromFile(indexPath, {
|
||||
sourceDir: dir
|
||||
});
|
||||
}
|
||||
|
||||
export default async function posts(): Promise<Page[]> {
|
||||
const posts: Page[] = [];
|
||||
|
||||
const files = await fs.readdir("site/posts");
|
||||
for (const f of files) {
|
||||
const postPath = path.join("site/posts", f);
|
||||
let page = await metadata.get(postPath);
|
||||
const stats = await fs.stat(postPath);
|
||||
|
||||
if (!(<PostMetadata>page.metadata).permalink) {
|
||||
let postMeta = <PostMetadata>page.metadata;
|
||||
postMeta.date = dateFns.parse(postMeta.date);
|
||||
postMeta.slug = postMeta.slug || slugify(postMeta.title);
|
||||
postMeta.permalink = `/${postMeta.date.getFullYear()}/${postMeta.slug}/`;
|
||||
}
|
||||
let page: Page;
|
||||
|
||||
page.text = util.render(page.text, { metadata: page.metadata }, postPath);
|
||||
|
||||
if (page.metadata.source && page.metadata.source!.endsWith(".md")) {
|
||||
(<PostMetadata>page.metadata).wordCount = util.getWordCount(page.text);
|
||||
(<PostMetadata>page.metadata).readingTime = util.getReadingTime((<PostMetadata>page.metadata).wordCount);
|
||||
|
||||
page.text = markdown.render(page.text);
|
||||
}
|
||||
|
||||
if (!(<PostMetadata>page.metadata).excerpt) {
|
||||
const parts = page.text.split("<!-- excerpt-end -->");
|
||||
(<PostMetadata>page.metadata).excerpt = parts[0];
|
||||
if (stats.isDirectory()) {
|
||||
page = await generatePostFromDirectory(postPath);
|
||||
} else {
|
||||
page = await generatePostFromFile(postPath);
|
||||
}
|
||||
|
||||
const renderedText = await layout(page.text, page.metadata, page.metadata.layout || "article.html.ejs");
|
||||
|
|
|
@ -8,6 +8,7 @@ export interface Page {
|
|||
export interface Metadata {
|
||||
permalink: string;
|
||||
source?: string;
|
||||
sourceDir?: string;
|
||||
layout?: string;
|
||||
oldPermalink?: string;
|
||||
}
|
||||
|
|
|
@ -77,6 +77,7 @@ export function video(metadata: Metadata, name: string, attributes: object): str
|
|||
}
|
||||
|
||||
export function render(template: string, data: any, filename?: string): string {
|
||||
data.require = require;
|
||||
data.fancyLink = fancyLink;
|
||||
data.formatDate = formatDate;
|
||||
data.video = video;
|
||||
|
|
|
@ -143,4 +143,6 @@ func contextMenuInteraction(_ interaction: UIContextMenuInteraction, previewForD
|
|||
|
||||
Now, when dismissing the preview, it animates back into the link text where it originally came from:
|
||||
|
||||
<%- video(metadata, "dismiss", {style: "width: 50%; margin: 0 auto; display: block;", title: "Screen recording of a link being previewed and dismissed with the link text animating back to its starting position upon dismissal."}) %>
|
||||
<div>
|
||||
<%- video(metadata, "dismiss", {style: "width: 50%; margin: 0 auto; display: block;", title: "Screen recording of a link being previewed and dismissed with the link text animating back to its starting position upon dismissal."}) %>
|
||||
</div>
|
Loading…
Reference in New Issue