summaryrefslogtreecommitdiff
path: root/awk/index_positions.awk
diff options
context:
space:
mode:
Diffstat (limited to 'awk/index_positions.awk')
-rw-r--r--awk/index_positions.awk69
1 files changed, 69 insertions, 0 deletions
diff --git a/awk/index_positions.awk b/awk/index_positions.awk
new file mode 100644
index 0000000..36e9cbe
--- /dev/null
+++ b/awk/index_positions.awk
@@ -0,0 +1,69 @@
+BEGIN {
+ FS="|";
+
+ fc_tag = ":" or_default(fc_tag, "fc") ":";
+ suspended_tag = ":" or_default(suspended_tag, "suspended") ":";
+ review_data_drawer = ":" or_default(review_data_drawer, "REVIEW_DATA") ":";
+ type_property = or_default(type_property, "FC_TYPE");
+ created_property = or_default(created_property, "FC_CREATED");
+}
+
+## Heading Parsing
+
+/^\*+[ \t]+.*$/ {
+ # tag re based on org-tag-re
+ match($0, /^\*+[ \t]+.*[ \t]+(:([a-zA-Z0-9_@#%]+:)+)$/, a)
+ tags = a[1]
+
+ id = "none";
+
+ if (tags ~ fc_tag) {
+ in_card = 1;
+ suspended = (tags ~ suspended_tag);
+ } else {
+ in_card = 0;
+ }
+ next
+}
+
+## Property parsing
+
+in_card && /:PROPERTIES:/ {
+ in_properties = 1;
+ delete properties;
+}
+
+in_properties && match($0, /^[ \t]*:([a-zA-Z0-9_]+):[ \t]*(.+)$/, a) {
+ properties[a[1]] = trim_surrounding(a[2]);
+}
+
+in_properties && /:END:/ {
+ in_properties = 0;
+}
+
+## Review data parsing
+
+in_card && $0 ~ review_data_drawer {
+ in_data = 1;
+}
+
+in_data && /:END:/ {
+ in_data = 0;
+}
+
+in_data && /^\|.*\|$/ {
+ # Make sure we're inside a data block,
+ # check NF to skip the |--+--| table separator
+ # match on $2 to skip the table header
+ if (in_data == 1 && NF == 7 && $2 !~ "position") {
+ id = properties["ID"];
+ type = properties[type_property];
+
+ position = trim($2);
+ ease = trim($3);
+ box = trim($4);
+ interval = trim($5);
+ due = trim_surrounding($6);
+ print FILENAME "\t" id "\t" type "\t" suspended "\t" position "\t" ease "\t" box "\t" interval "\t" due;
+ }
+}