mirror of https://github.com/jlelse/GoBlog
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.0 KiB
Go
67 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"io"
|
|
"net/http"
|
|
|
|
"go.goblog.app/app/pkgs/contenttype"
|
|
)
|
|
|
|
type openSearchDescription struct {
|
|
XMLName xml.Name `xml:"http://a9.com/-/spec/opensearch/1.1/ OpenSearchDescription"`
|
|
Text string `xml:",chardata"`
|
|
ShortName string `xml:"ShortName"`
|
|
Description string `xml:"Description"`
|
|
URL *openSearchDescriptionUrl `xml:"Url"`
|
|
SearchForm string `xml:"http://www.mozilla.org/2006/browser/search/ SearchForm"`
|
|
}
|
|
|
|
type openSearchDescriptionUrl struct {
|
|
Text string `xml:",chardata"`
|
|
Type string `xml:"type,attr"`
|
|
Method string `xml:"method,attr"`
|
|
Template string `xml:"template,attr"`
|
|
Param *openSearchDescriptionUrlParam `xml:"Param"`
|
|
}
|
|
|
|
type openSearchDescriptionUrlParam struct {
|
|
Text string `xml:",chardata"`
|
|
Name string `xml:"name,attr"`
|
|
Value string `xml:"value,attr"`
|
|
}
|
|
|
|
func (a *goBlog) serveOpenSearch(w http.ResponseWriter, r *http.Request) {
|
|
_, b := a.getBlog(r)
|
|
title := a.renderMdTitle(b.Title)
|
|
sURL := a.getFullAddress(b.getRelativePath(defaultIfEmpty(b.Search.Path, defaultSearchPath)))
|
|
openSearch := &openSearchDescription{
|
|
ShortName: title,
|
|
Description: title,
|
|
URL: &openSearchDescriptionUrl{
|
|
Type: "text/html",
|
|
Method: "post",
|
|
Template: sURL,
|
|
Param: &openSearchDescriptionUrlParam{
|
|
Name: "q",
|
|
Value: "{searchTerms}",
|
|
},
|
|
},
|
|
SearchForm: sURL,
|
|
}
|
|
pr, pw := io.Pipe()
|
|
go func() {
|
|
_, _ = io.WriteString(pw, xml.Header)
|
|
_ = pw.CloseWithError(xml.NewEncoder(pw).Encode(openSearch))
|
|
}()
|
|
w.Header().Set(contentType, "application/opensearchdescription+xml"+contenttype.CharsetUtf8Suffix)
|
|
_ = pr.CloseWithError(a.min.Get().Minify(contenttype.XML, w, pr))
|
|
}
|
|
|
|
func openSearchUrl(b *configBlog) string {
|
|
if b.Search != nil && b.Search.Enabled {
|
|
return b.getRelativePath(defaultIfEmpty(b.Search.Path, defaultSearchPath) + "/opensearch.xml")
|
|
}
|
|
return ""
|
|
}
|