mirror of
https://github.com/ralsina/tartrazine.git
synced 2024-09-20 07:21:22 +00:00
Basic theme parser
This commit is contained in:
parent
7392c8a74e
commit
3a37f8bdc7
@ -7,9 +7,7 @@ module Tartrazine
|
|||||||
# false means it's not set
|
# false means it's not set
|
||||||
# nil means inherit from parent style
|
# nil means inherit from parent style
|
||||||
property bold : Bool?
|
property bold : Bool?
|
||||||
property nobold : Bool?
|
|
||||||
property italic : Bool?
|
property italic : Bool?
|
||||||
property notalic : Bool?
|
|
||||||
property underline : Bool?
|
property underline : Bool?
|
||||||
|
|
||||||
# These properties are either set or nil
|
# These properties are either set or nil
|
||||||
@ -17,6 +15,27 @@ module Tartrazine
|
|||||||
property background : String?
|
property background : String?
|
||||||
property border : String?
|
property border : String?
|
||||||
property color : String?
|
property color : String?
|
||||||
|
|
||||||
|
# Styles are incomplete by default and inherit
|
||||||
|
# from parents. If this is true, this style
|
||||||
|
# is already complete and should not inherit
|
||||||
|
# anything
|
||||||
|
property? complete : Bool = false
|
||||||
|
|
||||||
|
macro merge_prop(prop)
|
||||||
|
new.{{prop}} = other.{{prop}}.nil? ? self.{{prop}} : other.{{prop}}
|
||||||
|
end
|
||||||
|
|
||||||
|
def +(other : Style)
|
||||||
|
new = Style.new
|
||||||
|
merge_prop bold
|
||||||
|
merge_prop italic
|
||||||
|
merge_prop underline
|
||||||
|
merge_prop background
|
||||||
|
merge_prop border
|
||||||
|
merge_prop color
|
||||||
|
new
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class Theme
|
class Theme
|
||||||
@ -26,6 +45,27 @@ module Tartrazine
|
|||||||
|
|
||||||
# Get the style for a token.
|
# Get the style for a token.
|
||||||
def style(token)
|
def style(token)
|
||||||
|
styles[token] = Style.new unless styles.has_key?(token)
|
||||||
|
s = styles[token]
|
||||||
|
|
||||||
|
# We already got the data from the style hierarchy
|
||||||
|
return s if s.complete?
|
||||||
|
|
||||||
|
# Form the hierarchy of parent styles
|
||||||
|
parents = ["Background"]
|
||||||
|
parts = token.underscore.split("_").map(&.capitalize)
|
||||||
|
parts.each_with_index do |_, i|
|
||||||
|
parents << parts[..i].join("")
|
||||||
|
end
|
||||||
|
|
||||||
|
s = parents.map do |parent|
|
||||||
|
styles[parent]
|
||||||
|
end.reduce(s) do |acc, style|
|
||||||
|
acc + style
|
||||||
|
end
|
||||||
|
s.complete = true
|
||||||
|
styles[token] = s
|
||||||
|
s
|
||||||
end
|
end
|
||||||
|
|
||||||
# Load from a Chroma XML file
|
# Load from a Chroma XML file
|
||||||
@ -64,4 +104,4 @@ end
|
|||||||
|
|
||||||
t = Tartrazine::Theme.from_xml(File.read("styles/catppuccin-frappe.xml"))
|
t = Tartrazine::Theme.from_xml(File.read("styles/catppuccin-frappe.xml"))
|
||||||
|
|
||||||
pp! t.styles["Name"]
|
pp! t.style("CommentPreprocFile")
|
||||||
|
@ -1,65 +0,0 @@
|
|||||||
package styles
|
|
||||||
|
|
||||||
import (
|
|
||||||
"embed"
|
|
||||||
"io/fs"
|
|
||||||
"sort"
|
|
||||||
|
|
||||||
"github.com/alecthomas/chroma/v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
//go:embed *.xml
|
|
||||||
var embedded embed.FS
|
|
||||||
|
|
||||||
// Registry of Styles.
|
|
||||||
var Registry = func() map[string]*chroma.Style {
|
|
||||||
registry := map[string]*chroma.Style{}
|
|
||||||
// Register all embedded styles.
|
|
||||||
files, err := fs.ReadDir(embedded, ".")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
for _, file := range files {
|
|
||||||
if file.IsDir() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
r, err := embedded.Open(file.Name())
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
style, err := chroma.NewXMLStyle(r)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
registry[style.Name] = style
|
|
||||||
_ = r.Close()
|
|
||||||
}
|
|
||||||
return registry
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Fallback style. Reassign to change the default fallback style.
|
|
||||||
var Fallback = Registry["swapoff"]
|
|
||||||
|
|
||||||
// Register a chroma.Style.
|
|
||||||
func Register(style *chroma.Style) *chroma.Style {
|
|
||||||
Registry[style.Name] = style
|
|
||||||
return style
|
|
||||||
}
|
|
||||||
|
|
||||||
// Names of all available styles.
|
|
||||||
func Names() []string {
|
|
||||||
out := []string{}
|
|
||||||
for name := range Registry {
|
|
||||||
out = append(out, name)
|
|
||||||
}
|
|
||||||
sort.Strings(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get named style, or Fallback.
|
|
||||||
func Get(name string) *chroma.Style {
|
|
||||||
if style, ok := Registry[name]; ok {
|
|
||||||
return style
|
|
||||||
}
|
|
||||||
return Fallback
|
|
||||||
}
|
|
@ -1,66 +0,0 @@
|
|||||||
package styles
|
|
||||||
|
|
||||||
// Present for backwards compatibility.
|
|
||||||
//
|
|
||||||
// Deprecated: use styles.Get(name) instead.
|
|
||||||
var (
|
|
||||||
Abap = Registry["abap"]
|
|
||||||
Algol = Registry["algol"]
|
|
||||||
AlgolNu = Registry["algol_nu"]
|
|
||||||
Arduino = Registry["arduino"]
|
|
||||||
Autumn = Registry["autumn"]
|
|
||||||
Average = Registry["average"]
|
|
||||||
Base16Snazzy = Registry["base16-snazzy"]
|
|
||||||
Borland = Registry["borland"]
|
|
||||||
BlackWhite = Registry["bw"]
|
|
||||||
CatppuccinFrappe = Registry["catppuccin-frappe"]
|
|
||||||
CatppuccinLatte = Registry["catppuccin-latte"]
|
|
||||||
CatppuccinMacchiato = Registry["catppuccin-macchiato"]
|
|
||||||
CatppuccinMocha = Registry["catppuccin-mocha"]
|
|
||||||
Colorful = Registry["colorful"]
|
|
||||||
DoomOne = Registry["doom-one"]
|
|
||||||
DoomOne2 = Registry["doom-one2"]
|
|
||||||
Dracula = Registry["dracula"]
|
|
||||||
Emacs = Registry["emacs"]
|
|
||||||
Friendly = Registry["friendly"]
|
|
||||||
Fruity = Registry["fruity"]
|
|
||||||
GitHubDark = Registry["github-dark"]
|
|
||||||
GitHub = Registry["github"]
|
|
||||||
GruvboxLight = Registry["gruvbox-light"]
|
|
||||||
Gruvbox = Registry["gruvbox"]
|
|
||||||
HrDark = Registry["hrdark"]
|
|
||||||
HrHighContrast = Registry["hr_high_contrast"]
|
|
||||||
Igor = Registry["igor"]
|
|
||||||
Lovelace = Registry["lovelace"]
|
|
||||||
Manni = Registry["manni"]
|
|
||||||
ModusOperandi = Registry["modus-operandi"]
|
|
||||||
ModusVivendi = Registry["modus-vivendi"]
|
|
||||||
Monokai = Registry["monokai"]
|
|
||||||
MonokaiLight = Registry["monokailight"]
|
|
||||||
Murphy = Registry["murphy"]
|
|
||||||
Native = Registry["native"]
|
|
||||||
Nord = Registry["nord"]
|
|
||||||
OnesEnterprise = Registry["onesenterprise"]
|
|
||||||
ParaisoDark = Registry["paraiso-dark"]
|
|
||||||
ParaisoLight = Registry["paraiso-light"]
|
|
||||||
Pastie = Registry["pastie"]
|
|
||||||
Perldoc = Registry["perldoc"]
|
|
||||||
Pygments = Registry["pygments"]
|
|
||||||
RainbowDash = Registry["rainbow_dash"]
|
|
||||||
RosePineDawn = Registry["rose-pine-dawn"]
|
|
||||||
RosePineMoon = Registry["rose-pine-moon"]
|
|
||||||
RosePine = Registry["rose-pine"]
|
|
||||||
Rrt = Registry["rrt"]
|
|
||||||
SolarizedDark = Registry["solarized-dark"]
|
|
||||||
SolarizedDark256 = Registry["solarized-dark256"]
|
|
||||||
SolarizedLight = Registry["solarized-light"]
|
|
||||||
SwapOff = Registry["swapoff"]
|
|
||||||
Tango = Registry["tango"]
|
|
||||||
Trac = Registry["trac"]
|
|
||||||
Vim = Registry["vim"]
|
|
||||||
VisualStudio = Registry["vs"]
|
|
||||||
Vulcan = Registry["vulcan"]
|
|
||||||
WitchHazel = Registry["witchhazel"]
|
|
||||||
XcodeDark = Registry["xcode-dark"]
|
|
||||||
Xcode = Registry["xcode"]
|
|
||||||
)
|
|
@ -1,10 +0,0 @@
|
|||||||
<style name="onesenterprise">
|
|
||||||
<entry type="Keyword" style="#ff0000"/>
|
|
||||||
<entry type="Name" style="#0000ff"/>
|
|
||||||
<entry type="LiteralString" style="#000000"/>
|
|
||||||
<entry type="Operator" style="#ff0000"/>
|
|
||||||
<entry type="Punctuation" style="#ff0000"/>
|
|
||||||
<entry type="Comment" style="#008000"/>
|
|
||||||
<entry type="CommentPreproc" style="#963200"/>
|
|
||||||
<entry type="Text" style="#000000"/>
|
|
||||||
</style>
|
|
@ -1,42 +0,0 @@
|
|||||||
<style name="pygments">
|
|
||||||
<entry type="Error" style="border:#ff0000"/>
|
|
||||||
<entry type="Keyword" style="bold #008000"/>
|
|
||||||
<entry type="KeywordPseudo" style="nobold"/>
|
|
||||||
<entry type="KeywordType" style="nobold #b00040"/>
|
|
||||||
<entry type="NameAttribute" style="#7d9029"/>
|
|
||||||
<entry type="NameBuiltin" style="#008000"/>
|
|
||||||
<entry type="NameClass" style="bold #0000ff"/>
|
|
||||||
<entry type="NameConstant" style="#880000"/>
|
|
||||||
<entry type="NameDecorator" style="#aa22ff"/>
|
|
||||||
<entry type="NameEntity" style="bold #999999"/>
|
|
||||||
<entry type="NameException" style="bold #d2413a"/>
|
|
||||||
<entry type="NameFunction" style="#0000ff"/>
|
|
||||||
<entry type="NameLabel" style="#a0a000"/>
|
|
||||||
<entry type="NameNamespace" style="bold #0000ff"/>
|
|
||||||
<entry type="NameTag" style="bold #008000"/>
|
|
||||||
<entry type="NameVariable" style="#19177c"/>
|
|
||||||
<entry type="LiteralString" style="#ba2121"/>
|
|
||||||
<entry type="LiteralStringDoc" style="italic"/>
|
|
||||||
<entry type="LiteralStringEscape" style="bold #bb6622"/>
|
|
||||||
<entry type="LiteralStringInterpol" style="bold #bb6688"/>
|
|
||||||
<entry type="LiteralStringOther" style="#008000"/>
|
|
||||||
<entry type="LiteralStringRegex" style="#bb6688"/>
|
|
||||||
<entry type="LiteralStringSymbol" style="#19177c"/>
|
|
||||||
<entry type="LiteralNumber" style="#666666"/>
|
|
||||||
<entry type="Operator" style="#666666"/>
|
|
||||||
<entry type="OperatorWord" style="bold #aa22ff"/>
|
|
||||||
<entry type="Comment" style="italic #408080"/>
|
|
||||||
<entry type="CommentPreproc" style="noitalic #bc7a00"/>
|
|
||||||
<entry type="GenericDeleted" style="#a00000"/>
|
|
||||||
<entry type="GenericEmph" style="italic"/>
|
|
||||||
<entry type="GenericError" style="#ff0000"/>
|
|
||||||
<entry type="GenericHeading" style="bold #000080"/>
|
|
||||||
<entry type="GenericInserted" style="#00a000"/>
|
|
||||||
<entry type="GenericOutput" style="#888888"/>
|
|
||||||
<entry type="GenericPrompt" style="bold #000080"/>
|
|
||||||
<entry type="GenericStrong" style="bold"/>
|
|
||||||
<entry type="GenericSubheading" style="bold #800080"/>
|
|
||||||
<entry type="GenericTraceback" style="#0044dd"/>
|
|
||||||
<entry type="GenericUnderline" style="underline"/>
|
|
||||||
<entry type="TextWhitespace" style="#bbbbbb"/>
|
|
||||||
</style>
|
|
Loading…
Reference in New Issue
Block a user