Add JS to render display
This commit is contained in:
parent
e951aacf35
commit
c3316e3086
10 changed files with 610 additions and 29 deletions
|
@ -1,29 +1,26 @@
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from bottle import Bottle, static_file, TEMPLATE_PATH, jinja2_view
|
||||||
|
from bottle_log import LoggingPlugin
|
||||||
|
from bottle_websocket import websocket, GeventWebSocketServer
|
||||||
|
from geventwebsocket.websocket import WebSocket
|
||||||
|
|
||||||
from buba.AppConfig import AppConfig
|
from buba.AppConfig import AppConfig
|
||||||
|
|
||||||
config = AppConfig()
|
config = AppConfig()
|
||||||
if config.debug:
|
if config.debug:
|
||||||
logging.basicConfig(level=logging.DEBUG)
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
|
||||||
|
|
||||||
app = Bottle()
|
app = Bottle()
|
||||||
if config.debug:
|
if config.debug:
|
||||||
app.config.update({"logging.level": "DEBUG"})
|
app.config.update({"logging.level": "DEBUG"})
|
||||||
app.install(LoggingPlugin(app.config))
|
app.install(LoggingPlugin(app.config))
|
||||||
TEMPLATE_PATH.insert(0, config.templatepath)
|
TEMPLATE_PATH.insert(0, config.templatepath)
|
||||||
app.install(BottleSessions())
|
|
||||||
auth = BottleOIDC(app, config={
|
|
||||||
"discovery_url": config.discovery_url,
|
|
||||||
"client_id": config.client_id,
|
|
||||||
"client_secret": config.client_secret,
|
|
||||||
"client_scope": config.oidc_scope,
|
|
||||||
"user_attr": config.oidc_user_attr,
|
|
||||||
})
|
|
||||||
|
|
||||||
websocket_clients = WebSocketClients()
|
|
||||||
bottle_helpers = BottleHelpers(auth, group=config.requires_group, allowed=config.allowed)
|
# websocket_clients = WebSocketClients()
|
||||||
update_poller = UpdatePoller(websocket_clients, ccujack, 1 if config.debug else 0.1)
|
# bottle_helpers = BottleHelpers(auth, group=config.requires_group, allowed=config.allowed)
|
||||||
|
# update_poller = UpdatePoller(websocket_clients, ccujack, 1 if config.debug else 0.1)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/static/<filepath>")
|
@app.route("/static/<filepath>")
|
||||||
|
@ -36,6 +33,7 @@ def server_static(filepath):
|
||||||
def root():
|
def root():
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run(host=config.listen_host, port=config.listen_port, server=GeventWebSocketServer, debug=config.debug,
|
app.run(host=config.listen_host, port=config.listen_port, server=GeventWebSocketServer, debug=config.debug,
|
||||||
quiet=not config.debug)
|
quiet=not config.debug)
|
||||||
|
|
427
buba/static/display.js
Normal file
427
buba/static/display.js
Normal file
|
@ -0,0 +1,427 @@
|
||||||
|
export default class {
|
||||||
|
constructor(container, config = {}) {
|
||||||
|
this.svgns = "http://www.w3.org/2000/svg";
|
||||||
|
this.config = Object.assign({
|
||||||
|
templateSvgUrl: "static/geascript-proportional.svg",
|
||||||
|
rows: 4,
|
||||||
|
cols: 180,
|
||||||
|
stripWidth: 0,
|
||||||
|
}, config);
|
||||||
|
console.log("Building display...");
|
||||||
|
this.container = container;
|
||||||
|
this.segmentsDom = undefined;
|
||||||
|
this.defineFont()
|
||||||
|
fetch(this.config.templateSvgUrl)
|
||||||
|
.then(res => res.blob())
|
||||||
|
.then(blob => blob.bytes())
|
||||||
|
.then(blob => {
|
||||||
|
let parser = new DOMParser();
|
||||||
|
this.segmentsDom = parser.parseFromString(new TextDecoder().decode(blob), 'image/svg+xml');
|
||||||
|
this.buildDisplay()
|
||||||
|
console.log("Done building display");
|
||||||
|
})
|
||||||
|
.catch(err => console.log(err));
|
||||||
|
}
|
||||||
|
|
||||||
|
buildDisplay() {
|
||||||
|
const svgTemplate = this.segmentsDom.getElementsByTagName("svg")[0];
|
||||||
|
const segmentsGroup = svgTemplate.getElementById("segments");
|
||||||
|
const segmentElements = Array.from(segmentsGroup.childNodes).filter(e => e.nodeType === Node.ELEMENT_NODE);
|
||||||
|
const viewBox = svgTemplate.getAttribute("viewBox").split(" ").map(x => parseFloat(x));
|
||||||
|
if (this.config.stripWidth === 0) {
|
||||||
|
this.config.stripWidth = viewBox[2];
|
||||||
|
}
|
||||||
|
for (var s of segmentElements) {
|
||||||
|
s.removeAttribute("style");
|
||||||
|
}
|
||||||
|
this.container.innerHTML = "";
|
||||||
|
for (let r = 1; r <= 4; r++) {
|
||||||
|
const rowDiv = document.createElement("div");
|
||||||
|
this.container.appendChild(rowDiv);
|
||||||
|
rowDiv.id = `geavision__row_${r}`
|
||||||
|
rowDiv.classList = "geavision geavision__row";
|
||||||
|
let rowSvg = document.createElementNS(this.svgns, "svg");
|
||||||
|
rowDiv.appendChild(rowSvg);
|
||||||
|
rowSvg.classList = "geavision geavision__row geavision__row_svg";
|
||||||
|
rowSvg.id = `geavision__row_${r}_svg`;
|
||||||
|
const width = this.config.stripWidth * this.config.cols
|
||||||
|
rowSvg.setAttribute("viewBox", `0 0 ${parseInt(width)} ${parseInt(viewBox[3])}`);
|
||||||
|
// rowSvg.setAttribute("width", "320");
|
||||||
|
// rowSvg.setAttribute("height", "15");
|
||||||
|
|
||||||
|
let rect = document.createElementNS(this.svgns, "rect");
|
||||||
|
for (let c = 1; c <= this.config.cols; c++) {
|
||||||
|
let g = document.createElementNS(this.svgns, "g");
|
||||||
|
rowSvg.appendChild(g);
|
||||||
|
g.id = `geavision__row_${r}_${c}`;
|
||||||
|
g.setAttribute("transform", `translate(${this.config.stripWidth * (c-1)} 0)`);
|
||||||
|
// segmentElements must be in the correct order in the SVG
|
||||||
|
for (let s = 1; s <= segmentElements.length; s++) {
|
||||||
|
const clone = segmentElements[s - 1].cloneNode(true);
|
||||||
|
g.appendChild(clone);
|
||||||
|
clone.id = `geavision__row_${r}_${c}_${s}`;
|
||||||
|
clone.classList = "gvsoff";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let c = 1
|
||||||
|
c += this.applyText(1, 1,"@ABCD DCBA")
|
||||||
|
}
|
||||||
|
|
||||||
|
applyCharacter(row, col, char) {
|
||||||
|
for (let c of this.font[char]) {
|
||||||
|
for (let s = 0; s < c.length; s++) {
|
||||||
|
const e = this.container.querySelector(`#geavision__row_${row}_${col}_${s+1}`)
|
||||||
|
if (e) {
|
||||||
|
e.classList = c[s] === '#' ? "gvson" : "gvsoff";
|
||||||
|
} else {
|
||||||
|
console.log(`Unable to find element #geavision__row_${row}_${col}_${s+1} for segment '${c}'`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
col++;
|
||||||
|
}
|
||||||
|
return this.font[char].length
|
||||||
|
}
|
||||||
|
|
||||||
|
applyText(row, col, text) {
|
||||||
|
for (let c of text) {
|
||||||
|
col += this.applyCharacter(row, col, c.codePointAt(0))
|
||||||
|
}
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
|
defineFont() {
|
||||||
|
let defs = []
|
||||||
|
// 0x00-0x0f
|
||||||
|
defs[0x00] = []
|
||||||
|
defs[0x01] = []
|
||||||
|
defs[0x02] = []
|
||||||
|
defs[0x03] = []
|
||||||
|
defs[0x04] = []
|
||||||
|
defs[0x05] = []
|
||||||
|
defs[0x06] = []
|
||||||
|
defs[0x07] = []
|
||||||
|
defs[0x08] = []
|
||||||
|
defs[0x09] = []
|
||||||
|
defs[0x0a] = []
|
||||||
|
defs[0x0b] = []
|
||||||
|
defs[0x0c] = []
|
||||||
|
defs[0x0d] = []
|
||||||
|
defs[0x0e] = []
|
||||||
|
defs[0x0f] = []
|
||||||
|
|
||||||
|
// 0x10-0x1f
|
||||||
|
defs[0x10] = []
|
||||||
|
defs[0x11] = []
|
||||||
|
defs[0x12] = []
|
||||||
|
defs[0x13] = []
|
||||||
|
defs[0x14] = []
|
||||||
|
defs[0x15] = []
|
||||||
|
defs[0x16] = []
|
||||||
|
defs[0x17] = []
|
||||||
|
defs[0x18] = []
|
||||||
|
defs[0x19] = []
|
||||||
|
defs[0x1a] = []
|
||||||
|
defs[0x1b] = []
|
||||||
|
defs[0x1c] = []
|
||||||
|
defs[0x1d] = []
|
||||||
|
defs[0x1e] = []
|
||||||
|
defs[0x1f] = []
|
||||||
|
|
||||||
|
// 0x20-0x2f
|
||||||
|
defs[0x20] = [
|
||||||
|
'...... ...... ...... ......'
|
||||||
|
]
|
||||||
|
defs[0x21] = []
|
||||||
|
defs[0x22] = []
|
||||||
|
defs[0x23] = []
|
||||||
|
defs[0x24] = []
|
||||||
|
defs[0x25] = []
|
||||||
|
defs[0x26] = []
|
||||||
|
defs[0x27] = []
|
||||||
|
defs[0x28] = []
|
||||||
|
defs[0x29] = []
|
||||||
|
defs[0x2a] = []
|
||||||
|
defs[0x2b] = []
|
||||||
|
defs[0x2c] = []
|
||||||
|
defs[0x2d] = []
|
||||||
|
defs[0x2e] = []
|
||||||
|
defs[0x2f] = []
|
||||||
|
|
||||||
|
// 0x30-0x3f
|
||||||
|
defs[0x30] = []
|
||||||
|
defs[0x31] = []
|
||||||
|
defs[0x32] = []
|
||||||
|
defs[0x33] = []
|
||||||
|
defs[0x34] = []
|
||||||
|
defs[0x35] = []
|
||||||
|
defs[0x36] = []
|
||||||
|
defs[0x37] = []
|
||||||
|
defs[0x38] = []
|
||||||
|
defs[0x39] = []
|
||||||
|
defs[0x3a] = []
|
||||||
|
defs[0x3b] = []
|
||||||
|
defs[0x3c] = []
|
||||||
|
defs[0x3d] = []
|
||||||
|
defs[0x3e] = []
|
||||||
|
defs[0x3f] = []
|
||||||
|
|
||||||
|
// 0x40-0x4f
|
||||||
|
defs[0x40] = [ // @
|
||||||
|
'...... .##### ###### ######',
|
||||||
|
'...... ###... ...... ....##',
|
||||||
|
'...... ###... .##### #.#.#.',
|
||||||
|
'...... ###... .#.... ##....',
|
||||||
|
'...... #.#### ###### ###...',
|
||||||
|
'...... ...... ...... ......'
|
||||||
|
]
|
||||||
|
defs[0x41] = [ // A
|
||||||
|
'.##### ###### ###### ###...',
|
||||||
|
'###... ...### #..... ......',
|
||||||
|
'#.#### ###### ###### ###...',
|
||||||
|
'...... ...... ...... ......'
|
||||||
|
]
|
||||||
|
defs[0x42] = [ // B
|
||||||
|
'###### ###### ###### ###...',
|
||||||
|
'###... ...### #..... ###...',
|
||||||
|
'#.#### #####. ###### ##....',
|
||||||
|
'...... ...... ...... ......'
|
||||||
|
]
|
||||||
|
defs[0x43] = [ // C
|
||||||
|
'.##### ###### ###### #.#...',
|
||||||
|
'###... ...... ...... ###...',
|
||||||
|
'#.#... ...... ...... ##....',
|
||||||
|
'...... ...... ...... ......'
|
||||||
|
]
|
||||||
|
defs[0x44] = [ // D
|
||||||
|
'###### ###### ###### ###...',
|
||||||
|
'###... ...... ...... ###...',
|
||||||
|
'#.#### ###### ###### ##....',
|
||||||
|
'...... ...... ...... ......'
|
||||||
|
]
|
||||||
|
defs[0x45] = []
|
||||||
|
defs[0x46] = []
|
||||||
|
defs[0x47] = []
|
||||||
|
defs[0x48] = []
|
||||||
|
defs[0x49] = []
|
||||||
|
defs[0x4a] = []
|
||||||
|
defs[0x4b] = []
|
||||||
|
defs[0x4c] = []
|
||||||
|
defs[0x4d] = []
|
||||||
|
defs[0x4e] = []
|
||||||
|
defs[0x4f] = []
|
||||||
|
|
||||||
|
// 0x50-0x5f
|
||||||
|
defs[0x50] = []
|
||||||
|
defs[0x51] = []
|
||||||
|
defs[0x52] = []
|
||||||
|
defs[0x53] = []
|
||||||
|
defs[0x54] = []
|
||||||
|
defs[0x55] = []
|
||||||
|
defs[0x56] = []
|
||||||
|
defs[0x57] = []
|
||||||
|
defs[0x58] = []
|
||||||
|
defs[0x59] = []
|
||||||
|
defs[0x5a] = []
|
||||||
|
defs[0x5b] = []
|
||||||
|
defs[0x5c] = []
|
||||||
|
defs[0x5d] = []
|
||||||
|
defs[0x5e] = []
|
||||||
|
defs[0x5f] = []
|
||||||
|
|
||||||
|
// 0x60-0x6f
|
||||||
|
defs[0x60] = []
|
||||||
|
defs[0x61] = []
|
||||||
|
defs[0x62] = []
|
||||||
|
defs[0x63] = []
|
||||||
|
defs[0x64] = []
|
||||||
|
defs[0x65] = []
|
||||||
|
defs[0x66] = []
|
||||||
|
defs[0x67] = []
|
||||||
|
defs[0x68] = []
|
||||||
|
defs[0x69] = []
|
||||||
|
defs[0x6a] = []
|
||||||
|
defs[0x6b] = []
|
||||||
|
defs[0x6c] = []
|
||||||
|
defs[0x6d] = []
|
||||||
|
defs[0x6e] = []
|
||||||
|
defs[0x6f] = []
|
||||||
|
|
||||||
|
// 0x70-0x7f
|
||||||
|
defs[0x70] = []
|
||||||
|
defs[0x71] = []
|
||||||
|
defs[0x72] = []
|
||||||
|
defs[0x73] = []
|
||||||
|
defs[0x74] = []
|
||||||
|
defs[0x75] = []
|
||||||
|
defs[0x76] = []
|
||||||
|
defs[0x77] = []
|
||||||
|
defs[0x78] = []
|
||||||
|
defs[0x79] = []
|
||||||
|
defs[0x7a] = []
|
||||||
|
defs[0x7b] = []
|
||||||
|
defs[0x7c] = []
|
||||||
|
defs[0x7d] = []
|
||||||
|
defs[0x7e] = []
|
||||||
|
defs[0x7f] = []
|
||||||
|
|
||||||
|
// 0x80-0x8f
|
||||||
|
defs[0x80] = []
|
||||||
|
defs[0x81] = []
|
||||||
|
defs[0x82] = []
|
||||||
|
defs[0x83] = []
|
||||||
|
defs[0x84] = []
|
||||||
|
defs[0x85] = []
|
||||||
|
defs[0x86] = []
|
||||||
|
defs[0x87] = []
|
||||||
|
defs[0x88] = []
|
||||||
|
defs[0x89] = []
|
||||||
|
defs[0x8a] = []
|
||||||
|
defs[0x8b] = []
|
||||||
|
defs[0x8c] = []
|
||||||
|
defs[0x8d] = []
|
||||||
|
defs[0x8e] = []
|
||||||
|
defs[0x8f] = []
|
||||||
|
|
||||||
|
// 0x90-0x9f
|
||||||
|
defs[0x90] = []
|
||||||
|
defs[0x91] = []
|
||||||
|
defs[0x92] = []
|
||||||
|
defs[0x93] = []
|
||||||
|
defs[0x94] = []
|
||||||
|
defs[0x95] = []
|
||||||
|
defs[0x96] = []
|
||||||
|
defs[0x97] = []
|
||||||
|
defs[0x98] = []
|
||||||
|
defs[0x99] = []
|
||||||
|
defs[0x9a] = []
|
||||||
|
defs[0x9b] = []
|
||||||
|
defs[0x9c] = []
|
||||||
|
defs[0x9d] = []
|
||||||
|
defs[0x9e] = []
|
||||||
|
defs[0x9f] = []
|
||||||
|
|
||||||
|
// 0xa0-0xaf
|
||||||
|
defs[0xa0] = []
|
||||||
|
defs[0xa1] = []
|
||||||
|
defs[0xa2] = []
|
||||||
|
defs[0xa3] = []
|
||||||
|
defs[0xa4] = []
|
||||||
|
defs[0xa5] = []
|
||||||
|
defs[0xa6] = []
|
||||||
|
defs[0xa7] = []
|
||||||
|
defs[0xa8] = []
|
||||||
|
defs[0xa9] = []
|
||||||
|
defs[0xaa] = []
|
||||||
|
defs[0xab] = []
|
||||||
|
defs[0xac] = []
|
||||||
|
defs[0xad] = []
|
||||||
|
defs[0xae] = []
|
||||||
|
defs[0xaf] = []
|
||||||
|
|
||||||
|
// 0xb0-0xbf
|
||||||
|
defs[0xb0] = []
|
||||||
|
defs[0xb1] = []
|
||||||
|
defs[0xb2] = []
|
||||||
|
defs[0xb3] = []
|
||||||
|
defs[0xb4] = []
|
||||||
|
defs[0xb5] = []
|
||||||
|
defs[0xb6] = []
|
||||||
|
defs[0xb7] = []
|
||||||
|
defs[0xb8] = []
|
||||||
|
defs[0xb9] = []
|
||||||
|
defs[0xba] = []
|
||||||
|
defs[0xbb] = []
|
||||||
|
defs[0xbc] = []
|
||||||
|
defs[0xbd] = []
|
||||||
|
defs[0xbe] = []
|
||||||
|
defs[0xbf] = []
|
||||||
|
|
||||||
|
// 0xc0-0xcf
|
||||||
|
defs[0xc0] = []
|
||||||
|
defs[0xc1] = []
|
||||||
|
defs[0xc2] = []
|
||||||
|
defs[0xc3] = []
|
||||||
|
defs[0xc4] = []
|
||||||
|
defs[0xc5] = []
|
||||||
|
defs[0xc6] = []
|
||||||
|
defs[0xc7] = []
|
||||||
|
defs[0xc8] = []
|
||||||
|
defs[0xc9] = []
|
||||||
|
defs[0xca] = []
|
||||||
|
defs[0xcb] = []
|
||||||
|
defs[0xcc] = []
|
||||||
|
defs[0xcd] = []
|
||||||
|
defs[0xce] = []
|
||||||
|
defs[0xcf] = []
|
||||||
|
|
||||||
|
// 0xd0-0xdf
|
||||||
|
defs[0xd0] = []
|
||||||
|
defs[0xd1] = []
|
||||||
|
defs[0xd2] = []
|
||||||
|
defs[0xd3] = []
|
||||||
|
defs[0xd4] = []
|
||||||
|
defs[0xd5] = []
|
||||||
|
defs[0xd6] = []
|
||||||
|
defs[0xd7] = []
|
||||||
|
defs[0xd8] = []
|
||||||
|
defs[0xd9] = []
|
||||||
|
defs[0xda] = []
|
||||||
|
defs[0xdb] = []
|
||||||
|
defs[0xdc] = []
|
||||||
|
defs[0xdd] = []
|
||||||
|
defs[0xde] = []
|
||||||
|
defs[0xdf] = []
|
||||||
|
|
||||||
|
// 0xe0-0xef
|
||||||
|
defs[0xe0] = []
|
||||||
|
defs[0xe1] = []
|
||||||
|
defs[0xe2] = []
|
||||||
|
defs[0xe3] = []
|
||||||
|
defs[0xe4] = []
|
||||||
|
defs[0xe5] = []
|
||||||
|
defs[0xe6] = []
|
||||||
|
defs[0xe7] = []
|
||||||
|
defs[0xe8] = []
|
||||||
|
defs[0xe9] = []
|
||||||
|
defs[0xea] = []
|
||||||
|
defs[0xeb] = []
|
||||||
|
defs[0xec] = []
|
||||||
|
defs[0xed] = []
|
||||||
|
defs[0xee] = []
|
||||||
|
defs[0xef] = []
|
||||||
|
|
||||||
|
// 0xf0-0xff
|
||||||
|
defs[0xf0] = []
|
||||||
|
defs[0xf1] = []
|
||||||
|
defs[0xf2] = []
|
||||||
|
defs[0xf3] = []
|
||||||
|
defs[0xf4] = []
|
||||||
|
defs[0xf5] = []
|
||||||
|
defs[0xf6] = []
|
||||||
|
defs[0xf7] = []
|
||||||
|
defs[0xf8] = []
|
||||||
|
defs[0xf9] = []
|
||||||
|
defs[0xfa] = []
|
||||||
|
defs[0xfb] = []
|
||||||
|
defs[0xfc] = []
|
||||||
|
defs[0xfd] = []
|
||||||
|
defs[0xfe] = []
|
||||||
|
defs[0xff] = []
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
this.font = []
|
||||||
|
for (let i = 0; i < 256; i++) {
|
||||||
|
if (defs[i] === undefined) {
|
||||||
|
this.font[i] = []
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
let f = []
|
||||||
|
for (let c of defs[i]) {
|
||||||
|
f.push(c.replace(/[^.#]/g, ""))
|
||||||
|
}
|
||||||
|
this.font[i] = f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
buba/static/favicon-32x32.png
Normal file
BIN
buba/static/favicon-32x32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 514 B |
|
@ -4,7 +4,7 @@
|
||||||
<svg
|
<svg
|
||||||
width="1.7mm"
|
width="1.7mm"
|
||||||
height="15.7mm"
|
height="15.7mm"
|
||||||
viewBox="0 0 1.7000001 15.699999"
|
viewBox="0 0 1.7000001 15.7"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg1"
|
id="svg1"
|
||||||
inkscape:version="1.4.2 (ebf0e940, 2025-05-08)"
|
inkscape:version="1.4.2 (ebf0e940, 2025-05-08)"
|
||||||
|
@ -38,14 +38,8 @@
|
||||||
id="defs1"/>
|
id="defs1"/>
|
||||||
<g
|
<g
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer2"
|
id="segments"
|
||||||
inkscape:label="Segments"><rect
|
inkscape:label="Segments">
|
||||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
|
||||||
id="seg22"
|
|
||||||
width="1.6688769"
|
|
||||||
height="1.0673051"
|
|
||||||
x="0.019799877"
|
|
||||||
y="12.866271" />
|
|
||||||
<path
|
<path
|
||||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
style="display:inline;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||||
d="M 0.01979999,1.4711941 V 0.0198 h 0.82232429 z"
|
d="M 0.01979999,1.4711941 V 0.0198 h 0.82232429 z"
|
||||||
|
@ -133,6 +127,13 @@
|
||||||
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||||
d="m 1.6820047,11.414717 v 1.451408 H 0.86041373 Z"
|
d="m 1.6820047,11.414717 v 1.451408 H 0.86041373 Z"
|
||||||
id="seg21"/>
|
id="seg21"/>
|
||||||
|
<rect
|
||||||
|
style="display:inline;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||||
|
id="seg22"
|
||||||
|
width="1.6688769"
|
||||||
|
height="1.0673051"
|
||||||
|
x="0.019799877"
|
||||||
|
y="12.866271"/>
|
||||||
<path
|
<path
|
||||||
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||||
d="M 1.688677,14.473684 V 13.933575 H 0.01979993 v 1.728568 h 0.8344386 z"
|
d="M 1.688677,14.473684 V 13.933575 H 0.01979993 v 1.728568 h 0.8344386 z"
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 9.3 KiB |
|
@ -1,7 +1,28 @@
|
||||||
svg.char {
|
#geavision-display {
|
||||||
width: 2em;
|
padding: 1em;
|
||||||
/*height: 10em;*/
|
background-color: #222;
|
||||||
stroke: #ccc;
|
}
|
||||||
stroke-width: .1;
|
|
||||||
fill: black;
|
div.geavision__row {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.geavision__row:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg.geavision__row {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
stroke: #222;
|
||||||
|
stroke-width: .01;
|
||||||
|
fill: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gvsoff {
|
||||||
|
fill: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gvson {
|
||||||
|
fill: #4f0;
|
||||||
}
|
}
|
7
buba/static/main.js
Normal file
7
buba/static/main.js
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import Display from "./display.js";
|
||||||
|
|
||||||
|
let container = document.getElementById("geavision-display");
|
||||||
|
if (container) {
|
||||||
|
const d = new Display(container);
|
||||||
|
// do more stuff
|
||||||
|
}
|
14
buba/templates/base.html.j2
Normal file
14
buba/templates/base.html.j2
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>{% block page_title %}{% endblock %}</title>
|
||||||
|
<meta name="viewport" content="width=device-width">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png">
|
||||||
|
<link rel=stylesheet type="text/css" href="static/main.css">
|
||||||
|
<script src="static/main.js" type="module"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>{{ self.page_title() }}</h1>
|
||||||
|
{% block page_body %}{% endblock %}
|
||||||
|
</body>
|
||||||
|
</html>
|
5
buba/templates/home.html.j2
Normal file
5
buba/templates/home.html.j2
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{% extends "base.html.j2" %}
|
||||||
|
{% block page_title %}CCCHH Buba{% endblock %}
|
||||||
|
{% block page_body %}
|
||||||
|
<div id="geavision-display">...</div>
|
||||||
|
{% endblock %}
|
106
poetry.lock
generated
106
poetry.lock
generated
|
@ -12,6 +12,21 @@ files = [
|
||||||
{file = "bottle-0.13.3.tar.gz", hash = "sha256:1c23aeb30aa8a13f39c60c0da494530ddd5de3da235bc431b818a50d999de49f"},
|
{file = "bottle-0.13.3.tar.gz", hash = "sha256:1c23aeb30aa8a13f39c60c0da494530ddd5de3da235bc431b818a50d999de49f"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bottle-log"
|
||||||
|
version = "1.0.0"
|
||||||
|
description = "Improved logging for Bottle."
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
groups = ["main"]
|
||||||
|
files = [
|
||||||
|
{file = "bottle-log-1.0.0.tar.gz", hash = "sha256:b5f03b8d64bfd577dea9b23d9cb999df078916be6951c5700644e14caa294f37"},
|
||||||
|
{file = "bottle_log-1.0.0-py2.py3-none-any.whl", hash = "sha256:c549e3d1e612b7b8e7ed0ab684676b94007e764b5789cbb2c3eda0d4ae78e2ff"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
bottle = ">=0.10.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bottle-websocket"
|
name = "bottle-websocket"
|
||||||
version = "0.2.9"
|
version = "0.2.9"
|
||||||
|
@ -255,6 +270,95 @@ files = [
|
||||||
docs = ["Sphinx", "furo"]
|
docs = ["Sphinx", "furo"]
|
||||||
test = ["objgraph", "psutil"]
|
test = ["objgraph", "psutil"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "jinja2"
|
||||||
|
version = "3.1.6"
|
||||||
|
description = "A very fast and expressive template engine."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
groups = ["main"]
|
||||||
|
files = [
|
||||||
|
{file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"},
|
||||||
|
{file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
MarkupSafe = ">=2.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
i18n = ["Babel (>=2.7)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "markupsafe"
|
||||||
|
version = "3.0.2"
|
||||||
|
description = "Safely add untrusted strings to HTML/XML markup."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.9"
|
||||||
|
groups = ["main"]
|
||||||
|
files = [
|
||||||
|
{file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"},
|
||||||
|
{file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"},
|
||||||
|
{file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pillow"
|
name = "pillow"
|
||||||
version = "11.2.1"
|
version = "11.2.1"
|
||||||
|
@ -496,4 +600,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"]
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.1"
|
lock-version = "2.1"
|
||||||
python-versions = ">=3.10,<4.0"
|
python-versions = ">=3.10,<4.0"
|
||||||
content-hash = "8fb2435ac6f9cfd75d27dbf3aeb8826077cdfe8a792ba03c25e07fadc6f2c22f"
|
content-hash = "d293c04556f191acb29cc8f27ed7f14ce989b097f93c1af920c443e26f439037"
|
||||||
|
|
|
@ -11,7 +11,11 @@ dependencies = [
|
||||||
"pyfis (>=1.13.0,<2.0.0)",
|
"pyfis (>=1.13.0,<2.0.0)",
|
||||||
"pillow (>=11.2.1,<12.0.0)",
|
"pillow (>=11.2.1,<12.0.0)",
|
||||||
"bottle (>=0.13.3,<0.14.0)",
|
"bottle (>=0.13.3,<0.14.0)",
|
||||||
"bottle-websocket (>=0.2.9,<0.3.0)"
|
"bottle-websocket (>=0.2.9,<0.3.0)",
|
||||||
|
"bottle-log (>=1.0.0,<2.0.0)",
|
||||||
|
"gevent-websocket (>=0.10.1,<0.11.0)",
|
||||||
|
"gevent (>=25.5.1,<26.0.0)",
|
||||||
|
"jinja2 (>=3.1.6,<4.0.0)"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue