// 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 . package util import ( "bytes" "strings" "unicode" "github.com/88250/lute/html" ) // InsertElem inserts value at index into a. // 0 <= index <= len(s) func InsertElem[T any](s []T, index int, value T) []T { if len(s) == index { // nil or empty slice or after last element return append(s, value) } s = append(s[:index+1], s[index:]...) // index < len(s) s[index] = value return s } // RemoveElem removes the element at index i from s. func RemoveElem[T any](s []T, index int) []T { return append(s[:index], s[index+1:]...) } func EscapeHTML(s string) string { if strings.ContainsAny(s, "<>\"'") { return html.EscapeString(s) } return s } func Reverse(s string) string { runes := []rune(s) for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 { runes[i], runes[j] = runes[j], runes[i] } return string(runes) } func RemoveRedundantSpace(str string) string { buf := bytes.Buffer{} lastIsChinese := false lastIsSpace := false for _, r := range str { if unicode.IsSpace(r) { if lastIsChinese || lastIsSpace { continue } buf.WriteRune(' ') lastIsChinese = false lastIsSpace = true continue } lastIsSpace = false buf.WriteRune(r) if unicode.Is(unicode.Han, r) { lastIsChinese = true continue } else { lastIsChinese = false } } return buf.String() }