string.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /**
  2. * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. * @author David Sehnal <david.sehnal@gmail.com>
  6. */
  7. const reLine = /^/mg;
  8. export function indentString(str: string, count: number, indent: string) {
  9. return count === 0 ? str : str.replace(reLine, indent.repeat(count));
  10. }
  11. /** Add space between camelCase text. */
  12. export function splitCamelCase(str: string, separator = ' ') {
  13. return str.replace(/([a-z\xE0-\xFF])([A-Z\xC0\xDF])/g, `$1${separator}$2`);
  14. }
  15. /** Split camelCase text and capitalize. */
  16. export function camelCaseToWords(str: string) {
  17. return capitalize(splitCamelCase(str));
  18. }
  19. export const lowerCase = (str: string) => str.toLowerCase();
  20. export const upperCase = (str: string) => str.toUpperCase();
  21. /** Return upper case if string, otherwise return empty string */
  22. export function upperCaseAny(value: any): string {
  23. if (!value) return '';
  24. return typeof value === 'string' ? value.toUpperCase() : `${value}`.toUpperCase();
  25. }
  26. /** Uppercase the first character of each word. */
  27. export function capitalize(str: string) {
  28. return str.toLowerCase().replace(/^\w|\s\w/g, upperCase);
  29. }
  30. export function splitSnakeCase(str: string) {
  31. return str.replace(/_/g, ' ');
  32. }
  33. export function snakeCaseToWords(str: string) {
  34. return capitalize(splitSnakeCase(str));
  35. }
  36. export function splitKebabCase(str: string) {
  37. return str.replace(/-/g, ' ');
  38. }
  39. export function kebabCaseToWords(str: string) {
  40. return capitalize(splitKebabCase(str));
  41. }
  42. export function stringToWords(str: string) {
  43. return capitalize(splitCamelCase(splitSnakeCase(splitKebabCase(str))));
  44. }
  45. export function substringStartsWith(str: string, start: number, end: number, target: string) {
  46. const len = target.length;
  47. if (len > end - start) return false;
  48. for (let i = 0; i < len; i++) {
  49. if (str.charCodeAt(start + i) !== target.charCodeAt(i)) return false;
  50. }
  51. return true;
  52. }
  53. export function interpolate(str: string, params: { [k: string]: any }) {
  54. const names = Object.keys(params);
  55. const values = Object.values(params);
  56. return new Function(...names, `return \`${str}\`;`)(...values);
  57. }
  58. export function trimChar(str: string, char: string) {
  59. let start = 0;
  60. let end = str.length;
  61. while (start < end && str[start] === char) ++start;
  62. while (end > start && str[end - 1] === char) --end;
  63. return (start > 0 || end < str.length) ? str.substring(start, end) : str;
  64. }
  65. export function trimCharStart(str: string, char: string) {
  66. let start = 0;
  67. const end = str.length;
  68. while (start < end && str[start] === char) ++start;
  69. return (start > 0) ? str.substring(start, end) : str;
  70. }
  71. export function trimCharEnd(str: string, char: string) {
  72. let end = str.length;
  73. while (end > 0 && str[end - 1] === char) --end;
  74. return (end < str.length) ? str.substring(0, end) : str;
  75. }
  76. /** Simple function to strip tags from a string */
  77. export function stripTags(str: string) {
  78. return str.replace(/<\/?[^>]+>/g, '');
  79. }
  80. /**
  81. * Escape string for use in Javascript regex
  82. *
  83. * From https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex/6969486#6969486
  84. */
  85. export function escapeRegExp(str: string) {
  86. return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
  87. }