2024-06-12 14:26:50 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/xml"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
)
|
|
|
|
|
|
|
|
type OpenSearchDescription struct {
|
2025-06-18 13:55:13 +02:00
|
|
|
XMLName xml.Name `xml:"OpenSearchDescription"`
|
|
|
|
Xmlns string `xml:"xmlns,attr"`
|
|
|
|
ShortName string `xml:"ShortName"`
|
|
|
|
LongName string `xml:"LongName"`
|
|
|
|
Description string `xml:"Description"`
|
|
|
|
Tags string `xml:"Tags,omitempty"`
|
|
|
|
InputEncoding string `xml:"InputEncoding"`
|
|
|
|
OutputEncoding string `xml:"OutputEncoding"`
|
2025-06-18 16:05:21 +02:00
|
|
|
Images []Image `xml:"Image"`
|
2025-06-18 13:55:13 +02:00
|
|
|
URLs []URL `xml:"Url"`
|
2024-06-12 14:26:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type URL struct {
|
|
|
|
Type string `xml:"type,attr"`
|
2025-06-18 13:55:13 +02:00
|
|
|
Method string `xml:"method,attr,omitempty"`
|
2024-06-12 14:26:50 +02:00
|
|
|
Template string `xml:"template,attr"`
|
|
|
|
}
|
|
|
|
|
2025-06-18 13:55:13 +02:00
|
|
|
type Image struct {
|
|
|
|
Height int `xml:"height,attr"`
|
|
|
|
Width int `xml:"width,attr"`
|
|
|
|
Type string `xml:"type,attr"`
|
|
|
|
URL string `xml:",chardata"`
|
|
|
|
}
|
2024-08-08 15:05:05 +02:00
|
|
|
|
2025-06-18 13:55:13 +02:00
|
|
|
func generateOpenSearchXML(config Config) {
|
2024-10-25 13:54:29 +02:00
|
|
|
baseURL := addProtocol(config.Domain)
|
2025-06-18 13:55:13 +02:00
|
|
|
|
2024-06-12 14:26:50 +02:00
|
|
|
opensearch := OpenSearchDescription{
|
2025-06-18 13:55:13 +02:00
|
|
|
Xmlns: "http://a9.com/-/spec/opensearch/1.1/",
|
|
|
|
ShortName: Translate("site_name"),
|
|
|
|
LongName: Translate("site_name") + " Search",
|
|
|
|
Description: Translate("site_description"),
|
|
|
|
Tags: Translate("site_tags"),
|
|
|
|
InputEncoding: "UTF-8",
|
|
|
|
OutputEncoding: "UTF-8",
|
2025-06-18 16:05:21 +02:00
|
|
|
Images: []Image{
|
|
|
|
{
|
|
|
|
Height: 512,
|
|
|
|
Width: 512,
|
|
|
|
Type: "image/svg+xml",
|
|
|
|
URL: fmt.Sprintf("%s/static/images/icon-512.svg", baseURL),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Height: 16,
|
|
|
|
Width: 16,
|
|
|
|
Type: "image/png",
|
|
|
|
URL: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAABYAAAAWAF42ktiAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAA2pJREFUOI1lk11oW3UYxp//ycnhpHqapmlssrZLkzRbu9qPrVYWxhTpsLPD4fRiDBmj6ubwZhfChCHSgjBB59B5McEboepWVkSLdQ432rVZ2s3B0jQtga7LcnKa9CNtlrT56EnO64XbqPrCe/c8P3hfnocRETZPMpm0hyPK52VGaa8gCCUMTMtkMwsg9CWTK1+2tbVlNuvZJgAfnA5d2eZ2HvQHguza9WHcvx+GXs+jtaUJBw90UonBsL6ykjjhdDp/ekogIhCR7sGDh1MLi0v01pFuKjHX0rPPOana3UqiqYYM5VvJaHPT+a8vkqqqxVAodPyx7x9AIDjTt5xYoVZPB4mmGhLLqqn5hZfo+o0R+uhMLz1TYadDh4/R4aMn6OPes5TP5wt+v383EYFlMpkqnuflD06dZn2XBmAyGZFYTuDke8cQmAqiproKjTsacPG77yEaRIQjCoZ+/oHcLoe/asuWndxcOPxhVJlnlwd+Ba/jsLt9F3gdh6bGevjGb0OZn4f31jgURcHcXBikaTj7xQVms1pbxsbGtnGCIHZ5fbehFgpQVRW/Df2BN15/DaNeH9SNHNwuB4auXntyLwDCqHcC2VyOLBZLB8frOCkiK2CPn9q1fx9cDjsWFuIg0rDdXQcdx2CzVYJAYGAACPH4kiYIQhUHsKLRWAqDKAIA9r/agc/OfQWtSPi09xOAAUVNQywWBwDs2tmMlqZGGI0SCoVCikulUtONDduRzeUAxqCqKgCGib/uQpJKsaEWwBiHfa+8DMY4+APTiMUXYS436dLp9AxXYbZ8s8fzIpwOO2zWSmSzeeyor0dLczNGb40DYGCcDge6OsEYQ7FYxPvvHkUqlUqPjIz8yYgI0WgsNhcOW/suDWDM68Px7rfBcTqo6gaICJJUCq9vAld+GUKdy4E7N69qsiyfc7vdp0FEmJ2dfX5tfb3w4+UBkipdJJpqSLLUkslWR2WVLjKUb6U3j3RT+95OisjRoizLgf7+fuFpEokIwVCoYzWZzAVnQvTOyVNUaq0jg9lOBrOdahva6fyFbym9tqY9jMiBwcHBin9F+clOTk6a7vknf08+epTP5zdImY/R0nJC0zSNolFl0R8InOnp6eE3e9h/6wwAw8PDvNVq3aPX6x2qquZXV1enPB7PFID/if8GRa7Q/nLxcNoAAAAASUVORK5CYII=",
|
|
|
|
},
|
2025-06-18 13:55:13 +02:00
|
|
|
},
|
2024-08-21 22:56:21 +02:00
|
|
|
URLs: []URL{
|
|
|
|
{
|
|
|
|
Type: "text/html",
|
2025-06-18 13:55:13 +02:00
|
|
|
Method: "get",
|
2024-08-21 22:56:21 +02:00
|
|
|
Template: fmt.Sprintf("%s/search?q={searchTerms}", baseURL),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: "application/x-suggestions+json",
|
|
|
|
Template: fmt.Sprintf("%s/suggestions?q={searchTerms}", baseURL),
|
|
|
|
},
|
2024-06-12 14:26:50 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
file, err := os.Create("static/opensearch.xml")
|
|
|
|
if err != nil {
|
2024-08-10 13:27:23 +02:00
|
|
|
printErr("Error creating OpenSearch file: %v", err)
|
2024-06-12 14:26:50 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
|
2025-06-18 13:55:13 +02:00
|
|
|
file.WriteString(`<?xml version="1.0" encoding="UTF-8"?>` + "\n")
|
|
|
|
|
2024-06-12 14:26:50 +02:00
|
|
|
enc := xml.NewEncoder(file)
|
|
|
|
enc.Indent(" ", " ")
|
|
|
|
if err := enc.Encode(opensearch); err != nil {
|
2024-08-10 13:27:23 +02:00
|
|
|
printErr("Error encoding OpenSearch XML: %v", err)
|
2024-06-12 14:26:50 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-08-10 13:27:23 +02:00
|
|
|
printInfo("OpenSearch description file generated successfully.")
|
2024-06-12 14:26:50 +02:00
|
|
|
}
|