tmpl: inline styles with attributes (#9605)
parent
a0648a3ec2
commit
7d5c1c2ddb
|
@ -19,6 +19,42 @@ enum State {
|
||||||
// span // span.{
|
// span // span.{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check HTML open tag `<name attr="x" >`
|
||||||
|
fn is_html_open_tag(name string, s string) bool {
|
||||||
|
mut len := s.len
|
||||||
|
if len < name.len {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
mut sub := s[0..1]
|
||||||
|
if sub != '<' { // not start with '<'
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
sub = s[len - 1..len]
|
||||||
|
if sub != '>' { // not end with '<'
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
sub = s[len - 2..len - 1]
|
||||||
|
if sub == '/' { // self-closing
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
sub = s[1..len - 1]
|
||||||
|
if sub.contains_any('<>') { // `<name <bad> >`
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if sub == name { // `<name>`
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
len = name.len
|
||||||
|
if sub.len <= len { // `<nam>` or `<meme>`
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if sub[..len + 1] != '$name ' { // not `<name ...>`
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// compile_file compiles the content of a file by the given path as a template
|
// compile_file compiles the content of a file by the given path as a template
|
||||||
pub fn (mut p Parser) compile_template_file(template_file string, fn_name string) string {
|
pub fn (mut p Parser) compile_template_file(template_file string, fn_name string) string {
|
||||||
mut lines := os.read_lines(template_file) or {
|
mut lines := os.read_lines(template_file) or {
|
||||||
|
@ -50,11 +86,11 @@ mut sb := strings.new_builder($lstartlength)\n
|
||||||
eprintln('>>> tfile: $template_file, spos: ${start_of_line_pos:6}, epos:${end_of_line_pos:6}, fi: ${tline_number:5}, i: ${i:5}, line: $oline')
|
eprintln('>>> tfile: $template_file, spos: ${start_of_line_pos:6}, epos:${end_of_line_pos:6}, fi: ${tline_number:5}, i: ${i:5}, line: $oline')
|
||||||
}
|
}
|
||||||
line := oline.trim_space()
|
line := oline.trim_space()
|
||||||
if line == '<style>' {
|
if is_html_open_tag('style', line) {
|
||||||
state = .css
|
state = .css
|
||||||
} else if line == '</style>' {
|
} else if line == '</style>' {
|
||||||
state = .html
|
state = .html
|
||||||
} else if line == '<script>' {
|
} else if is_html_open_tag('script', line) {
|
||||||
state = .js
|
state = .js
|
||||||
} else if line == '</script>' {
|
} else if line == '</script>' {
|
||||||
state = .html
|
state = .html
|
||||||
|
|
|
@ -218,3 +218,49 @@ for s in text_expr {
|
||||||
println('===================')
|
println('===================')
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
fn test_fn_is_html_open_tag() {
|
||||||
|
mut s := '<style>'
|
||||||
|
mut b := is_html_open_tag('style', s)
|
||||||
|
assert b == true
|
||||||
|
|
||||||
|
s = '<style media="print" custom-attr >'
|
||||||
|
b = is_html_open_tag('style', s)
|
||||||
|
assert b == true
|
||||||
|
|
||||||
|
s = '<style/>'
|
||||||
|
b = is_html_open_tag('style', s)
|
||||||
|
assert b == false
|
||||||
|
|
||||||
|
s = 'styl'
|
||||||
|
b = is_html_open_tag('style', s)
|
||||||
|
assert b == false
|
||||||
|
|
||||||
|
s = 'style'
|
||||||
|
b = is_html_open_tag('style', s)
|
||||||
|
assert b == false
|
||||||
|
|
||||||
|
s = '<style'
|
||||||
|
b = is_html_open_tag('style', s)
|
||||||
|
assert b == false
|
||||||
|
|
||||||
|
s = '<<style>'
|
||||||
|
b = is_html_open_tag('style', s)
|
||||||
|
assert b == false
|
||||||
|
|
||||||
|
s = '<style>>'
|
||||||
|
b = is_html_open_tag('style', s)
|
||||||
|
assert b == false
|
||||||
|
|
||||||
|
s = '<stylex>'
|
||||||
|
b = is_html_open_tag('style', s)
|
||||||
|
assert b == false
|
||||||
|
|
||||||
|
s = '<html>'
|
||||||
|
b = is_html_open_tag('style', s)
|
||||||
|
assert b == false
|
||||||
|
|
||||||
|
s = '<sript>'
|
||||||
|
b = is_html_open_tag('style', s)
|
||||||
|
assert b == false
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
h1 {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style media="print">
|
||||||
|
h1 {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script type="application/ld+json">
|
||||||
|
<!-- JSON-LD -->
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.getElementById("demo").innerHTML = "Hello JavaScript!";
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>@{title}</h1>
|
||||||
|
</header>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -0,0 +1,29 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
h1 {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style media="print">
|
||||||
|
h1 {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script type="application/ld+json">
|
||||||
|
<!-- JSON-LD -->
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.getElementById("demo").innerHTML = "Hello JavaScript!";
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>TEST</h1>
|
||||||
|
</header>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -0,0 +1,8 @@
|
||||||
|
fn abc() string {
|
||||||
|
title := 'TEST'
|
||||||
|
return $tmpl('file.html')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
print(abc())
|
||||||
|
}
|
Loading…
Reference in New Issue