diff --git a/components/content/Content.tsx b/components/content/Content.tsx
index 22db640b..679b6753 100644
--- a/components/content/Content.tsx
+++ b/components/content/Content.tsx
@@ -20,10 +20,11 @@ import Solution from "./Solution"
import { first } from "cypress/types/lodash"
import remarkDirective from "remark-directive"
import remarkDirectiveRehype from "remark-directive-rehype"
-import { CodeComponent, CodeProps, ReactMarkdownProps } from "react-markdown/lib/ast-to-react"
+import { CodeComponent, CodeProps, HeadingProps, ReactMarkdownProps } from "react-markdown/lib/ast-to-react"
import Callout from "../Callout"
import { Course, Section, Theme } from "lib/material"
import Paragraph from "./Paragraph"
+import Heading from "./Heading"
function reactMarkdownRemarkDirective() {
return (tree: any) => {
@@ -56,6 +57,13 @@ const list = (sectionStr: string) => {
return list
}
+const h = (sectionStr: string, tag: string) => {
+ function h({ node, children, ...props }: HeadingProps) {
+ return
+ }
+ return h
+}
+
let solutionCount = 0
function solution({ node, children, ...props }: ReactMarkdownProps) {
solutionCount++
@@ -161,6 +169,9 @@ const Content: React.FC = ({ markdown, theme, course, section }) => {
code,
p: p(sectionStr),
li: list(sectionStr),
+ h2: h(sectionStr, "h2"),
+ h3: h(sectionStr, "h3"),
+ h4: h(sectionStr, "h4"),
}}
>
{markdown}
diff --git a/components/content/Heading.tsx b/components/content/Heading.tsx
new file mode 100644
index 00000000..cc1e2583
--- /dev/null
+++ b/components/content/Heading.tsx
@@ -0,0 +1,43 @@
+import React, { useState } from "react"
+import CopyToClipboard from "react-copy-to-clipboard"
+import { FaLink } from "react-icons/fa"
+
+interface HeadingProps {
+ content: React.ReactNode
+ section: string
+ tag: string
+}
+
+const Heading: React.FC = ({ content, section, tag }) => {
+ const Tag = tag as keyof JSX.IntrinsicElements
+ const headingContent = content?.toString().replaceAll(" ", "-")
+ const [isCopied, setIsCopied] = useState(false)
+
+ const generateHeadingURL = () => {
+ const href: string = typeof window !== "undefined" ? window.location.href.split("#")[0] : ""
+ return href + "#" + headingContent ?? ""
+ }
+
+ const onCopyHandler = () => {
+ setIsCopied(true)
+ setTimeout(() => {
+ setIsCopied(false)
+ }, 1500)
+ }
+
+ return (
+ <>
+
+ {content}
+
+
+
+ {isCopied && Copied to clipboard!}
+
+ >
+ )
+}
+
+export default Heading