एक समाधान जिस पर मैं अभी काम कर रहा हूं, जो अब तक अच्छी तरह से काम कर रहा है, उस डिजाइन को लागू करता है जिसे मैंने प्रश्न में प्रस्तावित किया था
मैं यहां अपने कार्यान्वयन की बारीकियों को साझा करूंगा
डेल्टा बनाने और पूर्ण-पाठ के पुनर्निर्माण के लिए मैं शानदार google-diff-match-patch लाइब्रेरी . आप कार्यान्वयन अज्ञेय API दस्तावेज़ पढ़ सकते हैं नीचे दिए गए कोड उदाहरणों को बेहतर ढंग से समझने के लिए, हालांकि यह वैसे भी काफी पठनीय है।
google-diff-match-patch जावा और जेएस कार्यान्वयन हैं इसलिए मैं सर्वर पर जावा के साथ डेल्टा की गणना करने के लिए इसका उपयोग कर सकता हूं। मैंने प्रत्येक डेल्टा को एक स्ट्रिंग में परिवर्तित करना चुना ताकि इसे आसानी से डेटाबेस में संग्रहीत किया जा सके, और क्लाइंट पर जेएस लाइब्रेरी द्वारा आसानी से उपभोग किया जा सके। इस पर और नीचे।
public String getBackwardsDelta(String editedBlogPost, String existingBlogPost) {
diff_match_patch dmp = new diff_match_patch();
LinkedList<diff_match_patch.Patch> patches =
dmp.patch_make(editedBlogPost, existingBlogPost);
return dmp.patch_toText(patches);
}
N.B. मुझे यह पता लगाने में कुछ समय लगा कि google-diff-match-patch के आधिकारिक निर्माण को कैसे हटाया जाए मावेन का उपयोग करना। यह मेवेन सेंट्रल रेपो में नहीं है, बल्कि googlecode.com पर अपने स्वयं के रेपो पर है। बस ध्यान दें, कुछ लोगों ने इसे फोर्क किया है और अपने फोर्क किए गए संस्करणों को मेवेन सेंट्रल में रखा है, लेकिन यदि आप वास्तव में आधिकारिक संस्करण चाहते हैं तो आप अपने pom.xml
में रेपो और निर्भरता जोड़कर प्राप्त कर सकते हैं। इस प्रकार है
<repository>
<id>google-diff-patch-match</id>
<name>google-diff-patch-match</name>
<url>https://google-diff-match-patch.googlecode.com/svn/trunk/maven/</url>
</repository>
<dependency>
<groupId>diff_match_patch</groupId>
<artifactId>diff_match_patch</artifactId>
<version>current</version>
</dependency>
फ्रंट एंड के लिए, मैं नवीनतम ब्लॉग पोस्ट को पूर्ण-पाठ के साथ पास करता हूं, साथ ही प्रत्येक संपादन का प्रतिनिधित्व करने वाले समय में पीछे की ओर जाने वाले डेल्टाओं की एक श्रृंखला, और फिर जेएस में ब्राउज़र में प्रत्येक संस्करण के पूर्ण पाठ का पुनर्निर्माण करता हूं।
पुस्तकालय प्राप्त करने के लिए, मैं npm + browserify का उपयोग कर रहा हूँ। लाइब्रेरी npm पर उपलब्ध है diff-match-patch . के रूप में . संस्करण 1.0.0 एकमात्र संस्करण है।
getTextFromDelta: function(originalText, delta) {
var DMP = require('diff-match-patch'); // get the constructor function
var dmp = new DMP();
var patches = dmp.patch_fromText(delta);
return dmp.patch_apply(patches, originalText)[0];
}
और बस, यह शानदार ढंग से काम करता है।
ब्लॉग पोस्ट के संपादनों को संग्रहीत करने के संदर्भ में, मैं केवल एक तालिका BLOG_POST_EDITS
का उपयोग करता हूं जहां मैं ब्लॉग पोस्ट आईडी संग्रहीत करता हूं, जब संपादन किया गया था (जिसे मैं बाद में क्लाइंट पर पूर्ण-पाठ संस्करणों का पुनर्निर्माण करते समय श्रृंखला बनाने के लिए संपादन को सही ढंग से ऑर्डर करने के लिए उपयोग करता हूं), और वर्तमान लाइव के बीच पीछे की ओर डेल्टा BLOG_POST
. में ब्लॉग पोस्ट तालिका, और ब्लॉग पोस्ट का आने वाला संपादित संस्करण।
मैंने डेल्टास की एक 'श्रृंखला' को स्टोर करना चुना क्योंकि यह मेरे उपयोग के मामले में अच्छी तरह से उपयुक्त है, और चीजों के सर्वर कोड के अंत में आसान है। इसका मतलब यह है कि एन के संस्करण एम के पुनर्निर्माण के लिए, मुझे क्लाइंट को एन-(एम -1) डेल्टा की एक श्रृंखला को लाइव ब्लॉग पोस्ट से पूर्ण-पाठ से संस्करण एम में वापस भेजना होगा। लेकिन मेरे उपयोग के मामले में मैं ऐसा होता हूं वैसे भी, हर बार पूरी श्रृंखला भेजना चाहते हैं, तो यह ठीक है।
विशिष्ट संस्करणों का अनुरोध करने के लिए थोड़ा बेहतर ओवर-द-वायर दक्षता के लिए, सभी डेल्टाओं को नए संपादित ब्लॉग पोस्ट संस्करण से हर बार एक संपादन किए जाने पर प्रत्येक (बहाल) संस्करण में पुनर्गणना किया जा सकता है, लेकिन इसका मतलब अधिक काम और जटिलता होगी। सर्वर।