protected override void Visit(MacroChunk chunk)
 {
     _source.Append("function ").Append(chunk.Name).Append("(");
     string delimiter = "";
     foreach (var parameter in chunk.Parameters)
     {
         _source.Append(delimiter).Append(parameter.Name);
         delimiter = ", ";
     }
     _source.AppendLine(") {var __output__ = new StringWriter(); OutputScope(__output__);");
     var codeVisitor = new JavascriptGeneratedCodeVisitor(_source);
     codeVisitor.Accept(chunk.Body);
     _source.AppendLine("DisposeOutputScope(); return __output__.toString();}");
 }
Example #2
0
        protected override void Visit(MacroChunk chunk)
        {
            _source.Append("function ").Append(chunk.Name).Append("(");
            string delimiter = "";

            foreach (var parameter in chunk.Parameters)
            {
                _source.Append(delimiter).Append(parameter.Name);
                delimiter = ", ";
            }
            _source.AppendLine(") {var __output__ = new StringWriter(); OutputScope(__output__);");
            var codeVisitor = new JavascriptGeneratedCodeVisitor(_source);

            codeVisitor.Accept(chunk.Body);
            _source.AppendLine("DisposeOutputScope(); return __output__.toString();}");
        }
Example #3
0
        public override void GenerateSourceCode(IEnumerable<IList<Chunk>> viewTemplates, IEnumerable<IList<Chunk>> allResources)
        {
            var source = new StringBuilder();

            var anonymousTypeVisitor = new JavascriptAnonymousTypeVisitor();
            var globalMembers = new JavascriptGlobalMembersVisitor(source);
            var preRenderVisitor = new JavascriptPreRenderVisitor(source);
            var generatedJavascript = new JavascriptGeneratedCodeVisitor(source);
            var postRenderVisitor = new JavascriptPostRenderVisitor(source);

            var primaryName = Descriptor.Templates[0];
            var nameParts = primaryName
                .Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries)
                .Select(name => SafeName(name));

            // convert some syntax from csharp to javascript
            foreach (var template in viewTemplates)
                anonymousTypeVisitor.Accept(template);

            var cumulativeName = "window.Spark";
            foreach (var part in nameParts)
            {
                source.Append("if (!").Append(cumulativeName).Append(") ").Append(cumulativeName).
                    AppendLine(" = {};");
                cumulativeName = cumulativeName + "." + part;
            }

            source.Append(cumulativeName).AppendLine(" = {");
            foreach (var chunks in allResources)
            {
                globalMembers.Accept(chunks);
            }

            source.AppendLine("RenderView: function(viewData) {");

            source.Append("var StringWriter = function() {");
            source.Append("this._parts = [];");
            source.Append("this.Write = function(arg) {this._parts.push(arg.toString());};");
            source.Append("this.toString = function() {return this._parts.join('');};");
            source.AppendLine("};");

            source.AppendLine("var Output = new StringWriter();");

            source.AppendLine("var Content = {};");

            source.Append("function OutputScope(arg) {");
            source.Append("if (typeof arg == 'string') {if (!Content[arg]) Content[arg] = new StringWriter(); arg = Content[arg];}");
            source.Append("OutputScope._frame = {_frame:OutputScope.Frame, _output:Output};");
            source.Append("Output = arg;");
            source.AppendLine("};");

            source.Append("function DisposeOutputScope() {");
            source.Append("Output = OutputScope._frame._output;");
            source.Append("OutputScope._frame = OutputScope._frame._frame;");
            source.AppendLine("};");

            foreach (var chunks in allResources)
            {
                preRenderVisitor.Accept(chunks);
            }

            var level = 0;
            foreach (var template in viewTemplates)
            {
                source.Append("function RenderViewLevel").Append(level).AppendLine("() {");
                generatedJavascript.Accept(template);
                source.AppendLine("}");
                ++level;
            }

            source.AppendLine("RenderViewLevel0();");

            foreach (var chunks in allResources)
            {
                postRenderVisitor.Accept(chunks);
            }

            source.AppendLine("return Output.toString();");
            source.AppendLine("} // function RenderView");

            source.Append("} // ").AppendLine(cumulativeName);

            SourceCode = source.ToString();
        }