├── .gitignore ├── LICENSE ├── README.md ├── References ├── Moq.LICENSE ├── Moq.dll ├── Moq.xml ├── xunit.LICENSE ├── xunit.dll ├── xunit.extensions.dll └── xunit.extensions.xml ├── Telerik.RazorConverter.Tests.Common ├── Properties │ └── AssemblyInfo.cs ├── Telerik.RazorConverter.Tests.Common.csproj └── XunitExtensions │ ├── BooleanAssertionExtensions.cs │ ├── CollectionAssertionExtensions.cs │ ├── ObjectAssertExtensions.cs │ └── StringAssertionExtensions.cs ├── Telerik.RazorConverter.Tests.Integration ├── IntegrationTests.cs ├── Properties │ └── AssemblyInfo.cs ├── Telerik.RazorConverter.Tests.Integration.csproj └── TestCases │ ├── TestCase01.aspx.txt │ ├── TestCase01.cshtml │ ├── TestCase02.aspx.txt │ ├── TestCase02.cshtml │ ├── TestCase03.aspx.txt │ ├── TestCase03.cshtml │ ├── TestCase04.aspx.txt │ ├── TestCase04.cshtml │ ├── TestCase05.aspx.txt │ ├── TestCase05.cshtml │ ├── TestCase06.aspx.txt │ ├── TestCase06.cshtml │ ├── TestCase07.aspx.txt │ ├── TestCase07.cshtml │ ├── TestCase08.aspx.txt.skip │ ├── TestCase08.cshtml │ ├── TestCase09.aspx.txt │ ├── TestCase09.cshtml │ ├── TestCase10.aspx.txt │ ├── TestCase10.cshtml │ ├── TestCase11.aspx.txt │ ├── TestCase11.cshtml │ ├── TestCase12.aspx.txt │ ├── TestCase12.cshtml │ ├── TestCase13.aspx.txt │ ├── TestCase13.cshtml │ ├── TestCase14.aspx.txt │ ├── TestCase14.cshtml │ ├── TestCase15.aspx.txt │ ├── TestCase15.cshtml │ ├── TestCase16.aspx.txt.skip │ ├── TestCase16.cshtml │ ├── TestCase17.aspx.txt.skip │ ├── TestCase17.cshtml │ ├── TestCase18.aspx.txt │ ├── TestCase18.cshtml │ ├── TestCase19.aspx.txt.skip │ ├── TestCase19.cshtml │ ├── TestCase20.aspx.txt │ ├── TestCase20.cshtml │ ├── TestCase21.aspx.txt.skip │ ├── TestCase21.cshtml │ ├── TestCase22.aspx.txt.skip │ ├── TestCase22.cshtml │ ├── TestCase23.aspx.txt │ ├── TestCase23.cshtml │ ├── TestCase24.aspx.txt │ ├── TestCase24.cshtml │ ├── TestCase25.aspx.txt │ ├── TestCase25.cshtml │ ├── TestCase26.aspx.txt │ └── TestCase26.cshtml ├── Telerik.RazorConverter.Tests ├── Properties │ └── AssemblyInfo.cs ├── Razor │ ├── Converters │ │ ├── CodeBlockConverterTests.cs │ │ ├── CodeGroupConverterTests.cs │ │ ├── CommentNodeConverterTests.cs │ │ ├── ContentPlaceHolderTagConverterTest.cs │ │ ├── ContentTagConverterTests.cs │ │ ├── DirectiveConverterTests.cs │ │ ├── ExpressionBlockConverterTests.cs │ │ ├── TextNodeConverterTests.cs │ │ └── WebFormsToRazorConverterTests.cs │ ├── DOM │ │ ├── RazorCodeNodeFactoryTests.cs │ │ ├── RazorCommentNodeFactoryTests.cs │ │ ├── RazorDirectiveNodeFactoryTests.cs │ │ ├── RazorNodeTests.cs │ │ └── RazorTextNodeFactoryTests.cs │ └── Rendering │ │ ├── CodeNodeRendererTests.cs │ │ ├── CommentNodeRendererTests.cs │ │ ├── DirectiveNodeRendererTests.cs │ │ ├── ExpressionNodeRendererTests.cs │ │ ├── RazorViewRendererTests.cs │ │ ├── SectionNodeRendererTests.cs │ │ └── TextNodeRendererTests.cs ├── Telerik.RazorConverter.Tests.csproj └── WebForms │ ├── DOM │ └── WebFormsCodeGroupNodeTests.cs │ ├── Filters │ ├── AddBlockBracesFilterTests.cs │ ├── CodeBlockGroupingFilterTests.cs │ └── WrapNestedTemplatesFilterTests.cs │ ├── WebFormsParserFilteringTests.cs │ └── WebFormsParserTests.cs ├── Telerik.RazorConverter.sln ├── Telerik.RazorConverter ├── Document.cs ├── IDocument.cs ├── INodeConverter.cs ├── IOrderMetadata.cs ├── IRenderer.cs ├── IWebFormsConverter.cs ├── IWebFormsParser.cs ├── Properties │ └── AssemblyInfo.cs ├── Razor │ ├── Converters │ │ ├── CodeBlockConverter.cs │ │ ├── CodeGroupConverter.cs │ │ ├── CommentNodeConverter.cs │ │ ├── ContentTagConverter.cs │ │ ├── ContentTagConverterConfiguration.cs │ │ ├── DirectiveConverter.cs │ │ ├── ExpressionBlockConverter.cs │ │ ├── IContentTagConverterConfiguration.cs │ │ ├── IRazorNodeConverterProvider.cs │ │ ├── RazorNodeConverterProvider.cs │ │ ├── TextNodeConverter.cs │ │ └── WebFormsToRazorConverter.cs │ ├── DOM │ │ ├── IRazorCodeNode.cs │ │ ├── IRazorCodeNodeFactory.cs │ │ ├── IRazorCommentNode.cs │ │ ├── IRazorCommentNodeFactory.cs │ │ ├── IRazorDirectiveNode.cs │ │ ├── IRazorDirectiveNodeFactory.cs │ │ ├── IRazorExpressionNode.cs │ │ ├── IRazorExpressionNodeFactory.cs │ │ ├── IRazorNode.cs │ │ ├── IRazorSectionNode.cs │ │ ├── IRazorSectionNodeFactory.cs │ │ ├── IRazorTextNode.cs │ │ ├── IRazorTextNodeFactory.cs │ │ ├── RazorCodeNode.cs │ │ ├── RazorCodeNodeFactory.cs │ │ ├── RazorCommentNode.cs │ │ ├── RazorCommentNodeFactory.cs │ │ ├── RazorDirectiveNode.cs │ │ ├── RazorDirectiveNodeFactory.cs │ │ ├── RazorExpressionNode.cs │ │ ├── RazorExpressionNodeFactory.cs │ │ ├── RazorNode.cs │ │ ├── RazorSectionNode.cs │ │ ├── RazorSectionNodeFactory.cs │ │ ├── RazorTextNode.cs │ │ └── RazorTextNodeFactory.cs │ └── Rendering │ │ ├── CodeNodeRenderer.cs │ │ ├── CommentNodeRenderer.cs │ │ ├── DirectiveNodeRenderer.cs │ │ ├── ExpressionNodeRenderer.cs │ │ ├── IRazorNodeRenderer.cs │ │ ├── IRazorNodeRendererProvider.cs │ │ ├── RazorNodeRendererProvider.cs │ │ ├── RazorViewRenderer.cs │ │ ├── SectionNodeRenderer.cs │ │ └── TextNodeRenderer.cs ├── Telerik.RazorConverter.csproj └── WebForms │ ├── DOM │ ├── CodeBlockNodeType.cs │ ├── CommentNode.cs │ ├── DirectiveNode.cs │ ├── DirectiveType.cs │ ├── ExpressionBlockNode.cs │ ├── IWebFormsCodeBlockNode.cs │ ├── IWebFormsCodeGroupNode.cs │ ├── IWebFormsCodeGroupNodeFactory.cs │ ├── IWebFormsCommentNode.cs │ ├── IWebFormsContentNode.cs │ ├── IWebFormsDirectiveNode.cs │ ├── IWebFormsExpressionBlockNode.cs │ ├── IWebFormsNode.cs │ ├── IWebFormsNodeFactory.cs │ ├── IWebFormsServerControlNode.cs │ ├── IWebFormsTextNode.cs │ ├── NodeType.cs │ ├── ServerControlNode.cs │ ├── TextNode.cs │ ├── WebFormsCodeBlockNode.cs │ ├── WebFormsCodeGroupFactory.cs │ ├── WebFormsCodeGroupNode.cs │ ├── WebFormsNode.cs │ └── WebFormsNodeFactory.cs │ ├── Filters │ ├── AddBlockBracesFilter.cs │ ├── CodeBlockGroupingFilter.cs │ ├── IWebFormsNodeFilter.cs │ ├── IWebFormsNodeFilterProvider.cs │ ├── WebFormsNodeFilterProvider.cs │ └── WrapNestedTemplatesFilter.cs │ └── Parsing │ ├── AttributesReader.cs │ ├── IAttributesReader.cs │ ├── RunatServerTagRegex.cs │ └── WebFormsParser.cs └── aspx2razor ├── DirectoryHandler.cs ├── Program.cs ├── Properties └── AssemblyInfo.cs ├── app.config └── aspx2razor.csproj /.gitignore: -------------------------------------------------------------------------------- 1 | bin/ 2 | obj/ 3 | *.suo 4 | *.vs10x 5 | _ReSharper/ 6 | _ReSharper*/ 7 | *.user 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011 Telerik Corp. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | The razor-converter is a simple tool for converting Microsoft® ASP.NET MVC WebForms Views to the new Razor syntax. 2 | It was initially developed by the Telerik ASP.NET MVC team for internal use, but it now lives its own life on GitHub. 3 | 4 | Known limitations: 5 | 6 | * The tool only works with views and does not deal with the project structure and master pages. 7 | * Expressions in script tags are not converted 8 | * Due to the differences between the view engines the automatic conversion will sometimes fail or produce incorrect results. See the integration tests for specific scenarios that are not covered. 9 | 10 | For general tips on converting WebForms Views to Razor Views, see these blog posts: 11 | 12 | * [Introducing Razor](http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx) 13 | * [Model directive support](http://weblogs.asp.net/scottgu/archive/2010/10/19/asp-net-mvc-3-new-model-directive-support-in-razor.aspx) 14 | * [Layouts](http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx) 15 | * [Server-side comments](http://weblogs.asp.net/scottgu/archive/2010/11/12/asp-net-mvc-3-server-side-comments-with-razor.aspx) 16 | * [The syntax](http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx) 17 | * [Implicit and explicit code nuggets](http://weblogs.asp.net/scottgu/archive/2010/12/16/asp-net-mvc-3-implicit-and-explicit-code-nuggets-with-razor.aspx) 18 | * [Introducing Razor (by Andrew Nurse)](http://blog.andrewnurse.net/2010/07/03/IntroducingRazorNdashANewViewEngineForASPNet.aspx) 19 | 20 | [Help specific to the Telerik Extensions for ASP.NET MVC](http://www.telerik.com/help/aspnet-mvc/using-with-the-razor-view-engine.html) 21 | 22 | Command line usage: 23 | 24 | `aspx2razor [output-directory] [options]` 25 | 26 | Options: 27 | -r: Convert directories and their contents recursively (Contributed by Jeffrey T. Fritz) 28 | 29 | A file with cshtml extension will be created for each input file. 30 | Existing files will be OVERWRITTEN, so you must be very careful. 31 | -------------------------------------------------------------------------------- /References/Moq.LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2007. Clarius Consulting, Manas Technology Solutions, InSTEDD 2 | http://code.google.com/p/moq/ 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, 6 | with or without modification, are permitted provided 7 | that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the 10 | above copyright notice, this list of conditions and 11 | the following disclaimer. 12 | 13 | * Redistributions in binary form must reproduce 14 | the above copyright notice, this list of conditions 15 | and the following disclaimer in the documentation 16 | and/or other materials provided with the distribution. 17 | 18 | * Neither the name of Clarius Consulting, Manas Technology Solutions or InSTEDD nor the 19 | names of its contributors may be used to endorse 20 | or promote products derived from this software 21 | without specific prior written permission. 22 | 23 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 24 | CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 25 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 26 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 27 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 28 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 29 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 30 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 31 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 33 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 34 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 35 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 | SUCH DAMAGE. 37 | 38 | [This is the BSD license, see 39 | http://www.opensource.org/licenses/bsd-license.php] -------------------------------------------------------------------------------- /References/Moq.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/razor-converter/3028034882b452e751b5638b1f35ea3698254752/References/Moq.dll -------------------------------------------------------------------------------- /References/xunit.LICENSE: -------------------------------------------------------------------------------- 1 | Microsoft Public License (Ms-PL) 2 | 3 | This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. 4 | 5 | 1. Definitions 6 | 7 | The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. 8 | 9 | A "contribution" is the original software, or any additions or changes to the software. 10 | 11 | A "contributor" is any person that distributes its contribution under this license. 12 | 13 | "Licensed patents" are a contributor's patent claims that read directly on its contribution. 14 | 15 | 2. Grant of Rights 16 | 17 | (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. 18 | 19 | (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. 20 | 21 | 3. Conditions and Limitations 22 | 23 | (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. 24 | 25 | (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. 26 | 27 | (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. 28 | 29 | (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. 30 | 31 | (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. -------------------------------------------------------------------------------- /References/xunit.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/razor-converter/3028034882b452e751b5638b1f35ea3698254752/References/xunit.dll -------------------------------------------------------------------------------- /References/xunit.extensions.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/razor-converter/3028034882b452e751b5638b1f35ea3698254752/References/xunit.extensions.dll -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Common/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("RazorConverter.Tests.Common")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Microsoft")] 12 | [assembly: AssemblyProduct("RazorConverter.Tests.Common")] 13 | [assembly: AssemblyCopyright("Copyright © Microsoft 2010")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("23c3cb3b-1b86-4fb5-9d0e-fc9cbef054e4")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Common/Telerik.RazorConverter.Tests.Common.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | AnyCPU 6 | 8.0.30703 7 | 2.0 8 | {B30D861F-7D12-436A-BC5A-930D48291037} 9 | Library 10 | Properties 11 | RazorConverter.Tests.Common 12 | RazorConverter.Tests.Common 13 | v4.0 14 | 512 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | true 26 | full 27 | false 28 | bin\Debug\ 29 | DEBUG;TRACE 30 | prompt 31 | 4 32 | 33 | 34 | pdbonly 35 | true 36 | bin\Release\ 37 | TRACE 38 | prompt 39 | 4 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | ..\References\xunit.dll 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 68 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Common/XunitExtensions/BooleanAssertionExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace Xunit 2 | { 3 | /// 4 | /// Extensions which provide assertions to classes derived from . 5 | /// 6 | public static class BooleanAssertionExtensions 7 | { 8 | /// 9 | /// Verifies that the condition is false. 10 | /// 11 | /// The condition to be tested 12 | public static void ShouldBeFalse(this bool condition) 13 | { 14 | Assert.False(condition); 15 | } 16 | 17 | /// 18 | /// Verifies that the condition is false. 19 | /// 20 | /// The condition to be tested 21 | /// The message to show when the condition is not false 22 | public static void ShouldBeFalse(this bool condition, 23 | string userMessage) 24 | { 25 | Assert.False(condition, userMessage); 26 | } 27 | 28 | /// 29 | /// Verifies that an expression is true. 30 | /// 31 | /// The condition to be inspected 32 | public static void ShouldBeTrue(this bool condition) 33 | { 34 | Assert.True(condition); 35 | } 36 | 37 | /// 38 | /// Verifies that an expression is true. 39 | /// 40 | /// The condition to be inspected 41 | /// The message to be shown when the condition is false 42 | public static void ShouldBeTrue(this bool condition, 43 | string userMessage) 44 | { 45 | Assert.True(condition, userMessage); 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Common/XunitExtensions/CollectionAssertionExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace Xunit 2 | { 3 | using System.Collections; 4 | using System.Collections.Generic; 5 | 6 | /// 7 | /// Extensions which provide assertions to classes derived from and . 8 | /// 9 | public static class CollectionAssertExtensions 10 | { 11 | /// 12 | /// Verifies that a collection is empty. 13 | /// 14 | /// The collection to be inspected 15 | /// Thrown when the collection is null 16 | public static void ShouldBeEmpty(this IEnumerable collection) 17 | { 18 | Assert.Empty(collection); 19 | } 20 | 21 | /// 22 | /// Verifies that a collection contains a given object. 23 | /// 24 | /// The type of the object to be verified 25 | /// The collection to be inspected 26 | /// The object expected to be in the collection 27 | public static void ShouldContain(this IEnumerable collection, 28 | T expected) 29 | { 30 | Assert.Contains(expected, collection); 31 | } 32 | 33 | /// 34 | /// Verifies that a collection contains a given object, using a comparer. 35 | /// 36 | /// The type of the object to be verified 37 | /// The collection to be inspected 38 | /// The object expected to be in the collection 39 | /// The comparer used to equate objects in the collection with the expected object 40 | public static void ShouldContain(this IEnumerable collection, 41 | T expected, 42 | IEqualityComparer comparer) 43 | { 44 | Assert.Contains(expected, collection, comparer); 45 | } 46 | 47 | /// 48 | /// Verifies that a collection is not empty. 49 | /// 50 | /// The collection to be inspected 51 | /// Thrown when a null collection is passed 52 | public static void ShouldNotBeEmpty(this IEnumerable collection) 53 | { 54 | Assert.NotEmpty(collection); 55 | } 56 | 57 | /// 58 | /// Verifies that a collection does not contain a given object. 59 | /// 60 | /// The type of the object to be compared 61 | /// The object that is expected not to be in the collection 62 | /// The collection to be inspected 63 | public static void ShouldNotContain(this IEnumerable collection, 64 | T expected) 65 | { 66 | Assert.DoesNotContain(expected, collection); 67 | } 68 | 69 | /// 70 | /// Verifies that a collection does not contain a given object, using a comparer. 71 | /// 72 | /// The type of the object to be compared 73 | /// The object that is expected not to be in the collection 74 | /// The collection to be inspected 75 | /// The comparer used to equate objects in the collection with the expected object 76 | public static void ShouldNotContain(this IEnumerable collection, 77 | T expected, 78 | IEqualityComparer comparer) 79 | { 80 | Assert.DoesNotContain(expected, collection, comparer); 81 | } 82 | } 83 | } -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Common/XunitExtensions/StringAssertionExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace Xunit 2 | { 3 | using System; 4 | 5 | /// 6 | /// Extensions which provide assertions to classes derived from . 7 | /// 8 | public static class StringAssertionExtensions 9 | { 10 | /// 11 | /// Verifies that a string contains a given sub-string, using the current culture. 12 | /// 13 | /// The string to be inspected 14 | /// The sub-string expected to be in the string 15 | public static void ShouldContain(this string actualString, 16 | string expectedSubString) 17 | { 18 | Assert.Contains(expectedSubString, actualString); 19 | } 20 | 21 | /// 22 | /// Verifies that a string contains a given sub-string, using the given comparison type. 23 | /// 24 | /// The string to be inspected 25 | /// The sub-string expected to be in the string 26 | /// The type of string comparison to perform 27 | public static void ShouldContain(this string actualString, 28 | string expectedSubString, 29 | StringComparison comparisonType) 30 | { 31 | Assert.Contains(expectedSubString, actualString, comparisonType); 32 | } 33 | 34 | /// 35 | /// Verifies that a string does not contain a given sub-string, using the current culture. 36 | /// 37 | /// The string to be inspected 38 | /// The sub-string which is expected not to be in the string 39 | public static void ShouldNotContain(this string actualString, 40 | string expectedSubString) 41 | { 42 | Assert.DoesNotContain(expectedSubString, actualString); 43 | } 44 | 45 | /// 46 | /// Verifies that a string does not contain a given sub-string, using the current culture. 47 | /// 48 | /// The string to be inspected 49 | /// The sub-string which is expected not to be in the string 50 | /// The type of string comparison to perform 51 | public static void ShouldNotContain(this string actualString, 52 | string expectedSubString, 53 | StringComparison comparisonType) 54 | { 55 | Assert.DoesNotContain(expectedSubString, actualString, comparisonType); 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/IntegrationTests.cs: -------------------------------------------------------------------------------- 1 | namespace RazorConverter.Core.Tests 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.ComponentModel.Composition; 6 | using System.ComponentModel.Composition.Hosting; 7 | using System.IO; 8 | using System.Linq; 9 | using Telerik.RazorConverter; 10 | using Telerik.RazorConverter.Razor.DOM; 11 | using Xunit; 12 | using Xunit.Extensions; 13 | 14 | public class IntegrationTests 15 | { 16 | [Import] 17 | private IWebFormsParser Parser 18 | { 19 | get; 20 | set; 21 | } 22 | 23 | [Import] 24 | private IWebFormsConverter Converter 25 | { 26 | get; 27 | set; 28 | } 29 | 30 | [Import] 31 | private IRenderer Renderer 32 | { 33 | get; 34 | set; 35 | } 36 | 37 | public IntegrationTests() 38 | { 39 | var catalog = new AssemblyCatalog(typeof(IWebFormsParser).Assembly); 40 | var container = new CompositionContainer(catalog); 41 | container.ComposeParts(this); 42 | } 43 | 44 | public static IEnumerable TestFiles 45 | { 46 | get 47 | { 48 | var testCasesFolder = new DirectoryInfo("..\\..\\TestCases"); 49 | foreach (var inputFile in testCasesFolder.EnumerateFiles("*.aspx.txt")) 50 | { 51 | var referenceFileName = inputFile.FullName.Replace(".aspx.txt", ".cshtml"); 52 | yield return new object[] { 53 | inputFile.Name, 54 | File.ReadAllText(inputFile.FullName), 55 | File.ReadAllText(referenceFileName) 56 | }; 57 | } 58 | } 59 | } 60 | 61 | [Theory] 62 | [PropertyData("TestFiles")] 63 | public void Should_produce_expected_result(string caseName, string inputFile, string expectedResult) 64 | { 65 | var webFormsDocument = Parser.Parse(inputFile); 66 | var razorDom = Converter.Convert(webFormsDocument); 67 | var actualResult = Renderer.Render(razorDom); 68 | 69 | // Compare only non-empty lines 70 | var actualLines = GetNonEmptyLines(actualResult); 71 | var referenceLines = GetNonEmptyLines(expectedResult); 72 | for (int lineNum = 0; lineNum < actualLines.Count; lineNum++) 73 | { 74 | (lineNum > referenceLines.Count - 1) 75 | .ShouldBeFalse("Reference output is shorter than actual output"); 76 | 77 | string annotatedFormatString = "line #{0}:{1}"; 78 | var annotatedActualLine = string.Format(annotatedFormatString, lineNum, actualLines[lineNum].Trim()); 79 | var annotatedReferenceLine = string.Format(annotatedFormatString, lineNum, referenceLines[lineNum].Trim()); 80 | 81 | annotatedActualLine.ShouldEqual(annotatedReferenceLine); 82 | } 83 | 84 | // Length verification done last in order to show line by line comparision first 85 | actualLines.Count.ShouldEqual(referenceLines.Count); 86 | } 87 | 88 | private static IList GetNonEmptyLines(string input) 89 | { 90 | return input.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) 91 | .Where(l => !string.IsNullOrWhiteSpace(l)) 92 | .ToList(); 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("RazorConverter.IntegrationTests")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Microsoft")] 12 | [assembly: AssemblyProduct("RazorConverter.IntegrationTests")] 13 | [assembly: AssemblyCopyright("Copyright © Microsoft 2010")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("c90645fe-3901-4c8a-ae61-650ea5ddca41")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase01.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage>" %> 2 | 3 | 4 | <% using (Html.Configurator("The grid should...") 5 | .PostTo("FirstLook", "Grid") 6 | .Begin()) 7 | { %> 8 |
    9 |
  • <%= Html.CheckBox("ajax", true, "make AJAX requests")%>
  • 10 |
  • <%= Html.CheckBox("grouping", true, "allow grouping of data")%>
  • 11 |
  • <%= Html.CheckBox("filtering", true, "allow filtering of data")%>
  • 12 |
  • <%= Html.CheckBox("paging", true, "have pages with 10 items")%>
  • 13 |
  • <%= Html.CheckBox("scrolling", true, "show a scrollbar when there are many items")%>
  • 14 |
  • <%= Html.CheckBox("sorting", true, "allow sorting of data")%>
  • 15 |
  • <%= Html.CheckBox("showFooter", true, "show footer")%>
  • 16 |
17 | 18 | <% } %> 19 | 20 | <%= Html.Telerik().Grid(Model) 21 | .Name("Grid") 22 | .Columns(columns => 23 | { 24 | columns.Bound(o => o.OrderID).Width(100); 25 | columns.Bound(o => o.ContactName).Width(200); 26 | columns.Bound(o => o.ShipAddress); 27 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 28 | }) 29 | .DataBinding(dataBinding => 30 | { 31 | dataBinding.Server().Select("FirstLook", "Grid", new { ajax = ViewData["ajax"] }); 32 | dataBinding.Ajax().Select("_FirstLook", "Grid").Enabled((bool)ViewData["ajax"]); 33 | }) 34 | .Scrollable(scrolling => scrolling.Enabled((bool)ViewData["scrolling"])) 35 | .Sortable(sorting => sorting.Enabled((bool)ViewData["sorting"])) 36 | .Pageable(paging => paging.Enabled((bool)ViewData["paging"])) 37 | .Filterable(filtering => filtering.Enabled((bool)ViewData["filtering"])) 38 | .Groupable(grouping => grouping.Enabled((bool)ViewData["grouping"])) 39 | .Footer((bool)ViewData["showFooter"]) 40 | %> 41 |
42 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase01.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | @using (Html.Configurator("The grid should...") 3 | .PostTo("FirstLook", "Grid") 4 | .Begin()) 5 | { 6 |
    7 |
  • @Html.CheckBox("ajax", true, "make AJAX requests")
  • 8 |
  • @Html.CheckBox("grouping", true, "allow grouping of data")
  • 9 |
  • @Html.CheckBox("filtering", true, "allow filtering of data")
  • 10 |
  • @Html.CheckBox("paging", true, "have pages with 10 items")
  • 11 |
  • @Html.CheckBox("scrolling", true, "show a scrollbar when there are many items")
  • 12 |
  • @Html.CheckBox("sorting", true, "allow sorting of data")
  • 13 |
  • @Html.CheckBox("showFooter", true, "show footer")
  • 14 |
15 | 16 | } 17 | @(Html.Telerik().Grid(Model) 18 | .Name("Grid") 19 | .Columns(columns => 20 | { 21 | columns.Bound(o => o.OrderID).Width(100); 22 | columns.Bound(o => o.ContactName).Width(200); 23 | columns.Bound(o => o.ShipAddress); 24 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 25 | }) 26 | .DataBinding(dataBinding => 27 | { 28 | dataBinding.Server().Select("FirstLook", "Grid", new { ajax = ViewData["ajax"] }); 29 | dataBinding.Ajax().Select("_FirstLook", "Grid").Enabled((bool)ViewData["ajax"]); 30 | }) 31 | .Scrollable(scrolling => scrolling.Enabled((bool)ViewData["scrolling"])) 32 | .Sortable(sorting => sorting.Enabled((bool)ViewData["sorting"])) 33 | .Pageable(paging => paging.Enabled((bool)ViewData["paging"])) 34 | .Filterable(filtering => filtering.Enabled((bool)ViewData["filtering"])) 35 | .Groupable(grouping => grouping.Enabled((bool)ViewData["grouping"])) 36 | .Footer((bool)ViewData["showFooter"]) 37 | ) -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase02.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage>" %> 2 | 3 | <%= Html.Telerik().Grid(Model) 4 | .Name("Grid") 5 | .Columns(columns => 6 | { 7 | columns.Bound(o => o.OrderID).Width(100); 8 | columns.Bound(o => o.Customer.ContactName).Width(200); 9 | columns.Bound(o => o.ShipAddress); 10 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 11 | }) 12 | .Groupable() 13 | .Sortable() 14 | .Pageable() 15 | .Filterable() 16 | %> 17 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase02.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | @(Html.Telerik().Grid(Model) 3 | .Name("Grid") 4 | .Columns(columns => 5 | { 6 | columns.Bound(o => o.OrderID).Width(100); 7 | columns.Bound(o => o.Customer.ContactName).Width(200); 8 | columns.Bound(o => o.ShipAddress); 9 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 10 | }) 11 | .Groupable() 12 | .Sortable() 13 | .Pageable() 14 | .Filterable() 15 | ) -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase03.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 2 | 3 | <%= Html.Telerik().Grid() 4 | .Name("Grid") 5 | .Columns(columns => 6 | { 7 | columns.Bound(o => o.OrderID).Width(100); 8 | columns.Bound(o => o.Customer.ContactName).Width(200); 9 | columns.Bound(o => o.ShipAddress); 10 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 11 | }) 12 | .DataBinding(dataBinding => dataBinding.Ajax().Select("_AjaxBinding", "Grid")) 13 | .Pageable() 14 | .Sortable() 15 | .Scrollable() 16 | .Groupable() 17 | .Filterable() 18 | %> 19 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase03.cshtml: -------------------------------------------------------------------------------- 1 | @(Html.Telerik().Grid() 2 | .Name("Grid") 3 | .Columns(columns => 4 | { 5 | columns.Bound(o => o.OrderID).Width(100); 6 | columns.Bound(o => o.Customer.ContactName).Width(200); 7 | columns.Bound(o => o.ShipAddress); 8 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 9 | }) 10 | .DataBinding(dataBinding => dataBinding.Ajax().Select("_AjaxBinding", "Grid")) 11 | .Pageable() 12 | .Sortable() 13 | .Scrollable() 14 | .Groupable() 15 | .Filterable() 16 | ) -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase04.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Examples.Master" 2 | Inherits="System.Web.Mvc.ViewPage" %> 3 | 4 |

