function Runic(raw,tables) { this.tables = tables; this.raw = raw; this.runes = { "&":{glyph:"&",tag:"p",class:""}, "~":{glyph:"~",tag:"list",sub:"ln",class:"parent",stash:true}, "-":{glyph:"-",tag:"list",sub:"ln",class:"",stash:true}, "=":{glyph:"=",tag:"list",sub:"ln",class:"mini",stash:true}, "!":{glyph:"!",tag:"table",sub:"tr",wrap:"th",class:"outline",stash:true}, "|":{glyph:"|",tag:"table",sub:"tr",wrap:"td",class:"outline",stash:true}, "#":{glyph:"#",tag:"code",sub:"ln",class:"",stash:true}, "%":{glyph:"%"}, "?":{glyph:"?",tag:"note",class:""}, ":":{glyph:":",tag:"info",class:""}, "*":{glyph:"*",tag:"h2",class:""}, "+":{glyph:"+",tag:"hs",class:""}, ">":{glyph:">",tag:"",class:""}, "$":{glyph:">",tag:"",class:""}, "@":{glyph:"@",tag:"quote",class:""} } this.stash = { rune : "", all : [], add : function(rune,item){ this.rune = this.copy(rune) this.all.push({rune:rune,item:item}); }, pop : function(){ var copy = this.copy(this.all); this.all = []; return copy; }, is_pop : function(rune){ return this.all.length > 0 && rune.tag != this.rune.tag; }, length: function() { return this.all.length; }, copy : function(data){ return JSON.parse(JSON.stringify(data)); } } this.parse = function(raw = this.raw) { if(!raw){ return ""; } var html = ""; var lines = raw; var lines = !Array.isArray(raw) ? raw.toString().split("\n") : raw; for(id in lines){ var char = lines[id].substr(0,1).trim().toString() var rune = this.runes[char]; var trail = lines[id].substr(1,1); var line = lines[id].substr(2).to_markup(); if(!line || line.trim() == ""){ continue; } if(!rune){ console.log(`Unknown rune:${char} : ${line}`); continue; } if(trail != " "){ console.warn("Runic",`Non-rune[${trail}] at:${id}(${line})`); continue; } if(this.stash.is_pop(rune)){ html += this.render_stash(); } if(char == "$"){ html += `

${Ø("operation").request(line).to_markup()}

`; continue; } if(char == "%"){ html += this.media(line); continue; } if(char == "@"){ html += this.quote(line); continue; } if(char == ":"){ html += this.info(line); continue; } if(rune.stash === true){ this.stash.add(rune,line) ; continue; } html += this.render(line,rune); } if(this.stash.length() > 0){ html += this.render_stash(); } return html; } this.render_stash = function() { var rune = this.stash.rune; var stash = this.stash.pop(); var html = ""; for(id in stash){ var rune = stash[id].rune; var line = stash[id].item; html += rune.wrap ? `<${rune.sub}><${rune.wrap}>${line.replace(/\|/g,`<${rune.wrap}>`).trim()}` : `<${rune.sub}>${line}`; } return `<${rune.tag} class='${rune.class}'>${html}` } this.render = function(line = "",rune = null) { if(rune && rune.tag == "img"){ return ``; } if(rune && rune.tag == "table"){ return "HEY"; } return rune ? (rune.tag ? `<${rune.tag} class='${rune.class}'>${line}` : line) : ""; } this.media = function(val) { var service = val.split(" ")[0]; var id = val.split(" ")[1]; if(service == "itchio"){ return ``; } if(service == "bandcamp"){ return ``; } if(service == "youtube"){ return ``; } if(service == "custom"){ return ``; } return `` } this.quote = function(content) { var parts = content.split(" | ") var text = parts[0] var author = parts[1] var source = parts[2] var link = parts[3] return `

${text.to_markup()}

${author}${source && link ? `, ${source}` : source ? `, ${source}` : ''}

` } this.info = function(content) { var key = content.split("|")[0].trim() var term = this.tables.lexicon[key.toUpperCase()] var log = term.logs[0] var glyph = term.glyph(); if(!log){ return '' } return `{{${key.capitalize()}}}${log.name ? log.name : log.task.capitalize()}${log.time.offset_format(new Date().desamber(),true).capitalize()}, ${log.time}`.to_markup() } this.toString = function() { return this.parse(); } }