Пример #1
0
        /// <inheritdoc />
        public override RazorParser DecorateRazorParser(RazorParser razorParser, string sourceFileName)
        {
            if (razorParser == null)
            {
                throw new ArgumentNullException(nameof(razorParser));
            }

            var inheritedChunkTrees = GetInheritedChunkTrees(sourceFileName);

            return(new MvcRazorParser(razorParser, inheritedChunkTrees, DefaultInheritedChunks, ModelExpressionType));
        }
Пример #2
0
        public static RazorSyntaxTree Parse(RazorSourceDocument source, RazorParserOptions options)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            var parser = new RazorParser(options ?? RazorParserOptions.CreateDefault());

            return(parser.Parse(source));
        }
Пример #3
0
 /// <summary>
 /// Initializes a new instance of <see cref="MvcRazorParser"/>.
 /// </summary>
 /// <param name="parser">The <see cref="RazorParser"/> to copy properties from.</param>
 /// <param name="inheritedCodeTrees">The <see cref="IReadOnlyList{CodeTree}"/>s that are inherited
 /// from parsed pages from _GlobalImport files.</param>
 /// <param name="defaultInheritedChunks">The <see cref="IReadOnlyList{Chunk}"/> inherited by
 /// default by all Razor pages in the application.</param>
 public MvcRazorParser(
     [NotNull] RazorParser parser,
     [NotNull] IReadOnlyList <CodeTree> inheritedCodeTrees,
     [NotNull] IReadOnlyList <Chunk> defaultInheritedChunks)
     : base(parser)
 {
     // Construct tag helper descriptors from @addTagHelper, @removeTagHelper and @tagHelperPrefix chunks
     _globalImportDirectiveDescriptors = GetTagHelperDirectiveDescriptors(
         inheritedCodeTrees,
         defaultInheritedChunks);
 }
Пример #4
0
        /// <summary>
        /// Provides an opportunity for derived types to modify the instance of <see cref="RazorParser"/>
        /// used by the <see cref="RazorTemplateEngine"/> to parse the Razor tree.
        /// </summary>
        /// <param name="incomingRazorParser">The <see cref="RazorParser"/></param>
        /// <param name="sourceFileName">The file name of the Razor file being parsed.</param>
        /// <returns>Either the same code parser, after modifications, or a different code parser.</returns>
        public virtual RazorParser DecorateRazorParser(
            RazorParser incomingRazorParser,
            string sourceFileName)
        {
            if (incomingRazorParser == null)
            {
                throw new ArgumentNullException(nameof(incomingRazorParser));
            }

            return(incomingRazorParser);
        }
Пример #5
0
        protected internal virtual ParserResults ParseTemplateCore(
            ITextDocument input,
            CancellationToken?cancelToken
            )
        {
            // Construct the parser
            RazorParser parser = CreateParser();

            Debug.Assert(parser != null);
            return(parser.Parse(input));
        }
Пример #6
0
        public string Render()
        {
            List <Assembly> references = new List <Assembly>(GetDefaultAssembliesToReference());

            references.Add(typeof(PropertyInfo).Assembly);
            RazorParser <DtoTemplate> parser = new RazorParser <DtoTemplate>(RazorBaseTemplate.DefaultInspector);
            string output = parser.ExecuteResource("Dto.tmpl", "Bam.Net.Data.Repositories.Templates.", typeof(DtoTemplate).Assembly,
                                                   new { Model = this }, references.ToArray());

            return(output);
        }
Пример #7
0
 private void AddVirtualDocuments(RazorCodeDocument document, string relativePath)
 {
     foreach (var item in _project.EnumerateAscending(relativePath, ".razor"))
     {
         if (item.Filename == "_PageImports.razor")
         {
             var source = item.ToSourceDocument();
             var parsed = RazorParser.Parse(source);
             document.AddVirtualSyntaxTree(parsed);
         }
     }
 }
