public override void Visit(DOM.Document document) { _namespaceResolver.EnterDocument((Document)document); ProcessInterpolation((IPairWithInterpolation)document); base.Visit(document); Visit(document.PairValue); }
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; }
/// <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); } }
/// <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); }
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); } } }
/// <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")); } }
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); }