Highlight string literals
All checks were successful
timw4mail/gilo/pipeline/head This commit looks good
All checks were successful
timw4mail/gilo/pipeline/head This commit looks good
This commit is contained in:
parent
4fdb0a607c
commit
ee99e553f0
@ -112,8 +112,6 @@ func (r *Row) update() {
|
|||||||
func (r *Row) updateSyntax() {
|
func (r *Row) updateSyntax() {
|
||||||
i := 0
|
i := 0
|
||||||
s := r.parent.Syntax
|
s := r.parent.Syntax
|
||||||
prevSep := true
|
|
||||||
|
|
||||||
r.Hl = make([]int, r.RenderSize())
|
r.Hl = make([]int, r.RenderSize())
|
||||||
for x := range r.Hl {
|
for x := range r.Hl {
|
||||||
r.Hl[x] = highlight.Normal
|
r.Hl[x] = highlight.Normal
|
||||||
@ -124,6 +122,8 @@ func (r *Row) updateSyntax() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prevSep := true
|
||||||
|
inString := '0'
|
||||||
for i < r.RenderSize() {
|
for i < r.RenderSize() {
|
||||||
ch := r.render[i]
|
ch := r.render[i]
|
||||||
prevHl := highlight.Normal
|
prevHl := highlight.Normal
|
||||||
@ -132,7 +132,41 @@ func (r *Row) updateSyntax() {
|
|||||||
prevHl = r.Hl[i-1]
|
prevHl = r.Hl[i-1]
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.Flags&highlight.HighlightNumbers == 1 {
|
ip1 := i + 1
|
||||||
|
|
||||||
|
if s.Flags&highlight.HighlightStrings == highlight.HighlightStrings {
|
||||||
|
// At the start of a string literal
|
||||||
|
if inString == '0' && (ch == '"' || ch == '\'') {
|
||||||
|
inString = ch
|
||||||
|
r.Hl[i] = highlight.String
|
||||||
|
i++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// In an existing string
|
||||||
|
if inString != '0' {
|
||||||
|
r.Hl[i] = highlight.String
|
||||||
|
|
||||||
|
// Handle when a quote is escaped inside a string
|
||||||
|
if ch == '\\' && ip1 < r.RenderSize() {
|
||||||
|
r.Hl[ip1] = highlight.String
|
||||||
|
i += 2
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// This quote mark matches the beginning of the string
|
||||||
|
// so now the string is completed
|
||||||
|
if ch == inString {
|
||||||
|
inString = '0'
|
||||||
|
}
|
||||||
|
|
||||||
|
i++
|
||||||
|
prevSep = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if s.Flags&highlight.HighlightNumbers == highlight.HighlightNumbers {
|
||||||
if (unicode.IsDigit(ch) && (prevSep || prevHl == highlight.Number)) ||
|
if (unicode.IsDigit(ch) && (prevSep || prevHl == highlight.Number)) ||
|
||||||
(ch == '.' && prevHl == highlight.Number) {
|
(ch == '.' && prevHl == highlight.Number) {
|
||||||
r.Hl[i] = highlight.Number
|
r.Hl[i] = highlight.Number
|
||||||
|
@ -5,8 +5,12 @@ package highlight
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
const (
|
const (
|
||||||
Normal = iota
|
Normal = iota
|
||||||
|
String
|
||||||
Number
|
Number
|
||||||
Match
|
Match
|
||||||
)
|
)
|
||||||
|
|
||||||
const HighlightNumbers = (1 << 0)
|
const (
|
||||||
|
HighlightNumbers = 1 << 0
|
||||||
|
HighlightStrings = 1 << 1
|
||||||
|
)
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
package highlight
|
|
||||||
|
|
||||||
import "timshome.page/gilo/terminal"
|
|
||||||
|
|
||||||
var syntaxColorMap = map[int]string{
|
|
||||||
Number: terminal.FGRed,
|
|
||||||
Match: terminal.FGBlue,
|
|
||||||
Normal: terminal.DefaultFGColor,
|
|
||||||
}
|
|
||||||
|
|
||||||
// SyntaxToColor Take a highlighting type and map it to
|
|
||||||
// an ANSI color escape code for display
|
|
||||||
func SyntaxToColor(hl int) string {
|
|
||||||
color := syntaxColorMap[hl]
|
|
||||||
if len(color) == 0 {
|
|
||||||
color = terminal.DefaultFGColor
|
|
||||||
}
|
|
||||||
|
|
||||||
return color
|
|
||||||
}
|
|
@ -1,6 +1,35 @@
|
|||||||
package highlight
|
package highlight
|
||||||
|
|
||||||
import "strings"
|
import (
|
||||||
|
"strings"
|
||||||
|
"timshome.page/gilo/terminal"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// Syntax Type -> Color Mapping
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
|
var syntaxColorMap = map[int]string{
|
||||||
|
String: terminal.FGMagenta,
|
||||||
|
Number: terminal.FGRed,
|
||||||
|
Match: terminal.FGBlue,
|
||||||
|
Normal: terminal.DefaultFGColor,
|
||||||
|
}
|
||||||
|
|
||||||
|
// SyntaxToColor Take a highlighting type and map it to
|
||||||
|
// an ANSI color escape code for display
|
||||||
|
func SyntaxToColor(hl int) string {
|
||||||
|
color := syntaxColorMap[hl]
|
||||||
|
if len(color) == 0 {
|
||||||
|
color = terminal.DefaultFGColor
|
||||||
|
}
|
||||||
|
|
||||||
|
return color
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// File Type -> Syntax Mapping
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
type Syntax struct {
|
type Syntax struct {
|
||||||
FileType string
|
FileType string
|
||||||
@ -12,11 +41,11 @@ type Syntax struct {
|
|||||||
var HLDB = []*Syntax{{
|
var HLDB = []*Syntax{{
|
||||||
"c",
|
"c",
|
||||||
[]string{".c", ".h", ".cpp"},
|
[]string{".c", ".h", ".cpp"},
|
||||||
HighlightNumbers,
|
HighlightNumbers | HighlightStrings,
|
||||||
}, {
|
}, {
|
||||||
"go",
|
"go",
|
||||||
[]string{".go", "go.mod"},
|
[]string{".go", "go.mod"},
|
||||||
HighlightNumbers,
|
HighlightNumbers | HighlightStrings,
|
||||||
}, {
|
}, {
|
||||||
"makefile",
|
"makefile",
|
||||||
[]string{"Makefile", "makefile"},
|
[]string{"Makefile", "makefile"},
|
||||||
|
Loading…
Reference in New Issue
Block a user