Bound to ASMX Web Service

5 | <%= Html.Telerik().Grid() 6 | .Name("AsmxGrid") 7 | .Columns(columns => 8 | { 9 | columns.Bound(o => o.OrderID).Width(100); 10 | columns.Bound(o => o.Customer.ContactName).Width(200); 11 | columns.Bound(o => o.ShipAddress); 12 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 13 | }) 14 | .DataBinding(dataBinding => dataBinding.WebService().Select("~/Models/Orders.asmx/GetOrders")) 15 | .Sortable() 16 | .Pageable() 17 | .Groupable() 18 | .Filterable() 19 | .Scrollable() 20 | %> 21 |

Bound to WCF Web Service using DTO objects

22 | <%= Html.Telerik().Grid() 23 | .Name("WcfGrid") 24 | .Columns(columns => 25 | { 26 | columns.Bound(o => o.OrderID).Width(100); 27 | columns.Bound(o => o.ContactName).Width(200); 28 | columns.Bound(o => o.ShipAddress); 29 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(100); 30 | }) 31 | .DataBinding(dataBinding => dataBinding.WebService().Select("~/Models/Orders.svc/GetOrders")) 32 | .Groupable() 33 | .Sortable() 34 | .Pageable() 35 | .Filterable() 36 | .Scrollable() 37 | %> 38 |
-------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase04.cshtml: -------------------------------------------------------------------------------- 1 | 

Bound to ASMX Web Service

2 | @(Html.Telerik().Grid() 3 | .Name("AsmxGrid") 4 | .Columns(columns => 5 | { 6 | columns.Bound(o => o.OrderID).Width(100); 7 | columns.Bound(o => o.Customer.ContactName).Width(200); 8 | columns.Bound(o => o.ShipAddress); 9 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 10 | }) 11 | .DataBinding(dataBinding => dataBinding.WebService().Select("~/Models/Orders.asmx/GetOrders")) 12 | .Sortable() 13 | .Pageable() 14 | .Groupable() 15 | .Filterable() 16 | .Scrollable() 17 | ) 18 |

Bound to WCF Web Service using DTO objects

19 | @(Html.Telerik().Grid() 20 | .Name("WcfGrid") 21 | .Columns(columns => 22 | { 23 | columns.Bound(o => o.OrderID).Width(100); 24 | columns.Bound(o => o.ContactName).Width(200); 25 | columns.Bound(o => o.ShipAddress); 26 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(100); 27 | }) 28 | .DataBinding(dataBinding => dataBinding.WebService().Select("~/Models/Orders.svc/GetOrders")) 29 | .Groupable() 30 | .Sortable() 31 | .Pageable() 32 | .Filterable() 33 | .Scrollable() 34 | ) -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase05.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage>" %> 2 | 3 | <%= Html.Telerik().Grid(Model) 4 | .Name("Grid") 5 | .Columns(columns => 6 | { 7 | columns.Bound(o => o.OrderID).Width(100); 8 | columns.Bound(o => o.Customer.ContactName).Width(200); 9 | columns.Bound(o => o.ShipAddress); 10 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(100); 11 | }) 12 | .DataBinding(dataBinding => dataBinding.Ajax().Select("_CustomBinding", "Grid")) 13 | .Pageable(settings => settings.Total((int)ViewData["total"])) 14 | .EnableCustomBinding(true) 15 | .Sortable() 16 | .Filterable() 17 | .Groupable() 18 | %> 19 | 20 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase05.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | @(Html.Telerik().Grid(Model) 3 | .Name("Grid") 4 | .Columns(columns => 5 | { 6 | columns.Bound(o => o.OrderID).Width(100); 7 | columns.Bound(o => o.Customer.ContactName).Width(200); 8 | columns.Bound(o => o.ShipAddress); 9 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(100); 10 | }) 11 | .DataBinding(dataBinding => dataBinding.Ajax().Select("_CustomBinding", "Grid")) 12 | .Pageable(settings => settings.Total((int)ViewData["total"])) 13 | .EnableCustomBinding(true) 14 | .Sortable() 15 | .Filterable() 16 | .Groupable() 17 | ) -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase06.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 2 | 3 | <%= Html.Telerik().Grid() 4 | .Name("Grid") 5 | .BindTo(Model) 6 | .Columns(columns => 7 | { 8 | columns.Bound(o => o.OrderID).Width(100); 9 | columns.Bound(o => o.Customer.ContactName).Width(200); 10 | columns.Bound(o => o.ShipAddress); 11 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(100); 12 | }) 13 | .DataBinding(dataBinding => dataBinding.Server().Select("CustomServerBinding", "Grid")) 14 | .Pageable(settings => settings.Total((int)ViewData["total"])) 15 | .EnableCustomBinding(true) 16 | .Sortable() 17 | .Filterable() 18 | .Groupable() 19 | %> 20 | 21 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase06.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | @(Html.Telerik().Grid() 3 | .Name("Grid") 4 | .BindTo(Model) 5 | .Columns(columns => 6 | { 7 | columns.Bound(o => o.OrderID).Width(100); 8 | columns.Bound(o => o.Customer.ContactName).Width(200); 9 | columns.Bound(o => o.ShipAddress); 10 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(100); 11 | }) 12 | .DataBinding(dataBinding => dataBinding.Server().Select("CustomServerBinding", "Grid")) 13 | .Pageable(settings => settings.Total((int)ViewData["total"])) 14 | .EnableCustomBinding(true) 15 | .Sortable() 16 | .Filterable() 17 | .Groupable() 18 | ) -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase08.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | 3 | @{ Html.Telerik().Grid(Model) 4 | .Name("Employees") 5 | .Columns(columns => 6 | { 7 | columns.Bound(e => e.FirstName).Width(140); 8 | columns.Bound(e => e.LastName).Width(140); 9 | columns.Bound(e => e.Title).Width(200); 10 | columns.Bound(e => e.Country).Width(200); 11 | columns.Bound(e => e.City); 12 | }) 13 | .DetailView(detailView => detailView.Template( 14 | @ 15 | @(Html.Telerik().TabStrip() 16 | .Name("TabStrip_" + e.EmployeeID) 17 | .SelectedIndex(0) 18 | .Items(items => 19 | { 20 | items.Add().Text("Orders").Content( 21 | @ @* Converter: Manually extract inline block into @helper. *@ 22 | @(Html.Telerik().Grid(e.Orders) 23 | .Name("Orders_" + e.EmployeeID) 24 | .Columns(columns => 25 | { 26 | columns.Bound(o => o.OrderID).Width(101); 27 | columns.Bound(o => o.ShipCountry).Width(140); 28 | columns.Bound(o => o.ShipAddress).Width(200); 29 | columns.Bound(o => o.ShipName).Width(200); 30 | columns.Bound(o => o.ShippedDate).Format("{0:d}"); 31 | }) 32 | .Pageable() 33 | .Sortable() 34 | ) 35 | 36 | ); 37 | items.Add().Text("Contact Information").Content( 38 | @ @* Converter: Manually extract inline block into @helper. *@ 39 |
40 | " alt="<%= e.FirstName + " " + e.LastName %>" /> 41 |
    42 |
  • 43 | <%= e.BirthDate.Value.ToString("d") %> 44 |
  • 45 |
  • 46 | <%= e.Country %> 47 |
  • 48 |
  • 49 | <%= e.City %> 50 |
  • 51 |
  • 52 | <%= e.Address %> 53 |
  • 54 |
  • 55 | <%= e.HomePhone %> 56 |
  • 57 |
