Socket
Socket
Sign inDemoInstall

@bbob/parser

Package Overview
Dependencies
Maintainers
1
Versions
53
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@bbob/parser - npm Package Compare versions

Comparing version 2.8.3 to 2.9.0

94

dist/index.js

@@ -279,3 +279,3 @@ (function (global, factory) {

const idx = source.indexOf(char, pos);
return idx >= 0 ? source.substr(pos, idx - pos) : '';
return idx >= 0 ? source.substring(pos, idx) : '';
};

@@ -291,3 +291,4 @@ const includes = (val)=>source.indexOf(val, cursor.pos) >= 0;

};
const rest = ()=>source.substr(cursor.pos);
const rest = ()=>source.substring(cursor.pos);
const grabN = (num = 0)=>source.substring(cursor.pos, cursor.pos + num);
const curr = ()=>source[cursor.pos];

@@ -310,3 +311,3 @@ const prev = ()=>{

}
return source.substr(start, cursor.pos - start);
return source.substring(start, cursor.pos);
};

@@ -343,2 +344,6 @@ /**

/**
* @param {Number} num
* @return {String}
*/ this.grabN = grabN;
/**
* Grabs rest of string until it find a char

@@ -429,2 +434,3 @@ * @param {String} char

let tagMode = TAG_STATE_NAME;
let contextFreeTag = '';
const tokens = new Array(Math.floor(buffer.length));

@@ -434,2 +440,3 @@ const openTag = options.openTag || OPEN_BRAKET;

const escapeTags = !!options.enableEscapeTags;
const contextFreeTags = options.contextFreeTags || [];
const onToken = options.onToken || (()=>{});

@@ -448,3 +455,2 @@ const RESERVED_CHARS = [

const NOT_CHAR_TOKENS = [
// ...(options.enableEscapeTags ? [BACKSLASH] : []),
openTag,

@@ -475,2 +481,10 @@ SPACE,

const unq = (val)=>unquote(trimChar(val, QUOTEMARK));
const checkContextFreeMode = (name, isClosingTag)=>{
if (contextFreeTag !== '' && isClosingTag) {
contextFreeTag = '';
}
if (contextFreeTag === '' && contextFreeTags.includes(name)) {
contextFreeTag = name;
}
};
const chars = createCharGrabber(buffer, {

@@ -547,2 +561,3 @@ onSkip

emitToken(TYPE_TAG, name2);
checkContextFreeMode(name2);
tagChars.skip();

@@ -558,25 +573,23 @@ // in cases when we has [url=someval]GET[/url] and we dont need to parse all

const currChar = chars.getCurr();
if (currChar === openTag) {
const nextChar = chars.getNext();
chars.skip();
// detect case where we have '[My word [tag][/tag]' or we have '[My last line word'
const substr = chars.substrUntilChar(closeTag);
const hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;
if (isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {
emitToken(TYPE_WORD, currChar);
return STATE_WORD;
}
// [myTag ]
const isNoAttrsInTag = substr.indexOf(EQ) === -1;
// [/myTag]
const isClosingTag = substr[0] === SLASH;
if (isNoAttrsInTag || isClosingTag) {
const name = chars.grabWhile((char)=>char !== closeTag);
chars.skip(); // skip closeTag
emitToken(TYPE_TAG, name);
return STATE_WORD;
}
return STATE_TAG_ATTRS;
const nextChar = chars.getNext();
chars.skip();
// detect case where we have '[My word [tag][/tag]' or we have '[My last line word'
const substr = chars.substrUntilChar(closeTag);
const hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;
if (isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {
emitToken(TYPE_WORD, currChar);
return STATE_WORD;
}
return STATE_WORD;
// [myTag ]
const isNoAttrsInTag = substr.indexOf(EQ) === -1;
// [/myTag]
const isClosingTag = substr[0] === SLASH;
if (isNoAttrsInTag || isClosingTag) {
const name = chars.grabWhile((char)=>char !== closeTag);
chars.skip(); // skip closeTag
emitToken(TYPE_TAG, name);
checkContextFreeMode(name, isClosingTag);
return STATE_WORD;
}
return STATE_TAG_ATTRS;
}

@@ -606,7 +619,16 @@ function stateAttrs() {

if (isWhiteSpace(chars.getCurr())) {
emitToken(TYPE_SPACE, chars.grabWhile(isWhiteSpace));
const word = chars.grabWhile(isWhiteSpace);
emitToken(TYPE_SPACE, word);
return STATE_WORD;
}
if (chars.getCurr() === openTag) {
if (chars.includes(closeTag)) {
if (contextFreeTag) {
const fullTagLen = openTag.length + SLASH.length + contextFreeTag.length;
const fullTagName = `${openTag}${SLASH}${contextFreeTag}`;
const foundTag = chars.grabN(fullTagLen);
const isEndContextFreeMode = foundTag === fullTagName;
if (isEndContextFreeMode) {
return STATE_TAG;
}
} else if (chars.includes(closeTag)) {
return STATE_TAG;

@@ -632,6 +654,8 @@ }

const isChar = (char)=>isCharToken(char) && !isEscapeChar(char);
emitToken(TYPE_WORD, chars.grabWhile(isChar));
const word1 = chars.grabWhile(isChar);
emitToken(TYPE_WORD, word1);
return STATE_WORD;
}
emitToken(TYPE_WORD, chars.grabWhile(isCharToken));
const word2 = chars.grabWhile(isCharToken);
emitToken(TYPE_WORD, word2);
return STATE_WORD;

@@ -650,7 +674,5 @@ }

case STATE_WORD:
default:
stateMode = stateWord();
break;
default:
stateMode = STATE_WORD;
break;
}

@@ -678,5 +700,6 @@ }

* @param {Array<string>} opts.onlyAllowTags
* @param {Array<string>} opts.contextFreeTags
* @param {Boolean} opts.enableEscapeTags
* @param {String} opts.openTag
* @param {String} opts.closeTag
* @param {Boolean} opts.enableEscapeTags
* @return {Array}

@@ -882,5 +905,6 @@ */ const parse = (input, opts = {})=>{

onToken,
onlyAllowTags: options.onlyAllowTags,
openTag,
closeTag,
onlyAllowTags: options.onlyAllowTags,
contextFreeTags: options.contextFreeTags,
enableEscapeTags: options.enableEscapeTags

@@ -887,0 +911,0 @@ });

