♻️ 一些字符串操作函数移到 Gulu 项目里

This commit is contained in:
Liang Ding 2022-06-11 11:32:00 +08:00
parent bb2fafccb1
commit c03fba9ff7
No known key found for this signature in database
GPG key ID: 136F30F901A2231D
8 changed files with 15 additions and 111 deletions

View file

@ -6,7 +6,7 @@ require (
github.com/88250/clipboard v0.1.5
github.com/88250/css v0.1.2
github.com/88250/flock v0.8.2
github.com/88250/gulu v1.2.1
github.com/88250/gulu v1.2.2
github.com/88250/lute v1.7.4-0.20220525011519-3148f42c174b
github.com/88250/melody v0.0.0-20201115062536-c0b3394adcd1
github.com/88250/pdfcpu v0.3.13

View file

@ -48,8 +48,8 @@ github.com/88250/flock v0.8.2/go.mod h1:k+PZxETAUe4vLZx3R39ykvQCIlwHhc7AI2P2NUQV
github.com/88250/go-sqlite3 v1.14.13-0.20220412041952-88c3aaa8595e h1:uXi4QLKI/mswcXuzD+wBjJMkj1C3hK5Tgl3hF6MJpbo=
github.com/88250/go-sqlite3 v1.14.13-0.20220412041952-88c3aaa8595e/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/88250/gulu v1.2.0/go.mod h1:ZhEJ98UjR2y7j2toGj4/b+1rRELcZFQAPq/Yjyin2yY=
github.com/88250/gulu v1.2.1 h1:omRzVo2IToCL1sclmAy3Xq81vAW7nY/vZN1FopAvJtg=
github.com/88250/gulu v1.2.1/go.mod h1:I1qBzsksFL2ciGSuqDE7R3XW4BUMrfDgOvSXEk7FsAI=
github.com/88250/gulu v1.2.2 h1:LsuDSXI4GjqAD2XasG/DJEHuboKXU2lhZ9w0mnfJj3Y=
github.com/88250/gulu v1.2.2/go.mod h1:I1qBzsksFL2ciGSuqDE7R3XW4BUMrfDgOvSXEk7FsAI=
github.com/88250/lute v1.7.4-0.20220426011157-34c9bfa2e148/go.mod h1:Bdu9LRNjQhtL3TftbtpjIWTwDVAXoS7AD8QsZQPk7zo=
github.com/88250/lute v1.7.4-0.20220525011519-3148f42c174b h1:UwGrvVWNkXpyv8FkazWeV0brdmhM7FpWE3qMfqF1K+4=
github.com/88250/lute v1.7.4-0.20220525011519-3148f42c174b/go.mod h1:Bdu9LRNjQhtL3TftbtpjIWTwDVAXoS7AD8QsZQPk7zo=

View file

@ -236,7 +236,7 @@ func WriteCustomCSS(themeName string, cssMap map[string]interface{}) (err error)
return
}
cssData := util.RemoveInvisible(string(data))
cssData := gulu.Str.RemoveInvisible(string(data))
customStyleSheet := css.Parse(cssData)
buf := &bytes.Buffer{}

View file

