Skip to content

Jeangowhy/asciiflow

 
 

Repository files navigation

ASCIIFlow is a client-side only web based application for drawing ASCII diagrams. You can use it at asciiflow.com.

ASCIIFlow screenshot

Install VS Code extension manually

  • Open VS Code
  • Open Command Palette by Ctrl+Shift+P
  • Execute command: >Install Extension from Location...
  • Exxcute command: >Asciiflow: Open Asciiflow
  • Done! Enjoy your ASCII Art!✨

Bug Fix

  1. Keyboard shortcut

The alt+1, alt+2 .... keyboard shortcut will cause VS Code switch document editor if ASCIIFlow run as VS Code extension.

To fix it, just add stopPropagation() to the handleKeyDown() function.

And the refactor code was maked for a code reader's nice mood.

  handleKeyDown(event: KeyboardEvent) {

      if (event.altKey) {
        store.altPressed.set(true);
        const toolMap = {
        "1": ToolMode.BOX,
        "2": ToolMode.SELECT,
        "3": ToolMode.FREEFORM,
        "4": ToolMode.ARROWS,
        "5": ToolMode.LINES,
        "6": ToolMode.TEXT,
        }
        if (Object.keys(toolMap).find( it => it == event.key)) {
        event.stopPropagation()
        event.preventDefault()
        store.setToolMode(toolMap[event.key as keyof (typeof toolMap)])
        }
      }
      ...
  1. Panning operation and TextDraw

Cursor will move forward when user panning canvas by space bar and mouse drag. Just fix the if stament with the this.mode != Mode.DRAG.

  handleKeyPress(event: KeyboardEvent) {
    // ...
    if (!event.ctrlKey && !event.metaKey && event.keyCode !== 13 
    **&& this.mode != Mode.DRAG) { // Fixed code**
      store.currentTool.handleKey(
        String.fromCharCode(event.keyCode),
        getModifierKeys(event)
      );
    }
  }

Strokes Updated

  • Double Struck [NEW]
  • Arrowed [NEW]
  • Dotted [NEW]
  • Strong Struck [NEW]
  • Strong Side [NEW]
  • ASCII Extended
  • ASCII Basic

Graphs below demonstrate ASCIIFlow Logic Flow. Note that the Unicode (ASCII Extended) output can remap to others.

Double Struck [NEW]
╔══════════════════════╗  ╔════════════════════╗   ╔══════════════════════╗         
║                      ║  ║                    ║   ║                      ║         
║  DesktopController   ║  ║    Controller      ║   ║   IDrawFunction      ║         
║                      ║  ║                    ║   ║ ╔════════════════════╩════════╗
║                      ║  ║                    ║   ║ ║            DrawLine         ║
║  handleMouseMove()═══╬══╬══⇨ handleMove()════╬═══╬═╬⇨ move()                     ║
║                      ║  ║                    ║   ║ ║                             ║
║                      ║ ╔╬══⇨ startDraw() ════╬═══╬═╬⇨ start()                    ║
║  handleMouseDown()═══╬═╣║                    ║   ║ ║                             ║
║                      ║ ╚╬══⇨ startDrag()     ║   ║ ║                      draw() ║
║  handleMouseUp()═════╬╗ ║                    ║   ║ ║                             ║
║                      ║╠═╬═══⇨ endAll()   ════╬═══╬═╬⇨ end()                      ║
║  handleMouseLeave()══╬╝ ║                    ║   ║ ║                             ║
║                      ║  ║  handleKeyDown()══╗║   ║ ║                             ║
║                      ║  ║                   ╠╬═══╬═╬⇨ handleKey()                ║
║                      ║  ║  handleKeyPress()═╝║   ║ ╚════════════════════╦════════╝
╚══════════════════════╝  ╚════════════════════╝   ╚═ ════════════════════╝         
Strong Side [NEW]
┎──────────────────────────────────────────────────────────────────────────────────┒   ┎──────────────────────────────────────┒
┃                                                                                  ┃   ┃                 ┎──────────┒         ┃
┃                                    AsciiFlow Web App                             ┃   ┃                 ┃ DrawBox  ╂─────┒   ┃
┃                                                                                  ┃   ┃                 ┖──────────┚     ┃   ┃
┃ ┎────────────────────┒    ┎────────────────────────────────────────────────────┒ ┃   ┃                 ┎───────────┒    ┃   ┃
┃ ┃ <Drawer>           ┃    ┃ <View> : (...) => <canvas>         ┎───────────────┸─┨   ┃                 ┃ DrawErase─╂────┨   ┃
┃ ┃                    ┃    ┃  ┃                                 ┃ ┎─────────────┒ ┃   ┃                 ┖───────────┚    ┃   ┃
┃ ┃ ┎───────────────┒  ┃    ┃  ┠──useWatchable<T>(fn: () => T): T┃ ┃ onTouchStart┃ ┃   ┃                 ┎──────────────┒ ┃   ┃
┃ ┃ ┃ <ToolControl> ┃  ┃    ┃  ┃   ┃                             ┃ ┠─────────────┨ ┃   ┃                 ┃ DrawFreeform ╂─┨   ┃
┃ ┃ ┖───────────────┚  ┃    ┃  ┃   ┖───trackUsedWatchables(fn)   ┃ ┃ onTouchMove ┃ ┃   ┃                 ┖──────────────┚ ┃   ┃
┃ ┃ ┎────────────────┒ ┃    ┃  ┃                                 ┃ ┠─────────────┨ ┃   ┃                 ┎──────────┒     ┃   ┃
┃ ┃ ┃ <ShortcutChip> ┃ ┃    ┃  ┖──useEffect()                    ┃ ┃ onTouchEnd  ┃ ┃   ┃                 ┃ DrawLine ╂─────┨   ┃
┃ ┃ ┖────────────────┚ ┃    ┃      ┃                             ┃ ┖─────────────┚ ┃   ┃                 ┖──────────┚     ┃   ┃
┃ ┃ ┎────────────┒     ┃    ┃      ┖───render(canvas)            ┃                 ┃   ┃                 ┎──────────┒     ┃   ┃
┃ ┃ ┃ <ToolHelp> ┃     ┃    ┃              ⇧                     ┃ ┎─────────────┒ ┃   ┃                 ┃ DrawMove ╂─────┨   ┃
┃ ┃ ┖────────────┚     ┃    ┃              ┃     Render the grid ┃ ┃ onMouseDown ┃ ┃   ┃                 ┖──────────┚     ┃   ┃
┃ ┃                    ┃    ┃              ┃      ┎┰┰┰┰┰┰┰┰┰┰┰┒  ┃ ┠─────────────┨ ┃   ┃                 ┎──────────┒     ┃   ┃
┃ ┃ ┎────────────────┒ ┃    ┃              ┃      ┠╂╂╂╂╂╂╂╂╂╂╂┨  ┃ ┃ onMouseUp   ┃ ┃   ┃                 ┃ DrawNull ╂─────┨   ┃
┃ ┃ ┃ <ExportDialog> ┃ ┃    ┃              ┃      ┠╂╂╂╂╂╂╂╂╂╂╂┨  ┃ ┠─────────────┨ ┃   ┃  getCursor()    ┖──────────┚     ┃   ┃
┃ ┃ ┃ useWatchable   ┃ ┃    ┃              ┃      ┠╂╂╂╂╂╂╂╂╂╂╂┨  ┃ ┃ onWheel     ┃ ┃   ┃                 ┎────────────┒   ┃   ┃
┃ ┃ ┃┎──────────────┒┃ ┃    ┃          autorun()  ┠╂╂╂╂╂╂╂╂╂╂╂┨  ┃ ┠─────────────┨ ┃   ┃                 ┃ DrawSelect ╂───┨   ┃
┃ ┃ ┃┃ applyConfig()⇦╂─╂─┒  ┃              ⇧      ┠╂╂╂╂╂╂╂╂╂╂╂┨  ┃ ┃ onMouseMove ┠─╂───╂─────⇨ move()    ┖────────────┚   ┃   ┃
┃ ┃ ┃┖──────────────┚┃ ┃ ┃  ┃              ┃      ┠╂╂╂╂╂╂╂╂╂╂╂┨  ┃ ┖─────────────┚ ┃   ┃                 ┎──────────┒     ┃   ┃
┃ ┃ ┖───────⇧────────┚ ┃ ┃  ┃              ┃      ┖┸┸┸┸┸┸┸┸┸┸┸┚  ┃ ┎──────────────┒┃   ┃                 ┃ DrawText ┠─────┨   ┃
┃ ┖─────────╂──────────┚ ┃  ┖──────────────╂─────────────────────┨ ┃handleKeyDown ┃┃   ┃                 ┖──────────┚     ┃   ┃
┖───────────╂────────────╂─────────────────╂─────────────────────┨ ┃             ─╂┸───╂─⇨handleKey() ┎───────────────────⇩──┒┃
    ┎───────┚            ┃                 ┃         ┎───────────┚ ┃handleKeyPress┃┃   ┃              ┃ AbstractDrawFunctio  ┃┃
    ┃                    ┃                 ┃         ┃             ┖──────────────┚┃   ┃              ┖───────────────────┰ ─┚┃
    ┃    ┎───────────────┸─┒      ┎────────┸───────┒ ┃              handleKeyUp    ┃   ┃              ┎────────────────┒  ┃   ┃
    ┃    ┃  ICharacterSet  ┃      ┃ usedWatchables ┃ ┃                             ┃   ┃              ┃ IDrawFunction  ⇦──┚   ┃
    ┃    ┖─⇧───────────────┚      ┖────────⇧───────┚ ┃              endAll() ──────╂───╂────⇨ start() ┖────────────────┚      ┃
    ┃      ┃ ┎─────────────────────┒       ┃         ┃                             ┃   ┃                                      ┃
    ┃      ┠─┨ Double Struck [NEW] ┃       ┃         ┃              startDraw() ───╂───╂──────⇨ end()                         ┃
    ┃      ┃ ┖─────────────────────┚       ┃         ┃                             ┃   ┖────────────────────────┰─────────────┚
    ┃      ┃ ┎─────────────────────┒       ┃         ┃              startDrag()    ┃                            ┃              
    ┃      ┠─┨ Dotted        [NEW] ┃       ┃         ┃                             ┃                            ┃              
    ┃      ┃ ┖─────────────────────┚       ┃         ┃     ┎───────────────────┒   ┃                            ┃              
    ┃      ┃ ┎─────────────────────┒       ┃         ┃ ┎─┰─┨ Controller        ┃⇦──╂──── Keyboard Events        ┃              
    ┃      ┠─┨ Strong Struck [NEW] ┃       ┃         ┃ ┃ ┃ ┖───────────────────┚   ┃                            ┃              
    ┃      ┃ ┖─────────────────────┚       ┃         ┃ ┃ ┃ ┎───────────────────┒   ┃                            ┃              
    ┃      ┃ ┎─────────────────────┒       ┃         ┃ ┃ ┖─┨ TouchController   ┃⇦──╂─────── Touch Events        ┃              
    ┃      ┠─┨ Strong Side   [NEW] ┃       ┃         ┃ ┃   ┖───────────────────┚   ┃                            ┃              
    ┃      ┃ ┖─────────────────────┚       ┃         ┃ ┃   ┎───────────────────┒   ┃                            ┃              
    ┃      ┃ ┎────────────────┒            ┃         ┃ ┖───┨ DesktopController ┃⇦──╂─────── Mouse Events        ┃              
    ┃      ┠─┨ ASCII Extended ┃            ┃         ┃     ┖───────────────────┚   ┃                            ┃              
    ┃      ┃ ┖────────────────┚            ┃         ┖─────────────────────────────┚                            ┃              
    ┃      ┃ ┎────────────────┒            ┃                                                  ┎── paste         ┃              
    ┃      ┖─┨ ASCII Basic    ┃            ┖────────────┒                   ┎───────────────┒ ┃                 ⇩              
    ┃        ┖────────────────┚    ┎────────────────────╂───────────┒       ┃               ┃ ┃      ┎────────────────────────┒
    ┃                              ┃                    ┃         ┎─╂───────╂ layerToText() ┠─┚      ┃  Store                 ┃
    ┃                              ┃   CanvasStore      ┃         ┃ ┃       ┃ textToLayer() ┃        ┃                        ┃
    ┃                              ┃                    ┃         ┃ ┃       ┃               ┃        ┃  watchableValue        ┃
    ┃                              ┃     watchableValue ┃         ┃ ┃       ┖───────────────┚        ┃  ┃                     ┃
    ┃                              ┃     ┃              ┃         ┃ ┃                                ┃  ┠── currentTool       ┃
    ┃        ┎─────────────────────╂───⇨ ┠─ scratch<Layer>        ┃ ╂────────────────────────────────╂─⇨┠── currentCanvas     ┃
┎───╂────────╂────────────────┒    ┃     ┖─ selection<Box>        ┃ ┃                                ┃  ┠── freeformCharacter ┃
┃                             ┃    ┃                              ┃ ┃                                ┃  ┠── selectedToolMode  ┃
┃      ┎────────────┒         ┃    ┃     WatchableAdapter<Layer> :┃ ┃                                ┃  ┠── panning           ┃
┃      ┃ ILayerView ┃         ┃    ┃     ┃                        ┃ ┃                                ┃  ┠── altPressed        ┃
┃      ┖──────⇧─────┚         ┃    ┃     ┠─ persistentCommitted   ┃ ┃  ┎──────────────────────────┒  ┃  ┠── currentCursor     ┃
┃     ┎───────┸───────┒       ┃    ┃     ┠─ committed             ┃ ┃  ┃                          ┃  ┃  ┖── modifierKeys      ┃
┃ ┎───┸─────┒ ┎───────┸───┒   ┃    ┃     ┠─ undoLayers            ┃ ┃  ┃  DrawingId               ┃  ┖────────────────────────┚
┃ ┃  Layer  ┃ ┃ LayerView ┃   ┃    ┃     ┖─ redoLayers            ┃ ┃  ┃                          ┃  ┎────────────────────────┒
┃ ┖─────────┚ ┖───────────┚   ┃    ┃                              ┃ ┃  ┃  type: "local" | "share" ┃  ┃                        ┃
┃                             ┃    ┃   undo()                     ┃ ┃  ┃                          ┃  ┃ Persistent             ┃
┃                             ┃    ┃   redo()                     ┃ ┃  ┃  saveDrawing()    ───────╂─⇨┃ ┎────────────────────┒ ┃
┃  deserialize(value: string)─╂··· ╂─⇨ setScratchLayer(layer) ⇦───┚ ┃  ┃                          ┃  ┃ ┃ localStorage       ┃ ┃
┃                             ┃    ┃   commitScratch()              ┃  ┃  deleteDrawing()─────────╂──╂⇨┃ ┠── getItem(key)   ┃ ┃
┃  apply(layer): [ldo, lundo] ┃    ┃   _route ──────────────────────╂─⇨┃  renameDrawing()─────────╂──╂⇨┃ ┖── setItem(key)   ┃ ┃
┃                             ┃    ┃                                ┃  ┃                          ┃  ┃ ┖────────────────────┚ ┃
┖─────────────────────────────┚    ┖────────────────────────────────┚  ┖──────────────────────────┚  ┖────────────────────────┚
Dotted [NEW]
╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕   ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕
┊                                                                                  ┊   ┊                 ╒┄┄┄┄┄┄┄┄┄┄╕         ┊
┊                                    AsciiFlow Web App                             ┊   ┊                 ┊ DrawBox  ┼┄┄┄┄┄╕   ┊
┊                                                                                  ┊   ┊                 ╘┄┄┄┄┄┄┄┄┄┄╛     ┊   ┊
┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕    ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕ ┊   ┊                 ╒┄┄┄┄┄┄┄┄┄┄┄╕    ┊   ┊
┊ ┊ <Drawer>           ┊    ┊ <View> : (...) => <canvas>         ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╧┄╡   ┊                 ┊ DrawErase┄┼┄┄┄┄╡   ┊
┊ ┊                    ┊    ┊  ┊                                 ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄╕ ┊   ┊                 ╘┄┄┄┄┄┄┄┄┄┄┄╛    ┊   ┊
┊ ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕  ┊    ┊  ╞┄┄useWatchable<T>(fn: () => T): T┊ ┊ onTouchStart┊ ┊   ┊                 ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕ ┊   ┊
┊ ┊ ┊ <ToolControl> ┊  ┊    ┊  ┊   ┊                             ┊ ╞┄┄┄┄┄┄┄┄┄┄┄┄┄╡ ┊   ┊                 ┊ DrawFreeform ┼┄╡   ┊
┊ ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛  ┊    ┊  ┊   ╘┄┄┄trackUsedWatchables(fn)   ┊ ┊ onTouchMove ┊ ┊   ┊                 ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛ ┊   ┊
┊ ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕ ┊    ┊  ┊                                 ┊ ╞┄┄┄┄┄┄┄┄┄┄┄┄┄╡ ┊   ┊                 ╒┄┄┄┄┄┄┄┄┄┄╕     ┊   ┊
┊ ┊ ┊ <ShortcutChip> ┊ ┊    ┊  ╘┄┄useEffect()                    ┊ ┊ onTouchEnd  ┊ ┊   ┊                 ┊ DrawLine ┼┄┄┄┄┄╡   ┊
┊ ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛ ┊    ┊      ┊                             ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄┄╛ ┊   ┊                 ╘┄┄┄┄┄┄┄┄┄┄╛     ┊   ┊
┊ ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄╕     ┊    ┊      ╘┄┄┄render(canvas)            ┊                 ┊   ┊                 ╒┄┄┄┄┄┄┄┄┄┄╕     ┊   ┊
┊ ┊ ┊ <ToolHelp> ┊     ┊    ┊              ↑                     ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄╕ ┊   ┊                 ┊ DrawMove ┼┄┄┄┄┄╡   ┊
┊ ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄╛     ┊    ┊              ┊     Render the grid ┊ ┊ onMouseDown ┊ ┊   ┊                 ╘┄┄┄┄┄┄┄┄┄┄╛     ┊   ┊
┊ ┊                    ┊    ┊              ┊      ╒╤╤╤╤╤╤╤╤╤╤╤╕  ┊ ╞┄┄┄┄┄┄┄┄┄┄┄┄┄╡ ┊   ┊                 ╒┄┄┄┄┄┄┄┄┄┄╕     ┊   ┊
┊ ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕ ┊    ┊              ┊      ╞┼┼┼┼┼┼┼┼┼┼┼╡  ┊ ┊ onMouseUp   ┊ ┊   ┊                 ┊ DrawNull ┼┄┄┄┄┄╡   ┊
┊ ┊ ┊ <ExportDialog> ┊ ┊    ┊              ┊      ╞┼┼┼┼┼┼┼┼┼┼┼╡  ┊ ╞┄┄┄┄┄┄┄┄┄┄┄┄┄╡ ┊   ┊  getCursor()    ╘┄┄┄┄┄┄┄┄┄┄╛     ┊   ┊
┊ ┊ ┊ useWatchable   ┊ ┊    ┊              ┊      ╞┼┼┼┼┼┼┼┼┼┼┼╡  ┊ ┊ onWheel     ┊ ┊   ┊                 ╒┄┄┄┄┄┄┄┄┄┄┄┄╕   ┊   ┊
┊ ┊ ┊╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕┊ ┊    ┊          autorun()  ╞┼┼┼┼┼┼┼┼┼┼┼╡  ┊ ╞┄┄┄┄┄┄┄┄┄┄┄┄┄╡ ┊   ┊                 ┊ DrawSelect ┼┄┄┄╡   ┊
┊ ┊ ┊┊ applyConfig()←┼┄┼┄╕  ┊              ↑      ╞┼┼┼┼┼┼┼┼┼┼┼╡  ┊ ┊ onMouseMove ╞┄┼┄┄┄┼┄┄┄┄┄→ move()    ╘┄┄┄┄┄┄┄┄┄┄┄┄╛   ┊   ┊
┊ ┊ ┊╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛┊ ┊ ┊  ┊              ┊      ╞┼┼┼┼┼┼┼┼┼┼┼╡  ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄┄╛ ┊   ┊                 ╒┄┄┄┄┄┄┄┄┄┄╕     ┊   ┊
┊ ┊ ╘┄┄┄┄┄┄┄↑┄┄┄┄┄┄┄┄╛ ┊ ┊  ┊              ┊      ╘╧╧╧╧╧╧╧╧╧╧╧╛  ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕┊   ┊                 ┊ DrawText ╞┄┄┄┄┄╡   ┊
┊ ╘┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄╛ ┊  ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╡ ┊handleKeyDown ┊┊   ┊                 ╘┄┄┄┄┄┄┄┄┄┄╛     ┊   ┊
╘┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╡ ┊             ┄┼╧┄┄┄┼┄→handleKey() ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄↓┄┄╕┊
    ╒┄┄┄┄┄┄┄╛            ┊                 ┊         ╒┄┄┄┄┄┄┄┄┄┄┄╛ ┊handleKeyPress┊┊   ┊              ┊ AbstractDrawFunctio  ┊┊
    ┊                    ┊                 ┊         ┊             ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛┊   ┊              ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╤ ┄╛┊
    ┊    ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╧┄╕      ╒┄┄┄┄┄┄┄┄╧┄┄┄┄┄┄┄╕ ┊              handleKeyUp    ┊   ┊              ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕  ┊   ┊
    ┊    ┊  ICharacterSet  ┊      ┊ usedWatchables ┊ ┊                             ┊   ┊              ┊ IDrawFunction  ←┄┄╛   ┊
    ┊    ╘┄↑┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛      ╘┄┄┄┄┄┄┄┄↑┄┄┄┄┄┄┄╛ ┊              endAll() ┄┄┄┄┄┄┼┄┄┄┼┄┄┄┄→ start() ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛      ┊
    ┊      ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕       ┊         ┊                             ┊   ┊                                      ┊
    ┊      ╞┄╡ Double Struck [NEW] ┊       ┊         ┊              startDraw() ┄┄┄┼┄┄┄┼┄┄┄┄┄┄→ end()                         ┊
    ┊      ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛       ┊         ┊                             ┊   ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╤┄┄┄┄┄┄┄┄┄┄┄┄┄╛
    ┊      ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕       ┊         ┊              startDrag()    ┊                            ┊              
    ┊      ╞┄╡ Dotted        [NEW] ┊       ┊         ┊                             ┊                            ┊              
    ┊      ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛       ┊         ┊     ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕   ┊                            ┊              
    ┊      ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕       ┊         ┊ ╒┄╤┄╡ Controller        ┊←┄┄┼┄┄┄┄ Keyboard Events        ┊              
    ┊      ╞┄╡ Strong Struck [NEW] ┊       ┊         ┊ ┊ ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛   ┊                            ┊              
    ┊      ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛       ┊         ┊ ┊ ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕   ┊                            ┊              
    ┊      ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕       ┊         ┊ ┊ ╘┄╡ TouchController   ┊←┄┄┼┄┄┄┄┄┄┄ Touch Events        ┊              
    ┊      ╞┄╡ Strong Side   [NEW] ┊       ┊         ┊ ┊   ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛   ┊                            ┊              
    ┊      ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛       ┊         ┊ ┊   ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕   ┊                            ┊              
    ┊      ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕            ┊         ┊ ╘┄┄┄╡ DesktopController ┊←┄┄┼┄┄┄┄┄┄┄ Mouse Events        ┊              
    ┊      ╞┄╡ ASCII Extended ┊            ┊         ┊     ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛   ┊                            ┊              
    ┊      ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛            ┊         ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛                            ┊              
    ┊      ┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕            ┊                                                  ╒┄┄ paste         ┊              
    ┊      ╘┄╡ ASCII Basic    ┊            ╘┄┄┄┄┄┄┄┄┄┄┄┄╕                   ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕ ┊                 ↓              
    ┊        ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛    ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄╕       ┊               ┊ ┊      ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕
    ┊                              ┊                    ┊         ╒┄┼┄┄┄┄┄┄┄┼ layerToText() ╞┄╛      ┊  Store                 ┊
    ┊                              ┊   CanvasStore      ┊         ┊ ┊       ┊ textToLayer() ┊        ┊                        ┊
    ┊                              ┊                    ┊         ┊ ┊       ┊               ┊        ┊  watchableValue        ┊
    ┊                              ┊     watchableValue ┊         ┊ ┊       ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛        ┊  ┊                     ┊
    ┊                              ┊     ┊              ┊         ┊ ┊                                ┊  ╞┄┄ currentTool       ┊
    ┊        ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄→ ╞┄ scratch<Layer>        ┊ ┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄→╞┄┄ currentCanvas     ┊
╒┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕    ┊     ╘┄ selection<Box>        ┊ ┊                                ┊  ╞┄┄ freeformCharacter ┊
┊                             ┊    ┊                              ┊ ┊                                ┊  ╞┄┄ selectedToolMode  ┊
┊      ╒┄┄┄┄┄┄┄┄┄┄┄┄╕         ┊    ┊     WatchableAdapter<Layer> :┊ ┊                                ┊  ╞┄┄ panning           ┊
┊      ┊ ILayerView ┊         ┊    ┊     ┊                        ┊ ┊                                ┊  ╞┄┄ altPressed        ┊
┊      ╘┄┄┄┄┄┄↑┄┄┄┄┄╛         ┊    ┊     ╞┄ persistentCommitted   ┊ ┊  ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕  ┊  ╞┄┄ currentCursor     ┊
┊     ╒┄┄┄┄┄┄┄╧┄┄┄┄┄┄┄╕       ┊    ┊     ╞┄ committed             ┊ ┊  ┊                          ┊  ┊  ╘┄┄ modifierKeys      ┊
┊ ╒┄┄┄╧┄┄┄┄┄╕ ╒┄┄┄┄┄┄┄╧┄┄┄╕   ┊    ┊     ╞┄ undoLayers            ┊ ┊  ┊  DrawingId               ┊  ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛
┊ ┊  Layer  ┊ ┊ LayerView ┊   ┊    ┊     ╘┄ redoLayers            ┊ ┊  ┊                          ┊  ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕
┊ ╘┄┄┄┄┄┄┄┄┄╛ ╘┄┄┄┄┄┄┄┄┄┄┄╛   ┊    ┊                              ┊ ┊  ┊  type: "local" | "share" ┊  ┊                        ┊
┊                             ┊    ┊   undo()                     ┊ ┊  ┊                          ┊  ┊ Persistent             ┊
┊                             ┊    ┊   redo()                     ┊ ┊  ┊  saveDrawing()    ┄┄┄┄┄┄┄┼┄→┊ ╒┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╕ ┊
┊  deserialize(value: string)┄┼··· ┼┄→ setScratchLayer(layer) ←┄┄┄╛ ┊  ┊                          ┊  ┊ ┊ localStorage       ┊ ┊
┊                             ┊    ┊   commitScratch()              ┊  ┊  deleteDrawing()┄┄┄┄┄┄┄┄┄┼┄┄┼→┊ ╞┄┄ getItem(key)   ┊ ┊
┊  apply(layer): [ldo, lundo] ┊    ┊   _route ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄→┊  renameDrawing()┄┄┄┄┄┄┄┄┄┼┄┄┼→┊ ╘┄┄ setItem(key)   ┊ ┊
┊                             ┊    ┊                                ┊  ┊                          ┊  ┊ ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛ ┊
╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛    ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛  ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛  ╘┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╛
ASCII Extended
┌──────────────────────────────────────────────────────────────────────────────────┐   ┌──────────────────────────────────────┐
│                                                                                  │   │                 ┌──────────┐         │
│                                    AsciiFlow Web App                             │   │                 │ DrawBox  ┼─────┐   │
│                                                                                  │   │                 └──────────┘     │   │
│ ┌────────────────────┐    ┌────────────────────────────────────────────────────┐ │   │                 ┌───────────┐    │   │
│ │ <Drawer>           │    │ <View> : (...) => <canvas>         ┌───────────────┴─┤   │                 │ DrawErase─┼────┤   │
│ │                    │    │  │                                 │ ┌─────────────┐ │   │                 └───────────┘    │   │
│ │ ┌───────────────┐  │    │  ├──useWatchable<T>(fn: () => T): T│ │ onTouchStart│ │   │                 ┌──────────────┐ │   │
│ │ │ <ToolControl> │  │    │  │   │                             │ ├─────────────┤ │   │                 │ DrawFreeform ┼─┤   │
│ │ └───────────────┘  │    │  │   └───trackUsedWatchables(fn)   │ │ onTouchMove │ │   │                 └──────────────┘ │   │
│ │ ┌────────────────┐ │    │  │                                 │ ├─────────────┤ │   │                 ┌──────────┐     │   │
│ │ │ <ShortcutChip> │ │    │  └──useEffect()                    │ │ onTouchEnd  │ │   │                 │ DrawLine ┼─────┤   │
│ │ └────────────────┘ │    │      │                             │ └─────────────┘ │   │                 └──────────┘     │   │
│ │ ┌────────────┐     │    │      └───render(canvas)            │                 │   │                 ┌──────────┐     │   │
│ │ │ <ToolHelp> │     │    │              ▲                     │ ┌─────────────┐ │   │                 │ DrawMove ┼─────┤   │
│ │ └────────────┘     │    │              │     Render the grid │ │ onMouseDown │ │   │                 └──────────┘     │   │
│ │                    │    │              │      ┌┬┬┬┬┬┬┬┬┬┬┬┐  │ ├─────────────┤ │   │                 ┌──────────┐     │   │
│ │ ┌────────────────┐ │    │              │      ├┼┼┼┼┼┼┼┼┼┼┼┤  │ │ onMouseUp   │ │   │                 │ DrawNull ┼─────┤   │
│ │ │ <ExportDialog> │ │    │              │      ├┼┼┼┼┼┼┼┼┼┼┼┤  │ ├─────────────┤ │   │  getCursor()    └──────────┘     │   │
│ │ │ useWatchable   │ │    │              │      ├┼┼┼┼┼┼┼┼┼┼┼┤  │ │ onWheel     │ │   │                 ┌────────────┐   │   │
│ │ │┌──────────────┐│ │    │          autorun()  ├┼┼┼┼┼┼┼┼┼┼┼┤  │ ├─────────────┤ │   │                 │ DrawSelect ┼───┤   │
│ │ ││ applyConfig()◄┼─┼─┐  │              ▲      ├┼┼┼┼┼┼┼┼┼┼┼┤  │ │ onMouseMove ├─┼───┼─────► move()    └────────────┘   │   │
│ │ │└──────────────┘│ │ │  │              │      ├┼┼┼┼┼┼┼┼┼┼┼┤  │ └─────────────┘ │   │                 ┌──────────┐     │   │
│ │ └───────▲────────┘ │ │  │              │      └┴┴┴┴┴┴┴┴┴┴┴┘  │ ┌──────────────┐│   │                 │ DrawText ├─────┤   │
│ └─────────┼──────────┘ │  └──────────────┼─────────────────────┤ │handleKeyDown ││   │                 └──────────┘     │   │
└───────────┼────────────┼─────────────────┼─────────────────────┤ │             ─┼┴───┼─►handleKey() ┌───────────────────▼──┐│
    ┌───────┘            │                 │         ┌───────────┘ │handleKeyPress││   │              │ AbstractDrawFunctio  ││
    │                    │                 │         │             └──────────────┘│   │              └───────────────────┬ ─┘│
    │    ┌───────────────┴─┐      ┌────────┴───────┐ │              handleKeyUp    │   │              ┌────────────────┐  │   │
    │    │  ICharacterSet  │      │ usedWatchables │ │                             │   │              │ IDrawFunction  ◄──┘   │
    │    └─▲───────────────┘      └────────▲───────┘ │              endAll() ──────┼───┼────► start() └────────────────┘      │
    │      │ ┌─────────────────────┐       │         │                             │   │                                      │
    │      ├─┤ Double Struck [NEW] │       │         │              startDraw() ───┼───┼──────► end()                         │
    │      │ └─────────────────────┘       │         │                             │   └────────────────────────┬─────────────┘
    │      │ ┌─────────────────────┐       │         │              startDrag()    │                            │              
    │      ├─┤ Dotted        [NEW] │       │         │                             │                            │              
    │      │ └─────────────────────┘       │         │     ┌───────────────────┐   │                            │              
    │      │ ┌─────────────────────┐       │         │ ┌─┬─┤ Controller        │◄──┼──── Keyboard Events        │              
    │      ├─┤ Strong Struck [NEW] │       │         │ │ │ └───────────────────┘   │                            │              
    │      │ └─────────────────────┘       │         │ │ │ ┌───────────────────┐   │                            │              
    │      │ ┌─────────────────────┐       │         │ │ └─┤ TouchController   │◄──┼─────── Touch Events        │              
    │      ├─┤ Strong Side   [NEW] │       │         │ │   └───────────────────┘   │                            │              
    │      │ └─────────────────────┘       │         │ │   ┌───────────────────┐   │                            │              
    │      │ ┌────────────────┐            │         │ └───┤ DesktopController │◄──┼─────── Mouse Events        │              
    │      ├─┤ ASCII Extended │            │         │     └───────────────────┘   │                            │              
    │      │ └────────────────┘            │         └─────────────────────────────┘                            │              
    │      │ ┌────────────────┐            │                                                  ┌── paste         │              
    │      └─┤ ASCII Basic    │            └────────────┐                   ┌───────────────┐ │                 ▼              
    │        └────────────────┘    ┌────────────────────┼───────────┐       │               │ │      ┌────────────────────────┐
    │                              │                    │         ┌─┼───────┼ layerToText() ├─┘      │  Store                 │
    │                              │   CanvasStore      │         │ │       │ textToLayer() │        │                        │
    │                              │                    │         │ │       │               │        │  watchableValue        │
    │                              │     watchableValue │         │ │       └───────────────┘        │  │                     │
    │                              │     │              │         │ │                                │  ├── currentTool       │
    │        ┌─────────────────────┼───► ├─ scratch<Layer>        │ ┼────────────────────────────────┼─►├── currentCanvas     │
┌───┼────────┼────────────────┐    │     └─ selection<Box>        │ │                                │  ├── freeformCharacter │
│                             │    │                              │ │                                │  ├── selectedToolMode  │
│      ┌────────────┐         │    │     WatchableAdapter<Layer> :│ │                                │  ├── panning           │
│      │ ILayerView │         │    │     │                        │ │                                │  ├── altPressed        │
│      └──────▲─────┘         │    │     ├─ persistentCommitted   │ │  ┌──────────────────────────┐  │  ├── currentCursor     │
│     ┌───────┴───────┐       │    │     ├─ committed             │ │  │                          │  │  └── modifierKeys      │
│ ┌───┴─────┐ ┌───────┴───┐   │    │     ├─ undoLayers            │ │  │  DrawingId               │  └────────────────────────┘
│ │  Layer  │ │ LayerView │   │    │     └─ redoLayers            │ │  │                          │  ┌────────────────────────┐
│ └─────────┘ └───────────┘   │    │                              │ │  │  type: "local" | "share" │  │                        │
│                             │    │   undo()                     │ │  │                          │  │ Persistent             │
│                             │    │   redo()                     │ │  │  saveDrawing()    ───────┼─►│ ┌────────────────────┐ │
│  deserialize(value: string)─┼··· ┼─► setScratchLayer(layer) ◄───┘ │  │                          │  │ │ localStorage       │ │
│                             │    │   commitScratch()              │  │  deleteDrawing()─────────┼──┼►│ ├── getItem(key)   │ │
│  apply(layer): [ldo, lundo] │    │   _route ──────────────────────┼─►│  renameDrawing()─────────┼──┼►│ └── setItem(key)   │ │
│                             │    │                                │  │                          │  │ └────────────────────┘ │
└─────────────────────────────┘    └────────────────────────────────┘  └──────────────────────────┘  └────────────────────────┘

Contributing

Installation

ASCIIFlow is built with Bazel. Bazel is most easily installed to the correct version through Bazelisk. See .bazelversion for the correct version if you aren't using Bazelisk.

npm install -g @bazel/bazelisk
yarn global add @bazel/bazelisk

For development, ibazel is also a very useful tool to help with automatic rebuilding and reloading.

npm install -g @bazel/ibazel
yarn global add @bazel/ibazel

Running ASCIIFlow locally

After installation of Bazel/Bazelisk, you can run ASCIIFlow locally with:

ibazel run client:devserver

Or without ibazel (won't do live reloading):

bazel run client:devserver

Packages

No packages published

Languages

  • TypeScript 89.5%
  • Starlark 5.4%
  • HTML 2.8%
  • JavaScript 1.3%
  • Other 1.0%