2014-09-18 5 views
21

В соответствии с this esdiscuss discussion в ECMAScript 6 можно определить многострочные строки без необходимости размещения последующих строк строки в самом начале строки.Многострочные строки, которые не прерывают отступ

Allen Wirfs-Brock’s post содержит пример кода:

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, чтобы удалить пробелы, используемые для отступов?

+2

Для этого в настоящее время существует несколько модулей для npm, большинство из которых можно найти через [поиск по ключевому слову для «разделителя»] (https://www.npmjs.com/browse/keyword/dedent) – Nickolay

ответ

13

Эта функция реализована путем определения пользовательской функции, а затем ее использования в качестве тега (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

11

2016 ответ: dedent-js package будет обрабатывать это. Обратите внимание, что «dedent-JS» пакет на самом деле работает как с закладками и пространством, «dedent» терпит неудачу на закладках:

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

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

будет вырезать исходящие пробела в каждой строке и ведущий возврат каретки. Он также имеет больше пользователей, отслеживает проблему и более легко обновляется, чем copypasting из Stack Overflow!

+1

Это прекрасно работает, спасибо вы –