aboutsummaryrefslogtreecommitdiffstats
path: root/tiddlers/plugin-org-gtd-parser.tid
blob: 4aa4bd4317d6e90bfdbb9ab8d53f9fec9bbc81ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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;

})();