UNPKG

@udecode/plate-heading

Version:

Headings plugin for Plate

1 lines 29.1 kB
{"version":3,"sources":["../../src/react/HeadingPlugin.tsx","../../src/lib/BaseHeadingPlugin.ts","../../src/lib/constants.ts","../../src/react/TocPlugin.tsx","../../src/lib/BaseTocPlugin.ts","../../src/lib/utils/isHeading.ts","../../src/react/hooks/useContentController.ts","../../src/react/utils/checkIn.ts","../../src/react/utils/heightToTop.ts","../../src/react/hooks/useContentObserver.ts","../../src/internal/getHeadingList.ts","../../src/react/hooks/useTocController.ts","../../src/react/hooks/useTocObserver.ts","../../src/react/hooks/useTocElement.ts","../../src/react/hooks/useTocSideBar.ts"],"sourcesContent":["import {\n type PlatePlugin,\n Key,\n toPlatePlugin,\n} from '@udecode/plate-common/react';\n\nimport { BaseHeadingPlugin } from '../lib/BaseHeadingPlugin';\n\nexport const HeadingPlugin = toPlatePlugin(BaseHeadingPlugin, ({ plugin }) => ({\n plugins: (plugin as unknown as PlatePlugin).plugins.map((p) =>\n (p as PlatePlugin).extend(({ editor, type }) => {\n const level = p.key.at(-1);\n\n if (level > 3) return {};\n\n return {\n shortcuts: {\n ['toggleHeading' + level]: {\n keys: [\n [Key.Mod, Key.Alt, level],\n [Key.Mod, Key.Shift, level],\n ],\n preventDefault: true,\n handler: () => {\n editor.tf.toggle.block({ type });\n },\n },\n },\n };\n })\n ),\n}));\n","import {\n type PluginConfig,\n type SlatePlugin,\n createSlatePlugin,\n createTSlatePlugin,\n} from '@udecode/plate-common';\n\nimport { HEADING_LEVELS } from './constants';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport type HeadingConfig = PluginConfig<\n 'heading',\n {\n /** Heading levels supported from 1 to `levels` */\n levels?: HeadingLevel | HeadingLevel[];\n }\n>;\n\n/** Enables support for headings with configurable levels (from 1 to 6). */\nexport const BaseHeadingPlugin = createTSlatePlugin<HeadingConfig>({\n key: 'heading',\n options: {\n levels: [1, 2, 3, 4, 5, 6],\n },\n}).extend(({ plugin }) => {\n const {\n options: { levels },\n } = plugin;\n\n const plugins: SlatePlugin[] = [];\n\n const headingLevels = Array.isArray(levels)\n ? levels\n : Array.from({ length: levels || 6 }, (_, i) => i + 1);\n\n headingLevels.forEach((level) => {\n const plugin: SlatePlugin = createSlatePlugin({\n key: HEADING_LEVELS[level - 1],\n node: { isElement: true },\n parsers: {\n html: {\n deserializer: {\n rules: [\n {\n validNodeName: `H${level}`,\n },\n ],\n },\n },\n },\n });\n\n plugins.push(plugin);\n });\n\n return {\n plugins,\n };\n});\n","export const HEADING_KEYS = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n} as const;\n\nexport const HEADING_LEVELS = [\n HEADING_KEYS.h1,\n HEADING_KEYS.h2,\n HEADING_KEYS.h3,\n HEADING_KEYS.h4,\n HEADING_KEYS.h5,\n HEADING_KEYS.h6,\n];\n","import { toPlatePlugin } from '@udecode/plate-common/react';\n\nimport { BaseTocPlugin } from '../lib';\n\nexport const TocPlugin = toPlatePlugin(BaseTocPlugin);\n","import {\n type PluginConfig,\n type SlateEditor,\n createTSlatePlugin,\n} from '@udecode/plate-common';\n\nimport type { Heading } from './types';\n\nexport type TocConfig = PluginConfig<\n 'toc',\n {\n isScroll: boolean;\n topOffset: number;\n queryHeading?: (editor: SlateEditor) => Heading[];\n }\n>;\n\nexport const BaseTocPlugin = createTSlatePlugin<TocConfig>({\n key: 'toc',\n node: { isElement: true, isVoid: true },\n options: {\n isScroll: true,\n topOffset: 80,\n },\n});\n","import type { TNode } from '@udecode/plate-common';\n\nimport { HEADING_LEVELS } from '../constants';\n\nexport const isHeading = (node: TNode) => {\n return node.type && HEADING_LEVELS.includes(node.type as any);\n};\n","'use client';\n\nimport React from 'react';\n\nimport { useEditorRef } from '@udecode/plate-common/react';\n\nimport type { UseContentController } from '../types';\n\nimport { heightToTop } from '../utils';\nimport { useContentObserver } from './useContentObserver';\n\nexport const useContentController = ({\n containerRef,\n isObserve,\n rootMargin,\n topOffset,\n}: UseContentController) => {\n const editor = useEditorRef();\n const [editorContentRef, setEditorContentRef] = React.useState(containerRef);\n\n const isScrollRef = React.useRef(false);\n\n const isScroll =\n (editorContentRef.current?.scrollHeight || 0) >\n (editorContentRef.current?.clientHeight || 0);\n\n isScrollRef.current = isScroll;\n\n const scrollContainer = React.useMemo(() => {\n if (typeof window !== 'object') return;\n\n return isScroll ? editorContentRef.current : window;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isScroll]);\n\n const [status, setStatus] = React.useState(0);\n\n const { activeId } = useContentObserver({\n editorContentRef,\n isObserve,\n isScroll,\n rootMargin,\n status,\n });\n\n const [activeContentId, setActiveContentId] = React.useState(activeId);\n\n const onContentScroll = ({\n id,\n behavior = 'instant',\n el,\n }: {\n id: string;\n el: HTMLElement;\n behavior?: ScrollBehavior;\n }) => {\n setActiveContentId(id);\n\n if (isScrollRef.current) {\n editorContentRef.current?.scrollTo({\n behavior,\n top: heightToTop(el, editorContentRef) - topOffset,\n });\n } else {\n const top = heightToTop(el) - topOffset;\n // Note: if behavior === smooth,scrolling the toc then click the title immediately will scroll to the wrong position.It should be a chrome bug.\n window.scrollTo({ behavior, top });\n }\n\n editor\n .getApi({ key: 'blockSelection' })\n .blockSelection?.addSelectedRow?.(id);\n };\n\n React.useEffect(() => {\n setEditorContentRef(containerRef);\n }, [containerRef]);\n\n React.useEffect(() => {\n setActiveContentId(activeId);\n }, [activeId]);\n\n React.useEffect(() => {\n if (!scrollContainer) return;\n\n const scroll = () => {\n if (isObserve) {\n setStatus(Date.now());\n }\n };\n\n scrollContainer.addEventListener('scroll', scroll);\n\n return () => {\n scrollContainer.removeEventListener('scroll', scroll);\n };\n }, [isObserve, scrollContainer]);\n\n return { activeContentId, onContentScroll };\n};\n","export function checkIn(\n e: React.MouseEvent<HTMLElement, globalThis.MouseEvent>\n) {\n const event = window.event as unknown as React.MouseEvent<\n HTMLElement,\n globalThis.MouseEvent\n >;\n const x = Number(event.clientX); // 鼠标相对屏幕横坐标\n const y = Number(event.clientY); // 鼠标相对屏幕纵坐标\n\n const ele = e.target as HTMLElement;\n const div_x = Number(ele.getBoundingClientRect().left); // 相对屏幕的横坐标\n const div_x_width = Number(\n ele.getBoundingClientRect().left + ele.clientWidth\n ); // 相对屏幕的横坐标+width\n\n const div_y = Number(ele.getBoundingClientRect().top); // 相对屏幕的纵坐标\n const div_y_height = Number(\n ele.getBoundingClientRect().top + ele.clientHeight\n ); // 相对屏幕的纵坐标+height\n\n if (x > div_x && x < div_x_width && y > div_y && y < div_y_height) {\n return true;\n }\n\n return false;\n}\n","import type React from 'react';\n\nexport const heightToTop = (\n ele: HTMLElement,\n editorContentRef?: React.RefObject<HTMLDivElement>\n) => {\n const root = editorContentRef ? editorContentRef.current : document.body;\n\n if (!root || !ele) return 0;\n\n const containerRect = root.getBoundingClientRect();\n const elementRect = ele.getBoundingClientRect();\n\n const scrollY = root.scrollTop;\n const absoluteElementTop = elementRect.top + scrollY - containerRect.top;\n\n return absoluteElementTop;\n};\n","import React from 'react';\n\nimport { getNode } from '@udecode/plate-common';\nimport {\n toDOMNode,\n useEditorRef,\n useEditorSelector,\n} from '@udecode/plate-common/react';\n\nimport { getHeadingList } from '../../internal/getHeadingList';\n\ninterface UseContentObserver {\n editorContentRef: React.RefObject<HTMLElement>;\n isObserve: boolean;\n isScroll: boolean;\n rootMargin: string;\n status: number;\n}\n\nexport const useContentObserver = ({\n editorContentRef,\n isObserve,\n isScroll,\n rootMargin,\n status,\n}: UseContentObserver) => {\n const headingElementsRef = React.useRef<\n Record<string, IntersectionObserverEntry>\n >({});\n\n const root = isScroll ? editorContentRef.current : undefined;\n const editor = useEditorRef();\n const headingList = useEditorSelector(getHeadingList, []);\n\n const [activeId, setActiveId] = React.useState('');\n\n React.useEffect(() => {\n const callback = (headings: IntersectionObserverEntry[]) => {\n if (!isObserve) return;\n\n headingElementsRef.current = headings.reduce((map, headingElement) => {\n map[headingElement.target.id] = headingElement;\n\n return map;\n }, headingElementsRef.current);\n\n const visibleHeadings: string[] = [];\n\n Object.keys(headingElementsRef.current).forEach((key) => {\n const headingElement = headingElementsRef.current[key];\n\n if (headingElement.isIntersecting) visibleHeadings.push(key);\n });\n const lastKey = Object.keys(headingElementsRef.current).pop()!;\n visibleHeadings.length > 0 && setActiveId(visibleHeadings[0] || lastKey);\n headingElementsRef.current = {};\n };\n const observer = new IntersectionObserver(callback, {\n root: root,\n rootMargin: rootMargin,\n });\n\n headingList.forEach((item) => {\n const { path } = item;\n\n const node = getNode(editor, path);\n\n if (!node) return;\n\n const element = toDOMNode(editor, node);\n\n return element && observer.observe(element);\n });\n\n return () => {\n observer.disconnect();\n };\n }, [headingList, isObserve, editor, root, rootMargin, status]);\n\n return { activeId };\n};\n","import {\n type SlateEditor,\n type TElement,\n getNodeEntries,\n getNodeString,\n} from '@udecode/plate-common';\n\nimport type { Heading } from '../lib/types';\n\nimport { BaseTocPlugin } from '../lib';\nimport { HEADING_KEYS } from '../lib/constants';\nimport { isHeading } from '../lib/utils/isHeading';\n\nconst headingDepth: Record<string, number> = {\n [HEADING_KEYS.h1]: 1,\n [HEADING_KEYS.h2]: 2,\n [HEADING_KEYS.h3]: 3,\n [HEADING_KEYS.h4]: 4,\n [HEADING_KEYS.h5]: 5,\n [HEADING_KEYS.h6]: 6,\n};\n\nexport const getHeadingList = (editor: SlateEditor) => {\n const options = editor.getOptions(BaseTocPlugin);\n\n if (options.queryHeading) {\n return options.queryHeading(editor);\n }\n\n const headingList: Heading[] = [];\n\n const values = getNodeEntries(editor, {\n at: [],\n match: (n) => isHeading(n),\n });\n\n if (!values) return [];\n\n Array.from(values, ([node, path]) => {\n const { type } = node as TElement;\n const title = getNodeString(node);\n const depth = headingDepth[type];\n const id = node.id;\n title && headingList.push({ id, depth, path, title, type });\n });\n\n return headingList;\n};\n","import React from 'react';\n\nimport { useTocObserver } from './useTocObserver';\n\ninterface UseTocController {\n activeId: string;\n isObserve: boolean;\n tocRef: React.RefObject<HTMLElement>;\n}\n\nexport const useTocController = ({\n activeId,\n isObserve,\n tocRef,\n}: UseTocController) => {\n const [activeTocId, setActiveTocId] = React.useState('');\n const { offset, visible } = useTocObserver({\n activeId: activeTocId,\n isObserve,\n tocRef,\n });\n\n React.useEffect(() => {\n if (!visible) {\n const tocItemWrapper = tocRef.current?.querySelector('#toc_wrap');\n const top = (tocItemWrapper?.scrollTop as any) + offset;\n\n tocItemWrapper?.scrollTo({ behavior: 'instant', top: top });\n }\n }, [visible, offset, tocRef]);\n\n React.useEffect(() => {\n setActiveTocId(activeId);\n }, [activeId]);\n};\n","import React from 'react';\n\ninterface UseTocObserver {\n activeId: string;\n isObserve: boolean;\n tocRef: React.RefObject<HTMLElement>;\n}\n\nexport const useTocObserver = ({\n activeId,\n isObserve,\n tocRef,\n}: UseTocObserver) => {\n const root = tocRef.current;\n\n const [visible, setVisible] = React.useState<boolean>(true);\n const [offset, setOffset] = React.useState<number>(0);\n\n const updateOffset = React.useCallback(\n (entries: IntersectionObserverEntry[]) => {\n if (!isObserve) return;\n\n const [entry] = entries;\n const { boundingClientRect, intersectionRatio, rootBounds } = entry;\n\n if (!rootBounds) return;\n\n const halfHeight = (root?.getBoundingClientRect().height || 0) / 2;\n const isAbove = boundingClientRect.top < rootBounds.top;\n const isBelow = boundingClientRect.bottom > rootBounds.bottom;\n const isVisible = intersectionRatio === 1;\n\n setVisible(isVisible);\n\n if (!isVisible) {\n const offset = isAbove\n ? boundingClientRect.top - rootBounds!.top! - halfHeight\n : isBelow\n ? boundingClientRect.bottom - rootBounds!.bottom! + halfHeight\n : 0;\n\n setOffset(offset);\n }\n },\n [isObserve, root]\n );\n\n React.useEffect(() => {\n const observer = new IntersectionObserver(updateOffset, {\n root: root,\n });\n\n const element = root?.querySelectorAll('#toc_item_active')[0];\n\n if (element) observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [root, activeId, updateOffset]);\n\n return { offset, visible };\n};\n","import React from 'react';\n\nimport { getNode } from '@udecode/plate-common';\nimport {\n toDOMNode,\n useEditorPlugin,\n useEditorSelector,\n useScrollRef,\n} from '@udecode/plate-common/react';\n\nimport type { Heading } from '../../lib/types';\n\nimport { getHeadingList } from '../../internal/getHeadingList';\nimport { TocPlugin } from '../TocPlugin';\nimport { heightToTop } from '../utils';\n\nexport const useTocElementState = () => {\n const { editor, getOptions } = useEditorPlugin(TocPlugin);\n const { isScroll, topOffset } = getOptions();\n\n const headingList = useEditorSelector(getHeadingList, []);\n\n const containerRef = useScrollRef();\n\n const onContentScroll = React.useCallback(\n (el: HTMLElement, id: string, behavior: ScrollBehavior = 'instant') => {\n if (!containerRef.current) return;\n if (isScroll) {\n containerRef.current?.scrollTo({\n behavior,\n top: heightToTop(el, containerRef as any) - topOffset,\n });\n } else {\n const top = heightToTop(el) - topOffset;\n window.scrollTo({ behavior, top });\n }\n\n setTimeout(() => {\n editor\n .getApi({ key: 'blockSelection' })\n .blockSelection?.addSelectedRow?.(id);\n }, 0);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isScroll, topOffset]\n );\n\n return { editor, headingList, onContentScroll };\n};\n\nexport const useTocElement = ({\n editor,\n onContentScroll,\n}: ReturnType<typeof useTocElementState>) => {\n return {\n props: {\n onClick: (\n e: React.MouseEvent<HTMLElement, globalThis.MouseEvent>,\n item: Heading,\n behavior: ScrollBehavior\n ) => {\n e.preventDefault();\n const { id, path } = item;\n const node = getNode(editor, path);\n\n if (!node) return;\n\n const el = toDOMNode(editor, node);\n\n if (!el) return;\n\n onContentScroll(el, id, behavior);\n },\n },\n };\n};\n","import React from 'react';\n\nimport { getNode } from '@udecode/plate-common';\nimport {\n toDOMNode,\n useEditorPlugin,\n useEditorSelector,\n useScrollRef,\n} from '@udecode/plate-common/react';\n\nimport type { Heading } from '../../lib/types';\nimport type { TocSideBarProps } from '../types';\n\nimport { useContentController, useTocController } from '.';\nimport { getHeadingList } from '../../internal/getHeadingList';\nimport { TocPlugin } from '../TocPlugin';\nimport { checkIn } from '../utils';\n\nexport const useTocSideBarState = ({\n open = true,\n rootMargin = '0px 0px 0px 0px',\n topOffset = 0,\n}: TocSideBarProps) => {\n const { editor } = useEditorPlugin(TocPlugin);\n const headingList = useEditorSelector(getHeadingList, []);\n const containerRef = useScrollRef();\n\n const tocRef = React.useRef<HTMLElement>(null);\n\n const [mouseInToc, setMouseInToc] = React.useState(false);\n\n const [isObserve, setIsObserve] = React.useState(open);\n\n const { activeContentId, onContentScroll } = useContentController({\n containerRef,\n isObserve,\n rootMargin,\n topOffset,\n });\n\n useTocController({\n activeId: activeContentId,\n isObserve,\n tocRef,\n });\n\n return {\n activeContentId,\n editor,\n headingList,\n mouseInToc,\n open,\n setIsObserve,\n setMouseInToc,\n tocRef,\n onContentScroll,\n };\n};\n\nexport const useTocSideBar = ({\n editor,\n mouseInToc,\n open,\n setIsObserve,\n setMouseInToc,\n tocRef,\n onContentScroll,\n}: ReturnType<typeof useTocSideBarState>) => {\n React.useEffect(() => {\n if (mouseInToc) {\n setIsObserve(false);\n } else {\n setIsObserve(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mouseInToc]);\n\n const onContentClick = React.useCallback(\n (\n e: React.MouseEvent<HTMLElement, globalThis.MouseEvent>,\n item: Heading,\n behavior?: ScrollBehavior\n ) => {\n e.preventDefault();\n const { id, path } = item;\n const node = getNode(editor, path);\n\n if (!node) return;\n\n const el = toDOMNode(editor, node);\n\n if (!el) return;\n\n onContentScroll({ id, behavior, el });\n },\n [editor, onContentScroll]\n );\n\n return {\n navProps: {\n ref: tocRef,\n onMouseEnter: () => {\n !mouseInToc && open && setMouseInToc(true);\n },\n onMouseLeave: (\n e: React.MouseEvent<HTMLElement, globalThis.MouseEvent>\n ) => {\n if (open) {\n const isIn = checkIn(e);\n isIn !== mouseInToc && setMouseInToc(isIn);\n }\n },\n },\n onContentClick,\n };\n};\n"],"mappings":"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","names":["plugin","toPlatePlugin","createTSlatePlugin","toPlatePlugin","React","useEditorRef","useEditorRef","React","_a","_b","React","React","offset","React","React","getNode","toDOMNode","useEditorSelector","useEditorSelector","React","_a","getNode","toDOMNode","React","getNode","toDOMNode","useEditorPlugin","useEditorSelector","useScrollRef","useEditorPlugin","useEditorSelector","useScrollRef","React","getNode","toDOMNode"]}