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"` Image *Image `xml:"Image,omitempty"` 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", Image: &Image{ Height: 16, Width: 16, Type: "image/x-icon", URL: fmt.Sprintf("%s/favicon.ico", baseURL), }, 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.") }