impr: handling of categories
This commit is contained in:
		@@ -1,24 +0,0 @@
 | 
			
		||||
@include "lib/awk/icalendar.awk"
 | 
			
		||||
 | 
			
		||||
BEGIN                     { FS = "[:;]"; }
 | 
			
		||||
/^BEGIN:(VJOURNAL|VTODO)/ { type = $2 }
 | 
			
		||||
/^END:/ && $2 == type     { exit }
 | 
			
		||||
/^(CATEGORIES|DESCRIPTION|SUMMARY|DUE)/ { prop = $1; c[prop] = $0; next; }
 | 
			
		||||
/^[^ ]/ && prop           { prop = ""; next; }
 | 
			
		||||
/^ / && prop              { c[prop] = c[prop] substr($0, 2); next; }
 | 
			
		||||
END {
 | 
			
		||||
  if (!type)
 | 
			
		||||
    exit
 | 
			
		||||
  # Process content lines, force CATEGORIES and SUMMARY as single-line
 | 
			
		||||
  c["CATEGORIES"]  = singleline(getcontent(c["CATEGORIES"]))
 | 
			
		||||
  c["DESCRIPTION"] = getcontent(c["DESCRIPTION"])
 | 
			
		||||
  c["SUMMARY"]     = singleline(getcontent(c["SUMMARY"]))
 | 
			
		||||
  c["DUE"]         = getcontent(c["DUE"])
 | 
			
		||||
  # Print
 | 
			
		||||
  if (c["DUE"])
 | 
			
		||||
    print "::: <| " substr(c["DUE"], 1, 4) "-" substr(c["DUE"], 5, 2) "-" substr(c["DUE"], 7, 2);
 | 
			
		||||
  print "# " c["SUMMARY"];
 | 
			
		||||
  print "> " c["CATEGORIES"];
 | 
			
		||||
  print "";
 | 
			
		||||
  print c["DESCRIPTION"];
 | 
			
		||||
}
 | 
			
		||||
@@ -1,7 +1,17 @@
 | 
			
		||||
# Retrieve content from iCalendar file
 | 
			
		||||
#
 | 
			
		||||
# Mandatory variable: `field`.
 | 
			
		||||
# Name of field to retrieve.
 | 
			
		||||
#
 | 
			
		||||
# Optional variable: `format`.
 | 
			
		||||
# If `format` is set to "csv", then the content is interpreted as
 | 
			
		||||
# comma-separated values, and empty values are dropped.
 | 
			
		||||
# If `format` is set to "date", then the content is interpreted as
 | 
			
		||||
# a date the output is in the form YYYY-MM-DD.
 | 
			
		||||
@include "lib/awk/icalendar.awk"
 | 
			
		||||
 | 
			
		||||
# print content of field `field`
 | 
			
		||||
BEGIN                     { FS = ":"; regex = "^" field; }
 | 
			
		||||
BEGIN                     { FS = ":"; ORS = ""; regex = "^" field; }
 | 
			
		||||
/^BEGIN:(VJOURNAL|VTODO)/ { type = $2 }
 | 
			
		||||
/^END:/ && $2 == type     { exit }
 | 
			
		||||
$0 ~ field                { line = $0;                 next; }
 | 
			
		||||
@@ -10,5 +20,22 @@ $0 ~ field                { line = $0;                 next; }
 | 
			
		||||