@@ -1,1 +0,1 @@

!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).BbobParser={})}(this,function(t){"use strict";let e=t=>"object"==typeof t&&!!t.tag,r=t=>"string"==typeof t,n=(t,e,r)=>Object.keys(t).reduce(e,r),s=t=>e(t)?t.content.reduce((t,e)=>t+s(e),0):r(t)?t.length:0,i=(t,e)=>{t.content.push(e)},l=t=>t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;").replace(/(javascript|data|vbscript):/gi,"$1%3A"),a=(t,e)=>{let r=typeof e,n={boolean:()=>e?""+t:"",number:()=>`${t}="${e}"`,string:()=>`${t}="${l(e)}"`,object:()=>`${t}="${l(JSON.stringify(e))}"`};return n[r]?n[r]():""},o=t=>null==t?"":n(t,(e,r)=>[...e,a(r,t[r])],[""]).join(" "),u=t=>n(t,(e,r)=>t[r]===r?t[r]:null,null),g=(t,e)=>{let r=u(e);if(r){let n=a(t,r),s={...e};delete s[r];let i=o(s);return`${n}${i}`}return`${t}${o(e)}`};class h{attr(t,e){return void 0!==e&&(this.attrs[t]=e),this.attrs[t]}append(t){return i(this,t)}get length(){return s(this)}toTagStart({openTag:t="[",closeTag:e="]"}={}){let r=g(this.tag,this.attrs);return`${t}${r}${e}`}toTagEnd({openTag:t="[",closeTag:e="]"}={}){return`${t}/${this.tag}${e}`}toTagNode(){return new h(this.tag.toLowerCase(),this.attrs,this.content)}toString({openTag:t="[",closeTag:e="]"}={}){let r=0===this.content.length,n=this.content.reduce((r,n)=>r+n.toString({openTag:t,closeTag:e}),""),s=this.toTagStart({openTag:t,closeTag:e});return r?s:`${s}${n}${this.toTagEnd({openTag:t,closeTag:e})}`}constructor(t,e,r){this.tag=t,this.attrs=e,this.content=Array.isArray(r)?r:[r]}}h.create=(t,e={},r=[])=>new h(t,e,r),h.isOf=(t,e)=>t.tag===e;let c="type",f="value",p="line",d=t=>t&&void 0!==t[f]?t[f]:"",b=t=>t&&t[p]||0,T=t=>t&&t.row||0,y=t=>!!t&&void 0!==t[c]&&(5===t[c]||6===t[c]||1===t[c]),k=t=>!!t&&void 0!==t[c]&&2===t[c],A=t=>47===d(t).charCodeAt(0),N=t=>!A(t),x=t=>!!t&&void 0!==t[c]&&3===t[c],$=t=>!!t&&void 0!==t[c]&&4===t[c],m=t=>{let e=d(t);return A(t)?e.slice(1):e},L=t=>d(t)+"]";class C{isEmpty(){return isNaN(this[c])}isText(){return y(this)}isTag(){return k(this)}isAttrName(){return x(this)}isAttrValue(){return $(this)}isStart(){return N(this)}isEnd(){return A(this)}getName(){return m(this)}getValue(){return d(this)}getLine(){return b(this)}getColumn(){return T(this)}toString(){return L(this)}constructor(t,e,r,n){this[c]=Number(t),this[f]=String(e),this[p]=Number(r),this.row=Number(n)}}function w(t,e){let r={pos:0,len:t.length},n=e=>{let{pos:n}=r,s=t.indexOf(e,n);return s>=0?t.substr(n,s-n):""},s=e=>t.indexOf(e,r.pos)>=0,i=()=>r.len>r.pos,l=(t=1,n)=>{r.pos+=t,e&&e.onSkip&&!n&&e.onSkip()},a=()=>t.substr(r.pos),o=()=>t[r.pos],u=()=>{let e=r.pos-1;return void 0!==t[e]?t[e]:null},g=()=>{let e=r.pos+1;return e<=t.length-1?t[e]:null},h=(e,n)=>{let s=0;if(i())for(s=r.pos;i()&&e(o());)l(1,n);return t.substr(s,r.pos-s)};this.skip=l,this.hasNext=i,this.getCurr=o,this.getRest=a,this.getNext=g,this.getPrev=u,this.isLast=()=>r.pos===r.len,this.includes=s,this.grabWhile=h,this.substrUntilChar=n}let S=(t,e)=>new w(t,e),v=(t,e)=>{for(;t.charAt(0)===e;)t=t.substring(1);for(;t.charAt(t.length-1)===e;)t=t.substring(0,t.length-1);return t},O=t=>t.replace('\\"','"');function E(t=[]){let e=()=>Array.isArray(t)&&t.length>0&&void 0!==t[t.length-1]?t[t.length-1]:null,r=()=>!!t.length&&t.pop(),n=e=>t.push(e);this.push=n,this.toArray=()=>t,this.getLast=e,this.flushLast=r}let W=(t=[])=>new E(t),V=(t,e,r=0,n=0)=>new C(t,e,r,n);function j(t,e={}){let r=0,n=0,s=-1,i=0,l=0,a=Array(Math.floor(t.length)),o=e.openTag||"[",u=e.closeTag||"]",g=!!e.enableEscapeTags,h=e.onToken||(()=>{}),c=[u,o,'"',"\\"," "," ","=","\n","!"],f=[o," "," ","\n"],p=[" "," "],d=["="," "," "],b=t=>c.indexOf(t)>=0,T=t=>"\n"===t,y=t=>p.indexOf(t)>=0,k=t=>-1===f.indexOf(t),A=t=>d.indexOf(t)>=0,N=t=>t===o||t===u||"\\"===t,x=t=>"\\"===t,$=()=>{n++},m=t=>O(v(t,'"')),L=S(t,{onSkip:$});function C(t,e){let i=V(t,e,r,n);h(i),a[s+=1]=i}return{tokenize:function(){for(i=0;L.hasNext();)switch(i){case 1:i=function(){let t=L.getCurr();if(t===o){let e=L.getNext();L.skip();let r=L.substrUntilChar(u),n=0===r.length||r.indexOf(o)>=0;if(b(e)||n||L.isLast())return C(1,t),0;let s=-1===r.indexOf("="),i="/"===r[0];if(s||i){let l=L.grabWhile(t=>t!==u);return L.skip(),C(2,l),0}return 2}return 0}();break;case 2:i=function(){let t=L.grabWhile(t=>t!==u,!0),e=S(t,{onSkip:$}),r=e.includes(" ");for(l=0;e.hasNext();)l=function(t,e){if(1===l){let r=t=>!("="===t||y(t)),n=t.grabWhile(r),s=t.isLast(),i="="!==t.getCurr();return(t.skip(),s||i?C(4,m(n)):C(3,n),s)?0:i?1:2}if(2===l){let a=!1,o=r=>{let n=t.getPrev(),s=t.getNext(),i=y(r),l=y(s);return!!(a&&A(r))||('"'!==r||"\\"===n||!!(a=!a)||"="===s||!!l)&&(!!e||!1===i)},u=t.grabWhile(o);return(t.skip(),C(4,m(u)),t.isLast())?0:1}let g=e=>!("="===e||y(e)||t.isLast()),h=t.grabWhile(g);if(C(2,h),t.skip(),e)return 2;let c=t.includes("=");return c?1:2}(e,!r);return L.skip(),0}();break;case 0:i=function(){if(T(L.getCurr()))return C(6,L.getCurr()),L.skip(),n=0,r++,0;if(y(L.getCurr()))return C(5,L.grabWhile(y)),0;if(L.getCurr()===o)return L.includes(u)?1:(C(1,L.getCurr()),L.skip(),0);if(g){if(x(L.getCurr())){let t=L.getCurr(),e=L.getNext();return(L.skip(),N(e))?(L.skip(),C(1,e),0):(C(1,t),0)}let s=t=>k(t)&&!x(t);return C(1,L.grabWhile(s)),0}return C(1,L.grabWhile(k)),0}();break;default:i=0}return a.length=s+1,a},isTokenNested:function(e){let r=o+"/"+e.getValue();return t.indexOf(r)>-1}}}let z=(t,r={})=>{let n=r.openTag||"[",s=r.closeTag||"]",i=null,l=W(),a=W(),o=W(),u=W(),g=new Set,c=t=>{let e=t.getValue();return!g.has(e)&&i.isTokenNested&&i.isTokenNested(t)?(g.add(e),!0):g.has(e)},f=t=>Boolean(g.has(t)),p=t=>!r.onlyAllowTags||!r.onlyAllowTags.length||r.onlyAllowTags.indexOf(t)>=0,d=()=>{o.flushLast()&&u.flushLast()},b=()=>{let t=a.getLast();return t&&Array.isArray(t.content)?t.content:l.toArray()},T=t=>{let r=b();Array.isArray(r)&&(e(t)?p(t.tag)?r.push(t.toTagNode()):(r.push(t.toTagStart({openTag:n,closeTag:s})),t.content.length&&(t.content.forEach(t=>{r.push(t)}),r.push(t.toTagEnd({openTag:n,closeTag:s})))):r.push(t))},y=t=>{d();let e=h.create(t.getValue()),r=c(t);o.push(e),r?a.push(e):T(e)},k=t=>{d();let e=a.flushLast();if(e)T(e);else if("function"==typeof r.onError){let n=t.getValue(),s=t.getLine(),i=t.getColumn();r.onError({message:`Inconsistent tag '${n}' on line ${s} and column ${i}`,tagName:n,lineNumber:s,columnNumber:i})}},A=t=>{t.isStart()&&y(t),t.isEnd()&&k(t)},N=t=>{let e=o.getLast(),r=t.getValue(),n=f(t);if(e){if(t.isAttrName())u.push(r),e.attr(u.getLast(),"");else if(t.isAttrValue()){let s=u.getLast();s?(e.attr(s,r),u.flushLast()):e.attr(r,r)}else t.isText()?n?e.append(r):T(r):t.isTag()&&T(t.toString())}else t.isText()?T(r):t.isTag()&&T(t.toString())},x=t=>{t.isTag()?A(t):N(t)};return(i=(r.createTokenizer?r.createTokenizer:j)(t,{onToken:x,onlyAllowTags:r.onlyAllowTags,openTag:n,closeTag:s,enableEscapeTags:r.enableEscapeTags})).tokenize(),l.toArray()};t.TagNode=h,t.default=z,t.parse=z,Object.defineProperty(t,"__esModule",{value:!0})});
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).BbobParser={})}(this,function(t){"use strict";let e=t=>"object"==typeof t&&!!t.tag,r=t=>"string"==typeof t,n=(t,e,r)=>Object.keys(t).reduce(e,r),s=t=>e(t)?t.content.reduce((t,e)=>t+s(e),0):r(t)?t.length:0,i=(t,e)=>{t.content.push(e)},l=t=>t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;").replace(/(javascript|data|vbscript):/gi,"$1%3A"),a=(t,e)=>{let r=typeof e,n={boolean:()=>e?""+t:"",number:()=>`${t}="${e}"`,string:()=>`${t}="${l(e)}"`,object:()=>`${t}="${l(JSON.stringify(e))}"`};return n[r]?n[r]():""},o=t=>null==t?"":n(t,(e,r)=>[...e,a(r,t[r])],[""]).join(" "),u=t=>n(t,(e,r)=>t[r]===r?t[r]:null,null),g=(t,e)=>{let r=u(e);if(r){let n=a(t,r),s={...e};delete s[r];let i=o(s);return`${n}${i}`}return`${t}${o(e)}`};class h{attr(t,e){return void 0!==e&&(this.attrs[t]=e),this.attrs[t]}append(t){return i(this,t)}get length(){return s(this)}toTagStart({openTag:t="[",closeTag:e="]"}={}){let r=g(this.tag,this.attrs);return`${t}${r}${e}`}toTagEnd({openTag:t="[",closeTag:e="]"}={}){return`${t}/${this.tag}${e}`}toTagNode(){return new h(this.tag.toLowerCase(),this.attrs,this.content)}toString({openTag:t="[",closeTag:e="]"}={}){let r=0===this.content.length,n=this.content.reduce((r,n)=>r+n.toString({openTag:t,closeTag:e}),""),s=this.toTagStart({openTag:t,closeTag:e});return r?s:`${s}${n}${this.toTagEnd({openTag:t,closeTag:e})}`}constructor(t,e,r){this.tag=t,this.attrs=e,this.content=Array.isArray(r)?r:[r]}}h.create=(t,e={},r=[])=>new h(t,e,r),h.isOf=(t,e)=>t.tag===e;let c="type",f="value",p="line",d=t=>t&&void 0!==t[f]?t[f]:"",b=t=>t&&t[p]||0,T=t=>t&&t.row||0,y=t=>!!t&&void 0!==t[c]&&(5===t[c]||6===t[c]||1===t[c]),N=t=>!!t&&void 0!==t[c]&&2===t[c],x=t=>47===d(t).charCodeAt(0),A=t=>!x(t),$=t=>!!t&&void 0!==t[c]&&3===t[c],k=t=>!!t&&void 0!==t[c]&&4===t[c],m=t=>{let e=d(t);return x(t)?e.slice(1):e},L=t=>d(t)+"]";class C{isEmpty(){return isNaN(this[c])}isText(){return y(this)}isTag(){return N(this)}isAttrName(){return $(this)}isAttrValue(){return k(this)}isStart(){return A(this)}isEnd(){return x(this)}getName(){return m(this)}getValue(){return d(this)}getLine(){return b(this)}getColumn(){return T(this)}toString(){return L(this)}constructor(t,e,r,n){this[c]=Number(t),this[f]=String(e),this[p]=Number(r),this.row=Number(n)}}function w(t,e){let r={pos:0,len:t.length},n=e=>{let{pos:n}=r,s=t.indexOf(e,n);return s>=0?t.substring(n,s):""},s=e=>t.indexOf(e,r.pos)>=0,i=()=>r.len>r.pos,l=(t=1,n)=>{r.pos+=t,e&&e.onSkip&&!n&&e.onSkip()},a=()=>t.substring(r.pos),o=(e=0)=>t.substring(r.pos,r.pos+e),u=()=>t[r.pos],g=()=>{let e=r.pos-1;return void 0!==t[e]?t[e]:null},h=()=>{let e=r.pos+1;return e<=t.length-1?t[e]:null},c=(e,n)=>{let s=0;if(i())for(s=r.pos;i()&&e(u());)l(1,n);return t.substring(s,r.pos)};this.skip=l,this.hasNext=i,this.getCurr=u,this.getRest=a,this.getNext=h,this.getPrev=g,this.isLast=()=>r.pos===r.len,this.includes=s,this.grabWhile=c,this.grabN=o,this.substrUntilChar=n}let S=(t,e)=>new w(t,e),v=(t,e)=>{for(;t.charAt(0)===e;)t=t.substring(1);for(;t.charAt(t.length-1)===e;)t=t.substring(0,t.length-1);return t},O=t=>t.replace('\\"','"');function E(t=[]){let e=()=>Array.isArray(t)&&t.length>0&&void 0!==t[t.length-1]?t[t.length-1]:null,r=()=>!!t.length&&t.pop(),n=e=>t.push(e);this.push=n,this.toArray=()=>t,this.getLast=e,this.flushLast=r}let W=(t=[])=>new E(t),V=(t,e,r=0,n=0)=>new C(t,e,r,n);function j(t,e={}){let r=0,n=0,s=-1,i=0,l=0,a="",o=Array(Math.floor(t.length)),u=e.openTag||"[",g=e.closeTag||"]",h=!!e.enableEscapeTags,c=e.contextFreeTags||[],f=e.onToken||(()=>{}),p=[g,u,'"',"\\"," "," ","=","\n","!"],d=[u," "," ","\n"],b=[" "," "],T=["="," "," "],y=t=>p.indexOf(t)>=0,N=t=>"\n"===t,x=t=>b.indexOf(t)>=0,A=t=>-1===d.indexOf(t),$=t=>T.indexOf(t)>=0,k=t=>t===u||t===g||"\\"===t,m=t=>"\\"===t,L=()=>{n++},C=t=>O(v(t,'"')),w=(t,e)=>{""!==a&&e&&(a=""),""===a&&c.includes(t)&&(a=t)},E=S(t,{onSkip:L});function W(t,e){let i=V(t,e,r,n);f(i),o[s+=1]=i}return{tokenize:function(){for(i=0;E.hasNext();)switch(i){case 1:i=function(){let t=E.getCurr(),e=E.getNext();E.skip();let r=E.substrUntilChar(g),n=0===r.length||r.indexOf(u)>=0;if(y(e)||n||E.isLast())return W(1,t),0;let s=-1===r.indexOf("="),i="/"===r[0];if(s||i){let l=E.grabWhile(t=>t!==g);return E.skip(),W(2,l),w(l,i),0}return 2}();break;case 2:i=function(){let t=E.grabWhile(t=>t!==g,!0),e=S(t,{onSkip:L}),r=e.includes(" ");for(l=0;e.hasNext();)l=function(t,e){if(1===l){let r=t=>!("="===t||x(t)),n=t.grabWhile(r),s=t.isLast(),i="="!==t.getCurr();return(t.skip(),s||i?W(4,C(n)):W(3,n),s)?0:i?1:2}if(2===l){let a=!1,o=r=>{let n=t.getPrev(),s=t.getNext(),i=x(r),l=x(s);return!!(a&&$(r))||('"'!==r||"\\"===n||!!(a=!a)||"="===s||!!l)&&(!!e||!1===i)},u=t.grabWhile(o);return(t.skip(),W(4,C(u)),t.isLast())?0:1}let g=e=>!("="===e||x(e)||t.isLast()),h=t.grabWhile(g);if(W(2,h),w(h),t.skip(),e)return 2;let c=t.includes("=");return c?1:2}(e,!r);return E.skip(),0}();break;default:i=function(){if(N(E.getCurr()))return W(6,E.getCurr()),E.skip(),n=0,r++,0;if(x(E.getCurr())){let t=E.grabWhile(x);return W(5,t),0}if(E.getCurr()===u){if(a){let e=u.length+1+a.length,s=`${u}/${a}`,i=E.grabN(e);if(i===s)return 1}else if(E.includes(g))return 1;return W(1,E.getCurr()),E.skip(),0}if(h){if(m(E.getCurr())){let l=E.getCurr(),o=E.getNext();return(E.skip(),k(o))?(E.skip(),W(1,o),0):(W(1,l),0)}let c=t=>A(t)&&!m(t),f=E.grabWhile(c);return W(1,f),0}let p=E.grabWhile(A);return W(1,p),0}()}return o.length=s+1,o},isTokenNested:function(e){let r=u+"/"+e.getValue();return t.indexOf(r)>-1}}}let z=(t,r={})=>{let n=r.openTag||"[",s=r.closeTag||"]",i=null,l=W(),a=W(),o=W(),u=W(),g=new Set,c=t=>{let e=t.getValue();return!g.has(e)&&i.isTokenNested&&i.isTokenNested(t)?(g.add(e),!0):g.has(e)},f=t=>Boolean(g.has(t)),p=t=>!r.onlyAllowTags||!r.onlyAllowTags.length||r.onlyAllowTags.indexOf(t)>=0,d=()=>{o.flushLast()&&u.flushLast()},b=()=>{let t=a.getLast();return t&&Array.isArray(t.content)?t.content:l.toArray()},T=t=>{let r=b();Array.isArray(r)&&(e(t)?p(t.tag)?r.push(t.toTagNode()):(r.push(t.toTagStart({openTag:n,closeTag:s})),t.content.length&&(t.content.forEach(t=>{r.push(t)}),r.push(t.toTagEnd({openTag:n,closeTag:s})))):r.push(t))},y=t=>{d();let e=h.create(t.getValue()),r=c(t);o.push(e),r?a.push(e):T(e)},N=t=>{d();let e=a.flushLast();if(e)T(e);else if("function"==typeof r.onError){let n=t.getValue(),s=t.getLine(),i=t.getColumn();r.onError({message:`Inconsistent tag '${n}' on line ${s} and column ${i}`,tagName:n,lineNumber:s,columnNumber:i})}},x=t=>{t.isStart()&&y(t),t.isEnd()&&N(t)},A=t=>{let e=o.getLast(),r=t.getValue(),n=f(t);if(e){if(t.isAttrName())u.push(r),e.attr(u.getLast(),"");else if(t.isAttrValue()){let s=u.getLast();s?(e.attr(s,r),u.flushLast()):e.attr(r,r)}else t.isText()?n?e.append(r):T(r):t.isTag()&&T(t.toString())}else t.isText()?T(r):t.isTag()&&T(t.toString())},$=t=>{t.isTag()?x(t):A(t)};return(i=(r.createTokenizer?r.createTokenizer:j)(t,{onToken:$,openTag:n,closeTag:s,onlyAllowTags:r.onlyAllowTags,contextFreeTags:r.contextFreeTags,enableEscapeTags:r.enableEscapeTags})).tokenize(),l.toArray()};t.TagNode=h,t.default=z,t.parse=z,Object.defineProperty(t,"__esModule",{value:!0})});

@@ -37,2 +37,3 @@ /* eslint-disable no-plusplus,no-param-reassign */ import { OPEN_BRAKET, CLOSE_BRAKET, QUOTEMARK, BACKSLASH, SLASH, SPACE, TAB, EQ, N } from '@bbob/plugin-helper';

let tagMode = TAG_STATE_NAME;
let contextFreeTag = '';
const tokens = new Array(Math.floor(buffer.length));

@@ -42,2 +43,3 @@ const openTag = options.openTag || OPEN_BRAKET;

const escapeTags = !!options.enableEscapeTags;
const contextFreeTags = options.contextFreeTags || [];
const onToken = options.onToken || (()=>{});

@@ -56,3 +58,2 @@ const RESERVED_CHARS = [

const NOT_CHAR_TOKENS = [
// ...(options.enableEscapeTags ? [BACKSLASH] : []),
openTag,

@@ -83,2 +84,10 @@ SPACE,

const unq = (val)=>unquote(trimChar(val, QUOTEMARK));
const checkContextFreeMode = (name, isClosingTag)=>{
if (contextFreeTag !== '' && isClosingTag) {
contextFreeTag = '';
}
if (contextFreeTag === '' && contextFreeTags.includes(name)) {
contextFreeTag = name;
}
};
const chars = createCharGrabber(buffer, {

@@ -155,2 +164,3 @@ onSkip

emitToken(TYPE_TAG, name2);
checkContextFreeMode(name2);
tagChars.skip();

@@ -166,25 +176,23 @@ // in cases when we has [url=someval]GET[/url] and we dont need to parse all

const currChar = chars.getCurr();
if (currChar === openTag) {
const nextChar = chars.getNext();
chars.skip();
// detect case where we have '[My word [tag][/tag]' or we have '[My last line word'
const substr = chars.substrUntilChar(closeTag);
const hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;
if (isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {
emitToken(TYPE_WORD, currChar);
return STATE_WORD;
}
// [myTag ]
const isNoAttrsInTag = substr.indexOf(EQ) === -1;
// [/myTag]
const isClosingTag = substr[0] === SLASH;
if (isNoAttrsInTag || isClosingTag) {
const name = chars.grabWhile((char)=>char !== closeTag);
chars.skip(); // skip closeTag
emitToken(TYPE_TAG, name);
return STATE_WORD;
}
return STATE_TAG_ATTRS;
const nextChar = chars.getNext();
chars.skip();
// detect case where we have '[My word [tag][/tag]' or we have '[My last line word'
const substr = chars.substrUntilChar(closeTag);
const hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;
if (isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {
emitToken(TYPE_WORD, currChar);
return STATE_WORD;
}
return STATE_WORD;
// [myTag ]
const isNoAttrsInTag = substr.indexOf(EQ) === -1;
// [/myTag]
const isClosingTag = substr[0] === SLASH;
if (isNoAttrsInTag || isClosingTag) {
const name = chars.grabWhile((char)=>char !== closeTag);
chars.skip(); // skip closeTag
emitToken(TYPE_TAG, name);
checkContextFreeMode(name, isClosingTag);
return STATE_WORD;
}
return STATE_TAG_ATTRS;
}

@@ -214,7 +222,16 @@ function stateAttrs() {

if (isWhiteSpace(chars.getCurr())) {
emitToken(TYPE_SPACE, chars.grabWhile(isWhiteSpace));
const word = chars.grabWhile(isWhiteSpace);
emitToken(TYPE_SPACE, word);
return STATE_WORD;
}
if (chars.getCurr() === openTag) {
if (chars.includes(closeTag)) {
if (contextFreeTag) {
const fullTagLen = openTag.length + SLASH.length + contextFreeTag.length;
const fullTagName = `${openTag}${SLASH}${contextFreeTag}`;
const foundTag = chars.grabN(fullTagLen);
const isEndContextFreeMode = foundTag === fullTagName;
if (isEndContextFreeMode) {
return STATE_TAG;
}
} else if (chars.includes(closeTag)) {
return STATE_TAG;

@@ -240,6 +257,8 @@ }

const isChar = (char)=>isCharToken(char) && !isEscapeChar(char);
emitToken(TYPE_WORD, chars.grabWhile(isChar));
const word1 = chars.grabWhile(isChar);
emitToken(TYPE_WORD, word1);
return STATE_WORD;
}
emitToken(TYPE_WORD, chars.grabWhile(isCharToken));
const word2 = chars.grabWhile(isCharToken);
emitToken(TYPE_WORD, word2);
return STATE_WORD;

@@ -258,7 +277,5 @@ }

case STATE_WORD:
default:
stateMode = stateWord();
break;
default:
stateMode = STATE_WORD;
break;
}

@@ -265,0 +282,0 @@ }

@@ -10,5 +10,6 @@ import { TagNode, CLOSE_BRAKET, OPEN_BRAKET, isTagNode } from '@bbob/plugin-helper';

* @param {Array<string>} opts.onlyAllowTags
* @param {Array<string>} opts.contextFreeTags
* @param {Boolean} opts.enableEscapeTags
* @param {String} opts.openTag
* @param {String} opts.closeTag
* @param {Boolean} opts.enableEscapeTags
* @return {Array}

@@ -214,5 +215,6 @@ */ const parse = (input, opts = {})=>{

onToken,
onlyAllowTags: options.onlyAllowTags,
openTag,
closeTag,
onlyAllowTags: options.onlyAllowTags,
contextFreeTags: options.contextFreeTags,
enableEscapeTags: options.enableEscapeTags

@@ -219,0 +221,0 @@ });

@@ -10,3 +10,3 @@ import { QUOTEMARK, BACKSLASH } from '@bbob/plugin-helper';

const idx = source.indexOf(char, pos);
return idx >= 0 ? source.substr(pos, idx - pos) : '';
return idx >= 0 ? source.substring(pos, idx) : '';
};

@@ -22,3 +22,4 @@ const includes = (val)=>source.indexOf(val, cursor.pos) >= 0;

};
const rest = ()=>source.substr(cursor.pos);
const rest = ()=>source.substring(cursor.pos);
const grabN = (num = 0)=>source.substring(cursor.pos, cursor.pos + num);
const curr = ()=>source[cursor.pos];

@@ -41,3 +42,3 @@ const prev = ()=>{

}
return source.substr(start, cursor.pos - start);
return source.substring(start, cursor.pos);
};

@@ -74,2 +75,6 @@ /**

/**
* @param {Number} num
* @return {String}
*/ this.grabN = grabN;
/**
* Grabs rest of string until it find a char

@@ -76,0 +81,0 @@ * @param {String} char

@@ -121,2 +121,3 @@ /* eslint-disable no-plusplus,no-param-reassign */ "use strict";

emitToken(_token.TYPE_TAG, name2);
checkContextFreeMode(name2);
tagChars.skip();

@@ -132,27 +133,25 @@ // in cases when we has [url=someval]GET[/url] and we dont need to parse all

var currChar = chars.getCurr();
if (currChar === openTag) {
var nextChar = chars.getNext();
chars.skip();
// detect case where we have '[My word [tag][/tag]' or we have '[My last line word'
var substr = chars.substrUntilChar(closeTag);
var hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;
if (isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {
emitToken(_token.TYPE_WORD, currChar);
return STATE_WORD;
}
// [myTag ]
var isNoAttrsInTag = substr.indexOf(_pluginHelper.EQ) === -1;
// [/myTag]
var isClosingTag = substr[0] === _pluginHelper.SLASH;
if (isNoAttrsInTag || isClosingTag) {
var name = chars.grabWhile(function(char) {
return char !== closeTag;
});
chars.skip(); // skip closeTag
emitToken(_token.TYPE_TAG, name);
return STATE_WORD;
}
return STATE_TAG_ATTRS;
var nextChar = chars.getNext();
chars.skip();
// detect case where we have '[My word [tag][/tag]' or we have '[My last line word'
var substr = chars.substrUntilChar(closeTag);
var hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;
if (isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {
emitToken(_token.TYPE_WORD, currChar);
return STATE_WORD;
}
return STATE_WORD;
// [myTag ]
var isNoAttrsInTag = substr.indexOf(_pluginHelper.EQ) === -1;
// [/myTag]
var isClosingTag = substr[0] === _pluginHelper.SLASH;
if (isNoAttrsInTag || isClosingTag) {
var name = chars.grabWhile(function(char) {
return char !== closeTag;
});
chars.skip(); // skip closeTag
emitToken(_token.TYPE_TAG, name);
checkContextFreeMode(name, isClosingTag);
return STATE_WORD;
}
return STATE_TAG_ATTRS;
};

@@ -184,7 +183,16 @@ var stateAttrs = function stateAttrs() {

if (isWhiteSpace(chars.getCurr())) {
emitToken(_token.TYPE_SPACE, chars.grabWhile(isWhiteSpace));
var word = chars.grabWhile(isWhiteSpace);
emitToken(_token.TYPE_SPACE, word);
return STATE_WORD;
}
if (chars.getCurr() === openTag) {
if (chars.includes(closeTag)) {
if (contextFreeTag) {
var fullTagLen = openTag.length + _pluginHelper.SLASH.length + contextFreeTag.length;
var fullTagName = "" + openTag + _pluginHelper.SLASH + contextFreeTag;
var foundTag = chars.grabN(fullTagLen);
var isEndContextFreeMode = foundTag === fullTagName;
if (isEndContextFreeMode) {
return STATE_TAG;
}
} else if (chars.includes(closeTag)) {
return STATE_TAG;

@@ -212,6 +220,8 @@ }

};
emitToken(_token.TYPE_WORD, chars.grabWhile(isChar));
var word1 = chars.grabWhile(isChar);
emitToken(_token.TYPE_WORD, word1);
return STATE_WORD;
}
emitToken(_token.TYPE_WORD, chars.grabWhile(isCharToken));
var word2 = chars.grabWhile(isCharToken);
emitToken(_token.TYPE_WORD, word2);
return STATE_WORD;

@@ -230,7 +240,5 @@ };

case STATE_WORD:
default:
stateMode = stateWord();
break;
default:
stateMode = STATE_WORD;
break;
}

@@ -257,2 +265,3 @@ }

var tagMode = TAG_STATE_NAME;
var contextFreeTag = "";
var tokens = new Array(Math.floor(buffer.length));

@@ -262,2 +271,3 @@ var openTag = options.openTag || _pluginHelper.OPEN_BRAKET;

var escapeTags = !!options.enableEscapeTags;
var contextFreeTags = options.contextFreeTags || [];
var onToken = options.onToken || function() {};

@@ -276,3 +286,2 @@ var RESERVED_CHARS = [

var NOT_CHAR_TOKENS = [
// ...(options.enableEscapeTags ? [BACKSLASH] : []),
openTag,

@@ -319,2 +328,10 @@ _pluginHelper.SPACE,

};
var checkContextFreeMode = function(name, isClosingTag) {
if (contextFreeTag !== "" && isClosingTag) {
contextFreeTag = "";
}
if (contextFreeTag === "" && contextFreeTags.includes(name)) {
contextFreeTag = name;
}
};
var chars = (0, _utils.createCharGrabber)(buffer, {

@@ -321,0 +338,0 @@ onSkip: onSkip

@@ -28,5 +28,6 @@ "use strict";

* @param {Array<string>} opts.onlyAllowTags
* @param {Array<string>} opts.contextFreeTags
* @param {Boolean} opts.enableEscapeTags
* @param {String} opts.openTag
* @param {String} opts.closeTag
* @param {Boolean} opts.enableEscapeTags
* @return {Array}

@@ -235,5 +236,6 @@ */ var parse = function(input, opts) {

onToken: onToken,
onlyAllowTags: options.onlyAllowTags,
openTag: openTag,
closeTag: closeTag,
onlyAllowTags: options.onlyAllowTags,
contextFreeTags: options.contextFreeTags,
enableEscapeTags: options.enableEscapeTags

@@ -240,0 +242,0 @@ });

@@ -34,3 +34,3 @@ "use strict";

var idx = source.indexOf(char, pos);
return idx >= 0 ? source.substr(pos, idx - pos) : "";
return idx >= 0 ? source.substring(pos, idx) : "";
};

@@ -54,4 +54,8 @@ var includes = function(val) {

var rest = function() {
return source.substr(cursor.pos);
return source.substring(cursor.pos);
};
var grabN = function(num) {
if (num === void 0) num = 0;
return source.substring(cursor.pos, cursor.pos + num);
};
var curr = function() {

@@ -76,3 +80,3 @@ return source[cursor.pos];

}
return source.substr(start, cursor.pos - start);
return source.substring(start, cursor.pos);
};

@@ -109,2 +113,6 @@ /**

/**
* @param {Number} num
* @return {String}
*/ this.grabN = grabN;
/**
* Grabs rest of string until it find a char

@@ -111,0 +119,0 @@ * @param {String} char

{
"name": "@bbob/parser",
"version": "2.8.3",
"version": "2.9.0",
"description": "A BBCode to AST Parser part of @bbob",

@@ -16,3 +16,3 @@ "keywords": [

"dependencies": {
"@bbob/plugin-helper": "^2.8.3"
"@bbob/plugin-helper": "^2.9.0"
},

@@ -54,3 +54,3 @@ "main": "lib/index.js",

"path": "./dist/index.min.js",
"threshold": "2.7 KB"
"maxSize": "3 KB"
}

@@ -67,3 +67,3 @@ ],

],
"gitHead": "0d9da27af8810756cac3a59dae421a19e7848cc7"
"gitHead": "e5c741cb9a771ae5a7247ab73c2a2f90b8d83b28"
}

@@ -61,2 +61,3 @@ /* eslint-disable no-plusplus,no-param-reassign */

let tagMode = TAG_STATE_NAME;
let contextFreeTag = '';
const tokens = new Array(Math.floor(buffer.length));

@@ -66,2 +67,3 @@ const openTag = options.openTag || OPEN_BRAKET;

const escapeTags = !!options.enableEscapeTags;
const contextFreeTags = options.contextFreeTags || [];
const onToken = options.onToken || (() => {

@@ -72,3 +74,2 @@ });

const NOT_CHAR_TOKENS = [
// ...(options.enableEscapeTags ? [BACKSLASH] : []),
openTag, SPACE, TAB, N,

@@ -92,2 +93,12 @@ ];

const checkContextFreeMode = (name, isClosingTag) => {
if (contextFreeTag !== '' && isClosingTag) {
contextFreeTag = '';
}
if (contextFreeTag === '' && contextFreeTags.includes(name)) {
contextFreeTag = name;
}
};
const chars = createCharGrabber(buffer, { onSkip });

@@ -184,2 +195,3 @@

emitToken(TYPE_TAG, name);
checkContextFreeMode(name);

@@ -200,37 +212,33 @@ tagChars.skip();

const currChar = chars.getCurr();
const nextChar = chars.getNext();
if (currChar === openTag) {
const nextChar = chars.getNext();
chars.skip();
chars.skip();
// detect case where we have '[My word [tag][/tag]' or we have '[My last line word'
const substr = chars.substrUntilChar(closeTag);
const hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;
// detect case where we have '[My word [tag][/tag]' or we have '[My last line word'
const substr = chars.substrUntilChar(closeTag);
const hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;
if (isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {
emitToken(TYPE_WORD, currChar);
if (isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {
emitToken(TYPE_WORD, currChar);
return STATE_WORD;
}
return STATE_WORD;
}
// [myTag ]
const isNoAttrsInTag = substr.indexOf(EQ) === -1;
// [/myTag]
const isClosingTag = substr[0] === SLASH;
// [myTag ]
const isNoAttrsInTag = substr.indexOf(EQ) === -1;
// [/myTag]
const isClosingTag = substr[0] === SLASH;
if (isNoAttrsInTag || isClosingTag) {
const name = chars.grabWhile((char) => char !== closeTag);
if (isNoAttrsInTag || isClosingTag) {
const name = chars.grabWhile((char) => char !== closeTag);
chars.skip(); // skip closeTag
chars.skip(); // skip closeTag
emitToken(TYPE_TAG, name);
checkContextFreeMode(name, isClosingTag);
emitToken(TYPE_TAG, name);
return STATE_WORD;
}
return STATE_TAG_ATTRS;
return STATE_WORD;
}
return STATE_WORD;
return STATE_TAG_ATTRS;
}

@@ -268,4 +276,6 @@

if (isWhiteSpace(chars.getCurr())) {
emitToken(TYPE_SPACE, chars.grabWhile(isWhiteSpace));
const word = chars.grabWhile(isWhiteSpace);
emitToken(TYPE_SPACE, word);
return STATE_WORD;

@@ -275,3 +285,12 @@ }

if (chars.getCurr() === openTag) {
if (chars.includes(closeTag)) {
if (contextFreeTag) {
const fullTagLen = openTag.length + SLASH.length + contextFreeTag.length;
const fullTagName = `${openTag}${SLASH}${contextFreeTag}`;
const foundTag = chars.grabN(fullTagLen);
const isEndContextFreeMode = foundTag === fullTagName;
if (isEndContextFreeMode) {
return STATE_TAG;
}
} else if (chars.includes(closeTag)) {
return STATE_TAG;

@@ -309,9 +328,13 @@ }

emitToken(TYPE_WORD, chars.grabWhile(isChar));
const word = chars.grabWhile(isChar);
emitToken(TYPE_WORD, word);
return STATE_WORD;
}
emitToken(TYPE_WORD, chars.grabWhile(isCharToken));
const word = chars.grabWhile(isCharToken);
emitToken(TYPE_WORD, word);
return STATE_WORD;

@@ -332,7 +355,5 @@ }

case STATE_WORD:
default:
stateMode = stateWord();
break;
default:
stateMode = STATE_WORD;
break;
}

@@ -339,0 +360,0 @@ }

@@ -13,5 +13,6 @@ import {

* @param {Array<string>} opts.onlyAllowTags
* @param {Array<string>} opts.contextFreeTags
* @param {Boolean} opts.enableEscapeTags
* @param {String} opts.openTag
* @param {String} opts.closeTag
* @param {Boolean} opts.enableEscapeTags
* @return {Array}

@@ -262,5 +263,6 @@ */

onToken,
onlyAllowTags: options.onlyAllowTags,
openTag,
closeTag,
onlyAllowTags: options.onlyAllowTags,
contextFreeTags: options.contextFreeTags,
enableEscapeTags: options.enableEscapeTags,

@@ -267,0 +269,0 @@ });

@@ -174,3 +174,4 @@ import {

export const TYPE_NEW_LINE = TOKEN_TYPE_NEW_LINE;
export { Token };
export default Token;

@@ -16,3 +16,3 @@ import {

return idx >= 0 ? source.substr(pos, idx - pos) : '';
return idx >= 0 ? source.substring(pos, idx) : '';
};

@@ -29,3 +29,4 @@ const includes = (val) => source.indexOf(val, cursor.pos) >= 0;

};
const rest = () => source.substr(cursor.pos);
const rest = () => source.substring(cursor.pos);
const grabN = (num = 0) => source.substring(cursor.pos, cursor.pos + num);
const curr = () => source[cursor.pos];

@@ -53,3 +54,3 @@ const prev = () => {

return source.substr(start, cursor.pos - start);
return source.substring(start, cursor.pos);
};

@@ -95,2 +96,7 @@ /**

/**
* @param {Number} num
* @return {String}
*/
this.grabN = grabN;
/**
* Grabs rest of string until it find a char

@@ -97,0 +103,0 @@ * @param {String} char

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc