Skip to content

Commit

Permalink
added xml structure
Browse files Browse the repository at this point in the history
  • Loading branch information
VladimirTakeda committed Dec 9, 2023
1 parent 963a1c4 commit d749691
Show file tree
Hide file tree
Showing 16 changed files with 3,217 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
.glide/
.idea/

debug
gonec
Expand Down
3 changes: 3 additions & 0 deletions core/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,9 @@ func Import(env *Env) *Env {
env.DefineTypeStruct(&EmailProfile{})
env.DefineTypeStruct(&EmailData{})

env.DefineTypeStruct(&XMLDoc{})
env.DefineTypeStruct(&XMLElem{})

ImportStrings(env)

//////////////////
Expand Down
2 changes: 2 additions & 0 deletions core/coreerrors.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ var (

VMErrorEan13Format = errors.New("Ean13 состоит из 12 цифр")
VMErrorI2Of5Format = errors.New("I2Of5 состоит из чётного количества цифр")

VMErrorSaveXML = errors.New("Ошибки при записи XML")
)

func VMErrorNeedArgs(n int) error {
Expand Down
62 changes: 62 additions & 0 deletions core/xmldoc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package core

import (
"github.com/beevik/etree"
)

type XMLDoc struct {
VMMetaObj
doc *etree.Document
}

func (f *XMLDoc) VMTypeString() string {
return "ЗаписьXML"
}

func (f *XMLDoc) VMRegister() {
f.VMRegisterConstructor(func(args VMSlice) error {
return nil
})

f.doc = etree.NewDocument()

f.VMRegisterMethod("ЗаписатьОбъявленияXML", VMFuncOneParam(f.ЗаписатьОбъявленияXML))
f.VMRegisterMethod("ЗаписатьКомментарийXML", VMFuncOneParam(f.ЗаписатьКомментарийXML))
f.VMRegisterMethod("ФорматироватьXML", VMFuncOneParam(f.ФорматироватьXML))
f.VMRegisterMethod("ЗаписатьСтрокуXML", VMFuncZeroParams(f.ЗаписатьСтрокуXML))
f.VMRegisterMethod("ЗаписатьФайлXML", VMFuncOneParam(f.ЗаписатьФайлXML))
}

func (f *XMLDoc) ЗаписатьОбъявленияXML(params VMStringMap, rets *VMSlice) error {
for key, value := range params {
f.doc.CreateProcInst(key, string(value.(VMString)))
}
return nil
}

func (f *XMLDoc) ЗаписатьКомментарийXML(params VMString, rets *VMSlice) error {
f.doc.CreateComment(string(params))
return nil
}

func (f *XMLDoc) ФорматироватьXML(params VMInt, rets *VMSlice) error {
f.doc.Indent(int(params))
return nil
}

func (f *XMLDoc) ЗаписатьСтрокуXML(rets *VMSlice) error {
str, err := f.doc.WriteToString()
if err != nil {
return VMErrorSaveXML
}
rets.Append(VMString(str))
return nil
}

func (f *XMLDoc) ЗаписатьФайлXML(filePath VMString, rets *VMSlice) error {
err := f.doc.WriteToFile(string(filePath))
if err != nil {
return VMErrorSaveXML
}
return nil
}
58 changes: 58 additions & 0 deletions core/xmlelem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package core

import (
"github.com/beevik/etree"
)

type XMLElem struct {
VMMetaObj
elem *etree.Element
}

func (f *XMLElem) VMTypeString() string {
return "ЭлементXML"
}

func (f *XMLElem) VMRegister() {
f.VMRegisterConstructor(func(args VMSlice) error {
if len(args) != 2 {
return VMErrorNeedArgs(2)
}

name, ok := args[0].(VMString)
if !ok {
return VMErrorNeedString
}

//TODO: inheritance?
var parent *etree.Element
xmlElem, ok := args[1].(*XMLElem)
if ok {
parent = xmlElem.elem
} else {
xmlDoc, ok := args[1].(*XMLDoc)
parent = &xmlDoc.doc.Element
if !ok {
return VMErrorIncorrectFieldType
}
}

f.elem = parent.CreateElement(string(name))
return nil
})

f.VMRegisterMethod("ЗаписатьТекстXML", VMFuncOneParam(f.ЗаписатьТекстXML))
f.VMRegisterMethod("ЗаписатьАтрибутыXML", VMFuncOneParam(f.ЗаписатьАтрибутыXML))
}

func (f *XMLElem) ЗаписатьТекстXML(params VMString, rets *VMSlice) error {
f.elem.SetText(string(params))
return nil
}

func (f *XMLElem) ЗаписатьАтрибутыXML(params VMStringMap, rets *VMSlice) error {
for key, value := range params {
f.elem.CreateAttr(key, string(value.(VMString)))
}
return nil
}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go 1.18

require (
github.com/Kelwing/mc-rcon v0.0.0-20220214194105-bec8dcbccc3f
github.com/beevik/etree v1.2.0
github.com/boltdb/bolt v1.3.1
github.com/boombuler/barcode v1.0.1
github.com/covrom/decnum v0.0.0-20181120130125-279518e708a6
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8
github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/beevik/etree v1.2.0 h1:l7WETslUG/T+xOPs47dtd6jov2Ii/8/OjCldk5fYfQw=
github.com/beevik/etree v1.2.0/go.mod h1:aiPf89g/1k3AShMVAzriilpcE4R/Vuor90y83zVZWFc=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
Expand Down
46 changes: 46 additions & 0 deletions test/core/xmldoc.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// Запись XML с помощью библиотеки
// https://github.com/beevik/etree

// Конструктор объекта
XML = Новый ЗаписьXML()

// Объявления XML заданные структурой Гонца
ОбъявленияXML = {"xml": 'version="1.0" encoding="UTF-8"',
"xml-stylesheet": 'type="text/xsl" href="style.xsl"',
}

// Объявления XML добавляются методом ЗаписатьОбъявленияXML(СтруктураОбъявленияXML)
// (см. CreateProcInst)
XML.ЗаписатьОбъявленияXML(ОбъявленияXML)

// Комментарии XML добавляются методом ЗаписатьКомментарийXML(СтрокаКомментария)
// (см. CreateComment)
XML.ЗаписатьКомментарийXML("Это комментарий XML")

// Элементы древовидно добавляються методом ЗаписатьЭлементXML(СтрокаИмяЭлемента)
// (см. CreateElement)
Персоны = Новый ЭлементXML("persons",XML)
Персона = Новый ЭлементXML("persons",Персоны)

// Текст элемента XML добавляется методом ЗаписатьТекстXML(СтрокаТекста)
// (см. SetText)
Персона.ЗаписатьТекстXML("Мигачев А.И.")

// Атрибуты элемента заданные структурой Гонца
АтрибутыXML = {"name": "Алексей",
"phone": "+79107910520",
"email": "[email protected]",
}

// Атрибуты элемента XML добавляются методом ЗаписатьАтрибутыXML(СтруктураАттрибутыXML)
// (см. CreateAttr)
Персона.ЗаписатьАтрибутыXML(АтрибутыXML)

// Форматирование XML пробелами выполняет метод ФорматироватьXML(ЧислоЦелоеПробелов)
// (см. Indent)
XML.ФорматироватьXML(10)

// Запись результата с строку или файл выполняют методы ЗаписатьСтрокуXML() и ЗаписатьСтрокуXML(СтрокаИмяФайла)
// (см. WriteTo)
СтрокаXML = XML.ЗаписатьСтрокуXML()
XML.ЗаписатьФайлXML("C:/Users/Vladimir/Desktop/test.xml")
12 changes: 12 additions & 0 deletions vendor/github.com/beevik/etree/CONTRIBUTORS

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 24 additions & 0 deletions vendor/github.com/beevik/etree/LICENSE

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit d749691

Please sign in to comment.