aboutsummaryrefslogtreecommitdiffstats
path: root/tiddlers/plugin-org-gtd-parser.tid
diff options
context:
space:
mode:
Diffstat (limited to 'tiddlers/plugin-org-gtd-parser.tid')
-rw-r--r--tiddlers/plugin-org-gtd-parser.tid76
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;
+
+})();