Пример #8
0
        public string Render()
        {
            List <Assembly> referenceAssemblies = new List <Assembly> {
                typeof(DaoGenerator).Assembly,
                typeof(ServiceProxyController).Assembly,
                typeof(Args).Assembly,
                typeof(DaoRepository).Assembly
            };
            RazorParser <SchemaRepositoryTemplate> parser = new RazorParser <SchemaRepositoryTemplate>(RazorBaseTemplate.DefaultInspector);
            string output = parser.ExecuteResource("SchemaRepository.tmpl", "Bam.Net.Data.Repositories.Templates.", typeof(SchemaRepositoryModel).Assembly, new { Model = this }, referenceAssemblies.ToArray());

            return(output);
        }
Пример #9
0
        public static IIndentationGrammarAnalysis <SyntaxToken, SyntaxNode, GNode> match <GNode, TParent, T>(
            this IIndentationGrammarAnalysis <SyntaxToken, SyntaxNode, GNode> self,
            IEnumerable <string> patterns,
            Action <IIndentationGrammarAnalysis <SyntaxToken, SyntaxNode, GNode> > children = null,
            Action <TParent, T> then = null) where T : GNode, new()
        {
            foreach (var pattern in patterns)
            {
                match <GNode, TParent, T>(self, RazorParser.Create <T>(pattern), children, then);
            }

            return(self);
        }
        public void CreateParserMethodIsConstructedFromHost()
        {
            // Arrange
            RazorEngineHost     host   = CreateHost();
            RazorTemplateEngine engine = new RazorTemplateEngine(host);

            // Act
            RazorParser parser = engine.CreateParser();

            // Assert
            Assert.IsType <CSharpCodeParser>(parser.CodeParser);
            Assert.IsType <HtmlMarkupParser>(parser.MarkupParser);
        }
Пример #11
0
        /// <summary>
        /// Compiles the template.
        /// </summary>
        /// <param name="className">The class name of the dynamic type.</param>
        /// <param name="template">The template to compile.</param>
        /// <param name="modelType">[Optional] The mode type.</param>
        private CompilerResults Compile(string className, string template, Type modelType = null)
        {
            var languageService = provider.CreateLanguageService();
            var codeDom         = provider.CreateCodeDomProvider();
            var host            = new RazorEngineHost(languageService);

            var generator = languageService.CreateCodeGenerator(className, "Razor.Dynamic", null, host);
            var parser    = new RazorParser(languageService.CreateCodeParser(), new HtmlMarkupParser());

            Type baseType = (modelType == null)
                ? typeof(TemplateBase)
                : typeof(TemplateBase <>).MakeGenericType(modelType);

            generator.GeneratedClass.BaseTypes.Add(baseType);

            using (var reader = new StreamReader(new MemoryStream(Encoding.ASCII.GetBytes(template))))
            {
                parser.Parse(reader, generator);
            }

            var statement = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "Clear");

            generator.GeneratedExecuteMethod.Statements.Insert(0, new CodeExpressionStatement(statement));

            var builder = new StringBuilder();

            using (var writer = new StringWriter(builder))
            {
                codeDom.GenerateCodeFromCompileUnit(generator.GeneratedCode, writer, new CodeGeneratorOptions());
            }

            var @params = new CompilerParameters();

            foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
            {
                if (!assembly.IsDynamic)
                {
                    @params.ReferencedAssemblies.Add(assembly.Location);
                }
            }

            @params.GenerateInMemory        = true;
            @params.IncludeDebugInformation = false;
            @params.GenerateExecutable      = false;
            @params.CompilerOptions         = "/target:library /optimize";
            @params.TempFiles.KeepFiles     = KeepFiles;

            var result = codeDom.CompileAssemblyFromSource(@params, new[] { builder.ToString() });

            return(result);
        }
        public void CreateParserMethodSetsParserContextToDesignTimeModeIfHostSetToDesignTimeMode()
        {
            // Arrange
            RazorEngineHost     host   = CreateHost();
            RazorTemplateEngine engine = new RazorTemplateEngine(host);

            host.DesignTimeMode = true;

            // Act
            RazorParser parser = engine.CreateParser();

            // Assert
            Assert.True(parser.DesignTimeMode);
        }
