private AmlLinkClickedEventArgs InfoFromOffset(int startOffset) { var settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment; settings.DtdProcessing = DtdProcessing.Ignore; settings.IgnoreProcessingInstructions = true; var start = base.CurrentContext.VisualLine.FirstDocumentLine.Offset; var stop = base.CurrentContext.VisualLine.LastDocumentLine.EndOffset; var offset = startOffset - start; var text = base.CurrentContext.GetText(start, stop - start).Text; using (var reader = new XmlFragmentReader(base.CurrentContext.Document.CreateReader(start, stop - start))) { var lineInfo = reader as IXmlLineInfo; string type = null; try { while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: type = reader.IsEmptyElement ? null : reader.GetAttribute("type"); break; case XmlNodeType.EndElement: type = null; break; case XmlNodeType.Text: if (!string.IsNullOrEmpty(type) && reader.Value.IsGuid() && lineInfo.LinePosition >= offset) { return new AmlLinkClickedEventArgs() { Id = reader.Value, Type = type, Offset = lineInfo.LinePosition + start - 1 } } ; break; } } } catch (XmlException) { } } return(new AmlLinkClickedEventArgs() { Offset = -1 }); }
private AmlLinkClickedEventArgs InfoFromOffset(int startOffset) { var settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment; settings.DtdProcessing = DtdProcessing.Ignore; settings.IgnoreProcessingInstructions = true; var start = base.CurrentContext.VisualLine.FirstDocumentLine.Offset; var stop = base.CurrentContext.VisualLine.LastDocumentLine.EndOffset; var offset = startOffset - start; var text = base.CurrentContext.GetText(start, stop - start).Text; using (var reader = new XmlFragmentReader(base.CurrentContext.Document.CreateReader(start, stop - start))) { var lineInfo = reader as IXmlLineInfo; string type = null; try { while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: type = reader.IsEmptyElement ? null : reader.GetAttribute("type"); break; case XmlNodeType.EndElement: type = null; break; case XmlNodeType.Text: if (!string.IsNullOrEmpty(type) && reader.Value.IsGuid() && lineInfo.LinePosition >= offset) return new AmlLinkClickedEventArgs() { Id = reader.Value, Type = type, Offset = lineInfo.LinePosition + start }; break; } } } catch (XmlException) { } } return new AmlLinkClickedEventArgs() { Offset = -1 }; }