private string ProcessPropertyName( string lineText, int lineNumber, int startPositionOnLine, string text, bool isRootProject, bool isUsage) { var propertyName = text.Trim(); var leadingTriviaWidth = text.IndexOf(propertyName); var trailingTriviaWidth = text.Length - propertyName.Length - leadingTriviaWidth; if (propertyName.IndexOfAny(complexCharsInProperties) != -1) { return(Markup.HtmlEscape(text)); } if (propertyName.IndexOfAny(Path.GetInvalidFileNameChars()) != -1) { Log.Exception(string.Format("Invalid property name {0} in project {1}", propertyName, this.sourceXmlFilePath)); return(Markup.HtmlEscape(text)); } var href = "/" + Constants.MSBuildPropertiesAssembly + "/" + Constants.ReferencesFileName + "/" + propertyName + ".html"; text = string.Format( "{2}<a href=\"{1}\" target=\"n\" class=\"msbuildlink\">{0}</a>{3}", propertyName, href, text.Substring(0, leadingTriviaWidth), text.Substring(text.Length - trailingTriviaWidth)); projectGenerator.AddReference( destinationHtmlFilePath, lineText, startPositionOnLine, propertyName.Length, lineNumber, isRootProject ? this.projectGenerator.AssemblyName : Constants.MSBuildFiles, Constants.MSBuildPropertiesAssembly, null, propertyName, isUsage ? ReferenceKind.MSBuildPropertyUsage : ReferenceKind.MSBuildPropertyAssignment); return(text); }
private string ProcessItemName( string lineText, int lineNumber, int startPositionOnLine, string text, bool isRootProject, bool isUsage) { var itemName = text.Trim(); var leadingTriviaWidth = text.IndexOf(itemName, StringComparison.Ordinal); var trailingTriviaWidth = text.Length - itemName.Length - leadingTriviaWidth; if (itemName.IndexOfAny(complexCharsInProperties) != -1) { return(Markup.HtmlEscape(text)); } var href = "/" + Constants.MSBuildItemsAssembly + "/" + Constants.ReferencesFileName + "/" + itemName + ".html"; text = string.Format( "{2}<a href=\"{1}\" target=\"n\" class=\"msbuildlink\">{0}</a>{3}", itemName, href, text.Substring(0, leadingTriviaWidth), text.Substring(text.Length - trailingTriviaWidth)); ProjectGenerator.AddReference( destinationHtmlFilePath, lineText, startPositionOnLine, itemName.Length, lineNumber, isRootProject ? ProjectGenerator.AssemblyName : Constants.MSBuildFiles, Constants.MSBuildItemsAssembly, null, itemName, isUsage ? ReferenceKind.MSBuildItemUsage : ReferenceKind.MSBuildItemAssignment); return(text); }
private string ProcessTaskName( string lineText, int lineNumber, int startPositionOnLine, string text, string taskName, bool isRootProject, bool isUsage) { var trimmedText = text.Trim(); var leadingTriviaWidth = text.IndexOf(trimmedText, StringComparison.Ordinal); var trailingTriviaWidth = text.Length - trimmedText.Length - leadingTriviaWidth; var href = "/" + Constants.MSBuildTasksAssembly + "/" + Constants.ReferencesFileName + "/" + taskName + ".html"; text = string.Format( "{2}<a href=\"{1}\" target=\"n\" class=\"msbuildlink\">{0}</a>{3}", trimmedText, href, text.Substring(0, leadingTriviaWidth), text.Substring(text.Length - trailingTriviaWidth)); ProjectGenerator.AddReference( destinationHtmlFilePath, lineText, startPositionOnLine, trimmedText.Length, lineNumber, isRootProject ? ProjectGenerator.AssemblyName : Constants.MSBuildFiles, Constants.MSBuildTasksAssembly, null, taskName, isUsage ? ReferenceKind.MSBuildTaskUsage : ReferenceKind.MSBuildTaskDeclaration); return(text); }
private string ProcessAttributeValue(ClassifiedRange range, string text, bool isRootProject) { var node = range.Node; var attributeSyntax = node.GetParent(2) as XmlAttributeSyntax; if (attributeSyntax != null) { var parentElement = attributeSyntax.ParentElement; if (parentElement?.Name == "Output" && (attributeSyntax.Name == "ItemName" || attributeSyntax.Name == "PropertyName") && !text.Contains("%")) { if (attributeSyntax.Name == "ItemName") { return(ProcessItemName( range.LineText, range.LineNumber + 1, range.Column, text, isRootProject, isUsage: false)); } else { return(ProcessPropertyName( range.LineText, range.LineNumber + 1, range.Column, text, isRootProject, isUsage: false)); } } if (parentElement?.Name == "Target") { if (attributeSyntax.Name == "Name") { return(ProcessTargetName( range.LineText, range.LineNumber + 1, range.Column, text, isRootProject, isUsage: false)); } if (attributeSyntax.Name == "DependsOnTargets" || attributeSyntax.Name == "BeforeTargets" || attributeSyntax.Name == "AfterTargets") { return(ProcessExpressions(range, text, isRootProject, ProcessSemicolonSeparatedList)); } } if (parentElement?.Name == "CallTarget" && attributeSyntax.Name == "Targets") { return(ProcessExpressions(range, text, isRootProject, ProcessSemicolonSeparatedList)); } if (parentElement?.Name == "UsingTask" && attributeSyntax.Name == "TaskName") { var taskName = attributeSyntax.Value; var assemblyFileAttribute = parentElement.Attributes.FirstOrDefault(a => a.Name == "AssemblyFile"); var assemblyNameAttribute = parentElement.Attributes.FirstOrDefault(a => a.Name == "AssemblyName"); string assemblyName = null; if (assemblyFileAttribute != null && !string.IsNullOrWhiteSpace(assemblyFileAttribute.Value)) { var assemblyFilePath = assemblyFileAttribute.Value; assemblyFilePath = project.ExpandString(assemblyFilePath); assemblyName = Path.GetFileNameWithoutExtension(assemblyFilePath); } else if (assemblyNameAttribute != null && !string.IsNullOrWhiteSpace(assemblyNameAttribute.Value)) { assemblyName = assemblyNameAttribute.Value; assemblyName = project.ExpandString(assemblyName); int comma = assemblyName.IndexOf(','); if (comma > -1) { assemblyName = assemblyName.Substring(0, comma); } } if (assemblyName != null) { var symbolId = SymbolIdService.GetId("T:" + taskName); ProjectGenerator.AddReference( destinationHtmlFilePath, range.LineText, range.Column, taskName.Length, range.LineNumber, isRootProject ? ProjectGenerator.AssemblyName : Constants.MSBuildFiles, assemblyName, null, symbolId, ReferenceKind.Instantiation); var url = string.Format("/{0}/A.html#{1}", assemblyName, symbolId); var result = string.Format("<a href=\"{0}\" class=\"msbuildlink\">{1}</a>", url, text); return(result); } } } return(ProcessExpressions(range, text, isRootProject)); }