示例#1
0
        public IActionResult Document(Models.EditDocumentRequestModel requestModel)
        {
            requestModel.AccountId = HttpContext.Session.GetInt32("AccountId").GetValueOrDefault(0);

            if (requestModel.Title.Trim().Length <= 0)
            {
                return(APIReturnMethod.ReturnFailed("请输入文档标题"));
            }
            if (requestModel.Contents.Trim().Length <= 0)
            {
                return(APIReturnMethod.ReturnFailed("请输入文档内容"));
            }
            var repository = _unitOfWork.GetRepository <Entity.m_Docs>();

            Entity.m_Docs model = repository.Query().Where(q => q.DocsId == requestModel.DocsId).FirstOrDefault();
            if (model == null)
            {
                return(APIReturnMethod.ReturnFailed("您要编辑的文档内容信息不存在!"));
            }
            if (model.AccountId != requestModel.AccountId)
            {
                return(APIReturnMethod.ReturnFailed("您无权对当前的数据进行编辑操作!"));
            }
            model.Contents   = HtmlFilter.SanitizeHtml(requestModel.Contents);
            model.LastTime   = DateTime.Now;
            model.Title      = HtmlFilter.StripHtml(requestModel.Title);
            model.ShortTitle = HtmlFilter.StripHtml(requestModel.ShortTitle);

            repository.Update(model);
            var resultCount = _unitOfWork.SaveChanges();

            return(resultCount > 0 ? APIReturnMethod.ReturnSuccess() : APIReturnMethod.ReturnFailed());
        }
示例#2
0
        protected void Submit_Click(object sender, EventArgs args)
        {
            if (!IsAuthorized)
            {
                cvAuthorized.IsValid = false;
                return;
            }

            HtmlFilter filter = Engine.Resolve <HtmlFilter>();

            Items.WikiArticle article = CurrentPage;
            if (IsNew)
            {
                article       = Engine.Resolve <ContentActivator>().CreateInstance <Items.WikiArticle>(CurrentPage);
                article.Title = filter.StripHtml(CurrentArguments);
                article.Name  = filter.CleanUrl(CurrentArguments);
            }
            else
            {
                Engine.Resolve <IVersionManager>().SaveVersion(article);
            }
            article["SavedDate"]      = DateTime.Now;
            article["SavedByAddress"] = Request.UserHostAddress;
            article["Syndicatable"]   = CurrentPage.WikiRoot["Syndicatable"];
            article.Text = filter.FilterHtml(txtText.Text);
            Engine.Persister.Save(article);

            Response.Redirect(article.Url);
        }
示例#3
0
        public IActionResult Post([FromBody] Models.ThemeCreateRequestModel requestModel)
        {
            if (requestModel.Title.Trim().Length <= 0)
            {
                return(APIReturnMethod.ReturnFailed("请输入文档主题标题"));
            }
            if (requestModel.Contents.Trim().Length <= 0)
            {
                return(APIReturnMethod.ReturnFailed("请输入文档主题内容"));
            }
            Entity.m_DocsTheme model = new Entity.m_DocsTheme();
            model.AppendTime  = DateTime.Now;
            model.Contents    = HtmlFilter.SanitizeHtml(requestModel.Contents);
            model.IsShow      = true;
            model.LastTime    = DateTime.Now;
            model.PlusCount   = 0;
            model.ReadCount   = 0;
            model.Tags        = "";
            model.Title       = HtmlFilter.StripHtml(requestModel.Title);
            model.AccountId   = requestModel.AccountId;
            model.VersionText = "";
            var repository = _unitOfWork.GetRepository <Entity.m_DocsTheme>();

            repository.Insert(model);
            var resultCount = _unitOfWork.SaveChanges();

            return(resultCount > 0 ? APIReturnMethod.ReturnSuccess() : APIReturnMethod.ReturnFailed());
        }
