mirror of
https://github.com/angular/angular
synced 2026-05-24 09:28:37 +00:00
30 lines
978 B
TypeScript
30 lines
978 B
TypeScript
|
|
/*!
|
||
|
|
* @license
|
||
|
|
* Copyright Google LLC All Rights Reserved.
|
||
|
|
*
|
||
|
|
* Use of this source code is governed by an MIT-style license that can be
|
||
|
|
* found in the LICENSE file at https://angular.dev/license
|
||
|
|
*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Extracts the ID from a heading text.
|
||
|
|
* Supports custom ID syntax: `## My Heading {#custom-id}`
|
||
|
|
*/
|
||
|
|
export function getIdFromHeading(heading: string): string {
|
||
|
|
// extract the extended markdown heading id
|
||
|
|
// ex: ## MyHeading {# myId}
|
||
|
|
// This is recommended in case we end up having duplicate Ids but we still want the same heading text.
|
||
|
|
// We don't want to make Id generation stateful/too complex to handle duplicates automatically.
|
||
|
|
const customIdRegex = /{#\s*([\w-]+)\s*}/g;
|
||
|
|
const customId = customIdRegex.exec(heading)?.[1];
|
||
|
|
|
||
|
|
if (customId) {
|
||
|
|
return customId;
|
||
|
|
}
|
||
|
|
|
||
|
|
return heading
|
||
|
|
.toLowerCase()
|
||
|
|
.replace(/\s|\//g, '-') // replace spaces and slashes with dashes
|
||
|
|
.replace(/[^\p{L}\d\-]/gu, ''); // only keep letters, digits & dashes
|
||
|
|
}
|