package main import ( "encoding/xml" "fmt" "os" ) type OpenSearchDescription struct { 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"` Images []Image `xml:"Image"` URLs []URL `xml:"Url"` } type URL struct { Type string `xml:"type,attr"` Method string `xml:"method,attr,omitempty"` Template string `xml:"template,attr"` } type Image struct { Height int `xml:"height,attr"` Width int `xml:"width,attr"` Type string `xml:"type,attr"` URL string `xml:",chardata"` } func generateOpenSearchXML(config Config) { baseURL := addProtocol(config.Domain) opensearch := OpenSearchDescription{ 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", 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=", }, }, URLs: []URL{ { Type: "text/html", Method: "get", Template: fmt.Sprintf("%s/search?q={searchTerms}", baseURL), }, { Type: "application/x-suggestions+json", Template: fmt.Sprintf("%s/suggestions?q={searchTerms}", baseURL), }, }, } file, err := os.Create("static/opensearch.xml") if err != nil { printErr("Error creating OpenSearch file: %v", err) return } defer file.Close() file.WriteString(`` + "\n") enc := xml.NewEncoder(file) enc.Indent(" ", " ") if err := enc.Encode(opensearch); err != nil { printErr("Error encoding OpenSearch XML: %v", err) return } printInfo("OpenSearch description file generated successfully.") }