как бороться с посторонними пробелами в шаблонных литералах - PullRequest
0 голосов
/ 02 мая 2020

Как вы обрабатываете многострочную сгенерированную на основе литералов строку, чтобы исключить все пробелы, создаваемые после любого / всего JS отступа кода.

Я использовал замену регулярных выражений, чтобы избавиться от начального пробела в моей первой тестовой строке. Но что, если строка будет HTML, которая имеет структуру отступа, которую я хотел бы сохранить.

//problem: includes a lot of white space


    if(true){
        const aString = `This string
                        is multiline
                        and indented to match
                        the surrounding 
                        JS code`
        console.log(aString)
    }


//what I have tried

    if(true){
        const aString = `This string
                        is multiline
                        and indented to match
                        the surrounding 
                        JS code`
        
        const newString = aString.replace(/\n[ \t]+/g, " \n")
        console.log(newString)
    }
    
//but what about this

    if(true){
        const aString = `<div class="hello">
                            <div class="inner">
                               <span>Some text</span>
                            </div>
                         </div>`
        
        const newString = aString.replace(/\n[ \t]+/g, " \n")
        console.log(newString)
    }

Я хотел бы напечатать:

<div class="hello">
   <div class="inner">
      <span>Some text</span>
   </div>
</div>

, а не:

<div class="hello">
<div class="inner">
<span>Some text</span>
</div>
</div>

1 Ответ

3 голосов
/ 02 мая 2020

В пакете common-tags есть тег stripIndent, который делает это для вас. Однако для этого нужно начать строку во второй строке:

const aString = stripIndent`
                            <div class="hello">
                              <div class="inner">
                                <span>Some text</span>
                              </div>
                            </div>
`;

, как правило, это невозможно сделать с помощью простого регулярного выражения. Что вам нужно сделать, это подсчитать количество пробелов перед каждой строкой и выяснить наименьшее количество пробелов. Затем удалите именно эти.

Вот простая реализация:

function removeIndent(str) {
  const lines = str.split('\n');
  if(lines[0] !== '' || lines[lines.length - 1] !== '') {
    return str;
  }
  lines.shift();
  lines.pop();
  
  const lens = lines.map(l => l.match(/ */)[0].length)
  const minLen = Math.min(...lens);
  return '\n' + lines.map(l => l.substr(minLen)).join('\n') + '\n';
}

const inStr = `
   foo
     bar
   baz
`;

const outStr = removeIndent(inStr);

console.log(inStr);
console.log(outStr);
...