예제 #1
0
        public string Render(string templateFile, ViewModel viewmodel)
        {
            string fName = Path.GetFileName(templateFile);
            string fDir = Path.GetDirectoryName(templateFile);

            var descriptor = new SparkViewDescriptor();
            descriptor.AddTemplate(fName);
            descriptor.TargetNamespace = "templates";

            this.engine.ViewFolder = new FileSystemViewFolder(fDir);

            var view = (MarkdownPageTemplate)this.engine.CreateInstance(descriptor);

            StringWriter writer = new StringWriter();

            try
            {
                view.Model = viewmodel;
                view.RenderView(writer);
                return writer.ToString();
            }
            finally
            {
                this.engine.ReleaseInstance(view);
            }
        }
예제 #2
0
파일: Global.asax.cs 프로젝트: Eilon/spark
 private static SparkViewDescriptor Desc(params string[] templates)
 {
     var desc = new SparkViewDescriptor();
     foreach (string template in templates)
         desc.AddTemplate(template);
     return desc;
 }
        public string RenderTemplate(string templateSource, object data)
        {
            var settings = new SparkSettings
                           	{
                           		PageBaseType = typeof(TestSparkView).Name
                           	};
            settings.AddViewFolder(typeof (TestingViewFolder), new Dictionary<string, string>
                                                               	{
                                                               		{"templateSource", templateSource}
                                                               	});

            settings.AddNamespace("OpenRasta.Codecs.Spark.Tests.TestObjects");
            settings.AddNamespace("OpenRasta.Codecs.Spark.IntegrationTests");
            settings.AddNamespace("OpenRasta.Codecs.Spark2.ViewHelpers");
            settings.AddNamespace("System.Collections.Generic");

            IWindsorContainer dependencies = CreateTestDependencies();
            ISparkViewEngine sparkViewEngine = new SparkViewEngine(settings)
                                               	{
                                               		ExtensionFactory =dependencies.Resolve<ISparkExtensionFactory>()
                                               	};

            var descriptor = new SparkViewDescriptor();
            descriptor.AddTemplate(TestingViewFolder.SingleTemplateName);
            var view = (TestSparkView)sparkViewEngine.CreateInstance(descriptor);
            view.Uris = new UriGenerator(DependencyManager.GetService<IUriResolver>());
            view.ViewData = new TestViewData(data);
            return Render(view);
        }
예제 #4
0
        public virtual string CompileView(string view)
        {
            var viewFactory = new SparkViewFactory();
              var descriptor = new SparkViewDescriptor {Language = LanguageType.Javascript};

              descriptor.AddTemplate(string.Format("{0}{1}{2}", ControllerContext.ViewFolder, Path.DirectorySeparatorChar, view));
              ((IViewSourceLoaderContainer)viewFactory).ViewSourceLoader = Context.Services.ViewSourceLoader;

              var entry = viewFactory.Engine.CreateEntry(descriptor);
              return entry.SourceCode;
        }
예제 #5
0
 private static void appendMasterPage(SparkViewDescriptor descriptor, ITemplate template)
 {
     if (template == null)
     {
         return;
     }
     descriptor.AddTemplate(template.ViewPath);
     var viewDescriptor = template.Descriptor as ViewDescriptor;
     if (viewDescriptor != null)
     {
         appendMasterPage(descriptor, viewDescriptor.Master);
     }
 }
예제 #6
0
파일: BaseHandler.cs 프로젝트: Eilon/spark
        /// <summary>
        /// Called by handler classes to instantiate a view.
        /// </summary>
        /// <param name="templates"></param>
        /// <returns></returns>
        public BaseView CreateView(params string[] templates)
        {
            // the engine is created in Global.Application_Start
            var viewEngine = (ISparkViewEngine) Context.Application["ViewEngine"];

            // a descriptor is used to "key" the type of view to instantiate
            var descriptor = new SparkViewDescriptor();
            foreach (string template in templates)
                descriptor.AddTemplate(template);

            // create the view to return and provides the http context
            var view = (BaseView) viewEngine.CreateInstance(descriptor);
            view.Context = Context;
            return view;
        }
예제 #7
0
        private static void Stub(FileSystemInfo source, FileSystemInfo destination)
        {
            if (source.FullName.EndsWith(".spark"))
            {
                // At this time the destination is already copied and processed by
                // 'simple' text substitution, so destination should be processed.
                var settings = new SparkSettings();
                settings.AddNamespace("System");

                var engine = new SparkViewEngine(settings) {DefaultPageBaseType = typeof(Template).FullName};
                var folder = new InMemoryViewFolder {{source.Name, File.ReadAllText(destination.FullName)}};
                engine.ViewFolder = folder;

                var descriptor = new SparkViewDescriptor();
                descriptor.AddTemplate(source.Name);

                var view = (Template) engine.CreateInstance(descriptor);
                var builder = new StringBuilder();
                using (var output = new StringWriter(builder))
                {
                    view.RenderView(output);
                    File.WriteAllText(destination.FullName, output.ToString());
                }

                engine.ReleaseInstance(view);
            }
            else if (source.FullName.EndsWith(".tt"))
            {
                var generator = new TemplateGenerator();
                if (!generator.ProcessTemplate(source.FullName, destination.FullName))
                {
                    var exception = new TemplateException(source.FullName);
                    foreach (CompilerError error in generator.Errors)
                    {
                        exception.AddError(error.ErrorText);
                    }
                    throw exception;
                }
            }
        }
