absolute css

graph (svg) on left
notes (text) and reparse/redraw (submit) on right

~> jquery
`main.py` only has the API

i.e. command line argument parsing and method dispatching
hover/click shows/pins text if node or link on/to bottom

add mouseenter/mouseleave/mouseclick events

depends on jquery and d3
(all javascript libraries are local)

`visualization.py` . `visualization.html`
node : {'name': str}
link : {'source': node, 'name': str, 'target': node}
split html into html/css/js

CSS reset

bump jquery
HTTP API
POST /parse
POST /draw

notes ==parse==> edges ==draw==> graph

cmdln api (i.e. "command_line.py", renamed from "main.py") and http api (i.e. "server.py") share functions (e.g. both use `note.read()`)

TEST http api
$ python server.py
$ curl  "http://127.0.0.1:5000/parse"  -H "Content-Type:text/json"  -d @test.json
$ curl  "http://127.0.0.1:5000/draw"  -H "Content-Type:text/json"  -d @test.json

TEST cmdln
$ ./command_line.py -t

`Notes()`
in `visualization.js`
: getter/setter
`<textarea>` needs `.val()` not `.text()`

`visualization.js`
use POST request for GETting, as data may be too large (i.e. more than a few kb)
`d3.xhr`
`JSON.stringify` in javascript ≈ `json.dumps` in python

`server.py`
: Flask server
API = `/parse` and `/draw`
split handling from processing

`parse.py`
`parse.parse` : text => [Parsed]

`note.read(as_note=False)` and `parse.note(as_edges=False)` for post-processing output as wanted type

`db.py`
`collection()` : Box
redraw graph with new parse via enter/exit/update
in `start`

`visualize` calls `tick` and `start`