diff options
Diffstat (limited to 'tiddlers/plugin-org-gtd-parser.tid')
| -rw-r--r-- | tiddlers/plugin-org-gtd-parser.tid | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/tiddlers/plugin-org-gtd-parser.tid b/tiddlers/plugin-org-gtd-parser.tid new file mode 100644 index 0000000..4aa4bd4 --- /dev/null +++ b/tiddlers/plugin-org-gtd-parser.tid @@ -0,0 +1,76 @@ +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; + +})(); |
