Beispiel #1
0
 public HxlDocumentFragment Convert(DomContainer html,
                                    HxlDocumentFragment result,
                                    Action <Type> typeUse)
 {
     _result  = result;
     _current = _result;
     _typeUse = typeUse;
     Visit(html);
     return(_result);
 }
Beispiel #2
0
        private HxlDocumentFragment PrepareDocument()
        {
            _metrics.StartPreprocessor();
            ParsedTemplate parsed = this;

            // TODO Consider which services belong here
            var sp = new ServiceContainer(ServiceProvider.Current);

            var all       = CreateCompilerProcessors();
            var converter = new DomConverter();
            var myDoc     = converter.Convert(parsed.SourceDocument,
                                              NewDocument(),
                                              t => _implicitAssemblyReferences.Add(t.GetTypeInfo().Assembly));

            foreach (var c in all)
            {
                c.Preprocess(myDoc, sp);
            }

            // TODO Combine adjacent text uses (performance)
            // TODO ToArray() is wasteful (performance)

            // Convert document
            HxlDocumentFragment result = NewDocument();

            foreach (var m in myDoc.ChildNodes.ToArray())
            {
                var conv = HxlCompilerConverter.ChooseConverter(m);
                conv.ConvertAndAppend(result, m, CSharpScriptGenerator.Instance);
            }

            _metrics.EndPreprocessor();

            // TODO This is a compiler settings property
            bool skipOptimizations = false;

            _metrics.TemplateOptimizerStarting("cs", !skipOptimizations);

            if (!skipOptimizations)
            {
                _metrics.StartOptimizer();
                OptimizeRenderIslands.Rewrite(result);
                _metrics.EndOptimizer();
            }

            return(result);
        }
Beispiel #3
0
        public ParsedTemplate(string text, string name, HxlCompilerSettings settings)
        {
            _metrics = Metrics.ForTemplateParsing();
            _metrics.StartParsing();
            _sourceDocument = HtmlDocumentFragment.Parse(text, new HtmlReaderSettings {
                Mode = HtmlTreeBuilderMode.Xml
            });
            _metrics.EndParsing(name, text.Length);

            _settings    = settings;
            _nodeFactory = DomNodeFactory.Compose(
                HxlDomNodeFactory.Compiler,
                _settings.NodeFactories,
                new InvalidFactory());

            Signature = string.Concat(SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(text))
                                      .Take(8)
                                      .Select(b => b.ToString("x2"))
                                      );

            if (string.IsNullOrEmpty(name))
            {
                this.TemplateName = "Template" + this.Signature;
            }
            else
            {
                this.TemplateName = CodeUtility.Slug(name);
            }

            this.Namespace = "Generated";
            this.ClassName = this.TemplateName;

            using (UsingNamespaceResolver()) {
                this._preparedDocument = PrepareDocument();
            }
        }