|
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") |
Lifetime trial.