@@ -3,7 +3,9 @@ package models
33import (
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+ }
3043func (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"
357383func (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 }
0 commit comments