आपका पहला काम एक पैच प्रारूप चुनने के लिए है। मनुष्यों को पढ़ने के लिए सबसे कठिन प्रारूप (आईएमएचओ) लागू करने के लिए सॉफ्टवेयर का सबसे आसान प्रारूप साबित होता है: ed (1) स्क्रिप्ट। पैच उत्पन्न करने के लिए आप एक सरल /usr/bin/diff -e old.xml new.xml
से शुरू कर सकते हैं; diff (1) लाइन उन्मुख पैच का उत्पादन करेगा लेकिन यह शुरू करने के लिए ठीक होना चाहिए। एड प्रारूप इस तरह दिखता है:
36a
<tr><td class="eg" style="background: #182349;"> </td><td><tt>#182349</tt></td></tr>
.
34c
<tr><td class="eg" style="background: #66ccff;"> </td><td><tt>#xxxxxx</tt></td></tr>
.
20,23d
संख्याएं लाइन संख्याएं हैं, लाइन संख्या श्रेणियां अल्पविराम से अलग हैं।
- एक: इस स्थिति में पाठ की अगली खंड जोड़ें तो फिर वहाँ तीन सिंगल पत्र आदेशों हैं।
- सी: इस स्थिति में टेक्स्ट को निम्न ब्लॉक में बदलें। यह डी के बराबर है, इसके बाद कमांड के बराबर है।
- डी: इन पंक्तियों को हटाएं।
आप यह भी देखेंगे कि पैच में लाइन नंबर नीचे से नीचे जाते हैं, इसलिए आपको पैच के बाद के हिस्सों में रेखा संख्याओं को गड़बड़ करने के बारे में चिंता करने की आवश्यकता नहीं है। टेक्स्ट को जोड़ने या बदलने के वास्तविक भाग को एक ही अवधि के साथ लाइन द्वारा समाप्त लाइनों के अनुक्रम के रूप में आदेशों का पालन करें (यानी /^\.$/
या patch_line == '.'
आपकी वरीयता के आधार पर)। सारांश में, प्रारूप इस तरह दिखता है:
[line-number-range][command]
[optional-argument-lines...]
[dot-terminator-if-there-are-arguments]
तो, एक एड पैच लागू करने, तुम सब करने की जरूरत है एक सरणी (प्रति पंक्ति एक तत्व) में लक्ष्य फ़ाइल लोड है, का उपयोग कर पैच पार्स एक साधारण राज्य मशीन, उन्हें हटाने के लिए नई लाइनें और Array#delete_at जोड़ने के लिए Array#insert पर कॉल करें। पैचर लिखने के लिए रूबी की दो दर्जन से अधिक लाइनें नहीं लेनी चाहिए और पुस्तकालय की आवश्यकता नहीं है।
आप इस तरह बाहर आने के लिए अपने XML की व्यवस्था कर सकते हैं:
<tag>
blah blah
</tag>
<other-tag x="y">
mumble mumble
</other>
बजाय:
<tag>blah blah</tag><other-tag x="y">mumble mumble</other>
तो ऊपर सरल रेखा-उन्मुख दृष्टिकोण से कार्य करेंगे; अतिरिक्त ईओएल को ज्यादा जगह नहीं लगनी पड़ेगी ताकि शुरू करने के लिए आसान कार्यान्वयन के लिए जाएं।
दो सरणी (Google "रूबी एल्गोरिदम :: diff" शुरू करने के लिए भिन्नता के उत्पादन के लिए रूबी पुस्तकालय हैं)। एक एक्सएमएल पार्सर के साथ एक diff लाइब्रेरी का संयोजन आपको पैच का उत्पादन करने देगा जो लाइन-आधारित के बजाय टैग-आधारित हैं और यह आपको बेहतर तरीके से अनुकूल कर सकता है। एक बार जब आप एड प्रारूप (और नीचे से ऊपर तक काम कर रहे पैच के ज्ञान का एहसास) चुनते हैं तो पैच प्रारूपों की पसंद महत्वपूर्ण बात है, तो बाकी सब कुछ बहुत कम प्रयास के साथ जगह में आता है।
मेरे पास पैच फ़ाइल प्रारूप पर पूर्ण नियंत्रण है। सर्वर जावा/लिनक्स चलाता है, इसलिए बहुत मानक विकल्प होना चाहिए, और मैं प्रारूप में भी कुछ भी समायोजित कर सकता हूं जो उपयोगी होगा। –