Skip to content

Commit

Permalink
Add MarkdownViewer
Browse files Browse the repository at this point in the history
  • Loading branch information
xupefei committed May 14, 2017
1 parent f18aa02 commit a65ddce
Show file tree
Hide file tree
Showing 17 changed files with 638 additions and 49 deletions.
35 changes: 35 additions & 0 deletions QuickLook.Plugin/QuickLook.Plugin.HtmlViewer/MenuHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright © 2010-2017 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

using CefSharp;

namespace QuickLook.Plugin.HtmlViewer
{
internal class MenuHandler : IContextMenuHandler
{
public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame,
IContextMenuParams parameters,
IMenuModel model)
{
}

public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame,
IContextMenuParams parameters,
CefMenuCommand commandId, CefEventFlags eventFlags)
{
return false;
}

public void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame)
{
}

public bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame,
IContextMenuParams parameters,
IMenuModel model, IRunContextMenuCallback callback)
{
return true;
}
}
}
3 changes: 2 additions & 1 deletion QuickLook.Plugin/QuickLook.Plugin.HtmlViewer/Plugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public class Plugin : IViewer
{
private WebkitPanel _panel;

public int Priority => Int32.MaxValue;
public int Priority => int.MaxValue;

public bool CanHandle(string path)
{
Expand Down Expand Up @@ -37,6 +37,7 @@ public void View(string path, ContextObject context)
{
_panel = new WebkitPanel();
context.ViewerContent = _panel;
context.Title = Path.IsPathRooted(path) ? Path.GetFileName(path) : path;

_panel.Navigate(path);
context.IsBusy = false;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;

Expand Down Expand Up @@ -31,13 +29,13 @@
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]


[assembly:ThemeInfo(
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]


Expand All @@ -52,4 +50,4 @@
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>

<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,10 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="MenuHandler.cs" />
<Compile Include="Plugin.cs" />
<Compile Include="RequestHandler.cs" />
<Compile Include="UrlHelper.cs" />
<Compile Include="WebkitPanel.xaml.cs">
<DependentUpon>WebkitPanel.xaml</DependentUpon>
<SubType>Code</SubType>
Expand Down
113 changes: 113 additions & 0 deletions QuickLook.Plugin/QuickLook.Plugin.HtmlViewer/RequestHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
// Copyright © 2010-2017 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

using System.Security.Cryptography.X509Certificates;
using CefSharp;

namespace QuickLook.Plugin.HtmlViewer
{
public class RequestHandler : IRequestHandler
{
bool IRequestHandler.OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame,
IRequest request, bool isRedirect)
{
return request.TransitionType != TransitionType.Explicit;
}

bool IRequestHandler.OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame,
string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
{
return OnOpenUrlFromTab(browserControl, browser, frame, targetUrl, targetDisposition, userGesture);
}

bool IRequestHandler.OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode,
string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
{
callback.Dispose();
return false;
}

void IRequestHandler.OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
{
}

CefReturnValue IRequestHandler.OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame,
IRequest request, IRequestCallback callback)
{
return CefReturnValue.Continue;
}

bool IRequestHandler.GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame,
bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
{
callback.Dispose();
return false;
}

bool IRequestHandler.OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy,
string host, int port, X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
{
//NOTE: If you do not wish to implement this method returning false is the default behaviour
// We also suggest you explicitly Dispose of the callback as it wraps an unmanaged resource.

return OnSelectClientCertificate(browserControl, browser, isProxy, host, port, certificates, callback);
}

void IRequestHandler.OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser,
CefTerminationStatus status)
{
}

bool IRequestHandler.OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl,
long newSize, IRequestCallback callback)
{
callback.Dispose();
return false;
}

void IRequestHandler.OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame,
IRequest request, IResponse response, ref string newUrl)
{
}

bool IRequestHandler.OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url)
{
return false;
}

void IRequestHandler.OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
{
}

bool IRequestHandler.OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame,
IRequest request, IResponse response)
{
return false;
}

IResponseFilter IRequestHandler.GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser,
IFrame frame, IRequest request, IResponse response)
{
return null;
}

void IRequestHandler.OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame,
IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
{
}

protected virtual bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame,
string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
{
return false;
}

