From 9f38b13c20bcafcbf4cd891a91614a3065a4e466 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 28 Dec 2011 20:22:08 +0000 Subject: [PATCH] Do not generate html folds in ASP.NET for elements that exist on a single line. --- .../Project/Src/Folding/CharacterReader.cs | 5 ++ .../Project/Src/Folding/HtmlElementFold.cs | 6 +-- .../Project/Src/Folding/HtmlFoldParser.cs | 12 ++++- .../Project/Src/Folding/HtmlReader.cs | 13 ++++- .../AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj | 1 + .../Test/Src/Folding/HtmlReaderTests.cs | 47 +++++++++++++++++++ .../Src/Folding/RazorHtmlFoldParserTests.cs | 5 +- .../Folding/WebFormsHtmlFoldParserTests.cs | 9 ++++ 8 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/HtmlReaderTests.cs diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CharacterReader.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CharacterReader.cs index cd27ad66de..e1da45673a 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CharacterReader.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CharacterReader.cs @@ -100,5 +100,10 @@ namespace ICSharpCode.AspNet.Mvc.Folding { return reader.Peek() == '%'; } + + public bool IsLineFeed() + { + return CurrentCharacter == '\n'; + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlElementFold.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlElementFold.cs index c7f3bc876a..2b21e16781 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlElementFold.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlElementFold.cs @@ -10,10 +10,6 @@ namespace ICSharpCode.AspNet.Mvc.Folding { string elementName = String.Empty; - public HtmlElementFold() - { - } - public string ElementName { get { return elementName; } set { @@ -27,6 +23,8 @@ namespace ICSharpCode.AspNet.Mvc.Folding Name = String.Format("<{0}>", elementName); } + public int Line { get; set; } + public override bool Equals(object obj) { var rhs = obj as HtmlElementFold; diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlFoldParser.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlFoldParser.cs index fe1e7f1733..c4d835c66e 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlFoldParser.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlFoldParser.cs @@ -51,7 +51,8 @@ namespace ICSharpCode.AspNet.Mvc.Folding { var fold = new HtmlElementFold() { ElementName = htmlReader.Value, - StartOffset = htmlReader.Offset + StartOffset = htmlReader.Offset, + Line = htmlReader.Line }; foldStack.Push(fold); } @@ -62,13 +63,20 @@ namespace ICSharpCode.AspNet.Mvc.Folding var fold = foldStack.Pop(); if (fold.ElementName == htmlReader.Value) { fold.EndOffset = htmlReader.EndOffset; - folds.Add(fold); + AddFoldIfEndElementOnDifferentLineToStartElement(fold); } else { AddFoldForCompletedElement(); } } } + void AddFoldIfEndElementOnDifferentLineToStartElement(HtmlElementFold fold) + { + if (htmlReader.Line > fold.Line) { + folds.Add(fold); + } + } + void SortFoldsByStartOffset() { folds.Sort((fold1, fold2) => fold1.StartOffset.CompareTo(fold2.StartOffset)); diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlReader.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlReader.cs index 368715e9d9..3ef020593f 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlReader.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlReader.cs @@ -24,6 +24,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding public HtmlReader(CharacterReader reader) { this.reader = reader; + this.Line = 1; } public string Value { @@ -32,6 +33,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding public int Offset { get; private set; } public int Length { get; private set; } + public int Line { get; private set; } public int EndOffset { get { return Offset + Length; } @@ -77,7 +79,16 @@ namespace ICSharpCode.AspNet.Mvc.Folding bool ReadNextCharacter() { - return reader.Read(); + bool result = reader.Read(); + UpdateLineCountIfNewLineCharacterRead(); + return result; + } + + void UpdateLineCountIfNewLineCharacterRead() + { + if (reader.IsLineFeed()) { + Line++; + } } bool IsElementStartCharacter() diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj index 4c8bd35dc3..dc6a520b81 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj @@ -113,6 +113,7 @@ + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/HtmlReaderTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/HtmlReaderTests.cs new file mode 100644 index 0000000000..c1dc9894fd --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/HtmlReaderTests.cs @@ -0,0 +1,47 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.AspNet.Mvc.Folding; +using NUnit.Framework; + +namespace AspNet.Mvc.Tests.Folding +{ + [TestFixture] + public class HtmlReaderTests + { + HtmlReader reader; + + void CreateReader(string html) + { + reader = new HtmlReader(html); + } + + [Test] + public void Line_ReadParagraphStartTagOnFirstLine_ReturnsOne() + { + CreateReader("

"); + reader.Read(); + + int line = reader.Line; + + Assert.AreEqual(1, line); + } + + [Test] + public void Line_ReadParagraphEndTagOnSecondLine_ReturnsTwo() + { + string html = + "

\r\n" + + "

\r\n"; + + CreateReader(html); + reader.Read(); + reader.Read(); + + int line = reader.Line; + + Assert.AreEqual(2, line); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/RazorHtmlFoldParserTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/RazorHtmlFoldParserTests.cs index c15e44eabd..68b8b9aa43 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/RazorHtmlFoldParserTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/RazorHtmlFoldParserTests.cs @@ -57,7 +57,8 @@ namespace AspNet.Mvc.Tests.Folding string text = "@if (ii) {\r\n" + " \r\n" + - "

\r\n" + + "

\r\n" + + "

\r\n" + "}\r\n"; GetFolds(text); @@ -66,7 +67,7 @@ namespace AspNet.Mvc.Tests.Folding new HtmlElementFold() { ElementName = "p", StartOffset = 34, - EndOffset = 41 + EndOffset = 47 } }; diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/WebFormsHtmlFoldParserTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/WebFormsHtmlFoldParserTests.cs index c136fe84f7..52df471bfb 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/WebFormsHtmlFoldParserTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/WebFormsHtmlFoldParserTests.cs @@ -177,5 +177,14 @@ namespace AspNet.Mvc.Tests.Folding CollectionAssert.AreEqual(expectedFolds, folds); } + + [Test] + public void GetFolds_ScriptStartAndEndTagsOnSameLine_ReturnsNoFolds() + { + CreateParser(); + GetFolds(""); + + Assert.AreEqual(0, folds.Count); + } } } \ No newline at end of file