İşlenmiş HTML için fark algoritması olan var mı? [kapalı]


85

İki HTML sayfasının yan yana farkını oluşturmak için muhtemelen Javascript'te iyi bir fark algoritması görmekle ilgileniyorum. Buradaki fikir, farkın işlenmiş HTML'nin farklılıklarını göstermesidir .

Açıklığa kavuşturmak için, yan yana farkları işlenmiş çıktı olarak görebilmek istiyorum . Dolayısıyla, bir paragrafı silersem, yan yana görünüm her şeyi doğru bir şekilde yerleştirmeyi bilir.


@Josh tam olarak. Belki silinen metni kırmızı veya başka bir şekilde gösterebilirdi. Buradaki fikir şu ki, HTML içeriğim için bir WYSIWYG düzenleyici kullanırsam, farklar yapmak için HTML'ye geçmek zorunda kalmak istemiyorum. Bunu iki WYSIWYG editörüyle yan yana yapmak istiyorum belki. Veya en azından ekran, son kullanıcı dostu bir konuda yan yana farklılık gösteriyor.


1
Bu gerçekten Microsoft'tan mı kaynaklanıyor? orijinal olan? : D
Ahmed Khalaf


2
Eski iplik, ama 2 sentimi vereceğimi düşündüm. Son zamanlarda bununla çok uğraşıyorum ve bir sürü kitap buldum: web.onassar.com/blog/2012/11/21/htmldiff-software-discoveries
onassar

2
@Haacked, hiç tatmin edici bir çözüm buldunuz mu?
DG.

@Haacked Çalışan bir çözüm mü buldunuz? Denedim prettydiff.comama kırık gibi görünüyor.
coding_idiot

Yanıtlar:


17

İşlenmiş bir HTML farkının görünümünü önemli ölçüde iyileştirmek için kullanabileceğiniz başka bir güzel numara var. Bu, ilk sorunu tam olarak çözmese de, işlenmiş HTML farklılıklarınızın görünümünde önemli bir fark yaratacaktır.

Yan yana oluşturulan HTML, farkınızın dikey olarak sıralanmasını çok zorlaştıracaktır. Dikey hizalama, yan yana farkları karşılaştırmak için çok önemlidir. Yan yana farkın dikey hizalamasını iyileştirmek için, farkın her bir sürümüne farkın dikey olarak hizalanması gereken "kontrol noktalarına" görünmez HTML öğeleri ekleyebilirsiniz. Ardından, kenarlar dikey olarak hizalanana kadar denetim noktası etrafına dikey boşluk eklemek için biraz istemci tarafı JavaScript kullanabilirsiniz.

Biraz daha ayrıntılı olarak açıklandı:

Bu tekniği kullanmak istiyorsanız, fark algoritmanızı çalıştırın ve farka göre yan yana sürümlerinizin eşleşmesi gereken yere bir grup visibility:hidden <span>s veya küçük <div>s ekleyin. Ardından, her bir kontrol noktasını (ve yan yana komşusunu) bulan ve sayfada daha yukarıda (daha sığ) olan kontrol noktasına dikey boşluk ekleyen JavaScript'i çalıştırın. Artık işlenmiş HTML farkınız bu kontrol noktasına dikey olarak hizalanacak ve yan yana sayfanızın geri kalanında dikey hizalamayı onarmaya devam edebilirsiniz.


17

Hafta sonu boyunca C # 'da bir HTML diff algoritması uygulayan codeplex üzerine yeni bir proje yayınladım. Orijinal algoritma Ruby'de yazılmıştır. Bir JavaScript uygulaması aradığınızı anlıyorum, belki de C #'da kaynak kodlu bir tane mevcut olması algoritmayı taşımanıza yardımcı olabilir. İlgileniyorsanız bağlantı: htmldiff.codeplex.com . Bu konuda daha fazla bilgi bulabilirsiniz burada .

GÜNCELLEME: Bu kitaplık GitHub'a taşındı .


4
HTMLDiff algoritması burada JavaScript'te (CoffeeScript) taşınmıştır .
Florian Parain

