Skip to content

Commit 9ce2409

Browse files
authored
fix(util/gpage): html.EscapeString for pagination HTML generation and URL parsing (#4079)
1 parent 6ea1526 commit 9ce2409

File tree

2 files changed

+27
-23
lines changed

2 files changed

+27
-23
lines changed

util/gpage/gpage.go

+9-5
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func (p *Page) GetContent(mode int) string {
164164
p.FirstPageTag = "首页"
165165
p.LastPageTag = "尾页"
166166
return fmt.Sprintf(
167-
`%s%s<span class="current">[第%d页]</span>%s%s第%s页`,
167+
`%s%s<span class="current">[第 %d 页]</span>%s%s第%s页`,
168168
p.FirstPage(),
169169
p.PrevPage(),
170170
p.CurrentPage,
@@ -184,7 +184,7 @@ func (p *Page) GetContent(mode int) string {
184184
pageStr += p.NextPage()
185185
pageStr += p.LastPage()
186186
pageStr += fmt.Sprintf(
187-
`<span>当前页%d/%d</span> <span>共%d条</span>`,
187+
`<span>当前页 %d/%d</span> <span>共 %d 条</span>`,
188188
p.CurrentPage,
189189
p.TotalPage,
190190
p.TotalSize,
@@ -210,20 +210,24 @@ func (p *Page) GetContent(mode int) string {
210210
// The UrlTemplate attribute can be a URL or URI string containing the "{.page}" placeholder,
211211
// which will be replaced by the actual page number.
212212
func (p *Page) GetUrl(page int) string {
213-
return gstr.Replace(p.UrlTemplate, DefaultPagePlaceHolder, gconv.String(page))
213+
return html.EscapeString(gstr.Replace(p.UrlTemplate, DefaultPagePlaceHolder, gconv.String(page)))
214214
}
215215

216216
// GetLink returns the HTML link tag `a` content for given page number.
217217
func (p *Page) GetLink(page int, text, title string) string {
218+
var (
219+
escapedTitle = html.EscapeString(title)
220+
escapedText = html.EscapeString(text)
221+
)
218222
if len(p.AjaxActionName) > 0 {
219223
return fmt.Sprintf(
220224
`<a class="%s" href="javascript:%s('%s')" title="%s">%s</a>`,
221-
p.LinkStyle, p.AjaxActionName, p.GetUrl(page), html.EscapeString(title), text,
225+
p.LinkStyle, p.AjaxActionName, p.GetUrl(page), escapedTitle, escapedText,
222226
)
223227
} else {
224228
return fmt.Sprintf(
225229
`<a class="%s" href="%s" title="%s">%s</a>`,
226-
p.LinkStyle, p.GetUrl(page), html.EscapeString(title), text,
230+
p.LinkStyle, p.GetUrl(page), escapedTitle, escapedText,
227231
)
228232
}
229233
}

util/gpage/gpage_z_unit_test.go

+18-18
Original file line numberDiff line numberDiff line change
@@ -33,27 +33,27 @@ func Test_New(t *testing.T) {
3333
func Test_Basic(t *testing.T) {
3434
gtest.C(t, func(t *gtest.T) {
3535
page := gpage.New(9, 2, 1, `/user/list?page={.page}`)
36-
t.Assert(page.NextPage(), `<a class="GPageLink" href="/user/list?page=2" title="">></a>`)
36+
t.Assert(page.NextPage(), `<a class="GPageLink" href="/user/list?page=2" title="">&gt;</a>`)
3737
t.Assert(page.PrevPage(), `<span class="GPageSpan"><</span>`)
3838
t.Assert(page.FirstPage(), `<span class="GPageSpan">|<</span>`)
39-
t.Assert(page.LastPage(), `<a class="GPageLink" href="/user/list?page=5" title="">>|</a>`)
39+
t.Assert(page.LastPage(), `<a class="GPageLink" href="/user/list?page=5" title="">&gt;|</a>`)
4040
t.Assert(page.PageBar(), `<span class="GPageSpan">1</span><a class="GPageLink" href="/user/list?page=2" title="2">2</a><a class="GPageLink" href="/user/list?page=3" title="3">3</a><a class="GPageLink" href="/user/list?page=4" title="4">4</a><a class="GPageLink" href="/user/list?page=5" title="5">5</a>`)
4141
})
4242

4343
gtest.C(t, func(t *gtest.T) {
4444
page := gpage.New(9, 2, 3, `/user/list?page={.page}`)
45-
t.Assert(page.NextPage(), `<a class="GPageLink" href="/user/list?page=4" title="">></a>`)
46-
t.Assert(page.PrevPage(), `<a class="GPageLink" href="/user/list?page=2" title=""><</a>`)
47-
t.Assert(page.FirstPage(), `<a class="GPageLink" href="/user/list?page=1" title="">|<</a>`)
48-
t.Assert(page.LastPage(), `<a class="GPageLink" href="/user/list?page=5" title="">>|</a>`)
45+
t.Assert(page.NextPage(), `<a class="GPageLink" href="/user/list?page=4" title="">&gt;</a>`)
46+
t.Assert(page.PrevPage(), `<a class="GPageLink" href="/user/list?page=2" title="">&lt;</a>`)
47+
t.Assert(page.FirstPage(), `<a class="GPageLink" href="/user/list?page=1" title="">|&lt;</a>`)
48+
t.Assert(page.LastPage(), `<a class="GPageLink" href="/user/list?page=5" title="">&gt;|</a>`)
4949
t.Assert(page.PageBar(), `<a class="GPageLink" href="/user/list?page=1" title="1">1</a><a class="GPageLink" href="/user/list?page=2" title="2">2</a><span class="GPageSpan">3</span><a class="GPageLink" href="/user/list?page=4" title="4">4</a><a class="GPageLink" href="/user/list?page=5" title="5">5</a>`)
5050
})
5151

5252
gtest.C(t, func(t *gtest.T) {
5353
page := gpage.New(9, 2, 5, `/user/list?page={.page}`)
5454
t.Assert(page.NextPage(), `<span class="GPageSpan">></span>`)
55-
t.Assert(page.PrevPage(), `<a class="GPageLink" href="/user/list?page=4" title=""><</a>`)
56-
t.Assert(page.FirstPage(), `<a class="GPageLink" href="/user/list?page=1" title="">|<</a>`)
55+
t.Assert(page.PrevPage(), `<a class="GPageLink" href="/user/list?page=4" title="">&lt;</a>`)
56+
t.Assert(page.FirstPage(), `<a class="GPageLink" href="/user/list?page=1" title="">|&lt;</a>`)
5757
t.Assert(page.LastPage(), `<span class="GPageSpan">>|</span>`)
5858
t.Assert(page.PageBar(), `<a class="GPageLink" href="/user/list?page=1" title="1">1</a><a class="GPageLink" href="/user/list?page=2" title="2">2</a><a class="GPageLink" href="/user/list?page=3" title="3">3</a><a class="GPageLink" href="/user/list?page=4" title="4">4</a><span class="GPageSpan">5</span>`)
5959
})
@@ -82,10 +82,10 @@ func Test_CustomStyle(t *testing.T) {
8282
page.LinkStyle = "MyPageLink"
8383
page.SpanStyle = "MyPageSpan"
8484
page.SelectStyle = "MyPageSelect"
85-
t.Assert(page.NextPage(), `<a class="MyPageLink" href="/user/list/3" title="">></a>`)
86-
t.Assert(page.PrevPage(), `<a class="MyPageLink" href="/user/list/1" title=""><</a>`)
87-
t.Assert(page.FirstPage(), `<a class="MyPageLink" href="/user/list/1" title="">|<</a>`)
88-
t.Assert(page.LastPage(), `<a class="MyPageLink" href="/user/list/5" title="">>|</a>`)
85+
t.Assert(page.NextPage(), `<a class="MyPageLink" href="/user/list/3" title="">&gt;</a>`)
86+
t.Assert(page.PrevPage(), `<a class="MyPageLink" href="/user/list/1" title="">&lt;</a>`)
87+
t.Assert(page.FirstPage(), `<a class="MyPageLink" href="/user/list/1" title="">|&lt;</a>`)
88+
t.Assert(page.LastPage(), `<a class="MyPageLink" href="/user/list/5" title="">&gt;|</a>`)
8989
t.Assert(page.PageBar(), `<a class="MyPageLink" href="/user/list/1" title="1">1</a><span class="MyPageSpan">2</span><a class="MyPageLink" href="/user/list/3" title="3">3</a><a class="MyPageLink" href="/user/list/4" title="4">4</a><a class="MyPageLink" href="/user/list/5" title="5">5</a>`)
9090
t.Assert(page.SelectBar(), `<select name="MyPageSelect" onchange="window.location.href=this.value"><option value="/user/list/1">1</option><option value="/user/list/2" selected>2</option><option value="/user/list/3">3</option><option value="/user/list/4">4</option><option value="/user/list/5">5</option></select>`)
9191
})
@@ -95,10 +95,10 @@ func Test_Ajax(t *testing.T) {
9595
gtest.C(t, func(t *gtest.T) {
9696
page := gpage.New(5, 1, 2, `/user/list/{.page}`)
9797
page.AjaxActionName = "LoadPage"
98-
t.Assert(page.NextPage(), `<a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="">></a>`)
99-
t.Assert(page.PrevPage(), `<a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title=""><</a>`)
100-
t.Assert(page.FirstPage(), `<a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">|<</a>`)
101-
t.Assert(page.LastPage(), `<a class="GPageLink" href="javascript:LoadPage('/user/list/5')" title="">>|</a>`)
98+
t.Assert(page.NextPage(), `<a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="">&gt;</a>`)
99+
t.Assert(page.PrevPage(), `<a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">&lt;</a>`)
100+
t.Assert(page.FirstPage(), `<a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">|&lt;</a>`)
101+
t.Assert(page.LastPage(), `<a class="GPageLink" href="javascript:LoadPage('/user/list/5')" title="">&gt;|</a>`)
102102
t.Assert(page.PageBar(), `<a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="1">1</a><span class="GPageSpan">2</span><a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="3">3</a><a class="GPageLink" href="javascript:LoadPage('/user/list/4')" title="4">4</a><a class="GPageLink" href="javascript:LoadPage('/user/list/5')" title="5">5</a>`)
103103
})
104104
}
@@ -108,8 +108,8 @@ func Test_PredefinedContent(t *testing.T) {
108108
page := gpage.New(5, 1, 2, `/user/list/{.page}`)
109109
page.AjaxActionName = "LoadPage"
110110
t.Assert(page.GetContent(1), `<a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">上一页</a> <span class="current">2</span> <a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="">下一页</a>`)
111-
t.Assert(page.GetContent(2), `<a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">首页</a><a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title=""><<上一页</a><span class="current">[第2页]</span><a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="">下一页>></a><a class="GPageLink" href="javascript:LoadPage('/user/list/5')" title="">尾页</a>第<select name="GPageSelect" onchange="window.location.href=this.value"><option value="/user/list/1">1</option><option value="/user/list/2" selected>2</option><option value="/user/list/3">3</option><option value="/user/list/4">4</option><option value="/user/list/5">5</option></select>页`)
112-
t.Assert(page.GetContent(3), `<a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">首页</a><a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">上一页</a><a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="1">1</a><span class="GPageSpan">2</span><a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="3">3</a><a class="GPageLink" href="javascript:LoadPage('/user/list/4')" title="4">4</a><a class="GPageLink" href="javascript:LoadPage('/user/list/5')" title="5">5</a><a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="">下一页</a><a class="GPageLink" href="javascript:LoadPage('/user/list/5')" title="">尾页</a><span>当前页2/5</span> <span>共5条</span>`)
111+
t.Assert(page.GetContent(2), `<a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">首页</a><a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">&lt;&lt;上一页</a><span class="current">[第 2 页]</span><a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="">下一页&gt;&gt;</a><a class="GPageLink" href="javascript:LoadPage('/user/list/5')" title="">尾页</a>第<select name="GPageSelect" onchange="window.location.href=this.value"><option value="/user/list/1">1</option><option value="/user/list/2" selected>2</option><option value="/user/list/3">3</option><option value="/user/list/4">4</option><option value="/user/list/5">5</option></select>页`)
112+
t.Assert(page.GetContent(3), `<a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">首页</a><a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">上一页</a><a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="1">1</a><span class="GPageSpan">2</span><a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="3">3</a><a class="GPageLink" href="javascript:LoadPage('/user/list/4')" title="4">4</a><a class="GPageLink" href="javascript:LoadPage('/user/list/5')" title="5">5</a><a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="">下一页</a><a class="GPageLink" href="javascript:LoadPage('/user/list/5')" title="">尾页</a><span>当前页 2/5</span> <span>共 5 条</span>`)
113113
t.Assert(page.GetContent(4), `<a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">首页</a><a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="">上一页</a><a class="GPageLink" href="javascript:LoadPage('/user/list/1')" title="1">1</a><span class="GPageSpan">2</span><a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="3">3</a><a class="GPageLink" href="javascript:LoadPage('/user/list/4')" title="4">4</a><a class="GPageLink" href="javascript:LoadPage('/user/list/5')" title="5">5</a><a class="GPageLink" href="javascript:LoadPage('/user/list/3')" title="">下一页</a><a class="GPageLink" href="javascript:LoadPage('/user/list/5')" title="">尾页</a>`)
114114
t.Assert(page.GetContent(5), ``)
115115
})

0 commit comments

Comments
 (0)