siyuan/kernel/conf/search.go

236 lines
6.1 KiB
Go

// SiYuan - Refactor your thinking
// Copyright (c) 2020-present, b3log.org
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package conf
import (
"bytes"
"strings"
"github.com/88250/lute/ast"
"github.com/siyuan-note/siyuan/kernel/treenode"
)
type Search struct {
Document bool `json:"document"`
Heading bool `json:"heading"`
List bool `json:"list"`
ListItem bool `json:"listItem"`
CodeBlock bool `json:"codeBlock"`
MathBlock bool `json:"mathBlock"`
Table bool `json:"table"`
Blockquote bool `json:"blockquote"`
SuperBlock bool `json:"superBlock"`
Paragraph bool `json:"paragraph"`
HTMLBlock bool `json:"htmlBlock"`
EmbedBlock bool `json:"embedBlock"`
DatabaseBlock bool `json:"databaseBlock"`
AudioBlock bool `json:"audioBlock"`
VideoBlock bool `json:"videoBlock"`
IFrameBlock bool `json:"iframeBlock"`
WidgetBlock bool `json:"widgetBlock"`
Limit int `json:"limit"`
CaseSensitive bool `json:"caseSensitive"`
Name bool `json:"name"`
Alias bool `json:"alias"`
Memo bool `json:"memo"`
IAL bool `json:"ial"`
IndexAssetPath bool `json:"indexAssetPath"`
BacklinkMentionName bool `json:"backlinkMentionName"`
BacklinkMentionAlias bool `json:"backlinkMentionAlias"`
BacklinkMentionAnchor bool `json:"backlinkMentionAnchor"`
BacklinkMentionDoc bool `json:"backlinkMentionDoc"`
BacklinkMentionKeywordsLimit int `json:"backlinkMentionKeywordsLimit"`
VirtualRefName bool `json:"virtualRefName"`
VirtualRefAlias bool `json:"virtualRefAlias"`
VirtualRefAnchor bool `json:"virtualRefAnchor"`
VirtualRefDoc bool `json:"virtualRefDoc"`
}
func NewSearch() *Search {
return &Search{
Document: true,
Heading: true,
List: false,
ListItem: false,
CodeBlock: true,
MathBlock: true,
Table: true,
Blockquote: false,
SuperBlock: false,
Paragraph: true,
HTMLBlock: true,
EmbedBlock: false,
DatabaseBlock: true,
AudioBlock: false,
VideoBlock: false,
IFrameBlock: false,
WidgetBlock: false,
Limit: 64,
CaseSensitive: false,
Name: true,
Alias: true,
Memo: true,
IAL: false,
IndexAssetPath: true,
BacklinkMentionName: true,
BacklinkMentionAlias: false,
BacklinkMentionAnchor: true,
BacklinkMentionDoc: true,
BacklinkMentionKeywordsLimit: 512,
VirtualRefName: true,
VirtualRefAlias: false,
VirtualRefAnchor: true,
VirtualRefDoc: true,
}
}
func (s *Search) NAMFilter(keyword string) string {
keyword = strings.TrimSpace(keyword)
buf := bytes.Buffer{}
if s.Name {
buf.WriteString(" OR name LIKE '%" + keyword + "%'")
}
if s.Alias {
buf.WriteString(" OR alias LIKE '%" + keyword + "%'")
}
if s.Memo {
buf.WriteString(" OR memo LIKE '%" + keyword + "%'")
}
return buf.String()
}
func (s *Search) TypeFilter() string {
buf := bytes.Buffer{}
if s.Document {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeDocument.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.Heading {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeHeading.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.List {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeList.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.ListItem {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeListItem.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.CodeBlock {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeCodeBlock.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.MathBlock {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeMathBlock.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.Table {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeTable.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.Blockquote {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeBlockquote.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.SuperBlock {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeSuperBlock.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.Paragraph {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeParagraph.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.HTMLBlock {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeHTMLBlock.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.EmbedBlock {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeBlockQueryEmbed.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.DatabaseBlock {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeAttributeView.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.AudioBlock {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeAudio.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.VideoBlock {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeVideo.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.IFrameBlock {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeIFrame.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
if s.WidgetBlock {
buf.WriteByte('\'')
buf.WriteString(treenode.TypeAbbr(ast.NodeWidget.String()))
buf.WriteByte('\'')
buf.WriteString(",")
}
ret := buf.String()
if "" == ret {
return ret
}
return "(" + ret[:len(ret)-1] + ")"
}