UNPKG

53.3 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('vue')) :
3 typeof define === 'function' && define.amd ? define(['exports', 'vue'], factory) :
4 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.BbobVue = {}, global.Vue));
5})(this, (function (exports, Vue) { 'use strict';
6
7 var TagNode$1 = {};
8
9 var char = {};
10
11 Object.defineProperty(char, "__esModule", {
12 value: true
13 });
14 var BACKSLASH_1 = char.BACKSLASH = char.PLACEHOLDER_SPACE = char.PLACEHOLDER_SPACE_TAB = SLASH_1 = char.SLASH = CLOSE_BRAKET_1 = char.CLOSE_BRAKET = OPEN_BRAKET_1 = char.OPEN_BRAKET = SPACE_1 = char.SPACE = QUOTEMARK_1 = char.QUOTEMARK = EQ_1 = char.EQ = TAB_1 = char.TAB = char.R = char.F = N_1 = char.N = void 0;
15 var N = '\n';
16 var TAB = '\t';
17 var F = '\f';
18 var R = '\r';
19 var EQ = '=';
20 var QUOTEMARK = '"';
21 var SPACE = ' ';
22 var OPEN_BRAKET = '[';
23 var CLOSE_BRAKET = ']';
24 var SLASH = '/';
25 var BACKSLASH = '\\';
26 var PLACEHOLDER_SPACE_TAB = ' ';
27 var PLACEHOLDER_SPACE = ' ';
28 var N_1 = char.N = N;
29 char.F = F;
30 char.R = R;
31 var TAB_1 = char.TAB = TAB;
32 var EQ_1 = char.EQ = EQ;
33 var QUOTEMARK_1 = char.QUOTEMARK = QUOTEMARK;
34 var SPACE_1 = char.SPACE = SPACE;
35 var OPEN_BRAKET_1 = char.OPEN_BRAKET = OPEN_BRAKET;
36 var CLOSE_BRAKET_1 = char.CLOSE_BRAKET = CLOSE_BRAKET;
37 var SLASH_1 = char.SLASH = SLASH;
38 char.PLACEHOLDER_SPACE_TAB = PLACEHOLDER_SPACE_TAB;
39 char.PLACEHOLDER_SPACE = PLACEHOLDER_SPACE;
40 BACKSLASH_1 = char.BACKSLASH = BACKSLASH;
41
42 var lib = {};
43
44 Object.defineProperty(lib, "__esModule", {
45 value: true
46 });
47 lib.isEOL = lib.isStringNode = isTagNode_1 = lib.isTagNode = lib.getUniqAttr = lib.getNodeLength = lib.escapeHTML = lib.appendToNode = lib.attrValue = lib.attrsToString = void 0;
48 var _char$1 = char;
49 function _arrayWithoutHoles$1(arr) {
50 if (Array.isArray(arr)) {
51 for(var i = 0, arr2 = new Array(arr.length); i < arr.length; i++){
52 arr2[i] = arr[i];
53 }
54 return arr2;
55 }
56 }
57 function _iterableToArray$1(iter) {
58 if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
59 }
60 function _nonIterableSpread$1() {
61 throw new TypeError("Invalid attempt to spread non-iterable instance");
62 }
63 function _toConsumableArray$1(arr) {
64 return _arrayWithoutHoles$1(arr) || _iterableToArray$1(arr) || _nonIterableSpread$1();
65 }
66 var _typeof$3 = function(obj) {
67 return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
68 };
69 var isTagNode$1 = function(el) {
70 return typeof el === 'object' && !!el.tag;
71 };
72 var isStringNode$1 = function(el) {
73 return typeof el === 'string';
74 };
75 var isEOL = function(el) {
76 return el === _char$1.N;
77 };
78 var keysReduce$1 = function(obj, reduce, def) {
79 return Object.keys(obj).reduce(reduce, def);
80 };
81 var getNodeLength = function(node) {
82 if (isTagNode$1(node)) {
83 return node.content.reduce(function(count, contentNode) {
84 return count + getNodeLength(contentNode);
85 }, 0);
86 }
87 if (isStringNode$1(node)) {
88 return node.length;
89 }
90 return 0;
91 };
92 /**
93 * Appends value to Tag Node
94 * @param {TagNode} node
95 * @param value
96 */ var appendToNode = function(node, value) {
97 node.content.push(value);
98 };
99 /**
100 * Replaces " to &qquot;
101 * @param {String} value
102 */ var escapeHTML$1 = function(value) {
103 return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;')// eslint-disable-next-line no-script-url
104 .replace(/(javascript):/gi, '$1%3A');
105 };
106 /**
107 * Acept name and value and return valid html5 attribute string
108 * @param {String} name
109 * @param {String} value
110 * @return {string}
111 */ var attrValue$1 = function(name, value) {
112 var type = typeof value === "undefined" ? "undefined" : _typeof$3(value);
113 var types = {
114 boolean: function() {
115 return value ? "".concat(name) : '';
116 },
117 number: function() {
118 return "".concat(name, "=\"").concat(value, "\"");
119 },
120 string: function() {
121 return "".concat(name, "=\"").concat(escapeHTML$1(value), "\"");
122 },
123 object: function() {
124 return "".concat(name, "=\"").concat(escapeHTML$1(JSON.stringify(value)), "\"");
125 }
126 };
127 return types[type] ? types[type]() : '';
128 };
129 /**
130 * Transforms attrs to html params string
131 * @param values
132 */ var attrsToString$1 = function(values) {
133 // To avoid some malformed attributes
134 if (values == null) {
135 return '';
136 }
137 return keysReduce$1(values, function(arr, key) {
138 return _toConsumableArray$1(arr).concat([
139 attrValue$1(key, values[key])
140 ]);
141 }, [
142 ''
143 ]).join(' ');
144 };
145 /**
146 * Gets value from
147 * @example
148 * getUniqAttr({ 'foo': true, 'bar': bar' }) => 'bar'
149 * @param attrs
150 * @returns {string}
151 */ var getUniqAttr = function(attrs) {
152 return keysReduce$1(attrs, function(res, key) {
153 return attrs[key] === key ? attrs[key] : null;
154 }, null);
155 };
156 lib.attrsToString = attrsToString$1;
157 lib.attrValue = attrValue$1;
158 lib.appendToNode = appendToNode;
159 lib.escapeHTML = escapeHTML$1;
160 lib.getNodeLength = getNodeLength;
161 lib.getUniqAttr = getUniqAttr;
162 var isTagNode_1 = lib.isTagNode = isTagNode$1;
163 lib.isStringNode = isStringNode$1;
164 lib.isEOL = isEOL;
165
166 Object.defineProperty(TagNode$1, "__esModule", {
167 value: true
168 });
169 var default_1 = TagNode$1.default = TagNode$1.TagNode = void 0;
170 var _char = char;
171 var _index = lib;
172 function _classCallCheck$1(instance, Constructor) {
173 if (!(instance instanceof Constructor)) {
174 throw new TypeError("Cannot call a class as a function");
175 }
176 }
177 function _defineProperties$1(target, props) {
178 for(var i = 0; i < props.length; i++){
179 var descriptor = props[i];
180 descriptor.enumerable = descriptor.enumerable || false;
181 descriptor.configurable = true;
182 if ("value" in descriptor) descriptor.writable = true;
183 Object.defineProperty(target, descriptor.key, descriptor);
184 }
185 }
186 function _createClass$1(Constructor, protoProps, staticProps) {
187 if (protoProps) _defineProperties$1(Constructor.prototype, protoProps);
188 if (staticProps) _defineProperties$1(Constructor, staticProps);
189 return Constructor;
190 }
191 function _defineProperty(obj, key, value) {
192 if (key in obj) {
193 Object.defineProperty(obj, key, {
194 value: value,
195 enumerable: true,
196 configurable: true,
197 writable: true
198 });
199 } else {
200 obj[key] = value;
201 }
202 return obj;
203 }
204 function _objectSpread(target) {
205 for(var i = 1; i < arguments.length; i++){
206 var source = arguments[i] != null ? arguments[i] : {
207 };
208 var ownKeys = Object.keys(source);
209 if (typeof Object.getOwnPropertySymbols === "function") {
210 ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
211 return Object.getOwnPropertyDescriptor(source, sym).enumerable;
212 }));
213 }
214 ownKeys.forEach(function(key) {
215 _defineProperty(target, key, source[key]);
216 });
217 }
218 return target;
219 }
220 var getTagAttrs = function(tag, params) {
221 var uniqAattr = (_index).getUniqAttr(params);
222 if (uniqAattr) {
223 var tagAttr = (_index).attrValue(tag, uniqAattr);
224 var attrs = _objectSpread({
225 }, params);
226 delete attrs[uniqAattr];
227 var attrsStr = (_index).attrsToString(attrs);
228 return "".concat(tagAttr).concat(attrsStr);
229 }
230 return "".concat(tag).concat((_index).attrsToString(params));
231 };
232 var TagNode = /*#__PURE__*/ function() {
233 function TagNode(tag, attrs, content) {
234 _classCallCheck$1(this, TagNode);
235 this.tag = tag;
236 this.attrs = attrs;
237 this.content = Array.isArray(content) ? content : [
238 content
239 ];
240 }
241 _createClass$1(TagNode, [
242 {
243 key: "attr",
244 value: function attr(name, value) {
245 if (typeof value !== 'undefined') {
246 this.attrs[name] = value;
247 }
248 return this.attrs[name];
249 }
250 },
251 {
252 key: "append",
253 value: function append(value) {
254 return (_index).appendToNode(this, value);
255 }
256 },
257 {
258 key: "length",
259 get: function get() {
260 return (_index).getNodeLength(this);
261 }
262 },
263 {
264 key: "toTagStart",
265 value: function toTagStart(param) {
266 var ref = param === void 0 ? {
267 } : param, _openTag = ref.openTag, openTag = _openTag === void 0 ? _char.OPEN_BRAKET : _openTag, _closeTag = ref.closeTag, closeTag = _closeTag === void 0 ? _char.CLOSE_BRAKET : _closeTag;
268 var tagAttrs = getTagAttrs(this.tag, this.attrs);
269 return "".concat(openTag).concat(tagAttrs).concat(closeTag);
270 }
271 },
272 {
273 key: "toTagEnd",
274 value: function toTagEnd(param) {
275 var ref = param === void 0 ? {
276 } : param, _openTag = ref.openTag, openTag = _openTag === void 0 ? _char.OPEN_BRAKET : _openTag, _closeTag = ref.closeTag, closeTag = _closeTag === void 0 ? _char.CLOSE_BRAKET : _closeTag;
277 return "".concat(openTag).concat(_char.SLASH).concat(this.tag).concat(closeTag);
278 }
279 },
280 {
281 key: "toTagNode",
282 value: function toTagNode() {
283 return new TagNode(this.tag.toLowerCase(), this.attrs, this.content);
284 }
285 },
286 {
287 key: "toString",
288 value: function toString(param) {
289 var ref = param === void 0 ? {
290 } : param, _openTag = ref.openTag, openTag = _openTag === void 0 ? _char.OPEN_BRAKET : _openTag, _closeTag = ref.closeTag, closeTag = _closeTag === void 0 ? _char.CLOSE_BRAKET : _closeTag;
291 var isEmpty = this.content.length === 0;
292 var content = this.content.reduce(function(r, node) {
293 return r + node.toString({
294 openTag: openTag,
295 closeTag: closeTag
296 });
297 }, '');
298 var tagStart = this.toTagStart({
299 openTag: openTag,
300 closeTag: closeTag
301 });
302 if (isEmpty) {
303 return tagStart;
304 }
305 return "".concat(tagStart).concat(content).concat(this.toTagEnd({
306 openTag: openTag,
307 closeTag: closeTag
308 }));
309 }
310 }
311 ]);
312 return TagNode;
313 }();
314 TagNode.create = function(tag, param, param1) {
315 var attrs = param === void 0 ? {
316 } : param, content = param1 === void 0 ? [] : param1;
317 return new TagNode(tag, attrs, content);
318 };
319 TagNode.isOf = function(node, type) {
320 return node.tag === type;
321 };
322 TagNode$1.TagNode = TagNode;
323 var _default = TagNode;
324 default_1 = TagNode$1.default = _default;
325
326 function _classCallCheck(instance, Constructor) {
327 if (!(instance instanceof Constructor)) {
328 throw new TypeError("Cannot call a class as a function");
329 }
330 }
331 function _defineProperties(target, props) {
332 for(var i = 0; i < props.length; i++){
333 var descriptor = props[i];
334 descriptor.enumerable = descriptor.enumerable || false;
335 descriptor.configurable = true;
336 if ("value" in descriptor) descriptor.writable = true;
337 Object.defineProperty(target, descriptor.key, descriptor);
338 }
339 }
340 function _createClass(Constructor, protoProps, staticProps) {
341 if (protoProps) _defineProperties(Constructor.prototype, protoProps);
342 if (staticProps) _defineProperties(Constructor, staticProps);
343 return Constructor;
344 }
345 // type, value, line, row,
346 var TOKEN_TYPE_ID = 'type'; // 0;
347 var TOKEN_VALUE_ID = 'value'; // 1;
348 var TOKEN_COLUMN_ID = 'row'; // 2;
349 var TOKEN_LINE_ID = 'line'; // 3;
350 var TOKEN_TYPE_WORD = 1; // 'word';
351 var TOKEN_TYPE_TAG = 2; // 'tag';
352 var TOKEN_TYPE_ATTR_NAME = 3; // 'attr-name';
353 var TOKEN_TYPE_ATTR_VALUE = 4; // 'attr-value';
354 var TOKEN_TYPE_SPACE = 5; // 'space';
355 var TOKEN_TYPE_NEW_LINE = 6; // 'new-line';
356 /**
357 * @param {Token} token
358 * @returns {string}
359 */ var getTokenValue = function(token) {
360 if (token && typeof token[TOKEN_VALUE_ID] !== 'undefined') {
361 return token[TOKEN_VALUE_ID];
362 }
363 return '';
364 };
365 /**
366 * @param {Token}token
367 * @returns {number}
368 */ var getTokenLine = function(token) {
369 return token && token[TOKEN_LINE_ID] || 0;
370 };
371 var getTokenColumn = function(token) {
372 return token && token[TOKEN_COLUMN_ID] || 0;
373 };
374 /**
375 * @param {Token} token
376 * @returns {boolean}
377 */ var isTextToken = function(token) {
378 if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {
379 return token[TOKEN_TYPE_ID] === TOKEN_TYPE_SPACE || token[TOKEN_TYPE_ID] === TOKEN_TYPE_NEW_LINE || token[TOKEN_TYPE_ID] === TOKEN_TYPE_WORD;
380 }
381 return false;
382 };
383 /**
384 * @param {Token} token
385 * @returns {boolean}
386 */ var isTagToken = function(token) {
387 if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {
388 return token[TOKEN_TYPE_ID] === TOKEN_TYPE_TAG;
389 }
390 return false;
391 };
392 var isTagEnd = function(token) {
393 return getTokenValue(token).charCodeAt(0) === SLASH_1.charCodeAt(0);
394 };
395 var isTagStart = function(token) {
396 return !isTagEnd(token);
397 };
398 var isAttrNameToken = function(token) {
399 if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {
400 return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_NAME;
401 }
402 return false;
403 };
404 /**
405 * @param {Token} token
406 * @returns {boolean}
407 */ var isAttrValueToken = function(token) {
408 if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {
409 return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_VALUE;
410 }
411 return false;
412 };
413 var getTagName = function(token) {
414 var value = getTokenValue(token);
415 return isTagEnd(token) ? value.slice(1) : value;
416 };
417 var convertTagToText = function(token) {
418 var text = OPEN_BRAKET_1;
419 text += getTokenValue(token);
420 text += CLOSE_BRAKET_1;
421 return text;
422 };
423 var Token = /*#__PURE__*/ function() {
424 function Token(type, value, line, row) {
425 _classCallCheck(this, Token);
426 this[TOKEN_TYPE_ID] = Number(type);
427 this[TOKEN_VALUE_ID] = String(value);
428 this[TOKEN_LINE_ID] = Number(line);
429 this[TOKEN_COLUMN_ID] = Number(row);
430 }
431 _createClass(Token, [
432 {
433 key: "isEmpty",
434 value: function isEmpty() {
435 // eslint-disable-next-line no-restricted-globals
436 return isNaN(this[TOKEN_TYPE_ID]);
437 }
438 },
439 {
440 key: "isText",
441 value: function isText() {
442 return isTextToken(this);
443 }
444 },
445 {
446 key: "isTag",
447 value: function isTag() {
448 return isTagToken(this);
449 }
450 },
451 {
452 key: "isAttrName",
453 value: function isAttrName() {
454 return isAttrNameToken(this);
455 }
456 },
457 {
458 key: "isAttrValue",
459 value: function isAttrValue() {
460 return isAttrValueToken(this);
461 }
462 },
463 {
464 key: "isStart",
465 value: function isStart() {
466 return isTagStart(this);
467 }
468 },
469 {
470 key: "isEnd",
471 value: function isEnd() {
472 return isTagEnd(this);
473 }
474 },
475 {
476 key: "getName",
477 value: function getName() {
478 return getTagName(this);
479 }
480 },
481 {
482 key: "getValue",
483 value: function getValue() {
484 return getTokenValue(this);
485 }
486 },
487 {
488 key: "getLine",
489 value: function getLine() {
490 return getTokenLine(this);
491 }
492 },
493 {
494 key: "getColumn",
495 value: function getColumn() {
496 return getTokenColumn(this);
497 }
498 },
499 {
500 key: "toString",
501 value: function toString() {
502 return convertTagToText(this);
503 }
504 }
505 ]);
506 return Token;
507 }();
508 var TYPE_WORD = TOKEN_TYPE_WORD;
509 var TYPE_TAG = TOKEN_TYPE_TAG;
510 var TYPE_ATTR_NAME = TOKEN_TYPE_ATTR_NAME;
511 var TYPE_ATTR_VALUE = TOKEN_TYPE_ATTR_VALUE;
512 var TYPE_SPACE = TOKEN_TYPE_SPACE;
513 var TYPE_NEW_LINE = TOKEN_TYPE_NEW_LINE;
514
515 function CharGrabber(source, options) {
516 var cursor = {
517 pos: 0,
518 len: source.length
519 };
520 var substrUntilChar = function(char) {
521 var pos = cursor.pos;
522 var idx = source.indexOf(char, pos);
523 return idx >= 0 ? source.substr(pos, idx - pos) : '';
524 };
525 var includes = function(val) {
526 return source.indexOf(val, cursor.pos) >= 0;
527 };
528 var hasNext = function() {
529 return cursor.len > cursor.pos;
530 };
531 var isLast = function() {
532 return cursor.pos === cursor.len;
533 };
534 var skip = function(param, silent) {
535 var num = param === void 0 ? 1 : param;
536 cursor.pos += num;
537 if (options && options.onSkip && !silent) {
538 options.onSkip();
539 }
540 };
541 var rest = function() {
542 return source.substr(cursor.pos);
543 };
544 var curr = function() {
545 return source[cursor.pos];
546 };
547 var prev = function() {
548 var prevPos = cursor.pos - 1;
549 return typeof source[prevPos] !== 'undefined' ? source[prevPos] : null;
550 };
551 var next = function() {
552 var nextPos = cursor.pos + 1;
553 return nextPos <= source.length - 1 ? source[nextPos] : null;
554 };
555 var grabWhile = function(cond, silent) {
556 var start = 0;
557 if (hasNext()) {
558 start = cursor.pos;
559 while(hasNext() && cond(curr())){
560 skip(1, silent);
561 }
562 }
563 return source.substr(start, cursor.pos - start);
564 };
565 /**
566 * @type {skip}
567 */ this.skip = skip;
568 /**
569 * @returns {Boolean}
570 */ this.hasNext = hasNext;
571 /**
572 * @returns {String}
573 */ this.getCurr = curr;
574 /**
575 * @returns {String}
576 */ this.getRest = rest;
577 /**
578 * @returns {String}
579 */ this.getNext = next;
580 /**
581 * @returns {String}
582 */ this.getPrev = prev;
583 /**
584 * @returns {Boolean}
585 */ this.isLast = isLast;
586 /**
587 * @returns {Boolean}
588 */ this.includes = includes;
589 /**
590 * @param {Function} cond
591 * @param {Boolean} silent
592 * @return {String}
593 */ this.grabWhile = grabWhile;
594 /**
595 * Grabs rest of string until it find a char
596 * @param {String} char
597 * @return {String}
598 */ this.substrUntilChar = substrUntilChar;
599 }
600 /**
601 * Creates a grabber wrapper for source string, that helps to iterate over string char by char
602 * @param {String} source
603 * @param {Object} options
604 * @param {Function} options.onSkip
605 * @return CharGrabber
606 */ var createCharGrabber = function(source, options) {
607 return new CharGrabber(source, options);
608 };
609 /**
610 * Trims string from start and end by char
611 * @example
612 * trimChar('*hello*', '*') ==> 'hello'
613 * @param {String} str
614 * @param {String} charToRemove
615 * @returns {String}
616 */ var trimChar = function(str, charToRemove) {
617 while(str.charAt(0) === charToRemove){
618 // eslint-disable-next-line no-param-reassign
619 str = str.substring(1);
620 }
621 while(str.charAt(str.length - 1) === charToRemove){
622 // eslint-disable-next-line no-param-reassign
623 str = str.substring(0, str.length - 1);
624 }
625 return str;
626 };
627 /**
628 * Unquotes \" to "
629 * @param str
630 * @return {String}
631 */ var unquote = function(str) {
632 return str.replace(BACKSLASH_1 + QUOTEMARK_1, QUOTEMARK_1);
633 };
634 function NodeList(param) {
635 var values = param === void 0 ? [] : param;
636 var nodes = values;
637 var getLast = function() {
638 return Array.isArray(nodes) && nodes.length > 0 && typeof nodes[nodes.length - 1] !== 'undefined' ? nodes[nodes.length - 1] : null;
639 };
640 var flushLast = function() {
641 return nodes.length ? nodes.pop() : false;
642 };
643 var push = function(value) {
644 return nodes.push(value);
645 };
646 var toArray = function() {
647 return nodes;
648 };
649 this.push = push;
650 this.toArray = toArray;
651 this.getLast = getLast;
652 this.flushLast = flushLast;
653 }
654 /**
655 *
656 * @param values
657 * @return {NodeList}
658 */ var createList = function(param) {
659 var values = param === void 0 ? [] : param;
660 return new NodeList(values);
661 };
662
663 // for cases <!-- -->
664 var EM = '!';
665 /**
666 * Creates a Token entity class
667 * @param {Number} type
668 * @param {String} value
669 * @param {Number} r line number
670 * @param {Number} cl char number in line
671 */ var createToken = function(type, value, param, param1) {
672 var r = param === void 0 ? 0 : param, cl = param1 === void 0 ? 0 : param1;
673 return new Token(type, value, r, cl);
674 };
675 /**
676 * @typedef {Object} Lexer
677 * @property {Function} tokenize
678 * @property {Function} isTokenNested
679 */ /**
680 * @param {String} buffer
681 * @param {Object} options
682 * @param {Function} options.onToken
683 * @param {String} options.openTag
684 * @param {String} options.closeTag
685 * @param {Boolean} options.enableEscapeTags
686 * @return {Lexer}
687 */ function createLexer(buffer, param) {
688 var options = param === void 0 ? {
689 } : param;
690 var emitToken = /**
691 * Emits newly created token to subscriber
692 * @param {Number} type
693 * @param {String} value
694 */ function emitToken(type, value) {
695 var token = createToken(type, value, row, col);
696 onToken(token);
697 tokenIndex += 1;
698 tokens[tokenIndex] = token;
699 };
700 var nextTagState = function nextTagState(tagChars, isSingleValueTag) {
701 if (tagMode === TAG_STATE_ATTR) {
702 var validAttrName = function(char) {
703 return !(char === EQ_1 || isWhiteSpace(char));
704 };
705 var name = tagChars.grabWhile(validAttrName);
706 var isEnd = tagChars.isLast();
707 var isValue = tagChars.getCurr() !== EQ_1;
708 tagChars.skip();
709 if (isEnd || isValue) {
710 emitToken(TYPE_ATTR_VALUE, unq(name));
711 } else {
712 emitToken(TYPE_ATTR_NAME, name);
713 }
714 if (isEnd) {
715 return TAG_STATE_NAME;
716 }
717 if (isValue) {
718 return TAG_STATE_ATTR;
719 }
720 return TAG_STATE_VALUE;
721 }
722 if (tagMode === TAG_STATE_VALUE) {
723 var stateSpecial = false;
724 var validAttrValue = function(char) {
725 // const isEQ = char === EQ;
726 var isQM = char === QUOTEMARK_1;
727 var prevChar = tagChars.getPrev();
728 var nextChar = tagChars.getNext();
729 var isPrevSLASH = prevChar === BACKSLASH_1;
730 var isNextEQ = nextChar === EQ_1;
731 var isWS = isWhiteSpace(char);
732 // const isPrevWS = isWhiteSpace(prevChar);
733 var isNextWS = isWhiteSpace(nextChar);
734 if (stateSpecial && isSpecialChar(char)) {
735 return true;
736 }
737 if (isQM && !isPrevSLASH) {
738 stateSpecial = !stateSpecial;
739 if (!stateSpecial && !(isNextEQ || isNextWS)) {
740 return false;
741 }
742 }
743 if (!isSingleValueTag) {
744 return isWS === false;
745 // return (isEQ || isWS) === false;
746 }
747 return true;
748 };
749 var name = tagChars.grabWhile(validAttrValue);
750 tagChars.skip();
751 emitToken(TYPE_ATTR_VALUE, unq(name));
752 if (tagChars.isLast()) {
753 return TAG_STATE_NAME;
754 }
755 return TAG_STATE_ATTR;
756 }
757 var validName = function(char) {
758 return !(char === EQ_1 || isWhiteSpace(char) || tagChars.isLast());
759 };
760 var name = tagChars.grabWhile(validName);
761 emitToken(TYPE_TAG, name);
762 tagChars.skip();
763 // in cases when we has [url=someval]GET[/url] and we dont need to parse all
764 if (isSingleValueTag) {
765 return TAG_STATE_VALUE;
766 }
767 var hasEQ = tagChars.includes(EQ_1);
768 return hasEQ ? TAG_STATE_ATTR : TAG_STATE_VALUE;
769 };
770 var stateTag = function stateTag() {
771 var currChar = chars.getCurr();
772 if (currChar === openTag) {
773 var nextChar = chars.getNext();
774 chars.skip();
775 // detect case where we have '[My word [tag][/tag]' or we have '[My last line word'
776 var substr = chars.substrUntilChar(closeTag);
777 var hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;
778 if (isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {
779 emitToken(TYPE_WORD, currChar);
780 return STATE_WORD;
781 }
782 // [myTag ]
783 var isNoAttrsInTag = substr.indexOf(EQ_1) === -1;
784 // [/myTag]
785 var isClosingTag = substr[0] === SLASH_1;
786 if (isNoAttrsInTag || isClosingTag) {
787 var name = chars.grabWhile(function(char) {
788 return char !== closeTag;
789 });
790 chars.skip(); // skip closeTag
791 emitToken(TYPE_TAG, name);
792 return STATE_WORD;
793 }
794 return STATE_TAG_ATTRS;
795 }
796 return STATE_WORD;
797 };
798 var stateAttrs = function stateAttrs() {
799 var silent = true;
800 var tagStr = chars.grabWhile(function(char) {
801 return char !== closeTag;
802 }, silent);
803 var tagGrabber = createCharGrabber(tagStr, {
804 onSkip: onSkip
805 });
806 var hasSpace = tagGrabber.includes(SPACE_1);
807 tagMode = TAG_STATE_NAME;
808 while(tagGrabber.hasNext()){
809 tagMode = nextTagState(tagGrabber, !hasSpace);
810 }
811 chars.skip(); // skip closeTag
812 return STATE_WORD;
813 };
814 var stateWord = function stateWord() {
815 if (isNewLine(chars.getCurr())) {
816 emitToken(TYPE_NEW_LINE, chars.getCurr());
817 chars.skip();
818 col = 0;
819 row++;
820 return STATE_WORD;
821 }
822 if (isWhiteSpace(chars.getCurr())) {
823 emitToken(TYPE_SPACE, chars.grabWhile(isWhiteSpace));
824 return STATE_WORD;
825 }
826 if (chars.getCurr() === openTag) {
827 if (chars.includes(closeTag)) {
828 return STATE_TAG;
829 }
830 emitToken(TYPE_WORD, chars.getCurr());
831 chars.skip();
832 return STATE_WORD;
833 }
834 if (escapeTags) {
835 if (isEscapeChar(chars.getCurr())) {
836 var currChar = chars.getCurr();
837 var nextChar = chars.getNext();
838 chars.skip(); // skip the \ without emitting anything
839 if (isEscapableChar(nextChar)) {
840 chars.skip(); // skip past the [, ] or \ as well
841 emitToken(TYPE_WORD, nextChar);
842 return STATE_WORD;
843 }
844 emitToken(TYPE_WORD, currChar);
845 return STATE_WORD;
846 }
847 var isChar = function(char) {
848 return isCharToken(char) && !isEscapeChar(char);
849 };
850 emitToken(TYPE_WORD, chars.grabWhile(isChar));
851 return STATE_WORD;
852 }
853 emitToken(TYPE_WORD, chars.grabWhile(isCharToken));
854 return STATE_WORD;
855 };
856 var tokenize = function tokenize() {
857 stateMode = STATE_WORD;
858 while(chars.hasNext()){
859 switch(stateMode){
860 case STATE_TAG:
861 stateMode = stateTag();
862 break;
863 case STATE_TAG_ATTRS:
864 stateMode = stateAttrs();
865 break;
866 case STATE_WORD:
867 stateMode = stateWord();
868 break;
869 default:
870 stateMode = STATE_WORD;
871 break;
872 }
873 }
874 tokens.length = tokenIndex + 1;
875 return tokens;
876 };
877 var isTokenNested = function isTokenNested(token) {
878 var value = openTag + SLASH_1 + token.getValue();
879 // potential bottleneck
880 return buffer.indexOf(value) > -1;
881 };
882 var STATE_WORD = 0;
883 var STATE_TAG = 1;
884 var STATE_TAG_ATTRS = 2;
885 var TAG_STATE_NAME = 0;
886 var TAG_STATE_ATTR = 1;
887 var TAG_STATE_VALUE = 2;
888 var row = 0;
889 var col = 0;
890 var tokenIndex = -1;
891 var stateMode = STATE_WORD;
892 var tagMode = TAG_STATE_NAME;
893 var tokens = new Array(Math.floor(buffer.length));
894 var openTag = options.openTag || OPEN_BRAKET_1;
895 var closeTag = options.closeTag || CLOSE_BRAKET_1;
896 var escapeTags = !!options.enableEscapeTags;
897 var onToken = options.onToken || function() {
898 };
899 var RESERVED_CHARS = [
900 closeTag,
901 openTag,
902 QUOTEMARK_1,
903 BACKSLASH_1,
904 SPACE_1,
905 TAB_1,
906 EQ_1,
907 N_1,
908 EM
909 ];
910 var NOT_CHAR_TOKENS = [
911 // ...(options.enableEscapeTags ? [BACKSLASH] : []),
912 openTag,
913 SPACE_1,
914 TAB_1,
915 N_1,
916 ];
917 var WHITESPACES = [
918 SPACE_1,
919 TAB_1
920 ];
921 var SPECIAL_CHARS = [
922 EQ_1,
923 SPACE_1,
924 TAB_1
925 ];
926 var isCharReserved = function(char) {
927 return RESERVED_CHARS.indexOf(char) >= 0;
928 };
929 var isNewLine = function(char) {
930 return char === N_1;
931 };
932 var isWhiteSpace = function(char) {
933 return WHITESPACES.indexOf(char) >= 0;
934 };
935 var isCharToken = function(char) {
936 return NOT_CHAR_TOKENS.indexOf(char) === -1;
937 };
938 var isSpecialChar = function(char) {
939 return SPECIAL_CHARS.indexOf(char) >= 0;
940 };
941 var isEscapableChar = function(char) {
942 return char === openTag || char === closeTag || char === BACKSLASH_1;
943 };
944 var isEscapeChar = function(char) {
945 return char === BACKSLASH_1;
946 };
947 var onSkip = function() {
948 col++;
949 };
950 var unq = function(val) {
951 return unquote(trimChar(val, QUOTEMARK_1));
952 };
953 var chars = createCharGrabber(buffer, {
954 onSkip: onSkip
955 });
956 return {
957 tokenize: tokenize,
958 isTokenNested: isTokenNested
959 };
960 }
961
962 /**
963 * @public
964 * @param {String} input
965 * @param {Object} opts
966 * @param {Function} opts.createTokenizer
967 * @param {Array<string>} opts.onlyAllowTags
968 * @param {String} opts.openTag
969 * @param {String} opts.closeTag
970 * @param {Boolean} opts.enableEscapeTags
971 * @return {Array}
972 */ var parse = function(input, param) {
973 var opts = param === void 0 ? {
974 } : param;
975 var options = opts;
976 var openTag = options.openTag || OPEN_BRAKET_1;
977 var closeTag = options.closeTag || CLOSE_BRAKET_1;
978 var tokenizer = null;
979 /**
980 * Result AST of nodes
981 * @private
982 * @type {NodeList}
983 */ var nodes = createList();
984 /**
985 * Temp buffer of nodes that's nested to another node
986 * @private
987 * @type {NodeList}
988 */ var nestedNodes = createList();
989 /**
990 * Temp buffer of nodes [tag..]...[/tag]
991 * @private
992 * @type {NodeList}
993 */ var tagNodes = createList();
994 /**
995 * Temp buffer of tag attributes
996 * @private
997 * @type {NodeList}
998 */ var tagNodesAttrName = createList();
999 /**
1000 * Cache for nested tags checks
1001 */ var nestedTagsMap = new Set();
1002 /**
1003 *
1004 * @param token
1005 * @returns {boolean}
1006 */ var isTokenNested = function(token) {
1007 var value = token.getValue();
1008 if (!nestedTagsMap.has(value) && tokenizer.isTokenNested && tokenizer.isTokenNested(token)) {
1009 nestedTagsMap.add(value);
1010 return true;
1011 }
1012 return nestedTagsMap.has(value);
1013 };
1014 /**
1015 * @param tagName
1016 * @returns {boolean}
1017 */ var isTagNested = function(tagName) {
1018 return Boolean(nestedTagsMap.has(tagName));
1019 };
1020 /**
1021 * @private
1022 * @param {String} value
1023 * @return {boolean}
1024 */ var isAllowedTag = function(value) {
1025 if (options.onlyAllowTags && options.onlyAllowTags.length) {
1026 return options.onlyAllowTags.indexOf(value) >= 0;
1027 }
1028 return true;
1029 };
1030 /**
1031 * Flushes temp tag nodes and its attributes buffers
1032 * @private
1033 * @return {Array}
1034 */ var flushTagNodes = function() {
1035 if (tagNodes.flushLast()) {
1036 tagNodesAttrName.flushLast();
1037 }
1038 };
1039 /**
1040 * @private
1041 * @return {Array}
1042 */ var getNodes = function() {
1043 var lastNestedNode = nestedNodes.getLast();
1044 if (lastNestedNode && Array.isArray(lastNestedNode.content)) {
1045 return lastNestedNode.content;
1046 }
1047 return nodes.toArray();
1048 };
1049 /**
1050 * @private
1051 * @param {string|TagNode} node
1052 */ var appendNodes = function(node) {
1053 var items = getNodes();
1054 if (Array.isArray(items)) {
1055 if (isTagNode_1(node)) {
1056 if (isAllowedTag(node.tag)) {
1057 items.push(node.toTagNode());
1058 } else {
1059 items.push(node.toTagStart({
1060 openTag: openTag,
1061 closeTag: closeTag
1062 }));
1063 if (node.content.length) {
1064 node.content.forEach(function(item) {
1065 items.push(item);
1066 });
1067 items.push(node.toTagEnd({
1068 openTag: openTag,
1069 closeTag: closeTag
1070 }));
1071 }
1072 }
1073 } else {
1074 items.push(node);
1075 }
1076 }
1077 };
1078 /**
1079 * @private
1080 * @param {Token} token
1081 */ var handleTagStart = function(token) {
1082 flushTagNodes();
1083 var tagNode = default_1.create(token.getValue());
1084 var isNested = isTokenNested(token);
1085 tagNodes.push(tagNode);
1086 if (isNested) {
1087 nestedNodes.push(tagNode);
1088 } else {
1089 appendNodes(tagNode);
1090 }
1091 };
1092 /**
1093 * @private
1094 * @param {Token} token
1095 */ var handleTagEnd = function(token) {
1096 flushTagNodes();
1097 var lastNestedNode = nestedNodes.flushLast();
1098 if (lastNestedNode) {
1099 appendNodes(lastNestedNode);
1100 } else if (typeof options.onError === 'function') {
1101 var tag = token.getValue();
1102 var line = token.getLine();
1103 var column = token.getColumn();
1104 options.onError({
1105 message: "Inconsistent tag '".concat(tag, "' on line ").concat(line, " and column ").concat(column),
1106 tagName: tag,
1107 lineNumber: line,
1108 columnNumber: column
1109 });
1110 }
1111 };
1112 /**
1113 * @private
1114 * @param {Token} token
1115 */ var handleTag = function(token) {
1116 // [tag]
1117 if (token.isStart()) {
1118 handleTagStart(token);
1119 }
1120 // [/tag]
1121 if (token.isEnd()) {
1122 handleTagEnd(token);
1123 }
1124 };
1125 /**
1126 * @private
1127 * @param {Token} token
1128 */ var handleNode = function(token) {
1129 /**
1130 * @type {TagNode}
1131 */ var lastTagNode = tagNodes.getLast();
1132 var tokenValue = token.getValue();
1133 var isNested = isTagNested(token);
1134 if (lastTagNode) {
1135 if (token.isAttrName()) {
1136 tagNodesAttrName.push(tokenValue);
1137 lastTagNode.attr(tagNodesAttrName.getLast(), '');
1138 } else if (token.isAttrValue()) {
1139 var attrName = tagNodesAttrName.getLast();
1140 if (attrName) {
1141 lastTagNode.attr(attrName, tokenValue);
1142 tagNodesAttrName.flushLast();
1143 } else {
1144 lastTagNode.attr(tokenValue, tokenValue);
1145 }
1146 } else if (token.isText()) {
1147 if (isNested) {
1148 lastTagNode.append(tokenValue);
1149 } else {
1150 appendNodes(tokenValue);
1151 }
1152 } else if (token.isTag()) {
1153 // if tag is not allowed, just past it as is
1154 appendNodes(token.toString());
1155 }
1156 } else if (token.isText()) {
1157 appendNodes(tokenValue);
1158 } else if (token.isTag()) {
1159 // if tag is not allowed, just past it as is
1160 appendNodes(token.toString());
1161 }
1162 };
1163 /**
1164 * @private
1165 * @param {Token} token
1166 */ var onToken = function(token) {
1167 if (token.isTag()) {
1168 handleTag(token);
1169 } else {
1170 handleNode(token);
1171 }
1172 };
1173 tokenizer = (opts.createTokenizer ? opts.createTokenizer : createLexer)(input, {
1174 onToken: onToken,
1175 onlyAllowTags: options.onlyAllowTags,
1176 openTag: openTag,
1177 closeTag: closeTag,
1178 enableEscapeTags: options.enableEscapeTags
1179 });
1180 // eslint-disable-next-line no-unused-vars
1181 tokenizer.tokenize();
1182 return nodes.toArray();
1183 };
1184
1185 var _typeof$2 = function(obj) {
1186 return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
1187 };
1188 /* eslint-disable no-plusplus */ var isObj = function(value) {
1189 return typeof value === 'object';
1190 };
1191 var isBool = function(value) {
1192 return typeof value === 'boolean';
1193 };
1194 function iterate(t, cb) {
1195 var tree = t;
1196 if (Array.isArray(tree)) {
1197 for(var idx = 0; idx < tree.length; idx++){
1198 tree[idx] = iterate(cb(tree[idx]), cb);
1199 }
1200 } else if (tree && isObj(tree) && tree.content) {
1201 iterate(tree.content, cb);
1202 }
1203 return tree;
1204 }
1205 function same(expected, actual) {
1206 if ((typeof expected === "undefined" ? "undefined" : _typeof$2(expected)) !== (typeof actual === "undefined" ? "undefined" : _typeof$2(actual))) {
1207 return false;
1208 }
1209 if (!isObj(expected) || expected === null) {
1210 return expected === actual;
1211 }
1212 if (Array.isArray(expected)) {
1213 return expected.every(function(exp) {
1214 return [].some.call(actual, function(act) {
1215 return same(exp, act);
1216 });
1217 });
1218 }
1219 return Object.keys(expected).every(function(key) {
1220 var ao = actual[key];
1221 var eo = expected[key];
1222 if (isObj(eo) && eo !== null && ao !== null) {
1223 return same(eo, ao);
1224 }
1225 if (isBool(eo)) {
1226 return eo !== (ao === null);
1227 }
1228 return ao === eo;
1229 });
1230 }
1231 function match(expression, cb) {
1232 return Array.isArray(expression) ? iterate(this, function(node) {
1233 for(var idx = 0; idx < expression.length; idx++){
1234 if (same(expression[idx], node)) {
1235 return cb(node);
1236 }
1237 }
1238 return node;
1239 }) : iterate(this, function(node) {
1240 return same(expression, node) ? cb(node) : node;
1241 });
1242 }
1243
1244 function walk(cb) {
1245 return iterate(this, cb);
1246 }
1247 function bbob(plugs) {
1248 var plugins = typeof plugs === 'function' ? [
1249 plugs
1250 ] : plugs || [];
1251 var options = {
1252 skipParse: false
1253 };
1254 return {
1255 process: function(input, opts) {
1256 options = opts || {
1257 };
1258 var parseFn = options.parser || parse;
1259 var renderFn = options.render;
1260 var data = options.data || null;
1261 if (typeof parseFn !== 'function') {
1262 throw new Error('"parser" is not a function, please pass to "process(input, { parser })" right function');
1263 }
1264 var tree = options.skipParse ? input || [] : parseFn(input, options);
1265 // raw tree before modification with plugins
1266 var raw = tree;
1267 tree.messages = [];
1268 tree.options = options;
1269 tree.walk = walk;
1270 tree.match = match;
1271 plugins.forEach(function(plugin) {
1272 tree = plugin(tree, {
1273 parse: parseFn,
1274 render: renderFn,
1275 iterate: iterate,
1276 match: match,
1277 data: data
1278 }) || tree;
1279 });
1280 return {
1281 get html () {
1282 if (typeof renderFn !== 'function') {
1283 throw new Error('"render" function not defined, please pass to "process(input, { render })"');
1284 }
1285 return renderFn(tree, tree.options);
1286 },
1287 tree: tree,
1288 raw: raw,
1289 messages: tree.messages
1290 };
1291 }
1292 };
1293 }
1294
1295 function _arrayWithoutHoles(arr) {
1296 if (Array.isArray(arr)) {
1297 for(var i = 0, arr2 = new Array(arr.length); i < arr.length; i++){
1298 arr2[i] = arr[i];
1299 }
1300 return arr2;
1301 }
1302 }
1303 function _iterableToArray(iter) {
1304 if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
1305 }
1306 function _nonIterableSpread() {
1307 throw new TypeError("Invalid attempt to spread non-iterable instance");
1308 }
1309 function _toConsumableArray(arr) {
1310 return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
1311 }
1312 var _typeof$1 = function(obj) {
1313 return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
1314 };
1315 var isTagNode = function(el) {
1316 return typeof el === 'object' && !!el.tag;
1317 };
1318 var isStringNode = function(el) {
1319 return typeof el === 'string';
1320 };
1321 var keysReduce = function(obj, reduce, def) {
1322 return Object.keys(obj).reduce(reduce, def);
1323 };
1324 /**
1325 * Replaces " to &qquot;
1326 * @param {String} value
1327 */ var escapeHTML = function(value) {
1328 return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;')// eslint-disable-next-line no-script-url
1329 .replace(/(javascript):/gi, '$1%3A');
1330 };
1331 /**
1332 * Acept name and value and return valid html5 attribute string
1333 * @param {String} name
1334 * @param {String} value
1335 * @return {string}
1336 */ var attrValue = function(name, value) {
1337 var type = typeof value === "undefined" ? "undefined" : _typeof$1(value);
1338 var types = {
1339 boolean: function() {
1340 return value ? "".concat(name) : '';
1341 },
1342 number: function() {
1343 return "".concat(name, "=\"").concat(value, "\"");
1344 },
1345 string: function() {
1346 return "".concat(name, "=\"").concat(escapeHTML(value), "\"");
1347 },
1348 object: function() {
1349 return "".concat(name, "=\"").concat(escapeHTML(JSON.stringify(value)), "\"");
1350 }
1351 };
1352 return types[type] ? types[type]() : '';
1353 };
1354 /**
1355 * Transforms attrs to html params string
1356 * @param values
1357 */ var attrsToString = function(values) {
1358 // To avoid some malformed attributes
1359 if (values == null) {
1360 return '';
1361 }
1362 return keysReduce(values, function(arr, key) {
1363 return _toConsumableArray(arr).concat([
1364 attrValue(key, values[key])
1365 ]);
1366 }, [
1367 ''
1368 ]).join(' ');
1369 };
1370
1371 var _typeof = function(obj) {
1372 return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
1373 };
1374 var SELFCLOSE_END_TAG = '/>';
1375 var CLOSE_START_TAG = '</';
1376 var START_TAG = '<';
1377 var END_TAG = '>';
1378 var renderNode = function(node, param) {
1379 var _stripTags = param.stripTags, stripTags = _stripTags === void 0 ? false : _stripTags;
1380 if (!node) return '';
1381 var type = typeof node === "undefined" ? "undefined" : _typeof(node);
1382 if (type === 'string' || type === 'number') {
1383 return node;
1384 }
1385 if (type === 'object') {
1386 if (stripTags === true) {
1387 // eslint-disable-next-line no-use-before-define
1388 return renderNodes(node.content, {
1389 stripTags: stripTags
1390 });
1391 }
1392 if (node.content === null) {
1393 return [
1394 START_TAG,
1395 node.tag,
1396 attrsToString(node.attrs),
1397 SELFCLOSE_END_TAG
1398 ].join('');
1399 }
1400 // eslint-disable-next-line no-use-before-define
1401 return [
1402 START_TAG,
1403 node.tag,
1404 attrsToString(node.attrs),
1405 END_TAG,
1406 renderNodes(node.content),
1407 CLOSE_START_TAG,
1408 node.tag,
1409 END_TAG
1410 ].join('');
1411 }
1412 if (Array.isArray(node)) {
1413 // eslint-disable-next-line no-use-before-define
1414 return renderNodes(node, {
1415 stripTags: stripTags
1416 });
1417 }
1418 return '';
1419 };
1420 var renderNodes = function(nodes, param) {
1421 var ref = param === void 0 ? {
1422 } : param, _stripTags = ref.stripTags, stripTags = _stripTags === void 0 ? false : _stripTags;
1423 return [].concat(nodes).reduce(function(r, node) {
1424 return r + renderNode(node, {
1425 stripTags: stripTags
1426 });
1427 }, '');
1428 };
1429 var render$1 = renderNodes;
1430
1431 const toAST = (source, plugins = [], options = {})=>bbob(plugins).process(source, {
1432 ...options,
1433 render: (input)=>render$1(input, {
1434 stripTags: true
1435 })
1436 }).tree;
1437 const isContentEmpty = (content)=>!content || content.length === 0;
1438 function tagToVueNode(createElement, node, index) {
1439 const { class: className , style , ...domProps } = node.attrs || {};
1440 return createElement(node.tag, {
1441 key: index,
1442 class: className,
1443 style,
1444 domProps
1445 }, isContentEmpty(node.content) ? null : renderToVueNodes(createElement, node.content));
1446 }
1447 function renderToVueNodes(createElement, nodes) {
1448 return [].concat(nodes).reduce((arr, node, index)=>{
1449 if (isTagNode(node)) {
1450 arr.push(tagToVueNode(createElement, node, index));
1451 } else if (isStringNode(node)) {
1452 arr.push(node);
1453 }
1454 return arr;
1455 }, []);
1456 }
1457 /**
1458 * Converts string to Vue 2 VNodes
1459 * @param createElement {CreateElement}
1460 * @param source {String}
1461 * @param plugins {Array<Function>}
1462 * @param options {Object}
1463 * @returns {Array<VNode>}
1464 */ function render(createElement, source, plugins, options) {
1465 return renderToVueNodes(createElement, toAST(source, plugins, options));
1466 }
1467
1468 const Component = Vue.extend({
1469 props: {
1470 container: {
1471 type: String,
1472 default: 'span'
1473 },
1474 plugins: {
1475 type: Array
1476 },
1477 options: {
1478 type: Object
1479 }
1480 },
1481 render (createElement) {
1482 if (this.$slots.default) {
1483 const source = this.$slots.default.reduce((acc, vnode)=>acc + vnode.text, '');
1484 return createElement(this.container, render(createElement, source, this.plugins, this.options));
1485 }
1486 return null;
1487 }
1488 });
1489
1490 function install(Vue) {
1491 Vue.component('bbob-bbcode', Component);
1492 }
1493
1494 exports.Component = Component;
1495 exports.default = install;
1496 exports.render = render;
1497
1498 Object.defineProperty(exports, '__esModule', { value: true });
1499
1500}));