diff --git a/common/parser.go b/common/parser.go index 473d025b..1899022d 100644 --- a/common/parser.go +++ b/common/parser.go @@ -171,6 +171,14 @@ type TagToAction struct { PartialMode bool } +func tryStepForward(i int, step int, runes []rune) (int, bool) { + i += step + if i < len(runes) { + return i, true + } + return i - step, false +} + // TODO: Preparse Markdown and normalize it into HTML? func PreparseMessage(msg string) string { //fmt.Println("initial msg: ", msg) @@ -196,13 +204,6 @@ func PreparseMessage(msg string) string { //fmt.Println("before []byte(msg): ", []byte(msg)) var runes = []rune(msg) msg = "" - var stepForward = func(i int, step int, runes []rune) int { - i += step - if i < len(runes) { - return i - } - return i - step - } // TODO: We can maybe reduce the size of this by using an offset? // TODO: Move some of these closures out of this function to make things a little more efficient @@ -262,7 +263,12 @@ func PreparseMessage(msg string) string { char := runes[i] if char == '&' && peekMatch(i, "lt;", runes) { //fmt.Println("found less than") - i = stepForward(i, 4, runes) + var ok bool + i, ok = tryStepForward(i, 4, runes) + if !ok { + msg += "<" + break + } char := runes[i] //fmt.Println("char: ", char) //fmt.Println("string(char): ", string(char)) @@ -276,7 +282,11 @@ func PreparseMessage(msg string) string { var closeTag bool if char == '/' { //fmt.Println("found close tag") - i = stepForward(i, 1, runes) + i, ok = tryStepForward(i, 1, runes) + if !ok { + msg += "</" + break + } char = runes[i] closeTag = true } diff --git a/misc_test.go b/misc_test.go index 61b4277b..cd495510 100644 --- a/misc_test.go +++ b/misc_test.go @@ -993,6 +993,7 @@ func TestPreparser(t *testing.T) { msgList = addMETri(msgList, ">", ">") msgList = addMETri(msgList, "", "<meow>") msgList = addMETri(msgList, "<", "&lt;") + msgList = addMETri(msgList, "&", "&") // Note: strings.TrimSpace strips newlines, if there's nothing before or after them msgList = addMETri(msgList, "
", "")