示例#4
0
        public IActionResult Put([FromBody] Models.ThemeEditRequestModel requestModel)
        {
            if (requestModel.Title.Trim().Length <= 0)
            {
                return(APIReturnMethod.ReturnFailed("请输入文档主题标题"));
            }
            if (requestModel.Contents.Trim().Length <= 0)
            {
                return(APIReturnMethod.ReturnFailed("请输入文档主题内容"));
            }
            var repository = _unitOfWork.GetRepository <Entity.m_DocsTheme>();

            Entity.m_DocsTheme model = repository.Query().Where(q => q.ThemeId == requestModel.ThemeId).FirstOrDefault();
            if (model == null)
            {
                return(APIReturnMethod.ReturnFailed("您要编辑的文档主题信息不存在!"));
            }
            if (model.AccountId != requestModel.AccountId)
            {
                return(APIReturnMethod.ReturnFailed("您无权对当前的数据进行编辑操作!"));
            }
            model.Contents    = HtmlFilter.SanitizeHtml(requestModel.Contents);
            model.LastTime    = DateTime.Now;
            model.Title       = HtmlFilter.StripHtml(requestModel.Title);
            model.VersionText = "";

            repository.Update(model);
            var resultCount = _unitOfWork.SaveChanges();

            return(resultCount > 0 ? APIReturnMethod.ReturnSuccess() : APIReturnMethod.ReturnFailed());
        }
示例#5
0
        public IActionResult Index(Models.ReleaseRequestModel requestModel)
        {
            requestModel.AccountId = HttpContext.Session.GetInt32("AccountId").GetValueOrDefault(0);

            if (string.IsNullOrEmpty(requestModel.Title) || requestModel.Title == "")
            {
                return(APIReturnMethod.ReturnFailed("标题不能为空"));
            }
            if (string.IsNullOrEmpty(requestModel.Contents) || requestModel.Contents == "")
            {
                return(APIReturnMethod.ReturnFailed("内容不能为空"));
            }
            //
            Entity.m_CmsContents entity = new Entity.m_CmsContents();
            entity.Contents    = HtmlFilter.SanitizeHtml(requestModel.Contents);
            entity.ImgUrl      = string.Empty;
            entity.StateCode   = 1;
            entity.PostTime    = DateTime.Now;
            entity.PlusCount   = 0;
            entity.LastTime    = DateTime.Now;
            entity.Tags        = "";
            entity.ReadCount   = 0;
            entity.Title       = requestModel.Title;
            entity.AccountId   = requestModel.AccountId;
            entity.AnswerCount = 0;
            entity.ChannelId   = requestModel.ChannelId;
            var repository = _unitOfWork.GetRepository <Entity.m_CmsContents>();

            repository.Insert(entity);
            int resultCount = _unitOfWork.SaveChanges();

            return(resultCount > 0 ? APIReturnMethod.ReturnSuccess() : APIReturnMethod.ReturnFailed());
        }
示例#6
0
        public IActionResult Document(Models.DocsContentsCreateRequestModel requestModel)
        {
            requestModel.AccountId = HttpContext.Session.GetInt32("AccountId").GetValueOrDefault(0);
            if (requestModel.Title.Trim().Length <= 0)
            {
                return(APIReturnMethod.ReturnFailed("请输入文档标题"));
            }
            if (requestModel.Contents.Trim().Length <= 0)
            {
                return(APIReturnMethod.ReturnFailed("请输入文档内容"));
            }
            Entity.m_Docs model = new Entity.m_Docs();
            model.AppendTime  = DateTime.Now;
            model.Contents    = HtmlFilter.SanitizeHtml(requestModel.Contents);
            model.IsShow      = true;
            model.LastTime    = DateTime.Now;
            model.PlusCount   = 0;
            model.ReadCount   = 0;
            model.Tags        = "";
            model.Title       = HtmlFilter.StripHtml(requestModel.Title);
            model.AccountId   = requestModel.AccountId;
            model.VersionText = "";
            model.ThemeId     = requestModel.ThemeId;
            model.ShortTitle  = HtmlFilter.StripHtml(requestModel.ShortTitle);
            model.IsAudit     = true;
            var repository = _unitOfWork.GetRepository <Entity.m_Docs>();

            repository.Insert(model);
            var resultCount = _unitOfWork.SaveChanges();

            return(resultCount > 0 ? APIReturnMethod.ReturnSuccess() : APIReturnMethod.ReturnFailed());
        }
        public static void BubbleDeletedPopUp(Control control, String DeletedName)
        {
            DeletedName = HtmlFilter.StipTags(DeletedName);

            DeletedName += (String)HttpContext.GetGlobalResourceObject("Global", "BubbleDeletedString_Resource") + " " + "<a href = \"\"> X</a>";
            ScriptManager.RegisterStartupScript(control, typeof(string), "DeleteBubblePopup", String.Format("bubbleNotify('{0}');", DeletedName), true);
        }
