Repository: sharkdp/bat (language: rust)

Issue:
Use XML syntax for MSBuild files
MSBuild project files are a standard in the .NET ecosystem.

File extensions for these include `.props`, `.targets`, `.csproj`, `.vbproj`, and I think `.fsproj` too but would need to check.

Can the existing XML formatting be automatically used for these, rather than requiring users to pass `--language xml`?


Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6859f71a56..55fb6c5d69 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,7 @@
 - Improvements to CSV/TSV highlighting, with autodetection of delimiter and support for TSV files, see #3186 (@keith-
 - Improve (Sys)log error highlighting, see #3205 (@keith-hall)
 - Map `ndjson` extension to JSON syntax, see #3209 (@keith-hall)
+- Map files with `csproj`, `vbproj`, `props` and `targets` extensions to XML syntax, see #3213 (@keith-hall)
 
 ## Themes
 
diff --git a/src/syntax_mapping/builtins/common/50-dotnet-xml.toml b/src/syntax_mapping/builtins/common/50-dotnet-xml.toml
new file mode 100644
index 0000000000..1e3a860a7e
--- /dev/null
+++ b/src/syntax_mapping/builtins/common/50-dotnet-xml.toml
@@ -0,0 +1,2 @@
+[mappings]
+"XML" = ["*.csproj", "*.vbproj", "*.props", "*.targets"]


