@danielhaim/titlecaser 1.2.29 → 1.2.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,8 +12,10 @@ Transform any text to proper title case format using popular style guides such a
12
12
 
13
13
  ## Table of Contents
14
14
 
15
- [TitleCaser](#titlecaser)
15
+ - [TitleCaser](#titlecaser)
16
16
  * [Demo](#demo)
17
+ * [Table of Contents](#table-of-contents)
18
+ * [Introduction](#introduction)
17
19
  * [Key Features:](#key-features)
18
20
  * [Installation](#installation)
19
21
  * [Usage](#usage)
@@ -33,13 +35,15 @@ Transform any text to proper title case format using popular style guides such a
33
35
 
34
36
  ## Introduction
35
37
 
36
- The Language Conventions and Style Module is a comprehensive library designed to help web content developers adhere to the latest style guides and English language conventions. It offers a wide range of features, including support for various style guides such as AP, APA, Chicago, NY Times, Wikipedia, and British styles, and customizable preferences to suit your specific needs.
37
38
 
38
- To streamline workflow, the Language Conventions and Style Module is available in both browser and node environment versions and includes a command-line interface for building, testing, and minimizing the module. Additionally, it features a filter ability that allows users to ignore certain phrases containing short words, preventing the module from mistakenly flagging instances where short words are used as part of a larger term or phrase.
39
39
 
40
- The module has been designed to handle various capitalization scenarios, including hyphenated words, prefixes, suffixes, reserved words, Roman numerals, proper nouns that contain lowercase letters, and words that require capitalization in specific contexts. This ensures that your content meets the appropriate style and formatting guidelines, regardless of the context. It also offers word replacement capabilities, as well as ignored phrases to create consistency in cases where certain terms may be capitalized differently depending on the context, such as converting variations of gOogle to Google, front-end to Frontend.
40
+ The comprehensive Language Conventions and Style Library is specifically designed to assist web content developers in adhering to the latest style guides and English language conventions. This all-inclusive library has various features, including support for numerous style guides such as AP, APA, Chicago, NY Times, Wikipedia, and British styles and customizable preferences to tailor to individual needs. TitleCaser is a component of this library, and LCSL is set to be open-sourced by the end of 2023
41
41
 
42
- So whether you're developing web content for a major news organization or simply looking to improve your writing skills, the Language Conventions and Style Module is an essential tool that can help ensure your work is accurate, consistent, and conforms to the latest style guidelines.
42
+ To streamline workflow, modules are available in both browser and node environment versions and include a command-line interface for building, testing, and minimizing the module. Additionally, it features a filter ability that allows users to ignore certain phrases containing short words, preventing the module from mistakenly flagging instances where short words are used as part of a larger term or phrase.
43
+
44
+ The module has been designed to handle various capitalization scenarios, including hyphenated words, prefixes, suffixes, reserved words, Roman numerals, proper nouns that contain lowercase letters, and words that require capitalization in specific contexts. This ensures that your content meets the appropriate style and formatting guidelines, regardless of the context. It also offers word replacement capabilities, as well as ignored phrases to create consistency in cases where certain terms may be capitalized differently depending on the context.
45
+
46
+ Whether you're developing web content for a major news organization or simply looking to improve your writing skills, this module is an essential tool that can help ensure your work is accurate, consistent, and conforms to the latest style guidelines.
43
47
 
44
48
  ## Key Features:
45
49
 
@@ -48,7 +52,7 @@ So whether you're developing web content for a major news organization or simply
48
52
  - Support for proper capitalization of Roman numerals and exclusion of specific words and phrases from title capitalization
49
53
  - Word replacement capabilities for consistency in capitalization
50
54
  Command-line interface for building, testing, and minimizing the module
51
- - Pre-defined word lists for articles, conjunctions, prepositions, and uncapitalized words in titles
55
+ - Pre-defined word lists for articles, conjunctions, prepositions, and non-capitalized words in titles
52
56
  - Exclusion of common phrases from title capitalization
53
57
 
54
58
  ## Installation
@@ -83,12 +87,12 @@ console.log(output); // 'The Book of Life'
83
87
 
84
88
  ## Usage in the Browser
85
89
 
86
- The function can also be used in a browser environment by including the `titlecaser.browser.js` script in your HTML file:
90
+ The function can also be used in a browser environment by including the `titlecaser.amd.js` script in your HTML file:
87
91
 
88
92
  Here's an example of how to use the modulate function:
89
93
 
90
94
  ```html
91
- <script src="./path/to/titlecaser.browser.js"></script>
95
+ <script src="./path/to/titlecaser.amd.js"></script>
92
96
  ```
93
97
 
94
98
  After that, the `toTitleCase()` function can be accessed in your JavaScript code like this:
@@ -117,9 +121,9 @@ The `{options}` parameter is an object that contains the settings for the conver
117
121
  ## Methods
118
122
 
119
123
  - `setReplaceTerms(terms: object)`: Sets word replacement terms to be used during title casing. Multiple calls can be made to add or update multiple word replacements.
120
- - `removeReplaceTerm(term: string)`: Removes a replace term from the `wordReplacementsList` array in the options object of the `TitleCaser` instance. Throws an error if the term is not found in the array, otherwise removes it from the array and updates the options object.
121
- - `addReplaceTerm(term: string, replacement: string)`: Adds a new replace term to the wordReplacementsList array in the options object of the TitleCaser instance. The method takes two string arguments: term specifies the word to be replaced, and replacement specifies the replacement for the word. If the term already exists in the array, the method updates its replacement value. Otherwise, it adds a new object with the term and replacement to the array. The method then updates the wordReplacementsList property in the options object.
122
- - `setStyle(style: string)`: Sets the style option in the options object of the TitleCaser instance. The method takes a string argument style that specifies the style to use for the title casing. If the argument is not a string, the method throws a TypeError. Otherwise, it updates the style option in the options object.
124
+ - `removeReplaceTerm(term: string)`: Removes a replaced term from the `wordReplacementsList` array in the option object of the `TitleCaser` instance. Throws an error if the term is not found in the array, otherwise removes it from the array and updates the option object.
125
+ - `addReplaceTerm(term: string, replacement: string)`: Adds a new term to the `wordReplacementsList` array in the options object of the TitleCaser instance. The method takes two string arguments: term specifies the word to be replaced, and replacement specifies the replacement for the word. If the term already exists in the array, the method updates its replacement value. Otherwise, it adds a new object with the term and replacement to the array. The method then updates the wordReplacementsList property in the object.
126
+ - `setStyle(style: string)`: Sets the style option in the object of the TitleCaser instance. The method takes a string argument style that specifies the style to use for the title casing. If the argument is not a string, the method throws a TypeError. Otherwise, it updates the style option in the object.
123
127
 
124
128
  ## Examples
125
129
 
@@ -139,7 +143,7 @@ console.log(output); // The Book of Life
139
143
 
140
144
  ### Customizing Word Replacements Method
141
145
 
142
- In the example below, we create a new instance of the `TitleCaser` class with the `APA` style option. We then set multiple replacement terms using two separate calls to the `setReplaceTerms()` method. Descriptive variable names are used for the input string and expected output. We call `toTitleCase()` to convert the input string to title case.
146
+ In the example below, we create a new instance of the `TitleCaser` class with the `APA` style option. We then set multiple replacement terms using two separate calls to the `setReplaceTerms()` method. Descriptive variable names are used for the input string and expected output. We call `toTitleCase()` to convert the input string to a title case.
143
147
 
144
148
  ```js
145
149
  // CommonJS
@@ -166,7 +170,7 @@ const outputString = titleCaser.toTitleCase(inputString);
166
170
 
167
171
  ### Customizing TitleCaser
168
172
 
169
- The example below demonstrates how to use the TitleCaser class to convert a string to title case with specific settings.
173
+ The example below demonstrates how to use the TitleCaser class to convert a string to a title case with specific settings.
170
174
 
171
175
  ```js
172
176
  // Set the options object
@@ -197,7 +201,7 @@ console.log(actualOutput);
197
201
 
198
202
  ### TitleCaser With Default Word Replacement
199
203
 
200
- The example below demonstrates how to use the TitleCaser class to convert a string to title case with AP style formatting, including hyphenated words and word/brand replacement.
204
+ The example below demonstrates how to use the TitleCaser class to convert a string to a title case with AP style formatting, including hyphenated words and word/brand replacement.
201
205
 
202
206
  ```js
203
207
  // Instantiate a new TitleCaser object with AP style formatting
@@ -254,40 +258,41 @@ $ npm run test
254
258
 
255
259
  ```bash
256
260
  Test Basic Options
257
- ✓ Default title case conversion
258
- ✓ Customized title case conversion
259
- ✓ AP-style title case conversion with replacements
261
+ ✓ Default title case conversion (2 ms)
262
+ ✓ Customized title case conversion (1 ms)
263
+ ✓ AP-style title case conversion with replacements (1 ms)
260
264
  ✓ AP-style title case conversion with replacements
261
- ✓ Capitalize suffix word in sentence
265
+ ✓ Capitalize suffix word in sentence (1 ms)
262
266
 
263
267
  Test Methods
264
268
  ✓ removeReplaceTerm
265
269
  ✓ setReplaceTerms
266
270
 
267
271
  Test Variation Stability
268
- ✓ Hyphenated, colon, and short word replacements
272
+ ✓ Hyphenated, colon, and short word replacements (1 ms)
269
273
  ✓ Capitalization and word replacements
270
274
  ✓ AP-style title case with possessive and colon
271
275
  ✓ AP-style title case with lowercase back/front-end terms
272
276
  ✓ Chicago style title case with comparison and colon
273
- ✓ APA style title case with colon
274
- ✓ Wikipedia style title case with acronym and hyphen
277
+ ✓ APA style title case with colon (3 ms)
278
+ ✓ Wikipedia style title case with acronym and hyphen (1 ms)
275
279
  ✓ APA style title case with colon and apostrophe
276
280
  ✓ Chicago style title case with custom term replacements
277
- ✓ AP-style capitalization test with special terms and colon
281
+ ✓ AP-style capitalization test with special terms and colon (1 ms)
278
282
  ✓ NYT-style capitalization test with special terms and colon
279
- ✓ APA style capitalization test with short conjunction terms and colon
283
+ ✓ APA style capitalization test with short conjunction terms and colon (1 ms)
280
284
  ✓ Correct phrase casing list testing
281
- ✓ Wikipedia style capitalization test with special term and colon
285
+ ✓ Wikipedia style capitalization test with special term and colon (1 ms)
282
286
 
283
287
  Test Reserved Words
284
288
  ✓ Reserved word
285
289
  ✓ Reserved word with colon
286
290
  ✓ Reserved word, posessive
287
- ✓ Hyphenated reserved word
291
+ ✓ Hyphenated reserved word (1 ms)
288
292
  ✓ Hyphenated reserved word, possessive
289
293
  ✓ HTML line break nl2br, <br /> tag
290
- Untrimmed white spaces
294
+ Ampersand in a sentence should return & and not &Amp;
295
+ ✓ Untrimmed white spaces (1 ms)
291
296
  ```
292
297
 
293
298
  ## Resources
@@ -307,4 +312,4 @@ Useful materials for improving your knowledge of writing and language style guid
307
312
 
308
313
  If you encounter any bugs or issues while using the library or the demo page, please report them by opening a new issue in the repository's issue tracker.
309
314
 
310
- When reporting a bug, please provide as much detail as possible, including the steps to reproduce the issue and any error messages that you see. I appreciate any contribution to improve this library.
315
+ When reporting a bug, please provide as much detail as possible, including the steps to reproduce the issue and any error messages that you see. I appreciate any contribution to improving this library.
@@ -0,0 +1 @@
1
+ (()=>{var e={429:(e,t,r)=>{var n,o;e=r.nmd(e),n=[t,r(485),r(858)],void 0===(o=function(r,n,o){"use strict";var i;function a(e,t,r){return(t=d(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,s=[],u=!0,l=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=i.call(r)).done)&&(s.push(n.value),s.length!==t);u=!0);}catch(e){l=!0,o=e}finally{try{if(!u&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(l)throw o}}return s}}(e,t)||l(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e){return function(e){if(Array.isArray(e))return c(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||l(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e,t){if(e){if("string"==typeof e)return c(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c(e,t):void 0}}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function f(e){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f(e)}function p(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,d(n.key),n)}}function d(e){var t=function(e,t){if("object"!==f(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==f(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===f(t)?t:String(t)}Object.defineProperty(r,"__esModule",{value:!0}),t.TitleCaser=void 0,o=(i=o)&&i.__esModule?i:{default:i};var y=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.options=t,this.wordReplacementsList=n.wordReplacementsList}var t,r,i;return t=e,r=[{key:"toTitleCase",value:function(e){try{if(0===e.trim().length)throw new TypeError("Invalid input: input must not be empty.");if("string"!=typeof e)throw new TypeError("Invalid input: input must be a string.");if(void 0!==this.options&&"object"!==f(this.options))throw new TypeError("Invalid options: options must be an object.");var t=this.options,r=t.style,i=void 0===r?"ap":r,a=t.neverCapitalize,s=void 0===a?[]:a,c=t.replaceTermList,p=void 0===c?n.wordReplacementsList:c,d=["nl2br"].concat(u(s)),y=o.default.getTitleCaseOptions(this.options,n.commonAbbreviationList,n.wordReplacementsList),m=(y.articlesList,y.shortConjunctionsList,y.shortPrepositionsList,y.neverCapitalizedList,y.replaceTerms,p.map((function(e){return Object.keys(e)[0].toLowerCase()}))),h=Object.fromEntries(p.map((function(e){return[Object.keys(e)[0].toLowerCase(),Object.values(e)[0]]}))),v=e.trim(),b=(v=(v=v.replace(/ {2,}/g,(function(e){return e.slice(0,1)}))).replace(/<br\s*\/?>/gi,"nl2br ")).split(" ");v=b.map((function(e,t){switch(!0){case o.default.isWordAmpersand(e):case o.default.hasHtmlBreak(e):case o.default.isWordIgnored(e,d):return e;case m.includes(e.toLowerCase()):return h[e.toLowerCase()];case o.default.isWordInArray(e,n.correctTitleCasingList):return o.default.correctTerm(e,n.correctTitleCasingList);case o.default.hasSuffix(e,i):return o.default.correctSuffix(e,n.correctTitleCasingList);case o.default.hasHyphen(e):return o.default.correctTermHyphenated(e,i);case o.default.hasUppercaseIntentional(e):return e;case o.default.isShortWord(e,i)&&0!==t:return t>0&&o.default.endsWithSymbol(b[t-1],[":","?","!","."])?e.charAt(0).toUpperCase()+e.slice(1):e.toLowerCase();case o.default.endsWithSymbol(e):var r=e.split(/([.,\/#!$%\^&\*;:{}=\-_`~()])/g).map((function(e,t){return o.default.isWordInArray(e,n.correctTitleCasingList)?o.default.correctTerm(e,n.correctTitleCasingList):(t>0&&o.default.endsWithSymbol(e),e.charAt(0).toUpperCase()+e.slice(1))}));return r.join("");case o.default.startsWithSymbol(e):return o.default.isWordInArray(e,n.correctTitleCasingList)?o.default.correctTerm(e):e;case o.default.hasRomanNumeral(e):return e.toUpperCase();case o.default.hasNumbers(e):return e;default:return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}})).join(" ");var C,w=function(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=l(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw i}}}}(n.correctPhraseCasingList);try{for(w.s();!(C=w.n()).done;){var g=C.value;v.toLowerCase().includes(g.toLowerCase())&&(v=v.replace(new RegExp(g,"gi"),g))}}catch(e){w.e(e)}finally{w.f()}return v=v.replace(/nl2br /gi,"<br />")}catch(e){throw new Error(e)}}},{key:"setReplaceTerms",value:function(e){if("object"!==f(e))throw new TypeError("Invalid argument: replace terms must be an object.");Object.entries(e).forEach((function(e){var t=s(e,2),r=t[0],o=t[1],i=n.wordReplacementsList.findIndex((function(e){return e[r]}));-1!==i?n.wordReplacementsList[i][r]=o:n.wordReplacementsList.push(a({},r,o))})),this.options.wordReplacementsList=n.wordReplacementsList}},{key:"addReplaceTerm",value:function(e,t){if("string"!=typeof e||"string"!=typeof t)throw new TypeError("Invalid argument: term and replacement must be strings.");var r=this.wordReplacementsList.findIndex((function(t){return t[e]}));-1!==r?this.wordReplacementsList[r][e]=t:this.wordReplacementsList.push(a({},e,t)),this.options.wordReplacementsList=this.wordReplacementsList}},{key:"removeReplaceTerm",value:function(e){if("string"!=typeof e)throw new TypeError("Invalid argument: term must be a string.");var t=this.wordReplacementsList.findIndex((function(t){return Object.keys(t)[0]===e}));if(-1===t)throw new Error("Term '".concat(e,"' not found in word replacements list."));this.wordReplacementsList.splice(t,1),this.options.wordReplacementsList=this.wordReplacementsList}},{key:"setStyle",value:function(e){if("string"!=typeof e)throw new TypeError("Invalid argument: style must be a string.");this.options.style=e}}],r&&p(t.prototype,r),i&&p(t,i),Object.defineProperty(t,"prototype",{writable:!1}),e}();t.TitleCaser=y,"object"===f(e)&&e.exports&&(e.exports={TitleCaser:y})}.apply(t,n))||(e.exports=o)},485:(e,t)=>{var r;void 0===(r=function(e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),t.wordReplacementsList=t.titleCaseStylesList=t.titleCaseDefaultOptionsList=t.ignoredWordList=t.correctTitleCasingList=t.correctPhraseCasingList=t.commonAbbreviationList=t.allowedTitleCaseStylesList=void 0;t.commonAbbreviationList=["a","an","the","as","at","by","for","in","of","on","to","up","yet","so","but","nor","or","and"];t.correctTitleCasingList=["AJAX","CSS","DOM","ES6","HTML","JavaScript","jQuery","MobX","SCSS","TypeScript","Vue.js",".NET","ASP","ASPX","MySQL","PHP","PostgresQL","Python","SQL","GraphQL","HTML5","API","APIs","ASCII","CI","CircleCI","CLI","DLL","DNS","EC2","FTP","HTTP","HTTPs","ICMP","IDE","IP","ISP","JSON","JSP","LPWAN","M2M","MQTT","OOP","REST","SSH","SSL","TCP","UDP","URL","WLAN","WYSIWYG","XML","YAML","YML","IMAP","RSS","IaaS","PaaS","SaaS","CaaS","FaaS","XaaS","RaaS","IoE","IoT","LoRa","NB-IoT","RFID","RF","RFI","RFQ","ECMAScript","IO","I/O","DevOps","SecOps","DDoS","VoIP","AI","AR","ML","VR","w/","w/o","e-Book","e-Books","eBook","eBooks","eCommerce","eMarket","eMarketplace","eMarketplaces","eMarkets","eReader","eShop","eShops","eStore","eStores","E-commerce","AP","COGS","EBIT","EPS","FIFO","GAAP","LIFO","P&L","ROI","SOX","TCO","VAT","CAGR","DCF","ETF","IPO","IRR","M&A","NAV","PE","PEG","PPE","ROE","S&P","TVM","VC","B2B","B2C","CMO","CPA","CPC","CPL","CPM","CRM","CTA","CTR","SEO","SEM","SMM","USP","A/B","CTA","CTOR","CTR","KPI","PWA","SEM","SERP","SERPs","SMM","SMO","FAQ","FAQA","FAQS","UI","UI/UX","UX","T&C","TOS","PP","CRM","PoE","PoW","PoC","A11Y","PR","BANT","KPI","MQL","NPS","POS","SPIN","SQL","SWOT","AFA","ADR","CCPA","CFAA","CISG","DMCA","EULA","GDPR","HIPAA","NDA","SOW","TOS","CEO","CEOs","CFO","CFOs","CIO","CIOs","CMO","CMOs","COO","COOs","CPO","CPOs","CRO","CROs","CSO","CSOs","CTO","CTOs","EVP","EVPs","HR","HRs","SVP","SVPs","VP","VPs","NGO","NPO","NGOs","NPOs","UN","UNESCO","UNICEF","UNHCR","UNODC","UNDP","UNFPA","UNEP","Adobe","Airbnb","Alibaba","Allstate","American Express","Apple","AT&T","BMW","Boeing","Cisco","Citigroup","Coca","Deloitte","Disney","Dropbox","ExxonMobil","Ford","GE","General","Goldman Sachs","Google","Hilton","HP","IBM","Intel","JPMorgan","Johnson & Johnson","LinkedIn","McDonald's","Mercedes-Benz","Microsoft","Nestle","Nike","Nissan","Oracle","PepsiCo","Pfizer","Salesforce","Samsung","Shell","Sony","Tesla","Toyota","Uber","Verizon","Visa","Walmart","Wells Fargo","Yahoo","Zara","IKEA","Facebook","YouTube","Instagram","Twitter","TensorFlow","Amazon","Netflix","eBay","iPhone","iPad","iPod","PlayStation","PayPal","GitHub","GitLab","CodeIgniter","WordPress","WooCommerce","MongoDB","JIRA","HubSpot","AirDrop","AirPlay","AirPods","AirTags","FinalCut","GarageBand","iBooks","iCloud","iLife","iMac","iMessage","iMovie","iPhoto","iWatch","iWork","LogicPro","macOS","ProTools","QuickTime","AdWords","AdSense","TikTok","Slack","Trello","Zoom","Twitch","Snapchat","WhatsApp","Telegram","Discord","Reddit","Quora","StackOverflow","StackExchange","Coca-Cola","AWS","GCP","VMware","CVS","ESL","EE","NBA","NCAA","NFL","WWE","WWF","FIFA","a.m.","p.m.","ca.","cc.","fig.","pl.","pt.","rev.","sr.","v.","vol.","et al.","pp.","p.","ph.d.","m.d.","d.d.s.","d.m.d.","d.o.","d.c.","d.v.m.","d.n.p.","d.p.m.","d.s.w.","d.s.n.","d.n.sc.","d.n.a.","d.n.t.","d.n.p.t.","d.n.o.","d.n.m.","d.n.e.","d.n.s.","d.n.p.s.","adj.","adv.","cf.","cm.","co.","corp.","dept.","dist.","ed.","edn.","esp.","etc.","ex.","i.e.","e.g.","op. cit.","vs.","Ltd.","Co.","Inc.","St.","Ave.","Bldg.","No."];t.wordReplacementsList=[{"a.k.a":"AKA"},{"a.s.a.p":"ASAP"},{angularjs:"Angular.js"},{"back-end":"Backend"},{"d.i.y":"DIY"},{"e-book":"eBook"},{"e-books":"eBooks"},{"e-commerce":"eCommerce"},{ecom:"eCommerce"},{ecommerce:"eCommerce"},{"f.a.q":"FAQ"},{"f.a.q.a":"FAQs"},{"f.a.q.s":"FAQs"},{"f.y.i":"FYI"},{"front-end":"Frontend"},{"full-stack":"Fullstack"},{nextjs:"Next.js"},{nodejs:"Node.js"},{nuxtjs:"Nuxt.js"},{reactjs:"React.js"},{"t.b.d":"TBD"},{vuejs:"Vue.js"},{phd:"ph.d."}];var r=Object.freeze({AP:"ap",APA:"apa",BRITISH:"british",CHICAGO:"chicago",NYT:"nyt",WIKIPEDIA:"wikipedia"});t.titleCaseStylesList=r;var n=Object.values(r);t.allowedTitleCaseStylesList=n;var o=Object.freeze({ap:{shortConjunctionsList:["and","but","or","for","nor","yet","so"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","in","of","on","to","up","via"],neverCapitalizedList:[]},apa:{shortConjunctionsList:["and","as","but","by","for","in","nor","of","on","or","so","to","yet"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","for","in","of","on","to","up","via"],neverCapitalizedList:[]},british:{shortConjunctionsList:["and","but","or","for","nor","yet","so"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","in","of","on","to","up","via"],neverCapitalizedList:[]},chicago:{shortConjunctionsList:["and","but","or","for","nor","yet","so"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","for","in","of","on","to","up","with","via"],neverCapitalizedList:["etc."]},nyt:{shortConjunctionsList:["and","but","or","for","nor","yet","so"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","in","of","on","to","up","via"],neverCapitalizedList:[]},wikipedia:{shortConjunctionsList:["and","as","but","for","if","nor","or","so","yet"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","in","of","on","to","up","via"],neverCapitalizedList:[]}});t.titleCaseDefaultOptionsList=o;t.ignoredWordList=[];t.correctPhraseCasingList=["The Cybersmile Foundation","CO. by Colgate","The Simpsons"]}.apply(t,[t]))||(e.exports=r)},858:(e,t,r)=>{var n,o;n=[t,r(485)],void 0===(o=function(e,r){"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,s=[],u=!0,l=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=i.call(r)).done)&&(s.push(n.value),s.length!==t);u=!0);}catch(e){l=!0,o=e}finally{try{if(!u&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(l)throw o}}return s}}(e,t)||l(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(e){return function(e){if(Array.isArray(e))return c(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||l(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){p(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function u(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=l(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw i}}}}function l(e,t){if(e){if("string"==typeof e)return c(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c(e,t):void 0}}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function f(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,d(n.key),n)}}function p(e,t,r){return(t=d(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function d(e){var t=function(e,t){if("object"!==n(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var o=r.call(e,t||"default");if("object"!==n(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===n(t)?t:String(t)}Object.defineProperty(e,"__esModule",{value:!0}),t.default=void 0;var y=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,a,l;return t=e,l=[{key:"validateOption",value:function(e,t){if(!Array.isArray(t))throw new TypeError("Invalid option: ".concat(e," must be an array"));if(!t.every((function(e){return"string"==typeof e})))throw new TypeError("Invalid option: ".concat(e," must be an array of strings"))}},{key:"validateOptions",value:function(e){for(var t=0,n=Object.keys(e);t<n.length;t++){var o=n[t];if("style"!==o)if("wordReplacementsList"!==o){if(!r.titleCaseDefaultOptionsList.hasOwnProperty(o))throw new TypeError("Invalid option: ".concat(o));this.TitleCaseValidator.validateOption(o,e[o])}else{if(!Array.isArray(e.wordReplacementsList))throw new TypeError("Invalid option: ".concat(o," must be an array"));var i,a=u(e.wordReplacementsList);try{for(a.s();!(i=a.n()).done;)if("string"!=typeof i.value)throw new TypeError("Invalid option: ".concat(o," must contain only strings"))}catch(e){a.e(e)}finally{a.f()}}else{if("string"!=typeof e.style)throw new TypeError("Invalid option: ".concat(o," must be a string"));if(!r.allowedTitleCaseStylesList.includes(e.style))throw new TypeError("Invalid option: ".concat(o," must be a string"))}}}},{key:"getTitleCaseOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],a=JSON.stringify({options:t,lowercaseWords:n});if(e.titleCaseOptionsCache.has(a))return e.titleCaseOptionsCache.get(a);var u=s(s({},r.titleCaseDefaultOptionsList[t.style||"ap"]),t),l=u.articlesList.concat(n).filter((function(e,t,r){return r.indexOf(e)===t})),c=u.shortConjunctionsList.concat(n).filter((function(e,t,r){return r.indexOf(e)===t})),f=u.shortPrepositionsList.concat(n).filter((function(e,t,r){return r.indexOf(e)===t})),p=[].concat(i((u.replaceTerms||[]).map((function(e){var t=o(e,2),r=t[0],n=t[1];return[r.toLowerCase(),n]}))),i(r.wordReplacementsList)),d={articlesList:l,shortConjunctionsList:c,shortPrepositionsList:f,neverCapitalizedList:i(u.neverCapitalizedList),replaceTerms:p};return e.titleCaseOptionsCache.set(a,d),d}},{key:"isShortConjunction",value:function(t,r){var n=i(e.getTitleCaseOptions({style:r}).shortConjunctionsList),o=t.toLowerCase();return n.includes(o)}},{key:"isArticle",value:function(t,r){return e.getTitleCaseOptions({style:r}).articlesList.includes(t.toLowerCase())}},{key:"isShortPreposition",value:function(t,r){return e.getTitleCaseOptions({style:r}).shortPrepositionsList.includes(t.toLowerCase())}},{key:"isNeverCapitalized",value:function(t,r){var n="".concat(r,"_").concat(t.toLowerCase());if(e.isNeverCapitalizedCache.has(n))return e.isNeverCapitalizedCache.get(n);var o=e.getTitleCaseOptions({style:r}).neverCapitalizedList.includes(t.toLowerCase());return e.isNeverCapitalizedCache.set(n,o),o}},{key:"isShortWord",value:function(t,o){if("string"!=typeof t)throw new TypeError("Invalid input: word must be a string. Received ".concat(n(t),"."));if(!r.allowedTitleCaseStylesList.includes(o))throw new Error("Invalid option: style must be one of ".concat(r.allowedTitleCaseStylesList.join(", "),"."));return e.isShortConjunction(t,o)||e.isArticle(t,o)||e.isShortPreposition(t,o)||e.isNeverCapitalized(t,o)}},{key:"hasNumbers",value:function(e){return/\d/.test(e)}},{key:"hasUppercaseMultiple",value:function(e){for(var t=0,r=0;r<e.length&&t<2;r++)/[A-Z]/.test(e[r])&&t++;return t>=2}},{key:"hasUppercaseIntentional",value:function(e){return/[A-Z]/.test(e.slice(1))&&/[a-z]/.test(e.slice(0,-1))}},{key:"hasSuffix",value:function(e){return e.length>"'s".length&&e.endsWith("'s")}},{key:"hasApostrophe",value:function(e){return-1!==e.indexOf("'")}},{key:"hasHyphen",value:function(e){return-1!==e.indexOf("-")||-1!==e.indexOf("–")||-1!==e.indexOf("—")}},{key:"hasRomanNumeral",value:function(e){if("string"!=typeof e||""===e)throw new TypeError("Invalid input: word must be a non-empty string.");return/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i.test(e)}},{key:"hasHyphenRomanNumeral",value:function(t){if("string"!=typeof t||""===t)throw new TypeError("Invalid input: word must be a non-empty string.");for(var r=t.split("-"),n=0;n<r.length;n++)if(!e.hasRomanNumeral(r[n]))return!1;return!0}},{key:"hasHtmlBreak",value:function(e){return"nl2br"===e}},{key:"hasUnicodeSymbols",value:function(e){return/[^\x00-\x7F\u00A0-\u00FF\u0100-\u017F\u0180-\u024F\u0250-\u02AF\u02B0-\u02FF\u0300-\u036F\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u0530-\u058F\u0590-\u05FF\u0600-\u06FF\u0700-\u074F\u0750-\u077F\u0780-\u07BF\u07C0-\u07FF\u0800-\u083F\u0840-\u085F\u0860-\u087F\u0880-\u08AF\u08B0-\u08FF\u0900-\u097F\u0980-\u09FF\u0A00-\u0A7F\u0A80-\u0AFF\u0B00-\u0B7F\u0B80-\u0BFF\u0C00-\u0C7F\u0C80-\u0CFF\u0D00-\u0D7F\u0D80-\u0DFF\u0E00-\u0E7F\u0E80-\u0EFF\u0F00-\u0FFF]/.test(e)}},{key:"hasCurrencySymbols",value:function(e){return/[^\x00-\x7F\u00A0-\u00FF\u20AC\u20A0-\u20B9\u20BD\u20A1-\u20A2\u00A3-\u00A5\u058F\u060B\u09F2-\u09F3\u0AF1\u0BF9\u0E3F\u17DB\u20A6\u20A8\u20B1\u2113\u20AA-\u20AB\u20AA\u20AC-\u20AD\u20B9]/.test(e)}},{key:"isWordAmpersand",value:function(e){return/&amp;|&/.test(e)}},{key:"startsWithSymbol",value:function(e){if("string"!=typeof e)throw new Error("Parameter 'word' must be a string. Received '".concat(n(e),"' instead."));if(0===e.length)return!1;var t=e.charAt(0);return"#"===t||"@"===t||"."===t}},{key:"escapeSpecialCharacters",value:function(e){return e.replace(/[&<>"']/g,(function(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"'":return"&#x27;";default:return e}}))}},{key:"unescapeSpecialCharacters",value:function(e){return e.replace(/&amp;|&lt;|&gt;|&quot;|&#x27;/g,(function(e){switch(e){case"&amp;":return"&";case"&lt;":return"<";case"&gt;":return">";case"&quot;":return'"';case"&#x27;":return"'";default:return e}}))}},{key:"endsWithSymbol",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[".",",",";",":","?","!"];if("string"!=typeof e||!Array.isArray(t))throw new Error("Invalid arguments");return t.some((function(t){return e.endsWith(t)}))||t.includes(e.slice(-2))}},{key:"isWordIgnored",value:function(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r.ignoredWordList;if(!Array.isArray(n))throw new TypeError("Invalid input: ignoredWords must be an array.");if("string"!=typeof e||""===e.trim())throw new TypeError("Invalid input: word must be a non-empty string.");return t=e.toLowerCase().trim(),n.includes(t)}},{key:"isWordInArray",value:function(e,t){return!!Array.isArray(t)&&t.some((function(t){return t.toLowerCase()===e.toLowerCase()}))}},{key:"replaceTerm",value:function(e,t){if("string"!=typeof e||""===e)throw new TypeError("Invalid input: word must be a non-empty string.");if(!t||"object"!==n(t))throw new TypeError("Invalid input: replaceTermObj must be a non-null object.");var r;if(r=e.toLowerCase(),t.hasOwnProperty(r))return t[r];if(t.hasOwnProperty(e))return t[e];var o=e.toUpperCase();return t.hasOwnProperty(o)?t[o]:e}},{key:"correctSuffix",value:function(e,t){if("string"!=typeof e||""===e)throw new TypeError("Invalid input: word must be a non-empty string.");if(!t||!Array.isArray(t)||t.some((function(e){return"string"!=typeof e})))throw new TypeError("Invalid input: correctTerms must be an array of strings.");if(/'s$/i.test(e)){var r=e.slice(0,-2),n=t.findIndex((function(e){return e.toLowerCase()===r.toLowerCase()}));if(n>=0){var o=t[n];return"".concat(o,"'s")}var i=r.charAt(0).toUpperCase()+r.slice(1);return"".concat(i,"'s")}return e}},{key:"correctTerm",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:/[-']/;if("string"!=typeof e||""===e)throw new TypeError("Invalid input: word must be a non-empty string.");if(!t||!Array.isArray(t))throw new TypeError("Invalid input: correctTerms must be an array.");if(!("string"==typeof r||Array.isArray(r)||r instanceof RegExp))throw new TypeError("Invalid input: delimiters must be a string, an array of strings, or a regular expression.");"string"==typeof r?r=new RegExp("[".concat(r,"]")):Array.isArray(r)&&(r=new RegExp("[".concat(r.join(""),"]")));for(var n=e.split(r),o=n.length,i=function(){var e=n[a].toLowerCase(),r=t.findIndex((function(t){return t.toLowerCase()===e}));r>=0&&(n[a]=t[r])},a=0;a<o;a++)i();return n.join(r.source.charAt(0))}},{key:"correctTermHyphenated",value:function(t,n){var o=t.split("-"),i=function(e){return e.charAt(0).toUpperCase()+e.slice(1)},a=function(e){return e.charAt(0)+e.slice(1).toLowerCase()},s={ap:function(e,t){return 0===t?i(e):a(e)},chicago:i,apa:function(t,r,o){return e.isShortWord(t,n)&&r>0&&r<o-1?t.toLowerCase():i(t)},nyt:function(e,t){return 0===t?i(e):a(e)},wikipedia:function(e,t){return 0===t?i(e):a(e)}},u=s[n]||a,l=o.map((function(e,t){if(/^(M{0,3})(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i.test(e))return e.toUpperCase();var n=e,i=e.toLowerCase(),a=r.correctTitleCasingList.findIndex((function(e){return e.toLowerCase()===i}));if(a>=0)n=r.correctTitleCasingList[a];else if(i.endsWith("'s")){var s=i.substring(0,i.length-2),l=r.correctTitleCasingList.findIndex((function(e){return e.toLowerCase()===s}));l>=0&&(n="".concat(r.correctTitleCasingList[l],"'s"))}return u(n,t,o.length)}));return l.join("-")}}],(a=null)&&f(t.prototype,a),l&&f(t,l),Object.defineProperty(t,"prototype",{writable:!1}),e}();t.default=y,p(y,"TitleCaseValidator",void 0),p(y,"titleCaseOptionsCache",new Map),p(y,"isNeverCapitalizedCache",new Map)}.apply(t,n))||(e.exports=o)},352:(e,t,r)=>{var n,o;n=[t,r(429)],void 0===(o=function(e,t){"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"TitleCaser",{enumerable:!0,get:function(){return t.TitleCaser}}),"function"!=typeof String.prototype.toTitleCase&&(String.prototype.toTitleCase=function(e){return new t.TitleCaser(e).toTitleCase(this)}),"object"===("undefined"==typeof window?"undefined":r(window))&&(window.TitleCaser=t.TitleCaser)}.apply(t,n))||(e.exports=o)}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={id:n,loaded:!1,exports:{}};return e[n](i,i.exports,r),i.loaded=!0,i.exports}r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);r(352)})();
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e={429:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TitleCaser=void 0;var s,i=r(485),o=(s=r(858))&&s.__esModule?s:{default:s};class a{constructor(e={}){this.options=e,this.wordReplacementsList=i.wordReplacementsList}toTitleCase(e){try{if(0===e.trim().length)throw new TypeError("Invalid input: input must not be empty.");if("string"!=typeof e)throw new TypeError("Invalid input: input must be a string.");if(void 0!==this.options&&"object"!=typeof this.options)throw new TypeError("Invalid options: options must be an object.");const{style:t="ap",neverCapitalize:r=[],replaceTermList:s=i.wordReplacementsList}=this.options,a=["nl2br",...r],{articlesList:n,shortConjunctionsList:c,shortPrepositionsList:l,neverCapitalizedList:u,replaceTerms:p}=o.default.getTitleCaseOptions(this.options,i.commonAbbreviationList,i.wordReplacementsList),d=s.map((e=>Object.keys(e)[0].toLowerCase())),C=Object.fromEntries(s.map((e=>[Object.keys(e)[0].toLowerCase(),Object.values(e)[0]])));let f=e.trim();f=f.replace(/ {2,}/g,(e=>e.slice(0,1))),f=f.replace(/<br\s*\/?>/gi,"nl2br ");const h=f.split(" ");f=h.map(((e,r)=>{switch(!0){case o.default.isWordAmpersand(e):case o.default.hasHtmlBreak(e):case o.default.isWordIgnored(e,a):return e;case d.includes(e.toLowerCase()):return C[e.toLowerCase()];case o.default.isWordInArray(e,i.correctTitleCasingList):return o.default.correctTerm(e,i.correctTitleCasingList);case o.default.hasSuffix(e,t):return o.default.correctSuffix(e,i.correctTitleCasingList);case o.default.hasHyphen(e):return o.default.correctTermHyphenated(e,t);case o.default.hasUppercaseIntentional(e):return e;case o.default.isShortWord(e,t)&&0!==r:return r>0&&o.default.endsWithSymbol(h[r-1],[":","?","!","."])?e.charAt(0).toUpperCase()+e.slice(1):e.toLowerCase();case o.default.endsWithSymbol(e):const s=e.split(/([.,\/#!$%\^&\*;:{}=\-_`~()])/g).map(((e,t)=>o.default.isWordInArray(e,i.correctTitleCasingList)?o.default.correctTerm(e,i.correctTitleCasingList):(t>0&&o.default.endsWithSymbol(e),e.charAt(0).toUpperCase()+e.slice(1))));return s.join("");case o.default.startsWithSymbol(e):return o.default.isWordInArray(e,i.correctTitleCasingList)?o.default.correctTerm(e):e;case o.default.hasRomanNumeral(e):return e.toUpperCase();case o.default.hasNumbers(e):return e;default:return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}})).join(" ");for(const e of i.correctPhraseCasingList)f.toLowerCase().includes(e.toLowerCase())&&(f=f.replace(new RegExp(e,"gi"),e));return f=f.replace(/nl2br /gi,"<br />"),f}catch(e){throw new Error(e)}}setReplaceTerms(e){if("object"!=typeof e)throw new TypeError("Invalid argument: replace terms must be an object.");Object.entries(e).forEach((([e,t])=>{const r=i.wordReplacementsList.findIndex((t=>t[e]));-1!==r?i.wordReplacementsList[r][e]=t:i.wordReplacementsList.push({[e]:t})})),this.options.wordReplacementsList=i.wordReplacementsList}addReplaceTerm(e,t){if("string"!=typeof e||"string"!=typeof t)throw new TypeError("Invalid argument: term and replacement must be strings.");const r=this.wordReplacementsList.findIndex((t=>t[e]));-1!==r?this.wordReplacementsList[r][e]=t:this.wordReplacementsList.push({[e]:t}),this.options.wordReplacementsList=this.wordReplacementsList}removeReplaceTerm(e){if("string"!=typeof e)throw new TypeError("Invalid argument: term must be a string.");const t=this.wordReplacementsList.findIndex((t=>Object.keys(t)[0]===e));if(-1===t)throw new Error(`Term '${e}' not found in word replacements list.`);this.wordReplacementsList.splice(t,1),this.options.wordReplacementsList=this.wordReplacementsList}setStyle(e){if("string"!=typeof e)throw new TypeError("Invalid argument: style must be a string.");this.options.style=e}}t.TitleCaser=a,e.exports&&(e.exports={TitleCaser:a})},485:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.wordReplacementsList=t.titleCaseStylesList=t.titleCaseDefaultOptionsList=t.ignoredWordList=t.correctTitleCasingList=t.correctPhraseCasingList=t.commonAbbreviationList=t.allowedTitleCaseStylesList=void 0;t.commonAbbreviationList=["a","an","the","as","at","by","for","in","of","on","to","up","yet","so","but","nor","or","and"];t.correctTitleCasingList=["AJAX","CSS","DOM","ES6","HTML","JavaScript","jQuery","MobX","SCSS","TypeScript","Vue.js",".NET","ASP","ASPX","MySQL","PHP","PostgresQL","Python","SQL","GraphQL","HTML5","API","APIs","ASCII","CI","CircleCI","CLI","DLL","DNS","EC2","FTP","HTTP","HTTPs","ICMP","IDE","IP","ISP","JSON","JSP","LPWAN","M2M","MQTT","OOP","REST","SSH","SSL","TCP","UDP","URL","WLAN","WYSIWYG","XML","YAML","YML","IMAP","RSS","IaaS","PaaS","SaaS","CaaS","FaaS","XaaS","RaaS","IoE","IoT","LoRa","NB-IoT","RFID","RF","RFI","RFQ","ECMAScript","IO","I/O","DevOps","SecOps","DDoS","VoIP","AI","AR","ML","VR","w/","w/o","e-Book","e-Books","eBook","eBooks","eCommerce","eMarket","eMarketplace","eMarketplaces","eMarkets","eReader","eShop","eShops","eStore","eStores","E-commerce","AP","COGS","EBIT","EPS","FIFO","GAAP","LIFO","P&L","ROI","SOX","TCO","VAT","CAGR","DCF","ETF","IPO","IRR","M&A","NAV","PE","PEG","PPE","ROE","S&P","TVM","VC","B2B","B2C","CMO","CPA","CPC","CPL","CPM","CRM","CTA","CTR","SEO","SEM","SMM","USP","A/B","CTA","CTOR","CTR","KPI","PWA","SEM","SERP","SERPs","SMM","SMO","FAQ","FAQA","FAQS","UI","UI/UX","UX","T&C","TOS","PP","CRM","PoE","PoW","PoC","A11Y","PR","BANT","KPI","MQL","NPS","POS","SPIN","SQL","SWOT","AFA","ADR","CCPA","CFAA","CISG","DMCA","EULA","GDPR","HIPAA","NDA","SOW","TOS","CEO","CEOs","CFO","CFOs","CIO","CIOs","CMO","CMOs","COO","COOs","CPO","CPOs","CRO","CROs","CSO","CSOs","CTO","CTOs","EVP","EVPs","HR","HRs","SVP","SVPs","VP","VPs","NGO","NPO","NGOs","NPOs","UN","UNESCO","UNICEF","UNHCR","UNODC","UNDP","UNFPA","UNEP","Adobe","Airbnb","Alibaba","Allstate","American Express","Apple","AT&T","BMW","Boeing","Cisco","Citigroup","Coca","Deloitte","Disney","Dropbox","ExxonMobil","Ford","GE","General","Goldman Sachs","Google","Hilton","HP","IBM","Intel","JPMorgan","Johnson & Johnson","LinkedIn","McDonald's","Mercedes-Benz","Microsoft","Nestle","Nike","Nissan","Oracle","PepsiCo","Pfizer","Salesforce","Samsung","Shell","Sony","Tesla","Toyota","Uber","Verizon","Visa","Walmart","Wells Fargo","Yahoo","Zara","IKEA","Facebook","YouTube","Instagram","Twitter","TensorFlow","Amazon","Netflix","eBay","iPhone","iPad","iPod","PlayStation","PayPal","GitHub","GitLab","CodeIgniter","WordPress","WooCommerce","MongoDB","JIRA","HubSpot","AirDrop","AirPlay","AirPods","AirTags","FinalCut","GarageBand","iBooks","iCloud","iLife","iMac","iMessage","iMovie","iPhoto","iWatch","iWork","LogicPro","macOS","ProTools","QuickTime","AdWords","AdSense","TikTok","Slack","Trello","Zoom","Twitch","Snapchat","WhatsApp","Telegram","Discord","Reddit","Quora","StackOverflow","StackExchange","Coca-Cola","AWS","GCP","VMware","CVS","ESL","EE","NBA","NCAA","NFL","WWE","WWF","FIFA","a.m.","p.m.","ca.","cc.","fig.","pl.","pt.","rev.","sr.","v.","vol.","et al.","pp.","p.","ph.d.","m.d.","d.d.s.","d.m.d.","d.o.","d.c.","d.v.m.","d.n.p.","d.p.m.","d.s.w.","d.s.n.","d.n.sc.","d.n.a.","d.n.t.","d.n.p.t.","d.n.o.","d.n.m.","d.n.e.","d.n.s.","d.n.p.s.","adj.","adv.","cf.","cm.","co.","corp.","dept.","dist.","ed.","edn.","esp.","etc.","ex.","i.e.","e.g.","op. cit.","vs.","Ltd.","Co.","Inc.","St.","Ave.","Bldg.","No."];t.wordReplacementsList=[{"a.k.a":"AKA"},{"a.s.a.p":"ASAP"},{angularjs:"Angular.js"},{"back-end":"Backend"},{"d.i.y":"DIY"},{"e-book":"eBook"},{"e-books":"eBooks"},{"e-commerce":"eCommerce"},{ecom:"eCommerce"},{ecommerce:"eCommerce"},{"f.a.q":"FAQ"},{"f.a.q.a":"FAQs"},{"f.a.q.s":"FAQs"},{"f.y.i":"FYI"},{"front-end":"Frontend"},{"full-stack":"Fullstack"},{nextjs:"Next.js"},{nodejs:"Node.js"},{nuxtjs:"Nuxt.js"},{reactjs:"React.js"},{"t.b.d":"TBD"},{vuejs:"Vue.js"},{phd:"ph.d."}];const r=Object.freeze({AP:"ap",APA:"apa",BRITISH:"british",CHICAGO:"chicago",NYT:"nyt",WIKIPEDIA:"wikipedia"});t.titleCaseStylesList=r;const s=Object.values(r);t.allowedTitleCaseStylesList=s;const i=Object.freeze({ap:{shortConjunctionsList:["and","but","or","for","nor","yet","so"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","in","of","on","to","up","via"],neverCapitalizedList:[]},apa:{shortConjunctionsList:["and","as","but","by","for","in","nor","of","on","or","so","to","yet"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","for","in","of","on","to","up","via"],neverCapitalizedList:[]},british:{shortConjunctionsList:["and","but","or","for","nor","yet","so"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","in","of","on","to","up","via"],neverCapitalizedList:[]},chicago:{shortConjunctionsList:["and","but","or","for","nor","yet","so"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","for","in","of","on","to","up","with","via"],neverCapitalizedList:["etc."]},nyt:{shortConjunctionsList:["and","but","or","for","nor","yet","so"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","in","of","on","to","up","via"],neverCapitalizedList:[]},wikipedia:{shortConjunctionsList:["and","as","but","for","if","nor","or","so","yet"],articlesList:["a","an","the"],shortPrepositionsList:["as","at","by","in","of","on","to","up","via"],neverCapitalizedList:[]}});t.titleCaseDefaultOptionsList=i;t.ignoredWordList=[];t.correctPhraseCasingList=["The Cybersmile Foundation","CO. by Colgate","The Simpsons"]},858:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(485);function i(e,t,r){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var s=r.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}class o{static validateOption(e,t){if(!Array.isArray(t))throw new TypeError(`Invalid option: ${e} must be an array`);if(!t.every((e=>"string"==typeof e)))throw new TypeError(`Invalid option: ${e} must be an array of strings`)}static validateOptions(e){for(const t of Object.keys(e))if("style"!==t)if("wordReplacementsList"!==t){if(!s.titleCaseDefaultOptionsList.hasOwnProperty(t))throw new TypeError(`Invalid option: ${t}`);this.TitleCaseValidator.validateOption(t,e[t])}else{if(!Array.isArray(e.wordReplacementsList))throw new TypeError(`Invalid option: ${t} must be an array`);for(const r of e.wordReplacementsList)if("string"!=typeof r)throw new TypeError(`Invalid option: ${t} must contain only strings`)}else{if("string"!=typeof e.style)throw new TypeError(`Invalid option: ${t} must be a string`);if(!s.allowedTitleCaseStylesList.includes(e.style))throw new TypeError(`Invalid option: ${t} must be a string`)}}static getTitleCaseOptions(e={},t=[]){const r=JSON.stringify({options:e,lowercaseWords:t});if(o.titleCaseOptionsCache.has(r))return o.titleCaseOptionsCache.get(r);const i={...s.titleCaseDefaultOptionsList[e.style||"ap"],...e},a=i.articlesList.concat(t).filter(((e,t,r)=>r.indexOf(e)===t)),n=i.shortConjunctionsList.concat(t).filter(((e,t,r)=>r.indexOf(e)===t)),c=i.shortPrepositionsList.concat(t).filter(((e,t,r)=>r.indexOf(e)===t)),l=[...(i.replaceTerms||[]).map((([e,t])=>[e.toLowerCase(),t])),...s.wordReplacementsList],u={articlesList:a,shortConjunctionsList:n,shortPrepositionsList:c,neverCapitalizedList:[...i.neverCapitalizedList],replaceTerms:l};return o.titleCaseOptionsCache.set(r,u),u}static isShortConjunction(e,t){const r=[...o.getTitleCaseOptions({style:t}).shortConjunctionsList],s=e.toLowerCase();return r.includes(s)}static isArticle(e,t){return o.getTitleCaseOptions({style:t}).articlesList.includes(e.toLowerCase())}static isShortPreposition(e,t){const{shortPrepositionsList:r}=o.getTitleCaseOptions({style:t});return r.includes(e.toLowerCase())}static isNeverCapitalized(e,t){const r=`${t}_${e.toLowerCase()}`;if(o.isNeverCapitalizedCache.has(r))return o.isNeverCapitalizedCache.get(r);const{neverCapitalizedList:s}=o.getTitleCaseOptions({style:t}),i=s.includes(e.toLowerCase());return o.isNeverCapitalizedCache.set(r,i),i}static isShortWord(e,t){if("string"!=typeof e)throw new TypeError(`Invalid input: word must be a string. Received ${typeof e}.`);if(!s.allowedTitleCaseStylesList.includes(t))throw new Error(`Invalid option: style must be one of ${s.allowedTitleCaseStylesList.join(", ")}.`);return o.isShortConjunction(e,t)||o.isArticle(e,t)||o.isShortPreposition(e,t)||o.isNeverCapitalized(e,t)}static hasNumbers(e){return/\d/.test(e)}static hasUppercaseMultiple(e){let t=0;for(let r=0;r<e.length&&t<2;r++)/[A-Z]/.test(e[r])&&t++;return t>=2}static hasUppercaseIntentional(e){return/[A-Z]/.test(e.slice(1))&&/[a-z]/.test(e.slice(0,-1))}static hasSuffix(e){return e.length>"'s".length&&e.endsWith("'s")}static hasApostrophe(e){return-1!==e.indexOf("'")}static hasHyphen(e){return-1!==e.indexOf("-")||-1!==e.indexOf("–")||-1!==e.indexOf("—")}static hasRomanNumeral(e){if("string"!=typeof e||""===e)throw new TypeError("Invalid input: word must be a non-empty string.");return/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i.test(e)}static hasHyphenRomanNumeral(e){if("string"!=typeof e||""===e)throw new TypeError("Invalid input: word must be a non-empty string.");const t=e.split("-");for(let e=0;e<t.length;e++)if(!o.hasRomanNumeral(t[e]))return!1;return!0}static hasHtmlBreak(e){return"nl2br"===e}static hasUnicodeSymbols(e){return/[^\x00-\x7F\u00A0-\u00FF\u0100-\u017F\u0180-\u024F\u0250-\u02AF\u02B0-\u02FF\u0300-\u036F\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u0530-\u058F\u0590-\u05FF\u0600-\u06FF\u0700-\u074F\u0750-\u077F\u0780-\u07BF\u07C0-\u07FF\u0800-\u083F\u0840-\u085F\u0860-\u087F\u0880-\u08AF\u08B0-\u08FF\u0900-\u097F\u0980-\u09FF\u0A00-\u0A7F\u0A80-\u0AFF\u0B00-\u0B7F\u0B80-\u0BFF\u0C00-\u0C7F\u0C80-\u0CFF\u0D00-\u0D7F\u0D80-\u0DFF\u0E00-\u0E7F\u0E80-\u0EFF\u0F00-\u0FFF]/.test(e)}static hasCurrencySymbols(e){return/[^\x00-\x7F\u00A0-\u00FF\u20AC\u20A0-\u20B9\u20BD\u20A1-\u20A2\u00A3-\u00A5\u058F\u060B\u09F2-\u09F3\u0AF1\u0BF9\u0E3F\u17DB\u20A6\u20A8\u20B1\u2113\u20AA-\u20AB\u20AA\u20AC-\u20AD\u20B9]/.test(e)}static isWordAmpersand(e){return/&amp;|&/.test(e)}static startsWithSymbol(e){if("string"!=typeof e)throw new Error(`Parameter 'word' must be a string. Received '${typeof e}' instead.`);if(0===e.length)return!1;const t=e.charAt(0);return"#"===t||"@"===t||"."===t}static escapeSpecialCharacters(e){return e.replace(/[&<>"']/g,(function(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"'":return"&#x27;";default:return e}}))}static unescapeSpecialCharacters(e){return e.replace(/&amp;|&lt;|&gt;|&quot;|&#x27;/g,(function(e){switch(e){case"&amp;":return"&";case"&lt;":return"<";case"&gt;":return">";case"&quot;":return'"';case"&#x27;":return"'";default:return e}}))}static endsWithSymbol(e,t=[".",",",";",":","?","!"]){if("string"!=typeof e||!Array.isArray(t))throw new Error("Invalid arguments");return t.some((t=>e.endsWith(t)))||t.includes(e.slice(-2))}static isWordIgnored(e,t=s.ignoredWordList){if(!Array.isArray(t))throw new TypeError("Invalid input: ignoredWords must be an array.");if("string"!=typeof e||""===e.trim())throw new TypeError("Invalid input: word must be a non-empty string.");let r;return r=e.toLowerCase().trim(),t.includes(r)}static isWordInArray(e,t){return!!Array.isArray(t)&&t.some((t=>t.toLowerCase()===e.toLowerCase()))}static replaceTerm(e,t){if("string"!=typeof e||""===e)throw new TypeError("Invalid input: word must be a non-empty string.");if(!t||"object"!=typeof t)throw new TypeError("Invalid input: replaceTermObj must be a non-null object.");let r;if(r=e.toLowerCase(),t.hasOwnProperty(r))return t[r];if(t.hasOwnProperty(e))return t[e];const s=e.toUpperCase();return t.hasOwnProperty(s)?t[s]:e}static correctSuffix(e,t){if("string"!=typeof e||""===e)throw new TypeError("Invalid input: word must be a non-empty string.");if(!t||!Array.isArray(t)||t.some((e=>"string"!=typeof e)))throw new TypeError("Invalid input: correctTerms must be an array of strings.");if(/'s$/i.test(e)){const r=e.slice(0,-2),s=t.findIndex((e=>e.toLowerCase()===r.toLowerCase()));if(s>=0){return`${t[s]}'s`}return`${r.charAt(0).toUpperCase()+r.slice(1)}'s`}return e}static correctTerm(e,t,r=/[-']/){if("string"!=typeof e||""===e)throw new TypeError("Invalid input: word must be a non-empty string.");if(!t||!Array.isArray(t))throw new TypeError("Invalid input: correctTerms must be an array.");if(!("string"==typeof r||Array.isArray(r)||r instanceof RegExp))throw new TypeError("Invalid input: delimiters must be a string, an array of strings, or a regular expression.");"string"==typeof r?r=new RegExp(`[${r}]`):Array.isArray(r)&&(r=new RegExp(`[${r.join("")}]`));const s=e.split(r),i=s.length;for(let e=0;e<i;e++){const r=s[e].toLowerCase(),i=t.findIndex((e=>e.toLowerCase()===r));i>=0&&(s[e]=t[i])}return s.join(r.source.charAt(0))}static correctTermHyphenated(e,t){const r=e.split("-"),i=e=>e.charAt(0).toUpperCase()+e.slice(1),a=e=>e.charAt(0)+e.slice(1).toLowerCase(),n={ap:(e,t)=>0===t?i(e):a(e),chicago:i,apa:(e,r,s)=>o.isShortWord(e,t)&&r>0&&r<s-1?e.toLowerCase():i(e),nyt:(e,t)=>0===t?i(e):a(e),wikipedia:(e,t)=>0===t?i(e):a(e)},c=n[t]||a,l=r.map(((e,t)=>{if(/^(M{0,3})(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i.test(e))return e.toUpperCase();let i=e;const o=e.toLowerCase(),a=s.correctTitleCasingList.findIndex((e=>e.toLowerCase()===o));if(a>=0)i=s.correctTitleCasingList[a];else if(o.endsWith("'s")){const e=o.substring(0,o.length-2),t=s.correctTitleCasingList.findIndex((t=>t.toLowerCase()===e));t>=0&&(i=`${s.correctTitleCasingList[t]}'s`)}return c(i,t,r.length)}));return l.join("-")}}t.default=o,i(o,"TitleCaseValidator",void 0),i(o,"titleCaseOptionsCache",new Map),i(o,"isNeverCapitalizedCache",new Map)}},t={};function r(s){var i=t[s];if(void 0!==i)return i.exports;var o=t[s]={exports:{}};return e[s](o,o.exports,r),o.exports}var s={};(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"TitleCaser",{enumerable:!0,get:function(){return t.TitleCaser}});var t=r(429);"function"!=typeof String.prototype.toTitleCase&&(String.prototype.toTitleCase=function(e){return new t.TitleCaser(e).toTitleCase(this)}),"object"==typeof window&&(window.TitleCaser=t.TitleCaser)})(),module.exports=s})();
package/package.json CHANGED
@@ -1,18 +1,25 @@
1
1
  {
2
2
  "name": "@danielhaim/titlecaser",
3
- "version": "1.2.29",
3
+ "version": "1.2.33",
4
4
  "description": "Converts a string to title case with multiple style options, ability to ignore certain words, and handle acronyms",
5
5
  "keywords": [
6
- "titlecase",
7
- "text transformation",
8
- "capitalization",
9
- "formatting"
6
+ "Title Case",
7
+ "Text Transformation",
8
+ "Text Capitalization",
9
+ "Text Formatting",
10
+ "English",
11
+ "British",
12
+ "AP",
13
+ "APA",
14
+ "Chicago",
15
+ "NYTimes",
16
+ "Wikipedia"
10
17
  ],
11
18
  "repository": {
12
19
  "type": "git",
13
20
  "url": "https://github.com/danielhaim1/titlecaser.git"
14
21
  },
15
- "main": "src/TitleCaser.js",
22
+ "main": "src/index.js",
16
23
  "scripts": {
17
24
  "test": "jest",
18
25
  "build-docs": "cd docs && bundle install && bundle exec jekyll build",
@@ -26,9 +33,11 @@
26
33
  "README.md",
27
34
  "package.json",
28
35
  "src/index.js",
29
- "src/TitleCaseConsts.js",
30
36
  "src/TitleCaser.js",
31
- "src/index.js"
37
+ "src/TitleCaserConsts.js",
38
+ "src/TitleCaseUtils.js",
39
+ "dist/titlecaser.min.js",
40
+ "dist/titlecaser.amd.js"
32
41
  ],
33
42
  "author": {
34
43
  "name": "Daniel Haim",
@@ -37,24 +46,24 @@
37
46
  "license": "MIT",
38
47
  "devDependencies": {
39
48
  "@babel/cli": "^7.21.0",
40
- "@babel/core": "^7.21.0",
49
+ "@babel/core": "^7.21.4",
41
50
  "@babel/plugin-transform-modules-commonjs": "^7.21.2",
42
- "@babel/preset-env": "^7.20.2",
51
+ "@babel/preset-env": "^7.21.4",
43
52
  "@babel/runtime-corejs3": "^7.21.0",
44
53
  "babel-loader": "^9.1.2",
45
54
  "esbuild-jest": "^0.5.0",
46
55
  "exports-loader": "^4.0.0",
47
56
  "terser-webpack-plugin": "^5.3.7",
48
- "webpack": "^5.76.3",
57
+ "webpack": "^5.78.0",
49
58
  "webpack-cli": "^5.0.1",
50
59
  "webpack-node-externals": "^3.0.0",
51
60
  "@jest/expect": "^29.5.0",
52
61
  "babel-jest": "^29.5.0",
53
62
  "jest": "^29.5.0",
54
63
  "jest-environment-jsdom": "^29.5.0",
55
- "jest-environment-puppeteer": "^8.0.5",
56
- "jest-puppeteer": "^8.0.5",
57
- "puppeteer": "^19.8.2",
58
- "puppeteer-core": "^19.8.0"
64
+ "jest-environment-puppeteer": "^8.0.6",
65
+ "jest-puppeteer": "^8.0.6",
66
+ "puppeteer": "^19.8.5",
67
+ "puppeteer-core": "^19.8.5"
59
68
  }
60
69
  }
package/src/TitleCaser.js CHANGED
@@ -4,9 +4,9 @@ import {
4
4
  correctPhraseCasingList,
5
5
  wordReplacementsList,
6
6
  }
7
- from "./TitleCaseConsts.js";
7
+ from "./TitleCaserConsts.js";
8
8
 
9
- import TitleCaseHelper from "./TitleCaseHelper.js";
9
+ import Utils from "./TitleCaserUtils.js";
10
10
 
11
11
  export class TitleCaser {
12
12
  constructor (options = {}) {
@@ -24,10 +24,10 @@ export class TitleCaser {
24
24
  // If options is not an object, throw an error.
25
25
  if (typeof this.options !== "undefined" && typeof this.options !== "object") throw new TypeError("Invalid options: options must be an object.");
26
26
 
27
- const {
27
+ const {
28
28
  style = "ap",
29
29
  neverCapitalize = [],
30
- replaceTermsList = wordReplacementsList
30
+ replaceTermList = wordReplacementsList
31
31
  } = this.options;
32
32
  const ignoreList = ["nl2br", ...neverCapitalize];
33
33
  const {
@@ -36,22 +36,22 @@ export class TitleCaser {
36
36
  shortPrepositionsList,
37
37
  neverCapitalizedList,
38
38
  replaceTerms
39
- } = TitleCaseHelper.getTitleCaseOptions(this.options, commonAbbreviationList, wordReplacementsList);
40
-
41
- // Prerocess the replaceTerms array to make it easier to search for.
42
- const replaceTermsArray = replaceTermsList.map(term => Object.keys(term)[0].toLowerCase());
43
- // Create an object from the replaceTerms array to make it easier to search for.
44
- const replaceTermsObj = Object.fromEntries(replaceTermsList.map(
45
- term => [Object.keys(term)[0].toLowerCase(), Object.values(term)[0]]
46
- ));
47
-
48
- const map = {
49
- '&': '&amp;',
50
- '<': '&lt;',
51
- '>': '&gt;',
52
- '"': '&quot;',
53
- "'": '&#039;'
54
- };
39
+ } = Utils.getTitleCaseOptions(this.options, commonAbbreviationList, wordReplacementsList);
40
+
41
+ // Prerocess the replaceTerms array to make it easier to search for.
42
+ const replaceTermsArray = replaceTermList.map(term => Object.keys(term)[0].toLowerCase());
43
+ // Create an object from the replaceTerms array to make it easier to search for.
44
+ const replaceTermObj = Object.fromEntries(replaceTermList.map(
45
+ term => [Object.keys(term)[0].toLowerCase(), Object.values(term)[0]]
46
+ ));
47
+
48
+ const map = {
49
+ '&': '&amp;',
50
+ '<': '&lt;',
51
+ '>': '&gt;',
52
+ '"': '&quot;',
53
+ "'": '&#039;'
54
+ };
55
55
 
56
56
  // Remove extra spaces and replace <br> tags with a placeholder.
57
57
  let inputString = str.trim();
@@ -64,57 +64,57 @@ export class TitleCaser {
64
64
 
65
65
  // Split the string into an array of words.
66
66
  const words = inputString.split(" ");
67
-
67
+
68
68
  const wordsInTitleCase = words.map((word, i) => {
69
69
  switch (true) {
70
- case TitleCaseHelper.isWordAmpersand(word):
70
+ case Utils.isWordAmpersand(word):
71
71
  // if the word is an ampersand, return it as is.
72
72
  return word;
73
- case TitleCaseHelper.hasHtmlBreak(word):
73
+ case Utils.hasHtmlBreak(word):
74
74
  // If the word is a <br> tag, return it as is.
75
75
  return word;
76
- case TitleCaseHelper.isWordIgnored(word, ignoreList):
76
+ case Utils.isWordIgnored(word, ignoreList):
77
77
  // If the word is in the ignore list, return it as is.
78
78
  return word;
79
79
  case replaceTermsArray.includes(word.toLowerCase()):
80
80
  // If the word is in the replaceTerms array, return the replacement.
81
- return replaceTermsObj[word.toLowerCase()];
82
- case TitleCaseHelper.isWordInArray(word, correctTitleCasingList):
81
+ return replaceTermObj[word.toLowerCase()];
82
+ case Utils.isWordInArray(word, correctTitleCasingList):
83
83
  // If the word is in the correctTitleCasingList array, return the correct casing.
84
- return TitleCaseHelper.correctTerm(word, correctTitleCasingList);
85
- case TitleCaseHelper.hasSuffix(word, style):
84
+ return Utils.correctTerm(word, correctTitleCasingList);
85
+ case Utils.hasSuffix(word, style):
86
86
  // If the word has a suffix, return the correct casing.
87
- return TitleCaseHelper.correctSuffix(word, correctTitleCasingList);
88
- case TitleCaseHelper.hasHyphen(word):
87
+ return Utils.correctSuffix(word, correctTitleCasingList);
88
+ case Utils.hasHyphen(word):
89
89
  // If the word has a hyphen, return the correct casing.
90
- return TitleCaseHelper.correctTermHyphenated(word, style);
91
- case TitleCaseHelper.hasUppercaseIntentional(word):
90
+ return Utils.correctTermHyphenated(word, style);
91
+ case Utils.hasUppercaseIntentional(word):
92
92
  // If the word has an intentional uppercase letter, return the correct casing.
93
93
  return word;
94
- case TitleCaseHelper.isShortWord(word, style) && i !== 0:
94
+ case Utils.isShortWord(word, style) && i !== 0:
95
95
  // If the word is a short word, return the correct casing.
96
- return (i > 0 && TitleCaseHelper.endsWithSymbol(words[i - 1],
96
+ return (i > 0 && Utils.endsWithSymbol(words[i - 1],
97
97
  [':', '?', '!', '.'])) ? word.charAt(0).toUpperCase() + word.slice(1) : word.toLowerCase();
98
- case TitleCaseHelper.endsWithSymbol(word):
98
+ case Utils.endsWithSymbol(word):
99
99
  // If the word ends with a symbol, return the correct casing.
100
100
  const splitWord = word.split(/([.,\/#!$%\^&\*;:{}=\-_`~()])/g);
101
101
  const processedWords = splitWord.map((splitWord, j) => {
102
102
  // If the word is in the correctTitleCasingList array, return the correct casing.
103
- if (TitleCaseHelper.isWordInArray(splitWord, correctTitleCasingList)) return TitleCaseHelper.correctTerm(splitWord, correctTitleCasingList);
103
+ if (Utils.isWordInArray(splitWord, correctTitleCasingList)) return Utils.correctTerm(splitWord, correctTitleCasingList);
104
104
  // Else return the word with the correct casing.
105
- else return (j > 0 && TitleCaseHelper.endsWithSymbol(splitWord)) ? splitWord.charAt(0)
105
+ else return (j > 0 && Utils.endsWithSymbol(splitWord)) ? splitWord.charAt(0)
106
106
  .toUpperCase() + splitWord.slice(1) : splitWord.charAt(0)
107
107
  .toUpperCase() + splitWord.slice(1);
108
108
  });
109
109
  // Join the processed words and return them.
110
110
  return processedWords.join("");
111
- case TitleCaseHelper.startsWithSymbol(word):
111
+ case Utils.startsWithSymbol(word):
112
112
  // If the word starts with a symbol, return the correct casing.
113
- return !TitleCaseHelper.isWordInArray(word, correctTitleCasingList) ? word : TitleCaseHelper.correctTerm(word);
114
- case TitleCaseHelper.hasRomanNumeral(word):
113
+ return !Utils.isWordInArray(word, correctTitleCasingList) ? word : Utils.correctTerm(word);
114
+ case Utils.hasRomanNumeral(word):
115
115
  // If the word has a roman numeral, return the correct casing.
116
116
  return word.toUpperCase();
117
- case TitleCaseHelper.hasNumbers(word):
117
+ case Utils.hasNumbers(word):
118
118
  // If the word has numbers, return the correct casing.
119
119
  return word;
120
120
  default:
@@ -127,7 +127,7 @@ export class TitleCaser {
127
127
 
128
128
  // Join the words in the array into a string.
129
129
  inputString = wordsInTitleCase.join(" ");
130
-
130
+
131
131
  for (const phrase of correctPhraseCasingList) {
132
132
  // If the phrase is in the input string, replace it with the correct casing.
133
133
  if (inputString.toLowerCase()
@@ -138,7 +138,7 @@ export class TitleCaser {
138
138
 
139
139
  // Replace the nl2br placeholder with <br> tags.
140
140
  inputString = inputString.replace(/nl2br /gi, "<br />");
141
-
141
+
142
142
  // Return the string.
143
143
  return inputString;
144
144
  }
@@ -148,42 +148,42 @@ export class TitleCaser {
148
148
  }
149
149
 
150
150
  setReplaceTerms(terms) {
151
- if (typeof terms !== 'object') {
152
- throw new TypeError('Invalid argument: replace terms must be an object.');
153
- }
154
-
155
- // Add the new replace terms to the wordReplacementsList array
156
- Object.entries(terms).forEach(([term, replacement]) => {
157
- const index = wordReplacementsList.findIndex(obj => obj[term]);
158
- if (index !== -1) {
159
- // If the term already exists in the array, update the replacement value
160
- wordReplacementsList[index][term] = replacement;
161
- } else {
162
- // If the term doesn't exist in the array, add a new object with the term and replacement
163
- wordReplacementsList.push({ [term]: replacement });
151
+ if (typeof terms !== 'object') {
152
+ throw new TypeError('Invalid argument: replace terms must be an object.');
164
153
  }
165
- });
166
154
 
167
- // Log the updated wordReplacementsList array
168
- // console.log(wordReplacementsList);
155
+ // Add the new replace terms to the wordReplacementsList array
156
+ Object.entries(terms).forEach(([term, replacement]) => {
157
+ const index = wordReplacementsList.findIndex(obj => obj[term]);
158
+ if (index !== -1) {
159
+ // If the term already exists in the array, update the replacement value
160
+ wordReplacementsList[index][term] = replacement;
161
+ } else {
162
+ // If the term doesn't exist in the array, add a new object with the term and replacement
163
+ wordReplacementsList.push({ [term]: replacement });
164
+ }
165
+ });
166
+
167
+ // Log the updated wordReplacementsList array
168
+ // console.log(wordReplacementsList);
169
169
 
170
- // Update the replace terms option
171
- this.options.wordReplacementsList = wordReplacementsList;
170
+ // Update the replace terms option
171
+ this.options.wordReplacementsList = wordReplacementsList;
172
172
  }
173
173
 
174
174
  addReplaceTerm(term, replacement) {
175
175
  if (typeof term !== 'string' || typeof replacement !== 'string') {
176
- throw new TypeError('Invalid argument: term and replacement must be strings.');
176
+ throw new TypeError('Invalid argument: term and replacement must be strings.');
177
177
  }
178
178
 
179
179
  const index = this.wordReplacementsList.findIndex(obj => obj[term]);
180
-
180
+
181
181
  if (index !== -1) {
182
- // If the term already exists in the array, update the replacement value
183
- this.wordReplacementsList[index][term] = replacement;
182
+ // If the term already exists in the array, update the replacement value
183
+ this.wordReplacementsList[index][term] = replacement;
184
184
  } else {
185
- // If the term doesn't exist in the array, add a new object with the term and replacement
186
- this.wordReplacementsList.push({ [term]: replacement });
185
+ // If the term doesn't exist in the array, add a new object with the term and replacement
186
+ this.wordReplacementsList.push({ [term]: replacement });
187
187
  }
188
188
 
189
189
  // Update the replace terms option
@@ -217,7 +217,7 @@ export class TitleCaser {
217
217
  if (typeof style !== 'string') {
218
218
  throw new TypeError('Invalid argument: style must be a string.');
219
219
  }
220
-
220
+
221
221
  this.options.style = style;
222
222
  }
223
223
  }
@@ -7,7 +7,7 @@ export const correctTitleCasingList = [
7
7
  // Web Technologies
8
8
  'AJAX', 'CSS', 'DOM', 'ES6', 'HTML', 'JavaScript', 'jQuery',
9
9
  'MobX', 'SCSS', 'TypeScript', 'Vue.js', '.NET', 'ASP', 'ASPX',
10
- 'MySQL', 'PHP', 'PostgreSQL', 'Python', 'SQL', 'GraphQL',
10
+ 'MySQL', 'PHP', 'PostgresQL', 'Python', 'SQL', 'GraphQL',
11
11
  'HTML5',
12
12
 
13
13
  // Acronyms/Abbreviations
@@ -45,7 +45,7 @@ export const correctTitleCasingList = [
45
45
  'PP', 'CRM', 'PoE', 'PoW', 'PoC', 'A11Y', 'PR',
46
46
 
47
47
  // Sales terms
48
- 'BANT', 'GAP', 'KPI', 'MQL', 'NPS', 'POS', 'SPIN', 'SQL',
48
+ 'BANT', 'KPI', 'MQL', 'NPS', 'POS', 'SPIN', 'SQL',
49
49
  'SWOT',
50
50
 
51
51
  // Legal terms
@@ -78,25 +78,22 @@ export const correctTitleCasingList = [
78
78
  'ProTools', 'QuickTime', 'AdWords', 'AdSense', 'TikTok', 'Slack', 'Trello',
79
79
  'Zoom', 'Twitch', 'Snapchat', 'WhatsApp', 'Telegram', 'Discord', 'Reddit',
80
80
  'Quora', 'StackOverflow', 'StackExchange', 'Coca-Cola',
81
- 'AWS', 'GCP', 'VMware', 'CVS',
81
+ 'AWS', 'GCP', 'VMware', 'CVS', 'ESL', 'EE',
82
82
 
83
83
  // Sports
84
84
  'NBA', 'NCAA', 'NFL', 'WWE', 'WWF', 'FIFA',
85
85
 
86
86
  // Time-related, numbers, and measurements: Includes abbreviations for
87
- // time-related terms, numbers, and measurements.
88
87
  'a.m.', 'p.m.', 'ca.', 'cc.', 'fig.', 'pl.', 'pt.', 'rev.',
89
88
  'sr.', 'v.', 'vol.', 'et al.', 'pp.', 'p.',
90
89
 
91
90
  // Professional abbreviations, degrees, and titles: Includes abbreviations
92
- // for professional titles, degrees, and certifications.
93
91
  'ph.d.', 'm.d.', 'd.d.s.', 'd.m.d.', 'd.o.', 'd.c.', 'd.v.m.',
94
92
  'd.n.p.', 'd.p.m.', 'd.s.w.', 'd.s.n.', 'd.n.sc.', 'd.n.a.',
95
93
  'd.n.t.', 'd.n.p.t.', 'd.n.o.', 'd.n.m.', 'd.n.e.', 'd.n.s.',
96
94
  'd.n.p.s.',
97
95
 
98
96
  // Academic & literary abbreviations: Includes abbreviations for academic
99
- // and literary terms, such as 'ed.' for 'edition' and 'vol.' for 'volume'.
100
97
  'adj.', 'adv.', 'cf.', 'cm.', 'co.', 'corp.', 'dept.',
101
98
  'dist.', 'ed.', 'edn.', 'esp.', 'etc.', 'ex.', 'i.e.', 'e.g.',
102
99
  'op. cit.', 'vs.',
@@ -206,7 +203,7 @@ export const titleCaseDefaultOptionsList = Object.freeze({
206
203
  },
207
204
  });
208
205
 
209
- export const ignoredWordsList = [];
206
+ export const ignoredWordList = [];
210
207
  export const correctPhraseCasingList = [
211
208
  'The Cybersmile Foundation',
212
209
  'CO. by Colgate',