simple-xml-to-json
Version:
Convert XML to JSON - Fast & Simple
2 lines (1 loc) • 4.85 kB
JavaScript
function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var t,n,r,E,T,u,a,s,c,o,l,N;function i(){return n?t:(n=1,t={BUILD:{COMPTIME:!0},NODE_TYPE:{ATTRIBUTE:"ATTRIBUTE",CONTENT:"CONTENT",ELEMENT:"ELEMENT",ROOT:"ROOT"},TOKEN_TYPE:{OPEN_BRACKET:"OPEN_BRACKET",ELEMENT_TYPE:"ELEMENT_TYPE",CLOSE_ELEMENT:"CLOSE_ELEMENT",ATTRIB_NAME:"ATTRIB_NAME",ATTRIB_VALUE:"ATTRIB_VALUE",ASSIGN:"ASSIGN",CLOSE_BRACKET:"CLOSE_BRACKET",CONTENT:"CONTENT",EOF:"EOF"}})}function O(){if(u)return T;u=1;return T={Token:(e,t)=>({type:e,value:t})}}function f(){if(s)return a;s=1;const{BUILD:e,TOKEN_TYPE:t}=i(),{Token:n}=O(),r=n("EOF"),E=e=>" "===e||"\n"===e||"\r"===e||"\t"===e,T=e=>e.replace(/'/g,"'");return a={createLexer:function(e){let t=null,u=(e=>{let t=0;for(;t<e.length&&E(e[t]);)t++;return((e,t)=>{if(e.startsWith("<?xml",t)){const n=e.length;for(;t<n;)if("?"!==e[t])t++;else{if(">"===e[t+1])return t+2;t++}}return t})(e,t)})(e),a=[];const s=()=>e[u],c=()=>t!==r&&u<e.length,o=e=>'"'===e||"'"===e,l=()=>{for(;c()&&E(e[u]);)u++},N=t=>{if(c()){if("<"===e[u]){let t="<";return u++,c()&&"/"===e[u]?(u++,t="</"):c()&&"!"===e[u]&&"-"===e[u+1]&&"-"===e[u+2]&&(u++,u++,u++,t="\x3c!--"),t}if("/"===s()){let e="/";return u++,c()&&">"===s()&&(u++,e="/>"),e}if("="===e[u]||">"===e[u]){const t=e[u];return u++,t}}return i(!!t)},i=t=>{const n=t?/[^>=<]/u:/[a-zA-Z0-9_:-]/;let r=u;for(;c()&&e[u].match(n);)u++;return T(e.substring(r,u))},O=()=>{const E=u;l();const f=u-E;if(c())if(t&&"OPEN_BRACKET"===t.type){l();const e=N(!1);t=n("ELEMENT_TYPE",e),a.push(e)}else if(t&&"ASSIGN"===t.type){c()&&o(s())&&u++;const r=e[u-1];let E=u;for(;c()&&s()!==r;)u++;const a=T(e.substring(E,u));u++,t=n("ATTRIB_VALUE",a)}else{l();let r=N(!0);switch(r){case"=":t="ATTRIB_NAME"===t.type?n("ASSIGN"):n("CONTENT",r);break;case"</":{const r=u;for(;">"!==e[u];)u++;t=n("CLOSE_ELEMENT",e.substring(r,u)),u++,a.pop();break}case"/>":{const e=a.pop();t=n("CLOSE_ELEMENT",e);break}case"\x3c!--":{const t=["!","-","-"];for(;c()&&(">"!==t[2]||"-"!==t[1]||"-"!==t[0]);)t.shift(),t.push(e[u]),u++;return O()}case">":t=n("CLOSE_BRACKET");break;case"<":t=n("OPEN_BRACKET");break;default:if(r&&r.length>0){if("CLOSE_BRACKET"===t.type){let e="";"<"!==s()&&(e=i(!0)),t=n("CONTENT",r+e)}else if("ATTRIB_NAME"!==t.type&&"CONTENT"!==t.type)"CLOSE_ELEMENT"===t.type?(r=" ".repeat(f)+r,t=n("CONTENT",r)):t=n("ATTRIB_NAME",r);else{const e=" ".repeat(f)+r;t=n("CONTENT",e)}break}{const t='Unknown Syntax : "'+e[u]+'"';throw new Error(t)}}}else t=r;return t};return{peek:s,next:O,hasNext:c}}}}function p(){if(o)return c;o=1;const{TOKEN_TYPE:e}=i(),{createLexer:t}=f(),{Token:n}=O(),[r,E,T,u]=["ROOT","ELEMENT","ATTRIBUTE","CONTENT"],a=(e,t)=>({type:e,value:t}),s=e=>a(u,e),l=(e,t,n)=>a(E,{type:e,attributes:t,children:n}),N=(e,t)=>a(T,{name:e,value:t}),p=(e,t)=>{const n=[];for(;e.hasNext();){const r=e.next();switch(r.type){case"OPEN_BRACKET":{const t=e.next(),[r,E]=A(e);let T=[];"CLOSE_ELEMENT"!==E.type&&(T=p(e,t)),T&&T.length>0&&"CONTENT"===T[0].type&&(T=C(T)),n.push(l(t.value,r,T));break}case"CLOSE_ELEMENT":if(r.value===t.value)return n;break;case"CONTENT":n.push(s(r.value));break;case"EOF":return n;default:throw new Error(`Unknown Lexem type: ${r.type} "${r.value}, scoping element: ${t.value}"`)}}return n},A=e=>{const t=[];let n=e.peek();if(!e.hasNext()||n&&"CLOSE_BRACKET"===n.type||n&&"CLOSE_ELEMENT"===n.type)return[t,n];for(n=e.next();e.hasNext()&&n&&"CLOSE_BRACKET"!==n.type&&"CLOSE_ELEMENT"!==n.type;){const r=n;"content"===r.value&&(r.value="@content"),e.next();const E=e.next(),T=N(r.value,E.value);t.push(T),n=e.next()}return[t,n]};function C(e){let t=[],n="";return e.forEach((e=>{"CONTENT"===e.type?n+=e.value:(n.length&&(t.push(s(n)),n=""),t.push(e))})),n.length&&t.push(s(n)),t}return c={AttribNode:N,ContentNode:s,ElementNode:l,Node:a,transpile:function(e,E){const T=(e=>a(r,{children:p(e,n(r,"ROOT"))}))(t(e));return E?E.convert(T):T}},c}var A=e(function(){if(N)return l;N=1;const e=function(){if(E)return r;E=1;const{NODE_TYPE:e}=i(),t=e=>{if(!e)return null;const r={};switch(e.type){case"ELEMENT":{let E={};const T=u(e.value.attributes),a=t(e.value.children);if(T&&(E=Object.assign(E,T)),a){const t=n(e.value.children);E=Object.assign(E,t)}r[e.value.type]=E;break}case"ATTRIBUTE":{const t=e.value;r[t.name]=t.value;break}case"CONTENT":return{content:e.value}}return r},n=e=>e&&Array.isArray(e)&&0!==e.length?T(e)?{content:e[0].value}:{children:e.map(t)}:null,T=e=>e&&Array.isArray(e)&&1===e.length&&"CONTENT"===e[0].type,u=e=>e&&Array.isArray(e)?e.map(t).reduce(((e,t)=>Object.assign(e,t)),{}):null;return r={convert:e=>t(e.value.children[0])}}(),{transpile:t}=p();return l={convertXML:function(n,r){return t(n,r||e)},createAST:function(e){return t(e)}}}());const C=A.convertXML,L=A.createAST;export{C as convertXML,L as createAST,A as default};