NodeBB/NodeBB

View on GitHub
public/src/modules/slugify.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

/* global XRegExp */
(function (factory) {
    if (typeof define === 'function' && define.amd) {
        define('slugify', ['xregexp'], factory);
    } else if (typeof exports === 'object') {
        module.exports = factory(require('xregexp'));
    } else {
        window.slugify = factory(XRegExp);
    }
}(function (XRegExp) {
    const invalidUnicodeChars = XRegExp('[^\\p{L}\\s\\d\\-_]', 'g');
    const invalidLatinChars = /[^\w\s\d\-_]/g;
    const trimRegex = /^\s+|\s+$/g;
    const collapseWhitespace = /\s+/g;
    const collapseDash = /-+/g;
    const trimTrailingDash = /-$/g;
    const trimLeadingDash = /^-/g;
    const isLatin = /^[\w\d\s.,\-@]+$/;

    // http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/
    return function slugify(str, preserveCase) {
        if (!str) {
            return '';
        }
        str = String(str).replace(trimRegex, '');
        if (isLatin.test(str)) {
            str = str.replace(invalidLatinChars, '-');
        } else {
            str = XRegExp.replace(str, invalidUnicodeChars, '-');
        }
        str = !preserveCase ? str.toLocaleLowerCase() : str;
        str = str.replace(collapseWhitespace, '-');
        str = str.replace(collapseDash, '-');
        str = str.replace(trimTrailingDash, '');
        str = str.replace(trimLeadingDash, '');
        return str;
    };
}));