END {
 | 
			
		||||
  if (!type) { exit }
 | 
			
		||||
  # Process line
 | 
			
		||||
  print getcontent(line)
 | 
			
		||||
  content = getcontent(line)
 | 
			
		||||
  switch (format) {
 | 
			
		||||
    case "csv" : 
 | 
			
		||||
      split(content, a, ",")
 | 
			
		||||
      for (i in a) {
 | 
			
		||||
        if (a[i])
 | 
			
		||||
          res = res "," a[i]
 | 
			
		||||
      }
 | 
			
		||||
      print substr(res, 2)
 | 
			
		||||
      break
 | 
			
		||||
    case "date" : 
 | 
			
		||||
      if (content)
 | 
			
		||||
        print substr(parse_dt("", content), 1, 10)
 | 
			
		||||
      break
 | 
			
		||||
    default :
 | 
			
		||||
      print content
 | 
			
		||||
      break
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -131,6 +131,12 @@ ENDFILE {
 | 
			
		||||
  # Process content lines
 | 
			
		||||
  # strings
 | 
			
		||||
  cat = singleline(unescape(getcontent(c["CATEGORIES"])))
 | 
			
		||||
  split(cat, a, ",")
 | 
			
		||||
  cat = ""
 | 
			
		||||
  for (i in a)
 | 
			
		||||
    if (a[i])
 | 
			
		||||
      cat = cat "," a[i]
 | 
			
		||||
  cat = substr(cat, 2)
 | 
			
		||||
  sta = singleline(unescape(getcontent(c["STATUS"])))
 | 
			
		||||
  sum = singleline(unescape(getcontent(c["SUMMARY"])))
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,25 +4,36 @@ BEGIN {
 | 
			
		||||
  FS=":"; 
 | 
			
		||||
  zulu = strftime("%Y%m%dT%H%M%SZ", systime(), 1);
 | 
			
		||||
}
 | 
			
		||||
desc                 { desc = desc "\\n" escape($0);                  next; }
 | 
			
		||||
/^::: \|>/ && !start { gsub("\"", ""); start = substr(zulu, 1, 8);    next; }
 | 
			
		||||
/^::: <\| / && !due  { gsub("\"", ""); due = substr($0, 8);           next; }
 | 
			
		||||
/^# / && !summary    { summary = escape(substr($0, 3));               next; }
 | 
			
		||||
/^> / && !categories { categories = escape_but_commas(substr($0, 3)); next; }
 | 
			
		||||
desc                 { desc = desc "\\n" escape($0);                      next; }
 | 
			
		||||
/^::: \|>/ && !start { gsub("\"", ""); start = substr(zulu, 1, 8);        next; }
 | 
			
		||||
/^::: <\|/ && !due   { gsub("\"", ""); due = "D" substr($0, 8);           next; }
 | 
			
		||||
/^# / && !summary    { summary = "S" escape(substr($0, 3));               next; }
 | 
			
		||||
/^> / && !categories { categories = "C" escape_but_commas(substr($0, 3)); next; }
 | 
			
		||||
!$0 && !el           { el = 1;                                        next; }
 | 
			
		||||
!el                  { print "Unrecognized header on line "NR": " $0 > "/dev/stderr"; exit 1; }
 | 
			
		||||
                     { desc = "D" escape($0);                         next; }
 | 
			
		||||
                     { desc = "D" escape($0);                             next; }
 | 
			
		||||
END {
 | 
			
		||||
  # Sanitize input
 | 
			
		||||
  type = due ? "VTODO" : "VJOURNAL"
 | 
			
		||||
  due = substr(due, 2)
 | 
			
		||||
  summary = substr(summary, 2)
 | 
			
		||||
  categories = substr(categories, 2)
 | 
			
		||||
  desc = substr(desc, 2)
 | 
			
		||||
  if (categories) {
 | 
			
		||||
    split(categories, a, ",")
 | 
			
		||||
    categories = ""
 | 
			
		||||
    for (i in a)
 | 
			
		||||
      if (a[i])
 | 
			
		||||
        categories = categories "," a[i]
 | 
			
		||||
    categories = substr(categories, 2)
 | 
			
		||||
  }
 | 
			
		||||
  if (due) {
 | 
			
		||||
    # Use command line `date` for parsing
 | 
			
		||||
    cmd = "date -d \"" due "\" +\"%Y%m%d\"";
 | 
			
		||||
    suc = cmd | getline res
 | 
			
		||||
    suc = cmd | getline due
 | 
			
		||||
    close(cmd)
 | 
			
		||||
    if (suc != 1)
 | 
			
		||||
      exit 1
 | 
			
		||||
    due = res ? res : ""
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # print ical
 | 
			
		||||
@@ -52,7 +63,7 @@ END {
 | 
			
		||||
  }
 | 
			
		||||
  if (summary)    print_fold("SUMMARY:",     summary);
 | 
			
		||||
  if (categories) print_fold("CATEGORIES:",  categories);
 | 
			
		||||
  if (desc)       print_fold("DESCRIPTION:", substr(desc, 2));
 | 
			
		||||
  if (desc)       print_fold("DESCRIPTION:", desc);
 | 
			
		||||
  print "END:" type;
 | 
			
		||||
  print "END:VCALENDAR"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,30 +6,43 @@ BEGIN {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ENDFILE { 
 | 
			
		||||
  if (NR == FNR && due) {
 | 
			
		||||
    # Use command line `date` for parsing
 | 
			
		||||
    cmd = "date -d \"" due "\" +\"%Y%m%d\"";
 | 
			
		||||
    suc = cmd | getline res
 | 
			
		||||
    close(cmd)
 | 
			
		||||
    if (suc != 1)
 | 
			
		||||
      exit 1
 | 
			
		||||
    due = res ? res : ""
 | 
			
		||||
  if (NR == FNR) {
 | 
			
		||||
    due = substr(due, 2)
 | 
			
		||||
    summary = substr(summary, 2)
 | 
			
		||||
    categories = substr(categories, 2)
 | 
			
		||||
    desc = substr(desc, 2)
 | 
			
		||||
    if (categories) {
 | 
			
		||||
      split(categories, a, ",")
 | 
			
		||||
      categories = ""
 | 
			
		||||
      for (i in a)
 | 
			
		||||
        if (a[i])
 | 
			
		||||
          categories = categories "," a[i]
 | 
			
		||||
      categories = substr(categories, 2)
 | 
			
		||||
    }
 | 
			
		||||
    if (due) {
 | 
			
		||||
      # Use command line `date` for parsing
 | 
			
		||||
      cmd = "date -d \"" due "\" +\"%Y%m%d\"";
 | 
			
		||||
      suc = cmd | getline due
 | 
			
		||||
      close(cmd)
 | 
			
		||||
      if (suc != 1)
 | 
			
		||||
        exit 1
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
NR == FNR && desc                 { desc = desc "\\n" escape($0);                  next; }
 | 
			
		||||
NR == FNR && /^::: <\| / && !due  { gsub("\"",""); due = substr($0, 8);            next; }
 | 
			
		||||
NR == FNR && /^# / && !summary    { summary = escape(substr($0, 3));               next; }
 | 
			
		||||
NR == FNR && /^> / && !categories { categories = escape_but_commas(substr($0, 3)); next; }
 | 
			
		||||
NR == FNR && !$0 && !el           { el = 1;                                        next; }
 | 
			
		||||
NR == FNR && desc                 { desc = desc "\\n" escape($0);                      next; }
 | 
			
		||||
NR == FNR && /^::: <\|/ && !due   { gsub("\"",""); due = "D" substr($0, 8);            next; }
 | 
			
		||||
NR == FNR && /^# / && !summary    { summary = "S" escape(substr($0, 3));               next; }
 | 
			
		||||
NR == FNR && /^> / && !categories { categories = "C" escape_but_commas(substr($0, 3)); next; }
 | 
			
		||||
NR == FNR && !$0 && !el           { el = 1;                                            next; }
 | 
			
		||||
NR == FNR && !el                  { print "Unrecognized header on line "NR": " $0 > "/dev/stderr"; exit 1; }
 | 
			
		||||
NR == FNR                         { desc = "D" escape($0);                         next; }
 | 
			
		||||
NR == FNR                         { desc = "D" escape($0);                             next; }
 | 
			
		||||
due && type == "VJOURNAL"         { print "Notes and journal entries do not have due dates." > "/dev/stderr"; exit 1; }
 | 
			
		||||
/^BEGIN:(VJOURNAL|VTODO)/         { type = $2; print;                              next; }
 | 
			
		||||
/^X-ALT-DESC/ && type             {                                                next; } # drop this alternative description
 | 
			
		||||
/^ / && type                      {                                                next; } # drop this folded line (the only content with folded lines will be updated)
 | 
			
		||||
/^(DUE|SUMMARY|CATEGORIES|DESCRIPTION|LAST-MODIFIED)/ && type {                    next; } # skip for now, we will write updated fields at the end
 | 
			
		||||
/^SEQUENCE/ && type               { seq = $2;                                      next; } # store sequence number and skip
 | 
			
		||||
/^BEGIN:(VJOURNAL|VTODO)/         { type = $2; print;                                  next; }
 | 
			
		||||
/^X-ALT-DESC/ && type             {                                                    next; } # drop this alternative description
 | 
			
		||||
/^ / && type                      {                                                    next; } # drop this folded line (the only content with folded lines will be updated)
 | 
			
		||||
/^(DUE|SUMMARY|CATEGORIES|DESCRIPTION|LAST-MODIFIED)/ && type {                        next; } # skip for now, we will write updated fields at the end
 | 
			
		||||
/^SEQUENCE/ && type               { seq = $2;                                          next; } # store sequence number and skip
 | 
			
		||||
/^END:/ && type == $2 {
 | 
			
		||||
  seq = seq ? seq + 1 : 1;
 | 
			
		||||
  print "SEQUENCE:" seq;
 | 
			
		||||
@@ -37,7 +50,7 @@ due && type == "VJOURNAL"         { print "Notes and journal entries do not have
 | 
			
		||||
  if (due) print "DUE;VALUE=DATE:" due;
 | 
			
		||||
  print_fold("SUMMARY:",     summary);
 | 
			
		||||
  print_fold("CATEGORIES:",  categories);
 | 
			
		||||
  print_fold("DESCRIPTION:", substr(desc, 2));
 | 
			
		||||
  print_fold("DESCRIPTION:", desc);
 | 
			
		||||
  type = "";
 | 
			
		||||
}
 | 
			
		||||
{ print }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user