web-dev-qa-db-ja.com

インデントを解除しない複数行の文字列

このディスカッションの説明 によると、ECMAScript 6では、文字列の後続の行を行の先頭に配置する必要なく、複数行の文字列を定義できます。

Allen Wirfs-Brockの投稿 にはコード例が含まれています。

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`;

誰かがこれをどのように達成できるか説明できますか?インデントに使用されている空白を削除するために、このdontIndentを定義する方法は?

36
Šime Vidas

2016の回答dedent-jsパッケージ がこれを処理します。 dedent-jsパッケージは実際にはタブとスペースの両方で機能します。dedentは別のパッケージであり、タブでは失敗します。

var dedent = require('dedent-js');

var text = dedent(`
  <div>
    <span>OK</span>
    <div>
      <div></div>
    </div>
  </div>
`);

各行の先頭の空白と先頭の改行を削除します。また、ユーザー数が多く、課題追跡があり、スタックオーバーフローからのコピー貼り付けよりも簡単に更新できます。

16
mikemaccana

この機能は、カスタム関数を定義してタグとして使用することで実装されます(上記のdontIndent)。コードブローは 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);
}

私はFirefox Nightlyでそれをうまくテストしました:

enter image description here

15
Šime Vidas

ダブルスペースの文字列置換を行うこともできます(インデントでタブではなくスペースを使用するとします)。もちろん、実際の文字列内の二重スペースは削除されますが、ほとんどの場合これで問題ありません。

const MSG = (`Line 1
          line 2
          line 3`).replace(/  +/g, '');
// outputs
/*
Line 1
line 2
line 3
*/
3
Jim Doyle