Browse Source

Fix ASP.NET folding not working due to double quotes inside aspx or Razor markup tags which are inside HTML script tags.

pull/18/head
Matt Ward 14 years ago
parent
commit
8de91e4a4d
  1. 1
      src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj
  2. 10
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CharacterReader.cs
  3. 10
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlReader.cs
  4. 12
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/SimpleWebFormsHtmlReader.cs
  5. 64
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/WebFormsMarkupCharacterReader.cs
  6. 1
      src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj
  7. 22
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/WebFormsHtmlFoldParserTests.cs
  8. 75
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/WebFormsMarkupCharacterReaderTests.cs

1
src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj

@ -147,6 +147,7 @@ @@ -147,6 +147,7 @@
<Compile Include="Src\Folding\SimpleWebFormsHtmlReader.cs" />
<Compile Include="Src\Folding\WebFormsHtmlReaderFactory.cs" />
<Compile Include="Src\Folding\WebFormsLanguageBinding.cs" />
<Compile Include="Src\Folding\WebFormsMarkupCharacterReader.cs" />
<Compile Include="Src\IAddMvcItemToProjectView.cs" />
<Compile Include="Src\IFileSystem.cs" />
<Compile Include="Src\IMvcModelClassLocator.cs" />

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

@ -28,9 +28,14 @@ namespace ICSharpCode.AspNet.Mvc.Folding @@ -28,9 +28,14 @@ namespace ICSharpCode.AspNet.Mvc.Folding
{
CurrentCharacter = reader.Read();
CurrentCharacterOffset++;
OnCharacterRead();
return HasMoreCharactersToRead();
}
protected virtual void OnCharacterRead()
{
}
bool HasMoreCharactersToRead()
{
return CurrentCharacter != EndOfCharacters;
@ -90,5 +95,10 @@ namespace ICSharpCode.AspNet.Mvc.Folding @@ -90,5 +95,10 @@ namespace ICSharpCode.AspNet.Mvc.Folding
Read();
}
}
public bool IsNextCharacterPercentSign()
{
return reader.Peek() == '%';
}
}
}

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