Merhaba @pate, bu bağlantıların artık çalışmadığına inanıyorum ...
Tiago Cardoso

@TiagoCardoso tarihli yorumumu sildi.
Petrus Theron

@Rohland Müthiş kütüphane! Gerçekten günümü kurtardım :)
Sirar Salih

3
@Florian Parain: bağlantısını paylaştığınız için teşekkür ederiz github.com/tnwinc/htmldiff.js o inşaat büyük! JS sürümünü isteyenler için ipucu, "npm install htmldiff" aracılığıyla kurun ve ardından "src" dizininde htmldiff.js kullanın.
Elijah Lofgren

4

Bir süre önce benzer bir şeye ihtiyacım oldu. HTML'nin yan yana sıralanması için iki iFrame kullanabilirsiniz, ancak daha sonra kaydırırken javascript aracılığıyla kaydırmayı birbirine bağlamanız gerekir (kaydırmaya izin verirseniz).

Ancak farkı görmek için büyük olasılıkla başka birinin kitaplığını kullanmak isteyeceksiniz. Müşterimin MS Word "değişiklikleri izle" benzeri biçimlendirmeyle içeriğin tek bir HTML oluşturulmasını görmekten memnun olduğu benzer bir proje için Java kitaplığı olan DaisyDiff'i kullandım .

HTH


daisydiff güzel görünüyor
coding_idiot

4

Html'nin salt metin sürümünü oluşturmak için bağlantıların veya lynx'in çıktısını kullanmayı düşünün ve ardından bunu farklılaştırın.


2

Ya DaisyDiff ( Java ve PHP sürümleri mevcuttur).

Aşağıdaki özellikler gerçekten çok güzel:

  • "Doğada" bulunabilen kötü biçimlendirilmiş HTML ile çalışır.
  • Farklılık, HTML'de XML ağacının farklılık gösterdiğinden daha uzmanlaşmıştır. Bir metin düğümünün bir bölümünü değiştirmek, tüm düğümün değişmesine neden olmaz.
  • Varsayılan görsel farka ek olarak, HTML kaynağı tutarlı bir şekilde farklılaştırılabilir.
  • Değişikliklerin kolay anlaşılır açıklamalarını sağlar.
  • Varsayılan GUI, klavye kısayolları ve bağlantılar aracılığıyla değişikliklere kolayca göz atmanıza olanak tanır.

1

Yani bekliyorsun

<font face="Arial">Hi Mom</font>

ve

<span style="font-family:Arial;">Hi Mom</span>

aynı kabul edilmek?

Çıktı, Kullanıcı Aracısına çok bağlıdır. Gibi Ionut Anghelcovici anlaşılacağı , bir resim yapması. Önem verdiğiniz her tarayıcı için bir tane yapın.




0

Daha küçük farklılıklar için normal bir metin farkı yapabilir ve ardından eksik veya eklenmiş parçaları nasıl çözeceğinizi görmek için analiz edebilirsiniz, ancak daha büyük farklılıklar için bunu yapmakta çok zorlanacaksınız.

Örneğin, sola hizalı bir görüntünün (bir metin paragrafının solunda kayan) aniden sağa hizalı hale geldiğini nasıl algılar ve gösterirsiniz?


0

Farklı bir metin kullanmak, önemsiz olmayan belgelerde kırılır. Sezgisel olduğunu düşündüğünüz şeye bağlı olarak, XML farklılıkları muhtemelen biçimlendirmeli metinler için çok iyi olmayan farklar oluşturacaktır. AFAIK, DaisyDiff HTML konusunda uzmanlaşmış tek kütüphanedir. Bir HTML alt kümesi için harika çalışıyor.


0

Java ve XHTML ile çalışıyorsanız, XMLUnit iki XML belgesini org.custommonkey.xmlunit.DetailedDiff sınıfı aracılığıyla karşılaştırmanıza olanak tanır :

İki XML belgesi arasındaki tüm farkları karşılaştırır ve açıklar. Diff sınıfının aksine, ilk kurtarılamayan fark bulunduğunda belge karşılaştırması durmaz.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.