From e20ef793080c73df3f6b6a9f15981f74a84c3541 Mon Sep 17 00:00:00 2001 From: dazering Date: Sat, 20 Jun 2026 12:58:33 +0300 Subject: [PATCH 1/2] [Fix] Normalize multiline values --- .../GetFb2Info/MultilineTitle/Book.fb2 | 44 +++++++++++++++++++ HomeLibProt.Common.Tests/TestFb2Reader.fs | 16 +++++++ HomeLibProt.Common/Fb2Reader.fs | 24 ++++++++-- 3 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 HomeLibProt.Common.Tests/TestCases/TestFb2Reader/GetFb2Info/MultilineTitle/Book.fb2 diff --git a/HomeLibProt.Common.Tests/TestCases/TestFb2Reader/GetFb2Info/MultilineTitle/Book.fb2 b/HomeLibProt.Common.Tests/TestCases/TestFb2Reader/GetFb2Info/MultilineTitle/Book.fb2 new file mode 100644 index 0000000..94d0897 --- /dev/null +++ b/HomeLibProt.Common.Tests/TestCases/TestFb2Reader/GetFb2Info/MultilineTitle/Book.fb2 @@ -0,0 +1,44 @@ + + + + +genre1 +gen +re2 + +A +a +B +b +C +c + + +Dd +Ee +Ff + +Ti +tle 1 + +

Annotation

+
+ + + +e +n + + +Keyword1, Keyword2 +Ke +yword3 +
+
+ +
+

Body

+
+ +Base64 +
\ No newline at end of file diff --git a/HomeLibProt.Common.Tests/TestFb2Reader.fs b/HomeLibProt.Common.Tests/TestFb2Reader.fs index 9c87ff2..ea09ce5 100644 --- a/HomeLibProt.Common.Tests/TestFb2Reader.fs +++ b/HomeLibProt.Common.Tests/TestFb2Reader.fs @@ -41,6 +41,22 @@ let getFb2InfoTestCases = Keywords = [| "Keyword1"; "Keyword2"; "Keyword3" |] Series = [| { Name = "Series 1"; Number = "1" }; { Name = "Series 2"; Number = "1" } |] } ) + TestCaseData( + "GetFb2Info/MultilineTitle", + Some + { Authors = + [| { First = "Aa" + Middle = "Bb" + Last = "Cc" } + { First = "Dd" + Middle = "Ee" + Last = "Ff" } |] + Genres = [| "genre1"; "genre2" |] + Title = "Title 1" + Language = "en" + Keywords = [| "Keyword1"; "Keyword2"; "Keyword3" |] + Series = [| { Name = "Series 1"; Number = "1" }; { Name = "Series 2"; Number = "1" } |] } + ) TestCaseData( "GetFb2Info/NoAttributes", Some diff --git a/HomeLibProt.Common/Fb2Reader.fs b/HomeLibProt.Common/Fb2Reader.fs index a4c77d0..f2daaf9 100644 --- a/HomeLibProt.Common/Fb2Reader.fs +++ b/HomeLibProt.Common/Fb2Reader.fs @@ -44,6 +44,9 @@ let private annotationXpath = let private coverpageLinkXpath = "/fb:FictionBook/fb:description/fb:title-info/fb:coverpage/fb:image" +let private normalizeString (value: string) = + value.Replace("\r\n", String.Empty).Replace("\n", String.Empty) + let private makeKeywords (keywords: string) : string array = keywords.Split(',', StringSplitOptions.RemoveEmptyEntries ||| StringSplitOptions.TrimEntries) @@ -118,11 +121,13 @@ let private tryToSelectSeries tryToSelectAttributeNode "@name" namespaceManager (Some i.Current) |> tryToSelectValue |> Option.defaultValue String.Empty + |> normalizeString let number = tryToSelectAttributeNode "@number" namespaceManager (Some i.Current) |> tryToSelectValue |> Option.defaultValue String.Empty + |> normalizeString match name |> String.IsNullOrEmpty, number |> String.IsNullOrEmpty with | false, true -> yield { Name = name; Number = "0" } @@ -136,7 +141,8 @@ let private tryToSelectKeywords (iterator: XPathNodeIterator option) : string se | Some i -> seq { while i.MoveNext() do - yield $"{i.Current}" + let keywords = $"{i.Current}" + yield keywords |> normalizeString } |> Some | None -> None @@ -146,7 +152,8 @@ let private tryToSelectGenres (iterator: XPathNodeIterator option) : string seq | Some i -> seq { while i.MoveNext() do - yield $"{i.Current}" + let genre = $"{i.Current}" + yield genre |> normalizeString } |> Some | None -> None @@ -163,16 +170,19 @@ let private tryToSelectAuthors "fb:first-name" |> tryToSelectSingleNode i.Current namespaceManager |> tryToGetValue + |> normalizeString let middleName = "fb:middle-name" |> tryToSelectSingleNode i.Current namespaceManager |> tryToGetValue + |> normalizeString let lastName = "fb:last-name" |> tryToSelectSingleNode i.Current namespaceManager |> tryToGetValue + |> normalizeString yield { First = firstName @@ -243,10 +253,16 @@ let getFb2Info (fb2: Stream) : Fb2Info option = |> Seq.toArray let title = - titleXpath |> tryToSelectSingleNode navigator namespaceManager |> tryToGetValue + titleXpath + |> tryToSelectSingleNode navigator namespaceManager + |> tryToGetValue + |> normalizeString let language = - langXpath |> tryToSelectSingleNode navigator namespaceManager |> tryToGetValue + langXpath + |> tryToSelectSingleNode navigator namespaceManager + |> tryToGetValue + |> normalizeString let keywords = keywordsXpath From ff072789011a700d8e0938c8c0ff8ced9cd84aef Mon Sep 17 00:00:00 2001 From: dazering Date: Sat, 20 Jun 2026 13:03:33 +0300 Subject: [PATCH 2/2] Bump version --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 1688155..e27ab66 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,7 +2,7 @@ 0 - 1.0.2.$(BuildNumber) + 1.0.3.$(BuildNumber) \ No newline at end of file