Skip to content

Commit d9cfe67

Browse files
author
zc310.tech
committed
调整 id支持不是uint64类型、颜色值支持16进制字符串
1 parent 671f619 commit d9cfe67

File tree

2 files changed

+34
-9
lines changed

2 files changed

+34
-9
lines changed

internal/models/definitions.go

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package models
33
import (
44
"encoding/xml"
55
"fmt"
6+
"hash/crc64"
67
"image/color"
8+
"log/slog"
79
"math"
810
"strconv"
911
"strings"
@@ -19,14 +21,25 @@ func (p *StID) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
1921
return err
2022
}
2123

22-
val, err := strconv.ParseUint(s, 10, 64)
23-
if err != nil {
24-
return err
25-
}
24+
val := p.parseUint(s)
2625

2726
*p = StID(val)
2827
return nil
2928
}
29+
func (p *StID) UnmarshalText(text []byte) error {
30+
val := p.parseUint(string(text))
31+
*p = StID(val)
32+
return nil
33+
}
34+
func (p *StID) parseUint(s string) uint64 {
35+
val, err := strconv.ParseUint(s, 10, 64)
36+
if err != nil {
37+
table := crc64.MakeTable(crc64.ISO)
38+
val = crc64.Checksum([]byte(s), table)
39+
slog.Error("Error parsing StID value", slog.String("value", s), slog.Uint64("val", val))
40+
}
41+
return val
42+
}
3043
func (p *StID) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
3144
// 将无符号整型转换为字符串
3245
str := strconv.FormatUint(uint64(*p), 10)
@@ -352,6 +365,19 @@ func (c Color) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
352365
Value: c.String(),
353366
}, nil
354367
}
368+
func (c *Color) parseInt(s string) (int, error) {
369+
s = strings.TrimSpace(s)
370+
371+
// 处理 # 开头的
372+
if strings.HasPrefix(s, "#") {
373+
val, err := strconv.ParseInt(s[1:], 16, 0)
374+
return int(val), err
375+
}
376+
377+
// 其他情况让 ParseInt 自动检测
378+
val, err := strconv.ParseInt(s, 0, 0)
379+
return int(val), err
380+
}
355381

356382
// 解析字符串 "156 82 35" 或 "156 82 35 255"
357383
func (c *Color) parse(s string) error {
@@ -371,7 +397,7 @@ func (c *Color) parse(s string) error {
371397
// 解析 RGB
372398
values := [4]uint8{0, 0, 0, 255}
373399
for i := 0; i < len(parts); i++ {
374-
val, err := strconv.Atoi(parts[i])
400+
val, err := c.parseInt(parts[i])
375401
if err != nil {
376402
return fmt.Errorf("invalid number '%s' in color: %v", parts[i], err)
377403
}

internal/models/extension.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package models
33
import (
44
"encoding/xml"
55
"fmt"
6-
"strconv"
76
"time"
87
)
98

@@ -51,9 +50,9 @@ func (e *Extension) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
5150
e.Date = &t
5251
}
5352
case "RefId":
54-
if id, err := strconv.ParseUint(attr.Value, 10, 32); err == nil {
55-
e.RefID = StRefID(id)
56-
}
53+
var id StID
54+
_ = id.UnmarshalText([]byte(attr.Value))
55+
e.RefID = StRefID(id)
5756
}
5857
}
5958

0 commit comments

Comments
 (0)