def run(self, window): """Run command.""" if window is None: return self.window = window view = self.window.active_view() self.view = view if not self.init(): return self.get_highlights() # Show inspector panel if self.inspector_enabled: reset = False if self.total_bytes == 1 else True self.window.run_command( 'hex_inspector', {'first_byte': self.first_all, 'reset': reset, 'bytes_wide': self.bytes_wide} ) # Highlight selected regions if self.highlight_style == sublime.DRAW_EMPTY_AS_OVERWRITE: self.selected_bytes = common.underline(self.selected_bytes) view.add_regions( "hex_view", self.selected_bytes, self.highlight_scope, self.highlight_icon, self.highlight_style ) # Display selected byte addresses and total bytes selected self.display_address() self.display_total_bytes()
def run(self, window): """Run command.""" if window is None: return self.window = window view = self.window.active_view() self.view = view if not self.init(): return self.get_highlights() # Show inspector panel if self.inspector_enabled: reset = False if self.total_bytes == 1 else True self.window.run_command( 'hex_inspector', { 'first_byte': self.first_all, 'reset': reset, 'bytes_wide': self.bytes_wide }) # Highlight selected regions if self.highlight_style == sublime.DRAW_EMPTY_AS_OVERWRITE: self.selected_bytes = common.underline(self.selected_bytes) view.add_regions("hex_view", self.selected_bytes, self.highlight_scope, self.highlight_icon, self.highlight_style) # Display selected byte addresses and total bytes selected self.display_address() self.display_total_bytes()
def apply_edit(self, value): """Apply edits.""" edits = "" self.view = self.window.active_view() # Is this the same view as earlier? if self.handshake != -1 and self.handshake == self.view.id(): total_chars = self.total_bytes * 2 selection = self.line["selection"].replace(" ", "") # Transform string if provided if re.match("^s\:", value) is not None: edits = hexlify( value[2:len(value)].encode("ascii")).decode("ascii") else: edits = value.replace(" ", "").lower() # See if change occured and if changes are valid if len(edits) != total_chars: self.edit_panel(value, "Unexpected # of bytes!") return elif re.match("[\da-f]{" + str(total_chars) + "}", edits) is None: self.edit_panel(value, "Invalid data!") return elif selection != edits: # Get previous dirty markers before modifying buffer regions = self.view.get_regions("hex_edit") # Construct old and new data for diffs edits = self.line["data1"] + edits + self.line["data2"] original = self.line["data1"] + selection + self.line["data2"] # Initialize ascii_str = " :" start = 0 ascii_start_pos = self.ascii_pos hex_start_pos = self.line["range"].begin( ) + common.ADDRESS_OFFSET end = len(edits) count = 1 change_start = None # Reconstruct line l_buffer = self.line["address"] while start < end: byte_end = start + 2 value = edits[start:byte_end] # Diff data and mark changed bytes if value != original[start:byte_end]: if change_start is None: change_start = [hex_start_pos, ascii_start_pos] # Check if group end if count == self.group_size: regions.append( sublime.Region(change_start[0], hex_start_pos + 2)) change_start[0] = None else: # Check if after group end if change_start[0] is None: change_start[0] = hex_start_pos # Check if group end if count == self.group_size: regions.append( sublime.Region(change_start[0], hex_start_pos + 2)) change_start[0] = None elif change_start is not None: if self.view.score_selector(hex_start_pos - 1, 'raw.nibble.lower'): if change_start[0] is not None: regions.append( sublime.Region(change_start[0], hex_start_pos)) else: if change_start[0] is not None: regions.append( sublime.Region(change_start[0], hex_start_pos - 1)) regions.append( sublime.Region(change_start[1], ascii_start_pos)) change_start = None # Write bytes and add space and at group region end l_buffer += value if count == self.group_size: l_buffer += " " hex_start_pos += 1 count = 0 # Copy valid printible ascii chars over or substitute with "." dec = unpack("=B", unhexlify(value))[0] ascii_str += chr(dec) if dec in range(32, 127) else "." start += 2 count += 1 hex_start_pos += 2 ascii_start_pos += 1 # Check for end of line case for highlight if change_start is not None: if change_start[0] is not None: regions.append( sublime.Region(change_start[0], hex_start_pos)) regions.append( sublime.Region(change_start[1], ascii_start_pos)) change_start = None # Append ascii chars to line accounting for missing bytes in line delta = int(self.bytes_wide) - len(edits) / 2 group_space = int(delta / self.group_size) + ( 1 if delta % self.group_size else 0) l_buffer += " " * int(group_space + delta * 2) + ascii_str # Apply buffer edit self.view.sel().clear() self.view.set_read_only(False) HexEditGlobal.bfr = l_buffer HexEditGlobal.region = self.line["range"] self.view.run_command("hex_edit_apply") HexEditGlobal.clear() self.view.set_read_only(True) self.view.sel().add( sublime.Region(self.start_pos, self.end_pos)) # Underline if required if self.highlight_style == sublime.DRAW_EMPTY_AS_OVERWRITE: regions = common.underline(regions) # Highlight changed bytes self.view.add_regions("hex_edit", regions, self.highlight_scope, self.highlight_icon, self.highlight_style) # Update selection self.window.run_command('hex_highlighter') else: error("Hex view is no longer in focus! Edit Failed.") # Clean up self.reset()
def apply_edit(self, value): """Apply edits.""" edits = "" self.view = self.window.active_view() # Is this the same view as earlier? if self.handshake != -1 and self.handshake == self.view.id(): total_chars = self.total_bytes * 2 selection = self.line["selection"].replace(" ", "") # Transform string if provided if re.match("^s\:", value) is not None: edits = hexlify(value[2:len(value)].encode("ascii")).decode("ascii") else: edits = value.replace(" ", "").lower() # See if change occured and if changes are valid if len(edits) != total_chars: self.edit_panel(value, "Unexpected # of bytes!") return elif re.match("[\da-f]{" + str(total_chars) + "}", edits) is None: self.edit_panel(value, "Invalid data!") return elif selection != edits: # Get previous dirty markers before modifying buffer regions = self.view.get_regions("hex_edit") # Construct old and new data for diffs edits = self.line["data1"] + edits + self.line["data2"] original = self.line["data1"] + selection + self.line["data2"] # Initialize ascii_str = " :" start = 0 ascii_start_pos = self.ascii_pos hex_start_pos = self.line["range"].begin() + common.ADDRESS_OFFSET end = len(edits) count = 1 change_start = None # Reconstruct line l_buffer = self.line["address"] while start < end: byte_end = start + 2 value = edits[start:byte_end] # Diff data and mark changed bytes if value != original[start:byte_end]: if change_start is None: change_start = [hex_start_pos, ascii_start_pos] # Check if group end if count == self.group_size: regions.append(sublime.Region(change_start[0], hex_start_pos + 2)) change_start[0] = None else: # Check if after group end if change_start[0] is None: change_start[0] = hex_start_pos # Check if group end if count == self.group_size: regions.append(sublime.Region(change_start[0], hex_start_pos + 2)) change_start[0] = None elif change_start is not None: if self.view.score_selector(hex_start_pos - 1, 'raw.nibble.lower'): if change_start[0] is not None: regions.append(sublime.Region(change_start[0], hex_start_pos)) else: if change_start[0] is not None: regions.append(sublime.Region(change_start[0], hex_start_pos - 1)) regions.append(sublime.Region(change_start[1], ascii_start_pos)) change_start = None # Write bytes and add space and at group region end l_buffer += value if count == self.group_size: l_buffer += " " hex_start_pos += 1 count = 0 # Copy valid printible ascii chars over or substitute with "." dec = unpack("=B", unhexlify(value))[0] ascii_str += chr(dec) if dec in range(32, 127) else "." start += 2 count += 1 hex_start_pos += 2 ascii_start_pos += 1 # Check for end of line case for highlight if change_start is not None: if change_start[0] is not None: regions.append(sublime.Region(change_start[0], hex_start_pos)) regions.append(sublime.Region(change_start[1], ascii_start_pos)) change_start = None # Append ascii chars to line accounting for missing bytes in line delta = int(self.bytes_wide) - len(edits) / 2 group_space = int(delta / self.group_size) + (1 if delta % self.group_size else 0) l_buffer += " " * int(group_space + delta * 2) + ascii_str # Apply buffer edit self.view.sel().clear() self.view.set_read_only(False) HexEditGlobal.bfr = l_buffer HexEditGlobal.region = self.line["range"] self.view.run_command("hex_edit_apply") HexEditGlobal.clear() self.view.set_read_only(True) self.view.sel().add(sublime.Region(self.start_pos, self.end_pos)) # Underline if required if self.highlight_style == sublime.DRAW_EMPTY_AS_OVERWRITE: regions = common.underline(regions) # Highlight changed bytes self.view.add_regions( "hex_edit", regions, self.highlight_scope, self.highlight_icon, self.highlight_style ) # Update selection self.window.run_command('hex_highlighter') else: error("Hex view is no longer in focus! Edit Failed.") # Clean up self.reset()