| 
          import json | 
        
        
           | 
          import os | 
        
        
           | 
          import time | 
        
        
           | 
          import webbrowser | 
        
        
           | 
          import sys | 
        
        
           | 
          import re | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def handleWindows(extra_seconds): | 
        
        
           | 
              print("OS : Windows") | 
        
        
           | 
              local_settings = r"{}\Balsamiq\Balsamiq Wireframes\LocalSettings.json".format(os.getenv('APPDATA')) | 
        
        
           | 
              print("Reading from {}".format(local_settings)) | 
        
        
           | 
              with open(local_settings) as reader: | 
        
        
           | 
                  json_data = json.load(reader) | 
        
        
           | 
              json_data['DefaultSelectionColorRGBA'] = int(time.time()) + extra_seconds | 
        
        
           | 
              print("Writing to {}".format(local_settings)) | 
        
        
           | 
              with open(local_settings, 'w') as outfile: | 
        
        
           | 
                  json.dump(json_data, outfile) | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          def handleMacos(trial_days_left=30, debug_mode=False): | 
        
        
           | 
              print("OS : macOS") | 
        
        
           | 
              print("Debug Mode: " + str(debug_mode)) | 
        
        
           | 
          
 | 
        
        
           | 
              def dump_debug(start_func, end_func, content_func, new_func): | 
        
        
           | 
                  print("function start line: {}".format(start_func)) | 
        
        
           | 
                  print("function end line: {}".format(end_func)) | 
        
        
           | 
                  print("function content:") | 
        
        
           | 
                  print(content_func) | 
        
        
           | 
                  print("new function content:") | 
        
        
           | 
                  print(new_func) | 
        
        
           | 
          
 | 
        
        
           | 
              editor_macos = "/Applications/Balsamiq Wireframes.app/Contents/Resources/editor-macos.js" | 
        
        
           | 
              editor_macos_test = r"C:\Users\housi\Desktop\Balsamiq\editor-macos-test.js" | 
        
        
           | 
              if debug_mode: | 
        
        
           | 
                  editor_macos = editor_macos_test | 
        
        
           | 
              print(editor_macos) | 
        
        
           | 
              if not os.path.exists(editor_macos): | 
        
        
           | 
                  print("editor-macos.js NOT FOUND!") | 
        
        
           | 
                  exit(0) | 
        
        
           | 
              get_trial_days_left_pattern = re.compile(r"\s*function\s+getTrialDaysLeftFromNativeData\(\w+\)\s*{") | 
        
        
           | 
              func_start_line = -1 | 
        
        
           | 
              func_end_line = -1 | 
        
        
           | 
              found_a_match = False | 
        
        
           | 
              function_content = "" | 
        
        
           | 
              with open(editor_macos, encoding="utf8") as reader: | 
        
        
           | 
                  line_number = 0 | 
        
        
           | 
                  # it starts at 1 because w have already matched one '{' | 
        
        
           | 
                  curly_braces_balance = 1 | 
        
        
           | 
                  for line in reader.readlines(): | 
        
        
           | 
                      line_number += 1 | 
        
        
           | 
                      if not found_a_match: | 
        
        
           | 
                          match = get_trial_days_left_pattern.match(line) | 
        
        
           | 
                          if match is not None: | 
        
        
           | 
                              found_a_match = True | 
        
        
           | 
                              func_start_line = line_number | 
        
        
           | 
                              # TODO what if the start line is also the end line, One-Liner function | 
        
        
           | 
          
 | 
        
        
           | 
                      else: | 
        
        
           | 
                          curly_braces_balance += line.count("{") | 
        
        
           | 
                          curly_braces_balance -= line.count("}") | 
        
        
           | 
                          if curly_braces_balance == 0: | 
        
        
           | 
                              function_content = function_content + line | 
        
        
           | 
                              func_end_line = line_number | 
        
        
           | 
                              break | 
        
        
           | 
                      if func_start_line != -1: | 
        
        
           | 
                          function_content = function_content + line | 
        
        
           | 
          
 | 
        
        
           | 
              body = "return {};".format(trial_days_left) | 
        
        
           | 
              new_function_signature = "\nfunction getTrialDaysLeftFromNativeData(nativeData) {\n\t" + body + "\n}\n\n" | 
        
        
           | 
          
 | 
        
        
           | 
              if debug_mode: | 
        
        
           | 
                  dump_debug(func_start_line, func_end_line, function_content, new_function_signature) | 
        
        
           | 
          
 | 
        
        
           | 
              with open(editor_macos, encoding="utf8") as reader: | 
        
        
           | 
                  lines = reader.readlines() | 
        
        
           | 
          
 | 
        
        
           | 
              # The first -1 to make it base 0 and the second one refers to the previous index | 
        
        
           | 
              index = (func_start_line - 1) - 1 | 
        
        
           | 
              leading_count = 0 | 
        
        
           | 
              # Removing leading blank lines before the function definition | 
        
        
           | 
              while not lines[index].strip(): | 
        
        
           | 
                  lines.pop(index) | 
        
        
           | 
                  index -= 1 | 
        
        
           | 
                  leading_count += 1 | 
        
        
           | 
          
 | 
        
        
           | 
              # The start and end indexes will change after removing the leading blank lines | 
        
        
           | 
              func_start_line -= leading_count | 
        
        
           | 
              func_end_line -= leading_count | 
        
        
           | 
          
 | 
        
        
           | 
              # Removing trailing blank lines after the function end | 
        
        
           | 
              index = func_end_line | 
        
        
           | 
              while not lines[index].strip(): | 
        
        
           | 
                  lines.pop(index) | 
        
        
           | 
          
 | 
        
        
           | 
              # Removing the old function | 
        
        
           | 
              for i in range(func_end_line - func_start_line + 1): | 
        
        
           | 
                  lines.pop(func_start_line - 1) | 
        
        
           | 
          
 | 
        
        
           | 
              # Replacing it with the new function | 
        
        
           | 
              lines.insert(func_start_line - 1, new_function_signature) | 
        
        
           | 
          
 | 
        
        
           | 
              # Writing changes back to file | 
        
        
           | 
              with open(editor_macos, "w", encoding="utf8") as f: | 
        
        
           | 
                  lines = "".join(lines) | 
        
        
           | 
                  f.write(lines) | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          print("IMPORTANT! please make sure to close Balsamiq before proceeding or the script won't have any effect") | 
        
        
           | 
          years = int(input("How many years of trial do you want :) ")) | 
        
        
           | 
          
 | 
        
        
           | 
          if sys.platform.startswith("win"): | 
        
        
           | 
              handleWindows(years * 365 * 24 * 60 * 60) | 
        
        
           | 
          elif sys.platform.startswith("darwin"): | 
        
        
           | 
              handleMacos(years * 365) | 
        
        
           | 
          else: | 
        
        
           | 
              print("Sorry, operating system not supported") | 
        
        
           | 
              exit(0) | 
        
        
           | 
          
 | 
        
        
           | 
          print("****************************************************************") | 
        
        
           | 
          print("* Congratulations! You gained {} days of trial".format(years * 365)) | 
        
        
           | 
          print("* Please don't forget to leave a star ✭") | 
        
        
           | 
          print("****************************************************************") | 
        
        
           | 
          print("https://gist.github.com/HoussemNasri/c09e55e0e5f451aa10f8621a6680ba28") | 
        
        
           | 
          webbrowser.open("https://gist.github.com/HoussemNasri/c09e55e0e5f451aa10f8621a6680ba28") | 
        
        
           | 
          input("Press ENTER to exit") | 
        
  
Godlike - Thanks!