@@ -23,28 +23,42 @@ const DYNAMIC_GLOBAL = /dyn-\$(\d+)\$/g
2323const FORCE_ATTRIBUTES = / - | ^ c l a s s $ | ^ f o r $ / i
2424const NEEDS_UPPERCASING = / \$ ./ g
2525
26+ function createPolicy < T extends { createHTML ( input : string , ...args : unknown [ ] ) : string } > ( _name : string , rules : T ) : T {
27+ return rules
28+ }
29+
30+ declare var trustedTypes : { createPolicy : typeof createPolicy }
31+
32+ const policy = ( typeof trustedTypes === 'undefined' ? createPolicy : trustedTypes . createPolicy . bind ( trustedTypes ) ) (
33+ 'dhtml' ,
34+ {
35+ createHTML : ( _text , statics : TemplateStringsArray ) => {
36+ let i = 0
37+ return [ ...lexer . lex ( statics ) ]
38+ . map ( ( [ char , state ] ) => {
39+ if ( char === '\0' ) {
40+ if ( state === lexer . DATA ) return `<!--dyn-$${ i ++ } $-->`
41+ else return `dyn-$${ i ++ } $`
42+ }
43+ if ( state === lexer . ATTR_NAME && char . toLowerCase ( ) !== char ) {
44+ return `$${ char } `
45+ }
46+ return char
47+ } )
48+ . join ( '' )
49+ } ,
50+ } ,
51+ )
52+
2653const templates : WeakMap < TemplateStringsArray , CompiledTemplate > = new WeakMap ( )
2754export function compile_template ( statics : TemplateStringsArray ) : CompiledTemplate {
2855 const cached = templates . get ( statics )
2956 if ( cached ) return cached
3057
3158 const template_element = document . createElement ( 'template' )
32- let next_part = 0
33- template_element . innerHTML = [ ...lexer . lex ( statics ) ]
34- . map ( ( [ char , state ] ) => {
35- if ( char === '\0' ) {
36- if ( state === lexer . DATA ) return `<!--dyn-$${ next_part ++ } $-->`
37- else return `dyn-$${ next_part ++ } $`
38- }
39- if ( state === lexer . ATTR_NAME && char . toLowerCase ( ) !== char ) {
40- return `$${ char } `
41- }
42- return char
43- } )
44- . join ( '' )
45-
46- next_part = 0
59+ template_element . innerHTML = policy . createHTML ( '' , statics )
4760
61+ let next_part = 0
4862 const compiled : CompiledTemplate = {
4963 _content : template_element . content ,
5064 _parts : Array ( statics . length - 1 ) ,
0 commit comments