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