diff --git a/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/BookHtmlContent.cs b/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/BookHtmlContent.cs new file mode 100644 index 0000000..ff061bf --- /dev/null +++ b/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/BookHtmlContent.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Media.Imaging; +using TheArtOfDev.HtmlRenderer.Core.Entities; +using TheArtOfDev.HtmlRenderer.WPF; +using VersOne.Epub; + +namespace QuickLook.Plugin.EpubViewer +{ + public class BookHtmlContent : HtmlPanel + { + public static readonly DependencyProperty ChapterRefProperty = DependencyProperty.Register("ChapterRef", typeof(EpubChapterRef), typeof(BookHtmlContent), new PropertyMetadata(OnChapterRefChanged)); + + public EpubChapterRef ChapterRef + { + get { return (EpubChapterRef)GetValue(ChapterRefProperty); } + set { SetValue(ChapterRefProperty, value); } + } + + public static readonly DependencyProperty EpubBookProperty = DependencyProperty.Register("EpubBook", typeof(EpubBookRef), typeof(BookHtmlContent), new PropertyMetadata(null)); + + public EpubBookRef EpubBook + { + get { return (EpubBookRef)GetValue(EpubBookProperty); } + set { SetValue(EpubBookProperty, value); } + } + + protected override void OnStylesheetLoad(HtmlStylesheetLoadEventArgs args) + { + string styleSheetFilePath = GetFullPath(ChapterRef.ContentFileName, args.Src); + if (EpubBook.Content.Css.TryGetValue(styleSheetFilePath, out EpubTextContentFileRef styleSheetContent)) + { + args.SetStyleSheet = styleSheetContent.ReadContentAsText(); + } + } + + protected override async void OnImageLoad(HtmlImageLoadEventArgs args) + { + string imageFilePath = GetFullPath(ChapterRef.ContentFileName, args.Src); + if (EpubBook.Content.Images.TryGetValue(imageFilePath, out EpubByteContentFileRef imageContent)) + { + using (MemoryStream imageStream = new MemoryStream(await imageContent.ReadContentAsBytesAsync())) + { + BitmapImage bitmapImage = new BitmapImage(); + bitmapImage.BeginInit(); + bitmapImage.StreamSource = imageStream; + bitmapImage.CacheOption = BitmapCacheOption.OnLoad; + bitmapImage.EndInit(); + bitmapImage.Freeze(); + args.Callback(bitmapImage); + } + args.Handled = true; + } + } + + private string GetFullPath(string htmlFilePath, string relativePath) + { + if (relativePath.StartsWith("/")) + { + return relativePath.Length > 1 ? relativePath.Substring(1) : String.Empty; + } + string basePath = System.IO.Path.GetDirectoryName(htmlFilePath); + while (relativePath.StartsWith("../")) + { + relativePath = relativePath.Length > 3 ? relativePath.Substring(3) : String.Empty; + basePath = System.IO.Path.GetDirectoryName(basePath); + } + string fullPath = String.Concat(basePath.Replace('\\', '/'), '/', relativePath); + return fullPath.Length > 1 ? fullPath.Substring(1) : String.Empty; + } + + private static async void OnChapterRefChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) + { + BookHtmlContent bookHtmlContent = dependencyObject as BookHtmlContent; + if (bookHtmlContent == null || bookHtmlContent.ChapterRef == null) + { + return; + } + bookHtmlContent.Text = await bookHtmlContent.ChapterRef.ReadHtmlContentAsync(); + } + } +} diff --git a/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/EpubViewerControl.xaml b/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/EpubViewerControl.xaml index 561d74d..5f07b68 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/EpubViewerControl.xaml +++ b/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/EpubViewerControl.xaml @@ -39,7 +39,7 @@ Style="{DynamicResource CaptionTextButtonStyle}"/> - + diff --git a/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/EpubViewerControl.xaml.cs b/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/EpubViewerControl.xaml.cs index 97c3d79..a9a9577 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/EpubViewerControl.xaml.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/EpubViewerControl.xaml.cs @@ -40,32 +40,6 @@ namespace QuickLook.Plugin.EpubViewer Resources.MergedDictionaries.Clear(); this.DataContext = this; - this.pagePanel.ImageLoad += PagePanel_ImageLoad; - } - - private void PagePanel_ImageLoad(object sender, TheArtOfDev.HtmlRenderer.WPF.RoutedEvenArgs args) - { - var key = this.epubBook.Content.Images.Keys.FirstOrDefault(k => args.Data.Src.IndexOf(k, StringComparison.InvariantCultureIgnoreCase) >= 0); - if (key != null) - { - var img = ImageFromStream(this.epubBook.Content.Images[key].GetContentStream()); - args.Data.Callback(img); - args.Handled = true; - } - } - - /// - /// Get image by resource key. - /// - public static BitmapImage ImageFromStream(Stream stream) - { - var bitmapImage = new BitmapImage(); - bitmapImage.BeginInit(); - bitmapImage.StreamSource = stream; - bitmapImage.CacheOption = BitmapCacheOption.OnLoad; - bitmapImage.EndInit(); - // bitmapImage.Freeze(); - return bitmapImage; } internal void SetContent(EpubBookRef epubBook) @@ -73,7 +47,8 @@ namespace QuickLook.Plugin.EpubViewer this.epubBook = epubBook; this.chapterRefs = Flatten(epubBook.GetChapters()); this.currChapter = 0; - this.pagePanel.Text = chapterRefs[currChapter].ReadHtmlContent(); + this.pagePanel.EpubBook = epubBook; + this.pagePanel.ChapterRef = chapterRefs[currChapter]; OnPropertyChanged("Chapter"); } @@ -87,12 +62,12 @@ namespace QuickLook.Plugin.EpubViewer this.NextChapter(); } - private async void NextChapter() + private void NextChapter() { try { this.currChapter = Math.Min(this.currChapter + 1, chapterRefs.Count - 1); - this.pagePanel.Text = await chapterRefs[currChapter].ReadHtmlContentAsync(); + this.pagePanel.ChapterRef = chapterRefs[currChapter]; if (chapterRefs[currChapter].Anchor != null) { this.pagePanel.ScrollToElement(chapterRefs[currChapter].Anchor); @@ -112,12 +87,12 @@ namespace QuickLook.Plugin.EpubViewer this.PrevChapter(); } - private async void PrevChapter() + private void PrevChapter() { try { this.currChapter = Math.Max(this.currChapter - 1, 0); - this.pagePanel.Text = await chapterRefs[currChapter].ReadHtmlContentAsync(); + this.pagePanel.ChapterRef = chapterRefs[currChapter]; if (chapterRefs[currChapter].Anchor != null) { this.pagePanel.ScrollToElement(chapterRefs[currChapter].Anchor); diff --git a/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/QuickLook.Plugin.EpubViewer.csproj b/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/QuickLook.Plugin.EpubViewer.csproj index 5764929..4fa1c47 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/QuickLook.Plugin.EpubViewer.csproj +++ b/QuickLook.Plugin/QuickLook.Plugin.EpubViewer/QuickLook.Plugin.EpubViewer.csproj @@ -63,6 +63,7 @@ Properties\GitVersion.cs +