Frage

Ich mag meinen Sharepoint Wiki Inhalt programmatisch bearbeiten. Einer der Vorteile Indizes in die Wiki-Umgebung hinzugefügt werden automatisch wäre.

Hat jemand in der Lage gewesen, dies zu tun? Sprache spielt keine Rolle, aber auf der Suche nach Scripting-Lösung.

War es hilfreich?

Lösung

Ein Sharepoint-Wiki ist nur eine besondere Art der Dokumentbibliothek. Es gibt nur ein paar Merkwürdigkeiten Ich habe laufen in, wenn sie versuchen, dies zu tun.

Eine Sharepoint-Wiki-Seite besteht aus einer Vorlagendatei und ein Listenelement. Wenn Sie die Seite, die Felder aus dem Listenelement in die Template-Datei eingefügt. So eine Wiki-Seite zu aktualisieren, müssen Sie nur noch die richtigen Felder in der Liste Artikel aktualisieren. (Übrigens, das heißt auch nicht an der ursprünglichen Vorlage erhalten können wie in einem normalen Dokumentbibliothek eine Datei konnte. Bisher war die einzige Möglichkeit, die ich gefunden habe um die Vorlage zu bekommen selbst ist es durch Sharepoint Designer zum Download bereit.)

Auch macht Sharepoint automatisch die Wiki-Inhalte, wenn Sie den Listeneintrag zugreifen programmatisch. So war ich nie den Inhalt bekommen können, die enthalten „[[My Link-Name]]“ zum Beispiel - Sharepoint würde das gerenderte HTML immer zurückkehren stattdessen wie:

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

Mit einem wenig regex Arbeit sollten Sie in der Lage sein, diese wieder auf die ursprünglichen Wiki-Inhalte zu konvertieren, though.

Andere Tipps

Ja. Ich habe meine eigene MetaWeblog API gerollt, die programmatisch Wiki-Seiten in Sharepoint 2010 und 2007 verwaltet.

Meine Quellen:

Der Service-Code für beide SP 2010 und 2007 ist ziemlich identisch, aber es gibt ein paar Einschränkungen:

  • Im Jahr 2010 brauchen sich nicht um die Verwaltung von Wiki-Link-Markup (z [[Klammern]]).
  • Sorgen
  • Im Jahr 2007 Wiki-Markup wird auf Ihre Anfrage umgewandelt, so dass Sie sich wieder wandeln es in Wiki-Markup vor der Veröffentlichung zurück. Auf Entsendung zurück, du nicht Verwendung Updatelist, müssen Sie den Copy-Service. Dies liegt daran, Updatelist wird jeden Wiki-Markup entkommen, effektiv Ihre Bemühungen nutzlos zu machen.
  • In unserer Umgebung benötigen wir Record vor dem Check-in ausgefüllt werden. Vielleicht ist das Standard? Wenn Sie dieses Feld nicht gesetzt ist, wird Ihre Seite bleiben für Sie ausgecheckt. Also, ich habe eine Bedingung, die dieses Feld setzt für SP2007.
  • Im Jahr 2010 fügt SP eine Reihe von Markup im rohen WikiField Wert, und wenn es fehlt es könnte Layouts vermasseln. Ich lege es nur um den Wert WLW entsendet, dann auf immer Streifen aus. Siehe unten.

Ich verwende den Copy-Service wie in dem ersten Link, um die Wiki-Seiten zu erstellen und zu aktualisieren. Im Jahr 2010 Sie kann den Listen-Dienst verwenden zu aktualisieren, aber nicht hinzuzufügen. Ich verwende den Imaging-Service, um Bilder zu automatisch zu einer Bildbibliothek.

Hier ist eine Funktion, das "ms-WikiLinks" Wiki-Markup ersetzt werden:

Hinweis: Ich verwende den HTMLAgilityPack im Fall zurück das Markup ungültig ist. Sie könnten Regex verwenden, um dies zu tun. Ich auch Microsoft Anti-XSS 4.1-Bibliothek verwenden Markup zu sanieren.

Hinweis 2: Meine urldecode Funktion keine Abhängigkeit von System.Web nehmen, genommen von hier .

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

Die Funktion von Sharepoint HTML zu entfernen ist:

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

Und schließlich die Funktion, dass die Markierungen, um alle wieder ergänzt:

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

Dies funktioniert gut.

  • Seiten retain noch zuletzt geändert und korrekte Benutzer
  • Seiten werden alle Geschichte
  • behalten
  • Seiten sind einfacher zu verwalten

ich der Veröffentlichung meiner API denke, es ist nicht viel Code, den ich denke, ist super hilfreich für diejenigen von uns, die besser wollen unsere Sharepoint Wikis verwalten. Mit WLW erhalte ich Auto-Bild-Upload, eine bessere Bearbeitung von HTML-Unterstützung und Unterstützung für Plugins wie Precode Snippet. Es ist genial!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top