mirror of
https://github.com/rwinkhart/go-highlite.git
synced 2026-09-06 00:47:15 -04:00
Add support for including syntax file in each other
This commit is contained in:
+3
-1
@@ -28,6 +28,8 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
highlight.ResolveIncludes(defs)
|
||||||
|
|
||||||
fileSrc, _ := ioutil.ReadFile(os.Args[1])
|
fileSrc, _ := ioutil.ReadFile(os.Args[1])
|
||||||
def := highlight.DetectFiletype(defs, os.Args[1], bytes.Split(fileSrc, []byte("\n"))[0])
|
def := highlight.DetectFiletype(defs, os.Args[1], bytes.Split(fileSrc, []byte("\n"))[0])
|
||||||
|
|
||||||
@@ -73,7 +75,7 @@ func main() {
|
|||||||
colN++
|
colN++
|
||||||
}
|
}
|
||||||
if group, ok := matches[lineN][colN]; ok {
|
if group, ok := matches[lineN][colN]; ok {
|
||||||
if group == "" {
|
if group == "default" || group == "" {
|
||||||
color.Unset()
|
color.Unset()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ type Pattern struct {
|
|||||||
type Rules struct {
|
type Rules struct {
|
||||||
regions []*Region
|
regions []*Region
|
||||||
patterns []*Pattern
|
patterns []*Pattern
|
||||||
|
includes []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// A Region is a highlighted region (such as a multiline comment, or a string)
|
// A Region is a highlighted region (such as a multiline comment, or a string)
|
||||||
@@ -50,9 +51,6 @@ func ParseDef(input []byte) (s *Def, err error) {
|
|||||||
// This is just so if we have an error, we can exit cleanly and return the parse error to the user
|
// This is just so if we have an error, we can exit cleanly and return the parse error to the user
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
// fmt.Println("Micro encountered an error:", err)
|
|
||||||
// Print the stack trace too
|
|
||||||
// fmt.Print(errors.Wrap(err, 2).ErrorStack())
|
|
||||||
err = e.(error)
|
err = e.(error)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@@ -102,6 +100,42 @@ func ParseDef(input []byte) (s *Def, err error) {
|
|||||||
return s, err
|
return s, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ResolveIncludes(defs []*Def) {
|
||||||
|
for _, d := range defs {
|
||||||
|
resolveIncludesInDef(defs, d)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveIncludesInDef(defs []*Def, d *Def) {
|
||||||
|
for _, lang := range d.rules.includes {
|
||||||
|
for _, searchDef := range defs {
|
||||||
|
if lang == searchDef.FileType {
|
||||||
|
d.rules.patterns = append(d.rules.patterns, searchDef.rules.patterns...)
|
||||||
|
d.rules.regions = append(d.rules.regions, searchDef.rules.regions...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, r := range d.rules.regions {
|
||||||
|
resolveIncludesInRegion(defs, r)
|
||||||
|
r.parent = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveIncludesInRegion(defs []*Def, region *Region) {
|
||||||
|
for _, lang := range region.rules.includes {
|
||||||
|
for _, searchDef := range defs {
|
||||||
|
if lang == searchDef.FileType {
|
||||||
|
region.rules.patterns = append(region.rules.patterns, searchDef.rules.patterns...)
|
||||||
|
region.rules.regions = append(region.rules.regions, searchDef.rules.regions...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, r := range region.rules.regions {
|
||||||
|
resolveIncludesInRegion(defs, r)
|
||||||
|
r.parent = region
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func parseRules(input []interface{}, curRegion *Region) (*Rules, error) {
|
func parseRules(input []interface{}, curRegion *Region) (*Rules, error) {
|
||||||
rules := new(Rules)
|
rules := new(Rules)
|
||||||
|
|
||||||
@@ -112,6 +146,9 @@ func parseRules(input []interface{}, curRegion *Region) (*Rules, error) {
|
|||||||
|
|
||||||
switch object := val.(type) {
|
switch object := val.(type) {
|
||||||
case string:
|
case string:
|
||||||
|
if k == "include" {
|
||||||
|
rules.includes = append(rules.includes, object)
|
||||||
|
} else {
|
||||||
// Pattern
|
// Pattern
|
||||||
r, err := regexp.Compile(object)
|
r, err := regexp.Compile(object)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -119,6 +156,7 @@ func parseRules(input []interface{}, curRegion *Region) (*Rules, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rules.patterns = append(rules.patterns, &Pattern{group.(string), r})
|
rules.patterns = append(rules.patterns, &Pattern{group.(string), r})
|
||||||
|
}
|
||||||
case map[interface{}]interface{}:
|
case map[interface{}]interface{}:
|
||||||
// Region
|
// Region
|
||||||
region, err := parseRegion(group.(string), object, curRegion)
|
region, err := parseRegion(group.(string), object, curRegion)
|
||||||
|
|||||||
Reference in New Issue
Block a user