mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-05 02:36:19 +02:00
[PreviewPane][Monaco]Format json/xml before rendering (#19980)
This commit is contained in:
committed by
GitHub
parent
e7d3aadec3
commit
16c7a22410
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user