{"version":3,"file":"ufm.context-DyzZEcCd.js","sources":["../../../src/packages/ufm/plugins/marked-ufm.plugin.ts","../../../src/packages/ufm/contexts/ufm.context.ts"],"sourcesContent":["import type { MarkedExtension, Tokens } from '@umbraco-cms/backoffice/external/marked';\r\n\r\nexport interface UfmPlugin {\r\n\talias: string;\r\n\tmarker?: string;\r\n\trender?: (token: UfmToken) => string | undefined;\r\n}\r\n\r\nexport interface UfmToken extends Tokens.Generic {\r\n\tprefix: string;\r\n\ttext?: string;\r\n}\r\n\r\n/**\r\n *\r\n * @param {Array} plugins - An array of UFM plugins.\r\n * @returns {MarkedExtension} A Marked extension object.\r\n */\r\nexport function ufm(plugins: Array = []): MarkedExtension {\r\n\treturn {\r\n\t\textensions: plugins.map(({ alias, marker, render }) => {\r\n\t\t\tconst prefix = `(${alias}:${marker ? `|${marker}` : ''})`;\r\n\t\t\treturn {\r\n\t\t\t\tname: alias,\r\n\t\t\t\tlevel: 'inline',\r\n\t\t\t\tstart: (src: string) => src.search(`{${prefix}`),\r\n\t\t\t\ttokenizer: (src: string) => {\r\n\t\t\t\t\tconst pattern = `^\\\\{${prefix}([^}]*)\\\\}`;\r\n\t\t\t\t\tconst regex = new RegExp(pattern);\r\n\t\t\t\t\tconst match = src.match(regex);\r\n\r\n\t\t\t\t\tif (match) {\r\n\t\t\t\t\t\tconst [raw, prefix, content = ''] = match;\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\ttype: alias,\r\n\t\t\t\t\t\t\traw: raw,\r\n\t\t\t\t\t\t\ttokens: [],\r\n\t\t\t\t\t\t\tprefix: prefix,\r\n\t\t\t\t\t\t\ttext: content.trim(),\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn undefined;\r\n\t\t\t\t},\r\n\t\t\t\trenderer: render,\r\n\t\t\t};\r\n\t\t}),\r\n\t};\r\n}\r\n","import { ufm } from '../plugins/marked-ufm.plugin.js';\r\nimport type { UfmPlugin } from '../plugins/marked-ufm.plugin.js';\r\nimport type { ManifestUfmComponent } from '../ufm-component.extension.js';\r\nimport type { ManifestUfmFilter } from '../ufm-filter.extension.js';\r\nimport { DOMPurify, type Config } from '@umbraco-cms/backoffice/external/dompurify';\r\nimport { Marked } from '@umbraco-cms/backoffice/external/marked';\r\nimport { UmbArrayState } from '@umbraco-cms/backoffice/observable-api';\r\nimport { UmbContextBase } from '@umbraco-cms/backoffice/class-api';\r\nimport { UmbContextToken } from '@umbraco-cms/backoffice/context-api';\r\nimport { UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api';\r\nimport { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport type { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api';\r\n\r\nconst UmbDomPurify = DOMPurify(window);\r\nconst UmbDomPurifyConfig: Config = {\r\n\tUSE_PROFILES: { html: true },\r\n\tCUSTOM_ELEMENT_HANDLING: {\r\n\t\ttagNameCheck: /^(?:ufm|umb|uui)-.*$/,\r\n\t\tattributeNameCheck: /.+/,\r\n\t\tallowCustomizedBuiltInElements: false,\r\n\t},\r\n};\r\n\r\nUmbDomPurify.addHook('afterSanitizeAttributes', function (node) {\r\n\t// set all elements owning target to target=_blank\r\n\tif ('target' in node && node instanceof HTMLElement) {\r\n\t\tnode.setAttribute('target', '_blank');\r\n\t}\r\n});\r\n\r\nexport const UmbMarked = new Marked({\r\n\tasync: true,\r\n\tgfm: true,\r\n\tbreaks: true,\r\n\thooks: {\r\n\t\tpostprocess: (markup) => {\r\n\t\t\treturn UmbDomPurify.sanitize(markup, UmbDomPurifyConfig) as string;\r\n\t\t},\r\n\t},\r\n});\r\n\r\ntype UmbUfmFilterType = {\r\n\talias: string;\r\n\tfilter: ((...args: Array) => string | undefined | null) | undefined;\r\n};\r\n\r\nexport class UmbUfmContext extends UmbContextBase {\r\n\t#filters = new UmbArrayState([], (x) => x.alias);\r\n\tpublic readonly filters = this.#filters.asObservable();\r\n\r\n\tconstructor(host: UmbControllerHost) {\r\n\t\tsuper(host, UMB_UFM_CONTEXT);\r\n\r\n\t\tnew UmbExtensionsApiInitializer(this, umbExtensionsRegistry, 'ufmComponent', [], undefined, (controllers) => {\r\n\t\t\tUmbMarked.use(\r\n\t\t\t\tufm(\r\n\t\t\t\t\tcontrollers\r\n\t\t\t\t\t\t.map((controller) => {\r\n\t\t\t\t\t\t\tconst ctrl = controller as unknown as UmbExtensionApiInitializer;\r\n\t\t\t\t\t\t\tif (!ctrl.manifest || !ctrl.api) return;\r\n\t\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\t\talias: ctrl.manifest.meta.alias || ctrl.manifest.alias,\r\n\t\t\t\t\t\t\t\tmarker: ctrl.manifest.meta.marker,\r\n\t\t\t\t\t\t\t\trender: ctrl.api.render,\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.filter((x) => x) as Array,\r\n\t\t\t\t),\r\n\t\t\t);\r\n\t\t});\r\n\r\n\t\tnew UmbExtensionsApiInitializer(this, umbExtensionsRegistry, 'ufmFilter', [], undefined, (controllers) => {\r\n\t\t\tconst filters = controllers\r\n\t\t\t\t.map((controller) => {\r\n\t\t\t\t\tconst ctrl = controller as unknown as UmbExtensionApiInitializer;\r\n\t\t\t\t\tif (!ctrl.manifest || !ctrl.api) return null;\r\n\t\t\t\t\treturn { alias: ctrl.manifest.meta.alias, filter: ctrl.api.filter };\r\n\t\t\t\t})\r\n\t\t\t\t.filter((x) => x) as Array;\r\n\r\n\t\t\tthis.#filters.setValue(filters);\r\n\t\t});\r\n\t}\r\n\r\n\tpublic getFilterByAlias(alias: string) {\r\n\t\treturn this.#filters.getValue().find((x) => x.alias === alias)?.filter;\r\n\t}\r\n\r\n\tpublic async parse(markdown: string, inline: boolean) {\r\n\t\treturn !inline ? await UmbMarked.parse(markdown) : await UmbMarked.parseInline(markdown);\r\n\t}\r\n}\r\n\r\nexport const UMB_UFM_CONTEXT = new UmbContextToken('UmbUfmContext');\r\n\r\nexport { UmbUfmContext as api };\r\n"],"names":["ufm","plugins","alias","marker","render","prefix","src","pattern","regex","match","raw","content","UmbDomPurify","DOMPurify","UmbDomPurifyConfig","node","UmbMarked","Marked","markup","UmbUfmContext","UmbContextBase","host","UMB_UFM_CONTEXT","#filters","UmbArrayState","x","UmbExtensionsApiInitializer","umbExtensionsRegistry","controllers","controller","ctrl","filters","markdown","inline","UmbContextToken"],"mappings":"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"}