diff --git a/cli.py b/cli.py deleted file mode 100644 index b468fd9..0000000 --- a/cli.py +++ /dev/null @@ -1,15 +0,0 @@ -from server import main -import argparse - -def entry(): - parser = argparse.ArgumentParser( - prog="desmos-sync", - description="Synchronize from local file to Desmos calculator", - ) - - parser.add_argument("filename") - args = parser.parse_args() - main(args.filename) - -if __name__ == "__main__": - entry() \ No newline at end of file diff --git a/computer-spec/computer.md b/computer-spec/computer.md index 766ee6d..d2f70fe 100644 --- a/computer-spec/computer.md +++ b/computer-spec/computer.md @@ -11,6 +11,8 @@ INSTRUCTIONS ------------ STO ( value, address ) -> store a value into an address +MOV ( fromaddr, toaddr) -> move a value from one address to another +PSTO ( value, ptr ) -> store value into the address referenced in ptr ADD ( addra, addrb, toaddr ) -> add a value from two addresses to a third address SUB ( addra, addrb, toaddr ) -> subtract a value from two addresses to a third address MUL ( addra, addrb, toaddr ) -> multiply a value from two addresses to a third address diff --git a/data/computer.desmos b/data/computer.desmos index 8368867..ceba8ca 100644 --- a/data/computer.desmos +++ b/data/computer.desmos @@ -1,7 +1,6 @@ -ticker 1 : loopaction, loop +ticker 1 : main # Main memory structure -: B = [1...100] * 0 - +id testing : B = [1, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # Operations on memory : q(l, v, i)=ifval(l, i, [1...length(l)], v) : setlistval(index, v) = B -> q(B, v, index) @@ -21,12 +20,17 @@ ticker 1 : loopaction, loop : idiv(a, b, t_o) = setlistval(t_o, odiv(B[a], B[b])) : imul(a, b, t_o) = setlistval(t_o, omul(B[a], B[b])) -: icmp(a, b, z) = { a = b : equals -> 1 , a > b : greater -> 1 , a < b : less -> 1} +: icmp(a, b, z) = { \ + a = b : equals -> 1 , \ + a > b : greater -> 1 , \ + a < b : less -> 1 \ + } : irst(a, b, c) = equals -> 0, greater -> 0, less -> 0 : ield(addr, b) = setlistval(addr, equals) : igld(addr, b) = setlistval(addr, greater) : illd(addr, b) = setlistval(addr, less) + : ibe(addr, b, c) = {equals = 1 : ijmp(addr, 0, 0), jumped -> 1} : ibne(addr, b, c) = {equals = 0 : ijmp(addr, 0, 0), jumped -> 1} : ibg(addr, b, c) = {greater = 1 : ijmp(addr, 0, 0), jumped -> 1} @@ -84,6 +88,7 @@ ticker 1 : loopaction, loop : loop = {execution = 0 : execution -> 1, execution = 1 : execution -> 2, execution = 2 : execution -> 0} : loopaction = {execution = 0 : load(ip), execution = 1 : exec, execution = 2 : incip} +: main = loopaction, loop : sto = 1 : add = 2 @@ -101,4 +106,4 @@ ticker 1 : loopaction, loop : div = 14 : rst = 15 -: instwidth = [2,3,1,1,1,1,1,1,1,1,3,3,3,3,0] \ No newline at end of file +: instwidth = [2,3,1,1,1,1,1,1,1,1,3,3,3,3,0] diff --git a/desmosisa/__init__.py b/desmosisa/__init__.py new file mode 100644 index 0000000..316bed5 --- /dev/null +++ b/desmosisa/__init__.py @@ -0,0 +1,37 @@ +from .server import main +import argparse +import pyperclip +import json + +def get_overrides(file): + fd = open(file, "r") + data = json.loads(fd.read()) + fd.close() + return data + +def entry(): + parser = argparse.ArgumentParser( + prog="desmos-sync", + description="Synchronize from local file to Desmos calculator", + ) + + parser.add_argument('--copy', action="store_true", help="copy the client side JS to clipboard") + parser.add_argument('--run', help="specify file to start the desmos server for") + parser.add_argument('--overrides', help="specify file that contains overrides for desmos expressions") + + args = parser.parse_args() + if args.overrides: + args.overrides = get_overrides(args.overrides) + + if args.run: + main(args.run, args.overrides if args.overrides else {}) + elif args.copy: + fd = open("console.js", "r") + buffer = fd.read() + pyperclip.copy(buffer) + print("copied") + else: + parser.print_help() + +if __name__ == "__main__": + entry() diff --git a/desmosisa/__main__.py b/desmosisa/__main__.py new file mode 100644 index 0000000..0bb2e7e --- /dev/null +++ b/desmosisa/__main__.py @@ -0,0 +1,4 @@ +from . import entry + +if __name__ == "__main__": + entry() diff --git a/parser.py b/desmosisa/parser.py similarity index 100% rename from parser.py rename to desmosisa/parser.py diff --git a/server.py b/desmosisa/server.py similarity index 63% rename from server.py rename to desmosisa/server.py index 4ea0b49..595dd64 100644 --- a/server.py +++ b/desmosisa/server.py @@ -6,7 +6,7 @@ import json import random import queue import functools -from parser import Parser +from .parser import Parser, Statement from watchdog.events import FileSystemEventHandler from watchdog.events import FileModifiedEvent from watchdog.observers import Observer @@ -19,7 +19,7 @@ class FSEHandler(FileSystemEventHandler): def on_modified(self, event): self.queue.put("") -async def serv(websocket, file): +async def serv(websocket, file, overrides={}): message = await websocket.recv() lmtime = 0 epsilon = 0.25 # tweak this to what makes sense. 0.25 seconds makes sense to me. @@ -44,7 +44,7 @@ async def serv(websocket, file): continue else: lmtime = time.time() - + parser = Parser(file) parser.parse() @@ -52,7 +52,7 @@ async def serv(websocket, file): json.dumps( { "message": "clear", - "payload": "none", + "payload": "none", } ) ) @@ -70,25 +70,38 @@ async def serv(websocket, file): ) continue - - if not line["comment"]: - await websocket.send( - json.dumps( - { - "message": "expression", - "id": "placeholder" + str(random.randint(1, 100100)), - "payload": line.latex, - } - ) + + # if the line has been assigned an id, make it so + if line["id"]: + ident = line.commands["id"] + print("performing substitution") + else: + # else just choose a safe option + ident = "placeholder" + str(random.randint(1, 100100)) + + if ident in overrides.keys(): + to_send = overrides[ident] + else: + to_send = line.latex + + + await websocket.send( + json.dumps( + { + "message": "expression", + "id": ident, + "payload": to_send, + } ) - -async def start_server(file): - wrapper = functools.partial(serv, file=file) + ) + +async def start_server(file, overrides): + wrapper = functools.partial(serv, file=file, overrides=overrides) async with serve(wrapper, "localhost", 8765): await asyncio.Future() -def main(file): - asyncio.run(start_server(file)) +def main(file, overrides): + asyncio.run(start_server(file, overrides)) if __name__ == "__main__": - main("data/testing.desmos") \ No newline at end of file + main("data/testing.desmos") diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..fed528d --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" diff --git a/shell.nix b/shell.nix index 9fcbc4b..e811876 100644 --- a/shell.nix +++ b/shell.nix @@ -2,6 +2,9 @@ let my-python-packages = ps: with ps; [ pip + pkgs.python311Packages.websockets + pkgs.python311Packages.watchdog + pkgs.python311Packages.pyperclip ]; my-python = pkgs.python3.withPackages my-python-packages; -in my-python.env \ No newline at end of file +in my-python.env diff --git a/test.override b/test.override new file mode 100644 index 0000000..4f130c2 --- /dev/null +++ b/test.override @@ -0,0 +1 @@ +{"testing": "\\left[1,2,3,4,5,1\\right]"}