2016-02-03 9 views
15

Sto utilizzando il metodo diff_main della libreria DiffMatchPatch di Google per ottenere diffs che uso poi nella mia app. Consideriamo questo caso:Come rendere Google Diff Match Patch preferisci le modifiche alla fine di una stringa?

Vecchio stringa:

Tracker.Dependency.prototype.changed = function() { 
    for (var id in this._dependentsById) 
    this._dependentsById[id]._compute(); 
}; 

Nuova stringa:

Tracker.Dependency.prototype.changed = function() { 
    for (var id in this._dependentsById) 
    this._dependentsById[id]._compute(); 
}; 

Tracker.autorun = function (f) { 
    constructingComputation = true; 
    var c = new Tracker.Computation(f); 
    return c; 
}; 

L'aggiunta diff che ottengo è:

; 
}; 

Tracker.autorun = function (f) { 
    constructingComputation = true; 
    var c = new Tracker.Computation(f); 
    return c 

considerando che sembrerebbe che per il consumo umano una differenza più ragionevole sarebbe:

Tracker.autorun = function (f) { 
    constructingComputation = true; 
    var c = new Tracker.Computation(f); 
    return c; 
}; 

Esiste un modo per far sì che DiffMatchPatch produca il secondo risultato anziché il primo?

È possibile vedere un esempio qui: https://jsfiddle.net/puje78vL/1/

+2

vuoi condividere un violino? – Siddharth

+1

@Siddharth done –

+2

Ci scusiamo per non aver aggiornato questo prima con ulteriori dettagli. Ero molto malato e non ho avuto il mio laptop fino ad ora. –

risposta

5

ho creato un JSFiddle base autore della biblioteca example page (supponendo che si desidera la versione Javascript basato sul tag domanda).

E utilizzando questo codice mi avrebbe dato quello che ci si aspetta:

var dmp = new diff_match_patch(); 

function launch() { 
    var text1 = document.getElementById('text1').value; 
    var text2 = document.getElementById('text2').value; 

    var d = dmp.diff_main(text1, text2); 
    var ds = dmp.diff_prettyHtml(d); 

    document.getElementById('outputdiv').innerHTML = ds; 
} 

È inoltre possibile guardare la console e vedere la risposta prima (array), dove si può anche vedere che diff_main sta tornando quello che sei aspettando. Stai facendo qualcosa di diverso? Se è così, per favore condividi il tuo codice.

Nuova Info

Ora che hai fornito il testo completo che posso darvi una risposta migliore: il risultato che state vedendo è ok, è solo il modo in cui l'algoritmo funziona

I cercherò di spiegarti cosa sta succedendo e come risolverlo. Diamo uno sguardo alla parte finale di ogni testo:

Testo 1

Tracker.Dependency.prototype.changed = function() { 
    for (var id in this._dependentsById) 
    this._dependentsById[id]._compute(); 
}; 

Testo 2

Tracker.Dependency.prototype.changed = function() { 
    for (var id in this._dependentsById) 
    this._dependentsById[id]._compute(); 
}; 

Tracker.autorun = function (f) { 
    constructingComputation = true; 
    var c = new Tracker.Computation(f); 
    return c; 
}; 

Consente preavviso questo:

  1. La finale }; della funzione changed su Il testo 1 non ha alcun ritorno a capo dopo di esso.
  2. L'ultimo }; della funzione changed su Il testo 2 ha un ritorno a capo dopo di esso.
  3. L'ultimo }; della funzione autorun su Il testo 2 non ha alcun ritorno a capo dopo di esso.

Quindi l'algoritmo che calcola le diff corrisponderà 1 con 3, lasciando 2 come il testo aggiunto. Questo è il motivo per cui tou sta ottenendo quell'output.

Ora per ottenere l'output desiderato è necessario corrispondere a 1 con 2. Questo significa aggiungere una nuova riga vuota alla fine del testo 1 come si può vedere in tour aggiornato JSFIddle:

Tracker.Dependency.prototype.changed = function() { 
    for (var id in this._dependentsById) 
    this._dependentsById[id]._compute(); 
};[PRESS ENTER HERE TO ADD NEW LINE] 

preavviso Prendere che se si utilizza solo questo testo l'algoritmo funziona correttamente (come ho mostrato nella mia risposta originale). È dopo aver aggiunto un po 'di testo quando questa commozione inizia a succedere, non so perché.

+1

Sì, quando ho fatto un violino con un caso di test così isolato, ha funzionato bene. Devo esaminare il codice un po 'di più, ma sono stato un po' malato negli ultimi giorni :( –

+1

Quindi dovrai fornire il tuo codice, l'ambiente, ecc. Altrimenti non potremo più aiutare. –

+1

Ho aggiunto un violino che dimostra l'esempio –

Problemi correlati