Пример #13
0
        public string Render()
        {
            List <Assembly> referenceAssemblies = new List <Assembly>
            {
                typeof(OpenApiObjectDatabase).Assembly,
                typeof(ServiceProxyHelper).Assembly,
                typeof(Args).Assembly
            };

            RazorParser <RazorTemplate <OpenApiFixedFieldModel> > parser = new RazorParser <RazorTemplate <OpenApiFixedFieldModel> >();
            string result = parser.ExecuteResource("FixedField.tmpl", "Bam.Net.Services.OpenApi.Templates.", typeof(OpenApiObjectDatabase).Assembly, new { Model = this }, referenceAssemblies.ToArray());

            return(result);
        }
Пример #14
0
        private string Render <T>(string templateName, object options)
        {
            List <Assembly> referenceAssemblies = new List <Assembly> {
                typeof(DaoGenerator).Assembly,
                typeof(ServiceProxyController).Assembly,
                typeof(Args).Assembly,
                typeof(DaoRepository).Assembly
            };

            RazorParser <RazorTemplate <T> > parser = new RazorParser <RazorTemplate <T> >();
            string result = parser.ExecuteResource(templateName, "Bam.Net.Data.Repositories.Templates.", typeof(SchemaRepositoryTemplate).Assembly, options, referenceAssemblies.ToArray()).Trim();

            return(result);
        }
Пример #15
0
        protected internal virtual RazorParser CreateParser(string sourceFileName)
        {
            var codeParser   = Host.CodeLanguage.CreateCodeParser();
            var markupParser = Host.CreateMarkupParser();

            var parser = new RazorParser(Host.DecorateCodeParser(codeParser),
                                         Host.DecorateMarkupParser(markupParser),
                                         Host.TagHelperDescriptorResolver)
            {
                DesignTimeMode = Host.DesignTimeMode
            };

            return(Host.DecorateRazorParser(parser, sourceFileName));
        }
Пример #16
0
        /// <summary>
        /// Initializes a new instance of <see cref="MvcRazorParser"/>.
        /// </summary>
        /// <param name="parser">The <see cref="RazorParser"/> to copy properties from.</param>
        /// <param name="inheritedChunkTrees">The <see cref="IReadOnlyList{ChunkTree}"/>s that are inherited
        /// from parsed pages from _ViewImports files.</param>
        /// <param name="defaultInheritedChunks">The <see cref="IReadOnlyList{Chunk}"/> inherited by
        /// default by all Razor pages in the application.</param>
        public MvcRazorParser(
            [NotNull] RazorParser parser,
            [NotNull] IReadOnlyList <ChunkTree> inheritedChunkTrees,
            [NotNull] IReadOnlyList <Chunk> defaultInheritedChunks,
            [NotNull] string modelExpressionTypeName)
            : base(parser)
        {
            // Construct tag helper descriptors from @addTagHelper, @removeTagHelper and @tagHelperPrefix chunks
            _viewImportsDirectiveDescriptors = GetTagHelperDirectiveDescriptors(
                inheritedChunkTrees,
                defaultInheritedChunks);

            _modelExpressionTypeName = modelExpressionTypeName;
        }
Пример #17
0
        public void WriteContextMethods(Table table, string ns)
        {
            RazorParser <TableTemplate> razorParser = new RazorParser <TableTemplate>();

            razorParser.GetDefaultAssembliesToReference = () =>
            {
                Assembly[] assembliesToReference = new Assembly[] { typeof(SchemaTemplate).Assembly,
                                                                    typeof(DaoGenerator).Assembly,
                                                                    typeof(ServiceProxySystem).Assembly,
                                                                    typeof(Providers).Assembly };
                return(assembliesToReference);
            };
            Write(razorParser.ExecuteResource("ContextMethods.tmpl", "Bam.Net.Data.Schema.Templates.", typeof(SchemaTemplate).Assembly, new { Model = table, Namespace = ns }));
        }
