private async Task <OpenResult> OpenFileAsText(string fileString, BookLocation location) { await Task.Delay(0); Logger.Log($"MainEpubReader: file is a text string; convert to html"); EpubBook = TextWizard.TextToEpub(fileString); if (location == null) { var chapter = EpubWizard.GetFirstChapter(EpubBook.TableOfContents); if (chapter != null) { location = EpubChapterData.FromChapter(chapter); } } if (location != null) { Logger.Log($"MainEpubReader: Show Text: About to move to location as needed. {location}"); UserNavigatedToArgument = location; NavigateTo(ControlId, location); // We won't get a hairpin navigation callback } return(OpenResult.OK); }
private void UserDidNavigationRequest(EpubChapterData chapter) { if (chapter == null) { return; } var nav = Navigator.Get(); BookLocation location = null; if (chapter == Chapters[0]) { // First one is special: we always go to the very start of the book, including stuff that's not in // the classic table of contents. For example, Gutenberg Campfire Girls Station Island has a cover that's // not in the TOC but which is in the inner.SpecialResources.HtmlInReadingOrder and which is placed first. // Additionally, that book also has the weird thing that the ID for the first section (in the TOC) is // near the end of the section, so when you click on it, it scrolls to there, but then the next TOC entry // (chapter 1) is visible near the top, and so the selection jumps to there. location = new BookLocation(0, 0); // first HTML page, at the very top. } else { location = EpubChapterData.FromChapter(chapter); } nav.UserNavigatedTo(ControlId, location); }
public static BookLocation FromChapter(EpubChapterData chapter) { return(new BookLocation() { Location = chapter.Anchor, HtmlFileName = chapter.FileName, }); }
/// <summary> /// Called when the user has navigated to somewhere in the book. The chapter display /// tries to sync itself to the value. The chapter display depends on the caller being /// fully initialized first! /// </summary> /// <param name="sourceId"></param> /// <param name="location"></param> public async void NavigateTo(NavigateControlId sourceId, BookLocation location) { string chapterid = ""; var nav = Navigator.Get(); if (!double.IsNaN(location.ScrollPercent)) { chapterid = await nav.MainBookHandler.GetChapterBeforePercentAsync(location); } else { chapterid = nav.MainBookHandler.GetChapterContainingId(location.Location, location.HtmlIndex); } EpubChapterData foundChapter = null; if (foundChapter == null && location.HtmlIndex >= 0) { var html = Book.ResourcesHtmlOrdered[location.HtmlIndex]; foreach (var chapter in Chapters) { // FAIL: Intro to Planetary Nebulae the location is html 8, id tit1 which is shared by multiple chapters. if (html.Href.EndsWith(chapter.FileName) && chapter.Anchor == chapterid) { foundChapter = chapter; break; } } } // Most common: there's an id, and it matches a single chapter. if (foundChapter == null) { foreach (var chapter in Chapters) { if (chapter.Anchor == chapterid || chapter.FileName == chapterid) { foundChapter = chapter; break; } } } if (foundChapter == null && location.HtmlIndex >= 0) { var html = Book.ResourcesHtmlOrdered[location.HtmlIndex]; foreach (var chapter in Chapters) { // FAIL: Intro to Planetary Nebulae the location is html 8, id tit1 which is shared by multiple chapters. if (html.Href.EndsWith(chapter.FileName)) { foundChapter = chapter; break; } } } // Worse case scenario, but it's better to display something if (foundChapter == null) { foreach (var chapter in Chapters) { if (string.IsNullOrEmpty(chapterid)) { App.Error($"ChapterDisplay:Navigate({location}) was asked to find an empty chapter"); foundChapter = chapter; break; } } } if (foundChapter == null) { // Truly desperate. if (Chapters.Count > 0) { App.Error($"ChapterDisplay:Navigate({location}) completely failed"); foundChapter = Chapters[0]; } else { App.Error($"ChapterDisplay:Navigate({location}) last ditch completely failed -- no chapters at all!"); } } if (foundChapter != null) { // Select this one uiChapterList.SelectedItem = foundChapter; uiChapterList.ScrollIntoView(foundChapter); return; // all done! } }