سؤال

أود أن تحرير Sharepoint محتوى ويكي برمجيا.واحدة من المزايا سيكون إضافة المؤشرات إلى بيئة ويكي تلقائيا.

وقد أي شخص كان قادرا على فعل هذا ؟ لغة لا يهم, ولكن تبحث عن البرمجة الحل.

هل كانت مفيدة؟

المحلول

وويكي شير هو مجرد نوع خاص من مكتبة المستندات. هناك فقط عدد قليل من الشذوذ لقد واجهت عند محاولة للقيام بذلك.

وصفحة شير يكي يتكون من ملف قالب وعنصر قائمة. عند عرض الصفحة، يتم إدراج الحقول من عنصر القائمة في ملف القالب. لذلك لتحديث صفحة ويكي، عليك تحديث الحقول الصحيحة في عنصر القائمة. (وبالمناسبة، وهذا يعني أيضا أنك لا تستطيع الحصول على القالب الأصلي وكأنك قد ملف في مكتبة المستندات العادية. وحتى الآن، والطريقة الوحيدة التي وجدتها للحصول على القالب نفسه هو لتحميل البرنامج من خلال شير مصمم).

وأيضا، شير تلقائيا يجعل محتوى يكي عند الوصول إلى عنصر القائمة برمجيا. لذلك، لم أكن قادرا على الحصول على المحتوى الذي يتضمن "[[بلدي اسم الرابط]]،" على سبيل المثال - أن شير العودة دائما HTML المقدمة بدلا من ذلك، مثل:

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

ومع العمل القليل التعابير المنطقية يجب أن تكون قادرة على تحويل هذا إلى المحتوى يكي الأصلي، وإن كان.

نصائح أخرى

نعم.لقد توالت بلدي Metaweblog API التي برمجيا يدير صفحات الويكي في Sharepoint 2010 و 2007.

مصادري:

رمز الخدمة لكل SP 2010 و 2007 متطابقة الى حد كبير ولكن هناك بعض المحاذير:

  • في عام 2010 ، لا داعي للقلق حول إدارة wiki رابط العلامات (مثل[[بين قوسين]]).
  • في عام 2007, ويكي العلامات يتم تحويلها على الطلب الخاص بك ، بحيث يكون لديك إلى إعادة تحويله إلى ويكي العلامات قبل نشرها مرة أخرى.على نشر مرة أخرى ، لا استخدام UpdateListItems ، يجب استخدام خدمة النسخ.وهذا لأن UpdateListItems الهروب من أي علامات الويكي بشكل فعال مما يجعل الجهود غير مجدية.
  • في بيئتنا ، نطلب RecordType يتعين شغلها في قبل تسجيل الوصول.ربما هذا هو المعيار ؟ إذا لم يتم تعيين هذا المجال ، الصفحة الخاصة بك سوف تبقى خرج لك.لدي الشرطي الذي يضع هذا المجال SP2007.
  • في عام 2010, SP يضيف مجموعة من العلامات الخام WikiField قيمة و لو كان في عداد المفقودين يمكن أن تصل الفوضى تخطيطات.أنا فقط أدخل حول قيمة WLW هو نشر ، ثم قطاع بها على الحصول على.انظر أدناه.

يمكنني استخدام خدمة النسخ كما في الحلقة الأولى لإنشاء وتحديث صفحات الويكي.في 2010 ، يمكن استخدام قوائم خدمة التحديث, ولكن ليس إلى إضافة.يمكنني استخدام التصوير خدمة تحميل الصور تلقائيا إلى مكتبة الصور.

هنا هي وظيفة لتحل محل "ms-wikilinks" إلى ويكي العلامات:

ملاحظة: يمكنني استخدام HTMLAgilityPack في حالة العلامات عاد هو تالف.هل يمكن استخدام التعابير المنطقية القيام بذلك أيضا.أود أيضا أن استخدام Microsoft Anti-XSS 4.1 مكتبة تطهير العلامات.

ملاحظة 2: بلدي UrlDecode الدالة لا تأخذ الاعتماد على النظام.على شبكة الإنترنت ، مأخوذة من هنا.

/// <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 HTML هي:

/// <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;
}

هذا يعمل كبيرة.

  • صفحات لا تزال تحتفظ آخر تعديل وتصحيح المستخدم
  • صفحات ستحتفظ كل تاريخهم
  • صفحات أسهل لإدارة

أنا أفكر في النشر بلدي API, ليس الكثير من التعليمات البرمجية أعتقد هو السوبر مفيدة بالنسبة لنا أن ترغب في تحسين إدارة Sharepoint الويكي.مع WLW أحصل لصناعة السيارات في تحميل الصور, أفضل تحرير HTML دعم ، دعم الإضافات مثل PreCode مقتطف.انها رهيبة!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top