58 |
59 |
60 | ); 61 | })) 62 |
63 | )) 64 | .RowAction(row => 65 | { 66 | if (row.Index == 0) 67 | { 68 | row.DetailRow.Expanded = true; 69 | } 70 | }) 71 | .Pageable(paging => paging.PageSize(5)) 72 | .Sortable() 73 | .Render() 74 | } 75 | 76 | @section HeadContent 77 | { 78 | 100 | } -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase09.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 2 | <%@ Import Namespace="Telerik.Web.Mvc" %> 3 | <% 4 | if (ViewData["telerik.web.mvc.products.examples"] != null) 5 | { 6 | Html.Telerik().PanelBar() 7 | .Name("navigation-product-examples") 8 | .HtmlAttributes(new { @class = "demos-navigation" }) 9 | .BindTo("telerik.web.mvc.products.examples", (item, node) => 10 | { 11 | if (!string.IsNullOrEmpty(node.ControllerName) && !string.IsNullOrEmpty(node.ActionName)) 12 | { 13 | item.ControllerName = node.ControllerName.ToLower(); 14 | item.ActionName = node.ActionName.ToLower(); 15 | } 16 | }) 17 | .HighlightPath(true) 18 | .ItemAction(item => 19 | { 20 | if (!item.Items.Any() && !string.IsNullOrEmpty(Request.QueryString["theme"])) 21 | { 22 | item.RouteValues.Add("theme", Request.QueryString["theme"]); 23 | } 24 | 25 | if (item.Selected) 26 | { 27 | item.HtmlAttributes["class"] = "active-page"; 28 | } 29 | 30 | if (item.Parent == null) 31 | { 32 | item.SpriteCssClasses = "t" + item.Text; 33 | } 34 | }) 35 | .Render(); 36 | } 37 | %> 38 | <% 39 | Html.Telerik().PanelBar() 40 | .Name("navigation-controls") 41 | .HtmlAttributes(new { @class = "demos-navigation" }) 42 | .BindTo("telerik.web.mvc.products", (item, node) => 43 | { 44 | if (!string.IsNullOrEmpty(node.ControllerName) && !string.IsNullOrEmpty(node.ActionName)) 45 | { 46 | item.ControllerName = node.ControllerName.ToLower(); 47 | item.ActionName = node.ActionName.ToLower(); 48 | } 49 | }) 50 | 51 | .ItemAction(item => 52 | { 53 | if (!item.Items.Any() && !string.IsNullOrEmpty(Request.QueryString["theme"])) 54 | { 55 | item.RouteValues.Add("theme", Request.QueryString["theme"]); 56 | } 57 | 58 | item.SpriteCssClasses = "t" + item.Text; 59 | }) 60 | .Render(); 61 | %> 62 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase09.cshtml: -------------------------------------------------------------------------------- 1 | @using Telerik.Web.Mvc 2 | @if (ViewData["telerik.web.mvc.products.examples"] != null) 3 | { 4 | Html.Telerik().PanelBar() 5 | .Name("navigation-product-examples") 6 | .HtmlAttributes(new { @class = "demos-navigation" }) 7 | .BindTo("telerik.web.mvc.products.examples", (item, node) => 8 | { 9 | if (!string.IsNullOrEmpty(node.ControllerName) && !string.IsNullOrEmpty(node.ActionName)) 10 | { 11 | item.ControllerName = node.ControllerName.ToLower(); 12 | item.ActionName = node.ActionName.ToLower(); 13 | } 14 | }) 15 | .HighlightPath(true) 16 | .ItemAction(item => 17 | { 18 | if (!item.Items.Any() && !string.IsNullOrEmpty(Request.QueryString["theme"])) 19 | { 20 | item.RouteValues.Add("theme", Request.QueryString["theme"]); 21 | } 22 | 23 | if (item.Selected) 24 | { 25 | item.HtmlAttributes["class"] = "active-page"; 26 | } 27 | 28 | if (item.Parent == null) 29 | { 30 | item.SpriteCssClasses = "t" + item.Text; 31 | } 32 | }) 33 | .Render(); 34 | } 35 | 36 | 37 | @{ 38 | Html.Telerik().PanelBar() 39 | .Name("navigation-controls") 40 | .HtmlAttributes(new { @class = "demos-navigation" }) 41 | .BindTo("telerik.web.mvc.products", (item, node) => 42 | { 43 | if (!string.IsNullOrEmpty(node.ControllerName) && !string.IsNullOrEmpty(node.ActionName)) 44 | { 45 | item.ControllerName = node.ControllerName.ToLower(); 46 | item.ActionName = node.ActionName.ToLower(); 47 | } 48 | }) 49 | 50 | .ItemAction(item => 51 | { 52 | if (!item.Items.Any() && !string.IsNullOrEmpty(Request.QueryString["theme"])) 53 | { 54 | item.RouteValues.Add("theme", Request.QueryString["theme"]); 55 | } 56 | 57 | item.SpriteCssClasses = "t" + item.Text; 58 | }) 59 | .Render(); 60 | } -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase10.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 2 |
<%=  Html.Encode(Model.Replace("\t", "    ")).WordWrap() %>
3 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase10.cshtml: -------------------------------------------------------------------------------- 1 | @model string 2 |
@Model.Replace("\t", "    ").WordWrap()
-------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase11.aspx.txt: -------------------------------------------------------------------------------- 1 |  2 | 3 | 19 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase11.cshtml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 19 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase12.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 2 | 3 |

About this example

4 | 5 | <% Html.Telerik().TabStrip() 6 | .Name("code-viewer-tabs") 7 | .Items(tabstrip => 8 | { 9 | bool hasDescription = !string.IsNullOrEmpty(ViewData.Get("Description").ToString()); 10 | if (hasDescription) 11 | { 12 | tabstrip.Add() 13 | .Text("Description") 14 | .Content(() => 15 | { 16 | %> 17 |
<%= ViewData["Description"] %>
18 | <% 19 | }); 20 | } 21 | 22 | var codeFiles = ViewData.Get>("codeFiles"); 23 | 24 | foreach (var codeFile in codeFiles) 25 | { 26 | tabstrip.Add() 27 | .Text(codeFile.Key) 28 | .LoadContentFrom("CodeFile", "Home", new { file = codeFile.Value }); 29 | } 30 | }) 31 | .SelectedIndex(0) 32 | .ClientEvents(events => events.OnLoad("codeTabLoad")) 33 | .Render(); 34 | %> -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase12.cshtml: -------------------------------------------------------------------------------- 1 | 

About this example

2 | 3 | @{ Html.Telerik().TabStrip() 4 | .Name("code-viewer-tabs") 5 | .Items(tabstrip => 6 | { 7 | bool hasDescription = !string.IsNullOrEmpty(ViewData.Get("Description").ToString()); 8 | if (hasDescription) 9 | { 10 | tabstrip.Add() 11 | .Text("Description") 12 | .Content(@ 13 |
@ViewData["Description"]
14 |
); 15 | } 16 | 17 | var codeFiles = ViewData.Get>("codeFiles"); 18 | 19 | foreach (var codeFile in codeFiles) 20 | { 21 | tabstrip.Add() 22 | .Text(codeFile.Key) 23 | .LoadContentFrom("CodeFile", "Home", new { file = codeFile.Value }); 24 | } 25 | }) 26 | .SelectedIndex(0) 27 | .ClientEvents(events => events.OnLoad("codeTabLoad")) 28 | .Render(); 29 | } -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase13.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 2 | 3 |
4 |

Event log

5 | 6 | Clear log 7 | 8 |
9 |
10 | 11 | 30 | 31 | <% Html.Telerik().ScriptRegistrar() 32 | .OnDocumentReady(() => {%> 33 | $('.event-log-clear') 34 | .click(function(e) { 35 | e.preventDefault(); 36 | $(this).next('.event-log').html(''); 37 | }); 38 | <%}); 39 | %> -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase13.cshtml: -------------------------------------------------------------------------------- 1 |  2 |
3 |

Event log

