Browse Source

Do not generate html folds in ASP.NET for elements that exist on a single line.

pull/18/head
Matt Ward 14 years ago
parent
commit
9f38b13c20
  1. 5
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CharacterReader.cs
  2. 6
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlElementFold.cs
  3. 12
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlFoldParser.cs
  4. 13
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlReader.cs
  5. 1
      src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj
  6. 47
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/HtmlReaderTests.cs
  7. 5
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/RazorHtmlFoldParserTests.cs
  8. 9
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/WebFormsHtmlFoldParserTests.cs

5
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CharacterReader.cs

@ -100,5 +100,10 @@ namespace ICSharpCode.AspNet.Mvc.Folding
{ {
return reader.Peek() == '%'; return reader.Peek() == '%';
} }
public bool IsLineFeed()
{
return CurrentCharacter == '\n';
}
} }
} }

6
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlElementFold.cs

@ -10,10 +10,6 @@ namespace ICSharpCode.AspNet.Mvc.Folding
{ {
string elementName = String.Empty; string elementName = String.Empty;
public HtmlElementFold()
{
}
public string ElementName { public string ElementName {
get { return elementName; } get { return elementName; }
set { set {
@ -27,6 +23,8 @@ namespace ICSharpCode.AspNet.Mvc.Folding
Name = String.Format("<{0}>", elementName); Name = String.Format("<{0}>", elementName);
} }
public int Line { get; set; }
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
var rhs = obj as HtmlElementFold; var rhs = obj as HtmlElementFold;

12
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlFoldParser.cs

@ -51,7 +51,8 @@ namespace ICSharpCode.AspNet.Mvc.Folding
{ {
var fold = new HtmlElementFold() { var fold = new HtmlElementFold() {
ElementName = htmlReader.Value, ElementName = htmlReader.Value,
StartOffset = htmlReader.Offset StartOffset = htmlReader.Offset,
Line = htmlReader.Line
}; };
foldStack.Push(fold); foldStack.Push(fold);
} }
@ -62,13 +63,20 @@ namespace ICSharpCode.AspNet.Mvc.Folding
var fold = foldStack.Pop(); var fold = foldStack.Pop();
if (fold.ElementName == htmlReader.Value) { if (fold.ElementName == htmlReader.Value) {
fold.EndOffset = htmlReader.EndOffset; fold.EndOffset = htmlReader.EndOffset;
folds.Add(fold); AddFoldIfEndElementOnDifferentLineToStartElement(fold);
} else { } else {
AddFoldForCompletedElement(); AddFoldForCompletedElement();
} }
} }
} }
void AddFoldIfEndElementOnDifferentLineToStartElement(HtmlElementFold fold)
{
if (htmlReader.Line > fold.Line) {
folds.Add(fold);
}
}
void SortFoldsByStartOffset() void SortFoldsByStartOffset()
{ {
folds.Sort((fold1, fold2) => fold1.StartOffset.CompareTo(fold2.StartOffset)); folds.Sort((fold1, fold2) => fold1.StartOffset.CompareTo(fold2.StartOffset));

13
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlReader.cs

@ -24,6 +24,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding
public HtmlReader(CharacterReader reader) public HtmlReader(CharacterReader reader)
{ {
this.reader = reader; this.reader = reader;
this.Line = 1;
} }
public string Value { public string Value {
@ -32,6 +33,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding
public int Offset { get; private set; } public int Offset { get; private set; }
public int Length { get; private set; } public int Length { get; private set; }
public int Line { get; private set; }
public int EndOffset { public int EndOffset {
get { return Offset + Length; } get { return Offset + Length; }
@ -77,7 +79,16 @@ namespace ICSharpCode.AspNet.Mvc.Folding
bool ReadNextCharacter() bool ReadNextCharacter()
{ {
return reader.Read(); bool result = reader.Read();
UpdateLineCountIfNewLineCharacterRead();
return result;
}
void UpdateLineCountIfNewLineCharacterRead()
{
if (reader.IsLineFeed()) {
Line++;
}
} }
bool IsElementStartCharacter() bool IsElementStartCharacter()

1
src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj

@ -113,6 +113,7 @@
<Compile Include="Src\CodeTemplates\RazorCSharpEmptyViewTemplateTests.cs" /> <Compile Include="Src\CodeTemplates\RazorCSharpEmptyViewTemplateTests.cs" />
<Compile Include="Src\CodeTemplates\RazorCSharpListViewTemplateTests.cs" /> <Compile Include="Src\CodeTemplates\RazorCSharpListViewTemplateTests.cs" />
<Compile Include="Src\Folding\CharacterReaderTests.cs" /> <Compile Include="Src\Folding\CharacterReaderTests.cs" />
<Compile Include="Src\Folding\HtmlReaderTests.cs" />
<Compile Include="Src\Folding\RazorHtmlFoldParserTests.cs" /> <Compile Include="Src\Folding\RazorHtmlFoldParserTests.cs" />
<Compile Include="Src\Folding\HtmlElementFoldTests.cs" /> <Compile Include="Src\Folding\HtmlElementFoldTests.cs" />
<Compile Include="Src\Folding\RazorHtmlReaderTests.cs" /> <Compile Include="Src\Folding\RazorHtmlReaderTests.cs" />

47
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("<p>");
reader.Read();
int line = reader.Line;
Assert.AreEqual(1, line);
}
[Test]
public void Line_ReadParagraphEndTagOnSecondLine_ReturnsTwo()
{
string html =
"<p>\r\n" +
"</p>\r\n";
CreateReader(html);
reader.Read();
reader.Read();
int line = reader.Line;
Assert.AreEqual(2, line);
}
}
}

5
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/RazorHtmlFoldParserTests.cs

@ -57,7 +57,8 @@ namespace AspNet.Mvc.Tests.Folding
string text = string text =
"@if (i<a || b>i) {\r\n" + "@if (i<a || b>i) {\r\n" +
" </a>\r\n" + " </a>\r\n" +
" <p></p>\r\n" + " <p>\r\n" +
" </p>\r\n" +
"}\r\n"; "}\r\n";
GetFolds(text); GetFolds(text);
@ -66,7 +67,7 @@ namespace AspNet.Mvc.Tests.Folding
new HtmlElementFold() { new HtmlElementFold() {
ElementName = "p", ElementName = "p",
StartOffset = 34, StartOffset = 34,
EndOffset = 41 EndOffset = 47
} }
}; };

9
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/WebFormsHtmlFoldParserTests.cs

@ -177,5 +177,14 @@ namespace AspNet.Mvc.Tests.Folding
CollectionAssert.AreEqual(expectedFolds, folds); CollectionAssert.AreEqual(expectedFolds, folds);
} }
[Test]
public void GetFolds_ScriptStartAndEndTagsOnSameLine_ReturnsNoFolds()
{
CreateParser();
GetFolds("<script></script>");
Assert.AreEqual(0, folds.Count);
}
} }
} }
Loading…
Cancel
Save