public override void Visit(DOM.Document document)
 {
     _namespaceResolver.EnterDocument((Document)document);
     ProcessInterpolation((IPairWithInterpolation)document);
     base.Visit(document);
     Visit(document.PairValue);
 }
Exemple #2
0
        public override void OnDocument(DOM.Document document)
        {
            _currentDocument     = (Document)document;
            _currentModuleMember = document;
            _choiceStack.Push(_currentDocument.ChoiceInfo);
            Encoding encoding = Encoding.UTF8;

            if (_generateComments)
            {
                encoding = GetEncoding(document);
            }
            //Generate XML file
            using (_xmlTextWriter = _writerDelegate(document.Name, encoding))
            {
                WriteStartDocument(document);
                _rootElementAdded = false;
                LocationMap       = new List <LexicalInfo>();
                base.OnDocument(document);
                _xmlTextWriter.WriteEndDocument();
            }

            //Validate XML file
            var validator = new SourceMappedXmlValidator(LocationMap, Context.Parameters.XmlSchemaSet, _readerDelegate);

            validator.ValidationErrorEvent += error => Context.Errors.Add(error);

            //var fileName = Path.Combine(_context.Parameters.OutputDirectory, node.Name + ".xml");
            validator.ValidateGeneratedFile(document.Name);

            _currentDocument     = null;
            _currentModuleMember = null;
        }
Exemple #3
0
        /// <summary>
        /// Gets encoding of xml-document from Syntactik comments.
        /// </summary>
        /// <param name="document">Syntactik document with comments.</param>
        /// <returns>Xml encoding.</returns>
        protected Encoding GetEncoding(DOM.Document document)
        {
            var leadingComments = document.Entities.TakeWhile(e => e is Comment);
            var declaration     = leadingComments.FirstOrDefault(c => c.Value.StartsWith("XmlDeclaration:"));

            if (declaration == null)
            {
                return(Encoding.UTF8);
            }

            var m = new Regex(@"(?:[.]*encoding\s*=\s*"")([^""]*)(?:"")").Match(declaration.Value);

            if (!m.Success || m.Groups.Count <= 1)
            {
                return(Encoding.UTF8);
            }

            try
            {
                return(Encoding.GetEncoding(m.Groups[1].Value));
            }
            catch (Exception)
            {
                return(Encoding.UTF8);
            }
        }
Exemple #4
0
        /// <summary>
        /// Resolves namespace and prefix for <see cref="INsNode"/>.
        /// </summary>
        /// <param name="node">Target <see cref="INsNode"/>.</param>
        /// <param name="document">Current <see cref="Document"/>.</param>
        /// <param name="currentModuleMember">Current module member.</param>
        /// <param name="scope">Current <see cref="Scope"/>.</param>
        /// <param name="prefix">Output namespace prefix parameter.</param>
        /// <param name="ns">Output namespace parameter.</param>
        public void GetPrefixAndNs(INsNode node, DOM.Document document, ModuleMember currentModuleMember, Scope scope, out string prefix,
                                   out string ns)
        {
            prefix = null;
            ns     = null;

            var nsPrefix = node.NsPrefix;

            if (nsPrefix == null)
            {
                if (scope == null)
                {
                    return;
                }
                nsPrefix = scope.NsPrefix;
            }
            GetPrefixAndNs(nsPrefix, node, document, currentModuleMember, out prefix, out ns);
        }
Exemple #5
0
        protected virtual void WriteStartDocument(DOM.Document document)
        {
            _xmlTextWriter.WriteStartDocument();
            if (!_generateComments)
            {
                return;
            }
            var leadingComments = document.Entities.TakeWhile(e => e is Comment);
            var pInstructions   =
                leadingComments.Where(c => c.Value.StartsWith("ProcessingInstruction")).Select(c => c.Value);

            foreach (var instruction in pInstructions)
            {
                var m = new Regex(@"(?:ProcessingInstruction\s*)(.*):\s*(.*)").Match(instruction);
                if (m.Success && m.Groups.Count > 2)
                {
                    _xmlTextWriter.WriteProcessingInstruction(m.Groups[1].Value, m.Groups[2].Value);
                }
            }
        }
