private static int GetRecursionLevel(BaseXHTMLFileV3 navParent) { if (navParent == null) { return 1; } return navParent.NavigationLevel + 1; }
private List<FB2NotesPageSectionFile> AddSection(SectionItem section, BaseXHTMLFileV3 navParent) { List<FB2NotesPageSectionFile> documents = new List<FB2NotesPageSectionFile>(); string docTitle = string.Empty; if (section.Title != null) { docTitle = section.Title.ToString(); } Logger.Log.DebugFormat("Adding notes section : {0}", docTitle); FB2NotesPageSectionFile sectionDocument = null; bool firstDocumentOfSplit = true; var converterSettings = new ConverterOptionsV3 { CapitalDrop = false, Images = _images, MaxSize = _v3Settings.HTMLFileMaxSize, ReferencesManager = _referencesManager, }; var sectionConverter = new SectionConverterV3 { LinkSection = true, RecursionLevel = GetRecursionLevel(navParent), Settings = converterSettings }; foreach (var subitem in sectionConverter.Convert(section)) { sectionDocument = new FB2NotesPageSectionFile { PageTitle = docTitle, FileEPubInternalPath = EPubInternalPath.GetDefaultLocation(DefaultLocations.DefaultTextFolder), GuideRole = (navParent == null) ? GuideTypeEnum.Text : navParent.GuideRole, Content = subitem, NavigationParent = navParent, FileName = BuildSectionFileName() }; if (!firstDocumentOfSplit || ((navParent != null) && navParent.NotPartOfNavigation)) { sectionDocument.NotPartOfNavigation = true; } firstDocumentOfSplit = false; documents.Add(sectionDocument); } Logger.Log.Debug("Adding sub-sections"); foreach (var subSection in section.SubSections) { documents.AddRange(AddSection(subSection, sectionDocument)); } return documents; }
public LinkReMapperV3(KeyValuePair<string, List<Anchor>> link, IDictionary<string, HTMLItem> ids, BookStructureManager structureManager, IEPubV3Settings v3Settings) { _link = link; _ids = ids; _v3Settings = v3Settings; _structureManager = structureManager; _idString = ReferencesUtils.GetIdFromLink(link.Key); // Get ID of a link target; _linkTargetItem = ids[_idString]; // get object targeted by link _linkTargetDocument = GetItemParentDocument(_linkTargetItem); // get parent document (file) containing targeted object if (_linkTargetDocument != null) // if link target container document (document containing item with ID we jump to) found { _linkParentContainer = DetectItemParentContainer(_linkTargetItem); // get parent container of link target item } }
private List <BaseXHTMLFileV3> SplitSimpleText(SimpleHTML5Text simpleEPubText) { var list = new List <BaseXHTMLFileV3>(); var newDoc = new BaseXHTMLFileV3 { PageTitle = InternalPageTitle, NotPartOfNavigation = true }; newDoc.StyleFiles.AddRange(StyleFiles); newDoc.GuideRole = GuideRole; newDoc.NavigationParent = NavigationParent; newDoc.Content = new Div(Compatibility); var newParagraph = new Paragraph(Compatibility); newDoc.Content.Add(newParagraph); var newText = new SimpleHTML5Text(Compatibility) { Text = "" }; newParagraph.Add(newText); foreach (var word in simpleEPubText.Text.Split(' ')) { newText.Text += ' '; newText.Text += word; ulong itemSize = EstimateSize(newParagraph); if (itemSize >= MaxSize) { list.Add(newDoc); newDoc = new BaseXHTMLFileV3 { PageTitle = PageTitle, NotPartOfNavigation = true }; newDoc.StyleFiles.AddRange(StyleFiles); newDoc.GuideRole = GuideRole; newDoc.NavigationParent = NavigationParent; newDoc.Content = new Div(Compatibility); newParagraph = new Paragraph(Compatibility); newDoc.Content.Add(newParagraph); newText = new SimpleHTML5Text(Compatibility) { Text = "" }; newParagraph.Add(newText); } } list.Add(newDoc); return(list); }
/// <summary> /// Passes FB2 info to the EPub file to be added at the end of the book /// </summary> /// <param name="epubFile">destination epub object</param> /// <param name="fb2File">source fb2 object</param> private void PassFb2InfoToEpub(EPubFileV3 epubFile, FB2File fb2File) { if (!Settings.ConversionSettings.Fb2Info) { return; } var infoDocument = new BaseXHTMLFileV3 { PageTitle = "FB2 Info", FileEPubInternalPath = EPubInternalPath.GetDefaultLocation(DefaultLocations.DefaultTextFolder), FileName = "fb2info.xhtml", GuideRole = GuideTypeEnum.Notes, NotPartOfNavigation = true }; var converterSettings = new ConverterOptionsV3 { CapitalDrop = false, Images = Images, MaxSize = Settings.V3Settings.HTMLFileMaxSize, ReferencesManager = _referencesManager, }; var infoConverter = new Fb2EpubInfoConverterV3(); infoDocument.Content = infoConverter.Convert(fb2File, converterSettings); epubFile.AddXHTMLFile(infoDocument); }
public List <BaseXHTMLFileV3> Split() { var list = new List <BaseXHTMLFileV3>(); BaseXHTMLFileV3 newDoc = null; var listToRemove = new List <IHTMLItem>(); ulong totlaSize = 0; IHTMLItem oldContent = _content; var newContent = new Div(Compatibility); if (_content != null) { foreach (var subElement in _content.SubElements()) { ulong itemSize = EstimateSize(subElement); if (totlaSize + itemSize > MaxSize) { Content = newContent; newDoc = new BaseXHTMLFileV3() { Content = oldContent, PageTitle = InternalPageTitle, NotPartOfNavigation = true }; newDoc.StyleFiles.AddRange(StyleFiles); newDoc.GuideRole = GuideRole; newDoc.NavigationParent = NavigationParent; break; } if (itemSize <= MaxSize) { totlaSize += itemSize; newContent.Add(subElement); } listToRemove.Add(subElement); } foreach (var item in listToRemove) { oldContent.Remove(item); } if (newDoc != null) { list.Add(newDoc); if (EstimateSize(newDoc.Content) > MaxSize) { if ((newDoc.Content.SubElements() != null) && (newDoc.Content.SubElements().Count > 1)) // in case we have only one sub-element we can't split { var subList = newDoc.Split(); list.AddRange(subList); list.Remove(newDoc); } else { if (newDoc.Content.SubElements()[0] is Paragraph) // in case element we about to split is paragraph { List <BaseXHTMLFileV3> subList = SplitParagraph(newDoc.Content.SubElements()[0] as Paragraph); list.AddRange(subList); } else if (newDoc.Content.SubElements()[0] is Div) { newDoc.Content = newDoc.Content.SubElements()[0]; List <BaseXHTMLFileV3> subList = newDoc.Split(); list.AddRange(subList); } } } } } return(list); }
private List<BaseXHTMLFileV3> SplitSimpleText(SimpleHTML5Text simpleEPubText) { var list = new List<BaseXHTMLFileV3>(); var newDoc = new BaseXHTMLFileV3 { PageTitle = InternalPageTitle, NotPartOfNavigation = true }; newDoc.StyleFiles.AddRange(StyleFiles); newDoc.GuideRole = GuideRole; newDoc.NavigationParent = NavigationParent; newDoc.Content = new Div(Compatibility); var newParagraph = new Paragraph(Compatibility); newDoc.Content.Add(newParagraph); var newText = new SimpleHTML5Text(Compatibility) { Text = "" }; newParagraph.Add(newText); foreach (var word in simpleEPubText.Text.Split(' ')) { newText.Text += ' '; newText.Text += word; ulong itemSize = EstimateSize(newParagraph); if (itemSize >= MaxSize) { list.Add(newDoc); newDoc = new BaseXHTMLFileV3 { PageTitle = PageTitle, NotPartOfNavigation = true }; newDoc.StyleFiles.AddRange(StyleFiles); newDoc.GuideRole = GuideRole; newDoc.NavigationParent = NavigationParent; newDoc.Content = new Div(Compatibility); newParagraph = new Paragraph(Compatibility); newDoc.Content.Add(newParagraph); newText = new SimpleHTML5Text(Compatibility) { Text = "" }; newParagraph.Add(newText); } } list.Add(newDoc); return list; }
public List<BaseXHTMLFileV3> Split() { var list = new List<BaseXHTMLFileV3>(); BaseXHTMLFileV3 newDoc = null; var listToRemove = new List<IHTMLItem>(); ulong totlaSize = 0; IHTMLItem oldContent = _content; var newContent = new Div(Compatibility); if (_content != null) { foreach (var subElement in _content.SubElements()) { ulong itemSize = EstimateSize(subElement); if (totlaSize + itemSize > MaxSize) { Content = newContent; newDoc = new BaseXHTMLFileV3() { Content = oldContent, PageTitle = InternalPageTitle, NotPartOfNavigation = true }; newDoc.StyleFiles.AddRange(StyleFiles); newDoc.GuideRole = GuideRole; newDoc.NavigationParent = NavigationParent; break; } if (itemSize <= MaxSize) { totlaSize += itemSize; newContent.Add(subElement); } listToRemove.Add(subElement); } foreach (var item in listToRemove) { oldContent.Remove(item); } if (newDoc != null) { list.Add(newDoc); if (EstimateSize(newDoc.Content) > MaxSize) { if ((newDoc.Content.SubElements() != null) && (newDoc.Content.SubElements().Count > 1)) // in case we have only one sub-element we can't split { var subList = newDoc.Split(); list.AddRange(subList); list.Remove(newDoc); } else { if (newDoc.Content.SubElements()[0] is Paragraph) // in case element we about to split is paragraph { List<BaseXHTMLFileV3> subList = SplitParagraph(newDoc.Content.SubElements()[0] as Paragraph); list.AddRange(subList); } else if (newDoc.Content.SubElements()[0] is Div) { newDoc.Content = newDoc.Content.SubElements()[0]; List<BaseXHTMLFileV3> subList = newDoc.Split(); list.AddRange(subList); } } } } } return list; }
public void Convert(EPubFileV3 epubFile, FB2File fb2File) { // create second title page if ((fb2File.MainBody.Title != null) && (!string.IsNullOrEmpty(fb2File.MainBody.Title.ToString()))) { string docTitle = fb2File.MainBody.Title.ToString(); Logger.Log.DebugFormat("Adding section : {0}", docTitle); var addTitlePage = new BaseXHTMLFileV3 { PageTitle = docTitle, FileEPubInternalPath = EPubInternalPath.GetDefaultLocation(DefaultLocations.DefaultTextFolder), GuideRole = GuideTypeEnum.TitlePage, Content = new Div(HTMLElementType.HTML5), NavigationParent = null, FileName = string.Format("section{0}.xhtml", ++_sectionCounter), NotPartOfNavigation = true }; var converterSettings = new ConverterOptionsV3 { CapitalDrop = _commonSettings.CapitalDrop, Images = _images, MaxSize = _maxSize, ReferencesManager = _referencesManager, }; var titleConverter = new TitleConverterV3(); addTitlePage.Content.Add(titleConverter.Convert(fb2File.MainBody.Title, new TitleConverterParamsV3 { Settings = converterSettings, TitleLevel = 2 })); epubFile.AddXHTMLFile(addTitlePage); } BaseXHTMLFileV3 mainDocument = null; if (!string.IsNullOrEmpty(fb2File.MainBody.Name)) { string docTitle = fb2File.MainBody.Name; Logger.Log.DebugFormat("Adding section : {0}", docTitle); mainDocument = new BaseXHTMLFileV3 { PageTitle = docTitle, FileEPubInternalPath = EPubInternalPath.GetDefaultLocation(DefaultLocations.DefaultTextFolder), GuideRole = GuideTypeEnum.Text, Content = new Div(HTMLElementType.HTML5), NavigationParent = null, FileName = string.Format("section{0}.xhtml", ++_sectionCounter) }; epubFile.AddXHTMLFile(mainDocument); } if ((fb2File.MainBody.ImageName != null) && !string.IsNullOrEmpty(fb2File.MainBody.ImageName.HRef)) { if (mainDocument == null) { string newDocTitle = ((fb2File.MainBody.Title != null) && (!string.IsNullOrEmpty(fb2File.MainBody.Title.ToString()))) ? fb2File.MainBody.Title.ToString() : "main"; mainDocument = new BaseXHTMLFileV3 { PageTitle = newDocTitle, FileEPubInternalPath = EPubInternalPath.GetDefaultLocation(DefaultLocations.DefaultTextFolder), GuideRole = GuideTypeEnum.Text, Content = new Div(HTMLElementType.HTML5), NavigationParent = null, FileName = string.Format("section{0}.xhtml", ++_sectionCounter) }; epubFile.AddXHTMLFile(mainDocument); } if (_images.IsImageIdReal(fb2File.MainBody.ImageName.HRef)) { var enclosing = new Div(HTMLElementType.HTML5); // we use the enclosing so the user can style center it var converterSettings = new ConverterOptionsV3 { CapitalDrop = _commonSettings.CapitalDrop, Images = _images, MaxSize = _maxSize, ReferencesManager = _referencesManager, }; var imageConverter = new ImageConverterV3(); enclosing.Add(imageConverter.Convert(fb2File.MainBody.ImageName, new ImageConverterParamsV3 { Settings = converterSettings })); SetClassType(enclosing, ElementStylesV3.BodyImage); mainDocument.Content.Add(enclosing); } } foreach (var ep in fb2File.MainBody.Epigraphs) { if (mainDocument == null) { string newDocTitle = ((fb2File.MainBody.Title != null) && (!string.IsNullOrEmpty(fb2File.MainBody.Title.ToString()))) ? fb2File.MainBody.Title.ToString() : "main"; mainDocument = new BaseXHTMLFileV3 { PageTitle = newDocTitle, FileEPubInternalPath = EPubInternalPath.GetDefaultLocation(DefaultLocations.DefaultTextFolder), GuideRole = GuideTypeEnum.Text, Content = new Div(HTMLElementType.HTML5), NavigationParent = null, FileName = string.Format("section{0}.xhtml", ++_sectionCounter) }; epubFile.AddXHTMLFile(mainDocument); } var converterSettings = new ConverterOptionsV3 { CapitalDrop = _commonSettings.CapitalDrop, Images = _images, MaxSize = _maxSize, ReferencesManager = _referencesManager, }; var epigraphConverter = new MainEpigraphConverterV3(); mainDocument.Content.Add(epigraphConverter.Convert(ep, new EpigraphConverterParamsV3 { Settings = converterSettings, Level = 1 })); } Logger.Log.Debug("Adding main sections"); foreach (var section in fb2File.MainBody.Sections) { AddSection(epubFile, section, mainDocument, false); } Logger.Log.Debug("Adding secondary bodies"); foreach (var bodyItem in fb2File.Bodies) { if (bodyItem == fb2File.MainBody) { continue; } bool fbeNotesSection = FBENotesSection(bodyItem.Name); if (fbeNotesSection) { AddFbeNotesBody(epubFile, bodyItem); } else { AddSecondaryBody(epubFile, bodyItem); } } }
/// <summary> /// Add and convert generic secondary body section /// </summary> /// <param name="epubFile"></param> /// <param name="bodyItem"></param> private void AddSecondaryBody(EPubFileV3 epubFile, BodyItem bodyItem) { string docTitle = string.Empty; if (string.IsNullOrEmpty(bodyItem.Name)) { if (bodyItem.Title != null) { docTitle = bodyItem.Title.ToString(); } } else { docTitle = bodyItem.Name; } Logger.Log.DebugFormat("Adding section : {0}", docTitle); var sectionDocument = new BaseXHTMLFileV3 { FileEPubInternalPath = EPubInternalPath.GetDefaultLocation(DefaultLocations.DefaultTextFolder), GuideRole = GuideTypeEnum.Text, Content = new Div(HTMLElementType.HTML5), NavigationParent = null, NotPartOfNavigation = false, FileName = string.Format("section{0}.xhtml", ++_sectionCounter), PageTitle = docTitle, }; if (bodyItem.Title != null) { var converterSettings = new ConverterOptionsV3 { CapitalDrop = _commonSettings.CapitalDrop, Images = _images, MaxSize = _maxSize, ReferencesManager = _referencesManager, }; var titleConverter = new TitleConverterV3(); sectionDocument.Content.Add(titleConverter.Convert(bodyItem.Title, new TitleConverterParamsV3 { Settings = converterSettings, TitleLevel = 1 })); } epubFile.AddXHTMLFile(sectionDocument); Logger.Log.Debug("Adding sub-sections"); foreach (var section in bodyItem.Sections) { AddSection(epubFile, section, sectionDocument, false); } }
private void AddSection(EPubFileV3 epubFile, SectionItem section, BaseXHTMLFileV3 navParent, bool fbeNotesSection) { string docTitle = string.Empty; if (section.Title != null) { docTitle = section.Title.ToString(); } Logger.Log.DebugFormat("Adding section : {0}", docTitle); BaseXHTMLFileV3 sectionDocument = null; bool firstDocumentOfSplit = true; var converterSettings = new ConverterOptionsV3 { CapitalDrop = !fbeNotesSection && _commonSettings.CapitalDrop, Images = _images, MaxSize = _maxSize, ReferencesManager = _referencesManager, }; var sectionConverter = new SectionConverterV3 { LinkSection = fbeNotesSection, RecursionLevel = GetRecursionLevel(navParent), Settings = converterSettings }; foreach (var subitem in sectionConverter.Convert(section)) { sectionDocument = new BaseXHTMLFileV3 { PageTitle = docTitle, FileEPubInternalPath = EPubInternalPath.GetDefaultLocation(DefaultLocations.DefaultTextFolder), GuideRole = (navParent == null) ? GuideTypeEnum.Text : navParent.GuideRole, Content = subitem, NavigationParent = navParent, FileName = string.Format("section{0}.xhtml", ++_sectionCounter) }; if (!firstDocumentOfSplit || ((navParent!= null) && navParent.NotPartOfNavigation)) { sectionDocument.NotPartOfNavigation = true; } firstDocumentOfSplit = false; epubFile.AddXHTMLFile(sectionDocument); } Logger.Log.Debug("Adding sub-sections"); foreach (var subSection in section.SubSections) { AddSection(epubFile, subSection, sectionDocument, fbeNotesSection); } }