示例#8
0
        public void testAllowedTags()
        {
            String input  = "这是多种<span>内容1</span>标签和<strong>内容2</strong>风格,还有<img src=\"\" />图片与<a href=\"abc.html\">链接</a>对吗?";
            String result = HtmlFilter.Filter(input, "strong");

            Assert.AreEqual("这是多种内容1标签和<strong>内容2</strong>风格,还有图片与链接对吗?", result);

            result = HtmlFilter.Filter(input, "img");
            Assert.AreEqual("这是多种内容1标签和内容2风格,还有<img src=\"\" />图片与链接对吗?", result);

            result = HtmlFilter.Filter(input, "a");
            Assert.AreEqual("这是多种内容1标签和内容2风格,还有图片与<a href=\"abc.html\">链接</a>对吗?", result);

            result = HtmlFilter.Filter(input, "img,a");
            Assert.AreEqual("这是多种内容1标签和内容2风格,还有<img src=\"\" />图片与<a href=\"abc.html\">链接</a>对吗?", result);

            // 对换行的测试
            result = HtmlFilter.Filter("这是多种内容1标签和<br>内容2风格", "br");
            Assert.AreEqual("这是多种内容1标签和<br>内容2风格", result);

            // TODO 这个测试不能通过
            //result = HtmlFilter.Filter( "这是多种内容1标签和<br/>内容2风格", "br" );
            //Assert.AreEqual( "这是多种内容1标签和<br/>内容2风格", result );


            result = HtmlFilter.Filter("这是多种内容1标签和<br  >内容2风格", "br");
            Assert.AreEqual("这是多种内容1标签和<br  >内容2风格", result);

            result = HtmlFilter.Filter("这是多种内容1标签和<br />内容2风格", "br");
            Assert.AreEqual("这是多种内容1标签和<br />内容2风格", result);

            result = HtmlFilter.Filter("这是<strong>多种</strong>内容1标签和<br>内容2风格", "strong");
            Assert.AreEqual("这是<strong>多种</strong>内容1标签和内容2风格", result);
        }
示例#9
0
        public void testStyle()
        {
            String input = @"<style id=""abc"">
.h1 {
	FONT-WEIGHT: bold; TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 22pt; MARGIN: 17pt 0cm 16.5pt; LINE-HEIGHT: 240%; TEXT-ALIGN: justify
}
.h2 {
	FONT-WEIGHT: bold; TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 16pt; MARGIN: 13pt 0cm; LINE-HEIGHT: 173%; TEXT-ALIGN: justify
}
.h3 {
	FONT-WEIGHT: bold; TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 16pt; MARGIN: 13pt 0cm; LINE-HEIGHT: 173%; TEXT-ALIGN: justify
}
.h1 {
	FONT-WEIGHT: bold; TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 22pt; MARGIN: 17pt 0cm 16.5pt; LINE-HEIGHT: 240%; TEXT-ALIGN: justify
}
.h2 {
	FONT-WEIGHT: bold; TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 16pt; MARGIN: 13pt 0cm; LINE-HEIGHT: 173%; TEXT-ALIGN: justify
}
.h3 {
	FONT-WEIGHT: bold; TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 16pt; MARGIN: 13pt 0cm; LINE-HEIGHT: 173%; TEXT-ALIGN: justify
}
</style>" + @"<P>  <FONT face=楷体_GB2312>从1990年至2000年期间,人文社会科学领域学术期刊的价格涨幅高达185.9%,科技和医学领域学术期刊价格涨幅分别达178.3%和184.3%。全球范围内出现的“期刊危机”,倒逼科技界提出一项全新的出版理念——“开放获取”。 </FONT></P> 
<P><FONT face=楷体_GB2312>  所谓“开放获取”(Open Access),是指科学研究信息在网络环境中,免费供公众自由获取。开放获取有两种实现形式:一为开放出版,即期刊或会议论文出版后立即开放获取;二是开放存储,即论文出版后存储到相关知识库,一段时间后开放获取。</FONT></P> ";

            String result = HtmlFilter.Filter(input);

            Console.WriteLine(result);
        }
