Add MakefileDetector for text viewer

This commit is contained in:
ema
2025-07-09 03:24:42 +08:00
parent d6cc984267
commit 0a79d59c79
13 changed files with 220 additions and 14 deletions

View File

@@ -27,13 +27,16 @@ public class FormatDetector
[
new XMLDetector(),
new JSONDetector(),
new MakefileDetector(),
];
public static IFormatDetector Detect(string text)
public static IFormatDetector Detect(string path, string text)
{
_ = path;
if (string.IsNullOrWhiteSpace(text)) return null;
return Instance.TextDetectors.Where(detector => detector.Detect(text))
return Instance.TextDetectors.Where(detector => detector.Detect(path, text))
.FirstOrDefault();
}
}
@@ -44,5 +47,5 @@ public interface IFormatDetector
public string Extension { get; }
public bool Detect(string text);
public bool Detect(string path, string text);
}

View File

@@ -26,8 +26,10 @@ public class JSONDetector : IFormatDetector
public string Extension => ".json";
public bool Detect(string text)
public bool Detect(string path, string text)
{
_ = path;
if (string.IsNullOrWhiteSpace(text)) return false;
var span = text.AsSpan();

View File

@@ -0,0 +1,35 @@
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.IO;
namespace QuickLook.Plugin.TextViewer.Detectors;
public class MakefileDetector : IFormatDetector
{
public string Name => "Makefile";
public string Extension => ".mk";
public bool Detect(string path, string text)
{
if (string.IsNullOrWhiteSpace(text)) return false;
return "Makefile".Equals(Path.GetFileName(path), StringComparison.OrdinalIgnoreCase);
}
}

View File

@@ -27,8 +27,10 @@ public class XMLDetector : IFormatDetector
public string Extension => ".xml";
public bool Detect(string text)
public bool Detect(string path, string text)
{
_ = path;
return Signature.IsMatch(text);
}
}

View File

@@ -1,5 +1,5 @@
<?xml version="1.0"?>
<SyntaxDefinition name="JavaScript" extensions=".js;.jsx;.mjs;.cjs;" xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008">
<SyntaxDefinition name="JavaScript" extensions=".js;.jsx;.mjs;.cjs" xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008">
<Color name="Digits" foreground="#FFb5cea8" fontStyle="normal" fontWeight="normal" exampleText="3.14"/>
<Color name="Comment" foreground="#FF57A64A" exampleText="// comment"/>
<Color name="String" foreground="#FFD69D85" exampleText="var text = &quot;Hello, World!&quot;;" />

View File

