Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrate wiki-link plugin #51

Merged
merged 8 commits into from
Dec 4, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions docs/wikilink_demo.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
slug: /wikilink_demo
tukib marked this conversation as resolved.
Show resolved Hide resolved
title: Wiki-Link Demo
unlisted: true
---

This is another page. Check out [[Home]] or [[xena.puppies]].

## Section 1

Ut et eros et justo consectetur semper dictum nec orci. Donec tempor mi orci. In hac habitasse platea dictumst. Phasellus eu elementum mauris. Donec mollis lacus ut dolor rutrum, at ultrices enim cursus. Proin ac velit urna. Vestibulum sollicitudin metus est. Fusce in libero sed lorem tincidunt tempus. Cras consequat urna eu semper interdum. Morbi ornare consectetur tortor, ut sodales est tincidunt id. Donec ipsum enim, aliquam vitae pharetra sagittis, maximus sit amet ipsum. Phasellus a lorem feugiat, iaculis risus vel, mollis lacus. Etiam rutrum cursus ante, at semper mauris tristique ac. Morbi consequat lacus sapien, volutpat dapibus tortor vehicula eu. Suspendisse vulputate, nisi eu scelerisque dapibus, lacus massa faucibus justo, facilisis faucibus ipsum est sodales risus.

## Section 2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed auctor ornare orci, vel gravida velit venenatis eget. Sed auctor, sem vitae consectetur egestas, tellus purus gravida nisl, et porta ipsum urna eu mauris. Morbi ultricies libero in iaculis eleifend. Nulla facilisi. Vivamus mattis tempus nisi, nec ultrices mauris tristique in. Nunc pulvinar aliquam lectus nec gravida. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In pellentesque massa et arcu auctor, porttitor ultrices dolor sagittis. Nulla pellentesque volutpat risus id congue.

### Section 2.1

Nullam placerat elit nec turpis imperdiet molestie non ut lacus. Pellentesque a molestie nibh. Fusce viverra egestas felis, et porttitor magna efficitur et. Aenean gravida quam et commodo dignissim. Duis nec nibh dolor. Cras vestibulum in odio vitae posuere. Donec convallis maximus consequat. Nam et mattis purus. Curabitur iaculis quam ligula, at facilisis elit egestas sit amet. Nam a ullamcorper nisi, quis luctus leo. Ut eleifend dui odio, ut maximus elit lobortis id. Phasellus bibendum, purus in bibendum tincidunt, ligula neque vulputate nulla, at sollicitudin lacus lorem vel risus. Nam consectetur scelerisque orci eget convallis. In nec ornare dui. Pellentesque eu felis imperdiet, euismod leo et, euismod ex. Nullam nec dignissim sapien, eu tempor erat.
3 changes: 2 additions & 1 deletion docusaurus.config.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// @ts-check
import pluginContentDocsWrapper from "./src/plugins/pluginContentDocsWrapper";

const GITHUB_ORG = "comcode-org";
const GITHUB_PROJECT = "hackmud_wiki";
Expand Down Expand Up @@ -29,7 +30,7 @@ const config = {
// Installed plugins
plugins: [
[
"@docusaurus/plugin-content-docs",
pluginContentDocsWrapper, // wraps @docusaurus/plugin-content-docs
// See: https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-docs#configuration
{
// Path of the docs plugin relative to the root. Since it's the only
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
"@docusaurus/plugin-content-docs": "^3.0.1",
"@docusaurus/theme-classic": "^3.0.1",
"@mdx-js/react": "^3.0.0",
"react": "^18.2.0"
"react": "^18.2.0",
"remark-wiki-link": "^2.0.1"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "^3.0.1",
Expand Down
94 changes: 94 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions src/css/custom.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**
* WIKILINK CLASSES
*/
/*.wikilink {}*/
.wikilink-new,
tukib marked this conversation as resolved.
Show resolved Hide resolved
.wikilink-new:hover {
color: var(--ifm-color-danger);
}
96 changes: 96 additions & 0 deletions src/plugins/pluginContentDocsWrapper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import pluginContentDocs, {
LoadedContent,
LoadedVersion,
PluginOptions,
} from "@docusaurus/plugin-content-docs";
import { LoadContext, Plugin } from "@docusaurus/types";
import remarkWikiLink from "remark-wiki-link";

function getCurrentVersion(content: LoadedContent): LoadedVersion {
return content.loadedVersions.find(
(version) => version.versionName === "current",
);
}

function getConfiguredWikiLinkPlugin(
content: LoadedContent,
): [Function, object] {
const docs = getCurrentVersion(content).docs;
return [
remarkWikiLink,
{
// class attached to all generated links
wikiLinkClassName: "wikilink",

// class attached to resolved links not found in permalinks
newClassName: "wikilink-new",

// list of permalinks that exist
permalinks: docs.map((doc) => doc.permalink),

// href path that the plugin generates based on the permalink
hrefTemplate: function (permalink: string): string {
return permalink;
},

/**
* 1. A wikilink can contain either a page name or slug.
* - e.g. `[[Name]]` `[[slug/path]]` `[[Alias:...]]`
*
* 2. The resolver will return a permalink for a page where the link name
* is the title or the link slug is a suffix* of the permalink.
* - *bar/baz matches foo/bar/baz but not foobar/baz
*
* 3. The resolver will return a permalink for a page at the highest
* directory level possible.
* - e.g. bar/baz matches /foo/bar/baz but prefers /bar/baz if present
*
* 4. The resolver will return the slug instead if no matching docs exist.
*/
pageResolver: function (pageName: string): string[] {
const name = pageName.toLowerCase();
const slugReference = name[0] === "/" ? name : "/" + name;

const relevantDocs = docs.filter(
(doc) =>
doc.title.toLowerCase() === name ||
doc.permalink.endsWith(slugReference),
);

if (relevantDocs.length <= 0) {
return [slugReference];
}

const topLevelRelevantDoc = relevantDocs.reduce((docA, docB) => {
const depthA = docA.permalink.split("/").length;
const depthB = docB.permalink.split("/").length;
return depthA <= depthB ? docA : docB;
});

return [topLevelRelevantDoc.permalink];
},
},
];
}

/**
* Returns a copy of the `@docusaurus/plugin-content-docs` plugin.
*
* The `contentLoaded` method is overridden to inject the `remark-wiki-link`
* plugin and a configuration for it.
*/
export default async function pluginContentDocsWrapper(
context: LoadContext,
options: PluginOptions,
): Promise<Plugin<LoadedContent>> {
const originalPlugin = await pluginContentDocs(context, options);
return {
...originalPlugin,
contentLoaded: function (args) {
options.remarkPlugins.push(getConfiguredWikiLinkPlugin(args.content));
return originalPlugin.contentLoaded(args);
},
};
}

export { validateOptions } from "@docusaurus/plugin-content-docs/lib/options.js";
Loading