2016-03-25 17 views
1

Bei Verwendung von Vorlagenliteralen bemerkte ich ein Problem mit Tabellenformaten.Template Literal Interpolation bricht Whitespace-Tabelle

Wenn so etwas wie dies zu tun:

var hello = 'Hello', 
    bye = 'Goodbye'; 
console.log(` 
    ${hello} World 
    ${bye}  World 
`); 

Da der {bye} Teil vier Buchstaben kurz von ‚Auf Wiedersehen‘ ist die Zeichenfolge druckt wie:

Hello World 
    Goodbye  World 

Dies wird noch komplizierter für Interpolationen von Arrays oder Objekten.

Ich frage mich, ob jemand einen Weg gefunden hat, mit dieser Art von Problem umzugehen. Die Tabellenformatierung für eine Zeichenfolge kann während der Interpolation beibehalten werden.


Angenommen, ein Template-Tag verwendet Zeichenfolgen und Arrays. Die Arrays sind mit Leerzeichen zwischen Wörtern verkettet.

var hello = 'Hello', 
    bye = 'Goodbye', 
    phrase = ['I', 'like']; 

console.log(someTag` 
    ${hello}   World 
    ${bye}   World 
    Some things I like: 
    ${phrase}  sunsets. 
    ${['I', 'like']} candy. 
`); 

Gerade falls Sie dem Array eckige Klammer können nicht sagen, Zitaten, Dollar, geschweifte Klammer, und so weiter Zählung in Richtung der Länge der Saite (visuell) vor der Interpolation. Leerzeichen zwischen Wörtern zählen nach der Interpolation zur Zeichenfolgenlänge. Die Einzüge werden durch den Verlust der zusätzlichen Zeichen und das Hinzufügen von Zeichen während der Tag-Verarbeitung bewirkt.

Diese Frage hat eine akzeptierte Antwort, aber ich würde gerne mehr Diskussion sehen. Es kann mehr als eine Antwort auf dieses Problem geben.

+0

Wie werden Sie diese Strings ohne Vorlage lösen? – thefourtheye

+0

Sehr lustig. Es gibt Tabellenformatierer und Padder für diese Art von Dingen, aber ich habe nicht das gleiche Problem mit Template-Strings erwartet, die dafür bekannt sind, dass sie zu weißem Leerzeichen passen. Was ist, wenn die Einfügungen von einer anderen Tag-Funktion benötigt werden und ein Tabellenformatierer/Padder nur eine Zeichenkette erzeugt. Ja, das Problem wurde anderswo gelöst, aber es ist ein völlig neues Problem für diese Vorlagenliterale. Ich nehme an, die andere Option ist einfach nicht, sie für diese Art von Sache zu verwenden. –

+0

Template-Literale tun standardmäßig nichts mit Whitespaces, sie verhalten sich im Wesentlichen wie Strings mit Interpolation. Wenn Sie ein erweitertes Verhalten wünschen, müssen Sie ein getaggtes Vorlagenliteral verwenden, um die gewünschte Konvertierung durchzuführen. – loganfsmyth

Antwort

1

können Sie Registerkarten für die unterschiedlichen Länge der Wörter zu kompensieren:

const hello = 'Hello'; 
 
const bye = 'Goodbye'; 
 
const str = ` 
 
    ${hello}\t World 
 
    ${bye}\t World 
 
`; 
 

 
console.log(str); 
 
document.getElementById('demo').innerText = str;
<pre id="demo"></pre>

+0

Das ist eine einfache Lösung. Vielen Dank. Was passiert, wenn der Einzug unbekannt ist (Leerzeichen statt), wie er an eine Bibliothek weitergegeben wird? Manchmal ist eine Registerkarte visuell 4 Leerzeichen und manchmal 8 vielleicht 2. Das könnte auch stören, wenn ein Ersetzen von Leerzeichen mit Tabs versucht wird. Ich vermute, dass ein Fehler ausgelöst werden kann, wenn keine Tabulatorzeichen vorhanden sind, aber ich hoffe auf eine Lösung für das unbekannte Leerraumproblem. –

+0

Sie können eine Registerkarte und mehrere Leerzeichen kombinieren. Die Registerkarte wird die Lücke zwischen den verschiedenen Längen der Zeichenfolge und die Leerzeichen die angeforderte Auffüllung überbrücken. Es wird nicht perfekt sein, aber es wird nahe sein, was Sie brauchen. –

+0

Es gibt mehrere kleine Verbesserungen, die funktionieren, solange Sie wissen, dass die Zeichenfolge immer gleich ist (die Hilfeausgabe ist normalerweise). Wünscht mir, dass es etwas wie HTML, aber für die Befehlszeile gibt. –