4 | 5 | Clear log 6 | 7 |
8 |
9 | 10 | 29 | 30 | @{ Html.Telerik().ScriptRegistrar() 31 | .OnDocumentReady(@ 32 | $('.event-log-clear') 33 | .click(function(e) { 34 | e.preventDefault(); 35 | $(this).next('.event-log').html(''); 36 | }); 37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase14.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 2 | 3 | 4 | <%= Html.Telerik().Calendar() 5 | .Name("Calendar") 6 | .Selection(settings => settings 7 | .Action("Accessibility", new { date = "{0}", theme = Request.QueryString["theme"] })) 8 | .Value((DateTime)ViewData["date"]) 9 | %> 10 | 11 | 14 | 15 | <% Html.RenderPartial("AccessibilityValidation"); %> 16 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase14.cshtml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | @(Html.Telerik().Calendar() 5 | .Name("Calendar") 6 | .Selection(settings => settings 7 | .Action("Accessibility", new { date = "{0}", theme = Request.QueryString["theme"] })) 8 | .Value((DateTime)ViewData["date"]) 9 | ) 10 | 11 | 14 | 15 | @Html.Partial("AccessibilityValidation") 16 | 17 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase15.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 2 | 3 | 17 | 18 | <% Html.Telerik().ScriptRegistrar().OnDocumentReady(() => {%>window.examplesBaseUrl = '<%= Url.Content("~/") %>';<%}); %> -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase15.cshtml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 17 | 18 | @{ Html.Telerik().ScriptRegistrar().OnDocumentReady(@window.examplesBaseUrl = '@Url.Content("~/")';); } 19 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase18.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 2 | 3 | 4 | 5 | <% using (Html.Configurator("Validation summary").Begin()) { %> 6 | <%= Html.ValidationSummary() %> 7 | <% } %> 8 | 9 | <% using ( Html.BeginForm() ) { %> 10 |
11 |
Edit Customer
12 | 13 |
    14 |
  • 15 | <%= Html.LabelFor(e => e.FirstName) %> 16 | <%= Html.TextBoxFor(e => e.FirstName) %> 17 |
    <%= Html.ValidationMessageFor(e => e.FirstName, "The FirstName field is required.")%>
    18 |
  • 19 |
  • 20 | <%= Html.LabelFor(e => e.LastName) %> 21 | <%= Html.TextBoxFor(e => e.LastName) %> 22 |
    <%= Html.ValidationMessageFor(e => e.LastName, "The LastName field is required.")%>
    23 |
  • 24 |
  • 25 | <%= Html.LabelFor(e => e.Notes)%> 26 | <%= Html.Telerik().Editor() 27 | .Name("Notes") 28 | .HtmlAttributes(new { style = "float: left; width: 345px;" }) 29 | .Tools(tools => tools 30 | .Clear() 31 | .Bold().Italic().Underline() 32 | .Separator() 33 | .CreateLink().Unlink() 34 | ) 35 | %> 36 |
    <%= Html.ValidationMessageFor(e => e.Notes, "The Notes field is required.")%>
    37 |
  • 38 |
  • 39 | 40 |
  • 41 |
42 |
43 | <% } %> 44 | 45 | <% if (ViewData["notes"] != null) 46 | { %> 47 |

FirstName : <%= ViewData["FirstName"]%>

48 |

LastName : <%= ViewData["LastName"]%>

49 |

Notes : <%= HttpUtility.HtmlEncode((string)ViewData["Notes"]) %>

50 | <% } %> 51 | 52 |
53 | 54 | 55 | 56 | 110 | 111 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase18.cshtml: -------------------------------------------------------------------------------- 1 | @model EmployeeDto 2 | 3 | 4 | 5 | @using (Html.Configurator("Validation summary").Begin()) { 6 | @Html.ValidationSummary() 7 | } 8 | 9 | @using ( Html.BeginForm() ) { 10 |
11 |
Edit Customer
12 | 13 |
    14 |
  • 15 | @Html.LabelFor(e => e.FirstName) 16 | @Html.TextBoxFor(e => e.FirstName) 17 |
    @Html.ValidationMessageFor(e => e.FirstName, "The FirstName field is required.")
    18 |
  • 19 |
  • 20 | @Html.LabelFor(e => e.LastName) 21 | @Html.TextBoxFor(e => e.LastName) 22 |
    @Html.ValidationMessageFor(e => e.LastName, "The LastName field is required.")
    23 |
  • 24 |
  • 25 | @Html.LabelFor(e => e.Notes) 26 | @(Html.Telerik().Editor() 27 | .Name("Notes") 28 | .HtmlAttributes(new { style = "float: left; width: 345px;" }) 29 | .Tools(tools => tools 30 | .Clear() 31 | .Bold().Italic().Underline() 32 | .Separator() 33 | .CreateLink().Unlink() 34 | ) 35 | ) 36 |
    @Html.ValidationMessageFor(e => e.Notes, "The Notes field is required.")
    37 |
  • 38 |
  • 39 | 40 |
  • 41 |
42 |
43 | } 44 | 45 | @if (ViewData["notes"] != null) 46 | { 47 |

FirstName : @ViewData["FirstName"]

48 |

LastName : @ViewData["LastName"]

49 |

Notes : @ViewData["Notes"]

50 | } 51 | 52 | 53 | 54 | @section HeadContent { 55 | 56 | 57 | 111 | 112 | 113 | } 114 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase19.aspx.txt.skip: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage>" %> 2 | 3 | 4 | 5 | 6 | <% Html.Telerik().Grid(Model) 7 | .Name("Grid") 8 | .Columns(columns => 9 | { 10 | columns.Bound(o => o.OrderID) 11 | .ClientTemplate("") 12 | .Title("") 13 | .Width(36) 14 | .HtmlAttributes(new { style = "text-align:center" }); 15 | 16 | columns.Bound(o => o.OrderID).Width(100); 17 | columns.Bound(o => o.Customer.ContactName).Width(200); 18 | columns.Bound(o => o.ShipAddress); 19 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 20 | }) 21 | .DataBinding(dataBinding => dataBinding.Ajax() 22 | .Select("_CheckBoxesAjax", "Grid")) 23 | .Scrollable() 24 | .Pageable() 25 | .Render(); 26 | %> 27 | 28 |

29 | 30 | 45 |

46 | 47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase19.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | 3 | 4 | 5 | 6 | @{ Html.Telerik().Grid(Model) 7 | .Name("Grid") 8 | .Columns(columns => 9 | { 10 | columns.Bound(o => o.OrderID) 11 | .ClientTemplate("") 12 | .Title("") 13 | .Width(36) 14 | .HtmlAttributes(new { style = "text-align:center" }); 15 | 16 | columns.Bound(o => o.OrderID).Width(100); 17 | columns.Bound(o => o.Customer.ContactName).Width(200); 18 | columns.Bound(o => o.ShipAddress); 19 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 20 | }) 21 | .DataBinding(dataBinding => dataBinding.Ajax() 22 | .Select("_CheckBoxesAjax", "Grid")) 23 | .Scrollable() 24 | .Pageable() 25 | .Render(); 26 | } 27 | 28 |

29 | 30 | 45 |

46 | 47 |
48 |
49 | 50 | 51 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase20.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage>" %> 2 | 3 | 4 | <%Html.Telerik().Grid(Model) 5 | .Name("Grid") 6 | .ToolBar(toolBar => toolBar.Template(() => 7 | { %> 8 | 10 | <% Html.Telerik().ComboBox() 11 | .Name("Customers") 12 | .DataBinding(binding => binding.Ajax().Select("_GetCustomers", "Grid")) 13 | .AutoFill(true) 14 | .Filterable(filtering => 15 | { 16 | filtering.FilterMode(AutoCompleteFilterMode.StartsWith); 17 | }) 18 | .HtmlAttributes(new { style = "width: 300px" }) 19 | .HighlightFirstMatch(true) 20 | .ClientEvents(events => events.OnChange("customerChange")) 21 | .Render(); 22 | %> 23 | <% })) 24 | .Columns(columns => 25 | { 26 | columns.Bound(o => o.OrderID).Width(100); 27 | columns.Bound(o => o.Customer.CompanyName); 28 | columns.Bound(o => o.ShipAddress); 29 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(100); 30 | }) 31 | .DataBinding(dataBinding => dataBinding.Ajax().Select("_CustomToolBar", "Grid")) 32 | .Pageable() 33 | .Sortable() 34 | .Render(); 35 | %> 36 | 45 | 46 | 47 | 58 | 59 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase20.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | 3 | @{Html.Telerik().Grid(Model) 4 | .Name("Grid") 5 | .ToolBar(toolBar => toolBar.Template(@ 6 | 8 | @{ Html.Telerik().ComboBox() 9 | .Name("Customers") 10 | .DataBinding(binding => binding.Ajax().Select("_GetCustomers", "Grid")) 11 | .AutoFill(true) 12 | .Filterable(filtering => 13 | { 14 | filtering.FilterMode(AutoCompleteFilterMode.StartsWith); 15 | }) 16 | .HtmlAttributes(new { style = "width: 300px" }) 17 | .HighlightFirstMatch(true) 18 | .ClientEvents(events => events.OnChange("customerChange")) 19 | .Render(); 20 | } 21 | )) 22 | .Columns(columns => 23 | { 24 | columns.Bound(o => o.OrderID).Width(100); 25 | columns.Bound(o => o.Customer.CompanyName); 26 | columns.Bound(o => o.ShipAddress); 27 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(100); 28 | }) 29 | .DataBinding(dataBinding => dataBinding.Ajax().Select("_CustomToolBar", "Grid")) 30 | .Pageable() 31 | .Sortable() 32 | .Render(); 33 | } 34 | 43 | 44 | @section HeadContent { 45 | 46 | 57 | 58 | } 59 | 60 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase23.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Examples.Master" %> 2 | 3 | 4 | 5 | <% Html.Telerik().Window() 6 | .Name("Window") 7 | .Title("Submit feedback") 8 | .Content(() => {%> 9 | <% using (Html.BeginForm("popupform", "window", FormMethod.Post, new { id = "feedback-form" })) 10 | { %> 11 |

This is just an example, sent data will not be saved.

12 | 13 | 14 | <%= Html.TextBox("name") %> 15 | 16 | 17 | <%= Html.TextBox("email") %> 18 | 19 | 20 | <%= Html.Telerik().Editor() 21 | .Name("comment") 22 | .Tools(tools => tools 23 | .Clear() 24 | .Bold().Italic().Separator() 25 | .InsertOrderedList().InsertUnorderedList().Separator() 26 | .Indent().Outdent() 27 | )%> 28 | 29 |
30 | 31 |
32 | 33 | <% } %> 34 | <%}) 35 | .Width(400) 36 | .Draggable(true) 37 | .Modal(true) 38 | .Visible(false) 39 | .Render(); 40 | %> 41 | 42 | 43 | 44 | <% if (ViewData["name"] != null || ViewData["email"] != null || ViewData["comment"] != null) { %> 45 |
46 |

Feedback:

47 | 48 |

49 | Name: <%= ViewData["name"] %>
50 | E-mail: <%= ViewData["email"] %>
51 | Comment: <%= ViewData["comment"] %> 52 |

53 |
54 | <% } %> 55 | 56 | <% Html.Telerik().ScriptRegistrar() 57 | .OnDocumentReady(() => 58 | {%> 59 | // open the initially hidden window when the button is clicked 60 | $('#feedback-open-button') 61 | .click(function(e) { 62 | e.preventDefault(); 63 | $('#Window').data('tWindow').center().open(); 64 | }); 65 | 66 | // add button hovers 67 | $('.t-button').live('mouseenter', $.telerik.buttonHover) 68 | .live('mouseleave', $.telerik.buttonLeave); 69 | <%}); %> 70 | 71 |
72 | 73 | 74 | 75 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase23.cshtml: -------------------------------------------------------------------------------- 1 | @{ Html.Telerik().Window() 2 | .Name("Window") 3 | .Title("Submit feedback") 4 | .Content(@ 5 | @using (Html.BeginForm("popupform", "window", FormMethod.Post, new { id = "feedback-form" })) 6 | { 7 |

This is just an example, sent data will not be saved.

8 | 9 | 10 | @Html.TextBox("name") 11 | 12 | 13 | @Html.TextBox("email") 14 | 15 | 16 | @(Html.Telerik().Editor() 17 | .Name("comment") 18 | .Tools(tools => tools 19 | .Clear() 20 | .Bold().Italic().Separator() 21 | .InsertOrderedList().InsertUnorderedList().Separator() 22 | .Indent().Outdent() 23 | )) 24 | 25 |
26 | 27 |
28 | 29 | } 30 |
) 31 | .Width(400) 32 | .Draggable(true) 33 | .Modal(true) 34 | .Visible(false) 35 | .Render(); 36 | } 37 | 38 | 39 | 40 | @if (ViewData["name"] != null || ViewData["email"] != null || ViewData["comment"] != null) { 41 |
42 |

Feedback:

43 | 44 |

45 | Name: @ViewData["name"]
46 | E-mail: @ViewData["email"]
47 | Comment: @ViewData["comment"] 48 |

49 |
50 | } 51 | 52 | @{ Html.Telerik().ScriptRegistrar() 53 | .OnDocumentReady(@ 54 | // open the initially hidden window when the button is clicked 55 | $('#feedback-open-button') 56 | .click(function(e) { 57 | e.preventDefault(); 58 | $('#Window').data('tWindow').center().open(); 59 | }); 60 | 61 | // add button hovers 62 | $('.t-button').live('mouseenter', $.telerik.buttonHover) 63 | .live('mouseleave', $.telerik.buttonLeave); 64 | ); } 65 | 66 | @section HeadContent { 67 | 68 | 112 | 113 | } 114 | 115 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase24.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage>" %> 2 | 3 | 4 | <%-- Comment --%> 5 | <% using (Html.Configurator("The grid should...") 6 | .PostTo("FirstLook", "Grid") 7 | .Begin()) 8 | { %> 9 | <%-- 10 | Multi-line 11 | comment 12 | --%> 13 |
    14 |
  • <%= Html.CheckBox("ajax", true, "make AJAX requests")%>
  • 15 |
  • <%= Html.CheckBox("grouping", true, "allow grouping of data")%>
  • 16 |
  • <%= Html.CheckBox("filtering", true, "allow filtering of data")%>
  • 17 |
  • <%= Html.CheckBox("paging", true, "have pages with 10 items")%>
  • 18 |
  • <%= Html.CheckBox("scrolling", true, "show a scrollbar when there are many items")%>
  • 19 |
  • <%= Html.CheckBox("sorting", true, "allow sorting of data")%>
  • 20 |
  • <%= Html.CheckBox("showFooter", true, "show footer")%>
  • 21 |
22 | 23 | <% } %> 24 | 25 | <%= Html.Telerik().Grid(Model) 26 | .Name("Grid") 27 | .Columns(columns => 28 | { 29 | columns.Bound(o => o.OrderID).Width(100); 30 | columns.Bound(o => o.ContactName).Width(200); 31 | columns.Bound(o => o.ShipAddress); 32 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 33 | }) 34 | .DataBinding(dataBinding => 35 | { 36 | dataBinding.Server().Select("FirstLook", "Grid", new { ajax = ViewData["ajax"] }); 37 | dataBinding.Ajax().Select("_FirstLook", "Grid").Enabled((bool)ViewData["ajax"]); 38 | }) 39 | .Scrollable(scrolling => scrolling.Enabled((bool)ViewData["scrolling"])) 40 | .Sortable(sorting => sorting.Enabled((bool)ViewData["sorting"])) 41 | .Pageable(paging => paging.Enabled((bool)ViewData["paging"])) 42 | .Filterable(filtering => filtering.Enabled((bool)ViewData["filtering"])) 43 | .Groupable(grouping => grouping.Enabled((bool)ViewData["grouping"])) 44 | .Footer((bool)ViewData["showFooter"]) 45 | %> 46 |
47 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase24.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | @* Comment *@ 3 | @using (Html.Configurator("The grid should...") 4 | .PostTo("FirstLook", "Grid") 5 | .Begin()) 6 | { 7 | @* 8 | Multi-line 9 | comment 10 | *@ 11 |
    12 |
  • @Html.CheckBox("ajax", true, "make AJAX requests")
  • 13 |
  • @Html.CheckBox("grouping", true, "allow grouping of data")
  • 14 |
  • @Html.CheckBox("filtering", true, "allow filtering of data")
  • 15 |
  • @Html.CheckBox("paging", true, "have pages with 10 items")
  • 16 |
  • @Html.CheckBox("scrolling", true, "show a scrollbar when there are many items")
  • 17 |
  • @Html.CheckBox("sorting", true, "allow sorting of data")
  • 18 |
  • @Html.CheckBox("showFooter", true, "show footer")
  • 19 |
20 | 21 | } 22 | @(Html.Telerik().Grid(Model) 23 | .Name("Grid") 24 | .Columns(columns => 25 | { 26 | columns.Bound(o => o.OrderID).Width(100); 27 | columns.Bound(o => o.ContactName).Width(200); 28 | columns.Bound(o => o.ShipAddress); 29 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 30 | }) 31 | .DataBinding(dataBinding => 32 | { 33 | dataBinding.Server().Select("FirstLook", "Grid", new { ajax = ViewData["ajax"] }); 34 | dataBinding.Ajax().Select("_FirstLook", "Grid").Enabled((bool)ViewData["ajax"]); 35 | }) 36 | .Scrollable(scrolling => scrolling.Enabled((bool)ViewData["scrolling"])) 37 | .Sortable(sorting => sorting.Enabled((bool)ViewData["sorting"])) 38 | .Pageable(paging => paging.Enabled((bool)ViewData["paging"])) 39 | .Filterable(filtering => filtering.Enabled((bool)ViewData["filtering"])) 40 | .Groupable(grouping => grouping.Enabled((bool)ViewData["grouping"])) 41 | .Footer((bool)ViewData["showFooter"]) 42 | ) -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase25.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage>" %> 2 | <%@ Import Namespace="Project.Namespace.To.Models" %> 3 | 4 | 5 | <% using (Html.Configurator("The grid should...") 6 | .PostTo("FirstLook", "Grid") 7 | .Begin()) 8 | { %> 9 |
    10 |
  • <%= Html.CheckBox("ajax", true, "make AJAX requests")%>
  • 11 |
  • <%= Html.CheckBox("grouping", true, "allow grouping of data")%>
  • 12 |
  • <%= Html.CheckBox("filtering", true, "allow filtering of data")%>
  • 13 |
  • <%= Html.CheckBox("paging", true, "have pages with 10 items")%>
  • 14 |
  • <%= Html.CheckBox("scrolling", true, "show a scrollbar when there are many items")%>
  • 15 |
  • <%= Html.CheckBox("sorting", true, "allow sorting of data")%>
  • 16 |
  • <%= Html.CheckBox("showFooter", true, "show footer")%>
  • 17 |
18 | 19 | <% } %> 20 | 21 | <%= Html.Telerik().Grid(Model) 22 | .Name("Grid") 23 | .Columns(columns => 24 | { 25 | columns.Bound(o => o.OrderID).Width(100); 26 | columns.Bound(o => o.ContactName).Width(200); 27 | columns.Bound(o => o.ShipAddress); 28 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 29 | }) 30 | .DataBinding(dataBinding => 31 | { 32 | dataBinding.Server().Select("FirstLook", "Grid", new { ajax = ViewData["ajax"] }); 33 | dataBinding.Ajax().Select("_FirstLook", "Grid").Enabled((bool)ViewData["ajax"]); 34 | }) 35 | .Scrollable(scrolling => scrolling.Enabled((bool)ViewData["scrolling"])) 36 | .Sortable(sorting => sorting.Enabled((bool)ViewData["sorting"])) 37 | .Pageable(paging => paging.Enabled((bool)ViewData["paging"])) 38 | .Filterable(filtering => filtering.Enabled((bool)ViewData["filtering"])) 39 | .Groupable(grouping => grouping.Enabled((bool)ViewData["grouping"])) 40 | .Footer((bool)ViewData["showFooter"]) 41 | %> 42 |
43 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase25.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | @using Project.Namespace.To.Models 3 | @using (Html.Configurator("The grid should...") 4 | .PostTo("FirstLook", "Grid") 5 | .Begin()) 6 | { 7 |
    8 |
  • @Html.CheckBox("ajax", true, "make AJAX requests")
  • 9 |
  • @Html.CheckBox("grouping", true, "allow grouping of data")
  • 10 |
  • @Html.CheckBox("filtering", true, "allow filtering of data")
  • 11 |
  • @Html.CheckBox("paging", true, "have pages with 10 items")
  • 12 |
  • @Html.CheckBox("scrolling", true, "show a scrollbar when there are many items")
  • 13 |
  • @Html.CheckBox("sorting", true, "allow sorting of data")
  • 14 |
  • @Html.CheckBox("showFooter", true, "show footer")
  • 15 |
16 | 17 | } 18 | @(Html.Telerik().Grid(Model) 19 | .Name("Grid") 20 | .Columns(columns => 21 | { 22 | columns.Bound(o => o.OrderID).Width(100); 23 | columns.Bound(o => o.ContactName).Width(200); 24 | columns.Bound(o => o.ShipAddress); 25 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 26 | }) 27 | .DataBinding(dataBinding => 28 | { 29 | dataBinding.Server().Select("FirstLook", "Grid", new { ajax = ViewData["ajax"] }); 30 | dataBinding.Ajax().Select("_FirstLook", "Grid").Enabled((bool)ViewData["ajax"]); 31 | }) 32 | .Scrollable(scrolling => scrolling.Enabled((bool)ViewData["scrolling"])) 33 | .Sortable(sorting => sorting.Enabled((bool)ViewData["sorting"])) 34 | .Pageable(paging => paging.Enabled((bool)ViewData["paging"])) 35 | .Filterable(filtering => filtering.Enabled((bool)ViewData["filtering"])) 36 | .Groupable(grouping => grouping.Enabled((bool)ViewData["grouping"])) 37 | .Footer((bool)ViewData["showFooter"]) 38 | ) -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase26.aspx.txt: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage>" %> 2 | <%@ Import Namespace="Project.Namespace.To.Models" %> 3 | 4 | 5 | $(document).ready(function() { 6 | var url = "<%: Url.Action("Action", "Controller", routeValues) %>"; 7 | <% 8 | var testVar = 0; 9 | 10 | for(var i = 0; i < 9999; i++) { 11 | testVar += i; 12 | } 13 | 14 | string s = testVar.ToString(); 15 | %> 16 | 17 | var test = "<%: s %>"; 18 | }); 19 | 20 | 21 | 22 | <% using (Html.Configurator("The grid should...") 23 | .PostTo("FirstLook", "Grid") 24 | .Begin()) 25 | { %> 26 |
    27 |
  • <%= Html.CheckBox("ajax", true, "make AJAX requests")%>
  • 28 |
  • <%= Html.CheckBox("grouping", true, "allow grouping of data")%>
  • 29 |
  • <%= Html.CheckBox("filtering", true, "allow filtering of data")%>
  • 30 |
  • <%= Html.CheckBox("paging", true, "have pages with 10 items")%>
  • 31 |
  • <%= Html.CheckBox("scrolling", true, "show a scrollbar when there are many items")%>
  • 32 |
  • <%= Html.CheckBox("sorting", true, "allow sorting of data")%>
  • 33 |
  • <%= Html.CheckBox("showFooter", true, "show footer")%>
  • 34 |
35 | 36 | <% } %> 37 | 38 | <%= Html.Telerik().Grid(Model) 39 | .Name("Grid") 40 | .Columns(columns => 41 | { 42 | columns.Bound(o => o.OrderID).Width(100); 43 | columns.Bound(o => o.ContactName).Width(200); 44 | columns.Bound(o => o.ShipAddress); 45 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 46 | }) 47 | .DataBinding(dataBinding => 48 | { 49 | dataBinding.Server().Select("FirstLook", "Grid", new { ajax = ViewData["ajax"] }); 50 | dataBinding.Ajax().Select("_FirstLook", "Grid").Enabled((bool)ViewData["ajax"]); 51 | }) 52 | .Scrollable(scrolling => scrolling.Enabled((bool)ViewData["scrolling"])) 53 | .Sortable(sorting => sorting.Enabled((bool)ViewData["sorting"])) 54 | .Pageable(paging => paging.Enabled((bool)ViewData["paging"])) 55 | .Filterable(filtering => filtering.Enabled((bool)ViewData["filtering"])) 56 | .Groupable(grouping => grouping.Enabled((bool)ViewData["grouping"])) 57 | .Footer((bool)ViewData["showFooter"]) 58 | %> 59 |
60 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests.Integration/TestCases/TestCase26.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | @using Project.Namespace.To.Models 3 | @section scriptcontent { 4 | $(document).ready(function() { 5 | var url = "@Url.Action("Action", "Controller", routeValues)"; 6 | @{ 7 | var testVar = 0; 8 | 9 | for(var i = 0; i < 9999; i++) { 10 | testVar += i; 11 | } 12 | 13 | string s = testVar.ToString(); 14 | } 15 | 16 | var test = "@s"; 17 | }); 18 | } 19 | 20 | @using (Html.Configurator("The grid should...") 21 | .PostTo("FirstLook", "Grid") 22 | .Begin()) 23 | { 24 |
    25 |
  • @Html.CheckBox("ajax", true, "make AJAX requests")
  • 26 |
  • @Html.CheckBox("grouping", true, "allow grouping of data")
  • 27 |
  • @Html.CheckBox("filtering", true, "allow filtering of data")
  • 28 |
  • @Html.CheckBox("paging", true, "have pages with 10 items")
  • 29 |
  • @Html.CheckBox("scrolling", true, "show a scrollbar when there are many items")
  • 30 |
  • @Html.CheckBox("sorting", true, "allow sorting of data")
  • 31 |
  • @Html.CheckBox("showFooter", true, "show footer")
  • 32 |
33 | 34 | } 35 | 36 | @(Html.Telerik().Grid(Model) 37 | .Name("Grid") 38 | .Columns(columns => 39 | { 40 | columns.Bound(o => o.OrderID).Width(100); 41 | columns.Bound(o => o.ContactName).Width(200); 42 | columns.Bound(o => o.ShipAddress); 43 | columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 44 | }) 45 | .DataBinding(dataBinding => 46 | { 47 | dataBinding.Server().Select("FirstLook", "Grid", new { ajax = ViewData["ajax"] }); 48 | dataBinding.Ajax().Select("_FirstLook", "Grid").Enabled((bool)ViewData["ajax"]); 49 | }) 50 | .Scrollable(scrolling => scrolling.Enabled((bool)ViewData["scrolling"])) 51 | .Sortable(sorting => sorting.Enabled((bool)ViewData["sorting"])) 52 | .Pageable(paging => paging.Enabled((bool)ViewData["paging"])) 53 | .Filterable(filtering => filtering.Enabled((bool)ViewData["filtering"])) 54 | .Groupable(grouping => grouping.Enabled((bool)ViewData["grouping"])) 55 | .Footer((bool)ViewData["showFooter"]) 56 | ) -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("RazorConverter.Core.Tests")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Microsoft")] 12 | [assembly: AssemblyProduct("RazorConverter.Core.Tests")] 13 | [assembly: AssemblyCopyright("Copyright © Microsoft 2010")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("132ec67d-0a33-4dcc-ade0-396a0b7df867")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Converters/CodeBlockConverterTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.Converters 2 | { 3 | using Moq; 4 | using Telerik.RazorConverter.Razor.Converters; 5 | using Telerik.RazorConverter.Razor.DOM; 6 | using Telerik.RazorConverter.WebForms.DOM; 7 | using Xunit; 8 | 9 | public class CodeBlockConverterTests 10 | { 11 | private readonly CodeBlockConverter converter; 12 | private readonly Mock codeBlockMock; 13 | private readonly Mock nodeFactoryMock; 14 | 15 | public CodeBlockConverterTests() 16 | { 17 | nodeFactoryMock = new Mock(); 18 | converter = new CodeBlockConverter(nodeFactoryMock.Object); 19 | codeBlockMock = new Mock(); 20 | } 21 | 22 | [Fact] 23 | public void Should_be_able_to_convert_codeblock_node() 24 | { 25 | converter.CanConvertNode(codeBlockMock.Object).ShouldBeTrue(); 26 | } 27 | 28 | [Fact] 29 | public void Should_not_be_able_to_convert_generic_node() 30 | { 31 | converter.CanConvertNode(new Mock().Object).ShouldBeFalse(); 32 | } 33 | 34 | [Fact] 35 | public void Should_require_prefix_for_complete_code_block() 36 | { 37 | codeBlockMock.Setup(cb => cb.Code).Returns("if (true) { doSomething(); }"); 38 | codeBlockMock.Setup(cb => cb.BlockType).Returns(CodeBlockNodeType.Complete); 39 | nodeFactoryMock.Setup(f => f.CreateCodeNode("if (true) { doSomething(); }", true, false)).Verifiable(); 40 | 41 | converter.ConvertNode(codeBlockMock.Object); 42 | 43 | nodeFactoryMock.Verify(); 44 | } 45 | 46 | [Fact] 47 | public void Should_require_prefix_for_opening_code_block() 48 | { 49 | codeBlockMock.Setup(cb => cb.Code).Returns("if (true) {"); 50 | codeBlockMock.Setup(cb => cb.BlockType).Returns(CodeBlockNodeType.Opening); 51 | nodeFactoryMock.Setup(f => f.CreateCodeNode("if (true) {", true, false)).Verifiable(); 52 | 53 | converter.ConvertNode(codeBlockMock.Object); 54 | 55 | nodeFactoryMock.Verify(); 56 | } 57 | 58 | [Fact] 59 | public void Should_not_require_prefix_for_continued_code_block() 60 | { 61 | codeBlockMock.Setup(cb => cb.Code).Returns("} else {"); 62 | codeBlockMock.Setup(cb => cb.BlockType).Returns(CodeBlockNodeType.Continued); 63 | nodeFactoryMock.Setup(f => f.CreateCodeNode("} else {", false, false)).Verifiable(); 64 | 65 | converter.ConvertNode(codeBlockMock.Object); 66 | 67 | nodeFactoryMock.Verify(); 68 | } 69 | 70 | [Fact] 71 | public void Should_not_require_prefix_for_closing_code_block() 72 | { 73 | codeBlockMock.Setup(cb => cb.Code).Returns("}"); 74 | codeBlockMock.Setup(cb => cb.BlockType).Returns(CodeBlockNodeType.Closing); 75 | nodeFactoryMock.Setup(f => f.CreateCodeNode("}", false, false)).Verifiable(); 76 | 77 | converter.ConvertNode(codeBlockMock.Object); 78 | 79 | nodeFactoryMock.Verify(); 80 | } 81 | 82 | [Fact] 83 | public void Should_transform_RenderPartial_to_RenderPage() 84 | { 85 | codeBlockMock.Setup(cb => cb.Code).Returns(@"Html.RenderPartial(""AccessibilityValidation"");"); 86 | 87 | codeBlockMock.Setup(cb => cb.BlockType).Returns(CodeBlockNodeType.Complete); 88 | nodeFactoryMock.Setup(f => f.CreateCodeNode(@"@Html.Partial(""AccessibilityValidation"")", false, false)).Verifiable(); 89 | 90 | converter.ConvertNode(codeBlockMock.Object); 91 | 92 | nodeFactoryMock.Verify(); 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Converters/CodeGroupConverterTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.Converters 2 | { 3 | using Moq; 4 | using Telerik.RazorConverter; 5 | using Telerik.RazorConverter.Razor.Converters; 6 | using Telerik.RazorConverter.Razor.DOM; 7 | using Telerik.RazorConverter.WebForms.DOM; 8 | using Xunit; 9 | 10 | public class CodeGroupConverterTests 11 | { 12 | private readonly CodeGroupConverter converter; 13 | private readonly Mock nodeConverterProviderMock; 14 | private readonly Mock> childNodeConverterMock; 15 | private readonly Mock codeGroupNodeMock; 16 | 17 | public CodeGroupConverterTests() 18 | { 19 | childNodeConverterMock = new Mock>(); 20 | nodeConverterProviderMock = new Mock(); 21 | nodeConverterProviderMock.SetupGet(p => p.NodeConverters) 22 | .Returns(new INodeConverter[] { childNodeConverterMock.Object }); 23 | 24 | converter = new CodeGroupConverter(nodeConverterProviderMock.Object); 25 | codeGroupNodeMock = new Mock(); 26 | } 27 | 28 | [Fact] 29 | public void Should_be_able_to_convert_code_block_group_node() 30 | { 31 | converter.CanConvertNode(codeGroupNodeMock.Object).ShouldBeTrue(); 32 | } 33 | 34 | [Fact] 35 | public void Should_drop_code_block_group_node_when_it_has_no_child_nodes() 36 | { 37 | codeGroupNodeMock.SetupGet(cg => cg.Children).Returns(new IWebFormsNode[] { }); 38 | converter.ConvertNode(codeGroupNodeMock.Object).Count.ShouldEqual(0); 39 | } 40 | 41 | [Fact] 42 | public void Should_use_provided_converters_for_child_nodes() 43 | { 44 | var childNode = new TextNode { Text = "TEXT" }; 45 | codeGroupNodeMock.SetupGet(cg => cg.Children).Returns(new IWebFormsNode[] {childNode }); 46 | childNodeConverterMock.Setup(c => c.CanConvertNode(childNode)).Returns(true).Verifiable(); 47 | childNodeConverterMock.Setup(c => c.ConvertNode(childNode)).Returns(new IRazorNode[] { new RazorTextNode() }); 48 | 49 | var result = converter.ConvertNode(codeGroupNodeMock.Object); 50 | 51 | result.Count.ShouldEqual(1); 52 | result[0].ShouldBeType(typeof(RazorTextNode)); 53 | childNodeConverterMock.Verify(); 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Converters/CommentNodeConverterTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.Converters 2 | { 3 | using Moq; 4 | using Telerik.RazorConverter.Razor.Converters; 5 | using Telerik.RazorConverter.Razor.DOM; 6 | using Telerik.RazorConverter.WebForms.DOM; 7 | using Xunit; 8 | 9 | public class CommentNodeConverterTests 10 | { 11 | private readonly CommentNodeConverter converter; 12 | private readonly Mock commentNodeMock; 13 | private readonly Mock nodeFactoryMock; 14 | 15 | public CommentNodeConverterTests() 16 | { 17 | nodeFactoryMock = new Mock(); 18 | converter = new CommentNodeConverter(nodeFactoryMock.Object); 19 | commentNodeMock = new Mock(); 20 | } 21 | 22 | [Fact] 23 | public void Should_be_able_to_convert_comment_node() 24 | { 25 | converter.CanConvertNode(commentNodeMock.Object).ShouldBeTrue(); 26 | } 27 | 28 | [Fact] 29 | public void Should_not_be_able_to_convert_generic_node() 30 | { 31 | converter.CanConvertNode(new Mock().Object).ShouldBeFalse(); 32 | } 33 | 34 | [Fact] 35 | public void Should_convert_text_as_it_is() 36 | { 37 | commentNodeMock.Setup(n => n.Text).Returns(" TEXT "); 38 | nodeFactoryMock.Setup(f => f.CreateCommentNode(" TEXT ")).Verifiable(); 39 | 40 | converter.ConvertNode(commentNodeMock.Object); 41 | 42 | nodeFactoryMock.Verify(); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Converters/TextNodeConverterTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.Converters 2 | { 3 | using Moq; 4 | using Telerik.RazorConverter.Razor.Converters; 5 | using Telerik.RazorConverter.Razor.DOM; 6 | using Telerik.RazorConverter.WebForms.DOM; 7 | using Xunit; 8 | 9 | public class TextNodeConverterTests 10 | { 11 | private readonly TextNodeConverter converter; 12 | private readonly Mock textNodeMock; 13 | private readonly Mock nodeFactoryMock; 14 | 15 | public TextNodeConverterTests() 16 | { 17 | nodeFactoryMock = new Mock(); 18 | converter = new TextNodeConverter(nodeFactoryMock.Object); 19 | textNodeMock = new Mock(); 20 | } 21 | 22 | [Fact] 23 | public void Should_be_able_to_convert_text_node() 24 | { 25 | converter.CanConvertNode(textNodeMock.Object).ShouldBeTrue(); 26 | } 27 | 28 | [Fact] 29 | public void Should_not_be_able_to_convert_generic_node() 30 | { 31 | converter.CanConvertNode(new Mock().Object).ShouldBeFalse(); 32 | } 33 | 34 | [Fact] 35 | public void Should_convert_text_as_it_is() 36 | { 37 | textNodeMock.Setup(n => n.Text).Returns(" TEXT "); 38 | nodeFactoryMock.Setup(f => f.CreateTextNode(" TEXT ")).Verifiable(); 39 | 40 | converter.ConvertNode(textNodeMock.Object); 41 | 42 | nodeFactoryMock.Verify(); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Converters/WebFormsToRazorConverterTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.Converters 2 | { 3 | using Moq; 4 | using Telerik.RazorConverter; 5 | using Telerik.RazorConverter.Razor.Converters; 6 | using Telerik.RazorConverter.Razor.DOM; 7 | using Telerik.RazorConverter.WebForms.DOM; 8 | using Xunit; 9 | 10 | public class WebFormsToRazorConverterTests 11 | { 12 | private readonly WebFormsToRazorConverter converter; 13 | private readonly Mock> documentMock; 14 | private readonly Mock childNodeMock; 15 | private readonly Mock converterProviderMock; 16 | private readonly Mock> firstNodeConverter; 17 | 18 | public WebFormsToRazorConverterTests() 19 | { 20 | firstNodeConverter = new Mock>(); 21 | 22 | converterProviderMock = new Mock(); 23 | converterProviderMock.SetupGet(c => c.NodeConverters) 24 | .Returns(new INodeConverter[] { firstNodeConverter.Object }); 25 | converter = new WebFormsToRazorConverter(converterProviderMock.Object); 26 | 27 | childNodeMock = new Mock(); 28 | var rootNodeMock = new Mock(); 29 | rootNodeMock.SetupGet(n => n.Children).Returns(new IWebFormsNode[] { childNodeMock.Object }); 30 | documentMock = new Mock>(); 31 | documentMock.SetupGet(d => d.RootNode).Returns(rootNodeMock.Object); 32 | } 33 | 34 | [Fact] 35 | public void Should_check_if_converter_supports_child_node() 36 | { 37 | firstNodeConverter.Setup(c => c.CanConvertNode(childNodeMock.Object)).Verifiable(); 38 | converter.Convert(documentMock.Object); 39 | firstNodeConverter.Verify(); 40 | } 41 | 42 | [Fact] 43 | public void Should_call_converter_if_supports_child_node() 44 | { 45 | firstNodeConverter.Setup(c => c.CanConvertNode(childNodeMock.Object)).Returns(true); 46 | firstNodeConverter.Setup(c => c.ConvertNode(childNodeMock.Object)) 47 | .Returns(new IRazorNode[] { new Mock().Object }) 48 | .Verifiable(); 49 | converter.Convert(documentMock.Object); 50 | firstNodeConverter.Verify(); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/DOM/RazorCodeNodeFactoryTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.DOM 2 | { 3 | using Telerik.RazorConverter.Razor.DOM; 4 | using Xunit; 5 | 6 | public class RazorCodeNodeFactoryTests 7 | { 8 | private readonly RazorCodeNodeFactory razorCodeNodeFactory; 9 | 10 | public RazorCodeNodeFactoryTests() 11 | { 12 | razorCodeNodeFactory = new RazorCodeNodeFactory(); 13 | } 14 | 15 | [Fact] 16 | public void Should_set_code() 17 | { 18 | var codeNode = razorCodeNodeFactory.CreateCodeNode(" CODE ", true, false); 19 | codeNode.Code.ShouldEqual(" CODE "); 20 | } 21 | 22 | [Fact] 23 | public void Should_set_requires_prefix() 24 | { 25 | var codeNode = razorCodeNodeFactory.CreateCodeNode("", true, false); 26 | codeNode.RequiresPrefix.ShouldEqual(true); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/DOM/RazorCommentNodeFactoryTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.DOM 2 | { 3 | using Telerik.RazorConverter.Razor.DOM; 4 | using Xunit; 5 | 6 | public class RazorCommentNodeFactoryTests 7 | { 8 | private readonly RazorCommentNodeFactory razorCommentNodeFactory; 9 | 10 | public RazorCommentNodeFactoryTests() 11 | { 12 | razorCommentNodeFactory = new RazorCommentNodeFactory(); 13 | } 14 | 15 | [Fact] 16 | public void Should_set_text() 17 | { 18 | var commentNode = razorCommentNodeFactory.CreateCommentNode("text"); 19 | commentNode.Text.ShouldEqual("text"); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/DOM/RazorDirectiveNodeFactoryTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.DOM 2 | { 3 | using Telerik.RazorConverter.Razor.DOM; 4 | using Xunit; 5 | 6 | public class RazorDirectiveNodeFactoryTests 7 | { 8 | private readonly RazorDirectiveNodeFactory razorDirectiveNodeFactory; 9 | 10 | public RazorDirectiveNodeFactoryTests() 11 | { 12 | razorDirectiveNodeFactory = new RazorDirectiveNodeFactory(); 13 | } 14 | 15 | [Fact] 16 | public void Should_set_directive() 17 | { 18 | var codeNode = razorDirectiveNodeFactory.CreateDirectiveNode("directive", ""); 19 | codeNode.Directive.ShouldEqual("directive"); 20 | } 21 | 22 | [Fact] 23 | public void Should_set_parameters() 24 | { 25 | var codeNode = razorDirectiveNodeFactory.CreateDirectiveNode("", " params "); 26 | codeNode.Parameters.ShouldEqual(" params "); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/DOM/RazorNodeTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.DOM 2 | { 3 | using Telerik.RazorConverter.Razor.DOM; 4 | using Xunit; 5 | 6 | public class RazorNodeTests 7 | { 8 | private readonly RazorNode razorNode; 9 | 10 | public RazorNodeTests() 11 | { 12 | razorNode = new RazorNode(); 13 | } 14 | 15 | [Fact] 16 | public void Should_set_parent_upon_adding() 17 | { 18 | var childNode = new RazorNode(); 19 | razorNode.Children.Add(childNode); 20 | 21 | childNode.Parent.ShouldBeSameAs(razorNode); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/DOM/RazorTextNodeFactoryTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.DOM 2 | { 3 | using Telerik.RazorConverter.Razor.DOM; 4 | using Xunit; 5 | 6 | public class RazorTextNodeFactoryTests 7 | { 8 | private readonly RazorTextNodeFactory razorTextNodeFactory; 9 | 10 | public RazorTextNodeFactoryTests() 11 | { 12 | razorTextNodeFactory = new RazorTextNodeFactory(); 13 | } 14 | 15 | [Fact] 16 | public void Should_set_text() 17 | { 18 | var codeNode = razorTextNodeFactory.CreateTextNode("text"); 19 | codeNode.Text.ShouldEqual("text"); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Rendering/CodeNodeRendererTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.Rendering 2 | { 3 | using Moq; 4 | using Telerik.RazorConverter.Razor.DOM; 5 | using Telerik.RazorConverter.Razor.Rendering; 6 | using Xunit; 7 | 8 | public class CodeNodeRendererTests 9 | { 10 | private readonly CodeNodeRenderer renderer; 11 | private readonly Mock codeNodeMock; 12 | 13 | public CodeNodeRendererTests() 14 | { 15 | renderer = new CodeNodeRenderer(); 16 | codeNodeMock = new Mock(); 17 | } 18 | 19 | [Fact] 20 | public void Should_support_code_node() 21 | { 22 | renderer.CanRenderNode(codeNodeMock.Object).ShouldBeTrue(); 23 | } 24 | 25 | [Fact] 26 | public void Should_not_support_other_nodes() 27 | { 28 | renderer.CanRenderNode(new Mock().Object).ShouldBeFalse(); 29 | } 30 | 31 | [Fact] 32 | public void Should_prefix_code() 33 | { 34 | codeNodeMock.SetupGet(n => n.Code).Returns("if (true) { doSomething(); }"); 35 | codeNodeMock.SetupGet(n => n.RequiresPrefix).Returns(true); 36 | 37 | renderer.RenderNode(codeNodeMock.Object).ShouldEqual("@if (true) { doSomething(); }"); 38 | } 39 | 40 | [Fact] 41 | public void Should_trim_start_of_code_when_adding_prefix() 42 | { 43 | codeNodeMock.SetupGet(n => n.Code).Returns(" if (true) { doSomething(); }"); 44 | codeNodeMock.SetupGet(n => n.RequiresPrefix).Returns(true); 45 | 46 | renderer.RenderNode(codeNodeMock.Object).ShouldEqual("@if (true) { doSomething(); }"); 47 | } 48 | 49 | [Fact] 50 | public void Should_not_prefix_continued_code() 51 | { 52 | codeNodeMock.SetupGet(n => n.Code).Returns("} else {"); 53 | codeNodeMock.SetupGet(n => n.RequiresPrefix).Returns(false); 54 | 55 | renderer.RenderNode(codeNodeMock.Object).ShouldEqual("} else {"); 56 | } 57 | 58 | [Fact] 59 | public void Should_not_trim_start_of_continued_code() 60 | { 61 | codeNodeMock.SetupGet(n => n.Code).Returns(" }"); 62 | codeNodeMock.SetupGet(n => n.RequiresPrefix).Returns(false); 63 | 64 | renderer.RenderNode(codeNodeMock.Object).ShouldEqual(" }"); 65 | } 66 | 67 | [Fact] 68 | public void Should_add_block() 69 | { 70 | codeNodeMock.SetupGet(n => n.Code).Returns(" code "); 71 | codeNodeMock.SetupGet(n => n.RequiresBlock).Returns(true); 72 | 73 | renderer.RenderNode(codeNodeMock.Object).ShouldEqual("@{\r\n code \r\n}"); 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Rendering/CommentNodeRendererTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor 2 | { 3 | using Moq; 4 | using Telerik.RazorConverter.Razor.DOM; 5 | using Telerik.RazorConverter.Razor.Rendering; 6 | using Xunit; 7 | 8 | public class CommentNodeRendererTests 9 | { 10 | private readonly CommentNodeRenderer renderer; 11 | private readonly Mock nodeMock; 12 | 13 | public CommentNodeRendererTests() 14 | { 15 | renderer = new CommentNodeRenderer(); 16 | nodeMock = new Mock(); 17 | } 18 | 19 | [Fact] 20 | public void Should_support_comment_node() 21 | { 22 | renderer.CanRenderNode(nodeMock.Object).ShouldBeTrue(); 23 | } 24 | 25 | [Fact] 26 | public void Should_not_support_generic_node() 27 | { 28 | renderer.CanRenderNode(new Mock().Object).ShouldBeFalse(); 29 | } 30 | 31 | [Fact] 32 | public void Should_render_comment_with_razor_syntax() 33 | { 34 | nodeMock.SetupGet(n => n.Text).Returns("TEXT"); 35 | 36 | renderer.RenderNode(nodeMock.Object).ShouldEqual("@*TEXT*@"); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Rendering/DirectiveNodeRendererTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor 2 | { 3 | using Moq; 4 | using Telerik.RazorConverter.Razor.DOM; 5 | using Telerik.RazorConverter.Razor.Rendering; 6 | using Xunit; 7 | 8 | public class DirectiveNodeRendererTests 9 | { 10 | private readonly DirectiveNodeRenderer renderer; 11 | private readonly Mock directiveNodeMock; 12 | 13 | public DirectiveNodeRendererTests() 14 | { 15 | renderer = new DirectiveNodeRenderer(); 16 | directiveNodeMock = new Mock(); 17 | } 18 | 19 | [Fact] 20 | public void Should_be_able_to_render_directive_node() 21 | { 22 | renderer.CanRenderNode(directiveNodeMock.Object).ShouldBeTrue(); 23 | } 24 | 25 | [Fact] 26 | public void Should_prefix_directive() 27 | { 28 | directiveNodeMock.SetupGet(n => n.Directive).Returns("inherits"); 29 | renderer.RenderNode(directiveNodeMock.Object).ShouldEqual("@inherits"); 30 | } 31 | 32 | [Fact] 33 | public void Should_render_parameters() 34 | { 35 | directiveNodeMock.SetupGet(n => n.Directive).Returns("inherits"); 36 | directiveNodeMock.SetupGet(n => n.Parameters).Returns("MyViewDataType"); 37 | renderer.RenderNode(directiveNodeMock.Object).ShouldEqual("@inherits MyViewDataType"); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Rendering/ExpressionNodeRendererTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.Rendering 2 | { 3 | using Moq; 4 | using Telerik.RazorConverter.Razor.DOM; 5 | using Telerik.RazorConverter.Razor.Rendering; 6 | using Xunit; 7 | 8 | public class ExpressionNodeRendererTests 9 | { 10 | private readonly ExpressionNodeRenderer renderer; 11 | private readonly Mock expressionNodeMock; 12 | 13 | public ExpressionNodeRendererTests() 14 | { 15 | renderer = new ExpressionNodeRenderer(); 16 | expressionNodeMock = new Mock(); 17 | } 18 | 19 | [Fact] 20 | public void Should_support_expression_node() 21 | { 22 | renderer.CanRenderNode(expressionNodeMock.Object).ShouldBeTrue(); 23 | } 24 | 25 | [Fact] 26 | public void Should_not_support_other_nodes() 27 | { 28 | renderer.CanRenderNode(new Mock().Object).ShouldBeFalse(); 29 | } 30 | 31 | [Fact] 32 | public void Should_prefix_expression() 33 | { 34 | expressionNodeMock.SetupGet(n => n.Expression).Returns("DateTime.Now"); 35 | 36 | renderer.RenderNode(expressionNodeMock.Object).ShouldEqual("@DateTime.Now"); 37 | } 38 | 39 | [Fact] 40 | public void Should_add_parentheses_for_multiline_expressions() 41 | { 42 | expressionNodeMock.SetupGet(n => n.Expression).Returns("Html.Telerik().Grid(orders)\r\n.Name(\"Grid 1\")"); 43 | expressionNodeMock.SetupGet(n => n.IsMultiline).Returns(true); 44 | 45 | renderer.RenderNode(expressionNodeMock.Object).ShouldEqual("@(Html.Telerik().Grid(orders)\r\n.Name(\"Grid 1\"))"); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Rendering/RazorViewRendererTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor 2 | { 3 | using Moq; 4 | using System.Collections.Generic; 5 | using Telerik.RazorConverter; 6 | using Telerik.RazorConverter.Razor.DOM; 7 | using Telerik.RazorConverter.Razor.Rendering; 8 | using Xunit; 9 | 10 | public class RazorViewRendererTests 11 | { 12 | private readonly RazorViewRenderer viewRenderer; 13 | private readonly Mock> documentMock; 14 | private readonly Mock rootNodeMock; 15 | private readonly Mock childNodeMock; 16 | private readonly Mock firstNodeRenderer; 17 | private readonly Mock secondNodeRenderer; 18 | private readonly IList renderers; 19 | private readonly Mock rendererProvider; 20 | 21 | public RazorViewRendererTests() 22 | { 23 | firstNodeRenderer = new Mock(); 24 | secondNodeRenderer = new Mock(); 25 | 26 | renderers = new List { firstNodeRenderer.Object, secondNodeRenderer.Object }; 27 | rendererProvider = new Mock(); 28 | rendererProvider.SetupGet(p => p.NodeRenderers).Returns(renderers); 29 | 30 | viewRenderer = new RazorViewRenderer(rendererProvider.Object); 31 | 32 | rootNodeMock = new Mock(); 33 | childNodeMock = new Mock(); 34 | rootNodeMock.SetupGet(n => n.Children).Returns(new IRazorNode[] { childNodeMock.Object }); 35 | 36 | documentMock = new Mock>(); 37 | documentMock.SetupGet(d => d.RootNode).Returns(rootNodeMock.Object); 38 | } 39 | 40 | [Fact] 41 | public void Should_check_if_renderer_supports_child_node() 42 | { 43 | firstNodeRenderer.Setup(r => r.CanRenderNode(childNodeMock.Object)).Verifiable(); 44 | viewRenderer.Render(documentMock.Object); 45 | firstNodeRenderer.Verify(); 46 | } 47 | 48 | [Fact] 49 | public void Should_call_renderer_if_supports_child_node() 50 | { 51 | firstNodeRenderer.Setup(r => r.CanRenderNode(childNodeMock.Object)).Returns(true); 52 | firstNodeRenderer.Setup(r => r.RenderNode(childNodeMock.Object)).Verifiable(); 53 | viewRenderer.Render(documentMock.Object); 54 | firstNodeRenderer.Verify(); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Rendering/SectionNodeRendererTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor.Rendering 2 | { 3 | using Moq; 4 | using System.Collections.Generic; 5 | using System.Text.RegularExpressions; 6 | using Telerik.RazorConverter.Razor.DOM; 7 | using Telerik.RazorConverter.Razor.Rendering; 8 | using Xunit; 9 | 10 | public class SectionNodeRendererTests 11 | { 12 | private readonly SectionNodeRenderer renderer; 13 | private readonly Mock nodeRendererMock; 14 | private readonly IList nodeRenderers; 15 | private readonly Mock rendererProviderMock; 16 | private readonly Mock sectionNodeMock; 17 | 18 | public SectionNodeRendererTests() 19 | { 20 | nodeRendererMock = new Mock(); 21 | nodeRenderers = new List { nodeRendererMock.Object }; 22 | rendererProviderMock = new Mock(); 23 | rendererProviderMock.SetupGet(p => p.NodeRenderers).Returns(nodeRenderers); 24 | renderer = new SectionNodeRenderer(rendererProviderMock.Object); 25 | sectionNodeMock = new Mock(); 26 | sectionNodeMock.SetupGet(n => n.Name).Returns("HeadContent"); 27 | } 28 | 29 | [Fact] 30 | public void Should_support_code_node() 31 | { 32 | renderer.CanRenderNode(sectionNodeMock.Object).ShouldBeTrue(); 33 | } 34 | 35 | [Fact] 36 | public void Should_not_support_other_nodes() 37 | { 38 | renderer.CanRenderNode(new Mock().Object).ShouldBeFalse(); 39 | } 40 | 41 | [Fact] 42 | public void Should_render_empty_section() 43 | { 44 | sectionNodeMock.SetupGet(n => n.Children).Returns(new IRazorNode[] {}); 45 | 46 | string output = renderer.RenderNode(sectionNodeMock.Object); 47 | Regex.Replace(output, @"\s+", " ").ShouldEqual("@section HeadContent { }"); 48 | } 49 | 50 | [Fact] 51 | public void Should_render_children_in_section() 52 | { 53 | nodeRendererMock.Setup(r => r.CanRenderNode(It.IsAny())).Returns(true); 54 | nodeRendererMock.Setup(r => r.RenderNode(It.IsAny())).Returns("Text"); 55 | 56 | sectionNodeMock.SetupGet(n => n.Children).Returns(new IRazorNode[] { new Mock().Object }); 57 | 58 | string output = renderer.RenderNode(sectionNodeMock.Object); 59 | Regex.Replace(output, @"\s+", " ").ShouldEqual("@section HeadContent { Text }"); 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/Razor/Rendering/TextNodeRendererTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.Razor 2 | { 3 | using Moq; 4 | using Telerik.RazorConverter.Razor.DOM; 5 | using Telerik.RazorConverter.Razor.Rendering; 6 | using Xunit; 7 | 8 | public class TextNodeRendererTests 9 | { 10 | private readonly TextNodeRenderer renderer; 11 | private readonly Mock nodeMock; 12 | 13 | public TextNodeRendererTests() 14 | { 15 | renderer = new TextNodeRenderer(); 16 | nodeMock = new Mock(); 17 | } 18 | 19 | [Fact] 20 | public void Should_support_text_node() 21 | { 22 | renderer.CanRenderNode(nodeMock.Object).ShouldBeTrue(); 23 | } 24 | 25 | [Fact] 26 | public void Should_not_support_generic_node() 27 | { 28 | renderer.CanRenderNode(new Mock().Object).ShouldBeFalse(); 29 | } 30 | 31 | [Fact] 32 | public void Should_render_text_as_it_is() 33 | { 34 | nodeMock.SetupGet(n => n.Text).Returns("TEXT"); 35 | 36 | renderer.RenderNode(nodeMock.Object).ShouldEqual("TEXT"); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/WebForms/DOM/WebFormsCodeGroupNodeTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.WebForms.DOM 2 | { 3 | using Moq; 4 | using System; 5 | using Telerik.RazorConverter.WebForms.DOM; 6 | using Xunit; 7 | 8 | public class WebFormsCodeGroupNodeTests 9 | { 10 | private Mock openingCodeNode; 11 | private Mock innerTextNode; 12 | private Mock closingCodeNode; 13 | private WebFormsCodeGroupNode node; 14 | 15 | public WebFormsCodeGroupNodeTests() 16 | { 17 | openingCodeNode = new Mock(); 18 | openingCodeNode.SetupGet(n => n.BlockType).Returns(CodeBlockNodeType.Opening); 19 | innerTextNode = new Mock(); 20 | closingCodeNode = new Mock(); 21 | closingCodeNode.SetupGet(n => n.BlockType).Returns(CodeBlockNodeType.Closing); 22 | node = new WebFormsCodeGroupNode(); 23 | node.Children.Add(openingCodeNode.Object); 24 | node.Children.Add(innerTextNode.Object); 25 | node.Children.Add(closingCodeNode.Object); 26 | } 27 | 28 | [Fact] 29 | public void Should_combine_content_of_children() 30 | { 31 | openingCodeNode.SetupGet(n => n.Content).Returns("if(true){"); 32 | innerTextNode.SetupGet(n => n.Content).Returns("Hello"); 33 | closingCodeNode.SetupGet(n => n.Content).Returns("}"); 34 | 35 | node.Content.ShouldEqual("if(true){----$$Hello----$$}"); 36 | } 37 | 38 | [Fact] 39 | public void Should_replace_content_of_individual_nodes() 40 | { 41 | openingCodeNode.SetupSet(n => n.Content = "@if(true){").Verifiable(); 42 | innerTextNode.SetupSet(n => n.Content = "Hello").Verifiable(); 43 | closingCodeNode.SetupSet(n => n.Content = "}").Verifiable(); 44 | 45 | node.Content = "@if(true){----$$Hello----$$}"; 46 | 47 | openingCodeNode.Verify(); 48 | innerTextNode.Verify(); 49 | closingCodeNode.Verify(); 50 | } 51 | 52 | [Fact] 53 | public void Should_throw_exception_when_adding_non_content_node() 54 | { 55 | var genericNode = new Mock().Object; 56 | Assert.Throws(() => node.Children.Add(genericNode)); 57 | } 58 | 59 | [Fact] 60 | public void Should_throw_exception_when_trying_to_replace_with_fewer_parts() 61 | { 62 | Assert.Throws(() => node.Content = "if(true){----$$Hello"); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/WebForms/Filters/WrapNestedTemplatesFilterTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.WebForms.Filters 2 | { 3 | using Moq; 4 | using Telerik.RazorConverter.WebForms.DOM; 5 | using Telerik.RazorConverter.WebForms.Filters; 6 | using Xunit; 7 | 8 | public class WrapNestedTemplatesFilterTests 9 | { 10 | private Mock codeGroupNodeMock; 11 | 12 | private WrapNestedTemplatesFilter filter; 13 | 14 | public WrapNestedTemplatesFilterTests() 15 | { 16 | codeGroupNodeMock = new Mock(); 17 | filter = new WrapNestedTemplatesFilter(); 18 | } 19 | 20 | [Fact] 21 | public void Should_not_transform_generic_block() 22 | { 23 | var textNode = new Mock(); 24 | 25 | var filterResult = filter.Filter(textNode.Object, null); 26 | 27 | filterResult[0].ShouldBeSameAs(textNode.Object); 28 | } 29 | 30 | [Fact] 31 | public void Should_wrap_nested_template() 32 | { 33 | codeGroupNodeMock.SetupGet(g => g.Content) 34 | .Returns(@"ScriptRegistrar().OnDocumentReady(() => {----$$alert(1);----$$});"); 35 | 36 | codeGroupNodeMock 37 | .SetupSet(g => g.Content = It.IsAny()) 38 | .Callback(content => content.ShouldEqual("ScriptRegistrar().OnDocumentReady(@----$$alert(1);----$$);")); 39 | 40 | filter.Filter(codeGroupNodeMock.Object, null); 41 | 42 | codeGroupNodeMock.Verify(); 43 | } 44 | } 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Telerik.RazorConverter.Tests/WebForms/WebFormsParserFilteringTests.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Tests.WebForms 2 | { 3 | using Moq; 4 | using System.Collections.Generic; 5 | using Telerik.RazorConverter.WebForms.DOM; 6 | using Telerik.RazorConverter.WebForms.Filters; 7 | using Telerik.RazorConverter.WebForms.Parsing; 8 | using Xunit; 9 | 10 | public class WebFormsParserFilteringTests 11 | { 12 | private readonly Mock filterProviderMock; 13 | private readonly IList postprocessingFilters; 14 | private readonly Mock filterMock; 15 | private readonly WebFormsParser parser; 16 | 17 | public WebFormsParserFilteringTests() 18 | { 19 | filterProviderMock = new Mock(); 20 | postprocessingFilters = new List(); 21 | filterProviderMock.Setup(fp => fp.Filters).Returns(postprocessingFilters); 22 | filterMock = new Mock(); 23 | postprocessingFilters.Add(filterMock.Object); 24 | parser = new WebFormsParser(new WebFormsNodeFactory(), filterProviderMock.Object); 25 | } 26 | 27 | [Fact] 28 | public void Should_executes_postprocessing_filters() 29 | { 30 | filterMock.Setup(f => f.Filter(It.IsAny(), null)) 31 | .Returns((node, prevNode) => new IWebFormsNode[] { node }) 32 | .Verifiable(); 33 | 34 | parser.Parse(@"<%@ Page %>"); 35 | 36 | filterMock.Verify(); 37 | } 38 | 39 | [Fact] 40 | public void Should_replace_nodes_with_filter_output() 41 | { 42 | var textNodeMock = new Mock(); 43 | textNodeMock.SetupGet(n => n.Text).Returns("Text"); 44 | 45 | filterMock.Setup(f => f.Filter(It.IsAny(), null)) 46 | .Returns(new IWebFormsNode[] { textNodeMock.Object }); 47 | 48 | var document = parser.Parse(@"<%@ Page %>"); 49 | 50 | ((IWebFormsTextNode)document.RootNode.Children[0]).Text.ShouldEqual("Text"); 51 | document.RootNode.Children.Count.ShouldEqual(1); 52 | } 53 | 54 | [Fact] 55 | public void Should_apply_filters_recursively() 56 | { 57 | filterMock.Setup(f => f.Filter(It.IsAny(), null)) 58 | .Returns((node, prevNode) => new IWebFormsNode[] { node }) 59 | .Verifiable(); 60 | 61 | filterMock.Setup(f => f.Filter(It.IsAny(), It.IsAny())) 62 | .Returns((node, prevNode) => new IWebFormsNode[] { node }) 63 | .Verifiable(); 64 | 65 | parser.Parse(@"xxx"); 66 | 67 | filterMock.Verify(); 68 | } 69 | } 70 | } 71 | 72 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Document.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter 2 | { 3 | public class Document : IDocument 4 | { 5 | public TNode RootNode 6 | { 7 | get; 8 | private set; 9 | } 10 | 11 | public Document(TNode root) 12 | { 13 | RootNode = root; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/IDocument.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter 2 | { 3 | public interface IDocument 4 | { 5 | TNode RootNode { get; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/INodeConverter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter 2 | { 3 | using System.Collections.Generic; 4 | using Telerik.RazorConverter.WebForms.DOM; 5 | 6 | public interface INodeConverter 7 | { 8 | IList ConvertNode(IWebFormsNode node); 9 | bool CanConvertNode(IWebFormsNode node); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/IOrderMetadata.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter 2 | { 3 | using System.ComponentModel; 4 | 5 | public interface IOrderMetadata 6 | { 7 | [DefaultValue(int.MaxValue)] 8 | int Order { get; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/IRenderer.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter 2 | { 3 | public interface IRenderer 4 | { 5 | string Render(IDocument document); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/IWebFormsConverter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter 2 | { 3 | using Telerik.RazorConverter.WebForms.DOM; 4 | 5 | public interface IWebFormsConverter 6 | { 7 | IDocument Convert(IDocument rootNode); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/IWebFormsParser.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter 2 | { 3 | using Telerik.RazorConverter.WebForms.DOM; 4 | 5 | public interface IWebFormsParser 6 | { 7 | IDocument Parse(string input); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("RazorConverter")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Microsoft")] 12 | [assembly: AssemblyProduct("RazorConverter")] 13 | [assembly: AssemblyCopyright("Copyright © Microsoft 2010")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("1213bf5a-cfd6-46b5-9dba-483e72babf0d")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/CodeBlockConverter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | using System.Collections.Generic; 4 | using System.Text.RegularExpressions; 5 | using Telerik.RazorConverter.Razor.DOM; 6 | using Telerik.RazorConverter.WebForms.DOM; 7 | 8 | public class CodeBlockConverter : INodeConverter 9 | { 10 | private IRazorCodeNodeFactory CodeNodeFactory 11 | { 12 | get; 13 | set; 14 | } 15 | 16 | public CodeBlockConverter(IRazorCodeNodeFactory nodeFactory) 17 | { 18 | CodeNodeFactory = nodeFactory; 19 | } 20 | 21 | public IList ConvertNode(IWebFormsNode node) 22 | { 23 | var srcNode = node as IWebFormsCodeBlockNode; 24 | var requiresPrefix = srcNode.BlockType == CodeBlockNodeType.Complete || srcNode.BlockType == CodeBlockNodeType.Opening; 25 | 26 | // Not implemented: Detection requires analysis of the C# code to determine if it contains more than one statement 27 | // See CodeBlockConverterTests.Should_require_block_for_multi_statement_code_block 28 | var requiresBlock = false; 29 | 30 | var code = srcNode.Code; 31 | code = ReplaceRenderPartial(code); 32 | 33 | if (code.TrimStart().StartsWith("@")) 34 | { 35 | requiresPrefix = false; 36 | } 37 | 38 | var codeNode = CodeNodeFactory.CreateCodeNode(code, requiresPrefix, requiresBlock); 39 | 40 | return new IRazorNode[] { codeNode }; 41 | } 42 | 43 | public bool CanConvertNode(IWebFormsNode node) 44 | { 45 | return node is IWebFormsCodeBlockNode; 46 | } 47 | 48 | private string ReplaceRenderPartial(string input) 49 | { 50 | var searchRegex = new Regex(@"Html.RenderPartial\((?.*?)\);", RegexOptions.Singleline | RegexOptions.Multiline); 51 | return searchRegex.Replace(input, m => 52 | { 53 | return string.Format("@Html.Partial({0})", m.Groups["page"].Value.Trim()); 54 | }); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/CodeGroupConverter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | using System.Collections.Generic; 4 | using Telerik.RazorConverter; 5 | using Telerik.RazorConverter.Razor.DOM; 6 | using Telerik.RazorConverter.WebForms.DOM; 7 | 8 | public class CodeGroupConverter : INodeConverter 9 | { 10 | private IRazorNodeConverterProvider NodeConverterProvider 11 | { 12 | get; 13 | set; 14 | } 15 | 16 | public CodeGroupConverter(IRazorNodeConverterProvider converterProvider) 17 | { 18 | NodeConverterProvider = converterProvider; 19 | } 20 | 21 | public IList ConvertNode(IWebFormsNode node) 22 | { 23 | var result = new List(); 24 | 25 | foreach (var childNode in node.Children) 26 | { 27 | foreach (var converter in NodeConverterProvider.NodeConverters) 28 | { 29 | if (converter.CanConvertNode(childNode)) 30 | { 31 | foreach (var convertedChildNode in converter.ConvertNode(childNode)) 32 | { 33 | result.Add(convertedChildNode); 34 | } 35 | } 36 | } 37 | } 38 | 39 | return result; 40 | } 41 | 42 | public bool CanConvertNode(IWebFormsNode node) 43 | { 44 | return node as IWebFormsCodeGroupNode != null; 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/CommentNodeConverter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | using System.Collections.Generic; 4 | using Telerik.RazorConverter.Razor.DOM; 5 | using Telerik.RazorConverter.WebForms.DOM; 6 | 7 | public class CommentNodeConverter : INodeConverter 8 | { 9 | private IRazorCommentNodeFactory CommentNodeFactory 10 | { 11 | get; 12 | set; 13 | } 14 | 15 | public CommentNodeConverter(IRazorCommentNodeFactory nodeFactory) 16 | { 17 | CommentNodeFactory = nodeFactory; 18 | } 19 | 20 | public IList ConvertNode(IWebFormsNode node) 21 | { 22 | var srcNode = node as IWebFormsCommentNode; 23 | var destNode = CommentNodeFactory.CreateCommentNode(srcNode.Text); 24 | return new IRazorNode[] { destNode }; 25 | } 26 | 27 | public bool CanConvertNode(IWebFormsNode node) 28 | { 29 | return node is IWebFormsCommentNode; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/ContentTagConverter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using Telerik.RazorConverter; 6 | using Telerik.RazorConverter.Razor.DOM; 7 | using Telerik.RazorConverter.WebForms.DOM; 8 | 9 | public class ContentTagConverter : INodeConverter 10 | { 11 | private IRazorNodeConverterProvider NodeConverterProvider 12 | { 13 | get; 14 | set; 15 | } 16 | 17 | private IRazorSectionNodeFactory SectionNodeFactory 18 | { 19 | get; 20 | set; 21 | } 22 | 23 | private IContentTagConverterConfiguration Configuration 24 | { 25 | get; 26 | set; 27 | } 28 | 29 | public ContentTagConverter( IRazorNodeConverterProvider converterProvider, 30 | IRazorSectionNodeFactory sectionFactory, 31 | IContentTagConverterConfiguration converterConfiguration) 32 | { 33 | NodeConverterProvider = converterProvider; 34 | SectionNodeFactory = sectionFactory; 35 | Configuration = converterConfiguration; 36 | } 37 | 38 | public IList ConvertNode(IWebFormsNode node) 39 | { 40 | var contentTag = node as IWebFormsServerControlNode; 41 | var shouldRender = false; 42 | var contentPlaceHolderID = string.Empty; 43 | var convertedChildren = new List(); 44 | 45 | if (contentTag.Attributes.ContainsKey("ID") && contentTag.TagName.ToLower() == "asp:contentplaceholder") 46 | { 47 | shouldRender = true; 48 | } 49 | else 50 | { 51 | contentPlaceHolderID = contentTag.Attributes["ContentPlaceHolderID"]; 52 | } 53 | 54 | Action, IRazorNode> iterateOverChildrens = (childrens, parentNode) => 55 | { 56 | foreach (var convertedNode in childrens) 57 | { 58 | parentNode.Children.Add(convertedNode); 59 | } 60 | }; 61 | 62 | foreach (var childNode in node.Children) 63 | { 64 | foreach (var converter in NodeConverterProvider.NodeConverters) 65 | { 66 | if (converter.CanConvertNode(childNode)) 67 | { 68 | convertedChildren.AddRange(converter.ConvertNode(childNode)); 69 | } 70 | } 71 | } 72 | 73 | IRazorSectionNode sectionNode = null; 74 | 75 | if (shouldRender) 76 | { 77 | sectionNode = SectionNodeFactory.CreateSectionNode(contentTag.Attributes["ID"], true); 78 | 79 | iterateOverChildrens(convertedChildren, sectionNode); 80 | } 81 | else if (string.Compare(contentPlaceHolderID, Configuration.BodyContentPlaceHolderID, true) != 0) 82 | { 83 | sectionNode = SectionNodeFactory.CreateSectionNode(contentPlaceHolderID); 84 | 85 | iterateOverChildrens(convertedChildren, sectionNode); 86 | } 87 | 88 | if (sectionNode != null) 89 | { 90 | return new IRazorSectionNode[] { sectionNode }; 91 | } 92 | else 93 | { 94 | return convertedChildren; 95 | } 96 | } 97 | 98 | public bool CanConvertNode(IWebFormsNode node) 99 | { 100 | var serverControlNode = node as IWebFormsServerControlNode; 101 | 102 | if (serverControlNode != null) 103 | { 104 | var tagName = serverControlNode.TagName.ToLowerInvariant(); 105 | return (tagName == "asp:content" || tagName == "asp:contentplaceholder"); 106 | } 107 | else 108 | { 109 | return false; 110 | } 111 | } 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/ContentTagConverterConfiguration.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | using System.ComponentModel.Composition; 4 | 5 | [Export(typeof(IContentTagConverterConfiguration))] 6 | public class ContentTagConverterConfiguration : IContentTagConverterConfiguration 7 | { 8 | public string BodyContentPlaceHolderID 9 | { 10 | get; 11 | set; 12 | } 13 | 14 | public ContentTagConverterConfiguration() 15 | { 16 | BodyContentPlaceHolderID = "MainContent"; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/DirectiveConverter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | using System.Collections.Generic; 4 | using System.Text.RegularExpressions; 5 | using Telerik.RazorConverter.Razor.DOM; 6 | using Telerik.RazorConverter.WebForms.DOM; 7 | 8 | public class DirectiveConverter : INodeConverter 9 | { 10 | private IRazorDirectiveNodeFactory DirectiveNodeFactory 11 | { 12 | get; 13 | set; 14 | } 15 | 16 | public DirectiveConverter(IRazorDirectiveNodeFactory nodeFactory) 17 | { 18 | DirectiveNodeFactory = nodeFactory; 19 | } 20 | 21 | public IList ConvertNode(IWebFormsNode node) 22 | { 23 | var result = new List(); 24 | 25 | var directiveNode = node as IWebFormsDirectiveNode; 26 | 27 | if (directiveNode != null) 28 | { 29 | if (directiveNode.Attributes.ContainsKey("inherits")) 30 | { 31 | var inheritsFrom = directiveNode.Attributes["inherits"]; 32 | var viewPageGenericType = new Regex("System.Web.Mvc.(?:ViewPage|ViewUserControl)<(?.*)>"); 33 | var typeMatch = viewPageGenericType.Match(inheritsFrom); 34 | if (typeMatch.Success) 35 | { 36 | result.Add(DirectiveNodeFactory.CreateDirectiveNode("model", typeMatch.Result("${type}"))); 37 | } 38 | else if (inheritsFrom != "System.Web.Mvc.ViewPage" && inheritsFrom != "System.Web.Mvc.ViewUserControl") 39 | { 40 | result.Add(DirectiveNodeFactory.CreateDirectiveNode("inherits", directiveNode.Attributes["inherits"])); 41 | } 42 | } 43 | else if (directiveNode.Attributes.ContainsKey("namespace") && 44 | directiveNode.Directive == DirectiveType.Import) 45 | { 46 | var imports = directiveNode.Attributes["namespace"]; 47 | 48 | if (!string.IsNullOrEmpty(imports)) 49 | { 50 | result.Add(DirectiveNodeFactory.CreateDirectiveNode("using", directiveNode.Attributes["namespace"])); 51 | } 52 | } 53 | } 54 | 55 | return result; 56 | } 57 | 58 | public bool CanConvertNode(IWebFormsNode node) 59 | { 60 | return node as IWebFormsDirectiveNode != null; 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/ExpressionBlockConverter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | using System.Collections.Generic; 4 | using System.Text.RegularExpressions; 5 | using Telerik.RazorConverter.Razor.DOM; 6 | using Telerik.RazorConverter.WebForms.DOM; 7 | 8 | public class ExpressionBlockConverter : INodeConverter 9 | { 10 | private IRazorExpressionNodeFactory ExpressionNodeFactory 11 | { 12 | get; 13 | set; 14 | } 15 | 16 | public ExpressionBlockConverter(IRazorExpressionNodeFactory nodeFactory) 17 | { 18 | ExpressionNodeFactory = nodeFactory; 19 | } 20 | 21 | public IList ConvertNode(IWebFormsNode node) 22 | { 23 | var srcNode = node as IWebFormsExpressionBlockNode; 24 | var isMultiline = srcNode.Expression.Contains("\r") || srcNode.Expression.Contains("\n"); 25 | var expression = srcNode.Expression.Trim(new char[] { ' ', '\t' }); 26 | expression = expression.Replace("ResolveUrl", "Url.Content"); 27 | expression = RemoveHtmlEncode(expression); 28 | expression = WrapHtmlDecode(expression); 29 | return new IRazorNode[] 30 | { 31 | ExpressionNodeFactory.CreateExpressionNode(expression, isMultiline) 32 | }; 33 | } 34 | 35 | public bool CanConvertNode(IWebFormsNode node) 36 | { 37 | return node is IWebFormsExpressionBlockNode; 38 | } 39 | 40 | private string RemoveHtmlEncode(string input) 41 | { 42 | var searchRegex = new Regex(@"(Html\.Encode|HttpUtility\.HtmlEncode)\s*\((?(?>[^()]+|\((?)|\)(?<-Depth>))*(?(Depth)(?!)))\)", RegexOptions.Singleline | RegexOptions.Multiline); 43 | var stringCastRegex = new Regex(@"^\(\s*string\s*\)\s*", RegexOptions.IgnoreCase); 44 | return searchRegex.Replace(input, m => 45 | { 46 | return stringCastRegex.Replace(m.Groups["statement"].Value.Trim(), ""); 47 | }); 48 | } 49 | 50 | private string WrapHtmlDecode(string input) 51 | { 52 | var searchRegex = new Regex(@"HttpUtility.HtmlDecode\((?.*)\)", RegexOptions.Singleline | RegexOptions.Multiline); 53 | return searchRegex.Replace(input, m => 54 | { 55 | return string.Format("Html.Raw(HttpUtility.HtmlDecode({0}))", m.Groups["statement"].Value.Trim()); 56 | }); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/IContentTagConverterConfiguration.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | public interface IContentTagConverterConfiguration 4 | { 5 | string BodyContentPlaceHolderID { get; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/IRazorNodeConverterProvider.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | using System.Collections.Generic; 4 | using Telerik.RazorConverter.Razor.DOM; 5 | 6 | public interface IRazorNodeConverterProvider 7 | { 8 | IList> NodeConverters { get; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/RazorNodeConverterProvider.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | using System.Collections.Generic; 4 | using System.ComponentModel.Composition; 5 | using Telerik.RazorConverter; 6 | using Telerik.RazorConverter.Razor.DOM; 7 | 8 | [Export(typeof(IRazorNodeConverterProvider))] 9 | public class RazorNodeConverterProvider : IRazorNodeConverterProvider 10 | { 11 | [ImportingConstructor] 12 | public RazorNodeConverterProvider( IRazorDirectiveNodeFactory directiveNodeFactory, 13 | IRazorSectionNodeFactory sectionNodeFactory, 14 | IRazorCodeNodeFactory codeNodeFactory, 15 | IRazorTextNodeFactory textNodeFactory, 16 | IRazorCommentNodeFactory commentNodeFactory, 17 | IRazorExpressionNodeFactory expressionNodeFactory, 18 | IContentTagConverterConfiguration contentTagConverterConfig) 19 | { 20 | NodeConverters = new INodeConverter[] { 21 | new DirectiveConverter(directiveNodeFactory), 22 | new ContentTagConverter(this, sectionNodeFactory, contentTagConverterConfig), 23 | new CodeGroupConverter(this), 24 | new CodeBlockConverter(codeNodeFactory), 25 | new TextNodeConverter(textNodeFactory), 26 | new CommentNodeConverter(commentNodeFactory), 27 | new ExpressionBlockConverter(expressionNodeFactory) 28 | }; 29 | } 30 | 31 | public IList> NodeConverters 32 | { 33 | get; 34 | private set; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/TextNodeConverter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | using System.Collections.Generic; 4 | using Telerik.RazorConverter.Razor.DOM; 5 | using Telerik.RazorConverter.WebForms.DOM; 6 | 7 | public class TextNodeConverter : INodeConverter 8 | { 9 | private IRazorTextNodeFactory TextNodeFactory 10 | { 11 | get; 12 | set; 13 | } 14 | 15 | public TextNodeConverter(IRazorTextNodeFactory nodeFactory) 16 | { 17 | TextNodeFactory = nodeFactory; 18 | } 19 | 20 | public IList ConvertNode(IWebFormsNode node) 21 | { 22 | var srcNode = node as IWebFormsTextNode; 23 | var destNode = TextNodeFactory.CreateTextNode(srcNode.Text); 24 | return new IRazorNode[] { destNode }; 25 | } 26 | 27 | public bool CanConvertNode(IWebFormsNode node) 28 | { 29 | return node is IWebFormsTextNode; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Converters/WebFormsToRazorConverter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Converters 2 | { 3 | using System.ComponentModel.Composition; 4 | using Telerik.RazorConverter.Razor.DOM; 5 | using Telerik.RazorConverter.WebForms.DOM; 6 | 7 | [Export(typeof(IWebFormsConverter))] 8 | public class WebFormsToRazorConverter : IWebFormsConverter 9 | { 10 | private IRazorNodeConverterProvider NodeConverterProvider 11 | { 12 | get; 13 | set; 14 | } 15 | 16 | [ImportingConstructor] 17 | public WebFormsToRazorConverter(IRazorNodeConverterProvider converterProvider) 18 | { 19 | NodeConverterProvider = converterProvider; 20 | } 21 | 22 | public IDocument Convert(IDocument srcDoc) 23 | { 24 | var rootNode = new RazorNode(); 25 | 26 | foreach (var srcNode in srcDoc.RootNode.Children) 27 | { 28 | foreach (var converter in NodeConverterProvider.NodeConverters) 29 | { 30 | if (converter.CanConvertNode(srcNode)) 31 | { 32 | foreach (var dstNode in converter.ConvertNode(srcNode)) 33 | { 34 | rootNode.Children.Add(dstNode); 35 | } 36 | } 37 | } 38 | } 39 | 40 | return new Document(rootNode); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorCodeNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorCodeNode : IRazorNode 4 | { 5 | string Code { get; } 6 | bool RequiresPrefix { get; } 7 | bool RequiresBlock { get; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorCodeNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorCodeNodeFactory 4 | { 5 | IRazorCodeNode CreateCodeNode(string code, bool requiresPrefix, bool requiresBlock); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorCommentNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorCommentNode : IRazorNode 4 | { 5 | string Text { get; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorCommentNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorCommentNodeFactory 4 | { 5 | IRazorCommentNode CreateCommentNode(string text); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorDirectiveNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorDirectiveNode : IRazorNode 4 | { 5 | string Directive { get; } 6 | string Parameters { get; } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorDirectiveNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorDirectiveNodeFactory 4 | { 5 | IRazorDirectiveNode CreateDirectiveNode(string directive, string parameters); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorExpressionNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorExpressionNode : IRazorNode 4 | { 5 | string Expression { get; } 6 | bool IsMultiline { get; } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorExpressionNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorExpressionNodeFactory 4 | { 5 | IRazorExpressionNode CreateExpressionNode(string expression, bool isMultiline); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | using System.Collections.Generic; 4 | 5 | public interface IRazorNode 6 | { 7 | IRazorNode Parent { get; set; } 8 | IList Children { get; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorSectionNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorSectionNode : IRazorNode 4 | { 5 | string Name { get; } 6 | bool ShouldRender { get; } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorSectionNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorSectionNodeFactory 4 | { 5 | IRazorSectionNode CreateSectionNode(string name, bool shouldRender = false); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorTextNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorTextNode : IRazorNode 4 | { 5 | string Text { get; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/IRazorTextNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public interface IRazorTextNodeFactory 4 | { 5 | IRazorTextNode CreateTextNode(string text); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorCodeNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public class RazorCodeNode : RazorNode, IRazorCodeNode 4 | { 5 | public string Code 6 | { 7 | get; 8 | set; 9 | } 10 | 11 | public bool RequiresPrefix 12 | { 13 | get; 14 | set; 15 | } 16 | 17 | public bool RequiresBlock 18 | { 19 | get; 20 | set; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorCodeNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | using System.ComponentModel.Composition; 4 | 5 | [Export(typeof(IRazorCodeNodeFactory))] 6 | public class RazorCodeNodeFactory : IRazorCodeNodeFactory 7 | { 8 | public IRazorCodeNode CreateCodeNode(string code, bool requiresPrefix, bool requiresBlock) 9 | { 10 | return new RazorCodeNode { Code = code, RequiresPrefix = requiresPrefix, RequiresBlock = requiresBlock }; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorCommentNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public class RazorCommentNode : RazorNode, IRazorCommentNode 4 | { 5 | public string Text 6 | { 7 | get; 8 | set; 9 | } 10 | 11 | public RazorCommentNode() 12 | { 13 | } 14 | 15 | public RazorCommentNode(string text) 16 | { 17 | Text = text; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorCommentNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | using System.ComponentModel.Composition; 4 | 5 | [Export(typeof(IRazorCommentNodeFactory))] 6 | public class RazorCommentNodeFactory : IRazorCommentNodeFactory 7 | { 8 | public IRazorCommentNode CreateCommentNode(string text) 9 | { 10 | return new RazorCommentNode { Text = text }; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorDirectiveNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public class RazorDirectiveNode : RazorNode, IRazorDirectiveNode 4 | { 5 | public string Directive 6 | { 7 | get; 8 | set; 9 | } 10 | 11 | public string Parameters 12 | { 13 | get; 14 | set; 15 | } 16 | 17 | public RazorDirectiveNode() 18 | { 19 | } 20 | 21 | public RazorDirectiveNode(string directive, string parameters) 22 | { 23 | Directive = directive; 24 | Parameters = parameters; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorDirectiveNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | using System.ComponentModel.Composition; 4 | 5 | [Export(typeof(IRazorDirectiveNodeFactory))] 6 | public class RazorDirectiveNodeFactory : IRazorDirectiveNodeFactory 7 | { 8 | public IRazorDirectiveNode CreateDirectiveNode(string directive, string parameters) 9 | { 10 | return new RazorDirectiveNode { Directive = directive, Parameters = parameters }; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorExpressionNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public class RazorExpressionNode : RazorNode, IRazorExpressionNode 4 | { 5 | public string Expression 6 | { 7 | get; 8 | set; 9 | } 10 | 11 | public bool IsMultiline 12 | { 13 | get; 14 | set; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorExpressionNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | using System.ComponentModel.Composition; 4 | 5 | [Export(typeof(IRazorExpressionNodeFactory))] 6 | public class RazorExpressionNodeFactory : IRazorExpressionNodeFactory 7 | { 8 | public IRazorExpressionNode CreateExpressionNode(string expression, bool isMultiline) 9 | { 10 | return new RazorExpressionNode { Expression = expression, IsMultiline = isMultiline }; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | using System.Collections.Generic; 4 | using System.Collections.ObjectModel; 5 | using System.Collections.Specialized; 6 | 7 | public class RazorNode : IRazorNode 8 | { 9 | public IRazorNode Parent 10 | { 11 | get; 12 | set; 13 | } 14 | 15 | public IList Children 16 | { 17 | get; 18 | set; 19 | } 20 | 21 | public RazorNode() 22 | { 23 | Children = new ObservableCollection(); 24 | ((ObservableCollection) Children).CollectionChanged += OnChildrenCollectionChanged; 25 | } 26 | 27 | protected virtual void OnChildrenCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 28 | { 29 | if (e.Action == NotifyCollectionChangedAction.Add) 30 | { 31 | foreach (IRazorNode childNode in e.NewItems) 32 | { 33 | childNode.Parent = this; 34 | } 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorSectionNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public class RazorSectionNode : RazorNode, IRazorSectionNode 4 | { 5 | public string Name 6 | { 7 | get; 8 | set; 9 | } 10 | 11 | public bool ShouldRender 12 | { 13 | get; 14 | set; 15 | } 16 | 17 | public RazorSectionNode() 18 | { 19 | } 20 | 21 | public RazorSectionNode(string sectionName, bool shouldRender) 22 | { 23 | Name = sectionName; 24 | ShouldRender = shouldRender; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorSectionNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | using System.ComponentModel.Composition; 4 | 5 | [Export(typeof(IRazorSectionNodeFactory))] 6 | public class RazorSectionNodeFactory : IRazorSectionNodeFactory 7 | { 8 | public IRazorSectionNode CreateSectionNode(string sectionName, bool shouldRender = false) 9 | { 10 | return new RazorSectionNode(sectionName, shouldRender); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorTextNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | public class RazorTextNode : RazorNode, IRazorTextNode 4 | { 5 | public string Text 6 | { 7 | get; 8 | set; 9 | } 10 | 11 | public RazorTextNode() 12 | { 13 | } 14 | 15 | public RazorTextNode(string text) 16 | { 17 | Text = text; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/DOM/RazorTextNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.DOM 2 | { 3 | using System.ComponentModel.Composition; 4 | 5 | [Export(typeof(IRazorTextNodeFactory))] 6 | public class RazorTextNodeFactory : IRazorTextNodeFactory 7 | { 8 | public IRazorTextNode CreateTextNode(string text) 9 | { 10 | return new RazorTextNode { Text = text }; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Rendering/CodeNodeRenderer.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Rendering 2 | { 3 | using Telerik.RazorConverter.Razor.DOM; 4 | 5 | public class CodeNodeRenderer : IRazorNodeRenderer 6 | { 7 | public string RenderNode(IRazorNode node) 8 | { 9 | var srcNode = node as IRazorCodeNode; 10 | var prefix = ""; 11 | var code = srcNode.Code; 12 | 13 | if (srcNode.RequiresBlock) 14 | { 15 | code = "{\r\n" + code + "\r\n}"; 16 | } 17 | 18 | if (srcNode.RequiresPrefix || srcNode.RequiresBlock) 19 | { 20 | prefix = "@"; 21 | code = code.TrimStart(); 22 | } 23 | 24 | return prefix + code; 25 | } 26 | 27 | public bool CanRenderNode(IRazorNode node) 28 | { 29 | return node is IRazorCodeNode; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Rendering/CommentNodeRenderer.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Rendering 2 | { 3 | using Telerik.RazorConverter.Razor.DOM; 4 | 5 | public class CommentNodeRenderer : IRazorNodeRenderer 6 | { 7 | public string RenderNode(IRazorNode node) 8 | { 9 | var commentNode = node as IRazorCommentNode; 10 | return "@*" + commentNode.Text + "*@"; 11 | } 12 | 13 | public bool CanRenderNode(IRazorNode node) 14 | { 15 | return node is IRazorCommentNode; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Rendering/DirectiveNodeRenderer.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Rendering 2 | { 3 | using Telerik.RazorConverter.Razor.DOM; 4 | 5 | public class DirectiveNodeRenderer : IRazorNodeRenderer 6 | { 7 | public string RenderNode(IRazorNode node) 8 | { 9 | var directiveNode = node as IRazorDirectiveNode; 10 | return string.Format("@{0} {1}", directiveNode.Directive, directiveNode.Parameters).Trim(); 11 | } 12 | 13 | public bool CanRenderNode(IRazorNode node) 14 | { 15 | return node is IRazorDirectiveNode; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Rendering/ExpressionNodeRenderer.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Rendering 2 | { 3 | using Telerik.RazorConverter.Razor.DOM; 4 | 5 | public class ExpressionNodeRenderer : IRazorNodeRenderer 6 | { 7 | public string RenderNode(IRazorNode node) 8 | { 9 | var srcNode = node as IRazorExpressionNode; 10 | var formatString = "@{0}"; 11 | var expression = srcNode.Expression; 12 | 13 | if (srcNode.IsMultiline) 14 | { 15 | formatString = "@({0})"; 16 | } 17 | 18 | return string.Format(formatString, expression); 19 | } 20 | 21 | public bool CanRenderNode(IRazorNode node) 22 | { 23 | return node is IRazorExpressionNode; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Rendering/IRazorNodeRenderer.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Rendering 2 | { 3 | using Telerik.RazorConverter.Razor.DOM; 4 | 5 | public interface IRazorNodeRenderer 6 | { 7 | string RenderNode(IRazorNode node); 8 | bool CanRenderNode(IRazorNode node); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Rendering/IRazorNodeRendererProvider.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Rendering 2 | { 3 | using System.Collections.Generic; 4 | 5 | public interface IRazorNodeRendererProvider 6 | { 7 | IList NodeRenderers { get; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Rendering/RazorNodeRendererProvider.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Rendering 2 | { 3 | using System.Collections.Generic; 4 | using System.ComponentModel.Composition; 5 | 6 | [Export(typeof(IRazorNodeRendererProvider))] 7 | public class RazorNodeRendererProvider : IRazorNodeRendererProvider 8 | { 9 | public IList NodeRenderers 10 | { 11 | get; 12 | private set; 13 | } 14 | 15 | public RazorNodeRendererProvider() 16 | { 17 | NodeRenderers = new List 18 | { 19 | new DirectiveNodeRenderer(), 20 | new CodeNodeRenderer(), 21 | new ExpressionNodeRenderer(), 22 | new TextNodeRenderer(), 23 | new CommentNodeRenderer(), 24 | new SectionNodeRenderer(this) 25 | }; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Rendering/RazorViewRenderer.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Rendering 2 | { 3 | using System.ComponentModel.Composition; 4 | using System.Text; 5 | using Telerik.RazorConverter; 6 | using Telerik.RazorConverter.Razor.DOM; 7 | 8 | [Export(typeof(IRenderer))] 9 | public class RazorViewRenderer : IRenderer 10 | { 11 | private IRazorNodeRendererProvider RendererProvider 12 | { 13 | get; 14 | set; 15 | } 16 | 17 | [ImportingConstructor] 18 | public RazorViewRenderer(IRazorNodeRendererProvider NodeRendererProvider) 19 | { 20 | RendererProvider = NodeRendererProvider; 21 | } 22 | 23 | public string Render(IDocument document) 24 | { 25 | var sb = new StringBuilder(); 26 | foreach (var node in document.RootNode.Children) 27 | { 28 | foreach (var renderer in RendererProvider.NodeRenderers) 29 | { 30 | if (renderer.CanRenderNode(node)) 31 | { 32 | sb.Append(renderer.RenderNode(node)); 33 | break; 34 | } 35 | } 36 | } 37 | sb.AppendLine(); 38 | return sb.ToString(); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Rendering/SectionNodeRenderer.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Rendering 2 | { 3 | using System.Text; 4 | using Telerik.RazorConverter.Razor.DOM; 5 | 6 | public class SectionNodeRenderer : IRazorNodeRenderer 7 | { 8 | private IRazorNodeRendererProvider RendererProvider 9 | { 10 | get; 11 | set; 12 | } 13 | 14 | public SectionNodeRenderer(IRazorNodeRendererProvider NodeRendererProvider) 15 | { 16 | RendererProvider = NodeRendererProvider; 17 | } 18 | 19 | public string RenderNode(IRazorNode node) 20 | { 21 | var sectionNode = node as IRazorSectionNode; 22 | string childContent = null; 23 | 24 | childContent = RenderChildren(node); 25 | 26 | return ( 27 | sectionNode.ShouldRender ? 28 | string.Format("@RenderSection(\"{0}\", optional: true)\n{1}", sectionNode.Name, childContent) : 29 | string.Format("@section {0} {{\r\n{1}}}", sectionNode.Name, childContent) 30 | ); 31 | } 32 | 33 | private string RenderChildren(IRazorNode node) 34 | { 35 | var sb = new StringBuilder(); 36 | foreach (var childNode in node.Children) 37 | { 38 | foreach (var renderer in RendererProvider.NodeRenderers) 39 | { 40 | if (renderer.CanRenderNode(childNode)) 41 | { 42 | sb.Append(renderer.RenderNode(childNode)); 43 | break; 44 | } 45 | } 46 | } 47 | sb.AppendLine(); 48 | return sb.ToString(); 49 | } 50 | 51 | public bool CanRenderNode(IRazorNode node) 52 | { 53 | return node is IRazorSectionNode; 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/Razor/Rendering/TextNodeRenderer.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.Razor.Rendering 2 | { 3 | using Telerik.RazorConverter.Razor.DOM; 4 | 5 | public class TextNodeRenderer : IRazorNodeRenderer 6 | { 7 | public string RenderNode(IRazorNode node) 8 | { 9 | var textNode = node as IRazorTextNode; 10 | return textNode.Text; 11 | } 12 | 13 | public bool CanRenderNode(IRazorNode node) 14 | { 15 | return node is IRazorTextNode; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/CodeBlockNodeType.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public enum CodeBlockNodeType 4 | { 5 | Complete, 6 | Opening, 7 | Continued, 8 | Closing 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/CommentNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public class CommentNode : WebFormsNode, IWebFormsCommentNode 4 | { 5 | public string Text 6 | { 7 | get; 8 | set; 9 | } 10 | 11 | string IWebFormsContentNode.Content 12 | { 13 | get 14 | { 15 | return Text; 16 | } 17 | 18 | set 19 | { 20 | Text = value; 21 | } 22 | } 23 | 24 | public CommentNode() 25 | { 26 | Type = NodeType.Comment; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/DirectiveNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public class DirectiveNode : WebFormsNode, IWebFormsDirectiveNode 4 | { 5 | public DirectiveType Directive 6 | { 7 | get; 8 | set; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/DirectiveType.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public enum DirectiveType 4 | { 5 | Page, 6 | Control, 7 | Import, 8 | Unknown 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/ExpressionBlockNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public class ExpressionBlockNode : WebFormsNode, IWebFormsExpressionBlockNode 4 | { 5 | public string Expression 6 | { 7 | get; 8 | set; 9 | } 10 | 11 | string IWebFormsContentNode.Content 12 | { 13 | get 14 | { 15 | return Expression; 16 | } 17 | 18 | set 19 | { 20 | Expression = value; 21 | } 22 | } 23 | 24 | public ExpressionBlockNode() 25 | { 26 | Type = NodeType.ExpressionBlock; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/IWebFormsCodeBlockNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public interface IWebFormsCodeBlockNode : IWebFormsContentNode 4 | { 5 | string Code { get; set; } 6 | CodeBlockNodeType BlockType { get; } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/IWebFormsCodeGroupNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public interface IWebFormsCodeGroupNode : IWebFormsContentNode 4 | { 5 | 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/IWebFormsCodeGroupNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public interface IWebFormsCodeGroupNodeFactory 4 | { 5 | IWebFormsCodeGroupNode CreatCodeGroupNode(IWebFormsCodeBlockNode firstCodeNode); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/IWebFormsCommentNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public interface IWebFormsCommentNode : IWebFormsContentNode 4 | { 5 | string Text { get; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/IWebFormsContentNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public interface IWebFormsContentNode : IWebFormsNode 4 | { 5 | string Content { get; set; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/IWebFormsDirectiveNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public interface IWebFormsDirectiveNode : IWebFormsNode 4 | { 5 | DirectiveType Directive { get; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/IWebFormsExpressionBlockNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public interface IWebFormsExpressionBlockNode : IWebFormsContentNode 4 | { 5 | string Expression { get; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/IWebFormsNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | using System.Collections.Generic; 4 | 5 | public interface IWebFormsNode 6 | { 7 | NodeType Type { get; } 8 | IWebFormsNode Parent { get; set; } 9 | IList Children { get; } 10 | IDictionary Attributes { get; } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/IWebFormsNodeFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.Parsing 2 | { 3 | using System.Text.RegularExpressions; 4 | using Telerik.RazorConverter.WebForms.DOM; 5 | 6 | public interface IWebFormsNodeFactory 7 | { 8 | IWebFormsNode CreateNode(Match match, NodeType type); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/IWebFormsServerControlNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public interface IWebFormsServerControlNode : IWebFormsNode 4 | { 5 | string TagName { get; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/IWebFormsTextNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public interface IWebFormsTextNode : IWebFormsContentNode 4 | { 5 | string Text { get; set; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/NodeType.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public enum NodeType 4 | { 5 | Document, 6 | Directive, 7 | CodeBlock, 8 | ExpressionBlock, 9 | EncodedExpressionBlock, 10 | ServerControl, 11 | Text, 12 | Comment 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/ServerControlNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public class ServerControlNode : WebFormsNode, IWebFormsServerControlNode 4 | { 5 | public string TagName 6 | { 7 | get; 8 | set; 9 | } 10 | 11 | public ServerControlNode() 12 | { 13 | Type = NodeType.ServerControl; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/TextNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public class TextNode : WebFormsNode, IWebFormsTextNode 4 | { 5 | public string Text 6 | { 7 | get; 8 | set; 9 | } 10 | 11 | string IWebFormsContentNode.Content 12 | { 13 | get 14 | { 15 | return Text; 16 | } 17 | 18 | set 19 | { 20 | Text = value; 21 | } 22 | } 23 | 24 | public TextNode() 25 | { 26 | Type = NodeType.Text; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/WebFormsCodeBlockNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | public class WebFormsCodeBlockNode : WebFormsNode, IWebFormsCodeBlockNode 4 | { 5 | public string Code 6 | { 7 | get; 8 | set; 9 | } 10 | 11 | string IWebFormsContentNode.Content 12 | { 13 | get 14 | { 15 | return Code; 16 | } 17 | 18 | set 19 | { 20 | Code = value; 21 | } 22 | } 23 | 24 | public CodeBlockNodeType BlockType 25 | { 26 | get; 27 | set; 28 | } 29 | 30 | public WebFormsCodeBlockNode() 31 | { 32 | Type = NodeType.CodeBlock; 33 | BlockType = CodeBlockNodeType.Complete; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/WebFormsCodeGroupFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | using System.ComponentModel.Composition; 4 | 5 | [Export(typeof(IWebFormsCodeGroupNodeFactory))] 6 | public class WebFormsCodeGroupFactory : IWebFormsCodeGroupNodeFactory 7 | { 8 | public IWebFormsCodeGroupNode CreatCodeGroupNode(IWebFormsCodeBlockNode firstCodeNode) 9 | { 10 | var groupNode = new WebFormsCodeGroupNode(); 11 | groupNode.Children.Add(firstCodeNode); 12 | 13 | return groupNode; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/WebFormsCodeGroupNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | using System; 4 | using System.Collections.Specialized; 5 | using System.Linq; 6 | 7 | public class WebFormsCodeGroupNode : WebFormsNode, IWebFormsCodeGroupNode 8 | { 9 | public const string Boundary = "----$$"; 10 | 11 | public string Content 12 | { 13 | get 14 | { 15 | return string.Join(Boundary, Children.Select(c => ((IWebFormsContentNode) c).Content)); 16 | } 17 | 18 | set 19 | { 20 | ReplaceContent(value); 21 | } 22 | } 23 | 24 | private void ReplaceContent(string content) 25 | { 26 | var parts = content.Split(new string[] { Boundary }, StringSplitOptions.None); 27 | if (parts.Length != Children.Count) 28 | { 29 | throw new InvalidOperationException("Replacement string parts do no match number of child nodes"); 30 | } 31 | 32 | for (var i = 0; i < parts.Length; i++) 33 | { 34 | var node = (IWebFormsContentNode) Children[i]; 35 | node.Content = parts[i]; 36 | } 37 | } 38 | 39 | protected override void OnChildrenCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 40 | { 41 | base.OnChildrenCollectionChanged(sender, e); 42 | 43 | if (e.Action == NotifyCollectionChangedAction.Add) 44 | { 45 | foreach (var newItem in e.NewItems) 46 | { 47 | if (!(newItem is IWebFormsContentNode)) 48 | { 49 | throw new InvalidOperationException("Can only add child notes implementing IWebFormsContentNode"); 50 | } 51 | } 52 | } 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/DOM/WebFormsNode.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.DOM 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Collections.ObjectModel; 6 | using System.Collections.Specialized; 7 | 8 | public class WebFormsNode : IWebFormsNode 9 | { 10 | public NodeType Type 11 | { 12 | get; 13 | set; 14 | } 15 | 16 | public IWebFormsNode Parent 17 | { 18 | get; 19 | set; 20 | } 21 | 22 | public IList Children 23 | { 24 | get; 25 | private set; 26 | } 27 | 28 | public IDictionary Attributes 29 | { 30 | get; 31 | private set; 32 | } 33 | 34 | public WebFormsNode() 35 | { 36 | Children = new ObservableCollection(); 37 | ((ObservableCollection) Children).CollectionChanged += OnChildrenCollectionChanged; 38 | 39 | Attributes = new Dictionary(StringComparer.OrdinalIgnoreCase); 40 | } 41 | 42 | protected virtual void OnChildrenCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 43 | { 44 | if (e.Action == NotifyCollectionChangedAction.Add) 45 | { 46 | foreach (IWebFormsNode childItem in e.NewItems) 47 | { 48 | childItem.Parent = this; 49 | } 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/Filters/AddBlockBracesFilter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.Filters 2 | { 3 | using System.Collections.Generic; 4 | using System.Text.RegularExpressions; 5 | using DOM; 6 | 7 | public class AddBlockBracesFilter : IWebFormsNodeFilter 8 | { 9 | public IList Filter(IWebFormsNode node, IWebFormsNode previousFilteredNode) 10 | { 11 | var isCodeGroupNode = node is IWebFormsCodeGroupNode; 12 | var isCompleteCodeNode = node is IWebFormsCodeBlockNode && ((IWebFormsCodeBlockNode)node).BlockType == CodeBlockNodeType.Complete; 13 | if (isCodeGroupNode || isCompleteCodeNode) 14 | { 15 | var codeContentNode = node as IWebFormsContentNode; 16 | if (codeContentNode != null && RequiresBlock(codeContentNode.Content)) 17 | { 18 | codeContentNode.Content = string.Format("{{{0}}}", codeContentNode.Content).Replace("{{", "{").Replace("}}", "}"); 19 | } 20 | } 21 | 22 | return new[] { node }; 23 | } 24 | 25 | private bool RequiresBlock(string code) 26 | { 27 | var statementRegex = new Regex( 28 | @"^\s*(?foreach|if|using|Html\.RenderPartial)\s* 29 | (?\((?>[^()]+|\((?)|\)(?<-Depth>))*(?(Depth)(?!))\)){1}\s* 30 | (;)?\s* 31 | (?\{(?>[^{}]+|\{(?)|\}(?<-Depth>))*(?(Depth)(?!))\})?\s* 32 | (else\s* 33 | (?\{(?>[^{}]+|\{(?)|\}(?<-Depth>))*(?(Depth)(?!))\})?\s* 34 | )?\s* 35 | (?\S*) $", 36 | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace); 37 | 38 | var match = statementRegex.Match(code); 39 | bool matchesOperator = match.Groups["op"].Success; 40 | bool hasExtraStatements = match.Groups["extra"].Length > 0; 41 | return !matchesOperator || (matchesOperator && hasExtraStatements); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/Filters/CodeBlockGroupingFilter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.Filters 2 | { 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using Telerik.RazorConverter.WebForms.DOM; 6 | 7 | public class CodeBlockGroupingFilter : IWebFormsNodeFilter 8 | { 9 | private IWebFormsCodeGroupNodeFactory MultiPartNodeFactory 10 | { 11 | get; 12 | set; 13 | } 14 | 15 | public CodeBlockGroupingFilter(IWebFormsCodeGroupNodeFactory nodeFactory) 16 | { 17 | MultiPartNodeFactory = nodeFactory; 18 | } 19 | 20 | public IList Filter(IWebFormsNode node, IWebFormsNode previousFilteredNode) 21 | { 22 | var codeNode = node as IWebFormsCodeBlockNode; 23 | var lastGroup = FindLastOpenGroup(previousFilteredNode); 24 | var result = new List(); 25 | 26 | if (lastGroup != null) 27 | { 28 | lastGroup.Children.Add(node); 29 | } 30 | else 31 | { 32 | if (codeNode != null && codeNode.BlockType == CodeBlockNodeType.Opening) 33 | { 34 | result.Add(MultiPartNodeFactory.CreatCodeGroupNode(codeNode)); 35 | } 36 | else 37 | { 38 | result.Add(node); 39 | } 40 | } 41 | 42 | return result; 43 | } 44 | 45 | private IWebFormsCodeGroupNode FindLastOpenGroup(IWebFormsNode previousFilteredNode) 46 | { 47 | var groupNode = previousFilteredNode as IWebFormsCodeGroupNode; 48 | if (groupNode != null) 49 | { 50 | var codeBlocks = groupNode.Children.Where(c => c is IWebFormsCodeBlockNode); 51 | var openingBlocks = codeBlocks.Count(c => ((IWebFormsCodeBlockNode)c).BlockType == CodeBlockNodeType.Opening); 52 | var closingBlocks = codeBlocks.Count(c => ((IWebFormsCodeBlockNode)c).BlockType == CodeBlockNodeType.Closing); 53 | 54 | if (openingBlocks > 0 && openingBlocks != closingBlocks) 55 | { 56 | return groupNode; 57 | } 58 | } 59 | 60 | return null; 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/Filters/IWebFormsNodeFilter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.Filters 2 | { 3 | using System.Collections.Generic; 4 | using Telerik.RazorConverter.WebForms.DOM; 5 | 6 | public interface IWebFormsNodeFilter 7 | { 8 | IList Filter(IWebFormsNode node, IWebFormsNode previousFilteredNode); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/Filters/IWebFormsNodeFilterProvider.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.Filters 2 | { 3 | using System.Collections.Generic; 4 | 5 | public interface IWebFormsNodeFilterProvider 6 | { 7 | IList Filters { get; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/Filters/WebFormsNodeFilterProvider.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.Filters 2 | { 3 | using System.Collections.Generic; 4 | using System.ComponentModel.Composition; 5 | using Telerik.RazorConverter.WebForms.DOM; 6 | 7 | [Export(typeof(IWebFormsNodeFilterProvider))] 8 | public class WebFormsNodeFilterProvider : IWebFormsNodeFilterProvider 9 | { 10 | [ImportingConstructor] 11 | public WebFormsNodeFilterProvider(IWebFormsCodeGroupNodeFactory nodeFactory) 12 | { 13 | Filters = new IWebFormsNodeFilter[] { 14 | new CodeBlockGroupingFilter(nodeFactory), 15 | new AddBlockBracesFilter(), 16 | new WrapNestedTemplatesFilter() 17 | }; 18 | } 19 | 20 | public IList Filters 21 | { 22 | get; 23 | private set; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Telerik.RazorConverter/WebForms/Filters/WrapNestedTemplatesFilter.cs: -------------------------------------------------------------------------------- 1 | namespace Telerik.RazorConverter.WebForms.Filters 2 | { 3 | using System.Collections.Generic; 4 | using System.Text.RegularExpressions; 5 | using Telerik.RazorConverter.WebForms.DOM; 6 | 7 | public class WrapNestedTemplatesFilter : IWebFormsNodeFilter 8 | { 9 | public IList Filter(IWebFormsNode node, IWebFormsNode previousFilteredNode) 10 | { 11 | var isCodeGroupNode = node is IWebFormsCodeGroupNode; 12 | if (isCodeGroupNode) 13 | { 14 | var codeContentNode = node as IWebFormsContentNode; 15 | codeContentNode.Content = WrapNestedTemplates(codeContentNode.Content); 16 | } 17 | 18 | return new IWebFormsNode[] { node }; 19 | } 20 | 21 | private string WrapNestedTemplates(string content) 22 | { 23 | var nestedTemplateRegex = new Regex( 24 | @"\(\)\s*\=\>\s*\{(?