Add RTL support for markdown files

Co-authored-by: emako <24737061+emako@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2025-07-23 14:59:35 +00:00
committed by ema
parent a4d118e11f
commit 4840a87858
4 changed files with 89 additions and 2 deletions

View File

@@ -16,10 +16,12 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using Microsoft.Web.WebView2.Core;
using QuickLook.Common.Helpers;
using QuickLook.Plugin.HtmlViewer;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
@@ -78,7 +80,33 @@ public class MarkdownPanel : WebpagePanel
var content = encoding.GetString(bytes);
var template = ReadString("/md2html.html");
var html = template.Replace("{{content}}", content);
// Check for RTL support similar to TextViewer
bool isRtl = false;
var extension = Path.GetExtension(path);
// Apply RTL support to all markdown-like extensions handled by this plugin
var supportedExtensions = new[]
{
".md", ".markdown", ".mdx", ".mmd", ".mkd", ".mdwn", ".mdown",
".mdc", ".qmd", ".rmd", ".rmarkdown", ".apib", ".mdtxt", ".mdtext"
};
if (supportedExtensions.Any(ext => extension.Equals(ext, StringComparison.OrdinalIgnoreCase)))
{
if (CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft)
{
string isSupportRTL = TranslationHelper.Get("IsSupportRTL",
failsafe: bool.TrueString,
domain: Assembly.GetExecutingAssembly().GetName().Name);
if (bool.TrueString.Equals(isSupportRTL, StringComparison.OrdinalIgnoreCase))
isRtl = true;
}
}
var html = template.Replace("{{content}}", content)
.Replace("{{rtl}}", isRtl ? "rtl" : "ltr");
return html;
}

View File

@@ -83,6 +83,9 @@
<EmbeddedResource Include="Resources\**\*">
<LogicalName>QuickLook.Plugin.MarkdownViewer.Resources.%(RecursiveDir)%(Filename)%(Extension)</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="Translations.config">
<LogicalName>QuickLook.Plugin.MarkdownViewer.Translations.config</LogicalName>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html dir="{{rtl}}">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -144,6 +144,34 @@
cursor: ew-resize;
user-select: none;
}
/* RTL support */
html[dir="rtl"] .container {
flex-direction: row-reverse;
}
html[dir="rtl"] #toc {
right: 0;
left: auto;
}
html[dir="rtl"] .table-of-contents a {
border-right: 2px solid transparent;
border-left: none;
margin-right: -1em;
margin-left: 0;
padding-right: calc(1em - 2px);
padding-left: 0;
}
html[dir="rtl"] .table-of-contents .active {
border-right: 2px solid var(--fgColor-accent);
border-left: none;
margin-right: -1em;
margin-left: 0;
padding-right: calc(1em - 2px);
padding-left: 0;
}
</style>
<textarea id="text-input" style="display: none">{{content}}</textarea>
@@ -337,6 +365,21 @@
if (e.code === "Space") {
e.preventDefault();
}
// Support keyboard shortcuts for RTL and LTR text direction
// RTL: Ctrl + RShift
// LTR: Ctrl + LShift
if ((e.ctrlKey || e.metaKey)) {
if (e.shiftKey && e.location === KeyboardEvent.DOM_KEY_LOCATION_RIGHT) {
// Right Shift + Ctrl: RTL
document.documentElement.setAttribute('dir', 'rtl');
e.preventDefault();
} else if (e.shiftKey && e.location === KeyboardEvent.DOM_KEY_LOCATION_LEFT) {
// Left Shift + Ctrl: LTR
document.documentElement.setAttribute('dir', 'ltr');
e.preventDefault();
}
}
});
});
</script>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Translations>
<ar>
<IsSupportRTL>True</IsSupportRTL>
</ar>
<he>
<IsSupportRTL>True</IsSupportRTL>
</he>
<en>
<IsSupportRTL>False</IsSupportRTL>
</en>
</Translations>