当前位置:网站首页>Explain in simple terms node template parsing error escape is not a function

Explain in simple terms node template parsing error escape is not a function

2022-07-06 04:08:00 xzlAwin

Explain profound theories in simple language node Template parsing error escape is not a function

operation

var escape = function (html) {
  return String(html)
    .replace(/&(?!\w+;)/g, '&')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
}

var complie = function (str) {
	console.log(str)
  var tpl = str.replace(/<%=([\s\S]+?)%>/g, function (match, code) {
    //  escape 
    return "' + escape(" + code + ") + '"
  }).replace(/<%-([\s\S]+?)%>/g, function (match, code) {
    //  Normal output 
    return "' + " + code + " + '"
  }).replace(/<%([\s\S]+?)%>/g, function (match, code) {
    return "';\n" + code + "\n    tpl += '"
  }).replace(/\'\n/g, '\'')
  .replace(/\n\'/gm, '\'')

  console.log('---------- Code replacement template ----------')
  console.log(tpl)
  tpl = "tpl = '" + tpl + "'"
  tpl = tpl.replace(/''/g, '\'\\n\'')
  tpl = '  var tpl = ""\n  with (obj || {}) {\n  ' + tpl + '\n  }\n  return tpl'
  return new Function('obj', 'escape', tpl)
}

var render = function(complie, data) {
	console.log('---------- Constructors ----------')
	console.log(complie.toString())
	console.log('---------- Operation function ----------')
	return complie(data)
}

var tpl = [
  '<%  if (obj.user) {  %>',
    '<h2><%=user.name%></h2>',
  '<%  } else {  %>',
    '<h2> Anonymous users </h2>',
  '<%  }  %>'].join('\n')

console.log('---------- Templates ----------')
console.log(tpl)
console.log(render(complie(tpl), {user: {name: 'Jackson Tian'}}))
//console.log('\n\n')
//console.log(render(complie(tpl), {}))

Abnormal information

TypeError: escape is not a function
    at eval (eval at complie (F:\workspace\javascript workspace\plNode\prj8_5_4_2\src\template4.js:27:10), <anonymous>:7:21)
    at render (F:\workspace\javascript workspace\plNode\prj8_5_4_2\src\template4.js:34:9)
    at Object.<anonymous> (F:\workspace\javascript workspace\plNode\prj8_5_4_2\src\template4.js:49:13)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:12)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
    at internal/main/run_main_module.js:17:47

The analysis reason

  • escape It's not a function , because return new Function(‘obj’, ‘escape’, tpl) In the sentence ‘escape’ Is the function ,complie(data, escape) When calling, you need to pass escape function , Otherwise I can't find it escape function

resolvent

Method 1
  • Invocation time , Pass on escape function
complie(data, escape)
Method 2
  • Call yourself , Pass on escape function
complie.call(complie, data, escape)
#  perhaps 
complie.call(this, data, escape)

Complete code

var escape = function (html) {
  return String(html)
    .replace(/&(?!\w+;)/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
}

var complie = function (str) {
	console.log(str)
  var tpl = str.replace(/<%=([\s\S]+?)%>/g, function (match, code) {
    //  escape 
    return "' + escape(" + code + ") + '"
  }).replace(/<%-([\s\S]+?)%>/g, function (match, code) {
    //  Normal output 
    return "' + " + code + " + '"
  }).replace(/<%([\s\S]+?)%>/g, function (match, code) {
    return "';\n" + code + "\n    tpl += '"
  }).replace(/\'\n/g, '\'')
  .replace(/\n\'/gm, '\'')

  console.log('---------- Code replacement template ----------')
  console.log(tpl)
  tpl = "tpl = '" + tpl + "'"
  tpl = tpl.replace(/''/g, '\'\\n\'')
  tpl = '  var tpl = ""\n  with (obj || {}) {\n  ' + tpl + '\n  }\n  return tpl'
  return new Function('obj', 'escape', tpl)
}

var render = function(complie, data) {
	console.log('---------- Constructors ----------')
	console.log(complie.toString())
	console.log('---------- Operation function ----------')
	return complie(data, escape)
	//  Equivalent to 
	//return complie.call(this, data, escape)
}

var tpl = [
  '<%  if (obj.user) {  %>',
    '<h2><%=user.name%></h2>',
  '<%  } else {  %>',
    '<h2> Anonymous users </h2>',
  '<%  }  %>'].join('\n')

console.log('---------- Templates ----------')
console.log(tpl)
console.log(render(complie(tpl), {user: {name: 'Jackson Tian'}}))
//console.log('\n\n')
//console.log(render(complie(tpl), {}))
原网站

版权声明
本文为[xzlAwin]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060405386352.html