问题
According to this esdiscuss discussion, it is possible in ECMAScript 6 to define multiline strings without having to place subsequent lines of the string at the very beginning of the line.
Allen Wirfs-Brock’s post contains a code example:
var a = dontIndent
`This is a template string.
Even though each line is indented to keep the
code neat and tidy, the white space used to indent
is not in the resulting string`;
Could someone explain how this can be achieved? How to define this dontIndent
thing in order to remove the whitespace used for indentation?
回答1:
This feature is implemented by defining a custom function and then using it as a tag (dontIndent
above). The code blow is from Zenparsing's gist:
function dedent(callSite, ...args) {
function format(str) {
let size = -1;
return str.replace(/\n(\s+)/g, (m, m1) => {
if (size < 0)
size = m1.replace(/\t/g, " ").length;
return "\n" + m1.slice(Math.min(m1.length, size));
});
}
if (typeof callSite === "string")
return format(callSite);
if (typeof callSite === "function")
return (...args) => format(callSite(...args));
let output = callSite
.slice(0, args.length + 1)
.map((text, i) => (i === 0 ? "" : args[i - 1]) + text)
.join("");
return format(output);
}
I've successfully tested it in Firefox Nightly:
回答2:
2016 answer: the dedent-js package will handle this. Note the dedent-js
package actually works with both tabs and spaces, dedent
is a separate package and fails on tabs:
var dedent = require('dedent-js');
var text = dedent(`
<div>
<span>OK</span>
<div>
<div></div>
</div>
</div>
`);
Will strip out the proceeding whitespace on each line and the leading carriage return. It also has more users, an issue tracker, and is more easily updated than copypasting from Stack Overflow!
回答3:
You can also just do a string replace for double spaces (assuming your indentation uses spaces, not tabs). Obviously any double spaces in your actual string would be removed, but for most cases this should be ok.
const MSG = (`Line 1
line 2
line 3`).replace(/ +/g, '');
// outputs
/*
Line 1
line 2
line 3
*/
来源:https://stackoverflow.com/questions/25924057/multiline-strings-that-dont-break-indentation