From 8d119a2a56140154054275eeffa234690ade4424 Mon Sep 17 00:00:00 2001
From: molsonkiko <46202915+molsonkiko@users.noreply.github.com>
Date: Tue, 16 Jul 2024 12:53:17 -0700
Subject: [PATCH] Add path_separator setting (fix #69) Also improve treenode
right-click context menu
---
CHANGELOG.md | 5 +-
.../Forms/TreeViewer.Designer.cs | 48 ++++---
JsonToolsNppPlugin/Forms/TreeViewer.cs | 111 ++++++++++++++--
JsonToolsNppPlugin/Forms/TreeViewer.resx | 8 +-
JsonToolsNppPlugin/JSONTools/JNode.cs | 120 ++++++++++--------
JsonToolsNppPlugin/Main.cs | 85 +++++++++----
.../PluginInfrastructure/SettingsBase.cs | 14 +-
JsonToolsNppPlugin/Properties/AssemblyInfo.cs | 4 +-
JsonToolsNppPlugin/Tests/FormatPathTests.cs | 56 ++++++--
.../Tests/UserInterfaceTests.cs | 6 +
JsonToolsNppPlugin/Utils/Settings.cs | 6 +-
docs/README.md | 28 ++--
most recent errors.txt | 84 ++++++------
translation/english.json5 | 3 +-
translation/italian.json5 | 5 +-
15 files changed, 404 insertions(+), 179 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9c4e29a..2f55349 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -26,7 +26,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
* Add `uses_context` field to ArgFunction instances, so that they have JQueryContext appended to their arguments, and they can reference fields of that JQueryContext.
* This way we don't have to have these methods mutating and referencing a global static variable.
* Additionally, the presence of a function with `uses_context=true` would serve as a flag that the query cannot be executed in parallel, because doing so would cause race conditions associated with the shared JQueryContext fields.
-7. Unit tests that randomly generate text with JSON chars to make sure JSON parser never throws for any reason, since errors aren't caught.
### To Be Changed
@@ -57,6 +56,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
2. In the `grepper form`, pressing `Enter` inside the `Previously viewed directories...` box causes the current text of the box to be searched, assuming that it is a valid directory.
3. [Translation](/README.md#translating-jsontools-to-another-language) of settings in the [Settings form](/docs/README.md#customizing-settings).
4. Translation of [JSON syntax errors and JSON schema validation errors](/docs/README.md#error-form-and-status-bar) (under the `jsonLint` field of the [translation file](/translation/english.json5))
+5. The [`path_separator` setting](/docs/README.md#key_style-and-path_separator-settings) for formatting keys/indices and paths. Addresses [issue 69](https://github.com/molsonkiko/JsonToolsNppPlugin/issues/69).
+6. Make it so left-clicking on the `Key/index to clipboard` and `Path to clipboard` options of the [treenode right-click context menu](/docs/README.md#get-info-about-tree-nodes) gets the path or key/index in whatever the default is from your settings, without having to click on one of the sub-menu items.
### Changed
@@ -813,7 +814,7 @@ __[.NET Framework 4.8](https://learn.microsoft.com/en-us/dotnet/framework/migrat
1. [Menu command](/docs/README.md#path-to-current-line) for getting path to first node in current line.
2. Right-clicking on tree nodes lets you get the current node's value, key/index in parent iterable, or path.
-3. [key_style](/docs/README.md#key-style) option in settings for customizing how the path is formatted (e.g., dot syntax for JavaScript vs. obligatory square brackets and quotes for Python)
+3. [key_style](/docs/README.md#key_style-and-path_separator-settings) option in settings for customizing how the path is formatted (e.g., dot syntax for JavaScript vs. obligatory square brackets and quotes for Python)
4. Automatic resizing of the query box and the tree view when the docking box is resized.
5. A text box containing the path to the currently selected tree node (in the default key style) and a [button for copying it to the clipboard](/docs/README.md#get-info-about-tree-nodes).
diff --git a/JsonToolsNppPlugin/Forms/TreeViewer.Designer.cs b/JsonToolsNppPlugin/Forms/TreeViewer.Designer.cs
index 9d5d74a..8f6e469 100644
--- a/JsonToolsNppPlugin/Forms/TreeViewer.Designer.cs
+++ b/JsonToolsNppPlugin/Forms/TreeViewer.Designer.cs
@@ -55,7 +55,7 @@ private void InitializeComponent()
this.PythonStyleItem = new System.Windows.Forms.ToolStripMenuItem();
this.RemesPathStyleItem = new System.Windows.Forms.ToolStripMenuItem();
this.CopyPathItem = new System.Windows.Forms.ToolStripMenuItem();
- this.JavaScriptStyleKeyItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.JavaScriptStylePathItem = new System.Windows.Forms.ToolStripMenuItem();
this.PythonStylePathItem = new System.Windows.Forms.ToolStripMenuItem();
this.RemesPathStylePathItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToggleSubtreesItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -66,6 +66,8 @@ private void InitializeComponent()
this.RefreshButton = new System.Windows.Forms.Button();
this.FindReplaceButton = new System.Windows.Forms.Button();
this.DocumentTypeComboBox = new System.Windows.Forms.ComboBox();
+ this.path_separatorStyleItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.path_separatorStylePathItem = new System.Windows.Forms.ToolStripMenuItem();
this.NodeRightClickMenu.SuspendLayout();
this.SuspendLayout();
//
@@ -170,7 +172,7 @@ private void InitializeComponent()
this.OpenSortFormItem,
this.SelectAllChildrenItem});
this.NodeRightClickMenu.Name = "NodeRightClickMenu";
- this.NodeRightClickMenu.Size = new System.Drawing.Size(268, 172);
+ this.NodeRightClickMenu.Size = new System.Drawing.Size(268, 200);
//
// CopyValueMenuItem
//
@@ -183,7 +185,8 @@ private void InitializeComponent()
this.CopyKeyItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.JavaScriptStyleItem,
this.PythonStyleItem,
- this.RemesPathStyleItem});
+ this.RemesPathStyleItem,
+ this.path_separatorStyleItem});
this.CopyKeyItem.Name = "CopyKeyItem";
this.CopyKeyItem.Size = new System.Drawing.Size(267, 24);
this.CopyKeyItem.Text = "Key/index to clipboard";
@@ -191,47 +194,48 @@ private void InitializeComponent()
// JavaScriptStyleItem
//
this.JavaScriptStyleItem.Name = "JavaScriptStyleItem";
- this.JavaScriptStyleItem.Size = new System.Drawing.Size(198, 26);
+ this.JavaScriptStyleItem.Size = new System.Drawing.Size(268, 26);
this.JavaScriptStyleItem.Text = "JavaScript style";
//
// PythonStyleItem
//
this.PythonStyleItem.Name = "PythonStyleItem";
- this.PythonStyleItem.Size = new System.Drawing.Size(198, 26);
+ this.PythonStyleItem.Size = new System.Drawing.Size(268, 26);
this.PythonStyleItem.Text = "Python style";
//
// RemesPathStyleItem
//
this.RemesPathStyleItem.Name = "RemesPathStyleItem";
- this.RemesPathStyleItem.Size = new System.Drawing.Size(198, 26);
+ this.RemesPathStyleItem.Size = new System.Drawing.Size(268, 26);
this.RemesPathStyleItem.Text = "RemesPath style";
//
// CopyPathItem
//
this.CopyPathItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.JavaScriptStyleKeyItem,
+ this.JavaScriptStylePathItem,
this.PythonStylePathItem,
- this.RemesPathStylePathItem});
+ this.RemesPathStylePathItem,
+ this.path_separatorStylePathItem});
this.CopyPathItem.Name = "CopyPathItem";
this.CopyPathItem.Size = new System.Drawing.Size(267, 24);
this.CopyPathItem.Text = "Path to clipboard";
//
- // JavaScriptStyleKeyItem
+ // JavaScriptStylePathItem
//
- this.JavaScriptStyleKeyItem.Name = "JavaScriptStyleKeyItem";
- this.JavaScriptStyleKeyItem.Size = new System.Drawing.Size(198, 26);
- this.JavaScriptStyleKeyItem.Text = "JavaScript style";
+ this.JavaScriptStylePathItem.Name = "JavaScriptStylePathItem";
+ this.JavaScriptStylePathItem.Size = new System.Drawing.Size(268, 26);
+ this.JavaScriptStylePathItem.Text = "JavaScript style";
//
// PythonStylePathItem
//
this.PythonStylePathItem.Name = "PythonStylePathItem";
- this.PythonStylePathItem.Size = new System.Drawing.Size(198, 26);
+ this.PythonStylePathItem.Size = new System.Drawing.Size(268, 26);
this.PythonStylePathItem.Text = "Python style";
//
// RemesPathStylePathItem
//
this.RemesPathStylePathItem.Name = "RemesPathStylePathItem";
- this.RemesPathStylePathItem.Size = new System.Drawing.Size(198, 26);
+ this.RemesPathStylePathItem.Size = new System.Drawing.Size(268, 26);
this.RemesPathStylePathItem.Text = "RemesPath style";
//
// ToggleSubtreesItem
@@ -314,6 +318,18 @@ private void InitializeComponent()
this.DocumentTypeComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.QueryBox_KeyPress);
this.DocumentTypeComboBox.KeyUp += new System.Windows.Forms.KeyEventHandler(this.TreeViewer_KeyUp);
//
+ // path_separatorStyleItem
+ //
+ this.path_separatorStyleItem.Name = "path_separatorStyleItem";
+ this.path_separatorStyleItem.Size = new System.Drawing.Size(268, 26);
+ this.path_separatorStyleItem.Text = "Use path_separator setting";
+ //
+ // path_separatorStylePathItem
+ //
+ this.path_separatorStylePathItem.Name = "path_separatorStylePathItem";
+ this.path_separatorStylePathItem.Size = new System.Drawing.Size(268, 26);
+ this.path_separatorStylePathItem.Text = "Use path_separator setting";
+ //
// TreeViewer
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
@@ -350,7 +366,7 @@ private void InitializeComponent()
private System.Windows.Forms.ToolStripMenuItem PythonStyleItem;
private System.Windows.Forms.ToolStripMenuItem RemesPathStyleItem;
private System.Windows.Forms.ToolStripMenuItem CopyPathItem;
- private System.Windows.Forms.ToolStripMenuItem JavaScriptStyleKeyItem;
+ private System.Windows.Forms.ToolStripMenuItem JavaScriptStylePathItem;
private System.Windows.Forms.ToolStripMenuItem PythonStylePathItem;
private System.Windows.Forms.ToolStripMenuItem RemesPathStylePathItem;
private System.Windows.Forms.TextBox CurrentPathBox;
@@ -364,5 +380,7 @@ private void InitializeComponent()
private System.Windows.Forms.ToolStripMenuItem SelectThisItem;
private System.Windows.Forms.ToolStripMenuItem SelectAllChildrenItem;
private System.Windows.Forms.ComboBox DocumentTypeComboBox;
+ private System.Windows.Forms.ToolStripMenuItem path_separatorStyleItem;
+ private System.Windows.Forms.ToolStripMenuItem path_separatorStylePathItem;
}
}
\ No newline at end of file
diff --git a/JsonToolsNppPlugin/Forms/TreeViewer.cs b/JsonToolsNppPlugin/Forms/TreeViewer.cs
index 17a3658..e6851ce 100644
--- a/JsonToolsNppPlugin/Forms/TreeViewer.cs
+++ b/JsonToolsNppPlugin/Forms/TreeViewer.cs
@@ -72,13 +72,18 @@ public partial class TreeViewer : Form
public bool isDarkMode = false;
// event handlers for the node mouseclick drop down menu
+ private bool hasWarnedNo_path_separator = false;
private static MouseEventHandler valToClipboardHandler = null;
+ private static MouseEventHandler pathToClipboardHandler = null;
private static MouseEventHandler pathToClipboardHandler_Remespath = null;
private static MouseEventHandler pathToClipboardHandler_Python = null;
private static MouseEventHandler pathToClipboardHandler_Javascript = null;
+ private static MouseEventHandler pathToClipboardHandler_path_separator = null;
+ private static MouseEventHandler keyToClipboardHandler = null;
private static MouseEventHandler keyToClipboardHandler_Remespath = null;
private static MouseEventHandler keyToClipboardHandler_Python = null;
private static MouseEventHandler keyToClipboardHandler_Javascript = null;
+ private static MouseEventHandler keyToClipboardHandler_path_separator = null;
private static MouseEventHandler ToggleSubtreesHandler = null;
private static MouseEventHandler selectThisHandler = null;
private static MouseEventHandler showSortFormHandler = null;
@@ -924,6 +929,30 @@ private void Tree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
}
);
keyToClipboard_RemesPath.MouseUp += keyToClipboardHandler_Remespath;
+ var keyToClipboard_path_separator = keyToClipboard.DropDownItems[3];
+ keyToClipboard_path_separator.Text = $"Use path_separator setting ({Main.settings.path_separator})";
+ if (keyToClipboardHandler_path_separator != null)
+ {
+ try
+ {
+ keyToClipboard_path_separator.MouseUp -= keyToClipboardHandler_path_separator;
+ }
+ catch { }
+ }
+ keyToClipboardHandler_path_separator = new MouseEventHandler(
+ (s2, e2) =>
+ {
+ if (Main.pathSeparator == JNode.DEFAULT_PATH_SEPARATOR && !hasWarnedNo_path_separator)
+ {
+ MessageBox.Show($"You chose \"Key/index to clipboard\" with the \"Use path_separator setting\" option, but your path_separator is still the default {Main.settings.path_separator}. The {Main.settings.key_style} style is being used instead.",
+ "path_separator setting not configured",
+ MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ hasWarnedNo_path_separator = true;
+ }
+ Npp.TryCopyToClipboard(KeyOfTreeNode(node, Main.settings.key_style, Main.pathSeparator));
+ }
+ );
+ keyToClipboard_path_separator.MouseUp += keyToClipboardHandler_path_separator;
// drop down menu for getting path to clipboard
var pathToClipboard = (ToolStripMenuItem)NodeRightClickMenu.Items[2];
var pathToClipboard_Javascript = pathToClipboard.DropDownItems[0];
@@ -974,12 +1003,60 @@ private void Tree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
}
);
pathToClipboard_RemesPath.MouseUp += pathToClipboardHandler_Remespath;
- switch (Main.settings.key_style)
+ var pathToClipboard_path_separator = pathToClipboard.DropDownItems[3];
+ pathToClipboard_path_separator.Text = $"Use path_separator setting ({Main.settings.path_separator})";
+ if (pathToClipboardHandler_path_separator != null)
+ {
+ try
+ {
+ pathToClipboard_path_separator.MouseUp -= pathToClipboardHandler_path_separator;
+ }
+ catch { }
+ }
+ pathToClipboardHandler_path_separator = new MouseEventHandler(
+ (s2, e2) =>
+ {
+ if (Main.pathSeparator == JNode.DEFAULT_PATH_SEPARATOR && !hasWarnedNo_path_separator)
+ {
+ MessageBox.Show($"You chose \"Path to clipboard\" with the \"Use path_separator setting\" option, but your path_separator is still the default {Main.settings.path_separator}. The {Main.settings.key_style} style is being used instead.",
+ "path_separator setting not configured",
+ MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ hasWarnedNo_path_separator = true;
+ }
+ Npp.TryCopyToClipboard(PathToTreeNode(node, Main.settings.key_style, Main.pathSeparator));
+ }
+ );
+ pathToClipboard_path_separator.MouseUp += pathToClipboardHandler_path_separator;
+ // shortcut to whatever the current settings say if user clicks on the parent item
+ if (pathToClipboardHandler != null)
+ pathToClipboard.MouseUp -= pathToClipboardHandler;
+ if (keyToClipboardHandler != null)
+ keyToClipboard.MouseUp -= keyToClipboardHandler;
+ if (Main.pathSeparator == JNode.DEFAULT_PATH_SEPARATOR)
+ {
+ switch (Main.settings.key_style)
+ {
+ case KeyStyle.RemesPath:
+ pathToClipboardHandler = pathToClipboardHandler_Remespath;
+ keyToClipboardHandler = keyToClipboardHandler_Remespath;
+ break;
+ case KeyStyle.Python:
+ pathToClipboardHandler = pathToClipboardHandler_Python;
+ keyToClipboardHandler = keyToClipboardHandler_Python;
+ break;
+ case KeyStyle.JavaScript:
+ pathToClipboardHandler = pathToClipboardHandler_Javascript;
+ keyToClipboardHandler = keyToClipboardHandler_Javascript;
+ break;
+ }
+ }
+ else
{
- case (KeyStyle.RemesPath): pathToClipboard.MouseUp += pathToClipboardHandler_Remespath; break;
- case (KeyStyle.Python): pathToClipboard.MouseUp += pathToClipboardHandler_Python; break;
- case (KeyStyle.JavaScript): pathToClipboard.MouseUp += pathToClipboardHandler_Javascript; break;
+ pathToClipboardHandler = pathToClipboardHandler_path_separator;
+ keyToClipboardHandler = keyToClipboardHandler_path_separator;
}
+ pathToClipboard.MouseUp += pathToClipboardHandler;
+ keyToClipboard.MouseUp += keyToClipboardHandler;
NodeRightClickMenu.Items[3].MouseUp -= ToggleSubtreesHandler;
JNode nodeJson = pathsToJNodes[node.FullPath];
ToggleSubtreesHandler = new MouseEventHandler(
@@ -1056,7 +1133,7 @@ private void Tree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
///
///
///
- public string PathToTreeNode(TreeNode node, KeyStyle style = KeyStyle.Python, List path = null)
+ public string PathToTreeNode(TreeNode node, KeyStyle style = KeyStyle.Python, char separator = JNode.DEFAULT_PATH_SEPARATOR, List path = null)
{
if (path == null)
path = new List();
@@ -1067,17 +1144,14 @@ public string PathToTreeNode(TreeNode node, KeyStyle style = KeyStyle.Python, Li
path.Reverse(); // cuz they were added from the node to the root
return string.Join("", path);
}
- path.Add(KeyOfTreeNode(node, style));
- return PathToTreeNode(node.Parent, style, path);
+ path.Add(KeyOfTreeNode(node, style, separator));
+ return PathToTreeNode(node.Parent, style, separator, path);
}
///
- /// See JNode.FormatKey, but uses the key of a TreeNode
+ /// See , but uses the key of a TreeNode as the first argument, and separator as the third argument.
///
- ///
- ///
- ///
- public string KeyOfTreeNode(TreeNode node, KeyStyle style)
+ public string KeyOfTreeNode(TreeNode node, KeyStyle style, char separator = JNode.DEFAULT_PATH_SEPARATOR)
{
if (node.Name == "" // TreeNodes representing array members have no name
// but we need to be careful because an object could have the empty string as a key
@@ -1088,9 +1162,18 @@ public string KeyOfTreeNode(TreeNode node, KeyStyle style)
// one treenode for every i^th JNode in the JArray.
string[] parts = node.Text.Split(' ', ':');
int idx = int.Parse(parts[0]);
- return $"[{idx}]";
+ return JNode.FormatIndex(idx, separator);
+ }
+ try
+ {
+ return JNode.FormatKey(node.Name, style, separator);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"While attempting to format key {node.Name} using style, the following error occurred:\r\n{ex}",
+ "Error while validating JSON against schema", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return "";
}
- return JNode.FormatKey(node.Name, style);
}
///
diff --git a/JsonToolsNppPlugin/Forms/TreeViewer.resx b/JsonToolsNppPlugin/Forms/TreeViewer.resx
index b0cc4e7..d00950f 100644
--- a/JsonToolsNppPlugin/Forms/TreeViewer.resx
+++ b/JsonToolsNppPlugin/Forms/TreeViewer.resx
@@ -125,7 +125,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACw
- DgAAAk1TRnQBSQFMAgEBDwEAAcgBAQHIAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+ DgAAAk1TRnQBSQFMAgEBDwEAAdABAQHQAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAAUADAAEBAQABCAYAARAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@@ -157,9 +157,9 @@
AVcBFAFKAVcBShUUEAAUFAFQAXgBUAEUARIBVwF4ARMUFBAAAhQBbgN0ARIDdAEUAW4BdAESBhQBeAFX
AxQBEgF4ARIUFBAAAhQB6gFzAZoBbgESAZoCbgEUAXQBcwGaBhQBeAFXAxQBEgF4ARIGFAESAesB6gET
AeoBEgFtARIBFAESAesB6gIUEAADFAESAZoCFAGUAXMEFAGaAeoFFAF4AVcDFAETAXgBUAYUAf8B7QH/
- AfgB7wH0AfcB/wEUAf8BkgHyAhQQAAMUARIBmgMUAZoDFAFuAZoFFAFXAXgBSgQUAVABeAFQBRQB/wHs
- AbwB+AHvAQcBFAH/AeoB/wQUEAADFAESAZoDFAJ0ARQBdAGaAXQFFAFQAXgBUAQUAlcBSgUUAeoB7wHz
- AfgB7wEHARQB/wHqAf8EFBAAAhQBEwESAZoEFAGaAxQBmgYUAXgBVwMUARIBeAESBhQBBwETAfMB+AHv
+ AewB7wH0AfcB/wEUAf8BkgHyAhQQAAMUARIBmgMUAZoDFAFuAZoFFAFXAXgBSgQUAVABeAFQBRQB/wHs
+ AbwB7AHvAQcBFAH/AeoB/wQUEAADFAESAZoDFAJ0ARQBdAGaAXQFFAFQAXgBUAQUAlcBSgUUAeoB7wHz
+ AewB7wEHARQB/wHqAf8EFBAAAhQBEwESAZoEFAGaAxQBmgYUAXgBVwMUARIBeAESBhQBBwETAfMB7AHv
Af8B6gH/ARQB/wHqAe8CFBAAAhQBcwF0AZoBFAESARMBbgGaARQBbQEUAZoGFAF4AVcDFAESAXgBEgYU
AW0B8gHwARQB7wEHAfIB7QEUAW0B8gH3AhQQAAMUAXQBmgIUApoBbgEUAXQBmgF1BhQBVwF4AxQBSgF4
ARIKFAHvAQcIFBAAFBQBEwJ4ARMBUAF4AVcLFALvCBQQADAUEAAwFBAAMBQQAMUUAYsBsgGzARQCsgsU
diff --git a/JsonToolsNppPlugin/JSONTools/JNode.cs b/JsonToolsNppPlugin/JSONTools/JNode.cs
index 0f379d8..f15b876 100644
--- a/JsonToolsNppPlugin/JSONTools/JNode.cs
+++ b/JsonToolsNppPlugin/JSONTools/JNode.cs
@@ -825,7 +825,7 @@ public bool ParentHierarchyHelper(JNode root, JNode current, List