Exemple #6
0
        /// <summary>
        /// Checking if the document's name is unique in project.
        /// </summary>
        /// <param name="document"></param>
        private void CheckDocumentNameDuplicates(DOM.Document document)
        {
            var sameNameDocuments =
                _namespaceResolver.ModuleMembersNsInfo.FindAll(
                    n => (n.ModuleMember is DOM.Document && ((DOM.Document)n.ModuleMember).Name == document.Name)
                    &&
                    ((Module)document.Module).TargetFormat ==
                    ((Module)((DOM.Document)n.ModuleMember).Module).TargetFormat &&
                    ((DOM.Document)n.ModuleMember).Entities.Any(e => !(e is DOM.Comment))
                    );

            if (sameNameDocuments.Count <= 1)
            {
                return;
            }
            if (((Document)document).Module.ModuleDocument != document)  //don't report error for module document
            {
                Context.AddError(CompilerErrorFactory.DuplicateDocumentName((Document)document, _currentModule.FileName));
            }
        }
        public void GetPrefixAndNs(INsNode node, DOM.Document document, Func <Scope> getScope, out string prefix,
                                   out string ns)
        {
            prefix = null;
            ns     = null;

            var nsPrefix = node.NsPrefix;

            if (nsPrefix == null)
            {
                var scope = getScope();
                if (scope == null)
                {
                    return;
                }
                nsPrefix = scope.NsPrefix;
            }

            GetPrefixAndNs(nsPrefix, node, document, out prefix, out ns);
        }
        public void GetPrefixAndNs(string nsPrefix, INsNode node, DOM.Document document, out string prefix,
                                   out string ns)
        {
            prefix = null;
            ns     = null;

            //Getting namespace info for the generated document.
            var targetNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == document);
            var moduleMember = GetModuleMember((Pair)node);
            var member       = moduleMember as ModuleMember;

            if (member != null)
            {
                //Resolving ns first using aliasDef context NsInfo
                var contextNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == moduleMember);
                var domNamespace  = contextNsInfo.Namespaces.FirstOrDefault(n => n.Name == nsPrefix);

                if (domNamespace == null)
                {
                    //Prefix was defined in the module. Looking up in the module.
                    var moduleNamespace = member.Module.NamespaceDefinitions.FirstOrDefault(n => n.Name == nsPrefix);
                    if (moduleNamespace != null)
                    {
                        ns = moduleNamespace.Value;
                    }
                }
                else
                {
                    ns = domNamespace.Value;
                }
                //Resolving prefix using Document's NsInfo
                if (ns != null)
                {
                    var ns1 = ns;
                    prefix = targetNsInfo.Namespaces.First(n => n.Value == ns1).Name;
                }
            }
        }
        /// <summary>
        /// Checks if XML document has one root element
        /// </summary>
        /// <param name="document"></param>
        private void CheckDocumentElement(DOM.Document document)
        {
            int rootElementCount = 0;

            foreach (var entity in document.Entities)
            {
                if (entity is DOM.Element)
                {
                    rootElementCount++;
                }

                var scope = entity as Scope;
                if (scope != null)
                {
                    rootElementCount += CalcNumOfRootElements(scope);
                }

                if (entity is DOM.Alias)
                {
                    rootElementCount += CalcNumOfRootElements((Alias)entity);
                }

                if (rootElementCount > 1)
                {
                    break;
                }
            }
            if (rootElementCount == 0)
            {
                Context.AddError(CompilerErrorFactory.DocumentMustHaveOneRootElement((Document)document,
                                                                                     document.Module.FileName, " at least"));
            }
            else if (rootElementCount > 1)
            {
                Context.AddError(CompilerErrorFactory.DocumentMustHaveOneRootElement((Document)document,
                                                                                     document.Module.FileName, " only"));
            }
        }
Exemple #10
0
        public override void Visit(DOM.Document document)
        {
            CurrentDocument = (Document)document;
            CheckPairValue(document);
            _blockStateUnknown = true;

            CheckDocumentNameDuplicates(document);
            _choiceStack.Push(((Document)document).ChoiceInfo);
            base.Visit(document);
            if (_currentModule.TargetFormat == Module.TargetFormats.Xml)
            {
                CheckDocumentElement(document);
            }
            _choiceStack.Pop();
            if (((Document)document).ChoiceInfo.Errors != null)
            {
                foreach (var error in ((Document)document).ChoiceInfo.Errors)
                {
                    Context.AddError(error);
                }
            }
            CurrentDocument = null;
        }
 /// <inheritdoc />
 public override void Visit(DOM.Document document)
 {
     CurrentModuleMember = document;
     base.Visit(document);
 }