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 @@ -100,5 +100,10 @@ namespace ICSharpCode.AspNet.Mvc.Folding
{
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 @@ -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 @@ -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;

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

@ -51,7 +51,8 @@ namespace ICSharpCode.AspNet.Mvc.Folding @@ -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 @@ -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));

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

@ -24,6 +24,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding @@ -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 @@ -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 @@ -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()

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

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

47
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/HtmlReaderTests.cs

@ -0,0 +1,47 @@ @@ -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 @@ -57,7 +57,8 @@ namespace AspNet.Mvc.Tests.Folding
string text =
"@if (i<a || b>i) {\r\n" +
" </a>\r\n" +
" <p></p>\r\n" +
" <p>\r\n" +
" </p>\r\n" +
"}\r\n";
GetFolds(text);
@ -66,7 +67,7 @@ namespace AspNet.Mvc.Tests.Folding @@ -66,7 +67,7 @@ namespace AspNet.Mvc.Tests.Folding
new HtmlElementFold() {
ElementName = "p",
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 @@ -177,5 +177,14 @@ namespace AspNet.Mvc.Tests.Folding
CollectionAssert.AreEqual(expectedFolds, folds);
}
[Test]
public void GetFolds_ScriptStartAndEndTagsOnSameLine_ReturnsNoFolds()
{
CreateParser();
GetFolds("<script></script>");
Assert.AreEqual(0, folds.Count);
}
}
}
Loading…
Cancel
Save