UNPKG

@catgirls/better-format

Version:

Make strings actually look good.

1 lines 7.29 kB
{"version":3,"sources":["../src/consts.ts","../src/formatter.ts","../src/index.ts"],"names":["dumbWords","conjunctions","articles","prepositions","lowerCase","word","matchRegex","convertToRegExp","specials","s","parseMatch","match","firstCharacter","prepareString","str","options","index_default","m","lead","forced","lower","rest","offset","string","isLastWord","parsedMatch","fullLower","customSpecials","replace","pattern"],"mappings":"AAAO,IAAMA,CAAAA,CAAY,EAAC,CAEpBC,CAAAA,CAAe,CAAC,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAM,KAAA,CAAO,IAAI,CAAA,CAE7DC,CAAAA,CAAW,CAAC,GAAA,CAAK,IAAA,CAAM,KAAK,CAAA,CAE5BC,EAAe,CACnB,QAAA,CACA,OAAA,CACA,OAAA,CACA,SACA,OAAA,CACA,SAAA,CACA,OAAA,CACA,MAAA,CACA,QACA,MAAA,CACA,QAAA,CACA,IAAA,CACA,IAAA,CACA,SACA,QAAA,CACA,OAAA,CACA,SAAA,CACA,QAAA,CACA,UACA,SAAA,CACA,QAAA,CACA,KAAA,CACA,IAAA,CACA,aACA,aAAA,CACA,SAAA,CACA,MAAA,CACA,QAAA,CACA,SACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,KAAA,CACA,OACA,IAAA,CACA,QAAA,CACA,MAAA,CACA,MAAA,CACA,QACA,MAAA,CACA,IAAA,CACA,KAAA,CACA,IAAA,CACA,OACA,UAAA,CACA,MAAA,CACA,MAAA,CACA,KAAA,CACA,OACA,WAAA,CACA,OAAA,CACA,MAAA,CACA,OAAA,CACA,OACA,SAAA,CACA,IAAA,CACA,QAAA,CACA,SAAA,CACA,OAAA,CACA,YAAA,CACA,QAAA,CACA,OAAA,CACA,KACA,MAAA,CACA,QAAA,CACA,KAAA,CACA,MAAA,CACA,SACA,SACF,CAAA,CAEaC,CAAAA,CAAY,IAAI,IAAI,CAC/B,GAAGH,CAAAA,CACH,GAAGC,EACH,GAAGC,CACL,CAAC,CAAA,CChFD,IAAME,CAAAA,CAAO,CAAA,yBAAA,CAAA,CAEAC,CAAAA,CAAa,IAAI,OAC5B,CAAA,sCAAA,EAAyCD,CAAI,CAAA,IAAA,EAAOA,CAAI,MAAMA,CAAI,CAAA,WAAA,EAASA,CAAI,CAAA,EAAA,CAAA,CAC/E,GACF,CAAA,CAEaE,CAAAA,CAAmBC,CAAAA,EAC9BA,CAAAA,CAAS,IAAKC,CAAAA,EAAM,CAAC,IAAI,MAAA,CAAO,MAAMA,CAAC,CAAA,GAAA,CAAA,CAAO,IAAI,CAAA,CAAGA,CAAC,CAAC,CAAA,CAE5CC,CAAAA,CAAcC,CAAAA,EAAiC,CAC1D,IAAMC,CAAAA,CAAiBD,CAAAA,CAAM,CAAC,EAG9B,OAAI,IAAA,CAAK,IAAA,CAAKC,CAAc,EAEnBD,CAAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAGlB,SAAS,IAAA,CAAKC,CAAc,CAAA,CAEvB,IAAA,CAGFD,CACT,CAAA,CAEaE,CAAAA,CAAgB,CAACC,EAAaC,CAAAA,IAErCA,CAAAA,EAAS,kBAAA,GACXD,CAAAA,CAAMA,EAAI,OAAA,CAAQ,IAAA,CAAM,GAAG,CAAA,CAAA,CAGzBC,GAAS,wBAAA,GACXD,CAAAA,CAAMA,CAAAA,CAAI,OAAA,CAAQ,KAAM,GAAG,CAAA,CAAA,CAIzBC,CAAAA,EAAS,YAAA,EACXA,EAAQ,YAAA,CAAa,OAAA,CAASV,CAAAA,EAAS,CACrCS,EAAMA,CAAAA,CAAI,OAAA,CAAQ,IAAI,MAAA,CAAO,MAAMT,CAAI,CAAA,GAAA,CAAA,CAAO,IAAI,CAAA,CAAGA,CAAI,EAC3D,CAAC,CAAA,CAGIS,CAAAA,CAAAA,KCrCFE,CAAAA,CAAQ,CAACF,CAAAA,CAAaC,CAAAA,GAA+B,CAE1DA,CAAAA,CAAU,CACR,kBAAA,CAAoB,IAAA,CACpB,yBAA0B,IAAA,CAC1B,GAAGA,CACL,CAAA,CAEAD,EAAMD,CAAAA,CAAcC,CAAAA,CAAKC,CAAO,CAAA,CAChCD,EAAMA,CAAAA,CACH,WAAA,EAAY,CACZ,OAAA,CACCR,EACA,CAACW,CAAAA,CAAGC,CAAAA,CAAO,EAAA,CAAIC,EAAQC,CAAAA,CAAOC,CAAAA,CAAMC,CAAAA,CAAQC,CAAAA,GAAW,CACrD,IAAMC,CAAAA,CAAaP,CAAAA,CAAE,MAAA,CAASK,GAAUC,CAAAA,CAAO,MAAA,CAEzCE,CAAAA,CAAcf,CAAAA,CAAWO,CAAC,CAAA,CAChC,GAAI,CAACQ,CAAAA,CACH,OAAOR,CAAAA,CAET,GAAI,CAACE,CAAAA,CAAQ,CACX,IAAMO,CAAAA,CAAYN,CAAAA,CAAQC,CAAAA,CAE1B,GAAIjB,CAAAA,CAAU,GAAA,CAAIsB,CAAS,CAAA,EAAK,CAACF,CAAAA,CAC/B,OAAOC,CAEX,CAEA,OAAOP,CAAAA,CAAAA,CAAQE,CAAAA,EAASD,CAAAA,EAAQ,WAAA,GAAgBE,CAClD,CACF,CAAA,CAEF,IAAMM,EAAiBZ,CAAAA,EAAS,YAAA,EAAgB,EAAC,CAC3Ca,EAAU,CAAC,GAAG5B,CAAAA,CAAW,GAAG2B,CAAc,CAAA,CAGhD,OAFsBpB,CAAAA,CAAgBqB,CAAO,EAE/B,OAAA,CAAQ,CAAC,CAACC,CAAAA,CAASpB,CAAC,CAAA,GAAM,CACtCK,CAAAA,CAAMA,CAAAA,CAAI,QAAQe,CAAAA,CAASpB,CAAC,EAC9B,CAAC,EAEMK,CACT","file":"index.mjs","sourcesContent":["export const dumbWords = [];\n\nconst conjunctions = [\"for\", \"and\", \"nor\", \"but\", \"or\", \"yet\", \"so\"];\n\nconst articles = [\"a\", \"an\", \"the\"];\n\nconst prepositions = [\n \"aboard\",\n \"about\",\n \"above\",\n \"across\",\n \"after\",\n \"against\",\n \"along\",\n \"amid\",\n \"among\",\n \"anti\",\n \"around\",\n \"as\",\n \"at\",\n \"before\",\n \"behind\",\n \"below\",\n \"beneath\",\n \"beside\",\n \"besides\",\n \"between\",\n \"beyond\",\n \"but\",\n \"by\",\n \"concerning\",\n \"considering\",\n \"despite\",\n \"down\",\n \"during\",\n \"except\",\n \"excepting\",\n \"excluding\",\n \"following\",\n \"for\",\n \"from\",\n \"in\",\n \"inside\",\n \"into\",\n \"like\",\n \"minus\",\n \"near\",\n \"of\",\n \"off\",\n \"on\",\n \"onto\",\n \"opposite\",\n \"over\",\n \"past\",\n \"per\",\n \"plus\",\n \"regarding\",\n \"round\",\n \"save\",\n \"since\",\n \"than\",\n \"through\",\n \"to\",\n \"toward\",\n \"towards\",\n \"under\",\n \"underneath\",\n \"unlike\",\n \"until\",\n \"up\",\n \"upon\",\n \"versus\",\n \"via\",\n \"with\",\n \"within\",\n \"without\",\n];\n\nexport const lowerCase = new Set([\n ...conjunctions,\n ...articles,\n ...prepositions,\n]);\n","import { FormatterOptions } from \"./types\";\n\nconst word = \"[^\\\\s'’\\\\(\\\\)!?;:\\\"-]\";\n\nexport const matchRegex = new RegExp(\n `(?:(?:(\\\\s?(?:^|[.\\\\(\\\\)!?;:\"-])\\\\s*)(${word}))|(${word}))(${word}*[’']*${word}*)`,\n \"g\",\n);\n\nexport const convertToRegExp = (specials: string[]): [RegExp, string][] =>\n specials.map((s) => [new RegExp(`\\\\b${s}\\\\b`, \"gi\"), s]);\n\nexport const parseMatch = (match: string): string | null => {\n const firstCharacter = match[0];\n\n // test first character\n if (/\\s/.test(firstCharacter)) {\n // If whitespace - trim and return\n return match.slice(1);\n }\n // eslint-disable-next-line no-useless-escape\n if (/[\\(\\)]/.test(firstCharacter)) {\n // If parens - this shouldn't be replaced\n return null;\n }\n\n return match;\n};\n\nexport const prepareString = (str: string, options?: FormatterOptions) => {\n // if dash cleaning is enabled, replace all dashes with spaces\n if (options?.enableDashCleaning) {\n str = str.replace(/-/g, \" \");\n }\n // if underscore cleaning is enabled, replace all underscores with spaces\n if (options?.enableUnderscoreCleaning) {\n str = str.replace(/_/g, \" \");\n }\n\n // if exclude words is provided, do not format these words\n if (options?.excludeWords) {\n options.excludeWords.forEach((word) => {\n str = str.replace(new RegExp(`\\\\b${word}\\\\b`, \"gi\"), word);\n });\n }\n\n return str;\n};\n","import { dumbWords, lowerCase } from \"./consts\";\nimport {\n convertToRegExp,\n matchRegex,\n parseMatch,\n prepareString,\n} from \"./formatter\";\nimport { FormatterOptions } from \"./types\";\n\nexport default (str: string, options?: FormatterOptions) => {\n // set default options if not provided\n options = {\n enableDashCleaning: true,\n enableUnderscoreCleaning: true,\n ...options,\n };\n\n str = prepareString(str, options);\n str = str\n .toLowerCase()\n .replace(\n matchRegex,\n (m, lead = \"\", forced, lower, rest, offset, string) => {\n const isLastWord = m.length + offset >= string.length;\n\n const parsedMatch = parseMatch(m);\n if (!parsedMatch) {\n return m;\n }\n if (!forced) {\n const fullLower = lower + rest;\n\n if (lowerCase.has(fullLower) && !isLastWord) {\n return parsedMatch;\n }\n }\n\n return lead + (lower || forced).toUpperCase() + rest;\n },\n );\n\n const customSpecials = options?.excludeWords || [];\n const replace = [...dumbWords, ...customSpecials];\n const replaceRegExp = convertToRegExp(replace);\n\n replaceRegExp.forEach(([pattern, s]) => {\n str = str.replace(pattern, s);\n });\n\n return str;\n};\n"]}