134 lines
3 KiB
Go
134 lines
3 KiB
Go
package local
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
|
|
"github.com/yaoapp/kun/log"
|
|
"github.com/yaoapp/yao/sui/core"
|
|
)
|
|
|
|
// Components get the components
|
|
func (tmpl *Template) Components() ([]core.IComponent, error) {
|
|
|
|
path := filepath.Join(tmpl.Root, "__components")
|
|
components := []core.IComponent{}
|
|
if exist, _ := tmpl.local.fs.Exists(path); !exist {
|
|
return components, nil
|
|
}
|
|
|
|
dirs, err := tmpl.local.fs.ReadDir(path, false)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, dir := range dirs {
|
|
if !tmpl.local.fs.IsDir(dir) {
|
|
continue
|
|
}
|
|
|
|
block, err := tmpl.getComponentFrom(dir)
|
|
if err != nil {
|
|
log.Error("Get block error: %v", err)
|
|
continue
|
|
}
|
|
|
|
components = append(components, block)
|
|
}
|
|
|
|
return components, nil
|
|
}
|
|
|
|
// Component get the component
|
|
func (tmpl *Template) Component(id string) (core.IComponent, error) {
|
|
|
|
path := filepath.Join(tmpl.Root, "__components", id)
|
|
if exist, _ := tmpl.local.fs.Exists(path); !exist {
|
|
return nil, fmt.Errorf("Block %s not found", id)
|
|
}
|
|
|
|
component, err := tmpl.getComponentFrom(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = component.Load()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
_, err = component.Compile()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return component, nil
|
|
}
|
|
|
|
// Load get the component from the storage
|
|
func (component *Component) Load() error {
|
|
|
|
root := filepath.Join(component.tmpl.Root, "__components")
|
|
|
|
// Type script is the default language
|
|
tsFile := filepath.Join(root, component.Codes.TS.File)
|
|
if exist, _ := component.tmpl.local.fs.Exists(tsFile); exist {
|
|
tsCode, err := component.tmpl.local.fs.ReadFile(tsFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
component.Codes.TS.Code = string(tsCode)
|
|
|
|
} else {
|
|
jsFile := filepath.Join(root, component.Codes.JS.File)
|
|
jsCode, err := component.tmpl.local.fs.ReadFile(jsFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
component.Codes.JS.Code = string(jsCode)
|
|
}
|
|
|
|
htmlFile := filepath.Join(root, component.Codes.HTML.File)
|
|
if exist, _ := component.tmpl.local.fs.Exists(htmlFile); exist {
|
|
htmlCode, err := component.tmpl.local.fs.ReadFile(htmlFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
component.Codes.HTML.Code = string(htmlCode)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (tmpl *Template) getComponentFrom(path string) (core.IComponent, error) {
|
|
id := tmpl.getComponentID(path)
|
|
return tmpl.getComponent(id)
|
|
}
|
|
|
|
func (tmpl *Template) getComponent(id string) (core.IComponent, error) {
|
|
|
|
path := filepath.Join(tmpl.Root, "__components", id)
|
|
if !tmpl.local.fs.IsDir(path) {
|
|
return nil, fmt.Errorf("Component %s not found", id)
|
|
}
|
|
|
|
jsFile := filepath.Join("/", id, fmt.Sprintf("%s.js", id))
|
|
tsFile := filepath.Join("/", id, fmt.Sprintf("%s.ts", id))
|
|
htmlFile := filepath.Join("/", id, fmt.Sprintf("%s.html", id))
|
|
component := &Component{
|
|
tmpl: tmpl,
|
|
Component: &core.Component{
|
|
ID: id,
|
|
Codes: core.SourceCodes{
|
|
HTML: core.Source{File: htmlFile},
|
|
JS: core.Source{File: jsFile},
|
|
TS: core.Source{File: tsFile},
|
|
},
|
|
},
|
|
}
|
|
return component, nil
|
|
}
|
|
|
|
func (tmpl *Template) getComponentID(path string) string {
|
|
return filepath.Base(path)
|
|
}
|