Completed create slug from string in Javascript
duongkhoangiam opened this issue · 1 comments
The problem is when i create new post and leave path blank autogenerated from title
I see problem for slugify for latin language not full support
here is example code in current helper (src/utils/helpers.js)
const slugify = string => {
if (!string) return '';
const a = 'àáäâèéëêìíïîıòóöôùúüûñçşßÿœæŕśńṕẃǵğǹḿǘẍźḧ·/_,:;';
const b = 'aaaaeeeeiiiiioooouuuuncssyoarsnpwggnmuxzh------';
const p = new RegExp(a.split('').join('|'), 'g');
return string
.toString()
.toLowerCase()
.replace(/\s+/g, '-') // Replace spaces with -
.replace(p, c => b.charAt(a.indexOf(c))) // Replace special chars
.replace(/&/g, '-') // Replace & with 'and'
.replace(/[^\w-]+/g, '') // Remove all non-word chars
.replace(/-+/g, '-') // Replace multiple - with single -
.replace(/^-+/, '') // Trim - from start of text
.replace(/-+$/, ''); // Trim - from end of text
};
Test
console.log(slugify('Trump gây bàn tán vì ngồi bàn họp nhỏ bất thường'));
The result
trump-gay-ban-tan-vi-ngi-ban-hp-nh-bt-thng
This not correct because missing some charatec
So i have create a contribute i hope the team can merge this
New slugify
const slugify = (str) => {
str = String(str).toString();
str = str.replace(/^\s+|\s+$/g, ""); // trim
str = str.toLowerCase();
// remove accents, swap ñ for n, etc
const swaps = {
'0': ['°', '₀', '۰', '0'],
'1': ['¹', '₁', '۱', '1'],
'2': ['²', '₂', '۲', '2'],
'3': ['³', '₃', '۳', '3'],
'4': ['⁴', '₄', '۴', '٤', '4'],
'5': ['⁵', '₅', '۵', '٥', '5'],
'6': ['⁶', '₆', '۶', '٦', '6'],
'7': ['⁷', '₇', '۷', '7'],
'8': ['⁸', '₈', '۸', '8'],
'9': ['⁹', '₉', '۹', '9'],
'a': ['à', 'á', 'ả', 'ã', 'ạ', 'ă', 'ắ', 'ằ', 'ẳ', 'ẵ', 'ặ', 'â', 'ấ', 'ầ', 'ẩ', 'ẫ', 'ậ', 'ā', 'ą', 'å', 'α', 'ά', 'ἀ', 'ἁ', 'ἂ', 'ἃ', 'ἄ', 'ἅ', 'ἆ', 'ἇ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ὰ', 'ά', 'ᾰ', 'ᾱ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', 'а', 'أ', 'အ', 'ာ', 'ါ', 'ǻ', 'ǎ', 'ª', 'ა', 'अ', 'ا', 'a', 'ä'],
'b': ['б', 'β', 'ب', 'ဗ', 'ბ', 'b'],
'c': ['ç', 'ć', 'č', 'ĉ', 'ċ', 'c'],
'd': ['ď', 'ð', 'đ', 'ƌ', 'ȡ', 'ɖ', 'ɗ', 'ᵭ', 'ᶁ', 'ᶑ', 'д', 'δ', 'د', 'ض', 'ဍ', 'ဒ', 'დ', 'd'],
'e': ['é', 'è', 'ẻ', 'ẽ', 'ẹ', 'ê', 'ế', 'ề', 'ể', 'ễ', 'ệ', 'ë', 'ē', 'ę', 'ě', 'ĕ', 'ė', 'ε', 'έ', 'ἐ', 'ἑ', 'ἒ', 'ἓ', 'ἔ', 'ἕ', 'ὲ', 'έ', 'е', 'ё', 'э', 'є', 'ə', 'ဧ', 'ေ', 'ဲ', 'ე', 'ए', 'إ', 'ئ', 'e'],
'f': ['ф', 'φ', 'ف', 'ƒ', 'ფ', 'f'],
'g': ['ĝ', 'ğ', 'ġ', 'ģ', 'г', 'ґ', 'γ', 'ဂ', 'გ', 'گ', 'g'],
'h': ['ĥ', 'ħ', 'η', 'ή', 'ح', 'ه', 'ဟ', 'ှ', 'ჰ', 'h'],
'i': ['í', 'ì', 'ỉ', 'ĩ', 'ị', 'î', 'ï', 'ī', 'ĭ', 'į', 'ı', 'ι', 'ί', 'ϊ', 'ΐ', 'ἰ', 'ἱ', 'ἲ', 'ἳ', 'ἴ', 'ἵ', 'ἶ', 'ἷ', 'ὶ', 'ί', 'ῐ', 'ῑ', 'ῒ', 'ΐ', 'ῖ', 'ῗ', 'і', 'ї', 'и', 'ဣ', 'ိ', 'ီ', 'ည်', 'ǐ', 'ი', 'इ', 'ی', 'i'],
'j': ['ĵ', 'ј', 'Ј', 'ჯ', 'ج', 'j'],
'k': ['ķ', 'ĸ', 'к', 'κ', 'Ķ', 'ق', 'ك', 'က', 'კ', 'ქ', 'ک', 'k'],
'l': ['ł', 'ľ', 'ĺ', 'ļ', 'ŀ', 'л', 'λ', 'ل', 'လ', 'ლ', 'l'],
'm': ['м', 'μ', 'م', 'မ', 'მ', 'm'],
'n': ['ñ', 'ń', 'ň', 'ņ', 'ʼn', 'ŋ', 'ν', 'н', 'ن', 'န', 'ნ', 'n'],
'o': ['ó', 'ò', 'ỏ', 'õ', 'ọ', 'ô', 'ố', 'ồ', 'ổ', 'ỗ', 'ộ', 'ơ', 'ớ', 'ờ', 'ở', 'ỡ', 'ợ', 'ø', 'ō', 'ő', 'ŏ', 'ο', 'ὀ', 'ὁ', 'ὂ', 'ὃ', 'ὄ', 'ὅ', 'ὸ', 'ό', 'о', 'و', 'θ', 'ို', 'ǒ', 'ǿ', 'º', 'ო', 'ओ', 'o', 'ö'],
'p': ['п', 'π', 'ပ', 'პ', 'پ', 'p'],
'q': ['ყ', 'q'],
'r': ['ŕ', 'ř', 'ŗ', 'р', 'ρ', 'ر', 'რ', 'r'],
's': ['ś', 'š', 'ş', 'с', 'σ', 'ș', 'ς', 'س', 'ص', 'စ', 'ſ', 'ს', 's'],
't': ['ť', 'ţ', 'т', 'τ', 'ț', 'ت', 'ط', 'ဋ', 'တ', 'ŧ', 'თ', 'ტ', 't'],
'u': ['ú', 'ù', 'ủ', 'ũ', 'ụ', 'ư', 'ứ', 'ừ', 'ử', 'ữ', 'ự', 'û', 'ū', 'ů', 'ű', 'ŭ', 'ų', 'µ', 'у', 'ဉ', 'ု', 'ူ', 'ǔ', 'ǖ', 'ǘ', 'ǚ', 'ǜ', 'უ', 'उ', 'u', 'ў', 'ü'],
'v': ['в', 'ვ', 'ϐ', 'v'],
'w': ['ŵ', 'ω', 'ώ', 'ဝ', 'ွ', 'w'],
'x': ['χ', 'ξ', 'x'],
'y': ['ý', 'ỳ', 'ỷ', 'ỹ', 'ỵ', 'ÿ', 'ŷ', 'й', 'ы', 'υ', 'ϋ', 'ύ', 'ΰ', 'ي', 'ယ', 'y'],
'z': ['ź', 'ž', 'ż', 'з', 'ζ', 'ز', 'ဇ', 'ზ', 'z'],
'aa': ['ع', 'आ', 'آ'],
'ae': ['æ', 'ǽ'],
'ai': ['ऐ'],
'ch': ['ч', 'ჩ', 'ჭ', 'چ'],
'dj': ['ђ', 'đ'],
'dz': ['џ', 'ძ'],
'ei': ['ऍ'],
'gh': ['غ', 'ღ'],
'ii': ['ई'],
'ij': ['ij'],
'kh': ['х', 'خ', 'ხ'],
'lj': ['љ'],
'nj': ['њ'],
'oe': ['ö', 'œ', 'ؤ'],
'oi': ['ऑ'],
'oii': ['ऒ'],
'ps': ['ψ'],
'sh': ['ш', 'შ', 'ش'],
'shch': ['щ'],
'ss': ['ß'],
'sx': ['ŝ'],
'th': ['þ', 'ϑ', 'ث', 'ذ', 'ظ'],
'ts': ['ц', 'ც', 'წ'],
'ue': ['ü'],
'uu': ['ऊ'],
'ya': ['я'],
'yu': ['ю'],
'zh': ['ж', 'ჟ', 'ژ'],
'(c)': ['©'],
'A': ['Á', 'À', 'Ả', 'Ã', 'Ạ', 'Ă', 'Ắ', 'Ằ', 'Ẳ', 'Ẵ', 'Ặ', 'Â', 'Ấ', 'Ầ', 'Ẩ', 'Ẫ', 'Ậ', 'Å', 'Ā', 'Ą', 'Α', 'Ά', 'Ἀ', 'Ἁ', 'Ἂ', 'Ἃ', 'Ἄ', 'Ἅ', 'Ἆ', 'Ἇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'ᾍ', 'ᾎ', 'ᾏ', 'Ᾰ', 'Ᾱ', 'Ὰ', 'Ά', 'ᾼ', 'А', 'Ǻ', 'Ǎ', 'A', 'Ä'],
'B': ['Б', 'Β', 'ब', 'B'],
'C': ['Ç', 'Ć', 'Č', 'Ĉ', 'Ċ', 'C'],
'D': ['Ď', 'Ð', 'Đ', 'Ɖ', 'Ɗ', 'Ƌ', 'ᴅ', 'ᴆ', 'Д', 'Δ', 'D'],
'E': ['É', 'È', 'Ẻ', 'Ẽ', 'Ẹ', 'Ê', 'Ế', 'Ề', 'Ể', 'Ễ', 'Ệ', 'Ë', 'Ē', 'Ę', 'Ě', 'Ĕ', 'Ė', 'Ε', 'Έ', 'Ἐ', 'Ἑ', 'Ἒ', 'Ἓ', 'Ἔ', 'Ἕ', 'Έ', 'Ὲ', 'Е', 'Ё', 'Э', 'Є', 'Ə', 'E'],
'F': ['Ф', 'Φ', 'F'],
'G': ['Ğ', 'Ġ', 'Ģ', 'Г', 'Ґ', 'Γ', 'G'],
'H': ['Η', 'Ή', 'Ħ', 'H'],
'I': ['Í', 'Ì', 'Ỉ', 'Ĩ', 'Ị', 'Î', 'Ï', 'Ī', 'Ĭ', 'Į', 'İ', 'Ι', 'Ί', 'Ϊ', 'Ἰ', 'Ἱ', 'Ἳ', 'Ἴ', 'Ἵ', 'Ἶ', 'Ἷ', 'Ῐ', 'Ῑ', 'Ὶ', 'Ί', 'И', 'І', 'Ї', 'Ǐ', 'ϒ', 'I'],
'J': ['J'],
'K': ['К', 'Κ', 'K'],
'L': ['Ĺ', 'Ł', 'Л', 'Λ', 'Ļ', 'Ľ', 'Ŀ', 'ल', 'L'],
'M': ['М', 'Μ', 'M'],
'N': ['Ń', 'Ñ', 'Ň', 'Ņ', 'Ŋ', 'Н', 'Ν', 'N'],
'O': ['Ó', 'Ò', 'Ỏ', 'Õ', 'Ọ', 'Ô', 'Ố', 'Ồ', 'Ổ', 'Ỗ', 'Ộ', 'Ơ', 'Ớ', 'Ờ', 'Ở', 'Ỡ', 'Ợ', 'Ø', 'Ō', 'Ő', 'Ŏ', 'Ο', 'Ό', 'Ὀ', 'Ὁ', 'Ὂ', 'Ὃ', 'Ὄ', 'Ὅ', 'Ὸ', 'Ό', 'О', 'Θ', 'Ө', 'Ǒ', 'Ǿ', 'O', 'Ö'],
'P': ['П', 'Π', 'P'],
'Q': ['Q'],
'R': ['Ř', 'Ŕ', 'Р', 'Ρ', 'Ŗ', 'R'],
'S': ['Ş', 'Ŝ', 'Ș', 'Š', 'Ś', 'С', 'Σ', 'S'],
'T': ['Ť', 'Ţ', 'Ŧ', 'Ț', 'Т', 'Τ', 'T'],
'U': ['Ú', 'Ù', 'Ủ', 'Ũ', 'Ụ', 'Ư', 'Ứ', 'Ừ', 'Ử', 'Ữ', 'Ự', 'Û', 'Ū', 'Ů', 'Ű', 'Ŭ', 'Ų', 'У', 'Ǔ', 'Ǖ', 'Ǘ', 'Ǚ', 'Ǜ', 'U', 'Ў', 'Ü'],
'V': ['В', 'V'],
'W': ['Ω', 'Ώ', 'Ŵ', 'W'],
'X': ['Χ', 'Ξ', 'X'],
'Y': ['Ý', 'Ỳ', 'Ỷ', 'Ỹ', 'Ỵ', 'Ÿ', 'Ῠ', 'Ῡ', 'Ὺ', 'Ύ', 'Ы', 'Й', 'Υ', 'Ϋ', 'Ŷ', 'Y'],
'Z': ['Ź', 'Ž', 'Ż', 'З', 'Ζ', 'Z'],
'AE': ['Æ', 'Ǽ'],
'Ch': ['Ч'],
'Dj': ['Ђ'],
'Dz': ['Џ'],
'Gx': ['Ĝ'],
'Hx': ['Ĥ'],
'Ij': ['IJ'],
'Jx': ['Ĵ'],
'Kh': ['Х'],
'Lj': ['Љ'],
'Nj': ['Њ'],
'Oe': ['Œ'],
'Ps': ['Ψ'],
'Sh': ['Ш'],
'Shch': ['Щ'],
'Ss': ['ẞ'],
'Th': ['Þ'],
'Ts': ['Ц'],
'Ya': ['Я'],
'Yu': ['Ю'],
'Zh': ['Ж'],
};
Object.keys(swaps).forEach((swap) => {
swaps[swap].forEach(s => {
str = str.replace(new RegExp(s, "g"), swap);
})
});
return str
.replace(/[^a-z0-9 -]/g, "") // remove invalid chars
.replace(/\s+/g, "-") // collapse whitespace and replace by -
.replace(/-+/g, "-") // collapse dashes
.replace(/^-+/, "") // trim - from start of text
.replace(/-+$/, "");
};
Test
console.log(slugify('Trump gây bàn tán vì ngồi bàn họp nhỏ bất thường'));
The result
trump-gay-ban-tan-vi-ngoi-ban-hop-nho-bat-thuong
this correct
here is link for https://github.com/duongkhoangiam/jekyll-admin/blob/master/src/utils/helpers.js#L46-L179
more about slugify https://gist.github.com/codeguy/6684588
This issue has been automatically marked as stale because it has not been commented on for at least two months.
The resources of the Jekyll team are limited, and so we are asking for your help.
If this is a bug and you can still reproduce this error on the master
branch, please reply with all of the information you have about it in order to keep the issue open.
If this is a feature request, please consider whether it can be accomplished in another way. If it cannot, please elaborate on why it is core to this project and why you feel more than 80% of users would find this beneficial.
This issue will automatically be closed in two months if no further activity occurs. Thank you for all your contributions.