function better_text(str, custom_words = []) {
  // custom_words: array di definizioni specifiche da trattare nella forma riportata
  if(str) {
    str = str.trim();

    // punteggiatura ---- NB non mettere dopo i replace con entità HTML per conflitti con il carattere `;`
    // (?!$): negative lookahead per ignorare i caratteri a fine stringa
    str = str.replace(/ +(,|;|\.|:|!|\?)/g, '$1');
    str = str.replace(/(,|;|\.|:|!|\?)(?!$) +/g, '$1 ');

    // spazi o tabulazioni multiple
    str = str.replace(/[ |\t|\u00A0]+/g, ' ');

    //& commerciale
    // str = str.replace(/& */gm, function (match) {
    //   return match.replace(/&/g, '\u0026').replace(/ +/g, '\u00A0');
    // });

    // virgolette
    str = str.replace(/(^| )"/g, '$1\u201C') // virgolette doppie in apertura
      //.replace(/"($| |[,\.:;\!\?])/g, '\u201D$1') // virgolette doppie in chiusura
      .replace(/"/g, '\u201D') // tutte le rimanenti virgolette doppie in chiusura
      .replace(/(^| )'/g, '$1\u2018') // tutte le virgolette semplici in apertura
      .replace(/'/g, '\u2019')        // tutte le rimanenti virgolette semplici, compresi gli apostrofi
    ;

    // spazio dopo l'apostrofo preceduto da `l`, `un`, `d`, ecc...
    str = str.replace(/((^| )(l|un|d|all|dell|nell|sull)('|’)) /gi, '$1' );

    // aggiunta spazio non divisibile dopo articoli, preposizioni ecc.
    // include anche alcune parole in altre lingue

    // valori unici
    particelle.sort();
    var particelle_unique = particelle.filter( function (value, index, self) {
      return self.indexOf(value) === index;
    } );

    var re = new RegExp('\\b(' + particelle_unique.join('|') + ')\\b +', 'gmi');

    str = str.replace(re, function (match) {
      return match.replace(/ +/g, ' ');
    });
    if(custom_words.length) {
      custom_words.forEach(item => {
        str = str.replace(new RegExp(`\\b${item}\\b`, 'gi'), item);
      });
    }
  } else {
    str = '';
  }
  return str;
}
// "abbellisce" un testo sistemando alcuni caratteri, spazi ecc.
"abbellisce" un testo sistemando alcuni caratteri, spazi ecc.
" abbellisce " un testo sistemando alcuni caratteri spazi ecc .
function better_text(str, custom_words = []) {
  if(str) {
    str = str.trim();
    str = str.replace(/ +(,|;|\.|:|!|\?)/g, '$1');
    str = str.replace(/(,|;|\.|:|!|\?)(?!$) +/g, '$1 ');
    str = str.replace(/[ |\t|\u00A0]+/g, ' ');
    str = str.replace(/(^| )"/g, '$1\u201C')  doppie in apertura
      //.replace(/"($| |[,\.:;\!\?])/g, '\u201D$1')  doppie in chiusura
      .replace(/"/g, '\u201D') 
      .replace(/(^| )'/g, '$1\u2018') 
      .replace(/'/g, '\u2019')        
    ;
    str = str.replace(/((^| )(l|un|d|all|dell|nell|sull)('|’)) /gi, '$1' );
    particelle.sort();
    var particelle_unique = particelle.filter( function (value, index, self) {
      return self.indexOf(value) === index;
    } );
    var re = new RegExp('\\b(' + particelle_unique.join('|') + ')\\b +', 'gmi');
    str = str.replace(re, function (match) {
      return match.replace(/ +/g, ' ');
    });
    if(custom_words.length) {
      custom_words.forEach(item => {
        str = str.replace(new RegExp(`\\b${item}\\b`, 'gi'), item);
      });
    }
  } else {
    str = '';
  }
  return str;
}
function better_text ( str , custom_words = [ ] ) { if ( str ) { str = str . trim ( ) ; str = str . replace ( /  +(,|;|\.|:|!|\?) / g , '$1' ) ; str = str . replace ( / (,|;|\.|:|!|\?)(?!$) + / g , '$1 ' ) ; str = str . replace ( / [ |\t|\u00A0]+ / g , ' ' ) ; str = str . replace ( / (^| )" / g , '$1\u201C' ) . replace ( / " / g , '\u201D' ) . replace ( / (^| )' / g , '$1\u2018' ) . replace ( / ' / g , '\u2019' ) ; str = str . replace ( / ((^| )(l|un|d|all|dell|nell|sull)('|’)) /g i ,  ' 1' ) particelle . sort ( ) ; var particelle_unique = particelle . filter ( function ( value , index , self ) { return self . indexOf ( value ) === index ; } ) ; var re = new RegExp ( '\\b(' + particelle_unique . join ( '|' ) + ')\\b +' , 'gmi' ) ; str = str . replace ( re , function ( match ) { return match . replace ( /  + / g , ' ' ) ; } ) ; if ( custom_words . length ) { custom_words . forEach ( item => { str = str . replace ( new RegExp ( ` \\ ${ item } \\ ` , 'gi' ) , item ) ; } ) ; } } else { str = '' ; } return str ; }
"abbellisce" un testo sistemando alcuni caratteri, spazi ecc.
" abbellisce " un testo sistemando alcuni caratteri spazi ecc .
// custom_words: array di definizioni specifiche da trattare nella forma riportata // punteggiatura ---- NB non mettere dopo i replace con entità HTML per conflitti con il carattere `;` // (?!$): negative lookahead per ignorare i caratteri a fine stringa // spazi o tabulazioni multiple //& commerciale // str = str.replace(/& */gm, function (match) { //   return match.replace(/&/g, '\u0026').replace(/ +/g, '\u00A0'); // }); // virgolette // virgolette doppie in apertura //.replace(/"($| |[,\.:;\!\?])/g, '\u201D$1') // virgolette doppie in chiusura // tutte le rimanenti virgolette doppie in chiusura // tutte le virgolette semplici in apertura // tutte le rimanenti virgolette semplici, compresi gli apostrofi // spazio dopo l'apostrofo preceduto da `l`, `un`, `d`, ecc... // aggiunta spazio non divisibile dopo articoli, preposizioni ecc. // include anche alcune parole in altre lingue // valori unici