graph drawing tool
# snap.love: a graph drawing tool

[![0 dependencies!]https://0dependencies.dev/0dependencies.svg]https://0dependencies.dev

Unlike [Graphviz]https://graphviz.org and [PlantUML]https://plantuml.com,
this tool is for small graphs where you want complete control over layout.
Unlike PowerPoint or draw.io, this tool results generates text files that are
more amenable to version control. The catch: it's a lot more limited than all
these tools; all you can do so far is draw rectangles and edges between them.

![drawing]assets/1.gif

You can't change the styling. Unless you modify the code. But that's easy!
This repo is an example of a [Freewheeling App]http://akkartik.name/freewheeling,
designed above all to be easy to run, easy to modify and easy to share.

## Getting started

Install [LÖVE]https://love2d.org. It's just a 5MB download, open-source and
extremely well-behaved.

[Run the app using LÖVE.]https://love2d.org/wiki/Getting_Started#Running_Games

You'll see a single box on screen. Drag the surface or press arrow keys to pan
around. Try dragging the border of the box. You'll see an edge stick out.
Release the mouse button, and a new box (node) will pop out at the other end
of the edge. Try dragging the top-left bar for each box. They move relative to
each other. Try typing inside. The text wraps within and the box grows taller
to accomodate it. Try dragging the parallel lines to the right of a box. The
width of the box changes.

Try quitting and restarting. Your changes will still be present. By default,
snap.love writes to a file called `graph` in [a directory relative to this app]https://love2d.org/wiki/love.filesystem.getSourceBaseDirectory.
To switch to a different file, drop it on the snap.love window. You can also
pass in a filename when starting the app from the terminal.

## Hacking

To make changes to this app without restarting the app each time, download
[the driver app]https://git.sr.ht/~akkartik/driver.love. Example session:

![making changes without restarting the app]assets/2.gif

[Some reference documentation on how to create your own apps.]reference.md

If the app being modified by the driver lives in a .love file, your changes
will go into the [save directory]https://love2d.org/wiki/love.filesystem.getSaveDirectory.
If it lives in a directory (like this repo), your changes will go straight
into the same directory.

## Keyboard shortcuts

While editing within a node:
* `ctrl+f` to find patterns
* `ctrl+c` to copy, `ctrl+x` to cut, `ctrl+v` to paste
* `ctrl+z` to undo, `ctrl+y` to redo
* `ctrl+=` to zoom in, `ctrl+-` to zoom out, `ctrl+0` to reset zoom
* `alt+right`/`alt+left` to jump to the next/previous word, respectively
* mouse drag or `shift` + movement to select text, `ctrl+a` to select all

When cursor is not in an editor:
* arrow keys pan the surface
* `shift`+arrow keys pan faster
  - `pagedown` and `pageup` are aliases for `shift+down` and `shift+up` respectively

Exclusively tested so far with a US keyboard layout. If
you use a different layout, please let me know if things worked, or if you
found anything amiss: http://akkartik.name/contact

## Known issues

* This approach puts one top-level definition per file, and so obscures the
  order in which definitions are loaded. In particular, initializing a global
  table to contain other global definitions will fail if you originally
  authored the other global definitions after the table.

  I never initialize global tables with other definitions. That kind of thing
  happens in `on.initialize` (akin to `love.load`; see reference.md) or
  `on.code_change`.

* Don't start the driver app while multiple freewheeling apps are running. If
  you have a driver app running with one app, shut it down before you switch
  apps.

* No support yet for Unicode graphemes spanning multiple codepoints.

* No support yet for right-to-left languages.

* Can't scroll while selecting text with mouse.

* No scrollbars yet. That stuff is hard.

## Mirrors and Forks

This repo is a fork of [lines.love]http://akkartik.name/lines.html, an
editor for plain text where you can also seamlessly insert line drawings.
Its immediate upstream is [luaML.love]https://git.sr.ht/~akkartik/luaML.love,
a box model for a Lua-based markup language that models an infinite pannable,
zoomable 2D surface. Updates to it can be downloaded from:

* https://git.sr.ht/~akkartik/snap.love
* https://tildegit.org/akkartik/snap.love
* https://git.merveilles.town/akkartik/snap.love
* https://nest.pijul.com/akkartik/snap.love (using the Pijul version control system)

Further forks are encouraged. If you show me your fork, I'll link to it here.

* https://git.sr.ht/~akkartik/wardley.love - a little tool for building Wardley Maps

## Feedback

[Most appreciated.]http://akkartik.name/contact Messages, PRs, patches,
forks, it's all good.