अद्यतन: सीएसएस में इसे संभालना बहुत सरल और कम ओवरहेड है, लेकिन आपके पास ऐसा कोई नियंत्रण नहीं है कि जब वे करते हैं तो ब्रेक कहाँ होता है। यदि आप परवाह नहीं करते हैं तो ठीक है, या आपके डेटा में बिना किसी प्राकृतिक ब्रेक के लंबे अल्फ़ान्यूमेरिक रन हैं। हमारे पास बहुत सारे लंबे फ़ाइल पथ, URL और फ़ोन नंबर थे, जिनमें से सभी स्थानों पर दूसरों की तुलना में इसे तोड़ना काफी बेहतर है।
हमारा समाधान पहले हर 15 (कहते हैं) वर्णों के बाद एक शून्य-चौड़ाई वाले स्थान (& # 8203;) को डालने के लिए एक रेगेक्स रिप्लेसमेंट का उपयोग करना था, जो कि व्हाट्सएप या विशेष वर्णों में से एक नहीं हैं जहां हम विराम पसंद करेंगे। हम उन विशेष पात्रों के बाद शून्य-चौड़ाई वाले स्थान को रखने के लिए एक और प्रतिस्थापन करते हैं।
शून्य-चौड़ाई रिक्त स्थान अच्छे हैं, क्योंकि वे स्क्रीन पर कभी दिखाई नहीं देते हैं; जब वे दिखाए गए थे तो शर्मीली हाइफ़न्स भ्रमित कर रही थीं, क्योंकि डेटा में महत्वपूर्ण हाइफ़न हैं। जब आप पाठ को ब्राउज़र से कॉपी करते हैं तो शून्य-चौड़ाई वाले स्थान भी शामिल नहीं होते हैं।
वर्तमान में हम जिन विशेष विराम पात्रों का उपयोग कर रहे हैं, वे हैं, फ़ॉरवर्ड स्लैश, बैकस्लैश, अल्पविराम, अंडरस्कोर, @,।, और हाइफ़न। आपको नहीं लगता कि आपको हाइफ़न के बाद ब्रेकिंग को प्रोत्साहित करने के लिए कुछ भी करने की ज़रूरत होगी, लेकिन फ़ायरफ़ॉक्स (3.6 और 4 कम से कम) अपने आप में नंबरों (जैसे फोन नंबर) से घिरा हाइफ़न पर नहीं टूटता है।
हम उपलब्ध लेआउट स्थान के आधार पर, कृत्रिम विराम के बीच वर्णों की संख्या को नियंत्रित करना चाहते थे। इसका मतलब था कि लंबे गैर-ब्रेकिंग रनों के मिलान के लिए रेगेक्स को गतिशील होने की आवश्यकता थी। इसे बहुत कुछ कहा जाता है, और हम प्रदर्शन के कारणों के लिए एक ही समान रीगेक्स बनाना नहीं चाहते हैं, इसलिए हमने रेगेक्स एक्सप्रेशन और इसके झंडे के द्वारा एक साधारण रेगेक्स कैश का उपयोग किया।
यहाँ कोड है; संभवतः आप एक उपयोगिता पैकेज में कार्यों को नामांकित करते हैं:
makeWrappable = function(str, position)
{
if (!str)
return '';
position = position || 15; // default to breaking after 15 chars
// matches every requested number of chars that's not whitespace or one of the special chars defined below
var longRunsRegex = cachedRegex('([^\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^\\s\\.\/\\,_@\\|-])', 'g');
return str
.replace(longRunsRegex, '$1​') // put a zero-width space every requested number of chars that's not whitespace or a special char
.replace(makeWrappable.SPECIAL_CHARS_REGEX, '$1​'); // and one after special chars we want to allow breaking after
};
makeWrappable.SPECIAL_CHARS_REGEX = /([\.\/\\,_@\|-])/g; // period, forward slash, backslash, comma, underscore, @, |, hyphen
cachedRegex = function(reString, reFlags)
{
var key = reString + (reFlags ? ':::' + reFlags : '');
if (!cachedRegex.cache[key])
cachedRegex.cache[key] = new RegExp(reString, reFlags);
return cachedRegex.cache[key];
};
cachedRegex.cache = {};
इस तरह टेस्ट करें:
makeWrappable('12345678901234567890 12345678901234567890 1234567890/1234567890')
अद्यतन 2: ऐसा प्रतीत होता है कि वास्तव में शून्य-चौड़ाई रिक्त स्थान हैं में कम से कम कुछ परिस्थितियों में कॉपी किए गए पाठ में शामिल , आप उन्हें नहीं देख सकते। जाहिर है, इसमें छिपे हुए चरित्रों के साथ लोगों को पाठ की नकल करने के लिए प्रोत्साहित करना एक ऐसा डेटा है जो अन्य कार्यक्रमों या प्रणालियों में दर्ज किया गया है, यहां तक कि अपने स्वयं के, जहां यह समस्या पैदा कर सकता है। उदाहरण के लिए, यदि यह किसी डेटाबेस में समाप्त हो जाता है, तो इसके विरुद्ध खोज विफल हो सकती है, और इस तरह के खोज भी विफल होने की संभावना है। इस तरह से डेटा के माध्यम से स्थानांतरित करने के लिए तीर कुंजियों का उपयोग करना (ठीक से) एक अतिरिक्त कीपर को आपके द्वारा देखे जाने वाले चरित्र के पार जाने के लिए, यदि वे नोटिस करते हैं, तो उपयोगकर्ताओं के लिए कुछ विचित्र।
एक बंद प्रणाली में, आप अपने आप को बचाने के लिए इनपुट पर उस चरित्र को फ़िल्टर कर सकते हैं, लेकिन यह अन्य कार्यक्रमों और प्रणालियों की मदद नहीं करता है।
सभी ने बताया, यह तकनीक अच्छी तरह से काम करती है, लेकिन मैं निश्चित नहीं हूं कि ब्रेक-एंड कैरेक्टर का सबसे अच्छा विकल्प क्या होगा।
अपडेट 3: डेटा में इस पात्र का अंत होना एक सैद्धांतिक संभावना नहीं है, यह एक देखी गई समस्या है। उपयोगकर्ता स्क्रीन से कॉपी किए गए डेटा को सबमिट करते हैं, यह db में सेव हो जाता है, ब्रेक खोजता है, चीजें अजीब तरह से आदि।
हमने दो काम किए:
- इस ऐप के लिए सभी डेटा स्रोतों में सभी तालिकाओं के सभी स्तंभों से उन्हें निकालने के लिए एक उपयोगिता लिखी।
- जोड़ा गया फ़िल्टरिंग हमारे मानक स्ट्रिंग इनपुट प्रोसेसर को हटाने के लिए, इसलिए यह उस समय तक चला जाता है जब कोई भी कोड इसे देखता है।
यह अच्छी तरह से काम करता है, जैसा कि तकनीक ही करती है, लेकिन यह एक सतर्क कहानी है।
अपडेट 4: हम इसे एक ऐसे संदर्भ में उपयोग कर रहे हैं, जहां इसे खिलाया गया डेटा HTML बच सकता है। सही परिस्थितियों में, यह HTML संस्थाओं के बीच में शून्य-चौड़ाई वाले रिक्त स्थान सम्मिलित कर सकता है, जिसमें फ़ंकी परिणाम होते हैं।
इस तरह से हम जिन पात्रों को नहीं तोड़ते, उनकी सूची में एम्परसेंड को ठीक करना था:
var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');