OpenPanel/documentation/plugins/examples.ts
2024-02-05 10:23:04 +01:00

206 lines
6.1 KiB
TypeScript

import { Plugin } from "@docusaurus/types";
import path from "path";
type DocusaurusDoc = {
unversionedId: string;
id: string;
title: string;
description: string;
source: string;
sourceDirName: string;
slug: string;
permalink: string;
draft: boolean;
editUrl: string;
tags: string[];
version: string;
lastUpdatedBy: string;
lastUpdatedAt: number;
formattedLastUpdatedAt: string;
frontMatter: {
id: string;
title: string;
description?: string;
tags?: string[];
};
sidebar: string;
previous?: {
title: string;
permalink: string;
};
next?: {
title: string;
permalink: string;
};
};
type ContentPluginType = {
default: {
loadedVersions: Array<{ docs: DocusaurusDoc[] }>;
};
};
type ExampleDoc = Pick<
DocusaurusDoc,
"id" | "title" | "description" | "permalink"
> & { tags: string[] };
const colorByHash = (input: string) => {
let hash = 0;
let color = "#";
input.split("").forEach((char) => {
hash = char.charCodeAt(0) + ((hash << 5) - hash);
});
for (let i = 0; i < 3; i++) {
const value = (hash >> (i * 8)) & 0xff;
color += ("00" + value.toString(16)).slice(-2);
}
return color;
};
const addColorToTags = (tags: string[]) => {
let colors = [
"#ef4444",
"#f97316",
"#f59e0b",
"#eab308",
"#84cc16",
"#22c55e",
"#10b981",
"#14b8a6",
"#06b6d4",
"#0ea5e9",
"#3b82f6",
"#6366f1",
"#8b5cf6",
"#a855f7",
"#d946ef",
"#ec4899",
"#f43f5e",
];
// if there are more tags than colors, we will reuse colors.
// multiply the colors array until it is bigger than the tags array
while (colors.length < tags.length) {
colors = [...colors, ...colors];
}
const selectedColorIndexes: number[] = [];
const tagsWithColor = tags.map((tag) => {
// pick a random color
let randomColorIndex = Math.floor(Math.random() * colors.length);
// if the color is already used, pick another one
while (selectedColorIndexes.includes(randomColorIndex)) {
randomColorIndex = Math.floor(Math.random() * colors.length);
}
const color = colors[randomColorIndex];
selectedColorIndexes.push(randomColorIndex);
return {
name: tag,
color: color,
};
});
return tagsWithColor;
};
export default function plugin(): Plugin {
return {
name: "docusaurus-plugin-refine-examples",
configureWebpack(config) {
return {
resolve: {
alias: {
"@examples": path.join(
config.resolve?.alias?.["@generated"],
"docusaurus-plugin-refine-examples",
"default",
),
},
},
};
},
async contentLoaded({ allContent, actions }): Promise<void> {
if (!process.env.DISABLE_EXAMPLES) {
console.log("Composing Refine examples...");
const { createData } = actions;
const currentVersion = (
allContent[
"docusaurus-plugin-content-docs"
] as ContentPluginType
).default.loadedVersions[0];
const allDocs = currentVersion.docs as DocusaurusDoc[];
const allExamples: ExampleDoc[] = allDocs
.filter(
(doc) =>
doc.id.startsWith("examples/") &&
doc.id !== "examples/examples",
)
.map((doc) => {
const titleFromId =
doc.id
.replace("examples/", "")
.split("/")
.slice(0, -1)
.join("-") +
" " +
doc.title
.replace("antd", "Ant Design")
.replace("mui", "Material UI")
.replace("chakra-ui", "Chakra UI");
return {
// ...doc,
id: doc.id,
baseTitle: doc.title,
title: doc.title
.replace("antd", "Ant Design")
.replace("mui", "Material UI")
.replace("chakra-ui", "Chakra UI"),
displayTitle:
doc.frontMatter["example-title"] ??
titleFromId ??
doc.title
.replace("antd", "Ant Design")
.replace("mui", "Material UI")
.replace("chakra-ui", "Chakra UI"),
description: doc.description,
permalink: doc.permalink,
tags: doc.frontMatter["example-tags"] || [],
};
});
const allTags = allExamples
.reduce(
(acc, example) => [...acc, ...example.tags],
[] as string[],
)
.filter((tag, index, self) => self.indexOf(tag) === index);
const data = {
examples: allExamples,
tags: addColorToTags(allTags),
};
await createData(`examples-data.json`, JSON.stringify(data));
} else {
const { createData } = actions;
await createData(
`examples-data.json`,
JSON.stringify({ examples: [], tags: [] }),
);
}
},
};
}