UNPKG

3.02 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4exports.default = createElement;
5/**
6 * Create a DOM element from a CSS query with option to include content
7 *
8 * @author Laurent Blanes <laurent.blanes@gmail.com>
9 * @param {String} querySelector (optional) default to div
10 * @param {...*} [content] (optional) String|Number|DOMElement
11 * @return DOMElement
12 *
13 * @example
14 * - createElement(); // <div>
15 * - createElement('span#my-id.my-class.second-class'); // <span id="my-id" class="my-class second-class">
16 * - createElement('#my-id.my-class.second-class', 'text to insert', 12345); // <div id="my-id" class="my-class second-class">
17 * - const div = createElement('#my-div',
18 * 'Random text',
19 * createElement('p.paragraph', 'my text'),
20 * createElement('p.paragraph', 'my second text'),
21 * createElement('a.link[href=https://github.com/hekigan/create-element]', 'link to a site'),
22 * ); // <div id="my-id" class="my-class second-class">
23 * // Random text
24 * // <p class="paragraph">my text</p>
25 * // <p class="paragraph">my second text</p>
26 * // <a class="link" href="https://github.com/hekigan/create-element" class="paragraph">link to a site</a>
27 * // </div>
28 */
29function createElement() {
30 var querySelector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'div';
31
32 var nodeType = querySelector.match(/^[a-z]+/i);
33 var id = querySelector.match(/#([a-z]+[a-z0-9-]*)/gi);
34 var classes = querySelector.match(/\.([a-z]+[a-z0-9-]*)/gi);
35 var attributes = querySelector.match(/\[([a-z][a-z-]+)(=['|"]?([^\]]*)['|"]?)?\]/gi);
36 var node = nodeType ? nodeType[0] : 'div';
37
38 if (id && id.length > 1) {
39 throw CreateElementException('only 1 ID is allowed');
40 }
41
42 var elt = document.createElement(node);
43
44 if (id) {
45 elt.id = id[0].replace('#', '');
46 }
47
48 if (classes) {
49 var attrClasses = classes.join(' ').replace(/\./g, '');
50 elt.setAttribute('class', attrClasses);
51 }
52
53 if (attributes) {
54 attributes.forEach(function (item) {
55 item = item.slice(0, -1).slice(1);
56
57 var _item$split = item.split('='),
58 label = _item$split[0],
59 value = _item$split[1];
60
61 if (value) {
62 value = value.replace(/^['"](.*)['"]$/, '$1');
63 }
64 elt.setAttribute(label, value || '');
65 });
66 }
67
68 for (var _len = arguments.length, content = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
69 content[_key - 1] = arguments[_key];
70 }
71
72 content.forEach(function (item) {
73 if (typeof item === 'string' || typeof item === 'number') {
74 elt.appendChild(document.createTextNode(item));
75 } else if (item.nodeType === document.ELEMENT_NODE) {
76 elt.appendChild(item);
77 }
78 });
79
80 return elt;
81}
82
83function CreateElementException(message) {
84 this.message = message;
85 this.name = 'CreateElementException';
86}
87module.exports = exports['default'];
\No newline at end of file