2014-09-18 12 views
21

In base a this esdiscuss discussion, è possibile in ECMAScript 6 definire stringhe multiline senza dover posizionare le righe successive della stringa all'inizio della riga.Stringhe multilinea che non si rompono indentazione

Allen Wirfs-Brock’s post contiene un esempio di codice:

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

Qualcuno potrebbe spiegare come questo può essere realizzato? Come definire questa cosa dontIndent al fine di rimuovere lo spazio bianco utilizzato per il rientro?

+2

Ora ci sono più moduli su npm per questo, la maggior parte può essere trovata tramite [ricerca per parole chiave per "deduzione"] (https://www.npmjs.com/browse/keyword/dedent) – Nickolay

risposta

13

Questa funzione viene implementata definendo una funzione personalizzata e quindi utilizzandola come tag (dontIndent sopra). Il colpo codice è da 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); 
} 

ho testato con successo in Firefox Nightly:

enter image description here

11

2016 risposta: il dedent-js package sarà gestire questa situazione. Nota il pacchetto 'dedent-js' effettivamente funziona con entrambe le schede e gli spazi, 'dedent' fallisce su schede:

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

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

eliminerà gli spazi procedimento in ciascuna riga e il ritorno del carrello principale. Ha anche più utenti, un tracker di problemi ed è più facilmente aggiornato rispetto a copypasting da Stack Overflow!

+1

Che funziona magnificamente, grazie tu –