Javascript heredoc

我需要JavaScript中的heredoc之类的东西。 你有什么想法吗? 我需要跨浏览器function。

我find了这个:

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

我认为这对我有用。 🙂

不,不幸的是,JavaScript不支持像heredoc这样的东西。

这个怎么样:

 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()); 

只要用select的字replace“/ *这里”和“这里* /”。

尝试ES6的string模板 ,你可以做类似的事情

 var hereDoc = ` This is a Multiple Line String `.trim() hereDoc == 'This\nis\na\nMultiply\nLine\nString' => true 

你现在可以用6to5或TypeScript来使用这个强大的function

基于Zv_oDD的回答,我创build了一个类似的函数,以便于重用。

警告:这是许多JS解释器的非标准function,可能会在某些时候被删除,但是由于我构build的脚本只能在Chrome中使用,因此我正在使用它! 永远不要依靠这个面向客户的网站!

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

使用:

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

返回:

 "A test of horrible Multi-line strings!" 

笔记:

  1. 文本在两端都被修剪,所以任何一端的空白都可以。

编辑:

2014年2月2日 – 改为不要乱用函数原型,而改为使用名称heredoc。

2017/5/26 – 更新空白以反映现代编码标准。

根据您运行的JS / JS引擎的风格(SpiderMonkey,AS3),您可以简单地编写内联XML,您可以在其中将文本放在多行上,如heredoc:

 var xml = <xml> Here is some multiline text! </xml> console.log(xml.toXMLString()) console.log(xml.toString()) // just gets the content 

我感觉不好,写一个单独的答案只是扩展到@ NateFerrero的答案 ,但我不觉得编辑他的答案是合适的,所以请upvote @NateFerrero如果这个答案对你有用。

tl; dr-对于那些希望 heredoc中使用块注释的人…

我主要需要Javascript heredocs来存储一个CSS块, 例如

 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; } */}); 

然而正如你所看到的,我喜欢评论我的CSS,不幸的是(如语法突出显示)第一个*/结束整体评论,打破heredoc。


为了这个特定的目的(CSS),我的解决方法是添加

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

到@NateFerrero的heredoc里面的链子里; 完整的forms:

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

并通过在*/ for“内部”块注释之间添加空格来使用它,如下所示:

 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; } */}); 

replace只需find/* ... * /并删除/* ... * /的空格,从而保留heredoc直到被调用。


你当然可以使用完全删除注释

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

如果您将其添加到链中,您也可以支持//注释:

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

另外,除了*/之间的单个空格之外,您可以执行其他操作,例如-

  /** * Nuke rounded corners. *-/ 

如果你只是适当地更新正则expression式:

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

或者,也许你会喜欢任意数量的空白,而不是一个单一的空间?

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

您可以使用CoffeeScript ,这是一种编译成JavaScript的语言。 代码一对一编译成等效的JS,在运行时没有解释。

当然,它有heredocs 🙂

ES6 模板string具有heredocfunction。

您可以声明由反码(“)括起来的string,并可以通过多行进行扩展。

 var str = `This is my template string... and is working across lines`; 

您也可以在模板string中包含expression式。 这些由美元符号和大括号( ${expression} )表示。

 var js = "Java Script"; var des = `Template strings can now be used in ${js} with lot of additional features`; console.log(des); //"Template strings can now be used in Java Script with lot of additional features" 

实际上有更多的function,如标签寺庙弦和原始string在里面。 请查阅文件

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings

您可以使用Sweet.jsmacros来添加它,就像Tim Disney在这篇文章中创build的一样

请注意,此方法使用反引号作为string分隔符:

 let str = macro { case {_ $template } => { var temp = #{$template}[0]; var tempString = temp.token.value.raw; letstx $newTemp = [makeValue(tempString, #{here})]; return #{$newTemp} } } str `foo bar baz` 

如果你有一些html和jQuery,并且string是有效的HTML,这可能是有用的:

 <div id="heredoc"><!--heredoc content with multiple lines, even 'quotes' or "double quotes", beware not to leave any tag open--></div> <script> var str = (function() { var div = jQuery('#heredoc'); var str = div.html(); str = str.replace(/^<\!--/, "").toString(); str = str.replace(/-->$/, "").toString(); return str; })(); </script> 

如果文本之间有注释“<! – – >”,它也可以工作,但文本的一部分可能是可见的。 这是小提琴: https : //jsfiddle.net/hr6ar152/1/

 // js heredoc - http://stackoverflow.com/a/32915549/466363 // a function with comment with eval-able string, use it just like regular string function extractFuncCommentString(func,comments) { var matches = func.toString().match(/function\s*\(\)\s*\{\s*\/\*\!?\s*([\s\S]+?)\s*\*\/\s*\}/); if (!matches) return undefined; var str=matches[1]; // i have made few flavors of comment removal add yours if you need something special, copy replacement lines from examples below, mix them if(comments===1 ) { // keep comments, in order to keep comments you need to convert /**/ to / * * / to be able to put them inside /**/ like /* / * * / */ return ( str .replace(/\/\s\*([\s\S]*?)\*\s\//g,"/*$1*/") // change / * text * / to /* text */ ) } else if(comments===2) { // keep comments and replace singleline comment to multiline comment return ( str .replace(/\/\s\*([\s\S]*?)\*\s\//g,"/*$1*/") // change / * text * / to /* text */ .replace(/\/\/(.*)/g,"/*$1*/") // change //abc to /*abc*/ ) } else if(comments===3) { // remove comments return ( str .replace(/\/\s\*([\s\S]*?)\*\s\//g,"") // match / * abc * / .replace(/\/\/(.*)/g,"") // match //abc ) } else if(comments===4) { // remove comments and trim and replace new lines with escape codes return ( str .replace(/\/\s\*([\s\S]*?)\*\s\//g,"") // match / * abc * / .replace(/\/\/(.*)/g,"") // match //abc .trim() // after removing comments trim and: .replace(/\n/g,'\\n').replace(/\r/g,'\\r') // replace new lines with escape codes. allows further eval() of the string, you put in the comment function: a quoted text but with new lines ) } else if(comments===5) { // keep comments comments and replace strings, might not suit when there are spaces or comments before and after quotes // no comments allowed before quotes of the string return ( str .replace(/\/\s\*([\s\S]*?)\*\s\//g,"/*$1*/") // change / * text * / to /* text */ .replace(/\/\/(.*)/g,"/*$1*/") // change //abc to /*abc*/ .trim() // trim space around quotes to not escape it and: .replace(/\n/g,'\\n').replace(/\r/g,'\\r') // replace new lines with escape codes. allows further eval() of the string, you put in the comment function: a quoted text but with new lines ) } else return str } 

 var week=true,b=123; var q = eval(extractFuncCommentString(function(){/*! // this is a comment 'select / * this is a multiline comment * / a ,b // this is a comment ,c from `table` where b='+b+' and monthweek="'+(week?'w':'m')+'" //+' where a=124 order by a asc ' */},4)); 

与caching: – 做一个简单的模板function,并保存function:(第二次工作快)

 var myfunction_sql1; function myfunction(week,a){ if(!myfunction_sql1) eval('myfunction_sql1=function(week,a){return ('+extractFuncCommentString(function(){/*! 'select / * this is a multiline comment * / a ,b // this is a comment ,c from `table` where b='+b+' and monthweek="'+(week?'w':'m')+'" //+' where a=124 order by a asc '*/},4)+')}'); q=myfunction_sql1(week,a); console.log(q) } myfunction(true,1234)