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!"
笔记:
- 文本在两端都被修剪,所以任何一端的空白都可以。
编辑:
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)