diff --git a/Default (Linux).sublime-keymap b/Default (Linux).sublime-keymap
index 4ce5b0d..e655c91 100644
--- a/Default (Linux).sublime-keymap
+++ b/Default (Linux).sublime-keymap
@@ -1,15 +1,15 @@
[
- {
- "keys": [
- "ctrl+alt+j"
- ],
- "command": "pretty_json"
- },
- {
- "keys": ["ctrl+r"],
- "command": "pretty_json_goto_symbol",
- "context": [
- { "key": "selector", "operator": "equal", "operand": "source.json" }
- ]
- }
+ // {
+ // "keys": [
+ // "ctrl+alt+j"
+ // ],
+ // "command": "pretty_json"
+ // },
+ // {
+ // "keys": ["ctrl+r"],
+ // "command": "pretty_json_goto_symbol",
+ // "context": [
+ // { "key": "selector", "operator": "equal", "operand": "source.json" }
+ // ]
+ // }
]
\ No newline at end of file
diff --git a/Default (OSX).sublime-keymap b/Default (OSX).sublime-keymap
index e7ce965..e634c12 100644
--- a/Default (OSX).sublime-keymap
+++ b/Default (OSX).sublime-keymap
@@ -1,15 +1,15 @@
[
- {
- "keys": [
- "super+ctrl+j"
- ],
- "command": "pretty_json"
- },
- {
- "keys": ["super+r"],
- "command": "pretty_json_goto_symbol",
- "context": [
- { "key": "selector", "operator": "equal", "operand": "source.json" }
- ]
- }
+ // {
+ // "keys": [
+ // "super+ctrl+j"
+ // ],
+ // "command": "pretty_json"
+ // },
+ // {
+ // "keys": ["super+r"],
+ // "command": "pretty_json_goto_symbol",
+ // "context": [
+ // { "key": "selector", "operator": "equal", "operand": "source.json" }
+ // ]
+ // }
]
\ No newline at end of file
diff --git a/Default (Windows).sublime-keymap b/Default (Windows).sublime-keymap
index a1e794b..bf57c8d 100644
--- a/Default (Windows).sublime-keymap
+++ b/Default (Windows).sublime-keymap
@@ -1,22 +1,22 @@
[
- {
- "keys": [
- "ctrl+alt+j"
- ],
- "command": "pretty_json"
- },
- {
- "keys": [
- "ctrl+alt+m"
- ],
- "command": "un_pretty_json"
- },
- {
- "keys": ["ctrl+r"],
- "command": "pretty_json_goto_symbol",
- "context": [
- { "key": "selector", "operator": "equal", "operand": "source.json" }
- ]
- }
+ // {
+ // "keys": [
+ // "ctrl+alt+j"
+ // ],
+ // "command": "pretty_json"
+ // },
+ // {
+ // "keys": [
+ // "ctrl+alt+m"
+ // ],
+ // "command": "un_pretty_json"
+ // },
+ // {
+ // "keys": ["ctrl+r"],
+ // "command": "pretty_json_goto_symbol",
+ // "context": [
+ // { "key": "selector", "operator": "equal", "operand": "source.json" }
+ // ]
+ // }
]
diff --git a/Default.sublime-commands b/Default.sublime-commands
index 774e20a..d9e9df0 100644
--- a/Default.sublime-commands
+++ b/Default.sublime-commands
@@ -26,7 +26,8 @@
{
"caption": "Preferences: Pretty JSON Settings",
"command": "edit_settings",
- "args": {
+ "args":
+ {
"base_file": "${packages}/Pretty JSON/Pretty JSON.sublime-settings",
"default": "{\n\t$0\n}\n"
}
diff --git a/Pretty JSON.sublime-settings b/Pretty JSON.sublime-settings
index 613f31a..efe77e8 100644
--- a/Pretty JSON.sublime-settings
+++ b/Pretty JSON.sublime-settings
@@ -2,7 +2,7 @@
"use_entire_file_if_no_selection": true,
"indent": 4,
"sort_keys": false,
- "ensure_ascii": true,
+ "ensure_ascii": false,
"line_separator": ",",
"value_separator": ": ",
"keep_arrays_single_line": false,
@@ -19,9 +19,9 @@
"jq_binary": "jq",
"jq_errors": false,
"as_json":[
- "Packages/JSON/JSON.sublime-syntax",
- "Packages/PackageDev/Package/Sublime Text Commands/Sublime Text Commands.sublime-syntax",
- "Packages/PackageDev/Package/Sublime Text Settings/Sublime Text Settings.sublime-syntax",
- "Packages/PackageDev/Package/Sublime Text Menu/Sublime Text Menu.sublime-syntax"
+ "Packages/JSON/JSON.sublime-syntax",
+ "Packages/PackageDev/Package/Sublime Text Commands/Sublime Text Commands.sublime-syntax",
+ "Packages/PackageDev/Package/Sublime Text Settings/Sublime Text Settings.sublime-syntax",
+ "Packages/PackageDev/Package/Sublime Text Menu/Sublime Text Menu.sublime-syntax"
]
}
\ No newline at end of file
diff --git a/PrettyJson.py b/PrettyJson.py
index cb1345d..f2703d7 100644
--- a/PrettyJson.py
+++ b/PrettyJson.py
@@ -15,10 +15,8 @@ from .lib.simplejson import OrderedDict
PREVIOUS_CONTENT = [str(), str()]
PREVIOUS_QUERY_LEN = int()
-s = sublime.load_settings('Pretty JSON.sublime-settings')
-
-xml_syntax = 'Packages/XML/XML.tmLanguage'
-json_syntax = 'Packages/JSON/JSON.tmLanguage'
+xml_syntax = "Packages/XML/XML.sublime-syntax"
+json_syntax = "Packages/JSON/JSON.sublime-syntax"
jq_exists = bool()
jq_init = bool()
@@ -27,17 +25,18 @@ jq_path = str()
def check_jq():
global jq_init, jq_exists, jq_path
+ settings = sublime.load_settings("Pretty JSON.sublime-settings")
if jq_init:
return
jq_init = True
- jq_test = s.get('jq_binary', 'jq')
+ jq_test = settings.get("jq_binary", "jq")
try:
jq_path = shutil.which(jq_test)
jq_exists = True
except OSError as ex:
- print(str(ex))
+ sublime.message_dialog(f"[Error]: {ex}")
jq_exists = False
@@ -45,32 +44,34 @@ class PrettyJsonBaseCommand:
phantom_set = sublime.PhantomSet
phantoms = list()
force_sorting = False
- json_char_matcher = re.compile(r'char (\d+)')
+ json_char_matcher = re.compile(r"char (\d+)")
brace_newline = re.compile(r'^((\s*)".*?":)\s*([{])', re.MULTILINE)
bracket_newline = re.compile(r'^((\s*)".*?":)\s*([\[])', re.MULTILINE)
@staticmethod
- def json_loads(selection: str, object_pairs_hook=OrderedDict) -> dict:
+ def json_loads(selection: str, object_pairs_hook=OrderedDict):
return json.loads(
selection, object_pairs_hook=object_pairs_hook, parse_float=decimal.Decimal
)
@staticmethod
- def json_dumps(obj, minified: bool = False) -> str:
- sort_keys = s.get('sort_keys', False)
- if PrettyJsonBaseCommand.force_sorting:
+ def json_dumps(obj, minified: bool = False, force_sorting: bool = False) -> str:
+ settings = sublime.load_settings("Pretty JSON.sublime-settings")
+
+ sort_keys = settings.get("sort_keys", False)
+ if force_sorting:
sort_keys = True
- line_separator = s.get('line_separator', ',')
- value_separator = s.get('value_separator', ': ')
+ line_separator = settings.get("line_separator", ",")
+ value_separator = settings.get("value_separator", ": ")
if minified:
line_separator = line_separator.strip()
value_separator = value_separator.strip()
output_json = json.dumps(
obj,
- indent=None if minified else s.get('indent', 2),
- ensure_ascii=s.get('ensure_ascii', False),
+ indent=None if minified else settings.get("indent", 2),
+ ensure_ascii=settings.get("ensure_ascii", False),
sort_keys=sort_keys,
separators=(line_separator, value_separator),
use_decimal=True,
@@ -78,67 +79,90 @@ class PrettyJsonBaseCommand:
if minified:
return output_json
- if s.get('keep_arrays_single_line', False):
- matches = re.findall(r'(\[[^\[\]]+?\])', output_json)
+ if settings.get("keep_arrays_single_line", False):
+ matches = re.findall(r"(\[[^\[\]]+?\])", output_json)
matches.sort(key=len, reverse=True)
join_separator = line_separator.ljust(2)
for m in matches:
- content = m[1:-1]
- items = [a.strip() for a in content.split(line_separator.strip())]
+ content = m[1:-1].strip()
+ items = [a.strip() for a in content.split(os.linesep)]
+ items = [item[:-1] if item[-1] == "," else item for item in items]
+ replacement = "["
+ for index, item in enumerate(items):
+ if item in ('{', '}'):
+ replacement = replacement + item
+ if item == '}':
+ if index!= len(items)-1:
+ replacement = replacement + ','
+ else:
+ replacement = replacement + item
+ if index != len(items)-1:
+ if items[items.index(item)+1] != '}':
+ replacement = replacement + ','
+ replacement = replacement + ']'
- replacement = f'[{join_separator.join(items)}]'
- if len(replacement) <= s.get('max_arrays_line_length', 120):
+ if len(replacement) <= settings.get("max_arrays_line_length", 120):
output_json = output_json.replace(m, replacement, 1)
- elif s.get("bracket_newline", True):
- output_json = PrettyJsonBaseCommand.bracket_newline.sub(r'\1\n\2\3', output_json)
- if s.get("brace_newline", True):
- output_json = PrettyJsonBaseCommand.brace_newline.sub(r'\1\n\2\3', output_json)
+ elif settings.get("bracket_newline", True):
+ output_json = PrettyJsonBaseCommand.bracket_newline.sub(
+ r"\1\n\2\3", output_json
+ )
+
+ if settings.get("brace_newline", True):
+ output_json = PrettyJsonBaseCommand.brace_newline.sub(
+ r"\1\n\2\3", output_json
+ )
return output_json
@staticmethod
def get_selection_from_region(
region: sublime.Region, regions_length: int, view: sublime.View
- ) -> sublime.Region:
+ ):
+ settings = sublime.load_settings("Pretty JSON.sublime-settings")
entire_file = False
if region.empty() and regions_length > 1:
return None, None
- elif region.empty() and s.get("use_entire_file_if_no_selection", True):
+ elif region.empty() and settings.get("use_entire_file_if_no_selection", True):
region = sublime.Region(0, view.size())
entire_file = True
return region, entire_file
- def reindent(self, text: str, selection: str):
+ def reindent(self, text: str, selection: sublime.Region):
+ settings = sublime.load_settings("Pretty JSON.sublime-settings")
current_line = self.view.line(selection.begin())
text_before_sel = sublime.Region(current_line.begin(), selection.begin())
+ indent_space = ""
- reindent_mode = s.get('reindent_block', False)
- if reindent_mode == 'start':
+ reindent_mode = settings.get("reindent_block", False)
+ if reindent_mode == "start":
space_number = text_before_sel.size()
- indent_space = ' ' * space_number
- elif reindent_mode == 'minimal':
- indent_space = re.search(r'^\s*', self.view.substr(text_before_sel)).group(0)
+ indent_space = " " * space_number
+ elif reindent_mode == "minimal":
+ indent_space = re.search(r"^\s*", self.view.substr(text_before_sel)).group(
+ 0
+ )
- lines = text.split('\n')
+ lines = text.split("\n")
i = 1
while i < len(lines):
- lines[i] = f'{indent_space}{lines[i]}'
+ lines[i] = f"{indent_space}{lines[i]}"
i += 1
- return '\n'.join(lines)
+ return "\n".join(lines)
def show_exception(self, region: sublime.Region = None, msg=str()):
- sublime.message_dialog(f'[Error]: {msg}')
+ sublime.message_dialog(f"[Error]: {msg}")
if region is None:
- sublime.message_dialog(f'[Error]: {msg}')
+ sublime.message_dialog(f"[Error]: {msg}")
return
- self.highlight_error(region=region, message=f'{msg}')
+ self.highlight_error(region=region, message=f"{msg}")
def highlight_error(self, region: sublime.Region, message: str):
- self.phantom_set = sublime.PhantomSet(self.view, 'json_errors')
+ self.phantom_set = sublime.PhantomSet(self.view, "json_errors")
char_match = self.json_char_matcher.search(message)
if char_match:
@@ -152,21 +176,21 @@ class PrettyJsonBaseCommand:
self.phantoms.append(
sublime.Phantom(
region,
- self.create_phantom_html(message, 'error'),
+ self.create_phantom_html(message, "error"),
sublime.LAYOUT_BELOW,
self.navigation,
)
)
self.phantom_set.update(self.phantoms)
self.view.show(region)
- self.view.set_status('json_errors', message)
+ self.view.set_status("json_errors", message)
- # Description: Taken from
+ # Description: Taken from
# - https://github.com/sublimelsp/LSP/blob/master/plugin/diagnostics.py
# - Thanks to the LSP Team
def create_phantom_html(self, content: str, severity: str) -> str:
- stylesheet = sublime.load_resource('Packages/Pretty JSON/phantom.css')
- return f'''
+ stylesheet = sublime.load_resource("Packages/Pretty JSON/phantom.css")
+ return f"""
@@ -175,21 +199,24 @@ class PrettyJsonBaseCommand:
{content}
- '''
+ """
def navigation(self, href: str):
self.clear_phantoms()
def clear_phantoms(self):
if isinstance(self.phantom_set, type):
- self.phantom_set = sublime.PhantomSet(self.view, 'json_errors')
+ self.phantom_set = sublime.PhantomSet(self.view, "json_errors")
self.phantoms = list()
self.phantom_set.update(self.phantoms)
def syntax_to_json(self):
- syntax = os.path.splitext(os.path.basename(self.view.settings().get('syntax')))[0]
- as_json = [i.lower() for i in s.get('as_json', ['JSON'])]
+ settings = sublime.load_settings("Pretty JSON.sublime-settings")
+ syntax = os.path.splitext(os.path.basename(self.view.settings().get("syntax")))[
+ 0
+ ]
+ as_json = [i.lower() for i in settings.get("as_json", ["JSON"])]
if syntax.lower() not in as_json:
self.view.set_syntax_file(json_syntax)
@@ -200,9 +227,8 @@ class PrettyJsonValidate(PrettyJsonBaseCommand, sublime_plugin.TextCommand):
regions = self.view.sel()
for region in regions:
region, _ = self.get_selection_from_region(
- region=region,
- regions_length=len(region),
- view=self.view)
+ region=region, regions_length=len(region), view=self.view
+ )
if region is None:
continue
@@ -224,39 +250,37 @@ class PrettyJsonValidate(PrettyJsonBaseCommand, sublime_plugin.TextCommand):
class PrettyJsonCommand(PrettyJsonBaseCommand, sublime_plugin.TextCommand):
- '''
+ """
Description: Pretty Print JSON
- '''
+ """
def run(self, edit):
+ settings = sublime.load_settings("Pretty JSON.sublime-settings")
+
self.clear_phantoms()
+ pos = self.view.viewport_position()
regions = self.view.sel()
for region in regions:
region, entire_file = self.get_selection_from_region(
- region=region,
- regions_length=len(region),
- view=self.view)
+ region=region, regions_length=len(region), view=self.view
+ )
if region is None:
continue
+ selection_text = self.view.substr(region)
try:
- selection_text = self.view.substr(region)
obj = self.json_loads(selection_text)
-
- json_text = self.json_dumps(obj=obj, minified=False)
- if not entire_file and s.get('reindent_block', False):
+ json_text = self.json_dumps(obj=obj, minified=False, force_sorting=self.force_sorting)
+ if not entire_file and settings.get("reindent_block", False):
json_text = self.reindent(json_text, region)
self.view.replace(edit, region, json_text)
-
if entire_file:
self.syntax_to_json()
except Exception as ex:
try:
- count_single_quotes = re.findall(
- r"(\'[^\']+\'?)", selection_text
- )
+ count_single_quotes = re.findall(r"(\'[^\']+\'?)", selection_text)
amount_of_double_quotes = re.findall(
r"(\"[^\"]+\"?)", selection_text
)
@@ -268,10 +292,13 @@ class PrettyJsonCommand(PrettyJsonBaseCommand, sublime_plugin.TextCommand):
obj = self.json_loads(modified_text)
json_text = self.json_dumps(obj=obj, minified=False)
- if not entire_file and s.get('reindent_block', False):
+ if not entire_file and settings.get("reindent_block", False):
json_text = self.reindent(json_text, region)
+ pos = self.view.viewport_position()
self.view.replace(edit, region, json_text)
+ self.view.set_viewport_position(pos)
+
if entire_file:
self.syntax_to_json()
else:
@@ -280,10 +307,65 @@ class PrettyJsonCommand(PrettyJsonBaseCommand, sublime_plugin.TextCommand):
self.show_exception(region=region, msg=ex)
+class PrettyJsonLinesCommand(PrettyJsonCommand, sublime_plugin.TextCommand):
+
+ """
+ Description: Pretty print json lines https://jsonlines.org
+ """
+
+ def run(self, edit):
+ self.clear_phantoms()
+ regions = self.view.sel()
+ for region in regions:
+ (selection, selected_entire_file,) = self.get_selection_from_region(
+ region=region, regions_length=len(regions), view=self.view
+ )
+ if selection is None:
+ continue
+
+ for jsonl in sorted(self.view.split_by_newlines(selection), reverse=True):
+ if self.view.substr(jsonl).strip() == "":
+ continue
+
+ if jsonl.empty() and len(jsonl) > 1:
+ continue
+
+ try:
+ selection_text = self.view.substr(jsonl)
+ obj = self.json_loads(selection_text)
+ self.view.replace(edit, jsonl, self.json_dumps(obj))
+
+ if selected_entire_file:
+ self.syntax_to_json()
+
+ except Exception:
+ try:
+ amount_of_single_quotes = re.findall(
+ r"(\'[^\']+\'?)", selection_text
+ )
+ amount_of_double_quotes = re.findall(
+ r"(\"[^\"]+\"?)", selection_text
+ )
+
+ if len(amount_of_single_quotes) >= len(amount_of_double_quotes):
+ selection_text_modified = re.sub(
+ r"(?:\'([^\']+)\'?)", r'"\1"', selection_text
+ )
+ obj = self.json_loads(selection_text_modified)
+ self.view.replace(edit, jsonl, self.json_dumps(obj))
+
+ if selected_entire_file:
+ self.syntax_to_json()
+ else:
+ self.show_exception()
+ except:
+ self.show_exception()
+
+
class PrettyJsonAndSortCommand(PrettyJsonCommand, sublime_plugin.TextCommand):
- '''
+ """
Description: Pretty print json with forced sorting
- '''
+ """
def run(self, edit):
self.force_sorting = True
@@ -292,26 +374,23 @@ class PrettyJsonAndSortCommand(PrettyJsonCommand, sublime_plugin.TextCommand):
class UnPrettyJsonCommand(PrettyJsonBaseCommand, sublime_plugin.TextCommand):
- '''
+ """
Description: Compress/minify JSON - it makes json as one-liner
- '''
+ """
def run(self, edit):
self.clear_phantoms()
regions = self.view.sel()
for region in regions:
region, entire_file = self.get_selection_from_region(
- region=region,
- regions_length=len(region),
- view=self.view)
+ region=region, regions_length=len(region), view=self.view
+ )
if region is None:
continue
try:
obj = self.json_loads(self.view.substr(region))
- self.view.replace(
- edit, region, self.json_dumps(obj=obj, minified=True)
- )
+ self.view.replace(edit, region, self.json_dumps(obj=obj, minified=True))
if entire_file:
self.syntax_to_json()
@@ -322,16 +401,17 @@ class UnPrettyJsonCommand(PrettyJsonBaseCommand, sublime_plugin.TextCommand):
class JqInsertPrettyJsonCommand(sublime_plugin.TextCommand):
def run(self, edit, string):
+ self.view.set_read_only(False)
self.view.replace(edit, sublime.Region(0, self.view.size()), string)
+ self.view.set_read_only(True)
class JqPrettyJsonCommand(sublime_plugin.TextCommand):
def run(self, edit):
- original_view = self.view
- syntax_file = original_view.settings().get("syntax")
+ syntax_file = self.view.settings().get("syntax")
- total_region = sublime.Region(0, original_view.size())
- content = original_view.substr(total_region)
+ total_region = sublime.Region(0, self.view.size())
+ content = self.view.substr(total_region)
sublime.run_command("new_window")
preview_window = sublime.active_window()
@@ -348,10 +428,12 @@ class JqPrettyJsonCommand(sublime_plugin.TextCommand):
preview_window.focus_group(1)
preview_view = preview_window.new_file()
preview_view.set_scratch(True)
+ preview_view.set_read_only(True)
preview_view.set_name("Preview")
preview_view.sel().clear()
preview_window.focus_group(0)
+
jq_view = preview_window.new_file()
jq_view.run_command("jq_insert_pretty_json", {"string": content})
jq_view.set_read_only(True)
@@ -359,7 +441,7 @@ class JqPrettyJsonCommand(sublime_plugin.TextCommand):
jq_view.sel().clear()
jq_view.set_syntax_file(syntax_file)
- preview_view.set_syntax_file(json_syntax)
+ preview_view.set_syntax_file(syntax_file)
class JqQueryPrettyJson(sublime_plugin.WindowCommand):
@@ -367,13 +449,33 @@ class JqQueryPrettyJson(sublime_plugin.WindowCommand):
Description: ./jq integration
"""
+ def is_enabled(self):
+ settings = sublime.load_settings("Pretty JSON.sublime-settings")
+
+ if not self.window:
+ return
+
+ view = self.window.active_view()
+ if not view:
+ return
+
+ as_json = settings.get("as_json", ["JSON"])
+ return any(syntax in view.settings().get("syntax", "") for syntax in as_json)
+
+ def is_visible(self):
+ return self.is_enabled()
+
def run(self):
check_jq()
if jq_exists:
preview_view = self.window.active_view()
preview_view.run_command("jq_pretty_json")
sublime.active_window().show_input_panel(
- "Enter ./jq filter expression", ".", self.done, self.send_query, None,
+ "Enter ./jq filter expression",
+ ".",
+ self.done,
+ self.send_query,
+ None,
)
else:
sublime.status_message(
@@ -381,9 +483,9 @@ class JqQueryPrettyJson(sublime_plugin.WindowCommand):
)
def get_content(self):
- """ returns content of active view or selected region """
- view = self.window.active_view_in_group(0)
- selection = str()
+ """returns content of active view or selected region"""
+ view = self.window.active_view()
+ selection = ""
regions = view.sel()
for region in regions:
if region.empty() and len(regions) > 1:
@@ -396,6 +498,7 @@ class JqQueryPrettyJson(sublime_plugin.WindowCommand):
def send_query(self, query: str):
global PREVIOUS_CONTENT, PREVIOUS_QUERY_LEN
+ settings = sublime.load_settings("Pretty JSON.sublime-settings")
try:
p = subprocess.Popen(
[jq_path, query],
@@ -405,15 +508,18 @@ class JqQueryPrettyJson(sublime_plugin.WindowCommand):
)
QUERY_LEN = len(query)
raw_json = self.get_content()
- if PREVIOUS_CONTENT[0] == "":
+
+ if not PREVIOUS_CONTENT[0]:
PREVIOUS_CONTENT[0] = raw_json
- if PREVIOUS_CONTENT[1] == "":
+
+ if not PREVIOUS_CONTENT[1]:
PREVIOUS_CONTENT[1] = raw_json
out, err = p.communicate(bytes(raw_json, "UTF-8"))
output = out.decode("UTF-8").replace(os.linesep, "\n").strip()
errors = err.decode("UTF-8").replace(os.linesep, "\n").strip()
jq_view = sublime.active_window().active_view_in_group(1)
+
if output and output != "null":
if QUERY_LEN > PREVIOUS_QUERY_LEN:
PREVIOUS_CONTENT[0] = PREVIOUS_CONTENT[1]
@@ -422,8 +528,8 @@ class JqQueryPrettyJson(sublime_plugin.WindowCommand):
PREVIOUS_CONTENT[1] = PREVIOUS_CONTENT[0]
PREVIOUS_CONTENT[0] = output
PREVIOUS_QUERY_LEN = len(query)
- elif s.get("jq_errors", False) and errors:
- output = errors
+ elif settings.get("jq_errors", False) and errors:
+ output = errors
else:
if PREVIOUS_QUERY_LEN <= QUERY_LEN:
output = PREVIOUS_CONTENT[1]
@@ -440,37 +546,38 @@ class JqQueryPrettyJson(sublime_plugin.WindowCommand):
class JsonToXml(PrettyJsonBaseCommand, sublime_plugin.TextCommand):
- '''
+ """
Description: converts Json to XML
- '''
+ """
def run(self, edit):
+ settings = sublime.load_settings("Pretty JSON.sublime-settings")
+
self.clear_phantoms()
regions = self.view.sel()
for region in regions:
region, entire_file = self.get_selection_from_region(
- region=region,
- regions_length=len(region),
- view=self.view)
+ region=region, regions_length=len(region), view=self.view
+ )
if region is None:
continue
try:
h = json.loads(self.view.substr(region))
- root = et.Element('root')
+ root = et.Element("root")
root = self.traverse(root, h)
- xml_string = '\n'
+ xml_string = "\n"
- rtn = et.tostring(root, 'utf-8')
+ rtn = et.tostring(root, "utf-8")
if type(rtn) is bytes:
- rtn = rtn.decode('utf-8')
+ rtn = rtn.decode("utf-8")
xml_string += rtn
if type(xml_string) is bytes:
- xml_string = xml_string.decode('utf-8')
+ xml_string = xml_string.decode("utf-8")
- if not entire_file and s.get('reindent_block', False):
+ if not entire_file and settings.get("reindent_block", False):
xml_string = self.reindent(xml_string, region)
self.view.replace(edit, region, xml_string)
@@ -482,18 +589,18 @@ class JsonToXml(PrettyJsonBaseCommand, sublime_plugin.TextCommand):
self.show_exception(region=region, msg=ex)
def traverse(self, element, json_dict):
- ''' recursive traverse through dict and build xml tree '''
+ """recursive traverse through dict and build xml tree"""
if type(json_dict) is dict and json_dict.keys():
for i in json_dict.keys():
e = et.Element(i)
element.append(self.traverse(e, json_dict[i]))
elif type(json_dict) is list:
- e_items = et.Element('items')
+ e_items = et.Element("items")
for i in json_dict:
- e_items.append(self.traverse(et.Element('item'), i))
+ e_items.append(self.traverse(et.Element("item"), i))
element.append(e_items)
else:
- element.set('value', str(json_dict))
+ element.set("value", str(json_dict))
return element
@@ -509,7 +616,7 @@ class PrettyJsonGotoSymbolCommand(PrettyJsonBaseCommand, sublime_plugin.TextComm
content = self.view.substr(sublime.Region(0, self.view.size()))
try:
json_data = self.json_loads(content)
- self.generate_items(json_data, '')
+ self.generate_items(json_data, "")
sublime.active_window().show_quick_panel(self.items, self.goto)
except Exception as ex:
self.show_exception(region=None, msg=ex)
@@ -517,14 +624,14 @@ class PrettyJsonGotoSymbolCommand(PrettyJsonBaseCommand, sublime_plugin.TextComm
def generate_items(self, json_data, root_key):
if isinstance(json_data, OrderedDict):
for key in json_data:
- new_key_name = f'{root_key}.{key}'
+ new_key_name = f"{root_key}.{key}"
self.items.append(f'"{new_key_name}"')
self.goto_items.append(f'"{key}"')
self.generate_items(json_data[key], new_key_name)
elif isinstance(json_data, list):
for index, item in enumerate(json_data):
if isinstance(item, str):
- self.items.append(f'{root_key}.{item}')
+ self.items.append(f"{root_key}.{item}")
self.goto_items.append(f'"{item}"')
def goto(self, pos):
@@ -540,8 +647,8 @@ class PrettyJsonGotoSymbolCommand(PrettyJsonBaseCommand, sublime_plugin.TextComm
regions = self.view.find_all(string_to_search, sublime.LITERAL)
for i, r in enumerate(regions):
line = self.view.substr(self.view.full_line(r))
- if ':' in line:
- split = line.split(':')
+ if ":" in line:
+ split = line.split(":")
val = split[1].strip()
if string_to_search in val:
del regions[i]
@@ -550,8 +657,3 @@ class PrettyJsonGotoSymbolCommand(PrettyJsonBaseCommand, sublime_plugin.TextComm
self.view.sel().clear()
self.view.sel().add(region)
self.view.show(region)
-
-
-def plugin_loaded():
- global s
- s = sublime.load_settings('Pretty JSON.sublime-settings')
diff --git a/PrettyJsonListeners.py b/PrettyJsonListeners.py
index e49851b..7311113 100644
--- a/PrettyJsonListeners.py
+++ b/PrettyJsonListeners.py
@@ -8,14 +8,11 @@ s = sublime.load_settings("Pretty JSON.sublime-settings")
class PrettyJsonLintListener(sublime_plugin.EventListener, PrettyJsonBaseCommand):
def on_post_save(self, view):
- if not s.get('validate_on_save', True):
+ if not s.get("validate_on_save", True):
return
- as_json = s.get('as_json', ['JSON'])
- if any(
- syntax in view.settings().get("syntax") for syntax in as_json
- ):
- self.view = view
+ as_json = s.get("as_json", ["JSON"])
+ if any(syntax in view.settings().get("syntax") for syntax in as_json):
self.clear_phantoms()
json_content = view.substr(sublime.Region(0, view.size()))
try:
@@ -26,11 +23,9 @@ class PrettyJsonLintListener(sublime_plugin.EventListener, PrettyJsonBaseCommand
class PrettyJsonAutoPrettyOnSaveListener(sublime_plugin.EventListener):
def on_pre_save(self, view):
- if not s.get('pretty_on_save', False):
+ if not s.get("pretty_on_save", False):
return
- as_json = s.get('as_json', ['JSON'])
- if any(
- syntax in view.settings().get('syntax') for syntax in as_json
- ):
- sublime.active_window().active_view().run_command('pretty_json')
+ as_json = s.get("as_json", ["JSON"])
+ if any(syntax in view.settings().get("syntax") for syntax in as_json):
+ view.run_command("pretty_json")
diff --git a/README.md b/README.md
index a534c84..38a854a 100644
--- a/README.md
+++ b/README.md
@@ -2,11 +2,20 @@
Prettify/Minify/Query/Goto/Validate/Lint JSON plugin for Sublime Text 3 & 4
+## Updates
+
+All keybindings have been removed in favor of the Command Palette. And to allow
+for users to configure their own specific key bindings.
+
+This also prevents key binding overrides which conflict with other packages. For
+good documentation on key bindings I recommend you review the [Offical Docs][] or
+[Community Docs][]
+
## Installation
### Package Control (Recommended)
-Install this sublime text 3/4 package via [Package Control][]
+Install this sublime text 3 / 4 package via [Package Control][]
search for package: "[**Pretty JSON**][]"
### Manual Installation
@@ -29,13 +38,7 @@ No longer supported
## Usage
To prettify JSON, make selection of json
-(or else it will try to use full view buffer) and press keys:
-
-- Linux: ctrl+alt+j
-- Windows: ctrl+alt+j
-- OS X: cmd+ctrl+j
-
-or through Command Palette Ctrl+Shift+P
+(or else it will try to use full view buffer) and through Command Palette Ctrl+Shift+P
find "Pretty JSON: Format JSON"
(you can search for part of it like 'pretty format')
@@ -69,6 +72,11 @@ you can add a setting like this to your .sublime-keymap file
{ "keys": [ "ctrl+alt+m" ], "command": "un_pretty_json" }
```
+#### List of commands that can be mapped to shortcuts
+- `pretty_json`
+- `un_pretty_json`
+- `pretty_json_goto_symbol`
+
### Convert JSON to XML
Using Command Palette Ctrl+Shift+P search for
@@ -192,3 +200,6 @@ If you YAMLing then maybe you interested in this plugin: [PrettyYAML][]
[**Pretty JSON**]: https://packagecontrol.io/packages/Pretty%20JSON
[PrettyYAML]: https://github.com/aukaost/SublimePrettyYAML
[./jq]: http://stedolan.github.io/jq/
+[Offical Docs]: https://www.sublimetext.com/docs/key_bindings.html
+[Community Docs]: https://docs.sublimetext.io/guide/customization/key_bindings.html
+