@paroicms/public-server-lib 0.34.0 → 0.35.0

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.
@@ -0,0 +1,8 @@
1
+ export declare function escapeHtml(text: string | undefined, options?: {
2
+ newLinesToBr?: boolean;
3
+ }): string;
4
+ export declare function htmlToRawText(html: string): string;
5
+ export declare function stripHtmlTags(html: string, { blockSeparator }?: {
6
+ blockSeparator?: string;
7
+ }): string;
8
+ export declare function makeStylesheetLinkAsyncTag(href: string): string;
@@ -0,0 +1,48 @@
1
+ import { decodeHtmlEntities, insertBlockSeparators, newLinesToBr, replaceLinks, } from "./internal/internal-html-utils.js";
2
+ /**
3
+ * @see https://stackoverflow.com/a/430240/3786294
4
+ */
5
+ const tagBody = "(?:[^\"'>]|\"[^\"]*\"|'[^']*')*";
6
+ const tagOrComment = new RegExp(`<(?:!--(?:(?:-*[^->])*--+|-?)|script\\b${tagBody}>[\\s\\S]*?</script\\s*|style\\b${tagBody}>[\\s\\S]*?</style\\s*|/?[a-z]${tagBody})>`, "gi");
7
+ /**
8
+ * @see https://stackoverflow.com/a/4835406/3786294
9
+ */
10
+ const htmlEntities = {
11
+ "&": "&amp;",
12
+ "<": "&lt;",
13
+ ">": "&gt;",
14
+ '"': "&quot;",
15
+ "'": "&#039;",
16
+ };
17
+ export function escapeHtml(text, options = {}) {
18
+ if (!text)
19
+ return "";
20
+ let val = text;
21
+ val = val.replace(/[&<>"']/g, (m) => htmlEntities[m]);
22
+ if (options.newLinesToBr) {
23
+ val = newLinesToBr(val);
24
+ }
25
+ return val;
26
+ }
27
+ export function htmlToRawText(html) {
28
+ return stripHtmlTags(replaceLinks(html));
29
+ }
30
+ export function stripHtmlTags(html, { blockSeparator } = {}) {
31
+ let val = blockSeparator ? insertBlockSeparators(html, blockSeparator) : html;
32
+ val = val.replace(/<br\s*\/?>/gi, "\n");
33
+ let prev;
34
+ do {
35
+ prev = val;
36
+ val = val.replace(tagOrComment, "");
37
+ } while (val !== prev);
38
+ if (blockSeparator && val.endsWith(blockSeparator)) {
39
+ val = val.slice(0, -blockSeparator.length);
40
+ }
41
+ return decodeHtmlEntities(val);
42
+ }
43
+ export function makeStylesheetLinkAsyncTag(href) {
44
+ const escHref = escapeHtml(href);
45
+ return `<link rel="preload" href="${escHref}" as="style" onload="this.onload=null;this.rel='stylesheet'">
46
+ <noscript><link rel="stylesheet" href="${escHref}"></noscript>`;
47
+ }
48
+ //# sourceMappingURL=html-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-helpers.js","sourceRoot":"","sources":["../src/html-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,EACZ,YAAY,GACb,MAAM,mCAAmC,CAAC;AAE3C;;GAEG;AACH,MAAM,OAAO,GAAG,iCAAiC,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,MAAM,CAC7B,0CAA0C,OAAO,mCAAmC,OAAO,iCAAiC,OAAO,IAAI,EACvI,IAAI,CACL,CAAC;AAEF;;GAEG;AACH,MAAM,YAAY,GAA+B;IAC/C,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,QAAQ;CACd,CAAC;AAEF,MAAM,UAAU,UAAU,CACxB,IAAwB,EACxB,UAAsC,EAAE;IAExC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,EAAE,cAAc,KAAkC,EAAE;IAC9F,IAAI,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,IAAY,CAAC;IACjB,GAAG,CAAC;QACF,IAAI,GAAG,GAAG,CAAC;QACX,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,QAAQ,GAAG,KAAK,IAAI,EAAE;IACvB,IAAI,cAAc,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACnD,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,6BAA6B,OAAO;yCACJ,OAAO,eAAe,CAAC;AAChE,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export type * from "../types/backend-plugin-types.d.ts";
2
2
  export * from "./api-error-handler.js";
3
3
  export * from "./esm-module.helper.js";
4
- export * from "./html-helpers/html-helpers.js";
4
+ export * from "./html-helpers.js";
5
5
  export * from "./obfuscate.helper.js";
6
6
  export * from "./server-image-cache-engine.helper.js";
7
7
  export * from "./simple-i18n.js";
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export * from "./api-error-handler.js";
2
2
  export * from "./esm-module.helper.js";
3
- export * from "./html-helpers/html-helpers.js";
3
+ export * from "./html-helpers.js";
4
4
  export * from "./obfuscate.helper.js";
5
5
  export * from "./server-image-cache-engine.helper.js";
6
6
  export * from "./simple-i18n.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function newLinesToBr(text: string): string;
2
+ export declare function decodeHtmlEntities(str: string): string;
3
+ export declare function replaceLinks(html: string): string;
4
+ export declare function insertBlockSeparators(html: string, sep: string): string;
@@ -0,0 +1,35 @@
1
+ const entities = {
2
+ "&lt;": "<",
3
+ "&#60;": "<",
4
+ "&#x3C;": "<",
5
+ "&gt;": ">",
6
+ "&#62;": ">",
7
+ "&#x3E;": ">",
8
+ "&#47;": "/",
9
+ "&#x2F;": "/",
10
+ "&apos;": "'",
11
+ "&#39;": "'",
12
+ "&#x27;": "'",
13
+ "&quot;": '"',
14
+ "&#34;": '"',
15
+ "&#x22;": '"',
16
+ "&amp;": "&",
17
+ "&#38;": "&",
18
+ "&#x26;": "&",
19
+ };
20
+ export function newLinesToBr(text) {
21
+ return text.replace(/(?:\r\n|\r|\n)/g, "<br>\n");
22
+ }
23
+ export function decodeHtmlEntities(str) {
24
+ return str.replace(/&lt;|&#60;|&#x3C;|&gt;|&#62;|&#x3E;|&#47;|&#x2F;|&apos;|&#39;|&#x27;|&quot;|&#34;|&#x22;|&amp;|&#38;|&#x26;/g, (match) => entities[match]);
25
+ }
26
+ export function replaceLinks(html) {
27
+ return html.replace(/<a\s+[^>]*href="([^"]*)"[^>]*>([^<]*)<\/a>/gi, (_, url, label) => {
28
+ return `${label.trim()} ( ${url} )`;
29
+ });
30
+ }
31
+ export function insertBlockSeparators(html, sep) {
32
+ const regex = /(\w)(<\/(?:address|article|aside|blockquote|canvas|dd|div|dl|dt|fieldset|figcaption|figure|footer|form|h[1-6]|header|hr|li|main|nav|noscript|ol|p|pre|section|table|tfoot|ul|video)>)/g;
33
+ return html.replace(regex, (_, p1, p2) => `${p1}${sep}${p2}`);
34
+ }
35
+ //# sourceMappingURL=internal-html-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-html-utils.js","sourceRoot":"","sources":["../../src/internal/internal-html-utils.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAiC;IAC7C,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,GAAG,CAAC,OAAO,CAChB,8GAA8G,EAC9G,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,8CAA8C,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACpF,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,GAAW;IAC7D,MAAM,KAAK,GACT,wLAAwL,CAAC;IAC3L,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;AAChE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { escapeHtml } from "./html-helpers/html-helpers.js";
1
+ import { escapeHtml } from "./html-helpers.js";
2
2
  export function generateObfuscatedHtml(inputString) {
3
3
  const jsString = JSON.stringify(btoa(inputString));
4
4
  return `<script>document.write(atob(${jsString}))</script>`;
@@ -1 +1 @@
1
- {"version":3,"file":"obfuscate.helper.js","sourceRoot":"","sources":["../src/obfuscate.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACnD,OAAO,+BAA+B,QAAQ,aAAa,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,YAAoB;IACtD,OAAO,sBAAsB,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACnD,OAAO,YAAY,UAAU,CAAC,UAAU,CAAC,KAAK,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC;AAC9E,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB;IAC7C,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,SAAS,EAAE,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"obfuscate.helper.js","sourceRoot":"","sources":["../src/obfuscate.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACnD,OAAO,+BAA+B,QAAQ,aAAa,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,YAAoB;IACtD,OAAO,sBAAsB,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACnD,OAAO,YAAY,UAAU,CAAC,UAAU,CAAC,KAAK,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC;AAC9E,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB;IAC7C,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,SAAS,EAAE,CAAC;AACzD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paroicms/public-server-lib",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "description": "Common utilitaries for paroicms plugins (backend side).",
5
5
  "author": "Paroi Team",
6
6
  "repository": {
@@ -21,15 +21,14 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "@paroi/data-formatters-lib": "~0.4.0",
24
- "@paroicms/internal-anywhere-lib": "1.29.0",
25
- "@paroicms/public-anywhere-lib": "0.23.0",
26
- "@types/express": "~4.17.21"
24
+ "@paroicms/internal-anywhere-lib": "1.29.1",
25
+ "@paroicms/public-anywhere-lib": "0.23.1"
27
26
  },
28
27
  "devDependencies": {
29
- "@types/node": "~22.14.1",
28
+ "@types/node": "~24.0.1",
30
29
  "rimraf": "~6.0.1",
31
30
  "typescript": "~5.8.3",
32
- "vitest": "~3.1.1"
31
+ "vitest": "~3.2.3"
33
32
  },
34
33
  "files": [
35
34
  "dist",
@@ -91,15 +91,32 @@ export interface BackendPluginInitService {
91
91
  handler: PluginLiquidFilterHandler,
92
92
  options?: { raw?: boolean },
93
93
  ): void;
94
+ registerLiquidTag(
95
+ tagName: string,
96
+ tagKind: "assignToVar",
97
+ handler: PluginLiquidTagReturnsVarHandler,
98
+ ): void;
99
+ registerLiquidTag(
100
+ tagName: string,
101
+ tagKind: "injectHtml",
102
+ handler: PluginLiquidTagReturnsHtmlHandler,
103
+ ): void;
94
104
  registerFieldPreprocessor(handler: FieldPreprocessor): void;
95
105
  registerHook(hookName: string, handler: BackendHookHandler, options?: { unique?: boolean }): void;
96
106
  setPublicApiHandler(handler: PublicApiHandler): void;
107
+ /** @deprecated */
97
108
  addHeadTag(...htmlTags: string[]): void;
109
+ registerHeadTags(handler: HeadTagsHandler): void;
98
110
  registeredSite: RegisteredSite;
99
111
  configuration: PluginConfiguration;
100
112
  pluginAssetsUrl: string;
101
113
  }
102
114
 
115
+ export type HeadTagsHandler = (options: { state: ReadonlyMap<string, unknown>; html: string }) =>
116
+ | string[]
117
+ | string
118
+ | undefined;
119
+
103
120
  export type BackendHookHandler = (
104
121
  service: BackendPluginService,
105
122
  params: any,
@@ -117,6 +134,16 @@ export type PluginLiquidFilterHandler = (
117
134
  },
118
135
  ) => string | Promise<string>;
119
136
 
137
+ export type PluginLiquidTagReturnsVarHandler = (
138
+ service: PluginRenderingService,
139
+ parameters: { [key: string]: unknown },
140
+ ) => Generator;
141
+
142
+ export type PluginLiquidTagReturnsHtmlHandler = (
143
+ service: PluginRenderingService,
144
+ parameters: { [key: string]: unknown },
145
+ ) => string | Promise<string>;
146
+
120
147
  export type FieldPreprocessor = (
121
148
  service: PluginRenderingService,
122
149
  value: ReadFieldValue,
@@ -181,6 +208,8 @@ export interface NewSiteOptions {
181
208
  export interface PluginRenderingService {
182
209
  pluginService: BackendPluginService;
183
210
  language: string;
211
+ homeUrl: string;
212
+ setRenderState(key: string, value: any): void;
184
213
  renderChildPartials(
185
214
  ctx: PaHttpContext,
186
215
  options: {
@@ -244,7 +273,7 @@ export interface PluginConfigurations {
244
273
  export interface PluginConfiguration {
245
274
  [key: string]: unknown;
246
275
  backOffice?: Obj;
247
- googleRecaptchaKey?: string;
276
+ googleRecaptchaSiteKey?: string;
248
277
  }
249
278
 
250
279
  export interface MailData {
@@ -1,14 +0,0 @@
1
- /**
2
- * @see https://stackoverflow.com/a/4835406/3786294
3
- */
4
- export declare function escapeHtml(text: string | undefined, options?: {
5
- newLinesToBr?: boolean;
6
- }): string;
7
- export declare function decodeHtmlEntities(str: string): string;
8
- export declare function newLinesToBr(text: string): string;
9
- export declare function htmlToText(html: string): string;
10
- export declare function stripHtmlTags(html: string, { blockSeparator }?: {
11
- blockSeparator?: string;
12
- }): string;
13
- export declare function insertBlockSeparators(html: string, sep: string): string;
14
- export declare function replaceLinks(html: string): string;
@@ -1,76 +0,0 @@
1
- /**
2
- * @see https://stackoverflow.com/a/4835406/3786294
3
- */
4
- const htmlEntities = {
5
- "&": "&amp;",
6
- "<": "&lt;",
7
- ">": "&gt;",
8
- '"': "&quot;",
9
- "'": "&#039;",
10
- };
11
- export function escapeHtml(text, options = {}) {
12
- if (!text)
13
- return "";
14
- let val = text;
15
- val = val.replace(/[&<>"']/g, (m) => htmlEntities[m]);
16
- if (options.newLinesToBr) {
17
- val = newLinesToBr(val);
18
- }
19
- return val;
20
- }
21
- export function decodeHtmlEntities(str) {
22
- const entities = {
23
- "&lt;": "<",
24
- "&#60;": "<",
25
- "&#x3C;": "<",
26
- "&gt;": ">",
27
- "&#62;": ">",
28
- "&#x3E;": ">",
29
- "&#47;": "/",
30
- "&#x2F;": "/",
31
- "&apos;": "'",
32
- "&#39;": "'",
33
- "&#x27;": "'",
34
- "&quot;": '"',
35
- "&#34;": '"',
36
- "&#x22;": '"',
37
- "&amp;": "&",
38
- "&#38;": "&",
39
- "&#x26;": "&",
40
- };
41
- return str.replace(/&lt;|&#60;|&#x3C;|&gt;|&#62;|&#x3E;|&#47;|&#x2F;|&apos;|&#39;|&#x27;|&quot;|&#34;|&#x22;|&amp;|&#38;|&#x26;/g, (match) => entities[match]);
42
- }
43
- export function newLinesToBr(text) {
44
- return text.replace(/(?:\r\n|\r|\n)/g, "<br>\n");
45
- }
46
- export function htmlToText(html) {
47
- return stripHtmlTags(replaceLinks(html));
48
- }
49
- /**
50
- * Thanks to https://stackoverflow.com/a/430240/3786294
51
- */
52
- const tagBody = "(?:[^\"'>]|\"[^\"]*\"|'[^']*')*";
53
- const tagOrComment = new RegExp(`<(?:!--(?:(?:-*[^->])*--+|-?)|script\\b${tagBody}>[\\s\\S]*?</script\\s*|style\\b${tagBody}>[\\s\\S]*?</style\\s*|/?[a-z]${tagBody})>`, "gi");
54
- export function stripHtmlTags(html, { blockSeparator } = {}) {
55
- let val = blockSeparator ? insertBlockSeparators(html, blockSeparator) : html;
56
- val = val.replace(/<br\s*\/?>/gi, "\n");
57
- let prev;
58
- do {
59
- prev = val;
60
- val = val.replace(tagOrComment, "");
61
- } while (val !== prev);
62
- if (blockSeparator && val.endsWith(blockSeparator)) {
63
- val = val.slice(0, -blockSeparator.length);
64
- }
65
- return decodeHtmlEntities(val);
66
- }
67
- export function insertBlockSeparators(html, sep) {
68
- const regex = /(\w)(<\/(?:address|article|aside|blockquote|canvas|dd|div|dl|dt|fieldset|figcaption|figure|footer|form|h[1-6]|header|hr|li|main|nav|noscript|ol|p|pre|section|table|tfoot|ul|video)>)/g;
69
- return html.replace(regex, (_, p1, p2) => `${p1}${sep}${p2}`);
70
- }
71
- export function replaceLinks(html) {
72
- return html.replace(/<a\s+[^>]*href="([^"]*)"[^>]*>([^<]*)<\/a>/gi, (_, url, label) => {
73
- return `${label.trim()} ( ${url} )`;
74
- });
75
- }
76
- //# sourceMappingURL=html-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"html-helpers.js","sourceRoot":"","sources":["../../src/html-helpers/html-helpers.ts"],"names":[],"mappings":"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"}