0

ich die perfekt JavaScript-Template-Engine, gebaut von Krasimir gefunden habe, es ist genau das, was ich brauchte.
Die Templating-Engine funktioniert super, aber natürlich konnte ich dem Drang nicht widerstehen, ein bisschen zu hacken und vielleicht sogar ein paar Features hinzuzufügen.
Leider habe ich Probleme, etwas von dem Code zu verstehen. Hier
JavaScript Template-Engine - Konvertieren linke ternäre (ohne Zuordnung) in bedingte Anweisung (en)

ist der Code:

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); 
}; 

Hier ist die Linie, die ich nicht verstehe:

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

ich JavaScript nicht neu bin, aber das ist etwas seltsam aussehende Code und von dem, was Ich weiß, dass es ein ternärer Operator ohne eine linke Hand ist (korrigiere mich, wenn ich falsch liege)

Also, um ein besseres Verständnis zu bekommen, was der Autor tat, habe ich versucht, das zu konvertieren ternärer Operator in bedingte Anweisungen.

Dies ist, was ich bisher:

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 += ""; 
    } 
} 

Dies scheiterte und warf den Fehler „Nicht abgefangene Syntaxerror: unerwartetes Token, wenn“

mir jemand diesen Code in bedingten Anweisungen Kann helfen, konvertieren und vielleicht sogar gib mir eine Erklärung, was der Code tut?

Auch aus Neugier könnte mir jemand sagen, ob IE8 diesen Code unterstützt?
HINWEIS: Ich habe keine Bedenken IE8-Unterstützung Ich möchte nur wissen, ob diese Templating-Engine IE8 unterstützt.

Sie können die Template-Engine auf Krasimir finden Website oder Krasimir der Github

+1

Ihr alternativer Code weist keinen Syntaxfehler auf. Wenn Sie diesen Fehler bekommen, kommt er von woanders her. – Pointy

+0

@Pointy Ja, das ist, was ich dachte, und ich bin auch 100% positiv, dass der Template-Code auch keinen Syntaxfehler hat, weil ich den gleichen Code aus dem Beispiel verwendet habe, vielleicht habe ich etwas falsch in der Aussage bekommen? –

Antwort

0

Ich weiß, dass diese Frage nicht viel Aufmerksamkeit bekommen hat, aber ich dachte, ich würde diese Antwort trotzdem in der Hoffnung posten, dass es jemanden helfen würde, der mit diesem Problem konfrontiert ist.
Mit etwas Mühe und einem Tonne Hilfe von JSHint Ich habe die Lösung für meine Frage gefunden.
Ich habe die aktuelle kompilierte Zeile an die Variable "line" angehängt und nicht an die Variable "code".
Dies führte mit der „Linie“ Variable die letzte Zeile der Vorlage und den Rest des kompilierten Code enthalten, was bedeutet, dass der „Code“ Variable keinen Code hatte: D und war dafür gleichwertig null.Hier

ist der Code, den ich hatte, bevor ich herausgefunden, was ich falsch mache:

var add = function(line, js) { 
    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 += ""; 
    } 
    } 
}; 

Nach dem Ersetzen der „Linie“ Variable mit dem „Code“ Variable hier und da und machte ein paar Optimierungen hier Antwort ist die abschließende Bearbeitung:

var add = function(line, js) { 
    if(js && typeof js !== "undefined") { 
    if(line.match(reExp)) { 
     code += line; 
    } else { 
     code += "r.push(" + line + ");"; 
    } 
    } else if(line !== "") { 
    code += "r.push(\"" + line.replace(/"/g, '\\"') + "\");"; 
    } 
}; 
0

Der ternäre Operator ?: Werke in JavaScript wie in C. In diesem Fall können wir den Ausdruck formatiert als

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

und Es sieht genauso aus wie ein if-else-Block. Der gesamte Ausdruck wird in Abhängigkeit von dem Wert js zu einem von zwei zusammengesetzten Zuweisungsausdrücken ausgewertet. Der Wert dieses Ausdrucks wird ignoriert, aber wir können immer noch Nebenwirkungen daraus bekommen. Der Autor entschied sich einfach, dies anstelle von if (js) { code += ...; } else { code += ...; } zu schreiben.

+0

Evelyn, es scheint, das Plakat der ursprünglichen Antwort wurde verboten, so habe ich Ihre Antwort akzeptiert, der rep muss zu jemandem gehen :) Nochmals vielen Dank für die Antwort, Prost. –

1

Sie sind nicht anhängen Code soll man Code anhängen Linie müssen, versuchen Sie dies:

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, '\\"') + "\");"; 
}