protected virtual bool OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy,
string host, int port, X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
{
callback.Dispose();
return false;
}
}
}
27 changes: 27 additions & 0 deletions QuickLook.Plugin/QuickLook.Plugin.HtmlViewer/UrlHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System.IO;
using System.Text;

namespace QuickLook.Plugin.HtmlViewer
{
internal static class UrlHelper
{
internal static string FilePathToFileUrl(string filePath)
{
var uri = new StringBuilder();
foreach (var v in filePath)
if (v >= 'a' && v <= 'z' || v >= 'A' && v <= 'Z' || v >= '0' && v <= '9' ||
v == '+' || v == '/' || v == ':' || v == '.' || v == '-' || v == '_' || v == '~' ||
v > '\xFF')
uri.Append(v);
else if (v == Path.DirectorySeparatorChar || v == Path.AltDirectorySeparatorChar)
uri.Append('/');
else
uri.Append($"%{(int) v:X2}");
if (uri.Length >= 2 && uri[0] == '/' && uri[1] == '/') // UNC path
uri.Insert(0, "file:");
else
uri.Insert(0, "file:///");
return uri.ToString();
}
}
}
8 changes: 4 additions & 4 deletions QuickLook.Plugin/QuickLook.Plugin.HtmlViewer/WebkitPanel.xaml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<UserControl x:Class="QuickLook.Plugin.HtmlViewer.WebkitPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:QuickLook.Plugin.HtmlViewer"
xmlns:cef="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
mc:Ignorable="d"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<cef:ChromiumWebBrowser x:Name="browser" />
</Grid>
</UserControl>
</UserControl>
55 changes: 19 additions & 36 deletions QuickLook.Plugin/QuickLook.Plugin.HtmlViewer/WebkitPanel.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Text;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using CefSharp;
Expand All @@ -12,10 +11,10 @@ namespace QuickLook.Plugin.HtmlViewer
/// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
public partial class WebkitPanel : UserControl,IDisposable
public partial class WebkitPanel : UserControl, IDisposable
{
private string _cefPath =
Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
private readonly string _cefPath =
Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));

public WebkitPanel()
{
Expand All @@ -28,52 +27,36 @@ public WebkitPanel()
LocalesDirPath = Path.Combine(_cefPath, "locales"),
ResourcesDirPath = _cefPath,
LogSeverity = LogSeverity.Disable,
CefCommandLineArgs = {new KeyValuePair<string, string>("disable-gpu", "1")},
CefCommandLineArgs = {new KeyValuePair<string, string>("disable-gpu", "1")}
});

InitializeComponent();

Application.Current.Exit += (sender, e) => Cef.Shutdown();

browser.RequestHandler = new RequestHandler();
browser.MenuHandler = new MenuHandler();
}

public void Dispose()
{
browser?.Dispose();
}

public void Navigate(string path)
{
if (Path.IsPathRooted(path))
path = FilePathToFileUrl(path);
path = UrlHelper.FilePathToFileUrl(path);

browser.IsBrowserInitializedChanged += (sender, e) => browser.Load(path);
}

private static string FilePathToFileUrl(string filePath)
public void LoadHtml(string html, string path)
{
StringBuilder uri = new StringBuilder();
foreach (char v in filePath)
{
if ((v >= 'a' && v <= 'z') || (v >= 'A' && v <= 'Z') || (v >= '0' && v <= '9') ||
v == '+' || v == '/' || v == ':' || v == '.' || v == '-' || v == '_' || v == '~' ||
v > '\xFF')
{
uri.Append(v);
}
else if (v == Path.DirectorySeparatorChar || v == Path.AltDirectorySeparatorChar)
{
uri.Append('/');
}
else
{
uri.Append($"%{(int) v:X2}");
}
}
if (uri.Length >= 2 && uri[0] == '/' && uri[1] == '/') // UNC path
uri.Insert(0, "file:");
else
uri.Insert(0, "file:///");
return uri.ToString();
}

public void Dispose()
{
browser?.Dispose();
if (Path.IsPathRooted(path))
path = UrlHelper.FilePathToFileUrl(path);

browser.IsBrowserInitializedChanged += (sender, e) => browser.LoadHtml(html, path);
}
}
}
Loading

0 comments on commit a65ddce

Please sign in to comment.