1"""Press Enter at the edges of and inside equations and links in OneNote 2010 on a
2Rust-written page and capture what it stores. The oracle for the canvas editor's Enter.
3
4Usage: native_enter.py NOTEBOOK_DIR OUTPUT_DIR
5"""
6import base64
7import json
8import sys
9from pathlib import Path
10import xml.etree.ElementTree as ET
11
12sys.path.insert(0, str(Path(__file__).resolve().parent))
13import native_runner as runner
14
15windows = runner.windows
16
17
18def text(value):
19 return 'SendText("%s")' % value.replace('"', '""')
20
21
22def interaction(name, output):
23 lines = [
24 # Enter at an equation's start moves it to a paragraph of its own.
25 text('Before '), 'Send("!=")', 'Sleep(600)', text('y^2+1'), 'Send(" ")', 'Sleep(700)',
26 'Send("{Home}")', 'Send("{Right 7}")', 'Sleep(300)', 'Send("{Enter}")', 'Sleep(600)',
27 # Enter inside the equation's own row breaks its line.
28 'Send("{End}")', 'Send("{Left 2}")', 'Sleep(300)', 'Send("{Enter}")', 'Sleep(600)',
29 # Enter inside a fraction's denominator makes it an equation array.
30 'Send("{End}{Enter}")', 'Send("!=")', 'Sleep(600)', text('(a+b)/(c+d)'), 'Send(" ")',
31 'Sleep(700)', 'Send("{Left 3}")', 'Sleep(300)', 'Send("{Enter}")', 'Sleep(600)',
32 # Enter at a link's start moves the link down whole (inside one, it follows the link).
33 'Send("^{End}{Enter}")', text('Select me please'), 'Send("+^{Left}+^{Left}")', 'Send("^k")',
34 'Sleep(1500)', text('https://example.com/selected'), 'Send("{Enter}")', 'Sleep(800)',
35 'Send("{End}")', 'Send("{Left 9}")', 'Sleep(300)', 'Send("{Enter}")', 'Sleep(600)',
36 ]
37 page = ET.parse(sorted((output / 'read').glob('page-*.xml'))[0]).getroot().attrib['ID']
38 script = '''ComObject("OneNote.Application").NavigateTo("PAGE_ID", "", false)
39WinWait("ahk_exe ONENOTE.EXE", , 30)
40WinActivate("ahk_exe ONENOTE.EXE")
41WinWaitActive("ahk_exe ONENOTE.EXE", , 30)
42WinMaximize("ahk_exe ONENOTE.EXE")
43Sleep(3000)
44CoordMode("Mouse", "Screen")
45Click(200, 140)
46Sleep(500)
47Send("{End}")
48Sleep(300)
49Send("{Enter}")
50Sleep(500)
51%s
52Sleep(2000)
53''' % '\n'.join(lines)
54 script = script.replace('PAGE_ID', page)
55 (output / 'enter.ahk').write_text(script)
56 result = windows.do_exec(script, target=name, timeout_ms=240000, shot_delay_ms=1500)
57 screenshot = result.pop('png_b64', None)
58 if screenshot:
59 (output / 'enter.png').write_bytes(base64.b64decode(screenshot))
60 (output / 'enter.json').write_text(json.dumps(result, indent=2))
61 if result.get('error') or result.get('exit') != 0:
62 raise RuntimeError(str(result))
63
64
65if __name__ == '__main__':
66 notebook, output = Path(sys.argv[1]), Path(sys.argv[2])
67 runner.capture(notebook, output, expected_pages=1, collect_notebook=True, interaction=interaction)