From 35aaedc729970ae2c5aa26738babd6c9939e338c Mon Sep 17 00:00:00 2001
From: Philipp Gesang <phg@phi-gamma.net>
Date: Fri, 6 Jul 2018 16:10:17 +0200
Subject: rem, common: recognize multi-valued lines

For muliple values we simply concatenate the input with newlines.
None of the properties we implement so far need special
considerations in this regard.
---
 common.lua | 14 ++++++++++++++
 rem.lua    |  3 ++-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/common.lua b/common.lua
index 6afde62..2c68aee 100644
--- a/common.lua
+++ b/common.lua
@@ -24,6 +24,7 @@ local set_verbosity = function (n) verboselvl = n end
 
 local trim_whitespace
 local unescape_string
+local internalize_value
 do
   local P                 = lpeg.P
   local S                 = lpeg.S
@@ -41,10 +42,22 @@ do
                           + (P"\\v" / "\v")
   local p_unescape        = Cs ((p_escape_char + 1)^0)
 
+  --[[--
+
+    rfc2445, sec. 4.1.2: Properties can have multiple values, separated by a
+    literal comma, thus text commas are escaped.
+
+  --]]--
+  local p_value_char      = (  p_escape_char
+                             + P"\\," / ","
+                             + P"," / "\n")
+  local p_value           = Cs ((p_value_char + 1)^0)
+
   local lpegmatch         = lpeg.match
 
   trim_whitespace = function (s) return lpegmatch (p_ws_drop , s) end
   unescape_string = function (s) return lpegmatch (p_unescape, s) end
+  internalize_value = function (s) return lpegmatch (p_value, s) end
 end
 
 return
@@ -55,5 +68,6 @@ return
   , set_verbosity         = set_verbosity
   , trim_whitespace       = trim_whitespace
   , unescape_string       = unescape_string
+  , internalize_value     = internalize_value
   }
 
diff --git a/rem.lua b/rem.lua
index ddee9a6..43b413f 100644
--- a/rem.lua
+++ b/rem.lua
@@ -35,6 +35,7 @@ local noiseln             = common.noiseln
 local debugln             = common.debugln
 local trim_whitespace     = common.trim_whitespace
 local unescape_string     = common.unescape_string
+local internalize_value   = common.internalize_value
 
 local seconds_of_time = function (t)
   return t % 60
@@ -261,7 +262,7 @@ local rem_of_vcalendars do
   end
 
   local string_of_textdata = function (val)
-    local sane = unescape_string (val.value)
+    local sane = internalize_value (val.value)
 
     return trim_whitespace (sane)
   end
-- 
cgit v1.2.3