1

Krasimir によって構築された完璧なJavaScript テンプレート エンジンを見つけました。まさに私が必要としていたものです。
テンプレート エンジンはうまく機能しますが、当然のことながら、それを少しハッキングして、いくつかの機能を追加したいという衝動を抑えることができませんでした。
残念ながら、一部のコードを理解するのに問題があります。

コードは次のとおりです。

var TemplateEngine = function(html, options) {
  var re = /<%([^%>]+)?%>/g,
    reExp = /(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g,
    code = 'var r=[];\n',
    cursor = 0,
    match;
  var add = function(line, js) {
    /* --begin problem  */
    js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
    /* --end problem    */
    return add;
  };
  while (match = re.exec(html)) {
    add(html.slice(cursor, match.index))(match[1], true);
    cursor = match.index + match[0].length;
  }
  add(html.substr(cursor, html.length - cursor));
  code += 'return r.join("");';
  return new Function(code.replace(/[\r\t\n]/g, '')).apply(options);
};

ここに私が理解できない行があります:

js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');



私はJavaScriptを初めて使用するわけではありませんが、これは奇妙に見えるコードであり、私が知っていることから、左手代入のない三項演算子です(間違っている場合は修正してください)。三項演算子を条件文に変換しようとしました。

これは私がこれまでに持っているものです:

if(js) {
  if(code += line.match(reExp)) {
    line += '\n';
  } else {
    line += 'r.push(' + line + ');\n';
  }
} else {
  if(code += line !== '') {
    line += 'r.push("' + line.replace(/"/g, '\\"') + '");\n';
  } else {
    line += "";
  }
}

これは失敗し、「Uncaught SyntaxError: Unexpected token if」というエラーがスローされました

このコードを条件付きステートメントに変換するのを手伝ってくれる人はいますか? また、コードが何をするかについて説明してくれますか?

また、好奇心から、IE8 がこのコードをサポートしているかどうか教えてもらえますか?
注: IE8 のサポートは気にしません。このテンプレート エンジンが IE8 をサポートしているかどうかを知りたいだけです。

Krasimir のWeb サイトまたは Krasimir のGithubでテンプレート エンジンを見つけることができます。

4

3 に答える 3

1

コードに追加する必要がある行にコードを追加することは想定されていません。これを試してください:

if (js && type(js) !== "undefined") {
  if (line.match(reExp)) {
    code += line;
  } else {
    code += "r.push(" + line + ");";
  }
} else if (line !== "") {
  code = code + "r.push(\"" + line.replace(/"/g, '\\"') + "\");";
}
于 2016-04-04T08:48:18.983 に答える
0

三項演算子?:は JavaScript でも C と同じように機能します。この場合、式を次のようにフォーマットできます。

js? (code += (line.match(reExp)? line + '\n' : 'r.push(' + line + ');\n')
  : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');

if-else ブロックのように見えます。の値に応じて、式全体が 2 つの複合代入式のいずれかに評価されますjs。この式の値は無視されますが、それでも副作用を得ることができます。の代わりにこれを書くことを選んだだけですif (js) { code += ...; } else { code += ...; }

于 2016-03-28T20:58:26.347 に答える