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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
10 635
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

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

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

Кто-нибудь придумал, как получить шаблон без конструктора sharepoint?

C. Ross 21.09.2009 17:42

Регулярное выражение для синтаксического анализа вики-ссылок было несложным; но это не работает наоборот. Если вы UpdateListItems и в своем WikiField оставите [[скобки]], SharePoint преобразует его в \ [[скобки] \], что меня совершенно ошеломляет. Я не могу понять, как этого избежать; если я вручную конвертирую ссылки, SharePoint с этого момента будет рассматривать их как ссылки (вместо необработанной разметки вики). Проигрыш-проиграл. В SP2010 это исправлено, и все работает нормально. Я пытаюсь заставить его работать в SP2007.

kamranicus 27.01.2011 08:08

Нашел решение. Вы можете использовать службу копирования для вставки и обновления, просто оставьте имя прежним. Затем он принимает разметку как необработанную разметку вики и работает должным образом. КЛАССНО!

kamranicus 27.01.2011 19:49

Да. Я развернул свой собственный 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. Это круто!

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