@ -540,7 +540,7 @@ func GetDoc(id string, index int, keyword string, mode int, size int) (blockCoun
var tmp []string
for _, k := range virtualBlockRefKeywords {
repl := "<span data-type=\"virtual-block-ref\">" + k + "</span>"
if util.IsASCII(k) {
if gulu.Str.IsASCII(k) {
tmp = append(tmp, " "+k, " "+repl)
tmp = append(tmp, " "+k+" ", " "+repl+" ")
tmp = append(tmp, k+" ", repl+" ")
@ -617,7 +617,7 @@ func GetDoc(id string, index int, keyword string, mode int, size int) (blockCoun
blockKeys = append(blockKeys, alias)
}
if 0 < len(blockKeys) {
keys := util.SubstringsBetween(newContent, "<span data-type=\"virtual-block-ref\">", "</span>")
keys := gulu.Str.SubstringsBetween(newContent, "<span data-type=\"virtual-block-ref\">", "</span>")
for _, k := range keys {
if gulu.Str.Contains(k, blockKeys) {
return ast.WalkContinue
@ -1173,7 +1173,7 @@ func RenameDoc(boxID, p, title string) (err error) {
return
}
title = util.RemoveInvisible(title)
title = gulu.Str.RemoveInvisible(title)
oldTitle := tree.Root.IALAttr("title")
if oldTitle == title {
return
@ -1287,7 +1287,7 @@ func CreateDailyNote(boxID string) (p string, err error) {
}
func createDoc(boxID, p, title, dom string) (err error) {
title = util.RemoveInvisible(title)
title = gulu.Str.RemoveInvisible(title)
baseName := strings.TrimSpace(path.Base(p))
if "" == strings.TrimSuffix(baseName, ".sy") {

View file

@ -224,7 +224,7 @@ func searchFilter(types map[string]bool) string {
}
func searchBySQL(stmt string, beforeLen int) (ret []*Block) {
stmt = util.RemoveInvisible(stmt)
stmt = gulu.Str.RemoveInvisible(stmt)
blocks := sql.SelectBlocksRawStmt(stmt, Conf.Search.Limit)
ret = fromSQLBlocks(&blocks, "", beforeLen)
if 1 > len(ret) {
@ -234,7 +234,7 @@ func searchBySQL(stmt string, beforeLen int) (ret []*Block) {
}
func fullTextSearchRefBlock(keyword string, beforeLen int) (ret []*Block) {
keyword = util.RemoveInvisible(keyword)
keyword = gulu.Str.RemoveInvisible(keyword)
if util.IsIDPattern(keyword) {
ret = searchBySQL("SELECT * FROM `blocks` WHERE `id` = '"+keyword+"'", 36)
@ -282,7 +282,7 @@ func fullTextSearchRefBlock(keyword string, beforeLen int) (ret []*Block) {
}
func fullTextSearch(query, box, path, filter string, beforeLen int, querySyntax bool) (ret []*Block) {
query = util.RemoveInvisible(query)
query = gulu.Str.RemoveInvisible(query)
if util.IsIDPattern(query) {
ret = searchBySQL("SELECT * FROM `blocks` WHERE `id` = '"+query+"'", beforeLen)
return
@ -394,7 +394,7 @@ func markSearch(text string, keyword string, beforeLen int) (marked string, scor
return
}
keywords := util.SubstringsBetween(marked, "__@mark__", "__mark@__")
keywords := gulu.Str.SubstringsBetween(marked, "__@mark__", "__mark@__")
keywords = util.RemoveDuplicatedElem(keywords)
keyword = strings.Join(keywords, search.TermSep)
marked = strings.ReplaceAll(marked, "__@mark__", "")

View file

@ -1137,7 +1137,7 @@ func CreateCloudSyncDir(name string) (err error) {
defer syncLock.Unlock()
name = strings.TrimSpace(name)
name = util.RemoveInvisible(name)
name = gulu.Str.RemoveInvisible(name)
if !IsValidCloudDirName(name) {
return errors.New(Conf.Language(37))
}

View file

@ -17,12 +17,12 @@
package treenode
import (
"github.com/88250/gulu"
"github.com/88250/lute/lex"
"github.com/siyuan-note/siyuan/kernel/util"
)
func ContainsMarker(str string) bool {
if !util.IsASCII(str) {
if !gulu.Str.IsASCII(str) {
return false
}

View file

@ -15,99 +15,3 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package util
import (
"strings"
"unicode"
)
func RemoveInvisible(str string) string {
str = strings.ReplaceAll(str, "\u00A0", " ") // NBSP 转换为普通空格
str = RemoveZeroWidthCharacters(str)
str = stripCtlFromUTF8(str)
return str
}
func stripCtlFromUTF8(str string) string {
return strings.Map(func(r rune) rune {
if r >= 32 && r != 127 {
return r
}
return -1
}, str)
}
const (
// ZWSP represents zero-width space.
ZWSP = '\u200B'
// ZWNBSP represents zero-width no-break space.
ZWNBSP = '\uFEFF'
// ZWJ represents zero-width joiner.
ZWJ = '\u200D'
// ZWNJ represents zero-width non-joiner.
ZWNJ = '\u200C'
empty = ""
)
var replacer = strings.NewReplacer(string(ZWSP), empty,
string(ZWNBSP), empty,
string(ZWJ), empty,
string(ZWNJ), empty)
// HasZeroWidthCharacters reports whether string s contains zero-width characters.
func HasZeroWidthCharacters(s string) bool {
return strings.ContainsRune(s, ZWSP) ||
strings.ContainsRune(s, ZWNBSP) ||
strings.ContainsRune(s, ZWJ) ||
strings.ContainsRune(s, ZWNJ)
}
// RemoveZeroWidthCharacters removes all zero-width characters from string s.
func RemoveZeroWidthCharacters(s string) string {
return replacer.Replace(s)
}
// RemoveZeroWidthSpace removes zero-width space characters from string s.
func RemoveZeroWidthSpace(s string) string {
return strings.Replace(s, string(ZWSP), empty, -1)
}
// RemoveZeroWidthNoBreakSpace removes zero-width no-break space characters from string s.
func RemoveZeroWidthNoBreakSpace(s string) string {
return strings.Replace(s, string(ZWNBSP), empty, -1)
}
// RemoveZeroWidthJoiner removes zero-width joiner characters from string s.
func RemoveZeroWidthJoiner(s string) string {
return strings.Replace(s, string(ZWJ), empty, -1)
}
// RemoveZeroWidthNonJoiner removes zero-width non-joiner characters from string s.
func RemoveZeroWidthNonJoiner(s string) string {
return strings.Replace(s, string(ZWNJ), empty, -1)
}
func IsASCII(s string) bool {
for i := 0; i < len(s); i++ {
if s[i] > unicode.MaxASCII {
return false
}
}
return true
}
func SubstringsBetween(str, start, end string) (ret []string) {
parts := strings.Split(str, start)
for _, p := range parts {
if !strings.Contains(p, end) {
continue
}
parts2 := strings.Split(p, end)
ret = append(ret, parts2[0])
}
return
}