implement: JSNO Lines formatting

This commit is contained in:
TheSecEng 2020-04-19 14:14:04 -04:00
parent 2c80b93b76
commit cab4d367fb
No known key found for this signature in database
GPG Key ID: A7C3BA459E8C5C4E
2 changed files with 61 additions and 4 deletions

View File

@ -7,6 +7,10 @@
"caption": "Pretty JSON: Format and Sort JSON", "caption": "Pretty JSON: Format and Sort JSON",
"command": "pretty_json_and_sort" "command": "pretty_json_and_sort"
}, },
{
"caption": "Pretty JSON: Format JSON Lines",
"command": "pretty_json_lines"
},
{ {
"caption": "Pretty JSON: Minify (compress) JSON", "caption": "Pretty JSON: Minify (compress) JSON",
"command": "un_pretty_json" "command": "un_pretty_json"

View File

@ -24,6 +24,7 @@ except ValueError:
from simplejson import OrderedDict from simplejson import OrderedDict
SUBLIME_MAJOR_VERSION = int(sublime.version()) / 1000 SUBLIME_MAJOR_VERSION = int(sublime.version()) / 1000
s = sublime.load_settings("Pretty JSON.sublime-settings")
jq_exits = False jq_exits = False
jq_init = False jq_init = False
@ -59,9 +60,6 @@ def check_jq():
jq_exits = False jq_exits = False
s = sublime.load_settings("Pretty JSON.sublime-settings")
class PrettyJsonBaseCommand: class PrettyJsonBaseCommand:
json_error_matcher = re.compile(r"line (\d+)") json_error_matcher = re.compile(r"line (\d+)")
force_sorting = False force_sorting = False
@ -200,7 +198,7 @@ class PrettyJsonValidate(PrettyJsonBaseCommand, sublime_plugin.TextCommand):
try: try:
decoder = json.JSONDecoder(object_pairs_hook=self.duplicate_key_hook) decoder = json.JSONDecoder(object_pairs_hook=self.duplicate_key_hook)
decoder.decode(self.view.substr(selection)) decoder.decode(self.view.substr(selection))
except Exception as ex: except Exception:
self.show_exception() self.show_exception()
sublime.message_dialog("Invalid JSON") sublime.message_dialog("Invalid JSON")
return return
@ -275,6 +273,61 @@ class PrettyJsonAndSortCommand(PrettyJsonCommand, sublime_plugin.TextCommand):
PrettyJsonBaseCommand.force_sorting = False PrettyJsonBaseCommand.force_sorting = False
class PrettyJsonLinesCommand(PrettyJsonCommand, sublime_plugin.TextCommand):
"""
Description: Pretty print json lines https://jsonlines.org
"""
def run(self, edit):
self.view.erase_regions("json_errors")
regions = self.view.sel()
for region in regions:
selected_entire_file = False
if region.empty() and len(regions) > 1:
continue
elif region.empty() and s.get("use_entire_file_if_no_selection", True):
selection = sublime.Region(0, self.view.size())
selected_entire_file = True
else:
selection = region
for jsonl in sorted(self.view.split_by_newlines(selection), reverse=True):
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.change_syntax()
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.change_syntax()
else:
self.show_exception()
except:
self.show_exception()
class UnPrettyJsonCommand(PrettyJsonBaseCommand, sublime_plugin.TextCommand): class UnPrettyJsonCommand(PrettyJsonBaseCommand, sublime_plugin.TextCommand):
""" Compress/minify JSON - it makes json as one-liner """ """ Compress/minify JSON - it makes json as one-liner """