@@ -216,7 +216,18 @@ export const RichText = <
216216 value = contentRaw . content ;
217217 }
218218 }
219+
219220 const slugger = new GithubSlugger ( ) ;
221+ const sluggerCache = new Map < string , string > ( ) ;
222+
223+ const getSlug = ( text : string ) => {
224+ if ( sluggerCache . has ( text ) ) {
225+ return sluggerCache . get ( text ) ! ;
226+ }
227+ const slug = slugger . slug ( text ) ;
228+ sluggerCache . set ( text , slug ) ;
229+ return slug ;
230+ } ;
220231
221232 return (
222233 < >
@@ -227,7 +238,7 @@ export const RichText = <
227238 key = { index }
228239 components = { props . components }
229240 blocks = { props . blocks }
230- slugger = { slugger }
241+ getSlug = { getSlug }
231242 disableDefaultComponents = { props . disableDefaultComponents }
232243 />
233244 ) ;
@@ -319,14 +330,14 @@ const Node = ({
319330 node,
320331 components,
321332 blocks,
322- slugger ,
333+ getSlug ,
323334 disableDefaultComponents,
324335} : {
325336 node : RichTextNode ;
326337 components ?: Partial < Handlers > ;
327338 blocks ?: readonly CustomBlockBase [ ] ;
328339 parent ?: RichTextNode ;
329- slugger : GithubSlugger ;
340+ getSlug : ( text : string ) => string ;
330341 disableDefaultComponents ?: boolean ;
331342} ) => {
332343 const children = node . content ?. map ( ( childNode , index ) => {
@@ -337,7 +348,7 @@ const Node = ({
337348 key = { index }
338349 components = { components }
339350 blocks = { blocks }
340- slugger = { slugger }
351+ getSlug = { getSlug }
341352 disableDefaultComponents = { disableDefaultComponents }
342353 />
343354 ) ;
@@ -408,7 +419,7 @@ const Node = ({
408419 Handler =
409420 components ?. [ handlerTag ] ??
410421 ( disableDefaultComponents ? ( ) => < > </ > : defaultHandlers [ handlerTag ] ) ;
411- const id = slugger . slug ( extractTextFromNode ( node ) ) ;
422+ const id = getSlug ( extractTextFromNode ( node ) ) ;
412423
413424 props = { children, id } satisfies ExtractPropsForHandler < Handlers [ "h1" ] > ;
414425 break ;
@@ -455,7 +466,7 @@ const Node = ({
455466 parent = { node }
456467 components = { components }
457468 blocks = { blocks }
458- slugger = { slugger }
469+ getSlug = { getSlug }
459470 disableDefaultComponents = { disableDefaultComponents }
460471 />
461472 ) ;
@@ -807,6 +818,16 @@ export type TOCProps = {
807818
808819export const TOC = ( props : TOCProps ) : JSX . Element => {
809820 const slugger = new GithubSlugger ( ) ;
821+ const sluggerCache = new Map < string , string > ( ) ;
822+
823+ const getSlug = ( text : string ) => {
824+ if ( sluggerCache . has ( text ) ) {
825+ return sluggerCache . get ( text ) ! ;
826+ }
827+ const slug = slugger . slug ( text ) ;
828+ sluggerCache . set ( text , slug ) ;
829+ return slug ;
830+ } ;
810831
811832 const value = ( props . content ?? props . children ) as RichTextTocNode [ ] ;
812833
@@ -818,7 +839,7 @@ export const TOC = (props: TOCProps): JSX.Element => {
818839 node = { node as RichTextNode }
819840 key = { index }
820841 components = { props . components }
821- slugger = { slugger }
842+ getSlug = { getSlug }
822843 disableDefaultComponents = { props . disableDefaultComponents }
823844 />
824845 ) ;
0 commit comments