Skip to content

Commit 923b410

Browse files
committed
x.vweb: fix $vweb.html() integration in cgen for the newer x.vweb module (fix #20204)
1 parent fa81188 commit 923b410

File tree

5 files changed

+37
-9
lines changed

5 files changed

+37
-9
lines changed

examples/xvweb/todo/main.v

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@ pub fn (app &App) index(mut ctx Context) vweb.Result {
3939
todos := sql app.db {
4040
select from Todo
4141
} or { return ctx.server_error('could not fetch todos from database!') }
42-
43-
// TODO: use $vweb.html()
44-
return ctx.html($tmpl('templates/index.html'))
42+
return $vweb.html()
4543
}
4644

4745
// This method will only handle POST requests to the index page

vlib/v/gen/c/cgen.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ mut:
246246
has_reflection bool
247247
reflection_strings &map[string]int
248248
defer_return_tmp_var string
249+
vweb_filter_fn_name string // vweb__filter or x__vweb__filter, used by $vweb.html() for escaping strings in the templates, depending on which `vweb` import is used
249250
}
250251

251252
// global or const variable definition string

vlib/v/gen/c/comptime.v

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,25 +59,43 @@ fn (mut g Gen) comptime_call(mut node ast.ComptimeCall) {
5959
cur_line = g.go_before_last_stmt()
6060
}
6161

62+
ret_sym := g.table.sym(g.fn_decl.return_type)
63+
fn_name := g.fn_decl.name.replace('.', '__') + node.pos.pos.str()
64+
is_x_vweb := ret_sym.cname == 'x__vweb__Result'
65+
6266
for stmt in node.vweb_tmpl.stmts {
6367
if stmt is ast.FnDecl {
64-
// insert stmts from vweb_tmpl fn
6568
if stmt.name.starts_with('main.vweb_tmpl') {
6669
if is_html {
6770
g.inside_vweb_tmpl = true
71+
if is_x_vweb {
72+
g.vweb_filter_fn_name = 'x__vweb__filter'
73+
} else {
74+
g.vweb_filter_fn_name = 'vweb__filter'
75+
}
6876
}
77+
// insert stmts from vweb_tmpl fn
6978
g.stmts(stmt.stmts.filter(it !is ast.Return))
79+
//
7080
g.inside_vweb_tmpl = false
81+
g.vweb_filter_fn_name = ''
7182
break
7283
}
7384
}
7485
}
7586

76-
fn_name := g.fn_decl.name.replace('.', '__') + node.pos.pos.str()
7787
if is_html {
78-
// return vweb html template
79-
app_name := g.fn_decl.params[0].name
80-
g.writeln('vweb__Context_html(&${app_name}->Context, _tmpl_res_${fn_name}); strings__Builder_free(&sb_${fn_name}); string_free(&_tmpl_res_${fn_name});')
88+
// return a vweb or x.vweb html template
89+
if is_x_vweb {
90+
ctx_name := g.fn_decl.params[1].name
91+
g.writeln('x__vweb__Context_html(${ctx_name}, _tmpl_res_${fn_name});')
92+
} else {
93+
// old vweb:
94+
app_name := g.fn_decl.params[0].name
95+
g.writeln('vweb__Context_html(&${app_name}->Context, _tmpl_res_${fn_name});')
96+
}
97+
g.writeln('strings__Builder_free(&sb_${fn_name});')
98+
g.writeln('string_free(&_tmpl_res_${fn_name});')
8199
} else {
82100
// return $tmpl string
83101
g.write(cur_line)

vlib/v/gen/c/str_intp.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ fn (mut g Gen) str_val(node ast.StringInterLiteral, i int, fmts []u8) {
168168
typ_sym := g.table.sym(typ)
169169
if typ == ast.string_type && g.comptime.comptime_for_method.len == 0 {
170170
if g.inside_vweb_tmpl {
171-
g.write('vweb__filter(')
171+
g.write('${g.vweb_filter_fn_name}(')
172172
if expr.is_auto_deref_var() && fmt != `p` {
173173
g.write('*')
174174
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module vweb
2+
3+
import encoding.html
4+
5+
// Do not delete.
6+
// Calls to this function are generated by `fn (mut g Gen) str_val(node ast.StringInterLiteral, i int, fmts []u8) {` in vlib/v/gen/c/str_intp.v,
7+
// for string interpolation inside vweb templates.
8+
// TODO: move it to template render
9+
fn filter(s string) string {
10+
return html.escape(s)
11+
}

0 commit comments

Comments
 (0)