@ -97,7 +97,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding @@ -97,7 +97,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding
void ReadDoubleQuotedString()
{
ReadUntil(() => reader.IsDoubleQuote());
ReadUntil(() => IsLastDoubleQuoteOfString());
}
void ReadUntil(Func<bool> match)
@ -109,6 +109,14 @@ namespace ICSharpCode.AspNet.Mvc.Folding @@ -109,6 +109,14 @@ namespace ICSharpCode.AspNet.Mvc.Folding
}
}
bool IsLastDoubleQuoteOfString()
{
if (reader.IsDoubleQuote()) {
return IsHtml();
}
return false;
}
void ReadSingleQuotedString()
{
ReadUntil(() => reader.IsSingleQuote());

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

@ -9,14 +9,22 @@ namespace ICSharpCode.AspNet.Mvc.Folding @@ -9,14 +9,22 @@ namespace ICSharpCode.AspNet.Mvc.Folding
{
public class SimpleWebFormsHtmlReader : HtmlReader
{
WebFormsMarkupCharacterReader reader;
public SimpleWebFormsHtmlReader(string html)
: this(new CharacterReader(html))
: this(new WebFormsMarkupCharacterReader(html))
{
}
public SimpleWebFormsHtmlReader(CharacterReader reader)
public SimpleWebFormsHtmlReader(WebFormsMarkupCharacterReader reader)
: base(reader)
{
this.reader = reader;
}
protected override bool IsHtml()
{
return reader.IsHtml;
}
}
}

64
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/WebFormsMarkupCharacterReader.cs

@ -0,0 +1,64 @@ @@ -0,0 +1,64 @@
// 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;
namespace ICSharpCode.AspNet.Mvc.Folding
{
public class WebFormsMarkupCharacterReader : CharacterReader
{
bool isInAspxMarkup;
bool isAtEndAspxMarkup;
int previousCharacter = EndOfCharacters;
public WebFormsMarkupCharacterReader(string html)
: base(html)
{
}
protected override void OnCharacterRead()
{
if (isInAspxMarkup) {
CheckForAspxEndTag();
} else {
CheckForAspxMarkupStartTag();
}
}
void CheckForAspxEndTag()
{
if (isAtEndAspxMarkup) {
OutsideOfMarkup();
}
if (IsGreaterThanSign() && IsPreviousCharacterPercentSign()) {
isAtEndAspxMarkup = true;
}
previousCharacter = CurrentCharacter;
}
void OutsideOfMarkup()
{
isAtEndAspxMarkup = false;
isInAspxMarkup = false;
}
bool IsPreviousCharacterPercentSign()
{
return previousCharacter == '%';
}
void CheckForAspxMarkupStartTag()
{
isInAspxMarkup = IsAspxMarkupStartTag();
}
public bool IsHtml {
get { return !isInAspxMarkup; }
}
bool IsAspxMarkupStartTag()
{
return IsLessThanSign() && IsNextCharacterPercentSign();
}
}
}

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

@ -123,6 +123,7 @@ @@ -123,6 +123,7 @@
<Compile Include="Src\Folding\WebFormsHtmlFoldParserTests.cs" />
<Compile Include="Src\Folding\WebFormsHtmlReaderTests.cs" />
<Compile Include="Src\Folding\WebFormsLanguageBindingTests.cs" />
<Compile Include="Src\Folding\WebFormsMarkupCharacterReaderTests.cs" />
<Compile Include="Src\IsMvcControllerFolderSelectedConditionEvaluatorTests.cs" />
<Compile Include="Src\IsMvcViewFolderSelectedConditionEvaluatorTests.cs" />
<Compile Include="Configuration\AssemblyInfo.cs" />

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

@ -155,5 +155,27 @@ namespace AspNet.Mvc.Tests.Folding @@ -155,5 +155,27 @@ namespace AspNet.Mvc.Tests.Folding
CollectionAssert.AreEqual(expectedFolds, folds);
}
[Test]
public void GetFolds_ScriptTagAttributeHasAspxTagsInsideWithDoubleQuotes_ReturnsOneFoldIgnoringDoubleQuotesInsideScriptTagAttribute()
{
CreateParser();
string text =
"<script src=\"<%: Url.Content(\"~/Scripts/jquery.js\") %>\" type=\"text/javascript\">\r\n" +
"</script>\r\n";
GetFolds(text);
var expectedFolds = new HtmlElementFold[] {
new HtmlElementFold() {
ElementName = "script",
StartOffset = 0,
EndOffset = 90
}
};
CollectionAssert.AreEqual(expectedFolds, folds);
}
}
}

75
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/Folding/WebFormsMarkupCharacterReaderTests.cs

@ -0,0 +1,75 @@ @@ -0,0 +1,75 @@
// 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 WebFormsMarkupCharacterReaderTests
{
WebFormsMarkupCharacterReader reader;
void CreateReader(string html)
{
reader = new WebFormsMarkupCharacterReader(html);
}
[Test]
public void IsHtml_CurrentCharacterIsAtStartOfHtml_ReturnsTrue()
{
CreateReader("<br/>");
bool htmlCharacterRead = reader.IsHtml;
Assert.IsTrue(htmlCharacterRead);
}
[Test]
public void IsHtml_FirstCharacterReadIsPartOfAspxMarkup_ReturnsFalse()
{
CreateReader("<%@ Page Language=\"VB\" %>");
reader.Read();
bool result = reader.IsHtml;
Assert.IsFalse(result);
}
[Test]
public void IsHtml_FirstCharacterReadIsPartOfBreakTag_ReturnsTrue()
{
CreateReader("<br/>");
reader.Read();
bool readHtmlCharacter = reader.IsHtml;
Assert.IsTrue(readHtmlCharacter);
}
[Test]
public void IsHtml_FirstCharacterReadAfterAspxMarkupStartOpenBracketTag_ReturnsFalse()
{
CreateReader("<%= model.Message %>");
reader.Read();
reader.Read();
bool readHtmlCharacter = reader.IsHtml;
Assert.IsFalse(readHtmlCharacter);
}
[Test]
public void IsHtml_ReadFirstCharacterAfterAspxEndMarkupTag_ReturnsTrue()
{
CreateReader("<%= %><br/>");
reader.ReadCharacters(7);
bool readHtmlCharacter = reader.IsHtml;
Assert.IsTrue(readHtmlCharacter);
}
}
}
Loading…
Cancel
Save