title: $:/plugins/local/org-gtd/parser.js type: application/javascript module-type: parser /*\ title: $:/plugins/local/org-gtd/parser.js type: application/javascript module-type: parser \*/ (function() { "use strict"; var org = require("$:/plugins/local/org-gtd/library.js"); function attr(value) { return {type: "string",value: String(value)}; } function text(value) { return {type: "text",text: String(value)}; } function element(tag,className,children,attributes) { var attrs = attributes || {}; if(className) { attrs["class"] = attr(className); } return { type: "element", tag: tag, attributes: attrs, children: children || [], isBlock: tag !== "span" }; } function headingNode(heading) { var children = [], level = Math.min(heading.level,6), classes = "tc-org-heading tc-org-level-" + heading.level; if(heading.state) { classes += " tc-org-heading-" + heading.state.toLowerCase(); children.push(element("span","tc-org-state tc-org-state-" + heading.state.toLowerCase(),[text(heading.state)])); children.push(text(" ")); } children.push(text(heading.title)); if(heading.tags.length) { children.push(text(" ")); children.push(element("span","tc-org-tags",[text(":" + heading.tags.join(":") + ":")])); } return element("h" + level,classes,children,{"data-org-line": attr(heading.sourceLine)}); } function OrgParser(type,source,options) { var parsed = org.parse(source || ""), headingsByLine = Object.create(null), tree = []; parsed.headings.forEach(function(heading) { headingsByLine[heading.line] = heading; }); parsed.lines.forEach(function(line,index) { var heading = headingsByLine[index]; if(heading) { tree.push(headingNode(heading)); } else if(/^\s*(?:SCHEDULED|DEADLINE):/.test(line)) { tree.push(element("div","tc-org-planning",[text(line.trim())])); } else if(line.trim()) { tree.push(element("div","tc-org-body-line",[text(line)])); } }); this.tree = options.parseAsInline ? [text(source || "")] : [element("div","tc-org-document",tree)]; } exports["text/x-org"] = OrgParser; })();