From 23de19b63ecd134991aaa0b4817f43a7c7279309 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Mon, 9 Jun 2025 17:26:25 +0200 Subject: [PATCH] CSS and home page --- assets/favicon.ico | Bin 0 -> 15406 bytes assets/simple.min.css | 1 + build.c | 14 +++++++++++-- main.c | 45 ++++++++++++++++++++++++++++++++++++++---- tmpls/404.t | 10 ---------- tmpls/index.t | 45 ++++++++++++++++++++++++++++++++++++++++++ tmpls/page-missing.t | 16 +++++++++++++++ 7 files changed, 115 insertions(+), 16 deletions(-) create mode 100644 assets/favicon.ico create mode 100644 assets/simple.min.css delete mode 100644 tmpls/404.t create mode 100644 tmpls/index.t create mode 100644 tmpls/page-missing.t diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4ecc66395a33d6ae0ada7129a579886e28bfe9b2 GIT binary patch literal 15406 zcmeHN*-sQn81K#QAK*UhJ5L)QecI=J@V*c))E8FKWHm7w?<3-E)Of@geK3kgM59rI z#&`r65O=r-cR*wWVIA(_7#J7^1_r+EU-eec*u&6W!wewXUs6-uRo_)#e^d3g5yQbL0AKKo}$N|)Q_%=xeXS4k@PMUrOAI5LS$p|s1@m@s#4 z7R{uRo!vqi8FgV}x_`fpa&ue5+O=apfBqviHF?AE8XLWI;X+kdyOusFDVK(aM<_Mb zs^V_iWTil0gjTN1Q`@w3q3>m7oz&kyOdgM)6+D-hcNwAupUam&QA2~5Hg7Iq#p(3Y zl`GYT>DR1z$Mj83en)H9D$l4xb<}&d+uckL=u%PP7NQ03Yu6l9T--rLMIChgxNkO0y^Gt$VewPd8r%3QU+sM>?W~~v^@q6C9 zSwpR@KB}whrTO#q?F}5@g68hs@byk~j5~Lh5{F&8N_FSUQ2c%SY`XY*`plb`MO|Hk zOob;;zUuOO{P-)w#TvO_LAEZwo_zGbc+tpswzTx?@@s19XSlClH|gRUkqsQ!k;9fP z1rhmTUFUG<(1(b4M&)um*b(*w+`e5Kk?*ZrwG7AW9il~xVq<%*!<#qFj5pS8#9U() z^Z^j-ak^O5hYx>Xyp8-EJ^FXd<-?v{uQEQwtEW#_d{ZozR;HTI7oa6ea$+tYcFf69 zWFQXJ+O@Q_lgZD^YYXes;zs*^{J5RTKpdTzn5)WJzT84XLnEy3)Ts)!Jz6=D=wR1@ zfdG>O`*S?V1o-^{TDHuhw)6g2*6-iDn5@t}3;*_3YkOQ}V;pDBR5JPS#f1yAS;7Au zaQ19v+~p@G2EX;egXQYni0{8*MbIZ=X>%^%TapE_B=b4f`@+{e!Kzyir9b3i=1FFrf17ib`Atn9Fnz%E0Wlxgv7>~l zt9!`d@K9A%Hyt|`eNF}Wn952w;{|?cY0>jC`W@G;%cqWx0k%cK9tk(-8g}Li*+WACf=`L^NKGwZc^&Y;e)rCuFNB=5D4%HXckeD!bKj8v@L|2M-1KxM zCkuMyYz`bK7v>R-?w~=w41U9*t<5Ja8+l$1E|*Wv`^7iErX4Hp2ZX}*?Zt-2uyt!; zC@H;s8M`w9t)7wIF;~EEIb>!!4eJkoyLvwRKA>XSA!llTAjaw|lNq48Q~W`o+tai+T7wyj8ASAD)=3iXe)v=8bWh4aK%++T_HcyW&u zu>k;cJH7|}3UN~C8WHV&E!O&K`DypFSeG%kBBm=XRnAp0F6@`%b&o--lju9n`}kdx zo*ut^r?-IZjoohLo)Xq)+!q$*J6ZTCDSr{}GI1Y*t|v~|)fm<7_S43V!F$S+rI(1D z!oqf@KYkDky?v|P55ha{6;IY4T}0$nbx#2O5m!%#SXrxQq<5@kSy|0&-pAaJ m=g@c}5}nyTIr&G^&ZeDBA25Bu^nt1O0r`5638n?2w!ptQc@v)i literal 0 HcmV?d00001 diff --git a/assets/simple.min.css b/assets/simple.min.css new file mode 100644 index 0000000..c7513b0 --- /dev/null +++ b/assets/simple.min.css @@ -0,0 +1 @@ +:root{--sans-font:-apple-system,BlinkMacSystemFont,"Avenir Next",Avenir,"Nimbus Sans L",Roboto,"Noto Sans","Segoe UI",Arial,Helvetica,"Helvetica Neue",sans-serif;--mono-font:Consolas,Menlo,Monaco,"Andale Mono","Ubuntu Mono",monospace;--standard-border-radius:5px;--border-width:1px;--bg:#fff;--accent-bg:#f5f7ff;--text:#212121;--text-light:#585858;--border:#898ea4;--accent:#0d47a1;--accent-hover:#1266e2;--accent-text:var(--bg);--code:#d81b60;--preformatted:#444;--marked:#fd3;--disabled:#efefef}@media (prefers-color-scheme:dark){:root{color-scheme:dark;--bg:#212121;--accent-bg:#2b2b2b;--text:#dcdcdc;--text-light:#ababab;--accent:#ffb300;--accent-hover:#ffe099;--accent-text:var(--bg);--code:#f06292;--preformatted:#ccc;--disabled:#111}img,video{opacity:.8}}*,:before,:after{box-sizing:border-box}textarea,select,input,progress{-webkit-appearance:none;-moz-appearance:none;appearance:none}html{font-family:var(--sans-font);scroll-behavior:smooth}body{color:var(--text);background-color:var(--bg);grid-template-columns:1fr min(45rem,90%) 1fr;margin:0;font-size:1.15rem;line-height:1.5;display:grid}body>*{grid-column:2}body>header{background-color:var(--accent-bg);border-bottom:var(--border-width)solid var(--border);text-align:center;grid-column:1/-1;padding:0 .5rem 2rem}body>header>:only-child{margin-block-start:2rem}body>header h1{max-width:1200px;margin:1rem auto}body>header p{max-width:40rem;margin:1rem auto}main{padding-top:1.5rem}body>footer{color:var(--text-light);text-align:center;border-top:var(--border-width)solid var(--border);margin-top:4rem;padding:2rem 1rem 1.5rem;font-size:.9rem}h1{font-size:3rem}h2{margin-top:3rem;font-size:2.6rem}h3{margin-top:3rem;font-size:2rem}h4{font-size:1.44rem}h5{font-size:1.15rem}h6{font-size:.96rem}p{margin:1.5rem 0}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}h1,h2,h3{line-height:1.1}@media only screen and (width<=720px){h1{font-size:2.5rem}h2{font-size:2.1rem}h3{font-size:1.75rem}h4{font-size:1.25rem}}a,a:visited{color:var(--accent)}a:hover{text-decoration:none}button,.button,a.button,input[type=submit],input[type=reset],input[type=button]{border:var(--border-width)solid var(--accent);background-color:var(--accent);color:var(--accent-text);padding:.5rem .9rem;line-height:normal;text-decoration:none}.button[aria-disabled=true],input:disabled,textarea:disabled,select:disabled,button[disabled]{cursor:not-allowed;background-color:var(--disabled);border-color:var(--disabled);color:var(--text-light)}input[type=range]{padding:0}abbr[title]{cursor:help;text-decoration-line:underline;text-decoration-style:dotted}button:enabled:hover,.button:not([aria-disabled=true]):hover,input[type=submit]:enabled:hover,input[type=reset]:enabled:hover,input[type=button]:enabled:hover{background-color:var(--accent-hover);border-color:var(--accent-hover);cursor:pointer}.button:focus-visible,button:focus-visible:where(:enabled),input:enabled:focus-visible:where([type=submit],[type=reset],[type=button]){outline:2px solid var(--accent);outline-offset:1px}header nav{padding:1rem 0 0;font-size:1rem;line-height:2}header nav ul,header nav ol{flex-flow:wrap;place-content:space-around center;align-items:center;margin:0;padding:0;list-style-type:none;display:flex}header nav ul li,header nav ol li{display:inline-block}header nav a,header nav a:visited{border:var(--border-width)solid var(--border);border-radius:var(--standard-border-radius);color:var(--text);margin:0 .5rem 1rem;padding:.1rem 1rem;text-decoration:none;display:inline-block}header nav a:hover,header nav a.current,header nav a[aria-current=page],header nav a[aria-current=true]{border-color:var(--accent);color:var(--accent);cursor:pointer}@media only screen and (width<=720px){header nav a{border:none;padding:0;line-height:1;text-decoration:underline}}aside,details,pre,progress{background-color:var(--accent-bg);border:var(--border-width)solid var(--border);border-radius:var(--standard-border-radius);margin-bottom:1rem}aside{float:right;width:30%;margin-inline-start:15px;padding:0 15px;font-size:1rem}[dir=rtl] aside{float:left}@media only screen and (width<=720px){aside{float:none;width:100%;margin-inline-start:0}}article,fieldset,dialog{border:var(--border-width)solid var(--border);border-radius:var(--standard-border-radius);margin-bottom:1rem;padding:1rem}article h2:first-child,section h2:first-child,article h3:first-child,section h3:first-child{margin-top:1rem}section{border-top:var(--border-width)solid var(--border);border-bottom:var(--border-width)solid var(--border);margin:3rem 0;padding:2rem 1rem}section+section,section:first-child{border-top:0;padding-top:0}section+section{margin-top:0}section:last-child{border-bottom:0;padding-bottom:0}details{padding:.7rem 1rem}summary{cursor:pointer;word-break:break-all;margin:-.7rem -1rem;padding:.7rem 1rem;font-weight:700}details[open]>summary+*{margin-top:0}details[open]>summary{margin-bottom:.5rem}details[open]>:last-child{margin-bottom:0}table{border-collapse:collapse;margin:1.5rem 0}figure>table{width:max-content;margin:0}td,th{border:var(--border-width)solid var(--border);text-align:start;padding:.5rem}th{background-color:var(--accent-bg);font-weight:700}tr:nth-child(2n){background-color:var(--accent-bg)}table caption{margin-bottom:.5rem;font-weight:700}textarea,select,input,button,.button{font-size:inherit;border-radius:var(--standard-border-radius);box-shadow:none;max-width:100%;margin-bottom:.5rem;padding:.5em;font-family:inherit;display:inline-block}textarea,select,input{color:var(--text);background-color:var(--bg);border:var(--border-width)solid var(--border)}label{display:block}textarea:not([cols]){width:100%}select:not([multiple]){background-image:linear-gradient(45deg,transparent 49%,var(--text)51%),linear-gradient(135deg,var(--text)51%,transparent 49%);background-position:calc(100% - 15px),calc(100% - 10px);background-repeat:no-repeat;background-size:5px 5px,5px 5px;padding-inline-end:25px}[dir=rtl] select:not([multiple]){background-position:10px,15px}input[type=checkbox],input[type=radio]{vertical-align:middle;width:min-content;position:relative}input[type=checkbox]+label,input[type=radio]+label{display:inline-block}input[type=radio]{border-radius:100%}input[type=checkbox]:checked,input[type=radio]:checked{background-color:var(--accent)}input[type=checkbox]:checked:after{content:" ";border-right:solid var(--bg).08em;border-bottom:solid var(--bg).08em;background-color:#0000;border-radius:0;width:.2em;height:.4em;font-size:1.8em;position:absolute;top:.04em;left:.18em;transform:rotate(45deg)}input[type=radio]:checked:after{content:" ";background-color:var(--bg);border-radius:100%;width:.3em;height:.3em;font-size:1.8em;position:absolute;top:.125em;left:.125em}@media only screen and (width<=720px){textarea,select,input{width:100%}}input[type=color]{height:2.5rem;padding:.2rem}input[type=file]{border:0}hr{height:var(--border-width);background:var(--border);border:none;margin:1rem auto}mark{border-radius:var(--standard-border-radius);background-color:var(--marked);color:#000;padding:2px 5px}mark a{color:#0d47a1}img,video{border-radius:var(--standard-border-radius);max-width:100%;height:auto}figure{margin:0;display:block;overflow-x:auto}figure>img,figure>picture>img{margin-inline:auto;display:block}figcaption{text-align:center;color:var(--text-light);margin-block:1rem;font-size:.9rem;position:sticky;left:0}blockquote{border-inline-start:.35rem solid var(--accent);color:var(--text-light);margin-block:2rem;margin-inline:2rem 0;padding:.4rem .8rem;font-style:italic}cite{color:var(--text-light);font-size:.9rem;font-style:normal}dt{color:var(--text-light)}code,pre,pre span,kbd,samp{font-family:var(--mono-font);color:var(--code)}kbd{color:var(--preformatted);border:var(--border-width)solid var(--preformatted);border-bottom:3px solid var(--preformatted);border-radius:var(--standard-border-radius);padding:.1rem .4rem}pre{max-width:100%;color:var(--preformatted);padding:1rem 1.4rem;overflow:auto}pre code{color:var(--preformatted);background:0 0;margin:0;padding:0}progress{width:100%}progress:indeterminate{background-color:var(--accent-bg)}progress::-webkit-progress-bar{border-radius:var(--standard-border-radius);background-color:var(--accent-bg)}progress::-webkit-progress-value{border-radius:var(--standard-border-radius);background-color:var(--accent)}progress::-moz-progress-bar{border-radius:var(--standard-border-radius);background-color:var(--accent);transition-property:width;transition-duration:.3s}progress:indeterminate::-moz-progress-bar{background-color:var(--accent-bg)}dialog{background-color:var(--bg);max-width:40rem;margin:auto}dialog::backdrop{background-color:var(--bg);opacity:.8}@media only screen and (width<=720px){dialog{max-width:calc(100vw - 2rem)}}sup,sub{vertical-align:baseline;position:relative}sup{top:-.4em}sub{top:.3em}.notice{background:var(--accent-bg);border:var(--border-width)solid var(--border);border-radius:var(--standard-border-radius);margin:2rem 0;padding:1.5rem}@media print{@page{margin:1cm}body{display:block}body>header{background-color:unset}body>header nav,body>footer{display:none}article{border:none;padding:0}a[href^=http]:after{content:" <" attr(href)">"}abbr[title]:after{content:" (" attr(title)")"}a{text-decoration:none}p{widows:3;orphans:3}hr{border-top:var(--border-width)solid var(--border)}mark{border:var(--border-width)solid var(--border)}pre,table,figure,img,svg{break-inside:avoid}pre code{white-space:pre-wrap}} \ No newline at end of file diff --git a/build.c b/build.c index f439720..7c21d4a 100644 --- a/build.c +++ b/build.c @@ -4,6 +4,8 @@ char *prog = NULL; +#define DEBUG 1 + int main(int argc, char ** argv) { rebuild_self(argc, argv, "cc", "-o", "build", "build.c"); @@ -13,14 +15,22 @@ int main(int argc, char ** argv) if (strcmp(cmd, "make") == 0) { RULE("./aboba", "./main.c", "./mongoose.o", "./gpp1") { RULE("./mongoose.o", "./mongoose/mongoose.c") { - CMD("cc", "-c", "-o", "./mongoose.o", "./mongoose/mongoose.c"); + #if DEBUG + CMD("cc", "-ggdb", "-c", "-o", "./mongoose.o", "./mongoose/mongoose.c"); + #else + CMD("cc", "-c", "-o", "./mongoose.o", "./mongoose/mongoose.c"); + #endif } RULE("./gpp1", "./gpp/gpp.c") { CMD("cc", "-DHAVE_STRDUP", "-DHAVE_FNMATCH_H", "-o", "gpp1", "gpp/gpp.c"); } - CMD("cc", "-o", "./aboba", "./main.c", "./mongoose.o"); + #if DEBUG + CMD("cc", "-ggdb", "-o", "./aboba", "./main.c", "./mongoose.o"); + #else + CMD("cc", "-o", "./aboba", "./main.c", "./mongoose.o"); + #endif } } else if (strcmp(cmd, "clean") == 0) { remove1("./build"); diff --git a/main.c b/main.c index a1cb0a1..313f929 100644 --- a/main.c +++ b/main.c @@ -1,3 +1,4 @@ +#include #define GEBS_NO_PREFIX #define GEBS_IMPLEMENTATION #include "gebs/gebs.h" @@ -18,7 +19,10 @@ void event_handler(struct mg_connection *conn, int ev, void *ev_data) { if (ev == MG_EV_HTTP_MSG) { struct mg_http_message *msg = (struct mg_http_message *)ev_data; - Route_Handler handler = hmget(route_hashtable, msg->uri.buf); + + char key[MG_PATH_MAX] = {0}; + strncpy(key, msg->uri.buf, msg->uri.len); + Route_Handler handler = shget(route_hashtable, key); handler(conn, msg); } } @@ -50,7 +54,36 @@ void handle_page_not_found(struct mg_connection *conn, struct mg_http_message *m String_Builder out = {0}; defer { sb_free(&out); } - bool ok = gpp1("./tmpls/404.t", &env, &out); + bool ok = gpp1("./tmpls/page-missing.t", &env, &out); + sb_finish(&out); + + if (!ok) { + mg_http_reply(conn, 500, "Content-Type: text/html\r\n", "Internal server error ;("); + } else { + mg_http_reply(conn, 200, "Content-Type: text/html\r\n", out.items); + } +} + +void handle_simple_css(struct mg_connection *conn, struct mg_http_message *msg) +{ + struct mg_http_serve_opts opts = { 0 }; + mg_http_serve_file(conn, msg, "./assets/simple.min.css", &opts); +} + +void handle_favicon(struct mg_connection *conn, struct mg_http_message *msg) +{ + struct mg_http_serve_opts opts = { 0 }; + mg_http_serve_file(conn, msg, "./assets/favicon.ico", &opts); +} + +void handle_home(struct mg_connection *conn, struct mg_http_message *msg) +{ + NString_List env = {0}; + defer { list_free(&env); } + + String_Builder out = {0}; + defer { sb_free(&out); } + bool ok = gpp1("./tmpls/index.t", &env, &out); sb_finish(&out); if (!ok) { @@ -62,7 +95,11 @@ void handle_page_not_found(struct mg_connection *conn, struct mg_http_message *m static void init_route_hashtable(void) { - hmdefault(route_hashtable, &handle_page_not_found); + shdefault(route_hashtable, &handle_page_not_found); + shput(route_hashtable, "/page-missing", &handle_page_not_found); + shput(route_hashtable, "/simple.min.css", &handle_simple_css); + shput(route_hashtable, "/favicon.ico", &handle_favicon); + shput(route_hashtable, "/", &handle_home); } int main(int argc, char ** argv) @@ -80,7 +117,7 @@ int main(int argc, char ** argv) } mg_mgr_free(&mgr); - hmfree(route_hashtable); + shfree(route_hashtable); return 0; } diff --git a/tmpls/404.t b/tmpls/404.t deleted file mode 100644 index a21e7e0..0000000 --- a/tmpls/404.t +++ /dev/null @@ -1,10 +0,0 @@ - - - - 404 - Page not found - - - The page you were looking for doesn't exist.
- URL: <#URL> - - diff --git a/tmpls/index.t b/tmpls/index.t new file mode 100644 index 0000000..2a4cdcf --- /dev/null +++ b/tmpls/index.t @@ -0,0 +1,45 @@ + + + + Kamil's personal website + + + +

Kamil's personal website

+
+

Personal projects

+ Gitlab
+ Github (mostly old unused stuff)
+

My favourites

+ +
+ + + diff --git a/tmpls/page-missing.t b/tmpls/page-missing.t new file mode 100644 index 0000000..7ac93da --- /dev/null +++ b/tmpls/page-missing.t @@ -0,0 +1,16 @@ + + + + 404 - Page not found + + + +

The page you were looking for doesn't exist!

+

+ URL was: <#URL>
+

+ + +