feat: switch text to UTF-8; add Unicode key events, dead keys & Czech layout; fix numpad navigation; add NumLock support
This commit is contained in:
1 parent
32660ddd1a
commit
2aa6360b3d
101 files changed
+3733
-1639
No files matched your search
+24
-10
@@ -10,6 +10,7 @@
|
||||
|
||||
#include <montauk/syscall.h>
|
||||
#include <montauk/string.h>
|
||||
#include <montauk/utf8.h>
|
||||
#include <http/http.hpp>
|
||||
|
||||
extern "C" {
|
||||
@@ -177,12 +178,23 @@ static int extract_json_string(const char* buf, int len, const char* key,
|
||||
else if (h >= 'A' && h <= 'F') val |= h - 'A' + 10;
|
||||
}
|
||||
p += 4;
|
||||
if (val < 128) out[j++] = (char)val;
|
||||
else if (val == 0x2013 || val == 0x2014) out[j++] = '-';
|
||||
else if (val == 0x2018 || val == 0x2019) out[j++] = '\'';
|
||||
else if (val == 0x201C || val == 0x201D) out[j++] = '"';
|
||||
else if (val == 0x2026) { out[j++] = '.'; out[j++] = '.'; out[j++] = '.'; }
|
||||
else out[j++] = '?';
|
||||
// The terminal renders UTF-8; join surrogate pairs
|
||||
if (val >= 0xD800 && val <= 0xDBFF && p + 6 < len &&
|
||||
buf[p + 1] == '\\' && buf[p + 2] == 'u') {
|
||||
unsigned lo = 0;
|
||||
for (int k = 3; k <= 6; k++) {
|
||||
char h = buf[p + k];
|
||||
lo <<= 4;
|
||||
if (h >= '0' && h <= '9') lo |= h - '0';
|
||||
else if (h >= 'a' && h <= 'f') lo |= h - 'a' + 10;
|
||||
else if (h >= 'A' && h <= 'F') lo |= h - 'A' + 10;
|
||||
}
|
||||
if (lo >= 0xDC00 && lo <= 0xDFFF) {
|
||||
val = 0x10000 + ((val - 0xD800) << 10) + (lo - 0xDC00);
|
||||
p += 6;
|
||||
}
|
||||
}
|
||||
j += montauk::utf8::encode(val, out + j);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -219,9 +231,12 @@ static int wrap_paragraph(const char* text, int textLen, int cols,
|
||||
const char* lastSpace = nullptr;
|
||||
int col = 0;
|
||||
|
||||
// One terminal column per UTF-8 character
|
||||
while (p < end && col < cols) {
|
||||
if (*p == ' ') lastSpace = p;
|
||||
p++;
|
||||
int n;
|
||||
montauk::utf8::decode(p, (int)(end - p), &n);
|
||||
p += n;
|
||||
col++;
|
||||
}
|
||||
|
||||
@@ -376,8 +391,7 @@ static void render_pager(WikiLine* lines, int totalLines, int scroll,
|
||||
int maxW = cols;
|
||||
if (ln.type == LINE_SECTION && ln.level > 2)
|
||||
maxW -= (ln.level - 2) * 2;
|
||||
int printLen = ln.len;
|
||||
if (printLen > maxW) printLen = maxW;
|
||||
int printLen = montauk::utf8::offset_of(ln.text, ln.len, maxW < 0 ? 0 : maxW);
|
||||
for (int c = 0; c < printLen; c++)
|
||||
sb_putc(ln.text[c]);
|
||||
|
||||
@@ -463,7 +477,7 @@ static void run_pager(WikiLine* lines, int totalLines, const char* title,
|
||||
case 'g': scroll = 0; break;
|
||||
case 'G': scroll = maxScroll; break;
|
||||
default:
|
||||
switch (ev.scancode) {
|
||||
switch (montauk::nav_scancode(ev)) {
|
||||
case 0x48: if (scroll > 0) scroll--; break; // Up
|
||||
case 0x50: if (scroll < maxScroll) scroll++; break; // Down
|
||||
case 0x49: scroll -= contentRows; if (scroll < 0) scroll = 0; break; // PgUp
|
||||
|
||||
Reference in new issue
Block a user