Added i as an alias for em in the HTML parser.
b is now an alias for strong in the HTML parser rather than being it's own thing. Fixed a bug where tags weren't being closed. Fixed a bug where the right entities weren't being written all the time. Added tests for the preparser.
This commit is contained in:
parent
1f28ecb804
commit
6eb3429c25
|
@ -201,6 +201,7 @@ func PreparseMessage(msg string) string {
|
||||||
'd': []string{"el"},
|
'd': []string{"el"},
|
||||||
'u': []string{""},
|
'u': []string{""},
|
||||||
'b': []string{""},
|
'b': []string{""},
|
||||||
|
'i': []string{""},
|
||||||
}
|
}
|
||||||
var buildLitMatch = func(tag string) func(*TagToAction, bool, int, []rune) (int, string) {
|
var buildLitMatch = func(tag string) func(*TagToAction, bool, int, []rune) (int, string) {
|
||||||
return func(action *TagToAction, open bool, _ int, _ []rune) (int, string) {
|
return func(action *TagToAction, open bool, _ int, _ []rune) (int, string) {
|
||||||
|
@ -242,7 +243,8 @@ func PreparseMessage(msg string) string {
|
||||||
},
|
},
|
||||||
'd': []*TagToAction{&TagToAction{"el", buildLitMatch("del"), 0, false}},
|
'd': []*TagToAction{&TagToAction{"el", buildLitMatch("del"), 0, false}},
|
||||||
'u': []*TagToAction{&TagToAction{"", buildLitMatch("u"), 0, false}},
|
'u': []*TagToAction{&TagToAction{"", buildLitMatch("u"), 0, false}},
|
||||||
'b': []*TagToAction{&TagToAction{"", buildLitMatch("b"), 0, false}},
|
'b': []*TagToAction{&TagToAction{"", buildLitMatch("strong"), 0, false}},
|
||||||
|
'i': []*TagToAction{&TagToAction{"", buildLitMatch("em"), 0, false}},
|
||||||
}
|
}
|
||||||
// TODO: Implement a less literal parser
|
// TODO: Implement a less literal parser
|
||||||
for i := 0; i < len(runes); i++ {
|
for i := 0; i < len(runes); i++ {
|
||||||
|
@ -255,6 +257,7 @@ func PreparseMessage(msg string) string {
|
||||||
//fmt.Println("string(char): ", string(char))
|
//fmt.Println("string(char): ", string(char))
|
||||||
if int(char) >= len(allowedTags) {
|
if int(char) >= len(allowedTags) {
|
||||||
//fmt.Println("sentinel char out of bounds")
|
//fmt.Println("sentinel char out of bounds")
|
||||||
|
msg += "&"
|
||||||
i -= 4
|
i -= 4
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -271,8 +274,11 @@ func PreparseMessage(msg string) string {
|
||||||
if len(tags) == 0 {
|
if len(tags) == 0 {
|
||||||
//fmt.Println("couldn't find char in allowedTags")
|
//fmt.Println("couldn't find char in allowedTags")
|
||||||
if closeTag {
|
if closeTag {
|
||||||
|
//msg += "</"
|
||||||
|
msg += "&"
|
||||||
i -= 5
|
i -= 5
|
||||||
} else {
|
} else {
|
||||||
|
msg += "&"
|
||||||
i -= 4
|
i -= 4
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
|
@ -292,18 +298,21 @@ func PreparseMessage(msg string) string {
|
||||||
newI, out = toAction.Do(toAction, !closeTag, i, runes)
|
newI, out = toAction.Do(toAction, !closeTag, i, runes)
|
||||||
//fmt.Println("newI: ", newI)
|
//fmt.Println("newI: ", newI)
|
||||||
//fmt.Println("i: ", i)
|
//fmt.Println("i: ", i)
|
||||||
|
//fmt.Println("string(runes[i]): ", string(runes[i]))
|
||||||
if newI != -1 {
|
if newI != -1 {
|
||||||
i = newI
|
i = newI
|
||||||
} else {
|
} else if out != "" {
|
||||||
i += len(toAction.Suffix + ">")
|
i += len(toAction.Suffix + ">")
|
||||||
}
|
}
|
||||||
//fmt.Println("i: ", i)
|
//fmt.Println("i: ", i)
|
||||||
|
//fmt.Println("string(runes[i]): ", string(runes[i]))
|
||||||
//fmt.Println("out: ", out)
|
//fmt.Println("out: ", out)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if out == "" {
|
if out == "" {
|
||||||
//fmt.Println("no out")
|
//fmt.Println("no out")
|
||||||
|
msg += "&"
|
||||||
if closeTag {
|
if closeTag {
|
||||||
i -= 5
|
i -= 5
|
||||||
} else {
|
} else {
|
||||||
|
@ -317,11 +326,19 @@ func PreparseMessage(msg string) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//fmt.Println("running autoclosers")
|
||||||
|
//fmt.Println("msg: ", msg)
|
||||||
for _, actionList := range tagToAction {
|
for _, actionList := range tagToAction {
|
||||||
|
//if len(actionList) > 0 {
|
||||||
|
// fmt.Println("actionList: ", actionList)
|
||||||
|
//}
|
||||||
for _, toAction := range actionList {
|
for _, toAction := range actionList {
|
||||||
if toAction.Depth > 1 {
|
//fmt.Printf("toAction: %+v\n", toAction)
|
||||||
|
if toAction.Depth > 0 {
|
||||||
|
//fmt.Println("autoclosing")
|
||||||
for ; toAction.Depth > 0; toAction.Depth-- {
|
for ; toAction.Depth > 0; toAction.Depth-- {
|
||||||
_, out := toAction.Do(toAction, false, len(runes), runes)
|
_, out := toAction.Do(toAction, false, len(runes), runes)
|
||||||
|
//fmt.Println("out: ", out)
|
||||||
if out != "" {
|
if out != "" {
|
||||||
msg += out
|
msg += out
|
||||||
}
|
}
|
||||||
|
|
51
misc_test.go
51
misc_test.go
|
@ -955,3 +955,54 @@ func passwordTest(t *testing.T, realPassword string, hashedPassword string) {
|
||||||
expect(t, err != common.ErrPasswordTooLong, "CheckPassword thinks the password is too long")
|
expect(t, err != common.ErrPasswordTooLong, "CheckPassword thinks the password is too long")
|
||||||
expect(t, err != nil, "The two shouldn't match!")
|
expect(t, err != nil, "The two shouldn't match!")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPreparser(t *testing.T) {
|
||||||
|
var res string
|
||||||
|
var msgList []MEPair
|
||||||
|
|
||||||
|
// Note: The open tag is evaluated without knowledge of the close tag for efficiency and simplicity, so the parser autofills the associated close tag when it finds an open tag without a partner
|
||||||
|
msgList = addMEPair(msgList, "", "")
|
||||||
|
msgList = addMEPair(msgList, "hi", "hi")
|
||||||
|
msgList = addMEPair(msgList, "<b></b>", "<strong></strong>")
|
||||||
|
msgList = addMEPair(msgList, "<b>hi</b>", "<strong>hi</strong>")
|
||||||
|
msgList = addMEPair(msgList, "<s>hi</s>", "<del>hi</del>")
|
||||||
|
msgList = addMEPair(msgList, "<del>hi</del>", "<del>hi</del>")
|
||||||
|
msgList = addMEPair(msgList, "<u>hi</u>", "<u>hi</u>")
|
||||||
|
msgList = addMEPair(msgList, "<em>hi</em>", "<em>hi</em>")
|
||||||
|
msgList = addMEPair(msgList, "<i>hi</i>", "<em>hi</em>")
|
||||||
|
msgList = addMEPair(msgList, "<strong>hi</strong>", "<strong>hi</strong>")
|
||||||
|
msgList = addMEPair(msgList, "<b><i>hi</i></b>", "<strong><em>hi</em></strong>")
|
||||||
|
msgList = addMEPair(msgList, "<strong><em>hi</em></strong>", "<strong><em>hi</em></strong>")
|
||||||
|
msgList = addMEPair(msgList, "<b><i><b>hi</b></i></b>", "<strong><em><strong>hi</strong></em></strong>")
|
||||||
|
msgList = addMEPair(msgList, "<strong><em><strong>hi</strong></em></strong>", "<strong><em><strong>hi</strong></em></strong>")
|
||||||
|
msgList = addMEPair(msgList, "<div>hi</div>", "<div>hi</div>")
|
||||||
|
msgList = addMEPair(msgList, "<span>hi</span>", "hi") // This is stripped since the editor (Trumbowyg) likes blasting useless spans
|
||||||
|
msgList = addMEPair(msgList, "<span >hi</span>", "hi")
|
||||||
|
msgList = addMEPair(msgList, "<span style='background-color: yellow;'>hi</span>", "hi")
|
||||||
|
msgList = addMEPair(msgList, "<span style='background-color: yellow;'>>hi</span>", ">hi")
|
||||||
|
msgList = addMEPair(msgList, "<b>hi", "<strong>hi</strong>")
|
||||||
|
msgList = addMEPair(msgList, "hi</b>", "hi</b>")
|
||||||
|
msgList = addMEPair(msgList, "</b>", "</b>")
|
||||||
|
msgList = addMEPair(msgList, "</del>", "</del>")
|
||||||
|
msgList = addMEPair(msgList, "</strong>", "</strong>")
|
||||||
|
msgList = addMEPair(msgList, "<b>", "<strong></strong>")
|
||||||
|
msgList = addMEPair(msgList, "<span style='background-color: yellow;'>hi", "hi")
|
||||||
|
msgList = addMEPair(msgList, "hi</span>", "hi")
|
||||||
|
msgList = addMEPair(msgList, "</span>", "")
|
||||||
|
msgList = addMEPair(msgList, "<span></span>", "")
|
||||||
|
msgList = addMEPair(msgList, "<span ></span>", "")
|
||||||
|
msgList = addMEPair(msgList, "<></>", "<></>")
|
||||||
|
msgList = addMEPair(msgList, "</><>", "</><>")
|
||||||
|
msgList = addMEPair(msgList, "<>", "<>")
|
||||||
|
msgList = addMEPair(msgList, "</>", "</>")
|
||||||
|
|
||||||
|
for _, item := range msgList {
|
||||||
|
res = common.PreparseMessage(item.Msg)
|
||||||
|
if res != item.Expects {
|
||||||
|
t.Error("Testing string '" + item.Msg + "'")
|
||||||
|
t.Error("Bad output:", "'"+res+"'")
|
||||||
|
//t.Error("Ouput in bytes:", []byte(res))
|
||||||
|
t.Error("Expected:", "'"+item.Expects+"'")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue