Apple टेक्स्ट एडिटर की तकनीकी आंतरिक संरचना
TextView आधारित टेक्स्ट एडिटर के रूप में Paper कैसे काम करता है, इसके विवरण पर चर्चा करता है।
- Paper फिलहाल TextKit 1 framework पर बनाया गया है, और TextKit 2 में भी concepts, abstractions और principles बने रहते हैं या बेहतर API में बदल जाते हैं।
टेक्स्ट व्यू
TextView class Apple टेक्स्ट एडिटर में टेक्स्ट एडिटिंग कार्यों का केंद्र है।
NSTextView और UITextView में अंतर है, लेकिन API समान होने के कारण इन्हें एक ही TextView class की तरह माना जाता है।
TextView एक बड़ा component है जिसकी complexity हर OS release के साथ बढ़ती जाती है।
- Apple टेक्स्ट एडिटिंग अनुभव देने के लिए
TextView को कई layers में विभाजित करता है।
NSTextStorage
- कच्ची टेक्स्ट string को स्टोर करता है।
- टेक्स्ट range को assigned attributes (string-value pairs) स्टोर करता है।
- टेक्स्ट और attribute changes के लिए events ट्रिगर करता है।
NSTextContainer
- उस क्षेत्र का आकार और रूप परिभाषित करता है जिसमें टेक्स्ट symbols (glyphs) होस्ट किए जाते हैं।
NSLayoutManager
NSTextStorage की टेक्स्ट string पर लागू attribute ranges को देखकर glyphs का आकार और spacing गणना करता है।
- glyphs का layout करता है, टेक्स्ट की हर पंक्ति कहाँ शुरू और खत्म होती है, और पूरे टेक्स्ट की ऊँचाई क्या है, इसकी गणना करता है।
TextView
NSLayoutManager द्वारा बनाए गए glyph layout को draw करता है।
- view की ऊँचाई को layout किए गए टेक्स्ट की मौजूदा ऊँचाई के साथ sync करता है।
- टेक्स्ट selection, caret, और नए insert किए गए टेक्स्ट पर लागू typing attributes को manage करता है।
ScrollView
TextView का दिखने वाला हिस्सा प्रदर्शित करता है।
- scrolling, scroll bars और zoom को manage करता है।
attributes
NSAttributedString Apple frameworks में rich text editing की नींव है।
- यह सामान्य टेक्स्ट string और टेक्स्ट ranges से जुड़े attributes (string-value pairs) से मिलकर बना होता है।
- attributes मुख्य रूप से styling के लिए उपयोग होते हैं, लेकिन custom string-value pairs assign करने पर कोई सीमा नहीं है।
styling
- styling का मतलब टेक्स्ट range पर विशेष framework-defined attributes लागू करना है।
- Paper meta attributes का उपयोग करके पहले टेक्स्ट structure पहचानता है, फिर styling लागू करता है।
- attributes, user input के कारण बदलने वाले
NSTextStorage के Markdown टेक्स्ट और menu items, sliders, gestures से user द्वारा समायोजित text-affecting settings के साथ sync रहते हैं।
performance
- meta, layout, और decoration attributes का अलगाव editor के कुछ बदलावों को तेज़ी से बनाए रखने में मदद करता है।
- typing speed टेक्स्ट एडिटर में सबसे महत्वपूर्ण performance factor है।
- Markdown के काम करने के तरीके के कारण टेक्स्ट बदलाव पूरे paragraph की styling को प्रभावित कर सकते हैं।
meta attributes
- highlighting logic के अलावा, meta attributes उन कई features में महत्वपूर्ण भूमिका निभाते हैं जिन्हें टेक्स्ट structure के बारे में जानना ज़रूरी होता है।
formatting shortcuts
- selected Markdown टेक्स्ट की style toggle करने के लिए ज़रूरी विस्तृत जानकारी प्रदान करते हैं।
अध्यायों के बीच नेविगेशन
- caret position के सापेक्ष heading खोजने में मदद करता है।
outline
- सभी headings को iterate करने की क्षमता पर निर्भर करता है।
अध्यायों का पुनर्व्यवस्थित करना
- outline में chapters को reorder करने की सुविधा देता है।
format conversion
- Markdown content को RTF, HTML, DOCX में convert करने के लिए structure जानना आवश्यक है।
टेक्स्ट कंटेनर गणित
- टेक्स्ट container के लिए पसंदीदा line length बनाए रखना सबसे महत्वपूर्ण नियम है।
- कुछ मामलों में सममिति का आभास देना पड़ता है, जैसे जब heading tags सामान्य टेक्स्ट flow के बाहर रखे जाते हैं।
selection anchoring
- टेक्स्ट selection में हमेशा एक anchor point होता है।
- Mac पर click और drag करके टेक्स्ट चुना जाता है, और iOS पर selection के एक छोर को drag किया जा सकता है।
selection affinity
- टेक्स्ट editing में selection affinity नाम का एक दिलचस्प concept होता है।
- caret को arrow keys से ले जाने पर वह बस पंक्ति बदल देता है, लेकिन shortcut से line end पर जाने पर वह उसी पंक्ति में रहते हुए दाईं ओर चिपक जाता है।
Uniform Type Identifiers (UTIs)
- apps के बीच data exchange की आधारभूत प्रणाली UTIs पर चर्चा की गई है।
- यह एक hierarchical system है जिसमें data types parent data types के लिए conform to (inherit) करते हैं।
clipboard (Pasteboard)
- clipboard एक dictionary है जिसमें UTIs serialized data से mapped होते हैं।
- एक single copy operation एक ही data के कई representations एक साथ लिखता है।
- public UTIs और private UTIs को संभालना अपेक्षाकृत सरल है, लेकिन Apple द्वारा परिभाषित न किए गए, व्यापक रूप से स्वीकार किए गए formats को संभालना अधिक जटिल है।
समापन
- पहला लेख देखें तो app और development process के बारे में और जानकारी मिल सकती है।
GN⁺ की राय
- यह लेख Apple platforms पर
TextView आधारित टेक्स्ट एडिटर के जटिल आंतरिक कामकाज को विस्तार से समझाता है, जो software developers और रुचि रखने वाले users के लिए दिलचस्प जानकारी देता है।
- टेक्स्ट एडिटर की performance optimization के लिए algorithm और attribute management के तरीके, developers के लिए अपने applications डिज़ाइन करते समय अच्छे उदाहरण हो सकते हैं।
- टेक्स्ट एडिटर की performance बढ़ाने के लिए इस्तेमाल किए गए technical approaches, दूसरे developers को समान समस्याएँ हल करते समय उपयोगी दिशा-निर्देश देते हैं।
- Markdown जैसे टेक्स्ट formats संभालने वाले applications विकसित करते समय data exchange और compatibility के लिए UTIs की समझ महत्वपूर्ण है।
- यह लेख टेक्स्ट एडिटर की आंतरिक संरचना की समझ बढ़ाने में मदद करता है, लेकिन व्यवहार में इतनी जटिलता को manage करना developers के लिए एक बड़ी चुनौती हो सकती है।
1 टिप्पणियां
Hacker News राय
यह लेख वाकई बहुत अच्छा है। लगता है कि TextKit के लिए मेरी बुनियादी परिचय सामग्री के रूप में यह https://www.objc.io की जगह ले लेगा।
मैं उन decorative attributes को लेकर थोड़ा उलझन में हूँ जो editing transaction के बाहर किए जाते हैं। इसमें कहा गया है, "और वे transaction-aware नहीं हैं, क्योंकि वे NSTextStorage में नहीं बल्कि NSLayoutManager में मौजूद हैं"। लेकिन color जैसी decorative attributes तो आमतौर पर NSTextStorage में होती हैं! क्या लेखक यह संकेत दे रहा है कि markdown characters पर लगाया गया color, NSLayoutManager के temporary attributes support के जरिए किया जा रहा है (जिसका इस्तेमाल आम तौर पर misspelled words को रंगने के लिए होता है)? अगर हाँ, तो उसका उद्देश्य क्या है?
वाकई शानदार लेख है (और मेरे लिए व्यक्तिगत रूप से सही समय पर भी आया है; मैं इस समय NSTextViews के साथ काम कर रहा हूँ)। यह जानकारी आपको कैसे मिली? किसी और का code? दर्दनाक अनुभव? developer.apple.com?
DOM documents के दौर में (जैसे: notion, gitbook), मैं अक्सर text parsing और manipulation में जादुई काम करने के लिए attributed strings का उपयोग करता हूँ। यह बहुत elegant structure है और मैं समझ नहीं पाता कि यह इतना कम जाना-पहचाना क्यों है। वैसे, लेख कमाल का है।
मैंने पहले कभी scratch से अपना खुद का text editor लिखने की कोशिश की थी, और अगर उस समय मेरे पास ऐसा resource होता, तो वह वाकई शानदार होता।
मैं लंबे समय तक Android app developer रहा हूँ, इसलिए Apple चीज़ों को कुछ अलग और अधिक सोच-समझकर जिस तरह से handle करता है, उसे देखना दिलचस्प था। Android में Layout class (और उसकी subclasses) layout और rendering से जुड़ी लगभग हर चीज़ संभालती हैं, और TextView editing/selection logic का एक हिस्सा implement करता है। EditText और TextView के बीच असल में सिर्फ यही फर्क है कि EditText, TextView में पहले से मौजूद editing features को "enable" करता है। इस कुछ हद तक monolithic approach (और खराब API) की समस्या यह है कि अगर किसी app को text rendering के तरीके पर अधिक नियंत्रण चाहिए, तो फिर आपकी किस्मत खराब है। उदाहरण के लिए, layout हो जाने के बाद अगर आप individual glyphs तक पहुँचना चाहें? नहीं, माफ़ कीजिए।
TextEdit app लगभग पूरी तरह एक ही TextView से बना है। मुझे लगता है Windows में इसका समकक्ष WordPad है। वह RichEdit control पर आधारित है। एक और दिलचस्प बात यह है कि RTF मूल रूप से NSAttributedString का serialized रूप है। यही बात Windows के RichEdit control पर भी लागू होती है। दरअसल, लगता है Windows का implementation पहले आया था: https://en.wikipedia.org/wiki/Rich_Text_Format
मुझे यह app बहुत पसंद है। इसने obsidian और ia Writer समेत मेरी बाकी सारी markdown apps की जगह ले ली है!
अच्छी बात है कि कम से कम कोई तो 2024 में भी Cocoa का उपयोग कर रहा है।
काश iOS components के बारे में इस तरह के और documents होते!