aboutsummaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2023-10-28 02:23:11 +0200
committerThomas Voss <mail@thomasvoss.com> 2023-10-28 02:23:11 +0200
commit04b07b3715a815f0140d870fb88a6822f06cf5cb (patch)
tree633b92a23a37802aae83d5f5cd6047164500ab65 /parser
parent024cd373e052db4193343b1eeb0767df98d7ea1e (diff)
Allow for true HTML ID- and class shorthandsv2.0.0
Diffstat (limited to 'parser')
-rw-r--r--parser/parser.go29
-rw-r--r--parser/parser_test.go6
2 files changed, 31 insertions, 4 deletions
diff --git a/parser/parser.go b/parser/parser.go
index 648cfe7..b333506 100644
--- a/parser/parser.go
+++ b/parser/parser.go
@@ -255,7 +255,7 @@ loop:
return nil, err
}
- if s, err := reader.parseNodeName(); err != nil {
+ if s, err := reader.parseShorthand(); err != nil {
return nil, err
} else {
attr.Value = s
@@ -298,6 +298,33 @@ loop:
return attrs, nil
}
+// parseShorthand parses an ID- or class shorthand value.
+func (reader *reader) parseShorthand() (string, error) {
+ sb := strings.Builder{}
+
+ for {
+ r, err := reader.readRune()
+ if err != nil {
+ return "", err
+ }
+
+ if unicode.IsSpace(r) {
+ break
+ }
+ sb.WriteRune(r)
+ }
+
+ s := sb.String()
+ if len(s) == 0 {
+ return "", invalidSyntax{
+ pos: reader.pos,
+ expected: "id- or class name",
+ found: "no value",
+ }
+ }
+ return s, nil
+}
+
// parseString parses the double quoted strings used as attribute values.
func (reader *reader) parseString() (string, error) {
sb := strings.Builder{}
diff --git a/parser/parser_test.go b/parser/parser_test.go
index b0b9568..1851307 100644
--- a/parser/parser_test.go
+++ b/parser/parser_test.go
@@ -15,10 +15,10 @@ func TestParseFile(t *testing.T) {
>title {-
My Website
}
- meta x="y"{}
+ meta .ā†’{} x="y"{}
}
>body {
- >div #some-id{}
+ >div #some-id {}
div key="val" .class-1 .class-2 {
p {- This is some @em{-emphatic} text }
}
@@ -39,7 +39,7 @@ func TestParseFile(t *testing.T) {
s = fmt.Sprintf("%+v", ast)
result := `{Type:1 Text: Attrs:[] Children:[{Type:0 Text:html Attrs:[{Key:lang Value:en}] Children:[{Type:0 Text:head Attrs:[{Key:attr Value:}] Children:[{Type:0 Text:title Attrs:[] Children:[{Type:1 Text: Attrs:[] Children:[{Type:3 Text:
My Website
- Attrs:[] Children:[] Newline:false}] Newline:false}] Newline:true} {Type:0 Text:meta Attrs:[{Key:x Value:y}] Children:[] Newline:false}] Newline:true} {Type:0 Text:body Attrs:[] Children:[{Type:0 Text:div Attrs:[{Key:id Value:some-id}] Children:[] Newline:true} {Type:0 Text:div Attrs:[{Key:key Value:val} {Key:class Value:class-1} {Key:class Value:class-2}] Children:[{Type:0 Text:p Attrs:[] Children:[{Type:1 Text: Attrs:[] Children:[{Type:3 Text: This is some Attrs:[] Children:[] Newline:false} {Type:0 Text:em Attrs:[] Children:[{Type:1 Text: Attrs:[] Children:[{Type:3 Text:emphatic Attrs:[] Children:[] Newline:false}] Newline:false}] Newline:false} {Type:3 Text: text Attrs:[] Children:[] Newline:false}] Newline:false}] Newline:false}] Newline:false} {Type:0 Text:tags Attrs:[{Key:key Value:Some long value}] Children:[] Newline:false}] Newline:true}] Newline:false}] Newline:false}`
+ Attrs:[] Children:[] Newline:false}] Newline:false}] Newline:true} {Type:0 Text:meta Attrs:[{Key:class Value:ā†’{}} {Key:x Value:y}] Children:[] Newline:false}] Newline:true} {Type:0 Text:body Attrs:[] Children:[{Type:0 Text:div Attrs:[{Key:id Value:some-id}] Children:[] Newline:true} {Type:0 Text:div Attrs:[{Key:key Value:val} {Key:class Value:class-1} {Key:class Value:class-2}] Children:[{Type:0 Text:p Attrs:[] Children:[{Type:1 Text: Attrs:[] Children:[{Type:3 Text: This is some Attrs:[] Children:[] Newline:false} {Type:0 Text:em Attrs:[] Children:[{Type:1 Text: Attrs:[] Children:[{Type:3 Text:emphatic Attrs:[] Children:[] Newline:false}] Newline:false}] Newline:false} {Type:3 Text: text Attrs:[] Children:[] Newline:false}] Newline:false}] Newline:false}] Newline:false} {Type:0 Text:tags Attrs:[{Key:key Value:Some long value}] Children:[] Newline:false}] Newline:true}] Newline:false}] Newline:false}`
if s != result {
t.Fatalf("ParseFile() parsed unexpected AST ā€˜%sā€™", s)
}