diff --git a/src/tick/alpha/ical.clj b/src/tick/alpha/ical.clj index 4d1f82e..09818b6 100644 --- a/src/tick/alpha/ical.clj +++ b/src/tick/alpha/ical.clj @@ -262,9 +262,10 @@ (defn unfolding-line-seq* [^java.io.BufferedReader rdr hold] (if-let [line (.readLine rdr)] - (if (= (.charAt line 0) \space) - (recur rdr (conj hold line)) - (cons (str/join hold) (lazy-seq (unfolding-line-seq* rdr [line])))) + (cond + (.isEmpty line) (recur rdr hold) + (= (.charAt line 0) \space) (recur rdr (conj hold (.substring line 1))) + :else (cons (str/join hold) (lazy-seq (unfolding-line-seq* rdr [line])))) [(str/join hold)])) (defn unfolding-line-seq [^java.io.BufferedReader rdr] diff --git a/test/tick/alpha/ical_test.clj b/test/tick/alpha/ical_test.clj index 6b4e10a..8849411 100644 --- a/test/tick/alpha/ical_test.clj +++ b/test/tick/alpha/ical_test.clj @@ -40,3 +40,38 @@ (is (= "DTSTART" name)) (is (= "US-EAST" (get params "TZID"))) (is (= "20180116T140000" value))))) + +(def multiline + "X-APPLE-STRUCTURED-LOCATION;VALUE=URI;X-SOME-HEADER-BREAKING-SOMEWHERE-AT- + 75=foobar;X-TITLE=Some Place:geo:44.815458,20.462758") + +(deftest parse-line-folding-test + (testing "Folded lines can be parsed" + (is (= {:name "X-APPLE-STRUCTURED-LOCATION", + :params + {"VALUE" "URI", + "X-SOME-HEADER-BREAKING-SOMEWHERE-AT-75" "foobar", + "X-TITLE" "Some Place"}, + :value "geo:44.815458,20.462758", + :string-value "geo:44.815458,20.462758"} + (-> multiline + char-array + io/reader + ical/unfolding-line-seq + first + ical/line->contentline))))) + +(def multi-with-empty + "X-APPLE-STRUCTURED-LOCATION;VALUE=URI;X-SOME-HEADER-BREAKING-SOMEWHERE-AT- + 75=foobar;X-TITLE=Some Place:geo:44.815458,20.462758 + +FOO:bar") + +(deftest parse-line-ignore-empty-test + (testing "Empty lines are ignored" + (is (= ["X-APPLE-STRUCTURED-LOCATION;VALUE=URI;X-SOME-HEADER-BREAKING-SOMEWHERE-AT-75=foobar;X-TITLE=Some Place:geo:44.815458,20.462758" + "FOO:bar"] + (-> multi-with-empty + char-array + io/reader + ical/unfolding-line-seq)))))