protected void AddMetaDataToContentDocument(XElement document) { var metadata = new XElement(EPubNamespaces.OpfNameSpace + "metadata"); metadata.Add(new XAttribute(XNamespace.Xmlns + "dc", PURLNamespaces.DCElements)); metadata.Add(new XAttribute(XNamespace.Xmlns + "xsi", WWWNamespaces.XSI)); metadata.Add(new XAttribute(XNamespace.Xmlns + "dcterms", PURLNamespaces.DCTerms)); metadata.Add(new XAttribute(XNamespace.Xmlns + "opf", EPubNamespaces.FakeOpf.NamespaceName)); Onix5SchemaConverter source = null; foreach (var identifierItem in BookInformation.Identifiers) { var schemaConverter = new Onix5SchemaConverter(identifierItem); var identifier = new XElement(PURLNamespaces.DCElements + "identifier", schemaConverter.GetIdentifier()); identifier.Add(new XAttribute("id", identifierItem.IdentifierName)); metadata.Add(identifier); var metaRefine = new XElement(EPubNamespaces.FakeOpf + "meta", schemaConverter.GetIdentifierType()); metaRefine.Add(new XAttribute("refines", "#" + identifierItem.IdentifierName)); metaRefine.Add(new XAttribute("property", "identifier-type")); metaRefine.Add(new XAttribute("scheme", Onix5SchemaConverter.GetScheme())); metadata.Add(metaRefine); if (source == null && schemaConverter.IsISBN()) { source = schemaConverter; } } int titleIdCounter = 0; foreach (var titleItem in BookInformation.BookTitles) { string idString = string.Format("t{0}", ++titleIdCounter); var titleElement = new XElement(PURLNamespaces.DCElements + "title", titleItem.TitleName); titleElement.Add(new XAttribute("id", idString)); metadata.Add(titleElement); var metaRefineType = new XElement(EPubNamespaces.FakeOpf + "meta", GetTitleType(titleItem)); metaRefineType.Add(new XAttribute("refines", "#" + idString)); metaRefineType.Add(new XAttribute("property", "title-type")); metadata.Add(metaRefineType); var metaRefineDisplay = new XElement(EPubNamespaces.FakeOpf + "meta", titleIdCounter); metaRefineDisplay.Add(new XAttribute("refines", "#" + idString)); metaRefineDisplay.Add(new XAttribute("property", "display-seq")); metadata.Add(metaRefineDisplay); } foreach (var languageItem in BookInformation.Languages) { var language = new XElement(PURLNamespaces.DCElements + "language", languageItem); metadata.Add(language); } int creatorCounter = 0; foreach (var creatorItem in BookInformation.Creators) { if (!string.IsNullOrEmpty(creatorItem.PersonName)) { string creatorId = string.Format("creator{0}", ++creatorCounter); var creator = new XElement(PURLNamespaces.DCElements + "creator", creatorItem.PersonName); creator.Add(new XAttribute("id", creatorId)); metadata.Add(creator); var metaRefineRole = new XElement(EPubNamespaces.FakeOpf + "meta", EPubRoles.ConvertEnumToAttribute(creatorItem.Role)); metaRefineRole.Add(new XAttribute("refines", "#" + creatorId)); metaRefineRole.Add(new XAttribute("property", "role")); metaRefineRole.Add(new XAttribute("scheme", "marc:relators")); metadata.Add(metaRefineRole); if (!string.IsNullOrEmpty(creatorItem.FileAs)) { var metaRefineFileAs = new XElement(EPubNamespaces.FakeOpf + "meta", creatorItem.FileAs); metaRefineFileAs.Add(new XAttribute("refines", "#" + creatorId)); metaRefineFileAs.Add(new XAttribute("property", "file-as")); metadata.Add(metaRefineFileAs); } var metaRefineDisplay = new XElement(EPubNamespaces.FakeOpf + "meta", creatorCounter); metaRefineDisplay.Add(new XAttribute("refines", "#" + creatorId)); metaRefineDisplay.Add(new XAttribute("property", "display-seq")); metadata.Add(metaRefineDisplay); } } int contributorCounter = 0; foreach (var contributorItem in BookInformation.Contributors) { if (!string.IsNullOrEmpty(contributorItem.PersonName)) { string contributorId = string.Format("contributor{0}", ++contributorCounter); var contributor = new XElement(PURLNamespaces.DCElements + "contributor", contributorItem.PersonName); contributor.Add(new XAttribute("id", contributorId)); metadata.Add(contributor); var metaRefineRole = new XElement(EPubNamespaces.FakeOpf + "meta", EPubRoles.ConvertEnumToAttribute(contributorItem.Role)); metaRefineRole.Add(new XAttribute("refines", "#" + contributorId)); metaRefineRole.Add(new XAttribute("property", "role")); metaRefineRole.Add(new XAttribute("scheme", "marc:relators")); metadata.Add(metaRefineRole); if (!string.IsNullOrEmpty(contributorItem.FileAs)) { var metaRefineFileAs = new XElement(EPubNamespaces.FakeOpf + "meta", contributorItem.FileAs); metaRefineFileAs.Add(new XAttribute("refines", "#" + contributorId)); metaRefineFileAs.Add(new XAttribute("property", "file-as")); metadata.Add(metaRefineFileAs); } var metaRefineDisplay = new XElement(EPubNamespaces.FakeOpf + "meta", contributorCounter); metaRefineDisplay.Add(new XAttribute("refines", "#" + contributorId)); metaRefineDisplay.Add(new XAttribute("property", "display-seq")); metadata.Add(metaRefineDisplay); } } if (CreatorSoftwareString != null) { string contributorId = string.Format("contributor{0}", ++contributorCounter); var maker = new XElement(PURLNamespaces.DCElements + "contributor", CreatorSoftwareString); maker.Add(new XAttribute("id", contributorId)); metadata.Add(maker); var metaRefineRole = new XElement(EPubNamespaces.FakeOpf + "meta", EPubRoles.ConvertEnumToAttribute(RolesEnum.BookProducer)); metaRefineRole.Add(new XAttribute("refines", "#" + contributorId)); metaRefineRole.Add(new XAttribute("property", "role")); metaRefineRole.Add(new XAttribute("scheme", "marc:relators")); metadata.Add(metaRefineRole); var metaRefineDisplay = new XElement(EPubNamespaces.FakeOpf + "meta", contributorCounter); metaRefineDisplay.Add(new XAttribute("refines", "#" + contributorId)); metaRefineDisplay.Add(new XAttribute("property", "display-seq")); metadata.Add(metaRefineDisplay); } // date if (BookInformation.DatePublished.HasValue) { var xDate = new XElement(PURLNamespaces.DCElements + "date", BookInformation.DatePublished.Value.Year); metadata.Add(xDate); } // source if (source != null) { var sourceElm = new XElement(PURLNamespaces.DCElements + "source", source.GetIdentifier()); sourceElm.Add(new XAttribute("id", "src_id")); metadata.Add(sourceElm); var metaRefine = new XElement(EPubNamespaces.FakeOpf + "meta", source.GetIdentifierType()); metaRefine.Add(new XAttribute("refines", "#" + "src_id")); metaRefine.Add(new XAttribute("property", "identifier-type")); metaRefine.Add(new XAttribute("scheme", Onix5SchemaConverter.GetScheme())); metadata.Add(metaRefine); } // description if (!string.IsNullOrEmpty(BookInformation.Description.DescInfo)) { var description = new XElement(PURLNamespaces.DCElements + "description", BookInformation.Description.DescInfo); if (!string.IsNullOrEmpty(BookInformation.Description.Language)) { description.Add(new XAttribute(XNamespace.Xml + "lang", BookInformation.Description.Language)); } description.Add(new XAttribute("id", "id_desc")); metadata.Add(description); var metaRefineDisplay = new XElement(EPubNamespaces.FakeOpf + "meta", 1); metaRefineDisplay.Add(new XAttribute("refines", "#id_desc")); metaRefineDisplay.Add(new XAttribute("property", "display-seq")); metadata.Add(metaRefineDisplay); } // publisher if (!string.IsNullOrEmpty(BookInformation.Publisher.PublisherName)) { var publisher = new XElement(PURLNamespaces.DCElements + "publisher", BookInformation.Publisher.PublisherName); if (!string.IsNullOrEmpty(BookInformation.Publisher.Language)) { publisher.Add(new XAttribute(XNamespace.Xml + "lang", BookInformation.Publisher.Language)); } metadata.Add(publisher); } // subject int subjectCount = 0; foreach (var subjectItem in BookInformation.Subjects) { if (!string.IsNullOrEmpty(subjectItem.SubjectInfo)) { string subjectID = string.Format("subj_{0}", ++subjectCount); var subject = new XElement(PURLNamespaces.DCElements + "subject", subjectItem.SubjectInfo); subject.Add(new XAttribute("id", subjectID)); if (!string.IsNullOrEmpty(subjectItem.Language)) { subject.Add(new XAttribute(XNamespace.Xml + "lang", subjectItem.Language)); } metadata.Add(subject); var metaRefineDisplay = new XElement(EPubNamespaces.FakeOpf + "meta", subjectCount); metaRefineDisplay.Add(new XAttribute("refines", "#" + subjectID)); metaRefineDisplay.Add(new XAttribute("property", "display-seq")); metadata.Add(metaRefineDisplay); } } // meta modified string modifiedDate = DateTime.UtcNow.ToString("s") + "Z"; if (BookInformation.DataFileModification.HasValue) { modifiedDate = BookInformation.DataFileModification.Value.ToUniversalTime().ToString("s") + "Z"; } var metaModified = new XElement(EPubNamespaces.FakeOpf + "meta", modifiedDate); metaModified.Add(new XAttribute("property", "dcterms:modified")); metadata.Add(metaModified); // series if (V3StandardChecker.IsCollectionsAllowedByStandard(_standard) && BookInformation.SeriesCollection != null) { EPubSeriesCollections bookData = BookInformation.SeriesCollection as EPubSeriesCollections; if (bookData != null) { bookData.AddCollectionsToElement(metadata); } } document.Add(metadata); }
protected virtual void AddMetaDataToContentDocument(XElement document) { var metadata = new XElement(EPubNamespaces.OpfNameSpace + "metadata"); metadata.Add(new XAttribute(XNamespace.Xmlns + "dc", PURLNamespaces.DCElements.NamespaceName)); metadata.Add(new XAttribute(XNamespace.Xmlns + "xsi", WWWNamespaces.XSI.NamespaceName)); metadata.Add(new XAttribute(XNamespace.Xmlns + "dcterms", PURLNamespaces.DCTerms.NamespaceName)); metadata.Add(new XAttribute(XNamespace.Xmlns + "opf", EPubNamespaces.FakeOpf.NamespaceName)); if (CalibreData != null) { CalibreData.InjectNamespace(metadata); } foreach (var titleItem in BookInformation.BookTitles) { var titleElement = new XElement(PURLNamespaces.DCElements + "title", titleItem.TitleName); if (!string.IsNullOrEmpty(titleItem.Language)) { // need to add writing language in "xml:lang — use RFC-3066 format" // will add when will find an example since unclear } metadata.Add(titleElement); } foreach (var languageItem in BookInformation.Languages) { var language = new XElement(PURLNamespaces.DCElements + "language", languageItem); language.Add(new XAttribute(WWWNamespaces.XSI + "type", "dcterms:RFC3066")); metadata.Add(language); } foreach (var identifierItem in BookInformation.Identifiers) { var identifier = new XElement(PURLNamespaces.DCElements + "identifier", identifierItem.ID); identifier.Add(new XAttribute("id", identifierItem.IdentifierName)); identifier.Add(new XAttribute(EPubNamespaces.FakeOpf + "scheme", identifierItem.Scheme)); metadata.Add(identifier); } if (BookInformation.DatePublished.HasValue) { var xDate = new XElement(PURLNamespaces.DCElements + "date", BookInformation.DatePublished.Value.Year); xDate.Add(new XAttribute(EPubNamespaces.FakeOpf + "event", "original-publication")); metadata.Add(xDate); } foreach (var creatorItem in BookInformation.Creators) { if (!string.IsNullOrEmpty(creatorItem.PersonName)) { var creator = new XElement(PURLNamespaces.DCElements + "creator", creatorItem.PersonName); creator.Add(new XAttribute(EPubNamespaces.FakeOpf + "role", EPubRoles.ConvertEnumToAttribute(creatorItem.Role))); if (!string.IsNullOrEmpty(creatorItem.FileAs)) { creator.Add(new XAttribute(EPubNamespaces.FakeOpf + "file-as", creatorItem.FileAs)); } if (!string.IsNullOrEmpty(creatorItem.Language)) { // need to add writing language in "xml:lang — use RFC-3066 format" // will add when will find an example since unclear } metadata.Add(creator); } } foreach (var contributorItem in BookInformation.Contributors) { if (!string.IsNullOrEmpty(contributorItem.PersonName)) { var contributor = new XElement(PURLNamespaces.DCElements + "contributor", contributorItem.PersonName); contributor.Add(new XAttribute(EPubNamespaces.FakeOpf + "role", EPubRoles.ConvertEnumToAttribute(contributorItem.Role))); if (!string.IsNullOrEmpty(contributorItem.FileAs)) { contributor.Add(new XAttribute(EPubNamespaces.FakeOpf + "file-as", contributorItem.FileAs)); } if (!string.IsNullOrEmpty(contributorItem.Language)) { // need to add writing language in "xml:lang — use RFC-3066 format" // will add when will find an example since unclear } metadata.Add(contributor); } } if (CreatorSoftwareString != null) { var maker = new XElement(PURLNamespaces.DCElements + "contributor", CreatorSoftwareString); maker.Add(new XAttribute(EPubNamespaces.FakeOpf + "role", EPubRoles.ConvertEnumToAttribute(RolesEnum.BookProducer))); metadata.Add(maker); } if (!string.IsNullOrEmpty(BookInformation.Publisher.PublisherName)) { var publisher = new XElement(PURLNamespaces.DCElements + "publisher", BookInformation.Publisher.PublisherName); if (!string.IsNullOrEmpty(BookInformation.Publisher.Language)) { // need to add writing language in "xml:lang — use RFC-3066 format" // will add when will find an example since unclear } metadata.Add(publisher); } if (!string.IsNullOrEmpty(BookInformation.Description.DescInfo)) { var description = new XElement(PURLNamespaces.DCElements + "description", BookInformation.Description.DescInfo); if (!string.IsNullOrEmpty(BookInformation.Description.Language)) { // need to add writing language in "xml:lang — use RFC-3066 format" // will add when will find an example since unclear } metadata.Add(description); } foreach (var subjectItem in BookInformation.Subjects) { if (!string.IsNullOrEmpty(subjectItem.SubjectInfo)) { var contributor = new XElement(PURLNamespaces.DCElements + "subject", subjectItem.SubjectInfo); if (!string.IsNullOrEmpty(subjectItem.Language)) { // need to add writing language in "xml:lang — use RFC-3066 format" // will add when will find an example since unclear } metadata.Add(contributor); } } // This needed for iTunes and other apple made devices/programs to display the cover if (!string.IsNullOrEmpty(CoverId)) { // <meta name="cover" content="cover.jpg"/> var cover = new XElement(EPubNamespaces.OpfNameSpace + "meta"); cover.Add(new XAttribute("name", "cover")); cover.Add(new XAttribute("content", CoverId)); metadata.Add(cover); } if (CalibreData != null) { CalibreData.InjectData(metadata); } document.Add(metadata); }