Mi dispiace scrivere una risposta separata per una semplice estensione alla risposta di @NateFerrero , ma non credo che la modifica della sua risposta sia appropriata, quindi per favore vota @NateFerrero se questa risposta ti è stata utile.
tl; dr: per coloro che desiderano utilizzare i commenti di blocco all'interno del proprio heredoc ...
Ho principalmente bisogno di heredoc Javascript per memorizzare un blocco di CSS, ad es
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;
}
*/});
Come puoi vedere però, mi piace commentare il mio CSS, e purtroppo (come accennato dall'evidenziazione della sintassi) il primo */
conclude il commento generale, rompendo l'heredoc.
Per questo scopo specifico (CSS), la mia soluzione alternativa era aggiungere
.replace(/(\/\*[\s\S]*?\*) \//g, '$1/')
alla catena all'interno di @ NateFerrero's heredoc
; in forma completa:
function heredoc (f) {
return f.toString().match(/\/\*\s*([\s\S]*?)\s*\*\//m)[1].replace(/(\/\*[\s\S]*?\*) \//g, '$1/');
};
e usalo aggiungendo uno spazio tra *
e /
per i commenti di blocco "interni", in questo modo:
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;
}
*/});
Il replace
semplicemente trova /* ... * /
e rimuove lo spazio per fare /* ... */
, preservando così l'eredoc fino al momento della chiamata.
Ovviamente puoi rimuovere completamente i commenti usando
.replace(/\/\*[\s\S]*?\* \//g, '')
Puoi anche supportare i //
commenti se li aggiungi alla catena:
.replace(/^\s*\/\/.*$/mg, '')
Inoltre, puoi fare qualcosa di diverso dal singolo spazio tra *
e /
, come -
:
/**
* Nuke rounded corners.
*-/
se aggiorni la regex in modo appropriato:
.replace(/(\/\*[\s\S]*?\*)-\//g, '$1/')
^
O forse desideri una quantità arbitraria di spazi bianchi invece di un singolo spazio?
.replace(/(\/\*[\s\S]*?\*)\s+\//g, '$1/')
^^^