문제

SharePoint Wiki 콘텐츠를 프로그래밍 방식으로 편집하고 싶습니다. 장점 중 하나는 위키 환경에 자동으로 인덱스를 추가하는 것입니다.

누구든지 이것을 할 수 있었습니까? 언어는 중요하지 않지만 스크립팅 솔루션을 찾고 있습니다.

도움이 되었습니까?

해결책

SharePoint Wiki는 특별한 유형의 문서 라이브러리 일뿐입니다. 이 작업을 수행 할 때 제가 겪는 몇 가지 이상한 점이 있습니다.

SharePoint Wiki 페이지는 템플릿 파일과 목록 항목으로 구성됩니다. 페이지를 보면 목록 항목의 필드가 템플릿 파일에 삽입됩니다. 따라서 Wiki 페이지를 업데이트하려면 목록 항목의 올바른 필드를 업데이트하면됩니다. (우연히도, 그것은 또한 일반 문서 라이브러리에서 파일을 할 수있는 것처럼 원본 템플릿을 얻을 수 없다는 것을 의미합니다. 지금까지, 템플릿 자체를 얻는 유일한 방법은 SharePoint Designer를 통해 템플릿 자체를 다운로드하는 것입니다.)

또한 SharePoint는 프로그래밍 방식으로 목록 항목에 액세스 할 때 Wiki 컨텐츠를 자동으로 렌더링합니다. 따라서 [[My Link Name]],"포함 된 콘텐츠를 얻을 수 없었습니다.

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

약간의 정규식 작업을 통해 원래 위키 컨텐츠로 다시 변환 할 수 있어야합니다.

다른 팁

예. SharePoint 2010 및 2007에서 프로그래밍 방식으로 위키 페이지를 관리하는 MetaweBlog API를 출시했습니다.

내 출처 :

SP 2010과 2007의 서비스 코드는 거의 동일하지만 몇 가지 경고가 있습니다.

  • 2010 년에는 Wiki Link Markup (예 : [Brackets]]) 관리에 대해 걱정할 필요가 없습니다.
  • 2007 년에 Wiki Markup은 귀하의 요청에 따라 변환되므로 다시 게시하기 전에 Wiki Markup으로 다시 정리해야합니다. 다시 게시 할 때, 당신 할 수 없습니다 updateListItems를 사용하려면 사본 서비스를 사용해야합니다. UpdatEListItems가 Wiki 마크 업을 피할 것이기 때문에 노력을 효과적으로 쓸모 없게 만들기 때문입니다.
  • 우리 환경에서 우리는 필요합니다 레코드 타입 체크인하기 전에 채워야 할 것입니다. 아마도 이것은 표준일까요? 이 필드를 설정하지 않으면 귀하의 페이지가 귀하에게 체크 아웃됩니다. 따라서이 필드를 SP2007로 설정하는 조건부가 있습니다.
  • 2010 년 SP는 원시 위키 필드 값에 많은 마크 업을 추가하고 누락 된 경우 레이아웃을 엉망으로 만들 수 있습니다. WLW가 게시 한 값 주위에 삽입 한 다음 얻을 때 제거합니다. 아래를 참조하십시오.

첫 번째 링크에서와 같이 복사 서비스를 사용하여 Wiki 페이지를 작성하고 업데이트합니다. 2010 년에, 당신 ~할 수 있다 목록 서비스를 사용하여 업데이트하지만 추가하지 마십시오. 이미징 서비스를 사용하여 이미지를 사진 라이브러리에 자동으로 업로드합니다.

다음은 "MS-Wikilinks"를 Wiki Markup으로 바꾸는 기능입니다.

메모: 반환 된 마크 업이 잘못된 경우 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;
}

SharePoint의 HTML을 제거하는 기능은 다음과 같습니다.

/// <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 Wikis를 더 잘 관리하고자하는 사람들에게 도움이되는 코드는 많지 않습니다. WLW를 사용하면 자동 이미지 업로드, 더 나은 HTML 편집 지원 및 Precode Snippet과 같은 플러그인을 지원합니다. 그것은 굉장!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top