Domanda

Vorrei modificare il mio contenuto di Sharepoint Wiki a livello di codice. Uno dei vantaggi sarebbe quello di aggiungere automaticamente indici all'ambiente Wiki.

Qualcuno è stato in grado di farlo? La lingua non ha importanza, ma è alla ricerca di una soluzione di scripting.

È stato utile?

Soluzione

Un wiki di SharePoint è solo un tipo speciale di raccolta documenti. Ci sono solo alcune stranezze che ho incontrato quando ho provato a farlo.

Una pagina wiki di SharePoint è costituita da un file modello e da un elemento dell'elenco. Quando si visualizza la pagina, i campi della voce di elenco vengono inseriti nel file modello. Quindi, per aggiornare una pagina wiki, devi solo aggiornare i campi corretti nella voce di elenco. (Per inciso, ciò significa anche che non è possibile ottenere il modello originale come se fosse un file in una normale raccolta documenti. Finora, l'unico modo che ho trovato per ottenere il modello stesso è scaricarlo tramite SharePoint Designer.)

Inoltre, SharePoint esegue automaticamente il rendering del contenuto del wiki quando si accede all'elemento dell'elenco a livello di codice. Pertanto, non sono mai stato in grado di ottenere il contenuto che conteneva " [[My Link Name]], " ad esempio, SharePoint restituisce sempre l'HTML renderizzato, ad esempio:

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

Con un po 'di lavoro regex dovresti essere in grado di riconvertirlo nel contenuto wiki originale.

Altri suggerimenti

Sì. Ho creato la mia API Metaweblog che gestisce in modo programmatico le pagine wiki in Sharepoint 2010 e 2007.

Le mie fonti:

Il codice di servizio sia per SP 2010 che per il 2007 è praticamente identico, ma ci sono alcuni avvertimenti:

  • Nel 2010, non è necessario preoccuparsi della gestione del markup del collegamento wiki (ad esempio [[parentesi]]).
  • Nel 2007, il markup wiki viene convertito su richiesta, quindi è necessario riconvertirlo in markup Wiki prima di postare indietro. Al momento della pubblicazione, non puoi utilizzare UpdateListItems, devi utilizzare il servizio Copia. Questo perché UpdateListItems sfuggirà a qualsiasi markup wiki, rendendo effettivamente inutili i tuoi sforzi.
  • Nel nostro ambiente, abbiamo bisogno di RecordType da compilare prima del check-in. Forse questo è standard? Se non imposti questo campo, la tua pagina rimarrà estratta da te. Quindi, ho un condizionale che imposta questo campo per SP2007.
  • Nel 2010, SP aggiunge un sacco di markup al valore grezzo di WikiField e, se manca, potrebbe rovinare i layout. Lo inserisco solo attorno al valore che WLW sta pubblicando, quindi lo rimuovo per ottenere. Vedi sotto.

Uso il servizio Copia come nel primo link per creare E aggiornare le pagine wiki. Nel 2010, puoi utilizzare il servizio Elenchi per aggiornare, ma non per aggiungere. Uso il servizio di imaging per caricare automaticamente le immagini in una libreria di immagini.

Ecco una funzione per sostituire " ms-wikilinks " al markup wiki:

Nota: utilizzo HTMLAgilityPack nel caso in cui il markup restituito non sia corretto. Puoi usare anche Regex per farlo. Uso anche la libreria Microsoft Anti-XSS 4.1 per disinfettare il markup.

Nota 2: la funzione My UrlDecode non dipende da System.Web, tratto da qui .

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

La funzione per eliminare l'HTML di 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;
    }
}

E infine, la funzione che aggiunge nuovamente quel markup:

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

Funziona benissimo.

  • Le pagine conservano ancora l'ultimo utente modificato e corretto
  • Le pagine manterranno tutta la loro cronologia
  • Le pagine sono più facili da gestire

Sto pensando di pubblicare la mia API, non è un sacco di codice che ritengo estremamente utile per quelli di noi che vogliono gestire meglio i nostri wiki di Sharepoint. Con WLW ottengo il caricamento automatico delle immagini, un migliore supporto per l'editing HTML e supporto per plug-in come Snippet pre-codice. È fantastico!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top