This is an automated email from the ASF dual-hosted git repository.

kumfo pushed a commit to branch test
in repository https://gitbox.apache.org/repos/asf/incubator-answer.git

commit 38834e6294b566e29fdeca2ed318cdce6bf3dc26
Author: sy-records <[email protected]>
AuthorDate: Mon Aug 5 17:03:23 2024 +0800

    feat: Add Open Search support
---
 internal/controller/template_controller.go      |  8 +++++++
 internal/controller/template_render/question.go | 22 +++++++++++++++++++
 internal/router/template_router.go              |  2 ++
 ui/template/header.html                         |  1 +
 ui/template/opensearch.xml                      | 29 +++++++++++++++++++++++++
 5 files changed, 62 insertions(+)

diff --git a/internal/controller/template_controller.go 
b/internal/controller/template_controller.go
index a7d69ebc..09f5bffc 100644
--- a/internal/controller/template_controller.go
+++ b/internal/controller/template_controller.go
@@ -562,6 +562,14 @@ func (tc *TemplateController) html(ctx *gin.Context, code 
int, tpl string, siteI
        ctx.HTML(code, tpl, data)
 }
 
+func (tc *TemplateController) OpenSearch(ctx *gin.Context) {
+       if tc.checkPrivateMode(ctx) {
+               tc.Page404(ctx)
+               return
+       }
+       tc.templateRenderController.OpenSearch(ctx)
+}
+
 func (tc *TemplateController) Sitemap(ctx *gin.Context) {
        if tc.checkPrivateMode(ctx) {
                tc.Page404(ctx)
diff --git a/internal/controller/template_render/question.go 
b/internal/controller/template_render/question.go
index a65c3083..83d08dc7 100644
--- a/internal/controller/template_render/question.go
+++ b/internal/controller/template_render/question.go
@@ -89,6 +89,28 @@ func (t *TemplateRenderController) Sitemap(ctx *gin.Context) 
{
        )
 }
 
+func (t *TemplateRenderController) OpenSearch(ctx *gin.Context) {
+       general, err := t.siteInfoService.GetSiteGeneral(ctx)
+       if err != nil {
+               log.Error("get site general failed:", err)
+               return
+       }
+
+       favicon := "favicon.ico"
+       branding, err := t.siteInfoService.GetSiteBranding(ctx)
+       if err == nil {
+               favicon = branding.Favicon
+       }
+
+       ctx.Header("Content-Type", "application/xml")
+       ctx.HTML(
+               http.StatusOK, "opensearch.xml", gin.H{
+                       "general": general,
+                       "favicon": favicon,
+               },
+       )
+}
+
 func (t *TemplateRenderController) SitemapPage(ctx *gin.Context, page int) 
error {
        general, err := t.siteInfoService.GetSiteGeneral(ctx)
        if err != nil {
diff --git a/internal/router/template_router.go 
b/internal/router/template_router.go
index 01e8b307..195030f9 100644
--- a/internal/router/template_router.go
+++ b/internal/router/template_router.go
@@ -60,6 +60,8 @@ func (a *TemplateRouter) RegisterTemplateRouter(r 
*gin.RouterGroup, baseURLPath
 
        seoNoAuth.GET("/404", a.templateController.Page404)
 
+       seoNoAuth.GET("/opensearch.xml", a.templateController.OpenSearch)
+
        seo := r.Group(baseURLPath)
        seo.Use(a.authUserMiddleware.CheckPrivateMode())
        seo.GET("/", a.templateController.Index)
diff --git a/ui/template/header.html b/ui/template/header.html
index 6eff7340..653f9a28 100644
--- a/ui/template/header.html
+++ b/ui/template/header.html
@@ -33,6 +33,7 @@
 
     <link rel="canonical" href="{{.siteinfo.Canonical}}" />
     <link rel="manifest" href="{{$.baseURL}}/manifest.json" />
+    <link rel="search" type="application/opensearchdescription+xml" 
href="{{$.baseURL}}/opensearch.xml" title="{{.siteinfo.General.Name}}" />
     <link href="{{.cssPath}}" rel="stylesheet" />
     <link href="{{$.baseURL}}/custom.css" rel="stylesheet" />
     <link
diff --git a/ui/template/opensearch.xml b/ui/template/opensearch.xml
new file mode 100644
index 00000000..af318ec0
--- /dev/null
+++ b/ui/template/opensearch.xml
@@ -0,0 +1,29 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/";>
+  <ShortName>{{$.general.Name}}</ShortName>
+  {{if $.general.Description}}
+  <Description>{{$.general.Description}}</Description>
+  {{end}}
+  <InputEncoding>UTF-8</InputEncoding>
+  <Image width="16" height="16" type="image/x-icon">{{$.favicon}}</Image>
+  <Url type="text/html" method="get" 
template="{{$.general.SiteUrl}}/search?q={searchTerms}"/>
+</OpenSearchDescription>

Reply via email to