示例#10
0
        public static void BubbleSavePopUp(Control control, String SavedName, int delayTime, int fadeOutTime)
        {
            SavedName = HtmlFilter.StipTags(SavedName);

            SavedName += (String)HttpContext.GetGlobalResourceObject("Global", "BubbleAddedString_Resource") + " " + "<a href = \"\"> X</a>";
            ScriptManager.RegisterStartupScript(control, typeof(string), "SaveBubblePopup", String.Format("bubbleNotifyCustomDelay('{0}', {1}, {2});", SavedName, delayTime, fadeOutTime), true);
        }
示例#11
0
        public void testTableTag()
        {
            String input = "<table></table>";
            String str   = HtmlFilter.Filter(input);

            Assert.AreEqual(input, str);

            input = "<table><tr><td>abc</td></tr></table>";
            str   = HtmlFilter.Filter(input);
            Assert.AreEqual(input, str);

            input = "<table ><tr ><td > abc </td></tr></table>";
            str   = HtmlFilter.Filter(input);
            Assert.AreEqual(input, str);

            input = "<table border=\"5\"><tr ><td > abc </td></tr></table>";
            str   = HtmlFilter.Filter(input);
            Assert.AreEqual(input, str);

            // 不在白名单的属性会被删除
            String newInput = "<table border=\"5\" data-new=\"88\"><tr ><td > abc </td></tr></table>";

            str = HtmlFilter.Filter(newInput);
            Assert.AreEqual(input, str);
        }
示例#12
0
        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            HtmlFilter filter = Engine.Resolve <HtmlFilter>();
            string     name   = filter.CleanUrl(txtName.Text);
            string     url    = Url.Parse(CurrentPage.WikiRoot.Url).AppendSegment(name);

            Response.Redirect(url);
        }
示例#13
0
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());

            XDocument myXDoc = XDocument.Load(HttpContext.Current.Server.MapPath("~/htmlfilter.xml"));
            XElement ele = myXDoc.Element("config");
            FilterXmlConfig filterXmlConfig = new FilterXmlConfig(ele);
            htmlFilter = new HtmlFilter(filterXmlConfig);
        }
示例#14
0
        public void HtmlFilter()
        {
            IHootFilter _filter = new HtmlFilter();
            String      _result;

            _filter.InitializeFilter(null);
            _result = _filter.FilterText(_htmlSource);
            Assert.AreEqual(_result.Replace("\r", ""), _htmlResult.Replace("\r", ""));
        }
示例#15
0
        public void testFilter()
        {
            String input = "这是脚本<script>引用了</script>内容";

            String result = HtmlFilter.Filter(input);

            Assert.AreEqual("这是脚本内容", result);

            Console.WriteLine(result);
        }
