2009-10-04 9 views
3

J'écris un compilateur markdown dans Erlang pour l'utilisation côté serveur. Puisqu'il aura besoin de travailler avec des clients, j'ai décidé d'adopter la bibliothèque côté client (showdown.js) comme spécification, puis de tester la compatibilité de mon code avec celle-ci.Markdown et l'échappement des sauts de ligne Javascript

Dans les deux premières itérations, j'ai construit des tests unitaires 260 impairs qui a vérifié que mon programme produit sortie qui est compatible avec ce que je pensais était valide démarquage basée sur la lecture du syntax notes. Mais maintenant j'essaye d'écrire un programme javascript pour générer mes tests unitaires.

J'ai une entrée comme:

"3 > 4\na" 

Je veux courir « épreuve de force » sur elle pour obtenir:

"<p>3 &gt; 4\na</p>" 

et je veux point cette place dans une affirmation de EUnit:

"?_assert(conv(\"3 > 4\na\") == \"<p>3 &gt; 4\na</p>\"),", 

qui est la syntaxe Erlang valide pour le test unitaire. Pour rendre la vie facile, et pour rendre portable le générateur de tests unitaires, je le fais dans une page web, en ajoutant des lignes à un fichier javascript et en visualisant la page, vous obtenez le nouvel ensemble de tests unitaires dans un <textarea /> copier dans le module pour exécuter EUnit.

Le problème est que je ne peux pas obtenir la ligne des pauses pour convertir en \n dans la chaîne, donc je finis avec:

"?_assert(conv(\"3 > 4 
a\") == \"<p>3 &gt; 4 
a</p>\"),", 

J'ai essayé de convertir les sauts de ligne à leurs versions échappées en utilisant le code comme :

text.replace("\\", "\\\\"); 
text.replace("\n", "\\n"); 

mais pas de joie ...

+0

Pouvez-vous utiliser l'entité de caractère pour backslash: \ – bobbymcr

+0

Pouvez-vous modifier ce script à vos besoins? http://attacklab.net/showdown/ – Zed

+0

Zed - nous utilisons showdown comme le script qui génère les tests unitaires - le problème était juste d'échapper à la sortie de showdown .. –

Répondre

2

Tom McNulty m'a aidé et a fait remarquer que mes regex étaient super de pantalons, en particulier, je n'utilisais pas la g drapeau MONDIALES :(

Le code de travail est:

var converter; 
var text = ""; 
var item; 
var input; 
var output; 
var head; 
var tail; 
converter = new Attacklab.showdown.converter(); 
item = document.getElementById("tests"); 
for (var test in tests) { 
    input = tests[test].replace(/[\n\r]+/gi,"\\n"); 
    input = input.replace(/[\"]+/gi, "\\\""); 
    output = converter.makeHtml(tests[test]).replace(/[\n\r]+/gi, "\\n"); 
    output = output.replace(/[\"]+/gi, "\\\""); 
    text += "  ?_assert(conv(\"" + input + "\") == \"" + output + "\"),\n"; 
}; 
head = "unit_test_() -> \n [\n"; 
tail = "\n ]."; 
text = text.slice(0, text.length - 2); 
item.value = head + text + tail; 
Questions connexes