Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<BuildNumber Condition="'$(BuildNumber)' == ''">0</BuildNumber>
<VersionPrefix>1.0.2.$(BuildNumber)</VersionPrefix>
<VersionPrefix>1.0.3.$(BuildNumber)</VersionPrefix>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns:l="http://www.w3.org/1999/xlink" xmlns="http://www.gribuser.ru/xml/fictionbook/2.0">
<description>
<title-info>
<genre>genre1</genre>
<genre>gen
re2</genre>
<author>
<first-name>A
a</first-name>
<middle-name>B
b</middle-name>
<last-name>C
c</last-name>
</author>
<author>
<first-name>Dd</first-name>
<middle-name>Ee</middle-name>
<last-name>Ff</last-name>
</author>
<book-title>Ti
tle 1</book-title>
<annotation>
<p>Annotation</p>
</annotation>
<coverpage>
<image l:href="#coverpage" />
</coverpage>
<lang>e
n</lang>
<sequence name="Series 1" number="1"/>
<sequence name="Series 2" number="1"/>
<keywords>Keyword1, Keyword2</keywords>
<keywords>Ke
yword3</keywords>
</title-info>
</description>
<body>
<section>
<p>Body</p>
</section>
</body>
<binary content-type="image/jpeg" id="coverpage">Base64</binary>
</FictionBook>
16 changes: 16 additions & 0 deletions HomeLibProt.Common.Tests/TestFb2Reader.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
24 changes: 20 additions & 4 deletions HomeLibProt.Common/Fb2Reader.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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" }
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
Loading