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





Вики-страницы SharePoint - это просто особый тип библиотеки документов. Есть всего несколько странностей, с которыми я столкнулся, пытаясь это сделать.
Вики-страница SharePoint состоит из файла шаблона и элемента списка. При просмотре страницы поля из элемента списка вставляются в файл шаблона. Итак, чтобы обновить вики-страницу, вам просто нужно обновить правильные поля в элементе списка. (Кстати, это также означает, что вы не можете получить исходный шаблон, как файл в обычной библиотеке документов. Пока что единственный способ получить сам шаблон, который я нашел, - это загрузить его через SharePoint Designer.)
Кроме того, SharePoint автоматически отображает содержимое вики при программном доступе к элементу списка. Таким образом, мне никогда не удавалось получить контент, содержащий, например, «[[My Link Name]]» - вместо этого SharePoint всегда возвращал отрисованный HTML, например:
<A class=ms-wikilink href = "/MyWikiLibrary/MyLinkName.aspx">My Link Name</A>
Однако, немного поработав с регулярными выражениями, вы сможете преобразовать это обратно в исходное содержимое вики.
Регулярное выражение для синтаксического анализа вики-ссылок было несложным; но это не работает наоборот. Если вы UpdateListItems и в своем WikiField оставите [[скобки]], SharePoint преобразует его в \ [[скобки] \], что меня совершенно ошеломляет. Я не могу понять, как этого избежать; если я вручную конвертирую ссылки, SharePoint с этого момента будет рассматривать их как ссылки (вместо необработанной разметки вики). Проигрыш-проиграл. В SP2010 это исправлено, и все работает нормально. Я пытаюсь заставить его работать в SP2007.
Нашел решение. Вы можете использовать службу копирования для вставки и обновления, просто оставьте имя прежним. Затем он принимает разметку как необработанную разметку вики и работает должным образом. КЛАССНО!
Да. Я развернул свой собственный API Metaweblog, который программно управляет вики-страницами в Sharepoint 2010 и 2007.
Мои источники:
Сервисный код для SP 2010 и 2007 практически идентичен, но есть несколько предостережений:
Я использую службу копирования, как в первой ссылке, для создания И обновления страниц вики. В 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. Это круто!
Кто-нибудь придумал, как получить шаблон без конструктора sharepoint?