# टेक्स्ट डिफ़ — दो टेक्स्ट, अगल-बगल मिलाइए

दो टेक्स्ट भीतर, हर फ़र्क निशान लगाकर बाहर, पंक्ति-दर-पंक्ति और शब्द-दर-शब्द। कुछ भी किसी और के सर्वर में चिपकाया नहीं जाता।

> दो टेक्स्ट मिलाइए और हर फ़र्क देखिए, पंक्ति-दर-पंक्ति और शब्द-दर-शब्द, अगल-बगल या एक कॉलम में। तुलना आपके ब्राउज़र में चलती है और कुछ भी अपलोड नहीं होता - अभी जारी न हुआ कोड आपकी मशीन से कभी बाहर नहीं जाता।

यह पेज एक इंटरैक्टिव टूल है जो पूरी तरह आपके ब्राउज़र में चलता है, https://abox.tools/hi/text-diff/ पर — आप इसे जो भी देते हैं, वह कहीं अपलोड नहीं होता। आगे वह सब कुछ है जो यह पेज इस टूल के बारे में शब्दों में कहता है; इसे इस्तेमाल करने के लिए यह पता खोलें।

## यह टूल टेक्स्ट **कभी अपलोड नहीं करता**। यहाँ कोई सर्वर है ही नहीं।

तुलना दो लाइनों पर की गई गणित है, और यहीं, इसी पेज में होती है। एल्गोरिद्म Myers का है — वही जो `git diff` इस्तेमाल करता है — और `src/diff.js` में हाथ से लिखा हुआ है, जहाँ आप उसे पढ़ सकते हैं। इस टूल में किसी भी तरह की कोई नेटवर्क सुविधा है ही नहीं, इसलिए यहाँ से कुछ मँगाया भी नहीं जा सकता और भेजा भी नहीं जा सकता। और यह बात यहाँ मायने रखती है, क्योंकि लोग जो मिलाते हैं वे अनुबंध, कॉन्फ़िग फ़ाइलें और अभी जारी न हुआ कोड होते हैं, और हमेशा जोड़े में।

- ✗ कोई अपलोड नहीं
- ✗ कोई खाता नहीं
- ✗ साइज़ की कोई सीमा नहीं
- ✓ ऑफ़लाइन चलता है
- ✓ ओपन सोर्स

## दो टेक्स्ट को बिना अपलोड किए कैसे मिलाएँ

1. **दोनों टेक्स्ट चिपकाइए, या दोनों फ़ाइलें छोड़ दीजिए।** असली बाईं ओर, बदला हुआ दाईं ओर। पिकर पर एक साथ छोड़ी गई दो फ़ाइलें एक-एक तरफ़ जा बैठती हैं, उसी क्रम में जिसमें आपने छोड़ीं; उलटा हो गया हो तो पक्ष अदल-बदल लीजिए।
2. **पढ़ने का ढंग चुनिए।** अगल-बगल, या एक कॉलम में। फ़ोन एक कॉलम से शुरू होता है, क्योंकि अगल-बगल के लिए टेक्स्ट के दो कॉलम चाहिए और फ़ोन में जगह करीब एक ही की है; मेन्यू वैसे भी वहीं बगल में है।
3. **जो मायने नहीं रखता, उसे अनदेखा कीजिए।** खाली जगह, बड़े-छोटे अक्षर, खाली पंक्तियाँ — हर एक को अलग से अनदेखा किया जा सकता है, ताकि सिर्फ़ दोबारा सजाई गई फ़ाइल सौ बदलावों जैसी न पढ़ाई दे। डिफ़ॉल्ट रूप से बिना बदला बीच का हिस्सा एक गिनती में सिमट जाता है, और हर बदलाव के दोनों ओर तीन-तीन पंक्तियाँ रखी जाती हैं।
4. **पढ़िए कि क्या बदला।** हटाई गई पंक्तियाँ बाईं ओर निशान पाती हैं, जुड़ी हुई दाईं ओर, और बदली हुई पंक्ति के भीतर वे शब्द उभार दिए जाते हैं जो अलग हैं — इसलिए दो अनुच्छेदों का डिफ़ वह शब्द दिखाता है जो खिसका, न कि दो पूरे अनुच्छेद।
5. **पैच ले जाइए।** डाउनलोड यूनिफ़ाइड फ़ॉर्मैट की `.patch` है, और कोड रिव्यू, `git apply` और हर डिफ़ व्यूअर यही चाहते हैं। कॉपी वही चीज़ आपके क्लिपबोर्ड पर रख देता है।

