UNPKG

jc-marked

Version:

Markdown AST (Abstract syntax tree) parser based on finite-state machine (FSM).

1 lines 4.15 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Tree=void 0;const jc_color_1=require("jc-color"),exceps_1=require("./exceps"),loader_1=require("./loader"),metas_1=require("./metas"),regs_1=require("./regs"),types_1=require("../types");class Tree{constructor(e,t=1,r=[],s=""){if(this._nodes=[{type:"initial"}],this._lines=[],this._tree=[],this._currentState=types_1.SArticle.IDLE,this._nextState=null,this._paragraphFlag=!1,this._counter=0,this._base_order="",this._deepth=t,""!==s&&(this._base_order=s),(0,jc_color_1.isString)(e)){var a=new loader_1.Loader;this._lines=e.split("\n");for(let e=0;e<this._lines.length;e++)a.push(this._lines[e]);this._nodes=this._nodes.concat(a.nodes)}else this._lines=r,this._nodes=this._nodes.concat(e)}get lines(){return this._lines}get nodes(){return this._nodes.splice(1,this._nodes.length)}get tree(){return this._tree}get infos(){return(0,metas_1.getExtraInfos)()}get res(){return{infos:(0,metas_1.getExtraInfos)(),tree:this._tree}}run(){var t=this._nodes.concat([{type:"text",from:NaN,to:NaN}]);for(let e=0;e<this._nodes.length;e++){var r=t[e],s=t[e+1];this._handelItem(r,s)}const a=this._deepth+1;this._tree.forEach(e=>{var t;"paragraph"===e.type&&((t=new Tree(e.body,a,this._lines,""+e.order)).run(),e.body=t.tree)})}_handelItem(e,t){this._runActions(e),this._countNewState(t),this._enterState()}_runActions(t){var a=this._lines[t.index];if("initial"!==t.type)switch(this._currentState){case types_1.SArticle.IDLE:(0,jc_color_1.noop)();break;case types_1.SArticle.META:if(regs_1.default.regTitle.test(a))(0,metas_1.setTitle)(a.replace(regs_1.default.regTitle,""));else if(regs_1.default.regSubTitle.test(a))(0,metas_1.setSubTitle)(a.replace(regs_1.default.regSubTitle,""));else if(regs_1.default.regAuthor.test(a)){let e="",t="",r="",s="";var i=a.trim().replace(/^#author\s?/i,"").replace("'",'"').trim().split(/\"\s/);1===i.length?e=i[0].replace(/^"/,"").replace(/"$/,""):2===i.length?(e=i[0].replace(/^"/,"").replace(/"$/,""),l=i[1].replace(/^"/,"").replace(/"$/,""),/^.*\@.*\..*/.test(i[1])?t=l:r=l):3===i.length?(e=i[0].replace(/^"/,"").replace(/"$/,""),t=i[1].replace(/^"/,"").replace(/"$/,""),r=i[2].replace(/^"/,"").replace(/"$/,"")):3<=i.length&&(e=i[0].replace(/^"/,"").replace(/"$/,""),t=i[1].replace(/^"/,"").replace(/"$/,""),r=i[2].replace(/^"/,"").replace(/"$/,""),l=i[3].replace(/^"/,"").replace(/"$/,""),/^\+?\d*\s*\d*$/.test(l))&&(s=l),(0,metas_1.setAuthor)({name:e,email:t,homepage:r,phone:s})}else if(regs_1.default.regLastArticle.test(a)){let e="",t="";var i=a.trim().replace(/^#last\s?/i,"");regs_1.default.regLinkdText.test(i)&&(l=a.trim().replace(/^#last\s?/i,""),e=l.replace(/\(.*\)$/,"").replace(/^\[/,"").replace(/\]$/,""),t=l.replace(/^\[.*\]\(/,"").replace(/\)$/,"")),(0,metas_1.setLastArticle)(e,t)}else if(regs_1.default.regNextArticle.test(a)){let e="",t="";i=a.trim().replace(/^#next\s?/i,"");regs_1.default.regLinkdText.test(i)&&(l=a.trim().replace(/^#next\s?/i,""),e=l.replace(/\(.*\)$/,"").replace(/^\[/,"").replace(/\]$/,""),t=l.replace(/^\[.*\]\(/,"").replace(/\)$/,"")),(0,metas_1.setNextArticle)(e,t)}else regs_1.default.regSummary.test(a)?(0,metas_1.setSummary)(a.replace(regs_1.default.regSummary,"")):regs_1.default.redArticleTags.test(a)&&(i=a.trim().replace(/^#tags\s?/i,"").split(" "),(0,metas_1.setTags)(i));break;case types_1.SArticle.PARAGRAPH:this._counter++;let e="";var l={type:"paragraph",order:e=""!==this._base_order?this._base_order+"-"+this._counter:""+this._counter,name:a.replace(/^\#*\s*/,""),body:[]};this._tree.push(l),this._paragraphFlag=!0;break;case types_1.SArticle.PLAIN:(this._paragraphFlag?this.tree[this.tree.length-1].body:this._tree).push(t);break;default:throw(0,exceps_1.StateNotExistError)(`There is no state named "${this._currentState}"`)}}_countNewState(e){"title"===e.type?this._lines[e.index].replace(/\s.*$/,"").length===this._deepth&&(this._nextState=types_1.SArticle.PARAGRAPH):"meta"===e.type?this._nextState=types_1.SArticle.META:this._nextState=types_1.SArticle.PLAIN}_enterState(){this._currentState!==this._nextState&&null!==this._nextState&&(this._currentState=this._nextState)}}exports.Tree=Tree;