diff --git a/src/awk/approx.awk b/src/awk/approx.awk index 9241044..c594b8d 100644 --- a/src/awk/approx.awk +++ b/src/awk/approx.awk @@ -57,8 +57,8 @@ BEGIN { } BEGINFILE { inside = 0; rs = 0; dur = 0; summary = ""; start = "ERROR"; end = "ERROR" } /^END:VEVENT/ { print "~", start, dur ? start " " end : end, title(start, summary), fn(FILENAME); nextfile } -/^DTSTART/ && inside { start = parse() } -/^DTEND/ && inside { end = parse() } +/^DTSTART/ && inside { start = parse_dt(getparam($0), getcontent($0)) } +/^DTEND/ && inside { end = parse_dt(getparam($0), getcontent($0)) } /^DURATION/ && inside { end = parse_duration($NF); dur = 1 } /^[^ ]/ && rs { rs = 0 } /^ / && rs { summary = summary substr($0, 2) } diff --git a/src/awk/parse.awk b/src/awk/parse.awk index b32d875..cd35e52 100644 --- a/src/awk/parse.awk +++ b/src/awk/parse.awk @@ -48,8 +48,8 @@ BEGIN { } } /^END:VEVENT/ && inside { print_data(start, dur, end, summary); exit } -/^DTSTART/ && inside { start = parse() } -/^DTEND/ && inside { end = parse() } +/^DTSTART/ && inside { start = parse_dt(getparam($0), getcontent($0)) } +/^DTEND/ && inside { end = parse_dt(getparam($0), getcontent($0)) } /^DURATION/ && inside { end = parse_duration($NF); dur = 1 } /^STATUS/ && inside { status = $NF } /^[^ ]/ && rs { rs = 0 } diff --git a/src/lib/awk/icalendar.awk b/src/lib/awk/icalendar.awk index c0b60cf..4f257ce 100644 --- a/src/lib/awk/icalendar.awk +++ b/src/lib/awk/icalendar.awk @@ -5,6 +5,7 @@ function escape(str) { gsub("\\\\", "\\\\", str) + gsub("\\n", "\\n", str) gsub(";", "\\;", str) gsub(",", "\\,", str) return str @@ -37,7 +38,7 @@ function print_fold(nameparam, content, i, s) # @input str: String # @return: Unescaped string function unescape(str, i, c, c2, res) { - for(i=1; i<=length(str);i++) { + for(i = 1; i <= length(str); i++) { c = substr(str, i, 1) if (c != "\\") { res = res c @@ -57,6 +58,17 @@ function unescape(str, i, c, c2, res) { return res } +# Isolate parameter part of an iCalendar line. +# +# @input str: String +# @return: Parameter part +function getparam(str, i) { + i = index(str, ";") + if (!i) + return "" + return substr(str, i + 1, index(str, ":") - i) +} + # Isolate content part of an iCalendar line, and unescape. # # @input str: String @@ -65,22 +77,27 @@ function getcontent(str) { return unescape(substr(str, index(str, ":") + 1)) } -# Time-zone aware parsing of the date/date-time entry at the current record. +# Time-zone aware parsing of DTSTART or DTEND entries. # -# @local variables: dt +# @local variables: tz +# @input dt_param: iCalendar DTSTART or DTEND parameter string +# @input dt_content: iCalendar DTSTART or DTEND content string # @return: date or date-time string that can be used in date (1) -function parse( dt) { - # Get timezone information - for (i=2; i