eleventy.config.js
import util from 'util';
import fsImport from 'fs';
import childProcess from 'child_process'
import darcsConfig from './darcsconfig.js'
const exec = util.promisify(childProcess.exec);
const fs = fsImport.promises
import { getDiffsFromPatchText } from './helpers.js'
import { EleventyRenderPlugin } from "@11ty/eleventy";
import reposFunc from './_data/repos.js'
import pluginRss from '@11ty/eleventy-plugin-rss'
const repos = await reposFunc()
export default (eleventyConfig) => {
eleventyConfig.addPlugin(EleventyRenderPlugin);
const passthroughs = {
"main.css": "main.css",
"prism.js": "prism.js",
"prism.css": "prism.css",
"prism_dark.css": "prism_dark.css",
}
Object.keys(darcsConfig.repos).forEach((repoName) => {
Object.keys(darcsConfig.repos[repoName].branches).forEach((branchName) => {
passthroughs[`${darcsConfig.repos[repoName].branches[branchName].location}/_darcs`] = `repos/${eleventyConfig.getFilter("slugify")(repoName)}/branches/${branchName}/_darcs`
})
})
eleventyConfig.addPassthroughCopy(passthroughs);
eleventyConfig.addFilter("keys", data => Object.keys(data))
eleventyConfig.addFilter("languageExtension", (filename, repoName) => {
let extension = filename.split(".")
extension = extension[extension.length - 1]
return darcsConfig.repos[repoName].languageExtensions[extension] || extension
})
eleventyConfig.addFilter("jsonStringify", data => JSON.stringify(data))
eleventyConfig.addFilter("pagesJustForBranch", (pages, repoName, branchName) => {
return pages.filter(page => page.repoName === repoName && page.branchName === branchName)
})
eleventyConfig.addAsyncFilter("getReadMe", async (repoName, branchName) => {
const res = await exec(`(cd ${darcsConfig.repos[repoName].branches[branchName].location}; darcs show contents README.md)`)
return res.stdout
})
eleventyConfig.addFilter("date", (dateString) => {
return new Date(dateString).toDateString()
})
eleventyConfig.addFilter("dateForRss", (dateString) => {
return new Date(dateString).toUTCString()
})
eleventyConfig.addAsyncFilter("isDirectory", async(repo, branch, filename) => {
try {
const fileInfo = await fs.stat(`${darcsConfig.repos[repo].branches[branch].location}/${filename}`)
return fileInfo ? fileInfo.isDirectory() : false
}
catch {
return false // this can happen if a file is deleted and we're generating the
// site before recording the patch, so it's still trying to find
// all of the files in `darcs show files`.
}
})
eleventyConfig.addFilter("getDirectoryContents", (repo, branch, dirPath) => {
return repos[repo][branch].files.filter(file => file.startsWith(dirPath) && file !== dirPath)
})
eleventyConfig.addFilter("getRelativePath", (currentDir, fullFilePath) => {
return fullFilePath.replace(`${currentDir}/`, "")
})
eleventyConfig.addAsyncFilter("getFileContents", async (repo, branch, filename) => {
const res = await exec(`(cd ${darcsConfig.repos[repo].branches[branch].location}; darcs show contents ${filename})`)
return res.stdout
})
eleventyConfig.addFilter("topLevelFilesOnly", (files) => {
const onlyUnique = (value, index, array) => {
return array.indexOf(value) === index;
}
const topLevels = files.map((file) => {
const parts = file.split("/").filter(part => part !== ".")
return parts[0]
}).filter(onlyUnique)
return topLevels
})
eleventyConfig.addFilter("getFileName", (filePath) => {
const pathParts = filePath.split("/")
return pathParts[pathParts.length - 1]
})
eleventyConfig.addPlugin(pluginRss)
}