mirror of
https://github.com/QL-Win/QuickLook.git
synced 2025-09-13 11:09:06 +00:00
Add MakefileDetector for text viewer
This commit is contained in:
@@ -27,13 +27,16 @@ public class FormatDetector
|
|||||||
[
|
[
|
||||||
new XMLDetector(),
|
new XMLDetector(),
|
||||||
new JSONDetector(),
|
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;
|
if (string.IsNullOrWhiteSpace(text)) return null;
|
||||||
|
|
||||||
return Instance.TextDetectors.Where(detector => detector.Detect(text))
|
return Instance.TextDetectors.Where(detector => detector.Detect(path, text))
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -44,5 +47,5 @@ public interface IFormatDetector
|
|||||||
|
|
||||||
public string Extension { get; }
|
public string Extension { get; }
|
||||||
|
|
||||||
public bool Detect(string text);
|
public bool Detect(string path, string text);
|
||||||
}
|
}
|
||||||
|
@@ -26,8 +26,10 @@ public class JSONDetector : IFormatDetector
|
|||||||
|
|
||||||
public string Extension => ".json";
|
public string Extension => ".json";
|
||||||
|
|
||||||
public bool Detect(string text)
|
public bool Detect(string path, string text)
|
||||||
{
|
{
|
||||||
|
_ = path;
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(text)) return false;
|
if (string.IsNullOrWhiteSpace(text)) return false;
|
||||||
|
|
||||||
var span = text.AsSpan();
|
var span = text.AsSpan();
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
@@ -27,8 +27,10 @@ public class XMLDetector : IFormatDetector
|
|||||||
|
|
||||||
public string Extension => ".xml";
|
public string Extension => ".xml";
|
||||||
|
|
||||||
public bool Detect(string text)
|
public bool Detect(string path, string text)
|
||||||
{
|
{
|
||||||
|
_ = path;
|
||||||
|
|
||||||
return Signature.IsMatch(text);
|
return Signature.IsMatch(text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0"?>
|
<?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="Digits" foreground="#FFb5cea8" fontStyle="normal" fontWeight="normal" exampleText="3.14"/>
|
||||||
<Color name="Comment" foreground="#FF57A64A" exampleText="// comment"/>
|
<Color name="Comment" foreground="#FF57A64A" exampleText="// comment"/>
|
||||||
<Color name="String" foreground="#FFD69D85" exampleText="var text = "Hello, World!";" />
|
<Color name="String" foreground="#FFD69D85" exampleText="var text = "Hello, World!";" />
|
||||||
|
@@ -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="$<"/>
|
||||||
|
<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="$(<D)"/>
|
||||||
|
<Key word="$(<F)"/>
|
||||||
|
<Key word="$(^D)"/>
|
||||||
|
<Key word="$(^F)"/>
|
||||||
|
<Key word="$(+D)"/>
|
||||||
|
<Key word="$(+F)"/>
|
||||||
|
<Key word="$(?D)"/>
|
||||||
|
<Key word="$(?F)"/>
|
||||||
|
</KeyWords>
|
||||||
|
</RuleSet>
|
||||||
|
</RuleSets>
|
||||||
|
</SyntaxDefinition>
|
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<SyntaxDefinition name="Text" extensions=".txt;">
|
<SyntaxDefinition name="Text" extensions=".txt">
|
||||||
<Environment />
|
<Environment />
|
||||||
<Properties />
|
<Properties />
|
||||||
<Digits />
|
<Digits />
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<SyntaxDefinition name="TypeScript" extensions=".ts;.tsx;.uts;">
|
<SyntaxDefinition name="TypeScript" extensions=".ts;.tsx;.uts">
|
||||||
|
|
||||||
<Environment>
|
<Environment>
|
||||||
<Default color="#D4D4D4" bgcolor="#1E1E1E"/>
|
<Default color="#D4D4D4" bgcolor="#1E1E1E"/>
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<SyntaxDefinition name="JavaScript" extensions=".js;.jsx;.mjs;.cjs;">
|
<SyntaxDefinition name="JavaScript" extensions=".js;.jsx;.mjs;.cjs">
|
||||||
|
|
||||||
<Environment>
|
<Environment>
|
||||||
<Default color="Black" bgcolor="#FFFFFF"/>
|
<Default color="Black" bgcolor="#FFFFFF"/>
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<SyntaxDefinition name="Text" extensions=".txt;">
|
<SyntaxDefinition name="Text" extensions=".txt">
|
||||||
<Environment />
|
<Environment />
|
||||||
<Properties />
|
<Properties />
|
||||||
<Digits />
|
<Digits />
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<SyntaxDefinition name="TypeScript" extensions=".ts;.tsx;.uts;">
|
<SyntaxDefinition name="TypeScript" extensions=".ts;.tsx;.uts">
|
||||||
|
|
||||||
<Environment>
|
<Environment>
|
||||||
<Default color="Black" bgcolor="#FFFFFF"/>
|
<Default color="Black" bgcolor="#FFFFFF"/>
|
||||||
|
@@ -220,7 +220,7 @@ public partial class TextViewerPanel : TextEditor, IDisposable
|
|||||||
Dispatcher.BeginInvoke(() =>
|
Dispatcher.BeginInvoke(() =>
|
||||||
{
|
{
|
||||||
var extension = Path.GetExtension(path);
|
var extension = Path.GetExtension(path);
|
||||||
var highlighting = HighlightingThemeManager.GetHighlightingByExtensionOrDetector(extension, text);
|
var highlighting = HighlightingThemeManager.GetHighlightingByExtensionOrDetector(path, extension, text);
|
||||||
|
|
||||||
Encoding = encoding;
|
Encoding = encoding;
|
||||||
SyntaxHighlighting = bufferCopy.Length > maxHighlightingLength
|
SyntaxHighlighting = bufferCopy.Length > maxHighlightingLength
|
||||||
|
@@ -42,7 +42,7 @@ public class HighlightingThemeManager
|
|||||||
InitCustomHighlighting();
|
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;
|
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");
|
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)
|
highlightingTheme = GetDefinitionByExtension(nameof(Dark), detectExtension)
|
||||||
?? GetDefinitionByExtension(nameof(Light), detectExtension);
|
?? GetDefinitionByExtension(nameof(Light), detectExtension);
|
||||||
|
Reference in New Issue
Block a user