private List<WikiLink> BuildLinkList(PreProcessorContext context, MatchCollection regExLinks) { var wikiLinks = (from Match match in regExLinks select new WikiLink { PagePath = CreatePath(context.Page.PagePath, match.Groups[1].Value), Title = match.Groups[3].Value }).ToList(); var treeNodes = _repository.Find(wikiLinks.Select(x => x.PagePath).ToList()); foreach (var link in wikiLinks) { var node = treeNodes.FirstOrDefault(x => x.Path.Equals(link.PagePath)); if (node != null) { if (string.IsNullOrEmpty(link.Title)) link.Title = node.Page.Title; } link.Exists = node != null; } foreach (var link in wikiLinks) { if (string.IsNullOrEmpty(link.Title)) link.Title = link.PagePath.Name; } return wikiLinks; }
public void ReGeneratePages() { var session = SessionFactory.Create(); var repos = new PageTreeRepository(session); var pageRepos = new PageRepository(session); var locator = new Mock<IServiceLocator>(); locator.Setup(x => x.ResolveAll<IPostLoadProcessor>()).Returns(new IPostLoadProcessor[] { new ChildPageSection(pageRepos) }); locator.Setup(x => x.ResolveAll<ITextProcessor>()).Returns(new ITextProcessor[] { new MarkdownParser(), new WikiLinkProcessor(repos) }); locator.Setup(x => x.ResolveAll<IHtmlProcessor>()).Returns(new IHtmlProcessor[] { new HeadingProcessor() }); var pre = new PreProcessorService(locator.Object); var user = new UserRepository(session).GetOrCreate("BA84194", "Jonas Gauffin"); var myIdentity = new WikiIdentity(user); Thread.CurrentPrincipal = new WikiPrinicpal(myIdentity); using (var transaction = session.BeginTransaction()) { foreach (var page in pageRepos.FindAll()) { var ctx = new PreProcessorContext(page, page.RawBody); pre.Invoke(ctx); page.SetBody(ctx, "Changed to relative links", pageRepos); } transaction.Commit(); } }
public void PreProcess(PreProcessorContext context) { var regexLinks = Regex.Matches(context.Body, PageLinkRegEx); // Prescan to generate links var links = BuildLinkList(context, regexLinks); var lastPos = 0; var sb = new StringBuilder(context.Body.Length + 1000); var index = 0; foreach (Match match in regexLinks) { sb.Append(context.Body.Substring(lastPos, match.Index - lastPos)); var link = links[index]; if (!context.LinkedPages.Contains(link.PagePath)) context.LinkedPages.Add(link.PagePath); var htmlLink = CreateHtmlLink(context.Page.PagePath, link); sb.Append(htmlLink); lastPos = match.Index + match.Length; ++index; } sb.Append(context.Body.Substring(lastPos, context.Body.Length - lastPos)); context.Body = sb.ToString().Replace(@"[\[", "[["); }
/// <summary> /// Set the body to a specific revision /// </summary> /// <param name="repository"> Used to parse links </param> /// <param name="revision"> Revision ot use </param> /// <param name="result"> Result from body parsing </param> public virtual void SetRevision(IPageRepository repository, WikiPageRevision revision, PreProcessorContext result) { if (repository == null) throw new ArgumentNullException("repository"); if (revision == null) throw new ArgumentNullException("revision"); if (result == null) throw new ArgumentNullException("result"); UpdatedAt = revision.CreatedAt; UpdatedBy = revision.CreatedBy; RawBody = result.OriginalBody; HtmlBody = result.Body; DomainEvent.Publish(new PageUpdated(this)); UpdateLinksInternal(result, repository); }
private void UpdateLinksInternal(PreProcessorContext result, IPageRepository repository) { var added = result.LinkedPages.Except(References.Select(k => k.PagePath)).ToList(); if (added.Any()) { var pages = repository.GetPages(added); foreach (var page in pages) { page.BackReferences.Any(); // lazy load. page._backReferences.Add(this); } var missingPages = added.Except(pages.Select(x => x.PagePath)); repository.AddMissingLinks(this, missingPages); } var removed = References.Select(k => k.PagePath).Except(result.LinkedPages).ToList(); if (removed.Any()) RemoveBackLinks(removed); }
/// <summary> /// The body have been reparsed to reflect changed links. /// </summary> public virtual void UpdateLinks(PreProcessorContext result, IPageRepository repository) { //var result = Parser.Parse(PageName, RawBody); HtmlBody = result.Body; UpdateLinksInternal(result, repository); }
private void AddPendingRevision(PreProcessorContext result, string comment, IPageRepository repository) { var revision = new WikiPageRevision(this, WikiContext.Current.User, result, comment) {ReviewRequired = true}; repository.Save(revision); _revisions.Add(revision); DomainEvent.Publish(new RevisionModerationRequired(revision)); }
private void AddRevision(PreProcessorContext result, string comment, IPageRepository repository) { var isNew = !_revisions.Any(); UpdatedAt = DateTime.Now; UpdatedBy = WikiContext.Current.User; RawBody = result.OriginalBody; HtmlBody = result.Body; repository.Save(this); if (isNew) { DomainEvent.Publish(new PageCreated(this)); } else { DomainEvent.Publish(new PageUpdated(this)); } var revision = new WikiPageRevision(this, comment); revision.Approve(); repository.Save(revision); _revisions.Add(revision); }
/// <summary> /// Set the body information /// </summary> /// <param name="result"> Parsed body and found links </param> /// <param name="comment"> </param> /// <param name="repository"> Used to updat page relations </param> public virtual void SetBody(PreProcessorContext result, string comment, IPageRepository repository) { if (result == null) throw new ArgumentNullException("result"); if (Thread.CurrentPrincipal.IsInRole(WikiRole.User)) { AddRevision(result, comment, repository); } else { AddPendingRevision(result, comment, repository); } UpdateLinksInternal(result, repository); }
public void PreProcess(PreProcessorContext context) { var md = new Markdown { ExtraMode = true }; context.Body = md.Transform(context.Body); }