From bd09f4cc599b1c7ed672dbfcddcb6240c9dd3f77 Mon Sep 17 00:00:00 2001 From: scanner <280983584+hivecommons-hive[bot]@users.noreply.github.com> Date: Sun, 25 Oct 2026 02:26:31 -0400 Subject: [PATCH 1/2] fix(intake): skip style, script and comment text when extracting HTML Signed-off-by: scanner <280983584+hivecommons-hive[bot]@users.noreply.github.com> --- pkg/intake/intake.go | 85 ++++++++++++++++++++++++++++++++------- pkg/intake/intake_test.go | 25 ++++++++++++ 2 files changed, 96 insertions(+), 14 deletions(-) diff --git a/pkg/intake/intake.go b/pkg/intake/intake.go index 128f316..a696d3c 100644 --- a/pkg/intake/intake.go +++ b/pkg/intake/intake.go @@ -256,29 +256,86 @@ func StripTags(s string) string { var b strings.Builder inTag := false spacePending := false - for _, r := range s { - switch r { - case '<': - inTag = true + for i := 0; i < len(s); { + c := s[i] + if !inTag && c == '<' { spacePending = true - case '>': - inTag = false - default: - if inTag { + if strings.HasPrefix(s[i:], "") + if end < 0 { + return len(s) + } + return i + 4 + end + 3 +} + +func htmlTagName(s string, i int) string { + start := i + for i < len(s) && (s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z' || s[i] >= '0' && s[i] <= '9') { + i++ + } + return strings.ToLower(s[start:i]) +} + +func htmlSkippedElement(name string) bool { + switch name { + case "script", "style", "noscript", "template": + return true + } + return false +} + +// skipHTMLElement returns the index just past the closing tag matching the +// element opened at s[i], or len(s) when it is never closed. +func skipHTMLElement(s string, i int, name string) int { + for j := i + 1; j < len(s); j++ { + if s[j] != '<' || j+1 >= len(s) || s[j+1] != '/' || htmlTagName(s, j+2) != name { + continue + } + end := strings.IndexByte(s[j:], '>') + if end < 0 { + return len(s) + } + return j + end + 1 + } + return len(s) +} + func StripRTF(s string) string { var b strings.Builder for i := 0; i < len(s); { diff --git a/pkg/intake/intake_test.go b/pkg/intake/intake_test.go index 0cb5325..51953b4 100644 --- a/pkg/intake/intake_test.go +++ b/pkg/intake/intake_test.go @@ -39,6 +39,31 @@ func TestExtractTextFormats(t *testing.T) { } } +func TestStripTagsSkipsNonTextRegions(t *testing.T) { + t.Parallel() + cases := []struct{ name, in, want string }{ + {"entities", "

Idea

Help & ship

", "Idea Help & ship"}, + {"style", "

a

b

", "a b"}, + {"script", "

a

b

", "a b"}, + {"noscript", "

a

b

", "a b"}, + {"template", "

a

b

", "a b"}, + {"uppercase", "

a

b

", "a b"}, + {"comment", "

a

b

", "a b"}, + {"unterminated comment", "

a