2009-01-07 10 views
7

मैं अपने शेयरपॉइंट विकी सामग्री को प्रोग्रामेटिक रूप से संपादित करना चाहता हूं। फायदे में से एक विकी पर्यावरण में स्वचालित रूप से इंडेक्स जोड़ना होगा।प्रोग्रामेटिक रूप से शेयरपॉइंट विकी सामग्री संपादित करना

क्या कोई ऐसा करने में सक्षम है? भाषा कोई फर्क नहीं पड़ता, लेकिन स्क्रिप्टिंग समाधान की तलाश में है।

उत्तर

3

एक शेयरपॉइंट विकी सिर्फ एक विशेष प्रकार की दस्तावेज़ लाइब्रेरी है। ऐसा करने की कोशिश करते समय मैंने केवल कुछ विषमताओं को चलाया है।

एक शेयरपॉइंट विकी पृष्ठ में एक टेम्पलेट फ़ाइल और एक सूची आइटम शामिल है। जब आप पृष्ठ देखते हैं, सूची आइटम से फ़ील्ड टेम्पलेट फ़ाइल में डाले जाते हैं। तो विकी पेज को अपडेट करने के लिए, आपको केवल सूची आइटम में सही फ़ील्ड अपडेट करना होगा। (संयोग से, इसका मतलब यह भी है कि आप मूल टेम्पलेट पर नहीं पहुंच सकते हैं जैसे कि आप एक सामान्य दस्तावेज़ लाइब्रेरी में फ़ाइल कर सकते हैं। अब तक, टेम्पलेट को पाने का एकमात्र तरीका यह है कि इसे SharePoint Designer के माध्यम से डाउनलोड करना है।)

साथ ही, जब आप सूची आइटम प्रोग्रामेटिक रूप से एक्सेस करते हैं तो SharePoint स्वचालित रूप से विकी सामग्री प्रस्तुत करता है। तो, मुझे वह सामग्री निहित "[[मेरे लिंक का नाम]]," उदाहरण के लिए प्राप्त करने में सक्षम नहीं था - SharePoint हमेशा गाया एचटीएमएल वापसी होगी बजाय, जैसे:

<A class=ms-wikilink href="/MyWikiLibrary/MyLinkName.aspx">My Link Name</A> 

एक छोटे से regex काम के साथ आप हालांकि, इसे वापस मूल विकी सामग्री में परिवर्तित करने में सक्षम होना चाहिए।

+0

क्या किसी ने यह पता लगाया है कि शेयरपॉइंट डिजाइनर के बिना टेम्पलेट कैसे प्राप्त करें? –

+1

विकी लिंक को पार्स करने के लिए रेगेक्स आसान था; लेकिन यह दूसरी तरफ काम नहीं करता है। यदि आप UpdateListItems और अपने विकीफ़ील्ड में [[ब्रैकेट]] छोड़ते हैं तो SharePoint इसे \\ [[ब्रैकेट] \\] में परिवर्तित करता है जो पूरी तरह से मेरे दिमाग को चकमा देता है। मैं यह नहीं समझ सकता कि इससे कैसे बचें; यदि मैं मैन्युअल रूप से लिंक को कन्वर्ट करता हूं, तो SharePoint तब उनसे लिंक के रूप में व्यवहार करेगा (कच्चे विकी मार्कअप के बजाय)। शिथिल शिथिल। एसपी -2010 में, यह तय है और यह सब ठीक काम करता है। मैं इसे SP2007 में काम करने की कोशिश कर रहा हूं। – kamranicus

+1

समाधान मिला। आप सम्मिलित करने और अपडेट करने के लिए प्रतिलिपि सेवा का उपयोग कर सकते हैं, बस नाम को वही रखें। इसके बाद यह कच्चे विकी मार्कअप के रूप में मार्कअप लेता है और अपेक्षित काम करता है। बहुत बढ़िया! – kamranicus

7

हां। -