@@ -0,0 +1,164 @@
<?xml version="1.0" encoding="utf-8"?>
<SyntaxDefinition name="Makefile" extensions=".makefile;.mk;.mak">
<Environment>
<Default color="#D4D4D4" bgcolor="#1E1E1E"/>
<Selection color="#1E1E1E" bgcolor="#264F78"/>
<LineNumbers color="#858585" bgcolor="#1E1E1E"/>
<CaretMarker color="#AEAFAD"/>
<VRuler color="#333337"/>
<FoldLine color="#858585" bgcolor="#1E1E1E"/>
<FoldMarker color="#D4D4D4" bgcolor="#2D2D2D"/>
<SelectedFoldLine color="#D4D4D4" bgcolor="#23272E"/>
<EOLMarkers color="#404040"/>
<SpaceMarkers color="#404040"/>
<TabMarkers color="#404040"/>
<InvalidLines color="#F44747"/>
</Environment>
<Properties>
<Property name="LineCommentBegin" value="#"/>
</Properties>
<Digits name="Digits" color="#B5CEA8"/>
<RuleSets>
<RuleSet ignorecase="false">
<Delimiters>:=(){}[]$@%*?</Delimiters>
<!-- Line comments starting with # -->
<Span name="LineComment" stopateol="true" color="#6A9955" bold="false" italic="false">
<Begin>#</Begin>
</Span>
<!-- Variables (pattern: $(VAR) or ${VAR}) -->
<Span name="Variable" color="#DCDCAA" bold="false" italic="false">
<Begin>$(</Begin>
<End>)</End>
</Span>
<Span name="Variable" color="#DCDCAA" bold="false" italic="false">
<Begin>${</Begin>
<End>}</End>
</Span>
<!-- String literals -->
<Span name="String" color="#CE9178" stopateol="true" bold="false" italic="false">
<Begin>"</Begin>
<End>"</End>
</Span>
<Span name="String" color="#CE9178" stopateol="true" bold="false" italic="false">
<Begin>'</Begin>
<End>'</End>
</Span>
<!-- Special characters and operators -->
<MarkFollowing markmarker="true" color="#D7BA7D" bold="false" italic="false">@</MarkFollowing>
<MarkFollowing markmarker="true" color="#FF6B6B" bold="false" italic="false">-</MarkFollowing>
<MarkFollowing markmarker="true" color="#C586C0" bold="false" italic="false">+</MarkFollowing>
<!-- Keywords for common make functions and directives -->
<KeyWords name="Keywords" color="#C586C0" bold="false" italic="false">
<Key word="include"/>
<Key word="ifdef"/>
<Key word="ifndef"/>
<Key word="ifeq"/>
<Key word="ifneq"/>
<Key word="else"/>
<Key word="endif"/>
<Key word="define"/>
<Key word="endef"/>
<Key word="export"/>
<Key word="unexport"/>
<Key word="override"/>
</KeyWords>
<!-- Make functions -->
<KeyWords name="Functions" color="#4EC9B0" bold="false" italic="false">
<Key word="patsubst"/>
<Key word="subst"/>
<Key word="strip"/>
<Key word="findstring"/>
<Key word="filter"/>
<Key word="filter-out"/>
<Key word="sort"/>
<Key word="word"/>
<Key word="wordlist"/>
<Key word="words"/>
<Key word="firstword"/>
<Key word="lastword"/>
<Key word="dir"/>
<Key word="notdir"/>
<Key word="suffix"/>
<Key word="basename"/>
<Key word="addsuffix"/>
<Key word="addprefix"/>
<Key word="join"/>
<Key word="wildcard"/>
<Key word="realpath"/>
<Key word="abspath"/>
<Key word="if"/>
<Key word="or"/>
<Key word="and"/>
<Key word="foreach"/>
<Key word="call"/>
<Key word="value"/>
<Key word="eval"/>
<Key word="origin"/>
<Key word="flavor"/>
<Key word="shell"/>
<Key word="error"/>
<Key word="warning"/>
<Key word="info"/>
</KeyWords>
<!-- Built-in variables -->
<KeyWords name="BuiltinVars" color="#9CDCFE" bold="false" italic="false">
<Key word="CC"/>
<Key word="CXX"/>
<Key word="CFLAGS"/>
<Key word="CXXFLAGS"/>
<Key word="LDFLAGS"/>
<Key word="MAKE"/>
<Key word="MAKEFILE_LIST"/>
<Key word="CURDIR"/>
<Key word="SHELL"/>
<Key word="AR"/>
<Key word="AS"/>
<Key word="LD"/>
<Key word="YACC"/>
<Key word="LEX"/>
</KeyWords>
<!-- Automatic variables -->
<KeyWords name="AutoVars" color="#FFD700" bold="true" italic="false">
<Key word="$@"/>
<Key word="$%"/>
<Key word="$&lt;"/>
<Key word="$?"/>
<Key word="$^"/>
<Key word="$+"/>
<Key word="$*"/>
<Key word="$(@D)"/>
<Key word="$(@F)"/>
<Key word="$(*D)"/>
<Key word="$(*F)"/>
<Key word="$(%D)"/>
<Key word="$(%F)"/>
<Key word="$(&lt;D)"/>
<Key word="$(&lt;F)"/>
<Key word="$(^D)"/>
<Key word="$(^F)"/>
<Key word="$(+D)"/>
<Key word="$(+F)"/>
<Key word="$(?D)"/>
<Key word="$(?F)"/>
</KeyWords>
</RuleSet>
</RuleSets>
</SyntaxDefinition>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<SyntaxDefinition name="Text" extensions=".txt;">
<SyntaxDefinition name="Text" extensions=".txt">
<Environment />
<Properties />
<Digits />

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<SyntaxDefinition name="TypeScript" extensions=".ts;.tsx;.uts;">
<SyntaxDefinition name="TypeScript" extensions=".ts;.tsx;.uts">
<Environment>
<Default color="#D4D4D4" bgcolor="#1E1E1E"/>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<SyntaxDefinition name="JavaScript" extensions=".js;.jsx;.mjs;.cjs;">
<SyntaxDefinition name="JavaScript" extensions=".js;.jsx;.mjs;.cjs">
<Environment>
<Default color="Black" bgcolor="#FFFFFF"/>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<SyntaxDefinition name="Text" extensions=".txt;">
<SyntaxDefinition name="Text" extensions=".txt">
<Environment />
<Properties />
<Digits />

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<SyntaxDefinition name="TypeScript" extensions=".ts;.tsx;.uts;">
<SyntaxDefinition name="TypeScript" extensions=".ts;.tsx;.uts">
<Environment>
<Default color="Black" bgcolor="#FFFFFF"/>

View File

@@ -220,7 +220,7 @@ public partial class TextViewerPanel : TextEditor, IDisposable
Dispatcher.BeginInvoke(() =>
{
var extension = Path.GetExtension(path);
var highlighting = HighlightingThemeManager.GetHighlightingByExtensionOrDetector(extension, text);
var highlighting = HighlightingThemeManager.GetHighlightingByExtensionOrDetector(path, extension, text);
Encoding = encoding;
SyntaxHighlighting = bufferCopy.Length > maxHighlightingLength

View File

@@ -42,7 +42,7 @@ public class HighlightingThemeManager
InitCustomHighlighting();
}
public static HighlightingTheme GetHighlightingByExtensionOrDetector(string extension, string text = null)
public static HighlightingTheme GetHighlightingByExtensionOrDetector(string path, string extension, string text = null)
{
if (Light is null || Dark is null) return HighlightingTheme.Default;
@@ -56,7 +56,7 @@ public class HighlightingThemeManager
{
var useFormatDetector = SettingHelper.Get("UseFormatDetector", true, "QuickLook.Plugin.TextViewer");
if (useFormatDetector && FormatDetector.Detect(text)?.Extension is string detectExtension)
if (useFormatDetector && FormatDetector.Detect(path, text)?.Extension is string detectExtension)
{
highlightingTheme = GetDefinitionByExtension(nameof(Dark), detectExtension)
?? GetDefinitionByExtension(nameof(Light), detectExtension);