## विस्तार से

[दो JSON फ़ाइलों की तुलना कैसे करें](https://abox.tools/hi/guides/compare-two-json-files/): दोनों फ़ाइलें एक ही तरह फ़ॉर्मैट कीजिए, कुंजियाँ क्रम में लगाइए, फिर मिलाइए। कच्चा JSON डिफ़ लगभग पूरा शोर क्यों है, ब्राउज़र में दोनों पक्षों को मानक रूप में कैसे लाएँ, और पैच तक क्या बचता है।

## बॉक्स में और भी टूल

- [Base64 एनकोडर-डिकोडर](https://abox.tools/hi/base64/): Base64, परसेंट एनकोडिंग, HTML एंटिटी, हेक्स और बैकस्लैश एस्केप, दोनों दिशाओं में। कुछ भी किसी और के सर्वर में चिपकाया नहीं जाता।
- [टेक्स्ट और फ़ाइलें साझा करें](https://abox.tools/hi/share-text/): साझा की गई चीज़ इसी खुले टैब में रहती है। पाठक उसे एन्क्रिप्टेड रूप में सीधे आपके ब्राउज़र से पाते हैं, और टैब बंद करते ही सब खत्म - किसी सर्वर पर कुछ नहीं रहता।
- [QR और बारकोड जनरेटर](https://abox.tools/hi/qr-barcode/): टाइप कीजिए, और वह कोड बन जाता है। बनाने के लिए कुछ भी कहीं नहीं भेजा जाता।
- [QR और बारकोड रीडर](https://abox.tools/hi/qr-barcode-reader/): कैमरा कोड पर कीजिए, या उसकी तस्वीर यहाँ छोड़ दीजिए। पढ़ना यहीं होता है, और कहीं नहीं।

## सवाल

### क्या मेरे टेक्स्ट कहीं अपलोड होते हैं?

नहीं। तुलना एक फ़ंक्शन है जो आपके अपने ब्राउज़र में, आपके अपने हार्डवेयर पर चलता है। इस टूल में किसी भी तरह की कोई नेटवर्क सुविधा है ही नहीं, यानी यह न कभी कुछ मँगाता है, न कभी कुछ भेजता है। और पेज की `Content-Security-Policy` उन सारे पतों के नाम गिना देती है जिनसे यह संपर्क कर सकता है, जिनमें से एक भी इस साइट का नहीं है। किसी अनुबंध, कॉन्फ़िग फ़ाइल या जारी न हुए कोड के लिए इसे इस्तेमाल करने की वजह भी यही है, क्योंकि इन्हें किसी और के डिफ़ में चिपकाने का मतलब है दोनों संस्करण एक साथ सौंप देना।

### तुलना असल में करती क्या है?

वह संपादनों का सबसे छोटा समूह ढूँढ़ती है जो बाएँ वाले टेक्स्ट को दाएँ वाले में बदल दे, और इसके लिए Myers का वही एल्गोरिद्म इस्तेमाल करती है जो `git diff` इस्तेमाल करता है। सबसे छोटा होना ही डिफ़ को पढ़ने लायक बनाता है। बीच में जोड़ी गई एक पंक्ति एक जोड़ के रूप में दिखनी चाहिए, न कि उसके बाद की हर पंक्ति के बदल जाने के रूप में। बदली हुई पंक्ति के भीतर जो शब्द अलग हैं उन पर भी निशान लग जाता है, इसलिए दो पैराग्राफ़ की तुलना दो पूरे पैराग्राफ़ नहीं, वह शब्द दिखाती है जो हिला।

### क्या यह दो चिपकाए हुए टेक्स्ट के बजाय दो फ़ाइलें मिला सकता है?

हाँ। दोनों को एक साथ पिकर पर छोड़ दीजिए और वे एक-एक तरफ़ जा बैठती हैं, उसी क्रम में जिसमें आपने छोड़ीं। उन्हें आपका ब्राउज़र पढ़कर इसी पेज में लाता है, और वही अकेली जगह है जहाँ वे जाती हैं। अगर आपने उन्हें उलटी तरफ़ छोड़ दिया हो तो पक्ष अदल-बदल लीजिए।

### तुलना में से क्या निकलता है, और क्या मैं उसे लागू कर सकता हूँ?

डाउनलोड एक यूनिफ़ाइड डिफ़ है, यानी वही `@@ -3,5 +3,5 @@` वाला फ़ॉर्मैट जिसे `git apply`, `patch` और हर कोड रिव्यू टूल पढ़ता है। कॉपी वही चीज़ आपके क्लिपबोर्ड में डाल देता है। स्क्रीन पर जो है वह उसी का एक रूप है, यानी आमने-सामने या एक ही कॉलम में, और जब तक आप पूरा न माँगें तब तक न बदले हिस्से एक गिनती में सिमटे हुए।

### क्या यह खाली जगह, बड़े-छोटे अक्षर या खाली पंक्तियाँ अनदेखी कर सकता है?

हाँ, हर एक अलग से। खाली जगह अनदेखी करने पर सिर्फ़ दोबारा सजाई गई फ़ाइल बिना बदलाव की निकलती है; बड़े-छोटे अक्षर अनदेखे करने पर `Error` और `error` एक ही शब्द गिने जाते हैं; खाली पंक्तियाँ अनदेखी करने पर वे पंक्तियाँ छूट जाती हैं जिनमें कुछ है ही नहीं। तब नतीजे के ऊपर की गिनती कहती है कि जिन फ़र्कों को आपने अनदेखा करने को कहा उन्हें अनदेखा करते ही दोनों बराबर हैं — जो हूबहू एक जैसा होने के दावे से अलग दावा है, और पेज दोनों दावों को अलग ही रखता है।

### यह कितनी बड़ी तुलना सँभाल सकता है?

यहाँ कोई सीमा तय की ही नहीं गई है, क्योंकि उसका बिल चुकाने वाला कोई सर्वर ही नहीं। बीस हज़ार पंक्तियों के दो टेक्स्ट, जिनमें मुट्ठी भर बदलाव हों, पलक झपकते मिल जाते हैं, क्योंकि साझा शुरुआत और साझा अंत असली काम शुरू होने से पहले ही काट दिए जाते हैं। ऐसे दो टेक्स्ट की तुलना जिनमें कुछ भी साझा न हो, जल्दी ही रुक जाती है और यह कह भी देती है, बजाय इसके कि उस बात को साबित करने में एक मिनट लगाए जो पहले ही ज़ाहिर थी। और बहुत लंबी तुलना पहली कुछ हज़ार पंक्तियाँ खींचकर बाकी डाउनलोड की गई पैच पर छोड़ देती है।

### क्या यह मुफ़्त है, और क्या मुझे खाता चाहिए?

यह मुफ़्त है, और यहाँ न कोई खाता है, न साइन-इन, न ट्रायल, और न इस पर कोई सीमा कि आप कितना चिपकाएँ। साइट पर विज्ञापन हैं, और वही इसका खर्च उठाते हैं; विज्ञापनों को आपके टेक्स्ट के बारे में कुछ नहीं दिया जाता।

### क्या यह ऑफ़लाइन चलता है?

हाँ। पेज एक बार लोड कर लीजिए, फिर इंटरनेट काट दीजिए और यह चलता रहेगा। यह साबित करने का भी सबसे आसान तरीका यही है कि कुछ अपलोड नहीं हो रहा: जो टूल आपके टेक्स्ट मिलाने के लिए कहीं भेजता, वह प्लग निकालते ही रुक जाता।

## प्राइवेसी का यह दावा कैसे जाँचा जा सकता है

- **आप जो चिपकाते हैं, उसके जाने को कोई जगह ही नहीं है।** यह पेज जिन-जिन पतों से संपर्क कर सकता है, Content-Security-Policy उन सबके नाम गिना देती है, और उनमें से एक भी इस साइट का नहीं है। यहाँ कोई ऐसा एंडपॉइंट है ही नहीं जहाँ चिपकाया गया कोई टोकन जमा किया जा सके, और कोड में ऐसा कुछ भी नहीं जो उसे भेजता, अगर होता भी।
- **यहाँ कुछ भी कहीं से कुछ नहीं लाता।** `src/` में कहीं भी न `fetch` है, न `XMLHttpRequest`, न `sendBeacon`। तुलना इसी पेज का एक फ़ंक्शन है जो दो लाइनें लेता है और लौटा देता है कि क्या बदला।
- **एल्गोरिद्म वही जाना-पहचाना है, और पूरा पढ़ा जा सकता है।** Myers का सबसे छोटी संपादन-पटकथा वाला एल्गोरिद्म, वही जो `git diff` इस्तेमाल करता है, `src/diff.js` में हाथ से लिखा हुआ, हर फ़ैसले पर टिप्पणी के साथ। `tests/js/text-diff.test.js` के टेस्ट साबित करते हैं कि हटाए हुए हिस्से बाएँ टेक्स्ट को फिर खड़ा कर देते हैं और जोड़े हुए हिस्से दाएँ को, और किसी डिफ़ के लिए सही होने का मतलब यही है।
- **Google क्या लोड करता है, और उसे क्या नहीं दिया जाता।** विज्ञापन और माप वाली स्क्रिप्ट Google से आती हैं, और दान का बटन Buy Me a Coffee से। इनमें से किसी को भी आपके टेक्स्ट का एक अक्षर तक नहीं सौंपा जाता। उसे पढ़ने, समझने या लिखने वाली हर पंक्ति इसी ऑरिजिन से आती है और रिपॉज़िटरी में दर्ज है।
- **यह ऑफ़लाइन भी चलता है।** नेटवर्क काट दीजिए और टूल जस का तस काम करता रहेगा, क्योंकि इसमें नेटवर्क वाला कोई कदम कभी था ही नहीं। सबसे आसान सबूत यही है।

**खुद जाँच लीजिए।** ऊपर लिखी किसी भी बात को भरोसे पर मानने की ज़रूरत नहीं। यह पेज रिपॉज़िटरी के टेम्पलेट और कॉन्फ़िग से बनता है, एक ऐसी बिल्ड स्क्रिप्ट के ज़रिए जिसे आप पढ़ भी सकते हैं और खुद चला भी सकते हैं। उसका नतीजा `dist` ब्रांच पर कमिट रहता है, यानी जो सर्व हो रहा है और सोर्स से बिल्ड करने पर जो बनता है, दोनों का फ़र्क आप खुद देख सकते हैं: https://github.com/A-Box-of-Tools/website

सबसे पहले पढ़ने लायक फ़ाइलें ये हैं — Content-Security-Policy के लिए `config/site.toml` और `src/diff.js`: वहाँ Myers का एल्गोरिद्म है, हर बदली हुई पंक्ति के भीतर शब्द-दर-शब्द चलने वाला दूसरा दौर, और वे तीन हिफ़ाज़तें जो किसी बेढब तुलना को पेज जमा देने से रोकती हैं।