सेवा

  • http://sites.google.com/site/sharepointwikiuploader/
  • http://blogs.msdn.com/b/dwinter/archive/2008/06/28/migrating-wiki-pages-remotely-part-01.aspx (6 भाग 1): मैं अपने खुद के MetaWeblog API कि प्रोग्राम के रूप में शेयरप्वाइंट 2010 में विकी पृष्ठों और 2007

    मेरे स्रोतों का प्रबंधन करता है लुढ़का है एसपी 2010 और 2007 दोनों के लिए कोड काफी समान है, लेकिन कुछ चेतावनी हैं:

    • 2010 में, विकी लिंक मार्कअप के प्रबंधन के बारे में चिंता करने की आवश्यकता नहीं है (उदा। [[कोष्ठक]])।
    • 2007 में, विकी मार्कअप आपके अनुरोध पर परिवर्तित हो गया है, इसलिए आपको इसे वापस पोस्ट करने से पहले विकी मार्कअप में फिर से परिवर्तित करना होगा। वापस पोस्ट करने पर, आप अद्यतनListItems का उपयोग नहीं कर सकते हैं, आपको कॉपी सेवा का उपयोग करना होगा। ऐसा इसलिए है क्योंकि UpdateListItems किसी भी विकी मार्कअप से बच जाएगा, प्रभावी रूप से आपके प्रयासों को बेकार बना देगा।
    • हमारे पर्यावरण में, हमें रिकॉर्डटाइप की जांच करने से पहले भरने की आवश्यकता है। शायद यह मानक है? यदि आप इस फ़ील्ड को सेट नहीं करते हैं, तो आपका पृष्ठ आपके लिए चेक आउट रहेगा। तो, मेरे पास एक सशर्त है जो इस क्षेत्र को SP2007 के लिए सेट करता है।
    • 2010 में, एसपी कच्चे विकीफ़ील्ड मूल्य में मार्कअप का एक गुच्छा जोड़ता है, और यदि यह गायब है तो यह लेआउट को गड़बड़ कर सकता है। मैं बस इसे डब्लूएलडब्लू पोस्टिंग के मूल्य के चारों ओर डालता हूं, फिर इसे प्राप्त करने के लिए बाहर निकाल देता हूं। निचे देखो।

    मैं विकी पृष्ठों को बनाने और अपडेट करने के पहले लिंक में कॉपी सेवा का उपयोग करता हूं। 2010 में, आप अद्यतन करने के लिए सूची सेवा का उपयोग कर सकते हैं, लेकिन जोड़ने के लिए नहीं। मैं चित्र पुस्तकालय में स्वचालित रूप से छवियों को अपलोड करने के लिए इमेजिंग सेवा का उपयोग करता हूं।

    यहाँ एक समारोह "एमएस-wikilinks" को बदलने के लिए है मार्कअप विकि के लिए:

    नोट: मैं HTMLAgilityPack मामले में मार्कअप लौटे विकृत है का उपयोग करें। आप इसे करने के लिए रेगेक्स का भी उपयोग कर सकते हैं। मैं मार्कअप को स्वच्छ करने के लिए माइक्रोसॉफ़्ट एंटी-एक्सएसएस 4.1 लाइब्रेरी का भी उपयोग करता हूं।

    नोट 2: मेरा UrlDecode फ़ंक्शन System.Web, taken from here पर निर्भरता नहीं लेता है।

    /// <summary> 
    /// Sharepoint 2007 is mean and converts [[wiki links]] once the page is saved in the Sharepoint editor. 
    /// Luckily, each link is decorated with class="ms-wikilink" and follows some conventions. 
    /// </summary> 
    /// <param name="html"></param> 
    /// <returns></returns> 
    private static string ConvertAnchorsToWikiLinks(this string html) 
    { 
        HtmlDocument htmlDoc = new HtmlDocument(); 
    
        htmlDoc.LoadHtml(html); 
    
        var anchorTags = (from d in htmlDoc.DocumentNode.Descendants() 
             where d.Attributes.Contains("class") && d.Attributes["class"].Value == "ms-wikilink" 
             select d).ToList(); 
    
        foreach (var anchor in anchorTags) 
        { 
         // Two kinds of links 
         // [[Direct Link]] 
         // [[Wiki Page Name|Display Name]] 
         var wikiPageFromLink = UrlDecode(anchor.Attributes["href"].Value.Split('/').LastOrDefault().Replace(".aspx", "")); 
         var wikiPageFromText = anchor.InnerText; 
    
         HtmlNode textNode = null; 
    
         if (wikiPageFromLink == wikiPageFromText) 
         { 
          // Simple link 
          textNode = HtmlTextNode.CreateNode("[[" + wikiPageFromText + "]]"); 
         } 
         else 
         { 
          // Substituted link 
          textNode = HtmlTextNode.CreateNode(String.Format("[[{0}|{1}]]", wikiPageFromLink, wikiPageFromText)); 
         } 
    
         if (textNode != null) 
         { 
          anchor.ParentNode.ReplaceChild(textNode, anchor); 
         } 
        } 
    
        return htmlDoc.DocumentNode.InnerHtml; 
    } 
    

    समारोह SharePoint के एचटीएमएल पट्टी है:

    /// <summary> 
    /// Gets editable HTML for a wiki page from a SharePoint HTML fragment. 
    /// </summary> 
    /// <param name="html"></param> 
    /// <returns></returns> 
    public static string GetHtmlEditableContent(string html) 
    { 
        HtmlDocument htmlDoc = new HtmlDocument(); 
    
        htmlDoc.LoadHtml(html); 
    
        HtmlNode divNode = (from d in htmlDoc.DocumentNode.Descendants() 
             where d.Attributes.Contains("class") && d.Attributes["class"].Value == "ms-rte-layoutszone-inner" 
             select d).FirstOrDefault(); 
        HtmlNode divNode2 = (from d in htmlDoc.DocumentNode.Descendants() 
             where d.Attributes.Contains("class") && d.Attributes["class"].Value.StartsWith("ExternalClass") 
             select d).FirstOrDefault(); 
    
        if (divNode != null) 
        { 
         // SP 2010 
         return divNode.InnerHtml; 
        } 
        else if (divNode2 != null) 
        { 
         // SP 2007 or something else 
         return divNode2.InnerHtml.ConvertAnchorsToWikiLinks(); 
        } 
        else 
        { 
         return null; 
        } 
    } 
    

    और अंत में, समारोह है कि कि मार्कअप सब वापस जोड़ता है:

    /// <summary> 
    /// Inserts SharePoint's wrapping HTML around wiki page content. Stupid! 
    /// </summary> 
    /// <param name="html"></param> 
    /// <returns></returns> 
    public static string InsertSharepointHtmlWrapper(string html, SharePointVersion spVersion) 
    { 
        // No weird wrapper HTML for 2007 
        if (spVersion == SharePointVersion.SP2007) 
         return Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(html); 
    
        HtmlDocument htmlDoc = new HtmlDocument(); 
    
        htmlDoc.LoadHtml(@"<table id='layoutsTable' style='width:100%'> 
              <tbody> 
               <tr> 
                <td> 
                 <div class='ms-rte-layoutszone-outer' style='width:99.9%'> 
                  <div class='ms-rte-layoutszone-inner' style='min-height:60px;word-wrap:break-word'> 
                  </div> 
                 </div> 
                </td> 
               </tr> 
              </tbody> 
             </table> 
             <span id='layoutsData' style='display:none'>false,false,1</span>"); 
    
        HtmlNode divNode = (from d in htmlDoc.DocumentNode.Descendants() 
             where d.Attributes.Contains("class") && d.Attributes["class"].Value == "ms-rte-layoutszone-inner" 
             select d).FirstOrDefault(); 
    
        divNode.InnerHtml = Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(html); 
    
        return htmlDoc.DocumentNode.InnerHtml; 
    } 
    

    यह काम करता है महान।

    • पेज अभी भी अंतिम बार संशोधित और सही उपयोगकर्ता को बनाए रखने
    • पेज अपने सभी

    मैं अपने एपीआई प्रकाशित करने की सोच रहा हूँ प्रबंधन करने के लिए इतिहास

  • पेज आसान हैं रख सकेंगे, है ना की एक बहुत कुछ है कोड मुझे लगता है कि हम में से उन लोगों के लिए बहुत उपयोगी है जो हमारे शेयरपॉइंट विकीज़ को बेहतर तरीके से प्रबंधित करना चाहते हैं। डब्ल्यूएलडब्ल्यू के साथ मुझे ऑटो-छवि अपलोड, बेहतर HTML संपादन समर्थन, और प्रीकोड स्निपेट जैसे प्लगइन के लिए समर्थन मिलता है। यह विस्मयकारी है!

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