当前位置:  开发笔记 > 编程语言 > 正文

以编程方式编辑Sharepoint Wiki内容

如何解决《以编程方式编辑SharepointWiki内容》经验,为你挑选了1个好方法。

我想以编程方式编辑我的Sharepoint Wiki内容.其中一个优点是自动向Wiki环境添加索引.

有没有人能够做到这一点?语言并不重要,但寻找脚本解决方案.



1> kamranicus..:

是.我已经推出了自己的Metaweblog API,它以编程方式管理Sharepoint 2010和2007中的Wiki页面.

我的来源:

http://sites.google.com/site/sharepointwikiuploader/

http://blogs.msdn.com/b/dwinter/archive/2008/06/28/migrating-wiki-pages-remotely-part-01.aspx(第1 - 6部分)

SP 2010和2007的服务代码几乎完全相同,但有一些注意事项:

在2010年,不必担心管理维基链接标记(例如[[方括号]]).

在2007年,wiki标记会根据您的请求进行转换,因此您必须在发回之前将其重新转换为Wiki标记.在回发时,您不能使用UpdateListItems,您必须使用复制服务.这是因为UpdateListItems将逃避任何wiki标记,有效地使你的努力无用.

在我们的环境中,我们要求在登记前填写RecordType.也许这是标准的?如果您未设置此字段,您的页面将保持签出状态.所以,我有条件为SP2007设置此字段.

在2010年,SP在原始WikiField值中添加了一堆标记,如果它丢失了,它可能会弄乱布局.我只是将它插入WLW发布的值,然后在获取时将其删除.见下文.

我使用第一个链接中的复制服务来创建和更新Wiki页面.在2010年,您可以使用列表服务进行更新,但不能添加.我使用"成像"服务将图像自动上传到图片库.

这是一个将"ms-wikilinks"替换为wiki标记的功能:

注意:如果返回的标记格式不正确,我会使用HTMLAgilityPack.您也可以使用正则表达式来执行此操作.我还使用Microsoft Anti-XSS 4.1库来清理标记.

注意2:我的UrlDecode函数不依赖于System.Web,取自此处.

/// 
/// 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.
/// 
/// 
/// 
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的功能是:

/// 
/// Gets editable HTML for a wiki page from a SharePoint HTML fragment.
/// 
/// 
/// 
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;
    }
}

最后,将所有标记添加回来的函数:

/// 
/// Inserts SharePoint's wrapping HTML around wiki page content. Stupid!
/// 
/// 
/// 
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(@"
false,false,1"); 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 wiki的人来说,这并不是很多代码.使用WLW,我可以获得自动图像上传,更好的HTML编辑支持,以及对PreCode Snippet等插件的支持.这很棒!

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有