void ReadSpine() { XFragment f = XFragment.FindFragment("manifest", OPF.text); _manifest = new Dictionary <string, ManifestItem>(); foreach (var e in f.root.childs) { if (e.tag.tagname != "item") { continue; } var i = new ManifestItem(e, this); _manifest.Add(i.id, i); } foreach (var a in _manifest) { if (a.Value.href[0] != '/') { string dir = Path.GetDirectoryName(OPF.fullName); if (dir != "") { a.Value.href = Path.GetDirectoryName(OPF.fullName) + "/" + a.Value.href; } } } f = XFragment.FindFragment("spine", OPF.text); _spine = new Spine(f, _manifest); }
public SpineItemref(XELement itemref, Dictionary <string, ManifestItem> items) { this.item = items[itemref.tag.GetAttribute("idref")]; properties = itemref.tag.GetAttribute("properties"); id = itemref.tag.GetAttribute("id"); if (itemref.tag.GetAttribute("linear") == "no") { linear = false; } }
public Spine(XFragment spine, Dictionary <string, ManifestItem> items) { string toc = spine.root.tag.GetAttribute("toc"); string id = spine.root.tag.GetAttribute("id"); if (toc != "") { this.toc = items[toc]; } pageProgressionDirection = spine.root.tag.GetAttribute("page-progression-direction"); foreach (var e in spine.root.childs) { if (e.tag.tagname != "itemref") { continue; } this.items.Add(new SpineItemref(e, items)); } }
void ReadMeta3() { XFragment f = XFragment.FindFragment("metadata", OPF.text); List <MetaRecord> primary = new List <MetaRecord>(); foreach (var e in f.root.childs) { switch (e.tag.tagname) { case "dc:language": case "dc:identifier": { var t = new MetaRecord(e); primary.Add(t); } break; case "meta": { string name = e.tag.GetAttribute("name"); if (name != "") { var t = new MetaRecord(); t.name = name; t.value = e.tag.GetAttribute("content"); meta.Add(t); continue; } string refines = e.tag.GetAttribute("refines"); if (refines != "") { if (refines.StartsWith("#") && refines.Length > 1) { string id = refines.Substring(1); var t = new MetaRecord(e); t.name = e.tag.GetAttribute("property"); t.AddIfExist(e, "scheme"); foreach (var r in primary) { //要是refine在primary前面我可不管…… if (r.id == id) { r.refines.Add(t); break; } } continue; } } string property = e.tag.GetAttribute("property"); if (property != "") { var t = new MetaRecord(e); t.name = property; meta.Add(t); continue; } } break; default: { var t = new MetaRecord(e); t.AddIfExist(e, "xml:lang"); t.AddIfExist(e, "dir"); primary.Add(t); } break; } } foreach (var a in primary) { switch (a.name) { case "dc:title": dc_titles.Add(a); break; case "dc:creator": dc_creators.Add(a); break; case "dc:identifier": dc_identifier.Add(a); break; case "dc:language": dc_language.Add(a); break; default: others.Add(a); break; } } foreach (var a in dc_identifier) { if (idref == a.id) { uniqueIdentifier = a; break; } } foreach (var a in manifest) { switch (a.Value.properties) { case "nav": _toc = a.Value; break; case "cover-image": cover_img = a.Value.href; break; } } if (_toc == null) { _toc = spine.toc; } //check //if (dc_titles.Count == 0 || dc_identifier.Count == 0 || dc_language.Count == 0) { throw new EpubErrorException("Lack of some metadata."); } }
void ReadMeta2() { XFragment f = XFragment.FindFragment("metadata", OPF.text); foreach (var e in f.root.childs) { switch (e.tag.tagname) { case "dc:title": { var t = new MetaRecord(e); t.AddIfExist(e, "opf:file-as"); dc_titles.Add(t); } break; case "dc:creator": { var t = new MetaRecord(e); t.AddIfExist(e, "opf:file-as"); t.AddIfExist(e, "opf:role"); dc_creators.Add(t); } break; case "dc:language": { var t = new MetaRecord(e); dc_language.Add(t); } break; case "dc:identifier": { var t = new MetaRecord(e); t.AddIfExist(e, "opf:scheme"); dc_identifier.Add(t); } break; case "dc:contributor": { var t = new MetaRecord(e); t.AddIfExist(e, "opf:file-as"); t.AddIfExist(e, "opf:role"); others.Add(t); } break; case "dc:date": { var t = new MetaRecord(e); t.AddIfExist(e, "opf:event"); others.Add(t); } break; case "meta": { var t = new MetaRecord(); t.name = e.tag.GetAttribute("name"); t.value = e.tag.GetAttribute("content"); meta.Add(t); } break; default: { var t = new MetaRecord(e); others.Add(t); } break; } } foreach (var a in meta) { if (a.name == "cover") { string id = a.value; if (manifest.ContainsKey(id)) { cover_img = manifest[id].href; } break; } } _toc = spine.toc; }