示例#16
0
        public void testAllowedFlash()
        {
            String input = "<object CLASSID=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"  data=\"http://player.youku.com/player.php/sid/XMTg0MTI0NjU2/v.swf\" type=\"application/x-shockwave-flash\" width=\"300\" height=\"255\"><param name=\"movie\" value =\"http://player.youku.com/player.php/sid/XMTg0MTI0NjU2/v.swf\" /></object>";
            String str   = HtmlFilter.Filter(input);

            Assert.AreEqual(input, str);

            input = "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0\" width=\"95\" height=\"360\">  <param name=\"movie\" value=\"a.swf\" />  <param name=\"quality\" value=\"high\" />  <embed src=\"a.swf\" quality=\"high\" pluginspage=\"http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash\" type=\"application/x-shockwave-flash\" width=\"300\" height=\"255\"></embed></object>";
            str   = HtmlFilter.Filter(input);
            Assert.AreEqual(input, str);
        }
示例#17
0
        public void testLink()
        {
            String str = "aaa<a href=\"xxx.html\">ccc</a>zzz";
            string val = HtmlFilter.Filter(str);

            Assert.AreEqual(val, str);

            str = "AAA<a href=\"XXX.html\">CCC</a>ZZZ";
            val = HtmlFilter.Filter(str);
            Assert.AreEqual(val, str);
        }
示例#18
0
        /// <summary>
        /// 在默认白名单的基础上,允许 allowedTags 中指定的tag
        /// </summary>
        /// <param name="postItem"></param>
        /// <param name="allowedTags"></param>
        /// <returns></returns>
        public String PostHtmlAppendTags(String postItem, String allowedTags)
        {
            String val = _context.post(postItem);

            if (val != null)
            {
                val = strUtil.TrimHtml(val);
                val = HtmlFilter.FilterAppendTags(val, allowedTags);
            }
            return(val);
        }
示例#19
0
 /// <summary>
 /// Removes non allowed tags from the string. Non allowed tags are defined in the <see cref="DefaultFilterRules"/> class.
 /// In this scenario we add the ability to allow the element img to have width and height
 /// </summary>
 /// <param name="input">A string that may contain html-tags.</param>
 /// <returns>
 /// The input washed from non allowed html-tags.
 /// </returns>
 public static string ToSafeString(this string input)
 {
     using (var inputStream = new StringReader(input))
         using (var outputStrean = new StringWriter())
         {
             DefaultFilterRules defaultRules = new DefaultFilterRules(elem => GetAttributesForElement(elem), new DefaultFilterRules());
             HtmlFilter         filter       = new HtmlFilter(defaultRules);
             filter.FilterHtml(inputStream, outputStrean);
             return(outputStrean.ToString());
         }
 }
示例#20
0
        /// <summary>
        /// 获取客户端 post 的 html,结果已被过滤,只允许 allowedTags 中指定的 tag
        /// </summary>
        /// <param name="postItem"></param>
        /// <param name="allowedTags">允许的tag,包括属性列表</param>
        /// <returns></returns>
        public String PostHtml(String postItem, Dictionary <String, String> allowedTags)
        {
            String val = _context.post(postItem);

            if (val != null)
            {
                val = strUtil.TrimHtml(val);
                val = HtmlFilter.Filter(val, allowedTags);
            }
            return(val);
        }
示例#21
0
        public static void BubbleNotify(Control control, string description, bool addCloseButton)
        {
            description = HtmlFilter.StipTags(description);

            // add close button
            if (addCloseButton)
            {
                description = string.Format("{0} <a href = \"\">X</a>", description);
            }

            ScriptManager.RegisterStartupScript(control, typeof(string), "bubbleNotification",
                                                string.Format("bubbleNotify('{0}');", description), true);
        }
