Skip to content

Instantly share code, notes, and snippets.

@neetsdkasu
Last active September 6, 2021 09:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save neetsdkasu/4c8368c5d35f4d6a6eeca6d419665a2a to your computer and use it in GitHub Desktop.
Save neetsdkasu/4c8368c5d35f4d6a6eeca6d419665a2a to your computer and use it in GitHub Desktop.
Notepad++ update mystylers.xml
*.exe
*.xml
*.cmd
*.bat
*.sh
module upd-npp-mystylers
go 1.17
package main
import (
"encoding/xml"
"io"
"os"
)
func main() {
err := run()
if err != nil {
panic(err)
}
}
func run() error {
stylers, err := os.Open("stylers.xml")
if err != nil {
return err
}
defer stylers.Close()
mystylers, err := os.Open("mystylers.xml")
if err != nil {
return err
}
defer mystylers.Close()
dststylers, err := os.Create("mystylers2.xml")
if err != nil {
return err
}
defer dststylers.Close()
mystylersTokens := []xml.Token{}
mystylersDecoder := xml.NewDecoder(mystylers)
for {
token, err := mystylersDecoder.Token()
if err == io.EOF {
break
}
if err != nil {
return err
}
mystylersTokens = append(mystylersTokens, xml.CopyToken(token))
}
stylersDecoder := xml.NewDecoder(stylers)
dststylersEncoder := xml.NewEncoder(dststylers)
var langPos = -1
for {
token1, err := stylersDecoder.Token()
if err == io.EOF {
break
}
if err != nil {
return err
}
token1 = xml.CopyToken(token1)
se1, ok := token1.(xml.StartElement)
if !ok {
err = dststylersEncoder.EncodeToken(token1)
if err != nil {
return err
}
continue
}
if se1.Name.Local != "LexerType" &&
se1.Name.Local != "WordsStyle" &&
se1.Name.Local != "WidgetStyle" {
err = dststylersEncoder.EncodeToken(token1)
if err != nil {
return err
}
continue
}
if se1.Name.Local == "LexerType" {
var lang = ""
for i := range se1.Attr {
if se1.Attr[i].Name.Local != "name" {
continue
}
lang = se1.Attr[i].Value
break
}
langPos = -1
if lang != "" {
for i, token2 := range mystylersTokens {
se2, ok := token2.(xml.StartElement)
if !ok {
continue
}
if se2.Name.Local != "LexerType" {
continue
}
ok = false
for k := range se2.Attr {
if se2.Attr[k].Name.Local != "name" {
continue
}
if se2.Attr[k].Value == lang {
ok = true
}
break
}
if ok {
langPos = i + 1
break
}
}
}
err = dststylersEncoder.EncodeToken(token1)
if err != nil {
return err
}
continue
}
var name = ""
var fgColor *xml.Attr = nil
var bgColor *xml.Attr = nil
var fontName *xml.Attr = nil
for i := range se1.Attr {
switch se1.Attr[i].Name.Local {
case "name":
name = se1.Attr[i].Value
case "fgColor":
fgColor = &se1.Attr[i]
case "bgColor":
bgColor = &se1.Attr[i]
case "fontName":
fontName = &se1.Attr[i]
}
}
if name == "" {
err = dststylersEncoder.EncodeToken(token1)
if err != nil {
return err
}
continue
}
if se1.Name.Local == "WidgetStyle" {
for _, token2 := range mystylersTokens {
se2, ok := token2.(xml.StartElement)
if !ok {
continue
}
if se2.Name.Local != "WidgetStyle" {
continue
}
ok = false
for i := range se2.Attr {
if se2.Attr[i].Name.Local != "name" {
continue
}
if se2.Attr[i].Value == name {
ok = true
}
break
}
if !ok {
continue
}
for i := range se2.Attr {
switch se2.Attr[i].Name.Local {
case "fgColor":
if fgColor != nil {
fgColor.Value = se2.Attr[i].Value
} else {
se1.Attr = append(se1.Attr, se2.Attr[i])
}
case "bgColor":
if bgColor != nil {
bgColor.Value = se2.Attr[i].Value
} else {
se1.Attr = append(se1.Attr, se2.Attr[i])
}
case "fontName":
if fontName != nil {
fontName.Value = se2.Attr[i].Value
} else {
se1.Attr = append(se1.Attr, se2.Attr[i])
}
}
}
break
}
err = dststylersEncoder.EncodeToken(se1)
if err != nil {
return err
}
continue
}
if langPos < 0 {
err = dststylersEncoder.EncodeToken(token1)
if err != nil {
return err
}
continue
}
for _, token2 := range mystylersTokens[langPos:] {
se2, ok := token2.(xml.StartElement)
if !ok {
ee2, ok := token2.(xml.EndElement)
if ok && ee2.Name.Local == "LexerType" {
break
}
continue
}
if se2.Name.Local != "WordsStyle" {
continue
}
ok = false
for k := range se2.Attr {
if se2.Attr[k].Name.Local != "name" {
continue
}
if se2.Attr[k].Value == name {
ok = true
}
break
}
if !ok {
continue
}
for i := range se2.Attr {
switch se2.Attr[i].Name.Local {
case "fgColor":
if fgColor != nil {
fgColor.Value = se2.Attr[i].Value
} else {
se1.Attr = append(se1.Attr, se2.Attr[i])
}
case "bgColor":
if bgColor != nil {
bgColor.Value = se2.Attr[i].Value
} else {
se1.Attr = append(se1.Attr, se2.Attr[i])
}
case "fontName":
if fontName != nil {
fontName.Value = se2.Attr[i].Value
} else {
se1.Attr = append(se1.Attr, se2.Attr[i])
}
}
}
break
}
err = dststylersEncoder.EncodeToken(se1)
if err != nil {
return err
}
}
return dststylersEncoder.Flush()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment