@crunchya/element_builder
Version:
An HTMLElement builder for node.js
69 lines (62 loc) • 2.57 kB
text/typescript
class CustomHtmlElement {
name: string;
classes: Array<string>;
attributes: Array<{name: string, value: string}>;
children: Array<HTMLElement>;
content: {value: string, position: 'after' | 'before'};
private _element: any;
/**
* Create a new CustomHtmlElement.
*
* @param name The tag name of the Html element
* @param classes The classes to add to the element
* @param attributes The attributes to add to the element
* @param children The children of the element
* @param content The inner html content of the element (cannot coexist with children)
*/
constructor (name: string, classes: Array<string> = [], attributes: Array<{name: string, value: string}> = [{name: '', value: ''}], children: Array<HTMLElement> = new Array<HTMLElement>(), content:{value: string, position: 'before' | 'after'} = {value: '', position: 'after'}) {
this.name = name;
this.classes = classes;
this.attributes = attributes;
this.content = content;
this.children = children;
this._element = null;
}
/**
* Turns the CustomHtmlElement into a useable HTMLElement.
* You can access it via the CustomHtmlElement.getElement() function.
*
*/
webify() {
this._element = document.createElement(this.name);
this.classes?.forEach(cls => {
this._element.classList.add(cls);
});
this.attributes?.forEach(attribute => {
if(attribute.name != '') this._element.setAttribute(attribute.name, attribute.value);
});
this.children?.forEach(child => {
this._element.appendChild(child);
});
if(this.content.position == 'before') this._element.insertAdjacentHTML('afterbegin', this.content.value);
else if(this.content.position == 'after') this._element.insertAdjacentHTML('beforeend', this.content.value);
return this;
}
/**
* Clone the CustomHtmlElement.
* @returns A clone of the choosen CustomHtmlElement
*/
clone() {
return new CustomHtmlElement(this.name, this.classes, this.attributes, this.children, this.content);
}
/**
* Access the previously created HTMLElement or calls webify if it's not yet created.
*
* @returns The useable HTMLElement
*/
getElement() {
return this._element ?? this.webify().getElement();
}
}
export default { CustomHtmlElement };
export { CustomHtmlElement }