UNPKG

ng-whatsapp-format

Version:

Angular pipe to format WhatsApp-style text (bold, italic, strikethrough, code, etc.)

1 lines 6.53 kB
{"version":3,"file":"ng-whatsapp-format.mjs","sources":["../../../projects/ng-whatsapp-format/src/lib/ng.whatsapp-format.pipe.ts","../../../projects/ng-whatsapp-format/src/public-api.ts","../../../projects/ng-whatsapp-format/src/ng-whatsapp-format.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'ngWhatsappFormat',\r\n standalone: true,\r\n})\r\nexport class NgWhatsappFormatPipe implements PipeTransform {\r\n\r\n private styleElement: HTMLStyleElement | null = null;\r\n\r\n constructor() {\r\n this.injectStyles();\r\n }\r\n\r\n private injectStyles() {\r\n if (typeof document !== 'undefined' && !this.styleElement) {\r\n this.styleElement = document.createElement('style');\r\n this.styleElement.innerHTML = `\r\n .whatsapp-bold {\r\n font-weight: bold;\r\n }\r\n\r\n .whatsapp-italic {\r\n font-style: italic;\r\n }\r\n\r\n .whatsapp-strike {\r\n text-decoration: line-through;\r\n }\r\n\r\n .whatsapp-monospace {\r\n font-family: monospace;\r\n background-color: #f5f5f5;\r\n padding: 2px 4px;\r\n border-radius: 3px;\r\n }\r\n\r\n .whatsapp-inline-code {\r\n font-family: monospace;\r\n background-color: #f5f5f5;\r\n padding: 2px 4px;\r\n border-radius: 3px;\r\n }\r\n\r\n .whatsapp-quote {\r\n border-left: 4px solid #ccc;\r\n padding-left: 10px;\r\n margin-left: 5px;\r\n color: #555;\r\n }\r\n\r\n .whatsapp-list {\r\n padding-left: 20px;\r\n margin: 0;\r\n }\r\n\r\n .whatsapp-bullet,\r\n .whatsapp-numbered {\r\n list-style-type: none;\r\n }\r\n `;\r\n document.head.appendChild(this.styleElement);\r\n }\r\n }\r\n\r\n transform(value: string): string {\r\n if (!value) {\r\n return value;\r\n }\r\n\r\n // Bold text starting and ending with *\r\n value = value.replace(\r\n /\\*(\\S(?:.*?\\S)?)\\*/g,\r\n '<span class=\"whatsapp-bold\">$1</span>'\r\n );\r\n\r\n // Italic text: _text_ (but not inside emails or words)\r\n value = value.replace(\r\n /(^|[\\s>])_(?!_)([^_]+?)_(?=[\\s<]|$)/g,\r\n '$1<span class=\"whatsapp-italic\">$2</span>'\r\n );\r\n\r\n\r\n // Strike-through text starting and ending with ~\r\n value = value.replace(\r\n /~(\\S(?:.*?\\S)?)~/g,\r\n '<span class=\"whatsapp-strike\">$1</span>'\r\n );\r\n\r\n // // Monospace with ``` (triple backticks)\r\n // value = value.replace(\r\n // /```(.+?)```/gs,\r\n // '<span class=\"whatsapp-monospace\">$1</span>'\r\n // );\r\n\r\n // Inline code with ` (single backtick)\r\n value = value.replace(\r\n /`(\\S(?:.*?\\S)?)`/g,\r\n '<span class=\"whatsapp-inline-code\">$1</span>'\r\n );\r\n\r\n // Quote with >\r\n value = value.replace(\r\n /^> (.+)$/gm,\r\n '<blockquote class=\"whatsapp-quote\">$1</blockquote>'\r\n );\r\n\r\n // ✅ Parse URLs, including plain domains like google.com\r\n value = value.replace(\r\n /\\b((https?:\\/\\/)?(www\\.)?[a-zA-Z0-9-]+\\.[a-zA-Z]{2,}([^\\s<]*)?)/gi,\r\n (match, p1) => {\r\n let url = match;\r\n if (!/^https?:\\/\\//i.test(match)) {\r\n url = `https://${match}`;\r\n }\r\n return `<a href=\"${url}\" target=\"_blank\" rel=\"noopener noreferrer\">${match}</a>`;\r\n }\r\n );\r\n\r\n // // Bullet list (using * or -)\r\n // value = value.replace(\r\n // /(^|\\n)([*-]) (.+)/g,\r\n // '$1<li class=\"whatsapp-bullet\">$3</li>'\r\n // );\r\n // value = value.replace(\r\n // /(<li(.+)<\\/li>)/g,\r\n // '<ul class=\"whatsapp-list\">$1</ul>'\r\n // );\r\n\r\n // // Numbered list\r\n // value = value.replace(\r\n // /(^|\\n)(\\d+)\\. (.+)/g,\r\n // '$1<li class=\"whatsapp-numbered\">$2. $3</li>'\r\n // );\r\n // value = value.replace(\r\n // /(<li(.+)<\\/li>)/g,\r\n // '<ol class=\"whatsapp-list\">$1</ol>'\r\n // );\r\n\r\n return value;\r\n }\r\n\r\n}\r\n","/*\r\n * Public API Surface of ng-whatsapp-format\r\n */\r\n\r\nexport * from './lib/ng.whatsapp-format.pipe'\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MAMa,oBAAoB,CAAA;IAErB,YAAY,GAA4B,IAAI;AAEpD,IAAA,WAAA,GAAA;QACI,IAAI,CAAC,YAAY,EAAE;;IAGf,YAAY,GAAA;QAChB,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACvD,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AACnD,YAAA,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA2C7B;YACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;;;AAIpD,IAAA,SAAS,CAAC,KAAa,EAAA;QACnB,IAAI,CAAC,KAAK,EAAE;AACR,YAAA,OAAO,KAAK;;;QAIhB,KAAK,GAAG,KAAK,CAAC,OAAO,CACjB,qBAAqB,EACrB,uCAAuC,CAC1C;;QAGD,KAAK,GAAG,KAAK,CAAC,OAAO,CACjB,sCAAsC,EACtC,2CAA2C,CAC9C;;QAID,KAAK,GAAG,KAAK,CAAC,OAAO,CACjB,mBAAmB,EACnB,yCAAyC,CAC5C;;;;;;;QASD,KAAK,GAAG,KAAK,CAAC,OAAO,CACjB,mBAAmB,EACnB,8CAA8C,CACjD;;QAGD,KAAK,GAAG,KAAK,CAAC,OAAO,CACjB,YAAY,EACZ,oDAAoD,CACvD;;AAGD,QAAA,KAAK,GAAG,KAAK,CAAC,OAAO,CACjB,mEAAmE,EACnE,CAAC,KAAK,EAAE,EAAE,KAAI;YACV,IAAI,GAAG,GAAG,KAAK;YACf,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AAC9B,gBAAA,GAAG,GAAG,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE;;AAE5B,YAAA,OAAO,CAAY,SAAA,EAAA,GAAG,CAA+C,4CAAA,EAAA,KAAK,MAAM;AACpF,SAAC,CACJ;;;;;;;;;;;;;;;;;;;AAsBD,QAAA,OAAO,KAAK;;wGArIP,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,kBAAA,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,kBAAkB;AACxB,oBAAA,UAAU,EAAE,IAAI;AACnB,iBAAA;;;ACLD;;AAEG;;ACFH;;AAEG;;;;"}