diff --git a/gocal_test.go b/gocal_test.go index a7a5cfd..c0d96eb 100644 --- a/gocal_test.go +++ b/gocal_test.go @@ -276,3 +276,28 @@ func Test_DurationEvent(t *testing.T) { assert.Equal(t, gc.Events[0].End.Second(), 30) } } + +const newlineICS = `BEGIN:VCALENDAR +BEGIN:VEVENT +UID:0001@example.net +DTSTAMP:20170419T172300Z +DTSTART;VALUE=DATE:20190419 +DTEND;VALUE=DATE:20190419 +DESCRIPTION:line1\nline2\Nline3 +END:VEVENT +END:VCALENDAR` + +func Test_Newline(t *testing.T) { + gc := NewParser(strings.NewReader(newlineICS)) + tz, _ := time.LoadLocation("Asia/Omsk") + start := time.Date(2019, 4, 19, 0, 0, 0, 0, tz) + gc.Start = &start + end := time.Date(2019, 4, 19, 23, 59, 59, 0, tz) + gc.End = &end + err := gc.Parse() + + assert.Nil(t, err) + t.Log(gc.Events) + assert.Equal(t, 1, len(gc.Events)) + assert.Equal(t, "line1\nline2\nline3", gc.Events[0].Description) +} diff --git a/parser/line.go b/parser/line.go index 2e194d7..33e05d9 100644 --- a/parser/line.go +++ b/parser/line.go @@ -36,10 +36,14 @@ func ParseParameters(p string) (string, map[string]string) { return tokens[0], parameters } +// Unescapes strings according to section 3.3.11 of RFC 5545 +// https://tools.ietf.org/html/rfc5545#section-3.3.11 func UnescapeString(l string) string { l = strings.Replace(l, `\\`, `\`, -1) l = strings.Replace(l, `\;`, `;`, -1) l = strings.Replace(l, `\,`, `,`, -1) + l = strings.Replace(l, `\n`, "\n", -1) + l = strings.Replace(l, `\N`, "\n", -1) return l } diff --git a/parser/line_test.go b/parser/line_test.go index 8dde200..4bff6bf 100644 --- a/parser/line_test.go +++ b/parser/line_test.go @@ -20,3 +20,10 @@ func Test_UnescapeString(t *testing.T) { assert.Equal(t, `Hello, world; lorem \ipsum.`, l) } + +func Test_UnescapeStringWithNewline(t *testing.T) { + l := `line1\nline2\Nline3` + l = UnescapeString(l) + + assert.Equal(t, "line1\nline2\nline3", l) +}