diff options
Diffstat (limited to 'awk')
-rw-r--r-- | awk/index.awk | 37 | ||||
-rw-r--r-- | awk/utils.awk | 23 |
2 files changed, 32 insertions, 28 deletions
diff --git a/awk/index.awk b/awk/index.awk index 09f8d09..750ed9f 100644 --- a/awk/index.awk +++ b/awk/index.awk @@ -23,31 +23,11 @@ BEGIN { print "("; } -# Convert an ISO8601 timestamp to an Emacs timestamp -# (second_upper_16_bit, second_lower_16_bit) -function parse_time(time) { - # mktime expects a format of "YYYY MM DD HH MM SS" - # and doesn't care about the trailing space left by the "Z" - gsub(/[\-T:Z]/, " ", time); - - ts = mktime(time, 1); - ts_h = rshift(ts, 16); - ts_l = and(ts, 0xffff); - - return "(" ts_h " " ts_l ")"; -} - -# TODO: I'm sure there are cases not covered by this -function escape_filename(str) { - gsub(/\\/, "\\\\", str); - gsub(/"/, "\\\"", str); - return str; -} - ## File Parsing BEGINFILE { # Reset filetags + delete parent_tags; parent_tags[0] = ""; state = state_file; } @@ -55,13 +35,14 @@ BEGINFILE { ## Filetags match($0, /#\+FILETAGS:[ \t]+(.*)/, a) { - parent_tags[0] = a[1]; + # Combine tags to handle multiple FILETAGS lines + parent_tags[0] = combine_tags(a[1], parent_tags[0]); next; } ## Heading Parsing -match($0, /^(\*)+[ \t]+.*$/, a) { +match($0, /^(\*+)[ \t]+.*$/, a) { level = length(a[1]); tags = ""; @@ -114,19 +95,19 @@ $0 ~ review_data_drawer { local_tags = parent_tags[level]; print " (" \ - ":path \"" escape_filename(FILENAME) "\"" \ - " :id \"" properties["ID"] "\"" \ + ":path " escape_string(FILENAME) \ + " :id " escape_string(properties["ID"]) \ " :type " properties[type_property] \ " :created " parse_time(properties[created_property]) \ " :suspended " (suspended ? "t" : "nil") \ - " :inherited-tags \"" inherited_tags "\"" \ - " :local-tags \"" local_tags "\"" \ + " :inherited-tags " escape_string(inherited_tags) \ + " :local-tags " escape_string(local_tags) \ " :positions ("; # Card positions for (i = 1; i < review_index; i++) { print " (" \ - ":position \"" review_data[i]["position"] "\"" \ + ":position " escape_string(review_data[i]["position"]) \ " :ease " review_data[i]["ease"] \ " :box " review_data[i]["box"] \ " :interval " review_data[i]["interval"] \ diff --git a/awk/utils.awk b/awk/utils.awk index 7384ea0..358f024 100644 --- a/awk/utils.awk +++ b/awk/utils.awk @@ -26,7 +26,30 @@ function or_default(var, def) { function combine_tags(tags1, tags2) { if (tags1 == "") { return tags2; + } else if (tags2 == "") { + return tags1; } else { return substr(tags1, 0, length(tags1) - 1) tags2 } } + +# Convert an ISO8601 timestamp to an Emacs timestamp +# (second_upper_16_bit, second_lower_16_bit) +function parse_time(time) { + # mktime expects a format of "YYYY MM DD HH MM SS" + # and doesn't care about the trailing space left by the "Z" + gsub(/[\-T:Z]/, " ", time); + + ts = mktime(time, 1); + ts_h = rshift(ts, 16); + ts_l = and(ts, 0xffff); + + return "(" ts_h " " ts_l ")"; +} + +# TODO: I'm sure there are cases not covered by this +function escape_string(str) { + gsub(/\\/, "\\\\", str); + gsub(/"/, "\\\"", str); + return "\"" str "\""; +} |