Allow custom function comments in specs

This commit is contained in:
Brandon Dyck 2019-05-14 21:15:18 -06:00
parent e6b8f04dcf
commit f80148fdf6
5 changed files with 35 additions and 12 deletions

View File

@ -1,5 +1,12 @@
# Changelog # Changelog
## Unversioned
### Changed
- Element and attribute specs can define custom function doc comments.
- element.A and attribute.Accept specs have comments.
## [0.0.3] - 2019-05-11 ## [0.0.3] - 2019-05-11
### Added ### Added

View File

@ -6,7 +6,7 @@ package attribute
import "gitlab.codemonkeysoftware.net/b/hatmill" import "gitlab.codemonkeysoftware.net/b/hatmill"
import "strconv" import "strconv"
// Accept creates a "accept" attribute // Accept sets the content types or file types allowed in a form or file input.
func Accept(value string) hatmill.Attrib { func Accept(value string) hatmill.Attrib {
return hatmill.Attrib{ return hatmill.Attrib{
Key: "accept", Key: "accept",

View File

@ -1,6 +1,6 @@
{ {
"attributes": [ "attributes": [
{"name": "accept", "type": "string"}, {"name": "accept", "type": "string", "comment": "Accept sets the content types or file types allowed in a form or file input."},
{"name": "accept-charset", "type": "string"}, {"name": "accept-charset", "type": "string"},
{"name": "action", "type": "string"}, {"name": "action", "type": "string"},
{"name": "alt", "type": "string"}, {"name": "alt", "type": "string"},
@ -98,7 +98,7 @@
{"name": "wrap", "type": "string"} {"name": "wrap", "type": "string"}
], ],
"elements": [ "elements": [
{"name": "a"}, {"name": "a", "comment": "A creates a hyperlink."},
{"name": "abbr"}, {"name": "abbr"},
{"name": "address"}, {"name": "address"},
{"name": "area", "void": true}, {"name": "area", "void": true},

View File

@ -5,7 +5,7 @@ package element
import "gitlab.codemonkeysoftware.net/b/hatmill" import "gitlab.codemonkeysoftware.net/b/hatmill"
// A creates a <a> element. // A creates a hyperlink.
func A(attribs ...hatmill.Attrib) func(children ...hatmill.Term) hatmill.ParentElement { func A(attribs ...hatmill.Attrib) func(children ...hatmill.Term) hatmill.ParentElement {
return func(children ...hatmill.Term) hatmill.ParentElement { return func(children ...hatmill.Term) hatmill.ParentElement {
return hatmill.ParentElement{ return hatmill.ParentElement{

View File

@ -19,6 +19,10 @@ func identifier(s string) string {
return strings.Join(words, "") return strings.Join(words, "")
} }
func formatComment(s string) string {
return "// " + strings.TrimSpace(s) + "\n"
}
type AttribTypeInfo struct { type AttribTypeInfo struct {
Template string Template string
Imports []string Imports []string
@ -70,24 +74,31 @@ type Spec interface {
} }
type AttribSpec struct { type AttribSpec struct {
Name string `json:"name"` Name string `json:"name"`
Type string `json:"type"` Type string `json:"type"`
Comment string `json:"comment"`
} }
func (spec AttribSpec) Generate() Def { func (spec AttribSpec) Generate() Def {
name := spec.Name name := spec.Name
ident := identifier(spec.Name) ident := identifier(spec.Name)
comment := fmt.Sprintf("// %s creates a \"%s\" attribute\n", ident, name) var comment string
if spec.Comment != "" {
comment = spec.Comment
} else {
comment = fmt.Sprintf("%s creates a \"%s\" attribute", ident, name)
}
template := attribTypes[spec.Type].Template template := attribTypes[spec.Type].Template
return Def{ return Def{
Source: comment + fmt.Sprintf(template, ident, name), Source: formatComment(comment) + fmt.Sprintf(template, ident, name),
Imports: attribTypes[spec.Type].Imports, Imports: attribTypes[spec.Type].Imports,
} }
} }
type ElemSpec struct { type ElemSpec struct {
Name string `json:"name"` Name string `json:"name"`
Void bool `json:"void"` Void bool `json:"void"`
Comment string `json:"comment"`
} }
func (spec ElemSpec) Generate() Def { func (spec ElemSpec) Generate() Def {
@ -115,13 +126,18 @@ func (spec ElemSpec) Generate() Def {
name := spec.Name name := spec.Name
ident := identifier(spec.Name) ident := identifier(spec.Name)
comment := fmt.Sprintf("// %s creates a <%s> element.\n", ident, name) var comment string
if spec.Comment != "" {
comment = spec.Comment
} else {
comment = fmt.Sprintf("%s creates a <%s> element.", ident, name)
}
template := parentTemplate template := parentTemplate
if spec.Void { if spec.Void {
template = voidTemplate template = voidTemplate
} }
return Def{ return Def{
Source: comment + fmt.Sprintf(template, ident, name), Source: formatComment(comment) + fmt.Sprintf(template, ident, name),
} }
} }