Canonical path adherence (#10)
Reviewed-on: https://gitea.westgate.pw/ShadowsOverWestgate/sow-tools/pulls/10 Co-authored-by: vickydotbat <vickydotbat@tutamail.com> Co-committed-by: vickydotbat <vickydotbat@tutamail.com>
This commit is contained in:
@@ -8,6 +8,59 @@ import (
|
||||
"golang.org/x/text/unicode/norm"
|
||||
)
|
||||
|
||||
func canonicalWikiSegment(value string) string {
|
||||
value = html.UnescapeString(strings.TrimSpace(value))
|
||||
var b strings.Builder
|
||||
lastSeparator := false
|
||||
for _, r := range norm.NFKD.String(value) {
|
||||
transliterated := transliterateWikiSlugRune(unicode.ToLower(r))
|
||||
switch {
|
||||
case (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9'):
|
||||
b.WriteRune(r)
|
||||
lastSeparator = false
|
||||
case r == '_':
|
||||
if b.Len() > 0 && !lastSeparator {
|
||||
b.WriteRune(r)
|
||||
lastSeparator = true
|
||||
}
|
||||
case unicode.Is(unicode.Mn, r):
|
||||
continue
|
||||
case isWikiSlugJoinerPunctuation(r):
|
||||
continue
|
||||
case transliterated != "":
|
||||
b.WriteString(matchWikiTransliterationCase(r, transliterated))
|
||||
lastSeparator = false
|
||||
default:
|
||||
if b.Len() > 0 && !lastSeparator {
|
||||
b.WriteByte('_')
|
||||
lastSeparator = true
|
||||
}
|
||||
}
|
||||
}
|
||||
return strings.Trim(b.String(), "_")
|
||||
}
|
||||
|
||||
func matchWikiTransliterationCase(r rune, value string) string {
|
||||
if unicode.IsUpper(r) {
|
||||
if len(value) == 1 {
|
||||
return strings.ToUpper(value)
|
||||
}
|
||||
return strings.ToUpper(value[:1]) + value[1:]
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
func canonicalWikiPath(segments ...string) string {
|
||||
out := []string{}
|
||||
for _, segment := range segments {
|
||||
canonical := canonicalWikiSegment(segment)
|
||||
if canonical != "" {
|
||||
out = append(out, canonical)
|
||||
}
|
||||
}
|
||||
return strings.Join(out, "/")
|
||||
}
|
||||
|
||||
func slugifyWikiText(value string, fallback string) string {
|
||||
value = html.UnescapeString(strings.TrimSpace(value))
|
||||
var b strings.Builder
|
||||
|
||||
Reference in New Issue
Block a user