示例#22
0
        public void testAllowedTags()
        {
            String input  = "这是多种<span>内容1</span>标签和<strong>内容2</strong>风格,还有<img src=\"\" />图片与<a href=\"abc.html\">链接</a>对吗?";
            String result = HtmlFilter.Filter(input, "strong");

            Assert.AreEqual("这是多种内容1标签和<strong>内容2</strong>风格,还有图片与链接对吗?", result);

            result = HtmlFilter.Filter(input, "img");
            Assert.AreEqual("这是多种内容1标签和内容2风格,还有<img src=\"\" />图片与链接对吗?", result);

            result = HtmlFilter.Filter(input, "a");
            Assert.AreEqual("这是多种内容1标签和内容2风格,还有图片与<a href=\"abc.html\">链接</a>对吗?", result);

            result = HtmlFilter.Filter(input, "img,a");
            Assert.AreEqual("这是多种内容1标签和内容2风格,还有<img src=\"\" />图片与<a href=\"abc.html\">链接</a>对吗?", result);

            // 对换行的测试
            result = HtmlFilter.Filter("这是多种内容1标签和<br>内容2风格", "br");
            Assert.AreEqual("这是多种内容1标签和<br>内容2风格", result);

            result = HtmlFilter.Filter("这是多种内容1标签和<br  >内容2风格", "br");
            Assert.AreEqual("这是多种内容1标签和<br  >内容2风格", result);

            result = HtmlFilter.Filter("这是多种内容1标签和<br />内容2风格", "br");
            Assert.AreEqual("这是多种内容1标签和<br />内容2风格", result);

            result = HtmlFilter.Filter("这是多种内容1标签和<br/>内容2风格", "br");
            Assert.AreEqual("这是多种内容1标签和<br/>内容2风格", result);

            result = HtmlFilter.Filter("这是<strong>多种</strong>内容1标签和<br>内容2风格", "strong");
            Assert.AreEqual("这是<strong>多种</strong>内容1标签和内容2风格", result);

            //-----------------------------------------

            input  = "文字<style>div{color:red;}</style>内容";
            result = HtmlFilter.Filter(input, "style");
            Assert.AreEqual(input, result);

            Dictionary <String, String> dic = new Dictionary <String, String>();

            dic.Add("script", "src");
            input  = "文字<script src=\"aa\">some code</script>内容";
            result = HtmlFilter.Filter(input, dic);
            Assert.AreEqual(input, result);

            dic = new Dictionary <String, String>();
            dic.Add("script", "src");   // 没有的属性会被过滤
            input  = "文字<script src=\"aa\" xdata=99>some code</script>内容";
            result = HtmlFilter.Filter(input, dic);
            Assert.AreEqual("文字<script src=\"aa\">some code</script>内容", result);
        }
示例#23
0
        public void testBase()
        {
            String input = "这是脚本<script>引用了</script>内容";

            String result = HtmlFilter.Filter(input);

            Assert.AreEqual("这是脚本内容", result);

            Console.WriteLine(result);

            input  = "<P>  <FONT face=楷体_GB2312>从1990年至2000年期间 </FONT></P> ";
            result = HtmlFilter.Filter(input);   // 过滤之后,会给属性加上引号
            Assert.AreEqual("<P>  <FONT face=\"楷体_GB2312\">从1990年至2000年期间 </FONT></P> ", result);
        }
示例#24
0
        /// <summary>
        /// 获取客户端 post 的 html,结果已被过滤,只有在白名单中的 tag 才被允许
        /// </summary>
        /// <param name="postItem"></param>
        /// <returns></returns>
        public String PostHtml(String postItem)
        {
            String val = _context.post(postItem);

            if (val != null)
            {
                if (this.viewer != null && this.viewer.IsAdministrator())
                {
                    return(val);
                }
                val = strUtil.TrimHtml(val);
                val = HtmlFilter.Filter(val);
            }
            return(val);
        }
示例#25
0
        public void testComment()
        {
            // 默认是允许注释的

            String input = "<ul><!-- BEGIN list --><li>这是注释</li><!-- END list --></ul>";

            String result = HtmlFilter.Filter(input);

            Assert.AreEqual("<ul><!-- BEGIN list --><li>这是注释</li><!-- END list --></ul>", result);

            input = "<!--abcd<script>alert( 'abcd' );</script>123-->";

            result = HtmlFilter.Filter(input);
            Assert.AreEqual("<!--abcd123-->", result);
        }
