33 lines
1.2 KiB
TypeScript
33 lines
1.2 KiB
TypeScript
|
/*---------------------------------------------------------------------------------------------
|
||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||
|
*--------------------------------------------------------------------------------------------*/
|
||
|
|
||
|
export class Slug {
|
||
|
public constructor(
|
||
|
public readonly value: string
|
||
|
) { }
|
||
|
|
||
|
public equals(other: Slug): boolean {
|
||
|
return this.value === other.value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export interface Slugifier {
|
||
|
fromHeading(heading: string): Slug;
|
||
|
}
|
||
|
|
||
|
export const githubSlugifier: Slugifier = new class implements Slugifier {
|
||
|
fromHeading(heading: string): Slug {
|
||
|
const slugifiedHeading = encodeURI(
|
||
|
heading.trim()
|
||
|
.toLowerCase()
|
||
|
.replace(/\s+/g, '-') // Replace whitespace with -
|
||
|
.replace(/[\]\[\!\'\#\$\%\&\(\)\*\+\,\.\/\:\;\<\=\>\?\@\\\^\_\{\|\}\~\`。,、;:?!…—·ˉ¨‘’“”々~‖∶"'`|〃〔〕〈〉《》「」『』.〖〗【】()[]{}]/g, '') // Remove known punctuators
|
||
|
.replace(/^\-+/, '') // Remove leading -
|
||
|
.replace(/\-+$/, '') // Remove trailing -
|
||
|
);
|
||
|
return new Slug(slugifiedHeading);
|
||
|
}
|
||
|
};
|