From 05079f411a0d294fa416cc7709b9e4ccfb2f484f Mon Sep 17 00:00:00 2001 From: Fabien Cazenave Date: Mon, 25 Nov 2024 23:27:42 +0100 Subject: [PATCH 1/4] [analyzer] minor fixes --- kalamine/server.py | 10 ++++++++++ kalamine/www/demo.js | 2 +- kalamine/www/mjs/layout-analyzer.js | 8 ++++---- kalamine/www/mjs/stats-table.js | 26 +++++++++----------------- kalamine/www/mjs/stats.js | 26 +++++++++++--------------- kalamine/www/style.css | 4 ++++ 6 files changed, 39 insertions(+), 37 deletions(-) diff --git a/kalamine/server.py b/kalamine/server.py index 6a4258a..8fe2ccc 100644 --- a/kalamine/server.py +++ b/kalamine/server.py @@ -1,6 +1,7 @@ import threading import webbrowser from http.server import HTTPServer, SimpleHTTPRequestHandler +from importlib import metadata from pathlib import Path from xml.etree import ElementTree as ET @@ -40,6 +41,10 @@ def main_page(layout: KeyboardLayout, angle_mod: bool = False) -> str: +

+ kalamine + v{metadata.version('kalamine')}
🦆 +

Name
{layout_ref}
@@ -151,6 +156,11 @@ class LayoutHandler(SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs) -> None: # type: ignore kwargs["directory"] = str(Path(__file__).parent / "www") super().__init__(*args, **kwargs) + self.extensions_map = { + "json": "application/json", + "css": "text/css", + "js": "text/javascript", + } def do_GET(self) -> None: self.send_response(200) diff --git a/kalamine/www/demo.js b/kalamine/www/demo.js index 2353cae..c13f9b7 100644 --- a/kalamine/www/demo.js +++ b/kalamine/www/demo.js @@ -3,7 +3,7 @@ window.addEventListener('DOMContentLoaded', () => { const keyboard = document.querySelector('x-keyboard'); const input = document.querySelector('input'); - const geometry = document.querySelector('select'); + const geometry = document.querySelector('#geometry'); if (!keyboard.layout) { console.warn('web components are not supported'); diff --git a/kalamine/www/mjs/layout-analyzer.js b/kalamine/www/mjs/layout-analyzer.js index 12a7231..aa264fa 100644 --- a/kalamine/www/mjs/layout-analyzer.js +++ b/kalamine/www/mjs/layout-analyzer.js @@ -1,6 +1,6 @@ const substituteChars = { - '\u00a0': ' ', // ( ) no-break space - '\u202f': ' ', // ( ) narrow no-break space + '\u00a0': ' ', // no-break space + '\u202f': ' ', // narrow no-break space '\u00ab': '"', // («) left-pointing double angle quotation mark '\u00bb': '"', // (») right-pointing double angle quotation mark @@ -268,8 +268,8 @@ export function analyzeKeyboardLayout( }; const isScissor = (kc1, kc2, finger1, finger2) => { - var finger1Height = getKeyRow(kc1); - var finger2Height = getKeyRow(kc2); + let finger1Height = getKeyRow(kc1); + let finger2Height = getKeyRow(kc2); switch (finger1.at(1) + finger2.at(1)) { case '45': diff --git a/kalamine/www/mjs/stats-table.js b/kalamine/www/mjs/stats-table.js index c4aacf3..9218972 100644 --- a/kalamine/www/mjs/stats-table.js +++ b/kalamine/www/mjs/stats-table.js @@ -9,12 +9,12 @@ class StatsTable extends HTMLElement { super(); const shadow = this.attachShadow({ mode: 'open' }); - // Stupid hack to get the height of a 'tr' element + // Stupid hack to get the height of a 'tr' element (XXX not working) const tableRowElement = document.createElement('tr'); tableRowElement.innerHTML = 'random placeholder text'; shadow.appendChild(tableRowElement); this.maxHeightCollapsed = - this.maxLinesCollapsed * tableRowElement.offsetHeight; + Math.max(180, this.maxLinesCollapsed * tableRowElement.offsetHeight); // Actually build the content of the element (+ remove the stupid tr) shadow.innerHTML = ` @@ -48,13 +48,11 @@ class StatsTable extends HTMLElement { cursor: pointer; clip-path: polygon(50% 100%, 0% 0%, 100% 0%); } - button.showLess { + .showLess + button { clip-path: polygon(50% 0%, 0% 100%, 100% 100%); } -
`; @@ -64,17 +62,11 @@ class StatsTable extends HTMLElement { this.innerHTML = ''; // Remove original content // Setting up the `see more` button - // Using 'function' to set 'this' to the button (self is the web component) - const self = this; - shadow.querySelector('button').addEventListener('click', function () { - const wrapper = shadow.getElementById('wrapper'); - if (wrapper.style.maxHeight == `${self.maxHeightCollapsed}px`) { - wrapper.style.maxHeight = `${wrapper.children[0].offsetHeight}px`; - this.className = 'showLess'; - } else { - wrapper.style.maxHeight = `${self.maxHeightCollapsed}px`; - this.className = ''; - } + shadow.querySelector('button').addEventListener('click', () => { + wrapper.style.maxHeight = wrapper.className === '' + ? `${wrapper.children[0].offsetHeight}px` + : `${this.maxHeightCollapsed}px`; + wrapper.classList.toggle('showLess'); }); } @@ -84,7 +76,7 @@ class StatsTable extends HTMLElement { table.innerHTML = `${table.title}` + Object.entries(values) - .filter(([digram, freq]) => freq >= 10 ** -precision) + .filter(([_, freq]) => freq >= 10 ** -precision) .sort(([_, freq1], [__, freq2]) => freq2 - freq1) .map( ([digram, freq]) => diff --git a/kalamine/www/mjs/stats.js b/kalamine/www/mjs/stats.js index 884e4b8..8378bbe 100644 --- a/kalamine/www/mjs/stats.js +++ b/kalamine/www/mjs/stats.js @@ -1,14 +1,8 @@ -import { getSupportedChars, analyzeKeyboardLayout } from './layout-analyzer.js'; +import { analyzeKeyboardLayout } from './layout-analyzer.js'; window.addEventListener('DOMContentLoaded', () => { - const inputField = document.querySelector('input'); - const keyboard = document.querySelector('x-keyboard'); - - const headingColor = 'rgb(127, 127, 127)'; // getComputedStyle(document.querySelector('h3')).color; - + const keyboard = document.querySelector('x-keyboard'); let corpus = {}; - let keyChars = {}; - let impreciseData = false; // display a percentage value const fmtPercent = (num, p) => `${Math.round(10 ** p * num) / 10 ** p}%`; @@ -57,10 +51,7 @@ window.addEventListener('DOMContentLoaded', () => { }; const showReport = () => { - keyChars = getSupportedChars(keyboard.layout.keyMap, keyboard.layout.deadKeys); - const report = analyzeKeyboardLayout(keyboard, corpus, keyChars, headingColor); - console.log(corpus); - console.log(report); + const report = analyzeKeyboardLayout(keyboard, corpus); document.querySelector('#sfu stats-canvas').renderData({ values: report.totalSfuSkuPerFinger, @@ -82,7 +73,7 @@ window.addEventListener('DOMContentLoaded', () => { showPercentAll('#load small', report.loadGroups.map(sumUpBarGroup), 1); showPercent('#unsupported-all', report.totalUnsupportedChars, 3); - document.querySelector('#imprecise-data').hidden = !impreciseData; + document.querySelector('#imprecise-data').hidden = !report.impreciseData; document .querySelector('#bottlenecks stats-table') @@ -94,11 +85,16 @@ window.addEventListener('DOMContentLoaded', () => { document .getElementById('corpus') .addEventListener('change', event => { - fetch(`corpus/${event.target.value}.json`) + const corpusName = event.target.value; + const noCorpus = (corpusName === '-'); + document.getElementById('analyzer').hidden = noCorpus; + if (noCorpus) { + return; + } + fetch(`corpus/${corpusName}.json`) .then(response => response.json()) .then(data => { corpus = data; - document.getElementById('analyzer').hidden = false; showReport(); }); }); diff --git a/kalamine/www/style.css b/kalamine/www/style.css index fb596c9..8da2bd7 100644 --- a/kalamine/www/style.css +++ b/kalamine/www/style.css @@ -52,6 +52,10 @@ select { text-wrap: balance; } +#analyzer { + padding-bottom: 2em; +} + h2 { border-bottom: 1px dotted currentcolor; } From 7c8585933a68ac8e81c888bf8949ee13f51c060b Mon Sep 17 00:00:00 2001 From: Fabien Cazenave Date: Tue, 26 Nov 2024 00:49:01 +0100 Subject: [PATCH 2/4] bugfix: web server --- kalamine/server.py | 14 +++----------- kalamine/www/favicon.ico | Bin 0 -> 6341 bytes 2 files changed, 3 insertions(+), 11 deletions(-) create mode 100644 kalamine/www/favicon.ico diff --git a/kalamine/server.py b/kalamine/server.py index 8fe2ccc..fb3f7a7 100644 --- a/kalamine/server.py +++ b/kalamine/server.py @@ -156,18 +156,12 @@ class LayoutHandler(SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs) -> None: # type: ignore kwargs["directory"] = str(Path(__file__).parent / "www") super().__init__(*args, **kwargs) - self.extensions_map = { - "json": "application/json", - "css": "text/css", - "js": "text/javascript", - } def do_GET(self) -> None: - self.send_response(200) - def send( page: str, content: str = "text/plain", charset: str = "utf-8" ) -> None: + self.send_response(200) self.send_header("Content-type", f"{content}; charset={charset}") # no cash as one is likely working live on it self.send_header("Cache-Control", "no-cache, no-store, must-revalidate") @@ -180,9 +174,7 @@ def send( # XXX always reloads the layout on the root page, never in sub pages nonlocal kb_layout nonlocal angle_mod - if self.path == "/favicon.ico": - pass - elif self.path == "/json": + if self.path == "/json": send(web.pretty_json(kb_layout), content="application/json") elif self.path == "/keylayout": # send(keylayout.keylayout(kb_layout), content='application/xml') @@ -206,7 +198,7 @@ def send( kb_layout = KeyboardLayout(load_layout(file_path), angle_mod) # refresh send(main_page(kb_layout, angle_mod), content="text/html") else: - return SimpleHTTPRequestHandler.do_GET(self) + SimpleHTTPRequestHandler.do_GET(self) webserver = HTTPServer((host_name, webserver_port), LayoutHandler) thread = threading.Thread(None, webserver.serve_forever) diff --git a/kalamine/www/favicon.ico b/kalamine/www/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fecac3fa9aeaa195f5a0973a4b3c7b6c343beea7 GIT binary patch literal 6341 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 literal 0 HcmV?d00001 From eb45a473ec6ddc215cc41ab6a5ba9f6636b3e576 Mon Sep 17 00:00:00 2001 From: Fabien Cazenave Date: Tue, 26 Nov 2024 03:42:59 +0100 Subject: [PATCH 3/4] linter fixes --- kalamine/server.py | 2 +- kalamine/www/mjs/stats-canvas.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kalamine/server.py b/kalamine/server.py index fb3f7a7..ca1bf91 100644 --- a/kalamine/server.py +++ b/kalamine/server.py @@ -43,7 +43,7 @@ def main_page(layout: KeyboardLayout, angle_mod: bool = False) -> str:

kalamine - v{metadata.version('kalamine')}
🦆 + v{metadata.version('kalamine')}
\U0001f986

Name
diff --git a/kalamine/www/mjs/stats-canvas.js b/kalamine/www/mjs/stats-canvas.js index b65ad7e..07d94d6 100644 --- a/kalamine/www/mjs/stats-canvas.js +++ b/kalamine/www/mjs/stats-canvas.js @@ -71,7 +71,7 @@ class StatsCanvas extends HTMLElement { const scale = canvas.height / maxValue; - const renderBarPart = (groupIndex, columnIndex, column, flipVerically) => { + const renderBarPart = (groupIndex, columnIndex, column) => { let renderedBarHeight = 0; const colors = Object.entries(this.colors); From 448c49627c74126003eefe6476aebce942120788 Mon Sep 17 00:00:00 2001 From: Fabien Cazenave Date: Tue, 26 Nov 2024 04:34:13 +0100 Subject: [PATCH 4/4] corpus: University of Leipzig --- kalamine/server.py | 1 + kalamine/www/corpus/LICENSE | 17 ++++++++--------- .../fra_mixed-typical_2012_1M-sentences.json | 19 +------------------ 3 files changed, 10 insertions(+), 27 deletions(-) diff --git a/kalamine/server.py b/kalamine/server.py index ca1bf91..a72c00f 100644 --- a/kalamine/server.py +++ b/kalamine/server.py @@ -82,6 +82,7 @@ def main_page(layout: KeyboardLayout, angle_mod: bool = False) -> str: + diff --git a/kalamine/www/corpus/LICENSE b/kalamine/www/corpus/LICENSE index 27bf1b1..9c3458f 100644 --- a/kalamine/www/corpus/LICENSE +++ b/kalamine/www/corpus/LICENSE @@ -34,15 +34,14 @@ electronic works. Nearly all the individual works in the collection are in the public domain in the United States. If an individual work is unprotected by copyright law in the United States and you are located in the United States, we do not claim a right to prevent you from copying, distributing, performing, - displaying or creating derivative works based on the work as long as all - references to Project Gutenberg are removed. Of course, we hope that you - will support the Project Gutenberg-tm mission of promoting free access - to electronic works by freely sharing Project Gutenberg-tm works in - compliance with the terms of this agreement for keeping the Project - Gutenberg-tm name associated with the work. You can easily comply with - the terms of this agreement by keeping this work in the same format with - its attached full Project Gutenberg-tm License when you share it without - charge with others. +displaying or creating derivative works based on the work as long as all +references to Project Gutenberg are removed. Of course, we hope that you will +support the Project Gutenberg-tm mission of promoting free access to electronic +works by freely sharing Project Gutenberg-tm works in compliance with the terms +of this agreement for keeping the Project Gutenberg-tm name associated with the +work. You can easily comply with the terms of this agreement by keeping this +work in the same format with its attached full Project Gutenberg-tm License when +you share it without charge with others. [*] This particular work is one of the few individual works protected by copyright law in the United States and most of the remainder of the world, diff --git a/kalamine/www/corpus/fra_mixed-typical_2012_1M-sentences.json b/kalamine/www/corpus/fra_mixed-typical_2012_1M-sentences.json index bc29eef..8687fcf 100644 --- a/kalamine/www/corpus/fra_mixed-typical_2012_1M-sentences.json +++ b/kalamine/www/corpus/fra_mixed-typical_2012_1M-sentences.json @@ -86,7 +86,7 @@ "ä": 0.001, "=": 0.001 }, - "digrams": { + "bigrams": { "es": 2.5852, "le": 2.053, "on": 1.8595, @@ -793,9 +793,7 @@ "ln": 0.0014, "xy": 0.0014, "x?": 0.0013, - "â€": 0.0013, "ml": 0.0013, - "€™": 0.0013, "dû": 0.0013, "»,": 0.0013, "tn": 0.0013, @@ -873,7 +871,6 @@ "i ": 0.0009, "ït": 0.0009, "r:": 0.0009, - "œu": 0.0009, "kk": 0.0009, "-q": 0.0009, "k,": 0.0009, @@ -939,7 +936,6 @@ "ïc": 0.0006, "fp": 0.0006, "€.": 0.0006, - "™e": 0.0006, "à ": 0.0006, "cg": 0.0006, "fm": 0.0006, @@ -1064,7 +1060,6 @@ "©t": 0.0004, "td": 0.0004, "jd": 0.0004, - "™a": 0.0004, "œi": 0.0004, "x:": 0.0004, "dê": 0.0004, @@ -1118,7 +1113,6 @@ ".m": 0.0003, ".t": 0.0003, "m´": 0.0003, - "cœ": 0.0003, "y:": 0.0003, "nœ": 0.0003, "k!": 0.0003, @@ -1163,7 +1157,6 @@ "lj": 0.0003, "h!": 0.0003, "\"v": 0.0003, - "€.": 0.0003, "y!": 0.0003, "/k": 0.0003, "ür": 0.0003, @@ -1327,7 +1320,6 @@ "ón": 0.0001, "b:": 0.0001, "nî": 0.0001, - "'œ": 0.0001, "jr": 0.0001, "zs": 0.0001, "'ã": 0.0001, @@ -1434,7 +1426,6 @@ ",p": 0.0001, "k'": 0.0001, "xq": 0.0001, - "nœ": 0.0001, "gã": 0.0001, "&p": 0.0001, "rď": 0.0001, @@ -1488,7 +1479,6 @@ "ªm": 0.0001, "ïw": 0.0001, "wf": 0.0001, - "™ã": 0.0001, "\"?": 0.0001, "½t": 0.0001, "nï": 0.0001, @@ -1556,7 +1546,6 @@ "­s": 0.0001, "«t": 0.0001, "zw": 0.0001, - "™i": 0.0001, "äi": 0.0001, "sx": 0.0001, "lö": 0.0001, @@ -1618,7 +1607,6 @@ "vô": 0.0001, ",f": 0.0001, "är": 0.0001, - "™h": 0.0001, "é": 0.0001, "bœ": 0.0001, "§a": 0.0001, @@ -1638,7 +1626,6 @@ "ló": 0.0001, "qm": 0.0001, "éï": 0.0001, - "œi": 0.0001, ":m": 0.0001, "hg": 0.0001, "üc": 0.0001, @@ -1692,7 +1679,6 @@ "t(": 0.0001, "r­": 0.0001, "âi": 0.0001, - "™o": 0.0001, "´t": 0.0001, ">s": 0.0001, "“c": 0.0001, @@ -1718,7 +1704,6 @@ ":d": 0.0001, "lď": 0.0001, "m’": 0.0001, - "sœ": 0.0001, "l¹": 0.0001, ":b": 0.0001, "`u": 0.0001, @@ -4864,7 +4849,6 @@ "gyp": 0.001, "ww.": 0.001, "âgé": 0.001, - "’": 0.001, "oyo": 0.001, "arp": 0.001, "thl": 0.001, @@ -5828,7 +5812,6 @@ "d&r": 0.001, "iég": 0.001, "thy": 0.001, - "€™e": 0.001, "-hu": 0.001, "lch": 0.001, "mst": 0.001,