示例#26
0
        protected string getMatchedBody(string page, SpiderTemplate s, StringBuilder sb)
        {
            Match match = Regex.Match(page, s.GetDetailPattern(), RegexOptions.Singleline);

            if (match == null || !match.Success || string.IsNullOrEmpty(match.Value))
            {
                logInfo("error=没有匹配的页面内容:" + _url, this._url, s, sb);
                return(null);
            }

            page = match.Groups[1].Value;

            String fpage = HtmlFilter.Filter(page);   // 过滤广告

            return(fpage);
        }
        private async void BtnCompare_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // First load the html into a document objects we can manipulate
                string html1 = await File.ReadAllTextAsync("Resources/bbc1.html");

                HtmlDocument doc1 = new HtmlDocument();
                doc1.LoadHtml(html1);

                string html2 = await File.ReadAllTextAsync("Resources/bbc2.html");

                HtmlDocument doc2 = new HtmlDocument();
                doc2.LoadHtml(html2);

                // Filter the html to remove parts that are not very interesting
                HtmlFilter filter = new HtmlFilter();
                filter.CleanHtml(doc1.DocumentNode);
                filter.CleanHtml(doc2.DocumentNode);

                // convert the html into lines
                HtmlConverter converter = new HtmlConverter();
                var           lines1    = converter.GetLines(doc1.DocumentNode, ConvertOptions.Default);
                var           lines2    = converter.GetLines(doc2.DocumentNode, ConvertOptions.Default);

                // find the difference between these 2 sets of lines
                LineDiffer differ     = new LineDiffer();
                var        diffResult = differ.GetDiff(lines1, lines2, true);

                // load the original html into a document again
                HtmlDocument originalDoc = new HtmlDocument();
                originalDoc.LoadHtml(html1);

                // highlight the changed parts of the document
                Highlighter.ApplyHighlights(originalDoc, "#FFFF99", diffResult.Added.Select(i => i.Line.XPath));

                string htmlHighlighted = originalDoc.Save();

                webBrowserDiff.NavigateToString(htmlHighlighted);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
示例#28
0
        public void testScriptAndIFrame()
        {
            string val = HtmlFilter.Filter("国灭亡论,是中国人就得看!!!——日本宣称将于2015年灭亡中国。本文并非在下所写,只是基于一个爱国者的心,将此文贴于此。(这是一个在日本人气极旺的帖子,感谢一位不知名的网友,翻译过来。本着“奇文共欣赏,疑义相与析”的原则,转载过来是给大家一个对“日本”这个禽兽国度清醒的");

            Assert.AreEqual(val, target);

            val = HtmlFilter.Filter("国灭亡论,是中国人就得看!!!——日本宣称将于2015年灭亡中国。本文并非在下所写,只是基于一个爱国者的心,将此文贴于此。(这是<script> alert(  'kkkkk'); </script>一个在日本人气极旺的帖子,感谢一位不知名的网友,翻译过来。本着“奇文共欣赏,疑义相与析”的原则,转载过来是给大家一个对“日本”这个禽兽国度清醒的");
            Assert.AreEqual(val, target);

            val = HtmlFilter.Filter("国灭亡论,是中国人就得看!!!——日本宣称将于2015年灭亡中国。本文并非在下所写,只是基于一个爱国者的心,将此文贴于此。(这是<iframe src=abc.php width=500> </iframe>一个在日本人气极旺的帖子,感谢一位不知名的网友,翻译过来。本着“奇文共欣赏,疑义相与析”的原则,转载过来是给大家一个对“日本”这个禽兽国度清醒的");
            Assert.AreEqual(val, target);

            val = HtmlFilter.Filter("国灭亡论,是中国人就得看!!!——日本宣称将于2015年灭亡中国。本文并非在下所写,只是基于一个爱国者的心,将此文贴于此。(这是<scRIPT> alert(  'kkkkk'); </SCRIPT>一个在日本人气极旺的帖子,感谢一位不知名的网友,翻译过来。本着“奇文共欣赏,疑义相与析”的原则,转载过来是给大家一个对“日本”这个禽兽国度清醒的");
            Assert.AreEqual(val, target);

            val = HtmlFilter.Filter("国灭亡论,是中国人就得看!!!——日本宣称将于2015年灭亡中国。本文并非在下所写,只是基于一个爱国者的心,将此文贴于此。(这是<ifRAme src=abc.php width=500> </IfRAMe>一个在日本人气极旺的帖子,感谢一位不知名的网友,翻译过来。本着“奇文共欣赏,疑义相与析”的原则,转载过来是给大家一个对“日本”这个禽兽国度清醒的");
            Assert.AreEqual(val, target);
        }
