forked from kamo/exquisite-branch
Compare commits
17 Commits
Author | SHA1 | Date |
---|---|---|
km0 | 85087c9f56 | 6 months ago |
km0 | d9483f63b2 | 6 months ago |
km0 | 1c7b0deea3 | 3 years ago |
km0 | 758440312a | 3 years ago |
km0 | 6649bb23cd | 3 years ago |
km0 | 45efc91428 | 3 years ago |
km0 | 325fe7e332 | 3 years ago |
km0 | 0767c14eea | 3 years ago |
km0 | 3c95e10fd8 | 3 years ago |
km0 | 82326e203a | 3 years ago |
km0 | cb8e7b5110 | 3 years ago |
km0 | d28556aacb | 3 years ago |
km0 | 2d86221fa0 | 3 years ago |
km0 | 7a66713859 | 3 years ago |
km0 | f5c3d84bd5 | 3 years ago |
km0 | 276be13ffb | 3 years ago |
km0 | 92d027e9a1 | 3 years ago |
@ -0,0 +1,57 @@
|
|||||||
|
# Xquisite Branch
|
||||||
|
|
||||||
|
A branching version of the [exquisite corpse](https://en.wikipedia.org/wiki/Exquisite_corpse) game. A drawing app developed for [SI17](https://issue.xpub.nl/17/).
|
||||||
|
|
||||||
|
Draw something, upload it and send the link to someone else: they will continue from your drawing. But wait! There's a catch!!!!! If you send to just one person the chain will continue linearly, but send it to more people and things will start branching in different directions.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
Clone the repository.
|
||||||
|
```
|
||||||
|
git clone https://git.xpub.nl/kamo/exquisite-branch.git
|
||||||
|
```
|
||||||
|
|
||||||
|
Create a virtual environment.
|
||||||
|
```
|
||||||
|
python3 -m venv venv
|
||||||
|
```
|
||||||
|
|
||||||
|
Install the requirements with `pip` and the `requirements.txt` file.
|
||||||
|
```
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
Create an `.env` file in the root folder of the project with the following variables:
|
||||||
|
```
|
||||||
|
DEBUG=True
|
||||||
|
FLASK_ENV=development
|
||||||
|
FLASK_APP=exquisite_branch
|
||||||
|
```
|
||||||
|
|
||||||
|
Before running the app for the first time, be sure to initialize the database. __Watch out:__ this will delete the previous instance of the database along with its contents!
|
||||||
|
```
|
||||||
|
flask init-db
|
||||||
|
```
|
||||||
|
After initializing the database you can run the flask application
|
||||||
|
```
|
||||||
|
flask run
|
||||||
|
```
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
_Xquisite Branch_ saves contents in a database, and join them together in a branching version of the exquisite corpse.
|
||||||
|
|
||||||
|
The original exquisite corpse data structure is something similar to a linked list, where every drawing is connected to the previous one. Contents in _Xquisite Branch_ are saved in a database with the same principle.
|
||||||
|
|
||||||
|
Each entry in the database has the following properties:
|
||||||
|
|
||||||
|
- `id`: a unique identifier for every entry
|
||||||
|
- `branch`: a random name for the excerpt
|
||||||
|
- `parent`: the random name of the previous excerpt
|
||||||
|
- `content`: the actual content of the writings
|
||||||
|
- `username`: the author of the excerpt
|
||||||
|
|
||||||
|
When generating the display page, every entry look up its `parent` property to position itself after that.
|
||||||
|
|
||||||
|
Mhh should rewrite this better bc is super convoluted ahah.
|
||||||
|
|
@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
.container{
|
||||||
|
display: block;
|
||||||
|
padding: 2000px;
|
||||||
|
}
|
||||||
|
.streams {
|
||||||
|
overflow-x: auto;
|
||||||
|
overflow-y: hidden;
|
||||||
|
position: relative;
|
||||||
|
width: 500px;
|
||||||
|
height: 500px;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stream {
|
||||||
|
white-space: nowrap;
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 500px;
|
||||||
|
height: 500px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.svg-container {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.author {
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
bottom: 50px;
|
||||||
|
font-size: 1rem;
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.branches {
|
||||||
|
overflow-x: auto;
|
||||||
|
overflow-y: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.branch {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.branch svg {
|
||||||
|
border-top: 1px solid currentColor;
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Exquisite Branch</title>
|
||||||
|
<link rel="stylesheet" href="${url_for('static', filename='css/variables.css')}" />
|
||||||
|
<link rel="stylesheet" href="${url_for('static', filename='css/global.css')}" />
|
||||||
|
|
||||||
|
<%block name='head' %></%block>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav>
|
||||||
|
<%block name='nav' >
|
||||||
|
<a href="${url_for('home.home')}">Home</a>
|
||||||
|
<a href="${url_for('display.display')}">Results</a>
|
||||||
|
</%block>
|
||||||
|
</nav>
|
||||||
|
${self.body()}
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<%inherit file="base_mako.html" />
|
||||||
|
|
||||||
|
|
||||||
|
<%block name="head">
|
||||||
|
<link rel="stylesheet" href="${url_for('static', filename='css/display_mako.css')}">
|
||||||
|
</%block>
|
||||||
|
|
||||||
|
|
||||||
|
<main class="container">
|
||||||
|
|
||||||
|
|
||||||
|
<% from random import random %>
|
||||||
|
<% from collections import defaultdict %>
|
||||||
|
<% transform = {'NEW': ''} %>
|
||||||
|
<% visited = defaultdict(int) %>
|
||||||
|
|
||||||
|
<div class="stream">
|
||||||
|
|
||||||
|
% for branch in branches:
|
||||||
|
|
||||||
|
|
||||||
|
<% visited[branch['parent']] += 1 %>
|
||||||
|
|
||||||
|
|
||||||
|
% if visited[branch['parent']] > 1:
|
||||||
|
<% steer = (random() - 0.5) * 0.25 %>
|
||||||
|
% else:
|
||||||
|
<% steer = 0 %>
|
||||||
|
% endif
|
||||||
|
|
||||||
|
|
||||||
|
<% transform[branch['branch']] = f'{transform[branch["parent"]]} rotate({random() * 0.04 + steer}turn) translateX(100%)' %>
|
||||||
|
|
||||||
|
<div class="svg-container" style="transform: ${transform[branch['parent']]}">
|
||||||
|
<a href="${url_for('draw.draw', parent=branch['branch'], _external=True, _scheme='https')}" target="__blank">
|
||||||
|
${branch['content']}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
% endfor
|
||||||
|
</div>
|
||||||
|
</main>
|
@ -0,0 +1,18 @@
|
|||||||
|
<%inherit file="base_mako.html" />
|
||||||
|
|
||||||
|
<%block name="head">
|
||||||
|
<link rel="stylesheet" href="${url_for('static', filename='css/display_mako.css')}">
|
||||||
|
</%block>
|
||||||
|
|
||||||
|
<% from random import random %>
|
||||||
|
<% offset = 1 / (len(streams) + 1)%>
|
||||||
|
|
||||||
|
% for stream in streams:
|
||||||
|
<div class="stream">
|
||||||
|
<% transform = f'rotate({offset * loop.index}turn) translateX(100%) ' %>
|
||||||
|
% for branch in stream:
|
||||||
|
<% transform = transform + ' rotate(' + str((random() * 2 - 1) * 0.02) + 'turn) translateX(100%)'%>
|
||||||
|
<div class="svg-container" style="transform: ${transform}">${branch['content']}</div>
|
||||||
|
% endfor
|
||||||
|
</div>
|
||||||
|
% endfor
|
@ -0,0 +1,15 @@
|
|||||||
|
autopep8==1.6.0
|
||||||
|
click==8.0.3
|
||||||
|
colorama==0.4.4
|
||||||
|
-e git+https://git.xpub.nl/kamo/exquisite-branch.git@ae185baf0c048ac5f9171314ea5e842362b99dcd#egg=exquisite_branch
|
||||||
|
Flask==2.0.2
|
||||||
|
Flask-Mako==0.4
|
||||||
|
itsdangerous==2.0.1
|
||||||
|
Jinja2==3.0.3
|
||||||
|
Mako==1.2.0
|
||||||
|
MarkupSafe==2.0.1
|
||||||
|
pycodestyle==2.8.0
|
||||||
|
python-dotenv==0.19.2
|
||||||
|
shortuuid==1.0.8
|
||||||
|
toml==0.10.2
|
||||||
|
Werkzeug==2.0.3
|
Loading…
Reference in New Issue