2012-12-30 14 views
5

की एक सूची दी गई है, एक मीडियाविकि पेज में स्वचालित रूप से विकिलिंक जोड़ें, मैं एक स्क्रिप्ट बनाने की कोशिश कर रहा हूं जो स्वचालित रूप से विकी दस्तावेज़ में अन्य पृष्ठों के लिंक बनाता है।पृष्ठ शीर्षक

function createLinks(startingSymbol, endingSymbol, text, links){ 
    //this needs to be implemented somehow - replace every match of the list of links with a link 
} 
createLinks("[[", "]]", "This is the text to wikify", ["wikify", "text"]); 
//this function would return "This is the [[text]] to [[wikify]]" as its output. 

सबसे स्पष्ट समाधान बस [[text]] के साथ स्ट्रिंग text के हर मैच को बदलने के लिए हो सकता है, लेकिन फिर मैं कुछ समस्याएं आ जाएगा - उदाहरण के लिए, अगर मैं स्ट्रिंग "some problems" और "problems" स्ट्रिंग के भीतर wikify करने की कोशिश की "कुछ समस्याएं", मैं स्ट्रिंग "[[some [[problems]]]]" के साथ समाप्त हो जाऊंगा। क्या इस मुद्दे के आसपास काम करने का कोई तरीका है?

+0

मैं अनिवार्य रूप से पूछ रहा हूं कि किसी स्ट्रिंग को किसी अन्य स्ट्रिंग के अंदर प्रतिस्थापित करना संभव है, यदि केवल और यदि यह दो अन्य तारों के बीच नहीं है। (ई जी।, स्ट्रिंग 'str1' स्ट्रिंग 'str2' के अंदर स्ट्रिंग' str1' को प्रतिस्थापित करें, अगर और केवल तभी 'स्ट्र 2' स्ट्रिंग्स 'str3' और' str4') के बीच नहीं है। –

+0

पढ़ना चाहिए कि यह // // यह फ़ंक्शन वापस आ जाएगा "यह [[text]] [[wikify]]" के आउटपुट के रूप में है? – kieran

+0

यह जावास्क्रिप्ट नियमित अभिव्यक्ति में लुकहेड और ऑपरेटरों को देखकर ऐसा करना संभव हो सकता है, लेकिन मैं नियमित अभिव्यक्ति वाक्यविन्यास से बहुत परिचित नहीं हूं। –

उत्तर

1

यहाँ, एक और तरीका है गतिशील रूप से एक regexp के निर्माण पर आधारित,

function wikifyText (startString, endString, text, list) { 
    list = list.map(function (str) { 
     return str.replace(/([^a-z0-9_])/g, '\\$1'); 
    }); 
    list.sort(); 
    list.reverse(); 
    var re = new RegExp('\\b(' + list.join('|') + ')\\b', 'g'); 
    return text.replace(re, startString + '$1' + endString); 
} 

(JSFiddle)

regexp के दोनों सिरों पर \b एंकर किसी भी आंशिक शब्द wikify की कोशिश कर रहा से इस संस्करण को रोकने लेकिन यदि आप चाहें तो आप इस प्रतिबंध को आराम कर सकते हैं। उदाहरण के लिए, साथ regexp निर्माण की जगह:

var re = new RegExp('\\b(' + list.join('|') + ')(?=(e?s)?\\b)', 'g'); 

पिछले wikified शब्द (JSFiddle) के अंत में एक s या es प्रत्यय की अनुमति होगी। ध्यान दें कि पृष्ठ प्रदर्शित होने पर लिंक टेक्स्ट के हिस्से के रूप में मीडियाविकि में स्वचालित रूप से ऐसे प्रत्यय शामिल होते हैं।


संपादित करें: यहाँ एक संस्करण है कि भी मीडियाविकि पृष्ठ शीर्षक की तरह प्रत्येक वाक्यांश के पहले अक्षर केस-संवेदी होने की अनुमति देता है। यह भी एक से थोड़ा अधिक यूनिकोड के अनुकूल समाधान के साथ \b एंकर की जगह:

function wikifyText (startString, endString, text, list) { 
    list = list.map(function (str) { 
     var first = str.charAt(0); 
     str = first.toUpperCase() + first.toLowerCase() + str.substr(1); 
     str = str.replace(/(\W)/ig, '\\$1'); 
     return str.replace(/^(\\?.\\?.)/, '[$1]'); 
    }); 
    list.sort(); 
    list.reverse(); 
    var re = new RegExp('(^|\\W)(' + list.join('|') + ')(?=(e?s)?\\W)', 'g'); 
    return text.replace(re, '$1' + startString + '$2' + endString); 
} 

(JSFiddle)

यह अगर जावास्क्रिप्ट समर्थित केस-संवेदी वर्गों के रूप में इस तरह के मानक PCRE सुविधाओं regexps बहुत कम गंदा हो सकता है, लुक-बैक या यूनिकोड कैरेक्टर क्लासेस।

विशेष रूप से, कारण इन लापता सुविधाओं के अंतिम करने के लिए, यहां तक ​​कि इस समाधान अभी भी नहीं पूरी तरह से यूनिकोड-बारे में पता है: विशेष रूप से, यह लिंक के बाद शुरू हो या जो विराम चिह्न शामिल किसी भी चरित्र है कि \W से मेल खाता है, इससे पहले कि समाप्त करने के लिए अनुमति देता है लेकिन सभी गैर-ASCII वर्ण, यहां तक ​​कि पत्र भी। (हालांकि, गैर-ASCII अक्षरों लिंक के अंदर सही तरीके से संभाला जाता है।) प्रैक्टिस में, मुझे नहीं लगता कि यह एक प्रमुख मुद्दा होना चाहिए।

+0

मैंने स्क्रिप्ट के अपने संस्करण का उपयोग करके टॉम्बाय नोट्स का क्लोन बनाया है। यह आपके द्वारा टाइप किए जाने पर विकिपीडिया के लिंक उत्पन्न करता है, और जेनरेट किए गए HTML को भी प्रिंट करता है। http://jsfiddle.net/gjqWy/77/ –

+1

@ एंडरसनग्रीन: कूल! इच्छा है कि मैं आपको इसके लिए दूसरा +1 दे सकता हूं। –

+0

मैंने एक ही कोड का उपयोग करके एक विकी लिंक जेनरेटर भी लिखा है। यह HTML लिंक के बजाय विकी मार्कअप लिंक उत्पन्न करता है। वर्तमान में, यह केवल सादा पाठ को ठीक से करने में सक्षम है। http://jsfiddle.net/jarble/gjqWy/78/ –

1

मैंने एक स्क्रिप्ट का एक कामकाजी डेमो बनाया है जो लगभग मुझे करने की ज़रूरत है।

http://jsfiddle.net/8JcZC/2/

alert(wikifyText("[[", "]]", "There are cars, be careful, carefully, and with great care!!", ["text", "hoogahjush", "wikify", "car", "careful", "carefully", "great care"])); 

function wikifyText(startString, endString, text, list){ 
    //sort list into ascending order 
    list.sort(function(a, b){ 
     return a.length - b.length; // ASC -> a - b; DESC -> b - a 
    }); 
    //replace every element in the array with the wikified text 
    for(var i = 0; i < list.length; i++){ 
     text = text.replace(list[i], startString + list[i] + endString); 
    } 
    return text; 
} 

सावधानी का एक शब्द: कुछ मामलों में, इस स्क्रिप्ट शब्द है कि दूसरे शब्दों का हिस्सा हैं wikify सकता है। उदाहरण के लिए, यदि "careful" शब्द सूची में नहीं है, और car शब्द सूची में है, तो "car" शब्द "careful" शब्द के अंदर विकृत किया जाएगा, जैसे: "[[car]]eful"। मुझे उम्मीद है कि मैं इस सीमा के आसपास काम करने में सक्षम हो जाऊंगा।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^