Sinto-me mal por escrever uma resposta separada meramente como uma extensão da resposta de @NateFerrero , mas também não acho que editar a resposta dele seja apropriado, portanto, vote positivamente em @NateFerrero se esta resposta foi útil para você.
tl; dr — Para aqueles que desejam usar comentários em bloco dentro de seu heredoc ...
Eu precisava principalmente de heredocs Javascript para armazenar um bloco de CSS, por exemplo
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;
}
*/});
Como você pode ver, no entanto, gosto de comentar meu CSS e, infelizmente (conforme sugerido pelo realce de sintaxe), o primeiro */
finaliza o comentário geral, quebrando o heredoc.
Para este propósito específico (CSS), minha solução alternativa foi adicionar
.replace(/(\/\*[\s\S]*?\*) \//g, '$1/')
à corrente dentro de @NateFerrero's heredoc
; na forma completa:
function heredoc (f) {
return f.toString().match(/\/\*\s*([\s\S]*?)\s*\*\//m)[1].replace(/(\/\*[\s\S]*?\*) \//g, '$1/');
};
e use-o adicionando um espaço entre *
e /
para comentários de bloco "internos", como:
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;
}
*/});
O replace
simplesmente localiza /* ... * /
e remove o espaço para fazer /* ... */
, preservando assim o heredoc até ser chamado.
Você pode, é claro, remover todos os comentários usando
.replace(/\/\*[\s\S]*?\* \//g, '')
Você também pode oferecer suporte a //
comentários se adicioná-los à rede:
.replace(/^\s*\/\/.*$/mg, '')
Além disso, você pode fazer algo diferente do único espaço entre *
e /
, como -
:
/**
* Nuke rounded corners.
*-/
se você apenas atualizar o regex apropriadamente:
.replace(/(\/\*[\s\S]*?\*)-\//g, '$1/')
^
Ou talvez você queira uma quantidade arbitrária de espaços em branco em vez de um único espaço?
.replace(/(\/\*[\s\S]*?\*)\s+\//g, '$1/')
^^^