2016-09-17 1 views
1

Ich versuche, die Untergruppe der Markdown, die Discord unterstützt unterstützt (*, _, `, ~). Für bereits maskierte Zeichen sollten keine zusätzlichen umgekehrten Schrägstriche hinzugefügt werden. Das ist, was ich habe:Escaping Discord Teilmenge von Markdown

function escapeMarkdown(text) { 
 
\t return text.replace(/([^\\]|^|\*|_|`|~)(\*|_|`|~)/g, '$1\\$2'); 
 
} 
 

 
console.log(escapeMarkdown('*test* _string_ ~please~ `ignore` *_`~kthx \* \\~'));

Dies funktioniert gut, abzüglich der Tatsache, dass mehrere Abschlags Zeichen gegeneinander werden alle nicht entgangen sein. Ich bin nicht sicher, wie ich das erweitern soll, um das zu ermöglichen, ohne den Ausdruck absurd kompliziert zu machen.

+2

Wenn bereits ein Zeichen einen Backslash vor sich hat, die nicht unbedingt bedeutet, es ist entkommen, z '\\ '' – qxz

+0

@qxz Sie sind völlig richtig. – Gawdl3y

Antwort

1

Ich würde vorschlagen, alle bereits maskierte Zeichen URL-Kodierung, dann ist alles zu entkommen wieder:

function escapeMarkdown(text) { 
 
    var unescaped = text.replace(/\\(\*|_|`|~|\\)/g, '$1'); // unescape any "backslashed" character 
 
    var escaped = unescaped.replace(/(\*|_|`|~|\\)/g, '\\$1'); // escape *, _, `, ~, \ 
 
    return escaped; 
 
} 
 

 
var str = '*test* _string_ ~please~ `ignore` *_`~kthx \* \\~ C:\\path\\to\\file'; 
 
console.log("Original:"); 
 
console.log(str); 
 
console.log("Escaped:"); 
 
console.log(escapeMarkdown(str));

+0

Das ist eigentlich sehr nah an dem, was ich selbst erfunden habe und verwende, aber es ist nicht ohne Nebenwirkungen. Es löst das Problem existierender Doppel-Escapes bei Abschriften-Zeichen, die nicht maskiert werden, aber es eliminiert auch vollständig vorhandene Backslashes aus der Zeichenkette. Wenn die Zeichenfolge einen rohen Backslash (wie Windows-Pfade) mit \\ enthalten soll, ist sie vom Ergebnis komplett verschwunden. – Gawdl3y

+0

Editiert die erste Regex, um nur die 5 Sonderzeichen zu entzippen. – qxz