示例#29
0
        public static bool ValidateFilter(this HtmlFilter filter, out string error)
        {
            error = null;

            switch (filter.Type)
            {
            case HtmlFilterType.Regex:
                try
                {
                    // ReSharper disable once ObjectCreationAsStatement
                    new Regex(filter.Filter);

                    return(true);
                }
                catch (Exception ex)
                {
                    error = ex.Message;
                }

                return(false);

            case HtmlFilterType.XPath:
                try
                {
                    XPathExpression.Compile(filter.Filter);

                    return(true);
                }
                catch (Exception ex)
                {
                    error = ex.Message;
                }

                return(false);

            default:
                throw new NotImplementedException("Invalid filter type");
            }
        }
示例#30
0
        public ActionResult GetContent(HtmlFilter hf, int?page)
        {
            Html html = new Html();

            if (hf.DivId == null)
            {
                hf.DivId = "list_middle";
            }
            if (page == 1 || page == 0 || page == null)
            {
                html.contentList = GetFilteredContent(hf.URL, hf.Keyword, hf.DivId);
            }
            else if (page > 0 && page > 1)
            {
                html.contentList = GetFilteredContent(hf.URL, hf.Keyword, hf.DivId);
                for (int i = 1; i <= page; i++)
                {
                    hf.URL = "http://www.sydneytoday.com/job_information?page=" + i;
                    html.contentList.AddRange(GetFilteredContent(hf.URL, hf.Keyword, hf.DivId));
                }
            }

            return(View(html));
        }
示例#31
0
        public static string Filter(this HtmlFilter filter, string content)
        {
            switch (filter.Type)
            {
            case HtmlFilterType.Regex:
                var filteredContents = new List <string>();
                var regex            = new Regex(filter.Filter, RegexOptions.Singleline);
                var matches          = regex.Matches(content);

                for (int i = 0; i < matches.Count; i++)
                {
                    var match = matches[i];

                    if (match.Success == false)
                    {
                        continue;
                    }

                    for (int j = 1; j < match.Groups.Count; j++)
                    {
                        filteredContents.Add(match.Groups[j].Value);
                    }
                }

                if (filteredContents.Any() == false)
                {
                    return(null);
                }

                content = string.Join("\r\n", filteredContents);
                break;

            case HtmlFilterType.XPath:
                try
                {
                    HtmlDocument htmlDoc = new HtmlDocument();
                    htmlDoc.LoadHtml(content);

                    filteredContents = htmlDoc.DocumentNode
                                       .SelectNodes(filter.Filter)
                                       ?.Select(n => n.OuterHtml)
                                       .ToList();

                    // ReSharper disable once ConditionIsAlwaysTrueOrFalse
                    if (filteredContents == null || filteredContents.Any() == false)
                    {
                        return(null);
                    }

                    content = string.Join("\r\n", filteredContents);
                }
                catch (Exception ex)
                {
                    LogTo.Error(ex, $"Invalid XPath filter '{filter}'");
                    throw;
                }
                break;

            default:
                throw new NotImplementedException($"Feed filter type {filter.Type} not implemented");
            }

            if (filter.Children.Any())
            {
                var subContents = filter.Children.Select(f => f.Filter(content)).ToList();

                if (subContents.Any() == false)
                {
                    return(null);
                }

                return(string.Join("\r\n", subContents));
            }

            return(content);
        }