starting stuff
This commit is contained in:
parent
8a66ea7971
commit
ed3c7d4278
7 changed files with 121 additions and 10 deletions
|
@ -5,6 +5,7 @@ import (
|
|||
"fmt"
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
// THE HYLIA PARSER
|
||||
|
@ -28,14 +29,52 @@ func ParseFile(filename string) ([]Element, map[string]string, error) {
|
|||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to parse elements: %w", err)
|
||||
}
|
||||
|
||||
importedElements := []Element{}
|
||||
importedVariables := map[string]string{}
|
||||
|
||||
for _, element := range elements {
|
||||
if element.Name == "import" {
|
||||
importPath := extractAttributeValue("import", "src")
|
||||
if importPath == "" {
|
||||
return nil, nil, fmt.Errorf("Import is missing a source ('src' attribute)")
|
||||
}
|
||||
|
||||
importFullPath := resolvePath(filename, importPath)
|
||||
|
||||
childElements, childVariables, err := ParseFile(importFullPath)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to parse elements: %w", err)
|
||||
}
|
||||
|
||||
importedElements = append(importedElements, childElements...)
|
||||
for k, v := range childVariables {
|
||||
importedVariables[k] = v
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for k, v := range importedVariables {
|
||||
if _, exists := variables[k]; !exists {
|
||||
variables[k] = v
|
||||
}
|
||||
}
|
||||
|
||||
elements = append(importedElements, elements...)
|
||||
|
||||
return elements, variables, nil
|
||||
|
||||
}
|
||||
|
||||
func resolvePath(basePath, relativePath string) string {
|
||||
dir := filepath.Dir(basePath)
|
||||
return filepath.Join(dir, relativePath)
|
||||
}
|
||||
|
||||
func parseElements(content, filename string) ([]Element, map[string]string, error) {
|
||||
elements := []Element{}
|
||||
variables := make(map[string]string)
|
||||
classes := make(map[string]Element)
|
||||
|
||||
lines := strings.Split(content, "\n")
|
||||
var currentElement *Element
|
||||
|
@ -80,7 +119,40 @@ func parseElements(content, filename string) ([]Element, map[string]string, erro
|
|||
nestedContent.Reset()
|
||||
currentElement = nil
|
||||
}
|
||||
} else {
|
||||
} else if strings.HasPrefix(line, "<class") {
|
||||
if currentElement != nil {
|
||||
currentElement.Content = nestedContent.String()
|
||||
parsedNested, nestedVars, _ := parseElements(nestedContent.String(), filename)
|
||||
currentElement.NestedElements = parsedNested
|
||||
mergeVariables(variables, nestedVars)
|
||||
elements = append(elements, *currentElement)
|
||||
nestedContent.Reset()
|
||||
currentElement = nil
|
||||
}
|
||||
|
||||
name := extractAttributeValue(line, "name")
|
||||
if name == "" {
|
||||
return nil, nil, errors.New("class is missing a name ('name' attribute)")
|
||||
}
|
||||
|
||||
currentElement = &Element{Name: name, FilePath: filename}
|
||||
} else if strings.HasPrefix(line, "</class>") {
|
||||
if currentElement != nil {
|
||||
currentElement.Content = nestedContent.String()
|
||||
parsedNested, nestedVars, _ := parseElements(nestedContent.String(), filename)
|
||||
currentElement.NestedElements = parsedNested
|
||||
mergeVariables(variables, nestedVars)
|
||||
if classes == nil {
|
||||
classes = make(map[string]Element)
|
||||
}
|
||||
classes[currentElement.Name] = *currentElement
|
||||
|
||||
nestedContent.Reset()
|
||||
currentElement = nil
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if currentElement != nil {
|
||||
nestedContent.WriteString(line + "\n")
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue