chore: release v0.26.2

This commit is contained in:
2026-08-21 18:21:33 +02:00
parent c49faf9a14
commit 0cd243fe00
28 changed files with 1600 additions and 345 deletions
+36 -9
View File
@@ -7,6 +7,7 @@ import (
"io"
"net/http"
"net/url"
"regexp"
"strconv"
"strings"
"sync"
@@ -142,6 +143,7 @@ func parseHamQTHSearch(body []byte) (Result, error) {
QSLVia: s.QSLVia,
Web: s.Web,
ImageURL: s.Picture,
RDA: rdaRef(s.Oblast, s.District),
}
r.Lat, _ = strconv.ParseFloat(s.Latitude, 64)
r.Lon, _ = strconv.ParseFloat(s.Longitude, 64)
@@ -151,6 +153,27 @@ func parseHamQTHSearch(body []byte) (Result, error) {
return r, nil
}
// rdaRefRe matches a Russian district reference: two letters, a hyphen, two
// digits. Searched for rather than anchored, because the field is filled by
// hand and arrives as "KE-29", "KE-29 Kemerovskaya obl." or with stray spaces
// depending on which editor the operator used.
var rdaRefRe = regexp.MustCompile(`\b([A-Z]{2}-[0-9]{2})\b`)
// rdaRef extracts a district reference from HamQTH's oblast/district fields.
//
// Strict about the SHAPE and silent otherwise: a value that is not a district
// reference — an oblast name, a postal code, free text — must yield nothing.
// Writing it into the award anyway would create a reference no list contains,
// which counts for zero and has to be found and removed by hand later.
func rdaRef(fields ...string) string {
for _, f := range fields {
if m := rdaRefRe.FindStringSubmatch(strings.ToUpper(strings.TrimSpace(f))); m != nil {
return m[1]
}
}
return ""
}
func (h *HamQTH) get(ctx context.Context, u string) ([]byte, error) {
req, err := http.NewRequestWithContext(ctx, "GET", u, nil)
if err != nil {
@@ -191,15 +214,19 @@ type hamqthSearch struct {
AdrCountry string `xml:"adr_country"`
USState string `xml:"us_state"`
USCounty string `xml:"us_county"`
Grid string `xml:"grid"`
Latitude string `xml:"latitude"`
Longitude string `xml:"longitude"`
DXCC string `xml:"adif"` // HamQTH exposes the ADIF/DXCC number under <adif>
CQ string `xml:"cq"`
ITU string `xml:"itu"`
Continent string `xml:"continent"`
Email string `xml:"email"`
QSLVia string `xml:"qsl_via"`
// Oblast is HamQTH's Russian district field; District is its generic one.
// Both are read because operators fill whichever their editor showed them.
Oblast string `xml:"oblast"`
District string `xml:"district"`
Grid string `xml:"grid"`
Latitude string `xml:"latitude"`
Longitude string `xml:"longitude"`
DXCC string `xml:"adif"` // HamQTH exposes the ADIF/DXCC number under <adif>
CQ string `xml:"cq"`
ITU string `xml:"itu"`
Continent string `xml:"continent"`
Email string `xml:"email"`
QSLVia string `xml:"qsl_via"`
// AdrName is the full postal name. Many records carry it and no <name> at
// all, so building the name from <nick> + <name> silently kept the first
// name and dropped the rest.