Пример #18
0
        protected virtual Type Load(RazorSourceDocument source, string relativePath)
        {
            var document = _engine.CreateCodeDocument(source);

            var parsed = RazorParser.Parse(source);

            document.SetSyntaxTree(RazorParser.Parse(source));
            foreach (var error in parsed.Diagnostics)
            {
                document.ErrorSink.OnError(error);
            }

            AddVirtualDocuments(document, relativePath);

            var @namespace = GetNamespace(relativePath);
            var @class     = "Generated_" + Path.GetFileNameWithoutExtension(Path.GetFileName(relativePath));

            document.WithClassName(@namespace, @class);

            _engine.Process(document);
            if (document.ErrorSink.Errors.Any())
            {
                throw CreateException(document);
            }

            var compilation = CreateCompilation(@class, @namespace, relativePath, document.GetGeneratedCSharpDocument().GeneratedCode);
            var text        = compilation.SyntaxTrees[0].ToString();

            using (var pe = new MemoryStream())
            {
                using (var pdb = new MemoryStream())
                {
                    var emitResult = compilation.Emit(
                        peStream: pe,
                        pdbStream: pdb,
                        options: new EmitOptions(debugInformationFormat: DebugInformationFormat.PortablePdb));
                    if (!emitResult.Success)
                    {
                        throw CreateException(document, relativePath, text, compilation.AssemblyName, emitResult.Diagnostics);
                    }

                    pe.Seek(0, SeekOrigin.Begin);
                    pdb.Seek(0, SeekOrigin.Begin);

                    var assembly = LoadStream(pe, pdb);
                    var type     = assembly.GetExportedTypes().FirstOrDefault(a => !a.IsNested);
                    return(type);
                }
            }
        }
        public async Task <string> BuildConfirmEmailBody(Reservation reservation)
        {
            var template = "Templates.ReservationConfirmation";

            reservation.Room = await roomService.FindRoomWithAllProperties(reservation.RoomId);

            RazorParser renderer = new RazorParser(typeof(EmailClient).Assembly, memoryCache);
            var         body     = renderer.UsingTemplateFromEmbedded(template, new ReservationConfirmationEmail
            {
                Reservation = reservation,
                BedTypes    = bedService.GetBedTypesAsString(reservation.Room.RoomBeds)
            });

            return(body);
        }
Пример #20
0
        public IActionResult Parse([FromBody] Source source)
        {
            var document = RazorSourceDocument.Create(source.Content, fileName: null);
            var options  = RazorParserOptions.Create(builder => {
                foreach (var directive in GetDirectives())
                {
                    builder.Directives.Add(directive);
                }
            });
            var parser = new RazorParser(options);
            var tree   = parser.Parse(document, legacy: true);
            var result = TreeSerializer.Serialize(tree);

            return(Content(result));
        }
Пример #21
0
        private static void Send(string language, EmailTemplate templateId, Notification notification)
        {
            var emailAction = new SendEmailAction {
                EmailToList = new List <XmlEmail>(), TemplateId = templateId
            };

            emailAction.EmailToList.Add(new XmlEmail {
                Email = notification.Email
            });

            var    parser  = new RazorParser(language);
            string subject = parser.ParseSubject(emailAction, notification);
            string body    = parser.ParseTemplate(emailAction, notification, subject);

            EmailManager.Send(emailAction, subject, body);
        }
        public void ProcessDirectives_CanReturnEmptyDescriptorsBasedOnDirectiveDescriptors(
            string source,
            object tagHelpers)
        {
            // Arrange
            var sourceDocument = TestRazorSourceDocument.Create(source, filePath: "TestFile");
            var parser         = new RazorParser();
            var syntaxTree     = parser.Parse(sourceDocument);
            var visitor        = new DefaultRazorTagHelperBinderPhase.DirectiveVisitor((TagHelperDescriptor[])tagHelpers);

            // Act
            visitor.VisitBlock(syntaxTree.Root);

            // Assert
            Assert.Empty(visitor.Matches);
        }
        public void DirectiveVisitor_ExtractsPrefixFromSyntaxTree(
            string source,
            string expectedPrefix)
        {
            // Arrange
            var sourceDocument = TestRazorSourceDocument.Create(source, filePath: "TestFile");
            var parser         = new RazorParser();
            var syntaxTree     = parser.Parse(sourceDocument);
            var visitor        = new DefaultRazorTagHelperBinderPhase.DirectiveVisitor(tagHelpers: new List <TagHelperDescriptor>());

            // Act
            visitor.VisitBlock(syntaxTree.Root);

            // Assert
            Assert.Equal(expectedPrefix, visitor.TagHelperPrefix);
        }