예제 #8
0
        private string renderTemplate(ITemplate template, params ITemplate[] templates)
        {
            templates = templates ?? Enumerable.Empty<Template>().ToArray();
            var descriptor = new SparkViewDescriptor();
            descriptor.AddTemplate(template.ViewPath);
            templates.Each(x => descriptor.AddTemplate(x.ViewPath));

            var instance = _engine.CreateInstance(descriptor);
            var writer = new StringWriter();
            instance.RenderView(writer);
            return writer.ToString();
        }
예제 #9
0
        private static IList<SparkViewDescriptor> AllKnownDescriptors(SparkViewFactory viewFactory)
        {
            //build the batch
            var batch = new SparkBatchDescriptor();
            batch
                .For<HomeController>().Layout("Application")
                .For<FirstController>().Layout("Application")
                .For<SecondController>().Layout("Application")
                .For<ThirdController>().Layout("Application")
                .For<FourthController>().Layout("Application")
                .For<FifthController>().Layout("Application")
                .For<SixthController>().Layout("Application")
                .For<SeventhController>().Layout("Application")
                .For<EigthController>().Layout("Application")
                .For<NinthController>().Layout("Application")
                .For<TenthController>().Layout("Application");

            //find all the custom themes
            var themeMasters = new List<string>();

            var themePath = ThemeDirectory + "\\";
            var themedMasterFiles = Directory.GetFiles(themePath, "index.html", SearchOption.AllDirectories);
            foreach (var master in themedMasterFiles)
            {
                var themeMasterName = master.Remove(0, themePath.Length);
                themeMasters.Add(themeMasterName);
            }

            //adjust the batch to precompile for each custom theme
            var generatedDescriptors = viewFactory.CreateDescriptors(batch);
            var allDescriptors = new List<SparkViewDescriptor>();

            foreach (var descriptor in generatedDescriptors)
            {
                allDescriptors.Add(descriptor);

                var isAppMaster = descriptor.Templates.Any(x => x.Contains("Application"));
                if (!isAppMaster) continue;

                foreach (var themeMaster in themeMasters)
                {
                    var themeDescriptor = new SparkViewDescriptor()
                        .SetLanguage(descriptor.Language)
                        .SetTargetNamespace(descriptor.TargetNamespace)
                        .AddTemplate(descriptor.Templates[0]);

                    themeDescriptor.AddTemplate(themeMaster);

                    allDescriptors.Add(themeDescriptor);
                }
            }

            return allDescriptors;
        }
예제 #10
0
        /// <summary>
        /// Create view
        /// </summary>
        /// <param name="context">Context used creating view</param>
        /// <param name="viewUri">Path to view being created.</param>
        /// <param name="data">Data used.</param>
        /// <returns>Created view.</returns>
        /// <exception cref="ViewNotFoundException">Failed to find spark view.</exception>
        private SparkView GenerateView(IControllerContext context, string viewUri, IViewData data)
        {
            var descriptor = new SparkViewDescriptor();
            descriptor.AddTemplate(viewUri);

            // Let's not include layouts for ajax requests.
            if (!context.RequestContext.Request.IsAjax)
            {
                string layoutUri = SelectLayoutName(context.LayoutName);
                descriptor.Templates.Add(layoutUri);
            }

            if (!MvcServer.CurrentMvc.ViewProvider.Exists(viewUri))
            {
                _logger.Info("Failed to find " + viewUri);
                throw new ViewNotFoundException(viewUri, "Failed to find spark view '" + viewUri + "'.");
            }


            /* Disabled since types can be null.
             * 
            // since we use strongly typed accessors, we need to loop through view data.
            // and add direct accessors.
            foreach (var viewData in data)
            {
                string typeName = GetTypeName(viewData.Value.GetType(), true);
                descriptor.AddAccessor(typeName + " " + viewData.Key,
                                       "(" + typeName + ")ViewData[\"" + viewData.Key + "\"]");
            }
            */

            ISparkViewEntry entry;
            try
            {
                entry = _engine.CreateEntry(descriptor);
            }
            catch(Exception err)
            {
                _logger.Warning("Failed to compile view.", err);
                throw new InternalServerException("Failed to compile view '" + viewUri + "'.", err);
            }

            // only lock when adding, to avoid duplicates.
            if (context.RequestContext.Request.IsAjax)
            {
                lock (_ajaxMappings)
                {
                    Mapping mapping;
                    if (!_ajaxMappings.TryGetValue(viewUri, out mapping))
                    {
                        mapping = new Mapping(data.GetHashCode(), entry);
                        _ajaxMappings.Add(viewUri, mapping);
                    }
                    else
                        mapping.Add(data.GetHashCode(), entry);
                }
            }
            else
            {
                lock (_mappings)
                {
                    Mapping mapping;
                    if (!_mappings.TryGetValue(viewUri, out mapping))
                    {
                        mapping = new Mapping(data.GetHashCode(), entry);
                        _mappings.Add(viewUri, mapping);
                    }
                    else
                        mapping.Add(data.GetHashCode(), entry);
                }
            }

            return (SparkView) entry.CreateInstance();
        }
예제 #11
0
        private IList<SparkViewDescriptor> ThemableDescriptors(SparkViewFactory viewFactory)
        {
            var generatedDescriptors = RootThemableDescriptors(viewFactory);
            var allDescriptors = new List<SparkViewDescriptor>();

            foreach (var descriptor in generatedDescriptors)
            {
                var isAppMaster = descriptor.Templates.Any(x => x.Contains(ApplicationLayout));
                if (!isAppMaster) continue;

                var themeDescriptor = new SparkViewDescriptor()
                    .SetLanguage(descriptor.Language)
                    .SetTargetNamespace(descriptor.TargetNamespace)
                    .AddTemplate(descriptor.Templates[0]);

                themeDescriptor.AddTemplate(MasterPage);

                allDescriptors.Add(themeDescriptor);
            }

            return allDescriptors;
        }