127 votes

Javascript heredoc

J'ai besoin de quelque chose comme heredoc en JavaScript. Avez-vous des idées pour cela? J'ai besoin de fonctionnalités multi-navigateurs.

J'ai trouvé ça:

 heredoc = '\
<div>\
    <ul>\
        <li><a href="#zzz">zzz</a></li>\
    </ul>\
</div>';
 

Je pense que cela fonctionnera pour moi. :)

64voto

Andrew Hare Points 159332

Non, malheureusement, JavaScript ne supporte rien comme heredoc.

40voto

Zv_oDD Points 421

Que dis-tu de ça:

 function MyHereDoc(){
/*HERE
<div>
   <p>
      This is written in the HEREDOC, notice the multilines :D.
   </p>
   <p>
      HERE
   </p>
   <p>
      And Here
   </p>
</div>
HERE*/
    var here = "HERE";
    var reobj = new RegExp("/\\*"+here+"\\n[\\s\\S]*?\\n"+here+"\\*/", "m");
    str = reobj.exec(MyHereDoc).toString();
    str = str.replace(new RegExp("/\\*"+here+"\\n",'m'),'').toString();
    return str.replace(new RegExp("\\n"+here+"\\*/",'m'),'').toString();
}

//Usage 
document.write(MyHereDoc());
 

Il suffit de remplacer "/ * ICI" et "ICI * /" par le mot de votre choix.

36voto

Nate Ferrero Points 166

Bâtiment sur Zv_oDD réponse, j'ai créé une fonction similaire pour en faciliter la réutilisation.

Avertissement: Ceci est un non-standard disposent de beaucoup de JS interprètes, et sera probablement retiré à un certain point, mais comme je suis en train de construire un script pour être utilisés seulement dans Chrome, je suis à l'aide! Ne jamais compter sur ce, pour le client face à des sites web!

// Multiline Function String - Nate Ferrero - Public Domain
function heredoc (f) {
    return f.toString().match(/\/\*\s*([\s\S]*?)\s*\*\//m)[1];
};

Utilisation:

var txt = heredoc(function(){/*
A test of horrible
Multi-line strings!
*/});

Retourne:

"A test of horrible
Multi-line strings!"

Notes:

  1. Le texte est équilibré sur les deux extrémités, de sorte que toute les espaces superflus sur l'une des extrémités est OK.

Modifications:

2/2/2014 - modifié pour ne plaisante pas avec le prototype de Fonction à tous et à utiliser le nom heredoc à la place.

20voto

Dave Stewart Points 460

Selon le type de moteur JS / JS que vous utilisez (SpiderMonkey, AS3), vous pouvez simplement écrire du code XML en ligne dans lequel vous pouvez placer du texte sur plusieurs lignes, comme heredoc:

 var xml = <xml>
    Here 
    is 
    some 
    multiline 
    text!
</xml>

console.log(xml.toXMLString())
console.log(xml.toString()) // just gets the content
 

9voto

Andrew Cheong Points 11331

Je me sens mal écrit une réponse distincte pour seulement une extension de @NateFerrero de la réponse, mais je ne ressens pas l'édition de sa réponse est appropriée, veuillez donc upvote @NateFerrero si cette réponse a été utile pour vous.

tl;dr-Pour ceux qui souhaitent utiliser le bloc de commentaires à l'intérieur de leur heredoc...

J'ai surtout besoin de Javascript heredocs pour stocker un bloc de CSS, par exemple

var css = heredoc(function() {/*
    /**
     * Nuke rounded corners.
     */
    body div {
        border-top-left-radius: 0 !important;
        border-top-right-radius: 0 !important;
        border-bottom-right-radius: 0 !important;
        border-bottom-left-radius: 0 !important;
    }
*/});

Comme vous pouvez le voir, cependant, je tiens à commenter mon CSS, et malheureusement (comme évoqué par la coloration syntaxique) de la première */ se termine le commentaire général, la rupture de la heredoc.


Pour ce but précis (CSS), ma solution est d'ajouter

.replace(/(\/\*[\s\S]*?\*) \//g, '$1/')

de la chaîne à l'intérieur de @NateFerrero de l' heredoc; en remplir le formulaire:

function heredoc (f) {
    return f.toString().match(/\/\*\s*([\s\S]*?)\s*\*\//m)[1].replace(/(\/\*[\s\S]*?\*) \//g, '$1/');
};

et de l'utiliser par l'ajout d'un espace entre l' * et / pour les "intérieure" bloquer les commentaires, comme suit:

var css = heredoc(function() {/*
    /**
     * Nuke rounded corners.
     * /
    body div {
        border-top-left-radius: 0 !important;
        border-top-right-radius: 0 !important;
        border-bottom-right-radius: 0 !important;
        border-bottom-left-radius: 0 !important;
    }
*/});

L' replace trouve tout simplement /* ... * / et supprime l'espace pour faire /* ... */, ce qui permet de préserver la heredoc jusqu'appelé.


Vous pouvez bien sûr supprimer les commentaires complètement à l'aide de

.replace(/\/\*[\s\S]*?\* \//g, '')

Vous pouvez également appuyer // commentaires si vous les ajoutez à la chaîne:

.replace(/^\s*\/\/.*$/mg, '')

Aussi, vous pouvez faire autre chose que de la simple espace entre * et /, comme un -:

    /**
     * Nuke rounded corners.
     *-/

si vous venez de mettre à jour les regex de façon appropriée:

.replace(/(\/\*[\s\S]*?\*)-\//g, '$1/')
                          ^

Ou peut être voulez-vous une quantité arbitraire d'espaces au lieu d'un seul espace?

.replace(/(\/\*[\s\S]*?\*)\s+\//g, '$1/')
                          ^^^

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X