Test patch:
diff --git a/tests/syntax-tests/highlighted/XML/Directory.Build.props b/tests/syntax-tests/highlighted/XML/Directory.Build.props
new file mode 100644
index 0000000000..bd4b97a0f9
--- /dev/null
+++ b/tests/syntax-tests/highlighted/XML/Directory.Build.props
@@ -0,0 +1,5 @@
+[38;2;255;255;255m<[0m[38;2;249;38;114mProject[0m[38;2;255;255;255m>[0m
+[38;2;248;248;242m   [0m[38;2;255;255;255m<[0m[38;2;249;38;114mPropertyGroup[0m[38;2;255;255;255m>[0m
+[38;2;248;248;242m      [0m[38;2;255;255;255m<[0m[38;2;249;38;114mOutDir[0m[38;2;255;255;255m>[0m[38;2;248;248;242mC:\output\$(MSBuildProjectName)[0m[38;2;255;255;255m</[0m[38;2;249;38;114mOutDir[0m[38;2;255;255;255m>[0m
+[38;2;248;248;242m   [0m[38;2;255;255;255m</[0m[38;2;249;38;114mPropertyGroup[0m[38;2;255;255;255m>[0m
+[38;2;255;255;255m</[0m[38;2;249;38;114mProject[0m[38;2;255;255;255m>[0m
diff --git a/tests/syntax-tests/highlighted/XML/console.csproj b/tests/syntax-tests/highlighted/XML/console.csproj
new file mode 100644
index 0000000000..ee49fbf09c
--- /dev/null
+++ b/tests/syntax-tests/highlighted/XML/console.csproj
@@ -0,0 +1,11 @@
+[38;2;255;255;255m<[0m[38;2;249;38;114mProject[0m[38;2;248;248;242m [0m[38;2;166;226;46mSdk[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116mMicrosoft.NET.Sdk[0m[38;2;230;219;116m"[0m[38;2;255;255;255m>[0m
+
+[38;2;248;248;242m  [0m[38;2;255;255;255m<[0m[38;2;249;38;114mPropertyGroup[0m[38;2;255;255;255m>[0m
+[38;2;248;248;242m    [0m[38;2;255;255;255m<[0m[38;2;249;38;114mOutputType[0m[38;2;255;255;255m>[0m[38;2;248;248;242mExe[0m[38;2;255;255;255m</[0m[38;2;249;38;114mOutputType[0m[38;2;255;255;255m>[0m
+[38;2;248;248;242m    [0m[38;2;255;255;255m<[0m[38;2;249;38;114mTargetFramework[0m[38;2;255;255;255m>[0m[38;2;248;248;242mnet9.0[0m[38;2;255;255;255m</[0m[38;2;249;38;114mTargetFramework[0m[38;2;255;255;255m>[0m
+[38;2;248;248;242m    [0m[38;2;255;255;255m<[0m[38;2;249;38;114mRootNamespace[0m[38;2;255;255;255m>[0m[38;2;248;248;242mSomeNamespace[0m[38;2;255;255;255m</[0m[38;2;249;38;114mRootNamespace[0m[38;2;255;255;255m>[0m
+[38;2;248;248;242m    [0m[38;2;255;255;255m<[0m[38;2;249;38;114mImplicitUsings[0m[38;2;255;255;255m>[0m[38;2;248;248;242menable[0m[38;2;255;255;255m</[0m[38;2;249;38;114mImplicitUsings[0m[38;2;255;255;255m>[0m
+[38;2;248;248;242m    [0m[38;2;255;255;255m<[0m[38;2;249;38;114mNullable[0m[38;2;255;255;255m>[0m[38;2;248;248;242menable[0m[38;2;255;255;255m</[0m[38;2;249;38;114mNullable[0m[38;2;255;255;255m>[0m
+[38;2;248;248;242m  [0m[38;2;255;255;255m</[0m[38;2;249;38;114mPropertyGroup[0m[38;2;255;255;255m>[0m
+
+[38;2;255;255;255m</[0m[38;2;249;38;114mProject[0m[38;2;255;255;255m>[0m
diff --git a/tests/syntax-tests/highlighted/XML/projectname.targets b/tests/syntax-tests/highlighted/XML/projectname.targets
new file mode 100644
index 0000000000..0af85fbd70
--- /dev/null
+++ b/tests/syntax-tests/highlighted/XML/projectname.targets
@@ -0,0 +1,8 @@
+[38;2;255;255;255m<?[0m[38;2;249;38;114mxml[0m[38;2;248;248;242m [0m[38;2;166;226;46mversion[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116m1.0[0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mencoding[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116mutf-8[0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m[38;2;255;255;255m?>[0m
+[38;2;255;255;255m<[0m[38;2;249;38;114mProject[0m[38;2;248;248;242m [0m[38;2;166;226;46mxmlns[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116mhttp://schemas.microsoft.com/developer/msbuild/2003[0m[38;2;230;219;116m"[0m[38;2;255;255;255m>[0m
+
+[38;2;248;248;242m  [0m[38;2;255;255;255m<[0m[38;2;249;38;114mTarget[0m[38;2;248;248;242m [0m[38;2;166;226;46mName[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116mTestTarget[0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mAfterTargets[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116mBuild[0m[38;2;230;219;116m"[0m[38;2;255;255;255m>[0m
+[38;2;248;248;242m    [0m[38;2;255;255;255m<[0m[38;2;249;38;114mMessage[0m[38;2;248;248;242m [0m[38;2;166;226;46mImportance[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116mHigh[0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mText[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116m-------------MHM----------------[0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m[38;2;255;255;255m/>[0m
+[38;2;248;248;242m  [0m[38;2;255;255;255m</[0m[38;2;249;38;114mTarget[0m[38;2;255;255;255m>[0m
+
+[38;2;255;255;255m</[0m[38;2;249;38;114mProject[0m[38;2;255;255;255m>[0m
diff --git a/tests/syntax-tests/source/XML/Directory.Build.props b/tests/syntax-tests/source/XML/Directory.Build.props
new file mode 100644
index 0000000000..95da98cf7c
--- /dev/null
+++ b/tests/syntax-tests/source/XML/Directory.Build.props
@@ -0,0 +1,5 @@
+<Project>
+   <PropertyGroup>
+      <OutDir>C:\output\$(MSBuildProjectName)</OutDir>
+   </PropertyGroup>
+</Project>
diff --git a/tests/syntax-tests/source/XML/console.csproj b/tests/syntax-tests/source/XML/console.csproj
new file mode 100644
index 0000000000..61dd682133
--- /dev/null
+++ b/tests/syntax-tests/source/XML/console.csproj
@@ -0,0 +1,11 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net9.0</TargetFramework>
+    <RootNamespace>SomeNamespace</RootNamespace>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>
diff --git a/tests/syntax-tests/source/XML/projectname.targets b/tests/syntax-tests/source/XML/projectname.targets
new file mode 100644
index 0000000000..fc597ed259
--- /dev/null
+++ b/tests/syntax-tests/source/XML/projectname.targets
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+  <Target Name="TestTarget" AfterTargets="Build">
+    <Message Importance="High" Text="-------------MHM----------------" />
+  </Target>
+
+</Project>