67 lines
2.2 KiB
Awk
67 lines
2.2 KiB
Awk
## src/awk/approx.awk
|
|
##
|
|
## Generate single-line approximate information for every iCalendar argument.
|
|
## The fields in each line are separated by "\t"
|
|
## The fields are the following:
|
|
## 1. "~" (constant, indicating that the lines contains approximate information)
|
|
## 2. start (this can be used in date (1))
|
|
## 3. end (this can be used in date (1)
|
|
## 4. string to display
|
|
## 5. filename (collection/name)
|
|
##
|
|
## @assign collection_labels: See configuration of the current program.
|
|
|
|
@include "lib/awk/icalendar.awk"
|
|
|
|
# Functions
|
|
|
|
# Get relative file path.
|
|
#
|
|
# @local variables: n, a
|
|
# @input path: Path to file
|
|
# @return: File path of depth 1
|
|
function fn(path, n, a) {
|
|
n = split(path, a, "/")
|
|
return a[n-1] "/" a[n]
|
|
}
|
|
|
|
# Generate title string that will be displayed to user. Here, the start date
|
|
# gets a monthly resolution.
|
|
#
|
|
# @input start: Parsed content of DTSTART field
|
|
# @input summary: Content of SUMMARY field
|
|
# @return: colorized single-line title string
|
|
function title(start, summary) {
|
|
summary = getcontent(summary)
|
|
gsub("\n", " ", summary) # This will be put on a single line
|
|
gsub("\\t", " ", summary) # we use "\t" as delimiter
|
|
depth = split(FILENAME, path, "/")
|
|
collection = depth > 1 ? path[depth-1] : ""
|
|
collection = collection in collection2label ? collection2label[collection] : collection
|
|
return FAINT "~ " collection " " gensub(/^[^0-9]*([0-9]{4})([0-9]{2}).*$/, "\\1-\\2", "1", start) " " summary OFF
|
|
}
|
|
|
|
# AWK program
|
|
BEGIN {
|
|
FS="[:;=]"
|
|
OFS="\t"
|
|
split(collection_labels, mapping, ";")
|
|
for (map in mapping)
|
|
{
|
|
split(mapping[map], m, "=")
|
|
collection2label[m[1]] = m[2]
|
|
}
|
|
# Colors
|
|
FAINT = "\033[2m"
|
|
OFF = "\033[m"
|
|
}
|
|
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() }
|
|
/^DURATION/ && inside { end = parse_duration($NF); dur = 1 }
|
|
/^[^ ]/ && rs { rs = 0 }
|
|
/^ / && rs { summary = summary substr($0, 2) }
|
|
/^SUMMARY/ && inside { rs = 1; summary = $0 }
|
|
/^BEGIN:VEVENT/ { inside = 1 }
|