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 @@
"); + 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