Пример #24
0
        protected internal virtual ParserResults ParseTemplateCore(LookaheadTextReader input, CancellationToken?cancelToken)
        {
            // Setup the consumer
            SyntaxTreeBuilderVisitor treeBuilder = new SyntaxTreeBuilderVisitor()
            {
                CancelToken = cancelToken
            };

            // Construct the parser
            RazorParser parser = CreateParser();

            Debug.Assert(parser != null);
            parser.Parse(input, treeBuilder);

            // Return the results
            return(treeBuilder.Results);
        }
Пример #25
0
        public void ParseMethodCallsParseDocumentOnMarkupParserAndReturnsResults()
        {
            // Arrange
            RazorParser parser = new RazorParser(new CSharpCodeParser(), new HtmlMarkupParser());

            // Act/Assert
            ParserTestBase.EvaluateResults(TestContext,
                                           parser.Parse(new StringReader("foo @bar baz")),
                                           new MarkupBlock(
                                               new MarkupSpan("foo "),
                                               new ExpressionBlock(
                                                   new TransitionSpan(RazorParser.TransitionString, hidden: false, acceptedCharacters: AcceptedCharacters.None),
                                                   new ImplicitExpressionSpan("bar", CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false, acceptedCharacters: AcceptedCharacters.NonWhiteSpace)
                                                   ),
                                               new MarkupSpan(" baz")
                                               ));
        }
Пример #26
0
        /// <summary>
        ///     Send async email
        /// </summary>
        /// <param name="destination"></param>
        /// <param name="peoples"></param>
        /// <returns></returns>
        public void BatchSend(string destination, IEnumerable <Person> peoples)
        {
            //destination
            if (string.IsNullOrWhiteSpace(destination))
            {
                throw new ArgumentNullException("destination");
            }

            //check peoples
            if (peoples == null || !peoples.Any())
            {
                throw new ArgumentNullException("peoples");
            }

            // Partition the entire source array.
            //https://msdn.microsoft.com/en-us/library/dd997411(v=vs.110).aspx
            var rangePartitioner = Partitioner.Create(0, peoples.Count(), _configuration.AttachmentSize);

            // Loop over the partitions
            var rangePartitions = rangePartitioner.GetDynamicPartitions();

            foreach (var rangePartition in rangePartitions)
            {
                var attachments     = new string[rangePartition.Item2 - rangePartition.Item1];
                var attachmentIndex = 0;

                // Loop over each range element without a delegate invocation.
                for (var counter = rangePartition.Item1; counter < rangePartition.Item2; counter++)
                {
                    var person  = peoples.ElementAt(counter);
                    var html    = RazorParser.Compile(_configuration.TemplatePath, person);
                    var pdf     = iTextSharpFactory.Convert(html);
                    var tmpPath = Path.Combine(Path.GetTempPath(), string.Format("{0}_{1}.pdf", person.FullName, Path.GetFileNameWithoutExtension(Path.GetRandomFileName())));

                    File.WriteAllBytes(tmpPath, pdf);

                    attachments[attachmentIndex] = tmpPath;
                    attachmentIndex++;
                }

                var subject = string.Format("Criminal Profiles - Part {0}/{1}", rangePartition.Item1 + 1, rangePartition.Item2);
                var body    = @"Hi, we are sending you the results of your search. Please open the attached files.";

                SendGridTool.Send(_configuration.EmailProviderKey, _configuration.FromEmail, destination, subject, body, attachments);
            }
        }
