Esempio n. 1
0
        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();
            }
        }
Esempio n. 3
0
        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(@"[\[", "[[");
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
 /// <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);
 }
Esempio n. 7
0
 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));
 }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
        /// <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);
        }
Esempio n. 10
0
 public void PreProcess(PreProcessorContext context)
 {
     var md = new Markdown { ExtraMode = true };
     context.Body = md.Transform(context.Body);
 }