Skip to content

Commit 9b08b71

Browse files
author
Andrew Eiche
committed
Now parsing metadata!!!
1 parent 80ad724 commit 9b08b71

File tree

3 files changed

+95
-13
lines changed

3 files changed

+95
-13
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System.Collections;
2+
using System;
3+
4+
namespace UEPub
5+
{
6+
public class UEPubMetadata
7+
{
8+
// Required:
9+
public string title;
10+
public string language;
11+
public string identifier;
12+
13+
// Optional:
14+
public string creator;
15+
public string contributor;
16+
public string publisher;
17+
public string subject;
18+
public string description;
19+
public DateTime date;
20+
public string type;
21+
public string format;
22+
public string source;
23+
public string relation;
24+
public string coverage;
25+
public string rights;
26+
}
27+
}

UnityEPubReader/Assets/Scripts/UEPubMetadata.cs.meta

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

UnityEPubReader/Assets/Scripts/UEPubReader.cs

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
using UnityEngine;
2-
using System.Collections;
1+
using System.Collections;
32
using System.Collections.Generic;
43
using System.Xml;
54
using System.IO;
65
using System.Text;
76
using System.Linq;
7+
using System;
8+
using UnityEngine;
89

910
namespace UEPub{
1011
public class UEPubReader {
1112

1213
public string epubFolderLocation { get; private set; }
14+
public UEPubMetadata metadata { get; private set; }
1315

1416
public List<string> chapters;
1517

@@ -64,27 +66,68 @@ private void ParseOPF(){
6466
xmlnsManager.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");
6567
xmlnsManager.AddNamespace("dcterms", "http://purl.org/dc/terms/");
6668

69+
ReadMetadata (doc, xmlnsManager);
70+
71+
ReadChapters (opfFile, doc, xmlnsManager);
72+
}
73+
74+
private void ReadChapters (string opfFile, XmlDocument doc, XmlNamespaceManager xmlnsManager)
75+
{
6776
var nodes = doc.SelectNodes ("/ns:package/ns:manifest/ns:item", xmlnsManager);
77+
foreach (XmlNode node in nodes) {
78+
bookItems [node.Attributes ["id"].InnerText] = node.Attributes ["href"].InnerText;
79+
}
6880

81+
nodes = doc.SelectNodes ("/ns:package/ns:spine/ns:itemref", xmlnsManager);
6982
foreach (XmlNode node in nodes) {
70-
bookItems[node.Attributes["id"].InnerText] = node.Attributes["href"].InnerText;
83+
spine.Add (node.Attributes ["idref"].InnerText);
7184
}
7285

73-
nodes = doc.SelectNodes("/ns:package/ns:spine/ns:itemref", xmlnsManager);
86+
var toc = spine.Select (x => bookItems [x]).ToList ();
87+
chapters = new List<string> ();
7488

75-
foreach (XmlNode node in nodes){
76-
spine.Add(node.Attributes["idref"].InnerText);
89+
foreach (string s in toc) {
90+
StreamReader sr = new StreamReader (Path.GetDirectoryName (opfFile) + "/" + s);
91+
chapters.Add (sr.ReadToEnd ());
92+
sr.Close ();
7793
}
94+
}
7895

79-
var toc = spine.Select (x => bookItems [x])
80-
.ToList ();
96+
private void ReadMetadata(XmlDocument doc, XmlNamespaceManager xmlnsManager){
97+
metadata = new UEPubMetadata ();
98+
99+
// Required properties
100+
metadata.title = doc.SelectSingleNode ("/ns:package/ns:metadata/dc:title", xmlnsManager).InnerText;
101+
metadata.language = doc.SelectSingleNode ("/ns:package/ns:metadata/dc:language", xmlnsManager).InnerText;
102+
metadata.identifier = doc.SelectSingleNode ("/ns:package/ns:metadata/dc:identifier", xmlnsManager).InnerText;
103+
104+
// Optional props
105+
SetMetadataProperty (ref metadata.creator, "/ns:package/ns:metadata/dc:creator", doc, xmlnsManager);
106+
SetMetadataProperty (ref metadata.contributor, "/ns:package/ns:metadata/dc:contributor", doc, xmlnsManager);
107+
SetMetadataProperty (ref metadata.coverage, "/ns:package/ns:metadata/dc:coverage", doc, xmlnsManager);
108+
SetMetadataProperty (ref metadata.description, "/ns:package/ns:metadata/dc:description", doc, xmlnsManager);
109+
SetMetadataProperty (ref metadata.format, "/ns:package/ns:metadata/dc:format", doc, xmlnsManager);
110+
SetMetadataProperty (ref metadata.publisher, "/ns:package/ns:metadata/dc:publisher", doc, xmlnsManager);
111+
SetMetadataProperty (ref metadata.relation, "/ns:package/ns:metadata/dc:relation", doc, xmlnsManager);
112+
SetMetadataProperty (ref metadata.rights, "/ns:package/ns:metadata/dc:rights", doc, xmlnsManager);
113+
SetMetadataProperty (ref metadata.source, "/ns:package/ns:metadata/dc:source", doc, xmlnsManager);
114+
SetMetadataProperty (ref metadata.subject, "/ns:package/ns:metadata/dc:subject", doc, xmlnsManager);
115+
SetMetadataProperty (ref metadata.type, "/ns:package/ns:metadata/dc:type", doc, xmlnsManager);
116+
117+
// Date
118+
119+
var node = doc.SelectSingleNode ("/ns:package/ns:metadata/dc:date", xmlnsManager);
120+
121+
if (node != null) {
122+
metadata.date = DateTime.ParseExact(node.InnerText, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
123+
}
124+
}
81125

82-
chapters = new List<string> ();
126+
private void SetMetadataProperty(ref string property, string XPath, XmlDocument doc, XmlNamespaceManager xmlnsManager){
127+
var node = doc.SelectSingleNode (XPath, xmlnsManager);
83128

84-
foreach (string s in toc) {
85-
StreamReader sr = new StreamReader(Path.GetDirectoryName(opfFile) + "/" + s);
86-
chapters.Add(sr.ReadToEnd());
87-
sr.Close();
129+
if (node != null) {
130+
property = node.InnerText;
88131
}
89132
}
90133
}

0 commit comments

Comments
 (0)