Пример #27
0
        public IEnumerable <SearchResult> Search(CancellationToken cancelToken = default(CancellationToken))
        {
            var visitor = new LiteralParserVisitor()
            {
                Path          = Path,
                CancelToken   = cancelToken,
                ExcludedLines = GetExcludedLines(),
            };

            var parser = new RazorParser(new CSharpCodeParser(), new HtmlMarkupParser());

            parser.Parse(this.Reader, visitor);

            visitor.EndText();

            return(visitor.Results);
        }
Пример #28
0
        protected internal virtual GeneratorResults GenerateCodeCore(
            ITextDocument input,
            string className,
            string rootNamespace,
            string sourceFileName,
            CancellationToken?cancelToken
            )
        {
            className     = (className ?? Host.DefaultClassName) ?? DefaultClassName;
            rootNamespace = (rootNamespace ?? Host.DefaultNamespace) ?? DefaultNamespace;

            // Run the parser
            RazorParser parser = CreateParser();

            Debug.Assert(parser != null);
            ParserResults results = parser.Parse(input);

            // Generate code
            RazorCodeGenerator generator = CreateCodeGenerator(
                className,
                rootNamespace,
                sourceFileName
                );

            generator.DesignTimeMode = Host.DesignTimeMode;
            generator.Visit(results);

            // Post process code
            Host.PostProcessGeneratedCode(generator.Context);

            // Extract design-time mappings
            IDictionary <int, GeneratedCodeMapping> designTimeLineMappings = null;

            if (Host.DesignTimeMode)
            {
                designTimeLineMappings = generator.Context.CodeMappings;
            }

            // Collect results and return
            return(new GeneratorResults(
                       results,
                       generator.Context.CompileUnit,
                       designTimeLineMappings
                       ));
        }
Пример #29
0
        public void ParseMethodCallsParseDocumentOnMarkupParserAndReturnsResults()
        {
            var factory = SpanFactory.CreateCsHtml();

            // Arrange
            RazorParser parser = new RazorParser(new CSharpCodeParser(), new HtmlMarkupParser());

            // Act/Assert
            ParserTestBase.EvaluateResults(parser.Parse(new StringReader("foo @bar baz")),
                                           new MarkupBlock(
                                               factory.Markup("foo "),
                                               new ExpressionBlock(
                                                   factory.CodeTransition(),
                                                   factory.Code("bar")
                                                   .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
                                                   .Accepts(AcceptedCharacters.NonWhiteSpace)),
                                               factory.Markup(" baz")));
        }
Пример #30
0
        public void Parse_ParsesDocumentAndInvokesVisitor()
        {
            // Arrange
            var factory = SpanFactory.CreateCsHtml();
            var visitor = new Mock <ParserVisitor> {
                CallBase = true
            };
            var parser = new RazorParser(new CSharpCodeParser(), new HtmlMarkupParser());

            // Act
            parser.Parse(new StringReader("foo @bar baz"), visitor.Object);

            // Assert
            visitor.Verify(v => v.VisitSpan(It.Is <Span>(s => s.Kind == SpanKind.Markup && s.Content == "foo ")));
            visitor.Verify(v => v.VisitSpan(It.Is <Span>(s => s.Kind == SpanKind.Transition && s.Content == "@")));
            visitor.Verify(v => v.VisitSpan(It.Is <Span>(s => s.Kind == SpanKind.Code && s.Content == "bar")));
            visitor.Verify(v => v.VisitSpan(It.Is <Span>(s => s.Kind == SpanKind.Markup && s.Content == " baz")));
        }