152 lines
4.6 KiB
JavaScript
152 lines
4.6 KiB
JavaScript
/*!
|
|
* Bootstrap template-factory.js v5.3.2 (https://getbootstrap.com/)
|
|
* Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
*/
|
|
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/selector-engine.js'), require('./config.js'), require('./sanitizer.js'), require('./index.js')) :
|
|
typeof define === 'function' && define.amd ? define(['../dom/selector-engine', './config', './sanitizer', './index'], factory) :
|
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.TemplateFactory = factory(global.SelectorEngine, global.Config, global.Sanitizer, global.Index));
|
|
})(this, (function (SelectorEngine, Config, sanitizer_js, index_js) { 'use strict';
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Bootstrap util/template-factory.js
|
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
* --------------------------------------------------------------------------
|
|
*/
|
|
|
|
|
|
/**
|
|
* Constants
|
|
*/
|
|
|
|
const NAME = 'TemplateFactory';
|
|
const Default = {
|
|
allowList: sanitizer_js.DefaultAllowlist,
|
|
content: {},
|
|
// { selector : text , selector2 : text2 , }
|
|
extraClass: '',
|
|
html: false,
|
|
sanitize: true,
|
|
sanitizeFn: null,
|
|
template: '<div></div>'
|
|
};
|
|
const DefaultType = {
|
|
allowList: 'object',
|
|
content: 'object',
|
|
extraClass: '(string|function)',
|
|
html: 'boolean',
|
|
sanitize: 'boolean',
|
|
sanitizeFn: '(null|function)',
|
|
template: 'string'
|
|
};
|
|
const DefaultContentType = {
|
|
entry: '(string|element|function|null)',
|
|
selector: '(string|element)'
|
|
};
|
|
|
|
/**
|
|
* Class definition
|
|
*/
|
|
|
|
class TemplateFactory extends Config {
|
|
constructor(config) {
|
|
super();
|
|
this._config = this._getConfig(config);
|
|
}
|
|
|
|
// Getters
|
|
static get Default() {
|
|
return Default;
|
|
}
|
|
static get DefaultType() {
|
|
return DefaultType;
|
|
}
|
|
static get NAME() {
|
|
return NAME;
|
|
}
|
|
|
|
// Public
|
|
getContent() {
|
|
return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);
|
|
}
|
|
hasContent() {
|
|
return this.getContent().length > 0;
|
|
}
|
|
changeContent(content) {
|
|
this._checkContent(content);
|
|
this._config.content = {
|
|
...this._config.content,
|
|
...content
|
|
};
|
|
return this;
|
|
}
|
|
toHtml() {
|
|
const templateWrapper = document.createElement('div');
|
|
templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
|
|
for (const [selector, text] of Object.entries(this._config.content)) {
|
|
this._setContent(templateWrapper, text, selector);
|
|
}
|
|
const template = templateWrapper.children[0];
|
|
const extraClass = this._resolvePossibleFunction(this._config.extraClass);
|
|
if (extraClass) {
|
|
template.classList.add(...extraClass.split(' '));
|
|
}
|
|
return template;
|
|
}
|
|
|
|
// Private
|
|
_typeCheckConfig(config) {
|
|
super._typeCheckConfig(config);
|
|
this._checkContent(config.content);
|
|
}
|
|
_checkContent(arg) {
|
|
for (const [selector, content] of Object.entries(arg)) {
|
|
super._typeCheckConfig({
|
|
selector,
|
|
entry: content
|
|
}, DefaultContentType);
|
|
}
|
|
}
|
|
_setContent(template, content, selector) {
|
|
const templateElement = SelectorEngine.findOne(selector, template);
|
|
if (!templateElement) {
|
|
return;
|
|
}
|
|
content = this._resolvePossibleFunction(content);
|
|
if (!content) {
|
|
templateElement.remove();
|
|
return;
|
|
}
|
|
if (index_js.isElement(content)) {
|
|
this._putElementInTemplate(index_js.getElement(content), templateElement);
|
|
return;
|
|
}
|
|
if (this._config.html) {
|
|
templateElement.innerHTML = this._maybeSanitize(content);
|
|
return;
|
|
}
|
|
templateElement.textContent = content;
|
|
}
|
|
_maybeSanitize(arg) {
|
|
return this._config.sanitize ? sanitizer_js.sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
|
|
}
|
|
_resolvePossibleFunction(arg) {
|
|
return index_js.execute(arg, [this]);
|
|
}
|
|
_putElementInTemplate(element, templateElement) {
|
|
if (this._config.html) {
|
|
templateElement.innerHTML = '';
|
|
templateElement.append(element);
|
|
return;
|
|
}
|
|
templateElement.textContent = element.textContent;
|
|
}
|
|
}
|
|
|
|
return TemplateFactory;
|
|
|
|
}));
|
|
//# sourceMappingURL=template-factory.js.map
|