[PreviewPane][Monaco]Format json/xml before rendering (#19980)

This commit is contained in:
Davide Giacometti
2022-08-24 13:08:10 +02:00
committed by GitHub
parent e7d3aadec3
commit 16c7a22410
10 changed files with 198 additions and 11 deletions

View File

@@ -0,0 +1,21 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace Microsoft.PowerToys.PreviewHandler.Monaco.Formatters
{
public interface IFormatter
{
/// <summary>
/// Gets the language to which the formatter is applied
/// </summary>
string LangSet { get; }
/// <summary>
/// Format the value
/// </summary>
/// <param name="value">The value to format</param>
/// <returns>The value formatted</returns>
string Format(string value);
}
}

View File

@@ -0,0 +1,28 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace Microsoft.PowerToys.PreviewHandler.Monaco.Formatters
{
using System.Text.Json;
public class JsonFormatter : IFormatter
{
/// <inheritdoc/>
public string LangSet => "json";
/// <inheritdoc/>
public string Format(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
return string.Empty;
}
using (var jDocument = JsonDocument.Parse(value, new JsonDocumentOptions { CommentHandling = JsonCommentHandling.Skip }))
{
return JsonSerializer.Serialize(jDocument, new JsonSerializerOptions { WriteIndented = true });
}
}
}
}

View File

@@ -0,0 +1,41 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace Microsoft.PowerToys.PreviewHandler.Monaco.Formatters
{
using System.Text;
using System.Xml;
public class XmlFormatter : IFormatter
{
/// <inheritdoc/>
public string LangSet => "xml";
/// <inheritdoc/>
public string Format(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
return string.Empty;
}
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(value);
var stringBuilder = new StringBuilder();
var xmlWriterSettings = new XmlWriterSettings()
{
OmitXmlDeclaration = xmlDocument.FirstChild.NodeType != XmlNodeType.XmlDeclaration,
Indent = true,
};
using (var xmlWriter = XmlWriter.Create(stringBuilder, xmlWriterSettings))
{
xmlDocument.Save(xmlWriter);
}
return stringBuilder.ToString();
}
}
}

View File

@@ -3,14 +3,16 @@
// See the LICENSE file in the project root for more information.
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Windows.Forms;
using Common;
using Microsoft.PowerToys.PreviewHandler.Monaco.Formatters;
using Microsoft.PowerToys.PreviewHandler.Monaco.Helpers;
using Microsoft.PowerToys.PreviewHandler.Monaco.Properties;
using Microsoft.Web.WebView2.Core;
@@ -26,6 +28,15 @@ namespace Microsoft.PowerToys.PreviewHandler.Monaco
/// </summary>
private readonly Settings _settings = new Settings();
/// <summary>
/// Formatters applied before rendering the preview
/// </summary>
private readonly IReadOnlyCollection<IFormatter> _formatters = new List<IFormatter>
{
new JsonFormatter(),
new XmlFormatter(),
}.AsReadOnly();
/// <summary>
/// Saves if the user already navigated to the index page
/// </summary>
@@ -367,6 +378,23 @@ namespace Microsoft.PowerToys.PreviewHandler.Monaco
{
Logger.LogInfo("Starting reading requested file");
var fileContent = fileReader.ReadToEnd();
if (_settings.TryFormat)
{
var formatter = _formatters.SingleOrDefault(f => f.LangSet == _vsCodeLangSet);
if (formatter != null)
{
try
{
fileContent = formatter.Format(fileContent);
}
catch (Exception ex)
{
Logger.LogError($"Failed to apply formatting to {filePath}", ex);
}
}
}
fileReader.Close();
_base64FileCode = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(fileContent));
Logger.LogInfo("Reading requested file ended");
@@ -379,7 +407,7 @@ namespace Microsoft.PowerToys.PreviewHandler.Monaco
_html = htmlFileReader.ReadToEnd();
htmlFileReader.Close();
Logger.LogInfo("Reading HTML source file ended");
}
}
_html = _html.Replace("[[PT_LANG]]", _vsCodeLangSet, StringComparison.InvariantCulture);
_html = _html.Replace("[[PT_WRAP]]", _settings.Wrap ? "1" : "0", StringComparison.InvariantCulture);

View File

@@ -37,6 +37,26 @@ namespace Microsoft.PowerToys.PreviewHandler.Monaco
}
}
/// <summary>
/// Gets a value indicating whether to try formatting the file. Set by PT settings.
/// </summary>
public bool TryFormat
{
get
{
try
{
return moduleSettings.GetSettings<PowerPreviewSettings>(PowerPreviewSettings.ModuleName).Properties.MonacoPreviewTryFormat;
}
catch (FileNotFoundException)
{
// Couldn't read the settings.
// Assume default of false.
return false;
}
}
}
/// <summary>
/// Max file size for displaying (in bytes).
/// </summary>