Программное редактирование содержимого Sharepoint Wiki

StackOverflow https://stackoverflow.com/questions/420671

  •  05-07-2019
  •  | 
  •  

Вопрос

Я хотел бы редактировать содержимое Wiki Sharepoint программным способом.Одним из преимуществ будет автоматическое добавление индексов в среду Wiki.

Кто-нибудь смог это сделать?Язык не имеет значения, но ищите решение для сценариев.

Это было полезно?

Решение

Вики SharePoint - это просто особый тип библиотеки документов. Есть только несколько странностей, с которыми я сталкиваюсь, когда пытаюсь это сделать.

Вики-страница SharePoint состоит из файла шаблона и элемента списка. При просмотре страницы поля из элемента списка вставляются в файл шаблона. Таким образом, чтобы обновить страницу вики, вам просто нужно обновить правильные поля в элементе списка. (Между прочим, это также означает, что вы не можете получить исходный шаблон, как вы могли бы получить файл в обычной библиотеке документов. Пока что единственный способ получить сам шаблон - загрузить его через SharePoint Designer.)

Кроме того, SharePoint автоматически отображает содержимое вики при программном доступе к элементу списка. Поэтому мне так и не удалось получить контент, который содержал " [[My Link Name]], " например - SharePoint всегда будет возвращать визуализированный HTML, например:

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

Однако, немного поработав над регулярными выражениями, вы сможете преобразовать его обратно в исходный контент вики.

Другие советы

Да.Я разработал свой собственный API Metaweblog, который программно управляет вики-страницами в Sharepoint 2010 и 2007.

Мои источники:

Сервисный код для SP 2010 и 2007 практически идентичен, но есть несколько предостережений:

  • В 2010 году вам не нужно беспокоиться об управлении разметкой вики-ссылок (например,[[кронштейны]]).
  • В 2007 году вики-разметка преобразуется по вашему запросу, поэтому вам придется повторно преобразовать ее в вики-разметку, прежде чем отправлять ответ.Отправляя ответную публикацию, вы не могу используйте UpdateListItems, вы должны использовать службу копирования.Это связано с тем, что UpdateListItems обойдет любую вики-разметку, что фактически сделает ваши усилия бесполезными.
  • В нашей среде нам требуется Тип записи необходимо заполнить перед регистрацией.Может это стандарт?Если вы не зададите это поле, ваша страница останется для вас проверенной.Итак, у меня есть условие, которое устанавливает это поле для SP2007.
  • В 2010 году SP добавляет кучу разметки в необработанное значение WikiField, и если она отсутствует, это может испортить макеты.Я просто вставляю его вокруг значения, которое публикует WLW, а затем удаляю при получении.См. ниже.

Я использую службу копирования, как указано в первой ссылке, для создания И обновления вики-страниц.В 2010 году вы может используйте службу списков для обновления, но не для добавления.Я использую службу изображений для автоматической загрузки изображений в библиотеку изображений.

Вот функция для замены «ms-wikilinks» на вики-разметку:

Примечание: Я использую HTMLAgilityPack на случай, если возвращаемая разметка имеет неверный формат.Вы также можете использовать Regex для этого.Я также использую библиотеку Microsoft Anti-XSS 4.1 для очистки разметки.

Заметка 2: Моя функция UrlDecode не зависит от System.Web, взято отсюда.

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

Функция удаления HTML-кода 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;
}

Это прекрасно работает.

  • Страницы по-прежнему сохраняют последнего измененного и правильного пользователя.
  • Страницы сохранят всю свою историю
  • Страницами легче управлять

Я подумываю опубликовать свой API, код не так уж и велик, я думаю, он очень полезен для тех из нас, кто хочет лучше управлять нашими вики-сайтами Sharepoint.С WLW я получаю автоматическую загрузку изображений, лучшую поддержку редактирования HTML и поддержку таких плагинов, как PreCode Snippet.Это потрясающе!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top