From 23300d1c1a9f99462c08d4e43ca68b1c3fd0cfd2 Mon Sep 17 00:00:00 2001 From: Sascha Date: Wed, 7 Apr 2021 18:51:51 +0200 Subject: Use custom anchor in markdown The custom anchor will be more readable in dark mode. Also it will supports linking within the SPA. --- webui/src/components/Content/AnchorTag.tsx | 38 ++++++++++++++++++++++++++++++ webui/src/components/Content/index.tsx | 2 ++ 2 files changed, 40 insertions(+) create mode 100644 webui/src/components/Content/AnchorTag.tsx (limited to 'webui/src/components/Content') diff --git a/webui/src/components/Content/AnchorTag.tsx b/webui/src/components/Content/AnchorTag.tsx new file mode 100644 index 00000000..47d5e2fa --- /dev/null +++ b/webui/src/components/Content/AnchorTag.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +import { makeStyles } from '@material-ui/core/styles'; + +const useStyles = makeStyles((theme) => ({ + tag: { + color: theme.palette.text.secondary, + }, +})); + +const AnchorTag = ({ children, href }: React.HTMLProps) => { + const classes = useStyles(); + const origin = window.location.origin; + const destination = href === undefined ? '' : href; + const isInternalLink = + destination.startsWith('/') || destination.startsWith(origin); + const internalDestination = destination.replace(origin, ''); + const internalLink = ( + + {children} + + ); + const externalLink = ( + + {children} + + ); + + return isInternalLink ? internalLink : externalLink; +}; + +export default AnchorTag; diff --git a/webui/src/components/Content/index.tsx b/webui/src/components/Content/index.tsx index 809ae818..e4018809 100644 --- a/webui/src/components/Content/index.tsx +++ b/webui/src/components/Content/index.tsx @@ -5,6 +5,7 @@ import parse from 'remark-parse'; import remark2react from 'remark-react'; import unified from 'unified'; +import AnchorTag from './AnchorTag'; import BlockQuoteTag from './BlockQuoteTag'; import ImageTag from './ImageTag'; import PreTag from './PreTag'; @@ -19,6 +20,7 @@ const Content: React.FC = ({ markdown }: Props) => { remarkReactComponents: { img: ImageTag, pre: PreTag, + a: AnchorTag, blockquote: BlockQuoteTag, }, }) -- cgit