mirror of
https://github.com/vacp2p/rfc.vac.dev.git
synced 2026-01-09 22:27:59 -05:00
feature: support for multiple versions of the same document (#6)
This commit is contained in:
50
docusaurus-utils/sidebar/classifiers.js
Normal file
50
docusaurus-utils/sidebar/classifiers.js
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
const {
|
||||||
|
isIndexDocument,
|
||||||
|
getRFCOccurrenceMapKey
|
||||||
|
} = require("./helpers");
|
||||||
|
const { isNumber } = require('./utils')
|
||||||
|
|
||||||
|
// By convention, Docusaurus considers some docs are "indexes":
|
||||||
|
// - index.md
|
||||||
|
// - readme.md
|
||||||
|
// - <folder>/<folder>.md
|
||||||
|
//
|
||||||
|
// This function is the default implementation of this convention
|
||||||
|
//
|
||||||
|
// Those index docs produce a different behavior
|
||||||
|
// - Slugs do not end with a weird "/index" suffix
|
||||||
|
// - Auto-generated sidebar categories link to them as intro
|
||||||
|
const isCategoryIndex = (rfcOccurrenceMap) => ({
|
||||||
|
fileName,
|
||||||
|
directories,
|
||||||
|
extension
|
||||||
|
}) => {
|
||||||
|
const isIndexByName = isIndexDocument(fileName, directories[0]);
|
||||||
|
const isRFCWithMultipleVersions = isVersionedRFC(fileName, directories, extension, rfcOccurrenceMap);
|
||||||
|
|
||||||
|
return (isIndexByName || isRFCWithMultipleVersions)
|
||||||
|
}
|
||||||
|
|
||||||
|
function isVersionedRFC(fileName, directories, extension, rfcOccurrenceMap) {
|
||||||
|
if (extension.toLowerCase() !== ".md") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isNumber(directories[0])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rfcOccurrenceMap) {
|
||||||
|
const key = getRFCOccurrenceMapKey(fileName, extension, directories.reverse().join("/"));
|
||||||
|
|
||||||
|
if (rfcOccurrenceMap[key] >= 2) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
isCategoryIndex
|
||||||
|
}
|
||||||
@@ -5,9 +5,15 @@ const {
|
|||||||
separateFoldersAndFilesOrder,
|
separateFoldersAndFilesOrder,
|
||||||
orderAlphabeticallyAndByNumber
|
orderAlphabeticallyAndByNumber
|
||||||
} = require("./modifiers")
|
} = require("./modifiers")
|
||||||
|
const { isCategoryIndex } = require("./classifiers")
|
||||||
|
const { rawDocsToRFCOccurrenceMap } = require("./helpers")
|
||||||
|
|
||||||
async function sidebarItemsGenerator({defaultSidebarItemsGenerator, ...args}) {
|
async function sidebarItemsGenerator({defaultSidebarItemsGenerator, ...args}) {
|
||||||
const defaultSidebarItems = await defaultSidebarItemsGenerator(args);
|
const rfcOccurrenceMap = rawDocsToRFCOccurrenceMap(args.docs)
|
||||||
|
const defaultSidebarItems = await defaultSidebarItemsGenerator({
|
||||||
|
...args,
|
||||||
|
isCategoryIndex: isCategoryIndex(rfcOccurrenceMap)
|
||||||
|
});
|
||||||
|
|
||||||
/*
|
/*
|
||||||
We'll have multiple O(N) passes through the items depending on the reducer implementation,
|
We'll have multiple O(N) passes through the items depending on the reducer implementation,
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
const path = require("path")
|
||||||
|
|
||||||
function isIndexDocument(documentId, parentDirectory) {
|
function isIndexDocument(documentId, parentDirectory) {
|
||||||
if (!documentId) {
|
if (!documentId) {
|
||||||
return false
|
return false
|
||||||
@@ -10,6 +12,41 @@ function isIndexDocument(documentId, parentDirectory) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function rawDocsToRFCOccurrenceMap(rawDocs) {
|
||||||
|
/*
|
||||||
|
Map containing occurrences of items
|
||||||
|
The key is made of (Root Numbered Folder + lowercase(Filename + Extension))
|
||||||
|
The value is number of occurrences
|
||||||
|
*/
|
||||||
|
const occurrenceMap = {}
|
||||||
|
|
||||||
|
rawDocs.forEach(rawDoc => {
|
||||||
|
const { name, ext } = path.parse(rawDoc.source)
|
||||||
|
const key = getRFCOccurrenceMapKey(name, ext, rawDoc.sourceDirName)
|
||||||
|
|
||||||
|
if (key) {
|
||||||
|
occurrenceMap[key] = (occurrenceMap[key] || 0) + 1;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return occurrenceMap
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRFCOccurrenceMapKey(fileName, ext, dir) {
|
||||||
|
const parsedDir = dir[0] !== "/" ? `/${dir}` : dir.toString();
|
||||||
|
const parsedExt = ext[0] === "." ? ext.slice(1) : ext;
|
||||||
|
|
||||||
|
const match = parsedDir.match(/.*\/\d+(?=\/|$)/)
|
||||||
|
if (match) {
|
||||||
|
const rootNumberedRFC = match[0]
|
||||||
|
return `${rootNumberedRFC}/${fileName.toLowerCase()}.${parsedExt.toLowerCase()}`
|
||||||
|
} else {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
isIndexDocument
|
isIndexDocument,
|
||||||
|
getRFCOccurrenceMapKey,
|
||||||
|
rawDocsToRFCOccurrenceMap
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
function isNumber(value) {
|
function isNumber(value) {
|
||||||
if (true === Array.isArray(value)) {
|
if (Array.isArray(value)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return !isNaN(parseInt(value, 10));
|
return !isNaN(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user