From b171f11982ca5d84f515f9acc9842a0aa8bd6ea2 Mon Sep 17 00:00:00 2001 From: Szymon P Date: Sun, 11 Jan 2026 21:59:31 +0100 Subject: [PATCH 1/9] create io --- src/io/io.cpp | 0 src/io/io.hpp | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/io/io.cpp create mode 100644 src/io/io.hpp diff --git a/src/io/io.cpp b/src/io/io.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/io/io.hpp b/src/io/io.hpp new file mode 100644 index 0000000..e69de29 From 5fa62d64ee2b6e02a18e68e080c085c4a8f0de78 Mon Sep 17 00:00:00 2001 From: Szymon P Date: Sun, 11 Jan 2026 22:19:00 +0100 Subject: [PATCH 2/9] added io functionality --- src/io/io.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/io/io.hpp | 13 +++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/io/io.cpp b/src/io/io.cpp index e69de29..444c436 100644 --- a/src/io/io.cpp +++ b/src/io/io.cpp @@ -0,0 +1,36 @@ +#include "io/io.hpp" +#include +#include +#include +#include + +std::string read_file(const std::string &FILE_PATH) { + std::ifstream file(FILE_PATH); + if (!file) { + throw std::runtime_error("Error while opening file at " + FILE_PATH); + } + std::stringstream buffer; + buffer << file.rdbuf(); + + if (file.bad()) { + throw std::runtime_error("Error while reading file at " + FILE_PATH); + } + + return buffer.str(); +} + +void write_file(const std::string &FILE_PATH, const std::string &CONTENT) { + std::ofstream out(FILE_PATH); + if (!out) { + throw std::runtime_error("Error while opening file for writing at " + + FILE_PATH); + } + + out << CONTENT; + + if (!out) { + throw std::runtime_error("Error while writing to the " + FILE_PATH); + } + + out.close(); +} diff --git a/src/io/io.hpp b/src/io/io.hpp index e69de29..a43df36 100644 --- a/src/io/io.hpp +++ b/src/io/io.hpp @@ -0,0 +1,13 @@ +#include + +// @brief Read file from given path +// @param FILE PATH Path to the file +// @return File content +// @throws std::runtime_error if any errors +std::string read_file(const std::string &FILE_PATH); + +/// @brief Writes the given content into a file. +/// @param FILE_PATH Path to the file to write. +/// @param CONTENT Content to write into the file. +/// @throws std::runtime_error if the file cannot be opened or written. +void write_file(const std::string &FILE_PATH, const std::string &CONTENT); From 1668cb85639c70137ba56f79ede3c08ea30a5e10 Mon Sep 17 00:00:00 2001 From: Szymon P Date: Sun, 11 Jan 2026 22:33:58 +0100 Subject: [PATCH 3/9] moved all the file operation logic into io module --- .../index/config.cpp.A68A2AE9FDFA8117.idx | Bin 0 -> 1382 bytes .../index/config.hpp.C519F3A7E0A75094.idx | Bin 0 -> 1040 bytes .../index/format.cpp.047FF551BC8DE01E.idx | Bin 0 -> 1078 bytes .../index/main.cpp.AC604CCC20973D23.idx | Bin 0 -> 436 bytes .../index/markdown.cpp.A5D40F1BF5766683.idx | Bin 0 -> 3162 bytes .../index/markdown.hpp.66A7ABFD738DA42D.idx | Bin 0 -> 1138 bytes src/config/config.cpp | 4 ++-- src/config/config.hpp | 5 ++++- src/format/format.cpp | 19 ---------------- src/markdown/markdown.cpp | 21 +++++++++--------- 10 files changed, 16 insertions(+), 33 deletions(-) create mode 100644 src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx create mode 100644 src/.cache/clangd/index/config.hpp.C519F3A7E0A75094.idx create mode 100644 src/.cache/clangd/index/format.cpp.047FF551BC8DE01E.idx create mode 100644 src/.cache/clangd/index/main.cpp.AC604CCC20973D23.idx create mode 100644 src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx create mode 100644 src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx diff --git a/src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx b/src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx new file mode 100644 index 0000000000000000000000000000000000000000..e7480b6ef8fe9b5e1d600506c1e56f8ebb249f4b GIT binary patch literal 1382 zcmWIYbaRViWngel@vO*AElFfyU|9;hPV)6;HWX-kzWhtT z(xoZwu>z?J1J;CbCGpGI=-o`&#e4Snq&H!!f86)IZMz~wQ>4wOqS9!lxv<0+`%5tv z(zD_+Qs%WE(~kbCx4e7#%|8ogoRxoX-)`_@z64XU;gWFaPiHJVA7_~`nXzv>(Xh8* z?PIU}-scBc4A{>E7pxUOvgA{8jHR>0z3s;$eYOb4Bu5nbXPBQ_@KEuUsd#o=pu@tQ zYg49o>G)oH!nRe5pDRss!;KdaJ#H^eRX!~KF*ka9Th8XATPMGp8tod96`uIvQHjvw zVx7>dOI@y*CP>>%JN4+?kCOGyH??%@H}bjMn{VT9m9o<0X~*+BHEEq!w+mVGpW?df z9xd#oG=~+X<#6;v$G3|3bP9fGH^06G6)JYin1~k zrKS~!Ff%ZmQ?Bl4vJ2*Ck`dw2=Fx{~1oG^8oMF6rUez4WcY7olc|=5+L^)x?KW$8# zR5$%lW)%?;kQR`E35$pbN(&U1pIfB(

JR@-PpYn{-N*z~&A`qE6Xp?-Vv^#3@$S6e+;PX|#u1=i4h{~u-YoMk zds`-po?(;`;S%RkgsCnS3X5e-nRylz@d5&ZFkxWC3kV|dgam|;cwz!#NIY=?aX4>> z+tiA64$p6ZjAIjkdlP6Jn;;TTh)oEIC&ng*#1m%|hx7K!F$m>MoN@=~7jAKGcq}i> z@n-P~Y>q$3&cVka0TZ^8`*b?SP;%DNA=Zm7$oJ3Ik6&EEJ2ZI=5AOZr!VGITaQ3O*G!IVNUCE!d( tk&C+=r?(EKHs~Kq}VpIf@4~Bt-()ys5C>Uj_tt71wyGyR+&%;JP zMj6#ZkgVVq?L&p3FJ=}N#abw4v}g!fhAW5~qTx%}oza6{nD1WBx!<|x`_7zj<>y;C zgpQtb1?t@XN_s>N`uY6c+Hd;KAQWhSa(AG>lq+A0AHN(Kt;q5Wd~R=jzR&z6Xf6Ke z$v))I%E&B#+`2G-{^{i4Ep_Ex(PC~@&DXYA=f#*SHvIirMpwtgi%>^a-&}L|mBy9! zN8>*f-i%6Wf0yTO-isR#$60@Jd0ixMhaEnRx+s4i5UQ)9NtpZPf%IQiNZW}L1 z=(Q78rD;`EZ3aNPMM?9x=3hH`79&IiED!^bV2~MNPVYG~>m2cv$;gI~f-$xc4Qn}&+%d}c6V^`oA`$Hd0KZoliROp5#R)6Z z*UiMN835_h-vi6R;^t+ZHPiAYY$671lt*57jqmCvml@G;7y1HsX;`-w!r&?^uDNNL ziI7ZGRuzB)&N7K>j;>zjNLW%}3^LKSYrCK`h|)Lp$$%L!`dPEDK)ZqltWM~o~}&$Lf4*tzLv_u`wq zF%uS@UTp7uf9tlb+a(Tvc$sj$N%QLa6`8lBH+)e3{qo-G&ZY=CDN($UH z=g8iSqOUsBrm+_2b~&G@sH%x@{<2@8v9_b8{l|RW`aTc8=V#BvH_zR7bWR@M%tx;z zU#{AHpX+w^?VDoXmul@U;f(s%5XM{CG9i9Omi<+c-xF4UnR;0$HZ|bhlpWK3c;ut( z&IS}$<|f$z!^ZRLr8V<2E|~Bzh%qn-u=210-+ zVA4gYX~hx1P<69jz2v>pRYpc00U>rFeweQB7qrxQJ_ztJ$_NPa2n)l6O>B>F-KdNb z0jg$aV&{N4L9T7%vilYnB^gBo#6-o!VX9%$Oj0N=lM#?)lN5p}+WA&dEG2ig70@Pe zUU9f^;N|lk5AweF1C5m8mJ)=iHoNw#Xh-OmV4$!#t2jGMSk++f{4k}J;Xq*tP6;lU z@Ko`3F~>TQI-sy1pP&d#_>uqXLYKn#(8tLmz$(Y80uu)E z%vfy@JT?_JEd-B4f=w8UG?HDCT^8o) z1#BMv3nSh<1BS7XfDqisqSTy3P+BW4N-nkrF@!+`1b}ij1TYGiSI^Kn!*%%%i=dFO k2!jwzf`LI0!A#Cg$q@i@dHDF4xLDa(n7P?G_&FJQ0ohq?KmY&$ literal 0 HcmV?d00001 diff --git a/src/.cache/clangd/index/main.cpp.AC604CCC20973D23.idx b/src/.cache/clangd/index/main.cpp.AC604CCC20973D23.idx new file mode 100644 index 0000000000000000000000000000000000000000..a2de7f591edc23e69079d2fdee95ea415f5f67a7 GIT binary patch literal 436 zcmWIYbaPw7$iU#7;#rZKT9U}Zz`!5^#Kk2=nV*65YoJ`koT>ee-bWmGT0f`TO!did z6j><#ag%z#T&mUNxovZ2PMKL&`uFR$H(C{|1%xUpe^xNMIDBzE7h|yUxt$5`1I7W);AAK zjoD)P<95aSsLQk5yNqH)Uqv0T`hCyT_csIEzXS1Kwy2!@-0Ju0>*2ISsYPt7j=n8l z*Qp|H?(5*KYvQr&?ft}wFVOzA3pHDKDI21p|~okKYwV@_<4_kcEYX z155yAAfPBUtymn$gsEecLYL1;1gR`8N-ow1F@!(_1PH?z3=9HrCZk|@dt%(3hNE%J e0z$$J$+;;xAW0rRJ|-?!HWp@Xb`E|{MqU7tmY4(p literal 0 HcmV?d00001 diff --git a/src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx b/src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx new file mode 100644 index 0000000000000000000000000000000000000000..4050d1bdc47a8a2c710d9a4173d28c6ed1ab1155 GIT binary patch literal 3162 zcmY*b4Ooon8vbUgnP%pj|F3WUo0)!Qs4>&uRQN_Ur5bIh{O_cdSfr#nPDw&b`CX(f zEsNMJPA%y~mm_r1D#}MUDu9VBjw+J9Bw36+yzB5G3b7^{lki9v@!kz$i29!fipy|$LxMuHP~IycW>*teWil#(CbfLHQdSiwmqtSdco6#!Ne~DG{%F? zSly|?J6zGBhh=>Wlk!J%r?}mHFG}BnAmcb z$ZOeIvj(5i!U(VMpXfSZh>m>aSuilS+NrF5-Luj@=i?jaHg^%UTtXn(>>_Bbl;D@gMBK;*<-(qEf1FT8BZyglP;^s4u7cs)f{?Q-*)ART8+Q5PLHA`>POPjmc*S=~`@6QLOEWs&hj>0O?p@H~ zxSun3_sP4FCRMFAbM1n4<6q~lHpJxSeLrxm@~4Q7+TOu{klZ}Kukg)R^RL#EptfWO|B?^9s ztvzt#*aW$QwK84x!guD&Z+}^^8oL?xYVqljJw4THHS_;)H*!CeoLhRRdh%PZ&fTs0 zVchnU^@zp z!bBoegxOB>JwTaeE?JuOyEB3~UTmFmw0;gkMR69L#UYL2(e!8zRMINTdBVuyI8iX% zG}UB*LbIj|w9oetP81YZ(N%0nH{M>p?3lTnMv>#bJYNx{zo_v~&Yogs0a~NcjE8g@ z7PgPZjpPE_gXbZJbh~?A@un#WHd=rSq>w&0E2XPBZV?7d>KS?#q}R6oN9k#vDh3W} zd^P@%7E6Z@-tDHl0wodj2sTXFd&0QMv-aQaju@`?QTsw^4A+g`41B5Jn|p8QziORRD+AJ( z^a+Rjo^1~Wx1kkl-JvGd>zk6wWYJV$7pLP)NC({dx$*w%Yf(U2E|JS1-PaU8N%!^f zXdvy!^dr5j53DWEyZs^>NTV3)3Z<#m-j#p$Pf)-#pG0EFR@eoc34$pR3(BP4Mtc5lq4wIx&oS+h9C`pAW z@78#~OacaYS{_;A95k&P-qGMQly`n{{Q`q zBo!Cy@QukCK#7niB#Wz5RD_4E$JT>dW^>pWJdEKMjs=4e0)$)CW01Q=15w!$^Yg3Y z+ls&)8e9w#sNmE!YQ|K=M!u1x9X=)udi7ta0^KHN zh&&S4?Fr|bROBx^3S4| zAezU9+tqj@wQ9R|(Su52G_D7gW`^z`;5r|_Qya}p^j`)}G_4G*;^lm@Sc zLPyRa3@6ltn|;ruHjxP4BWP^fdkj-wGfO_2GSqMfm{Y2i8hG}6WNA)K=s-8fDj_1& zkOnWX$V8$Y$G&^8YTaNDh(IM%DWOng1pmYn%8Fh<wh09Tp$S990($_vtn{d!MQX45vSczw}2rMOQbSaxk8C3$!$bpUyAHYxqZ1f YEoCJSKn{oJh|-;DPHYBK$a3KR7pxa(H~;_u literal 0 HcmV?d00001 diff --git a/src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx b/src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx new file mode 100644 index 0000000000000000000000000000000000000000..5730bdac6978b44a3d5c59ddba51b45182c6fded GIT binary patch literal 1138 zcmWIYbaTsMVPJ4h@vO*AElC728AO1%xTGj^FCzoPUS^xdyT4O=A7Q>U-z}GuU%WZ^vyzrBMT}&KRerg z=vO|f;KN=0yjP(kok!vN(i@sj{2m${WG*|zeMsuty_uX348`^_91fh^^!sa7?fe&I zH!`x_k8a#?^-ssPb794Sj5+tWty8wp+LCa0y--QVtzS1LuP|Afut@!>&E%u0KbQ9S z_LqmAJbv6pfBREE7Twj$m*wc)i%~hVZHm{Au00n->dHH2#Bdea+381YPo1)4uIO8} zrtMENdpcI@Hi={CI&Q&Kj){>R=M zb>Yjw;@s5R*H1j%Jp1~`4}V4Ib`~NPL^jnfPvw|IY zgG}}Qr7S5;xXkbUD{fh1&W%UU4TXFYmT2mo^1pM(osprqGB@caFgBNceV)l@w~CFA ziJgUkhnfUN8ZZzV69m@o@@w92*lbG4Qal zv+;uo22P0XGK+QlZO)ix@h}K8FmQ88aH;SJO9-nlNHQ_9iEuJJyKzce@zDKgd`#j% z!#Vjlg~0^O@cPuCuqzfzPV+H|0j0U5x#YnFO#0f*$||dU78iLKgn)*-^SF!fi1Ubx zfDC691v|vNsU>*hvgM14UmYHZR z5hPm>3p7NSRhSp%F_<(H7sTHXZ!-WD@d=B;6v1dlNr>;EidG+Gnw3z?)&Vq)zZ{fj%}K9(HziUYIj^csSWPd0`<2^olT-B+M&7>kNd=VAk;Ph_i}w!$XHh zTtQq7#)Ihx`VJJ_Fz3Sz0t$nI872(V1#~z#WT6fRhHOqEh+SNiT #include -Config get_config(const std::string &CONFIG_FILE) { +Config get_config(const std::string &CONFIGURATION) { toml::table toml_table; try { - toml_table = toml::parse_file(CONFIG_FILE); + toml_table = toml::parse(CONFIGURATION); } catch (const toml::parse_error &err) { std::cerr << "Parsing failed:" << std::endl << err << std::endl; } diff --git a/src/config/config.hpp b/src/config/config.hpp index 30e25ee..1c40f89 100644 --- a/src/config/config.hpp +++ b/src/config/config.hpp @@ -17,4 +17,7 @@ struct Config { General general; }; -Config get_config(const std::string &CONFIG_FILE); +// @brief Load config into `Config` struct +// @param CONFIGURATION content of `.toml` file containing configuration +// @return Config with parsed configuration +Config get_config(const std::string &CONFIGURATION); diff --git a/src/format/format.cpp b/src/format/format.cpp index 5bf4f23..68516de 100644 --- a/src/format/format.cpp +++ b/src/format/format.cpp @@ -1,6 +1,4 @@ #include "markdown/markdown.hpp" -#include -#include #include static bool replace_once(std::string &str, const std::string &from, @@ -11,20 +9,3 @@ static bool replace_once(std::string &str, const std::string &from, str.replace(start_pos, from.length(), to); return true; } - -std::string inject_html_into_template(const std::string &FILE_NAME, - const std::string &TEMPLATE, - const std::string &HTML) { - std::string result; - std::ifstream file(FILE_NAME); - if (!file.is_open()) { - return ""; - } - std::ostringstream ss; - ss << file.rdbuf(); - result = ss.str(); - if (replace_once(result, TEMPLATE, HTML)) { - return result; - } - return ""; -} diff --git a/src/markdown/markdown.cpp b/src/markdown/markdown.cpp index 34bf0c5..81790c5 100644 --- a/src/markdown/markdown.cpp +++ b/src/markdown/markdown.cpp @@ -1,6 +1,5 @@ #include "markdown.hpp" #include -#include #include #include #include @@ -8,21 +7,21 @@ #include #include -std::optional get_metadata(const std::string &FILE_PATH) { - std::fstream file(FILE_PATH); +std::optional get_metadata(const std::string &FILE_CONTENTS) { + std::stringstream file_contents(FILE_CONTENTS); std::stringstream metadata_s; std::string buffer; /* if there's no ---, then no metadata in file there is */ - if (!getline(file, buffer) || buffer != "---") { - std::cerr << "File " << FILE_PATH << " does not contain metadata. " + if (!getline(file_contents, buffer) || buffer != "---") { + std::clog << "File does not contain any metadata. Is this intentional?" << std::endl; return std::nullopt; } std::map metadata_map; - while (getline(file, buffer)) { + while (getline(file_contents, buffer)) { if (buffer == "---") { break; } @@ -69,15 +68,15 @@ static void html_callback(const MD_CHAR *data, MD_SIZE size, void *userdata) { out->append(data, size); } -std::string get_html(const std::string &FILE_PATH) { - std::fstream file(FILE_PATH); +std::string get_html(const std::string &FILE_CONTENTS) { + std::stringstream file_contents(FILE_CONTENTS); std::string buffer, file_string, out; - getline(file, buffer); + getline(file_contents, buffer); bool is_metadata = buffer == "---"; /* skip metadata */ if (is_metadata) { - while (getline(file, buffer)) { + while (getline(file_contents, buffer)) { if (buffer == "---") { break; } @@ -86,7 +85,7 @@ std::string get_html(const std::string &FILE_PATH) { file_string += buffer + '\n'; } - while (getline(file, buffer)) { + while (getline(file_contents, buffer)) { file_string += buffer + '\n'; } From 763761ea8293d240a5ec03c62b5c72cd651d6345 Mon Sep 17 00:00:00 2001 From: Szymon P Date: Sun, 11 Jan 2026 22:34:20 +0100 Subject: [PATCH 4/9] removed cache --- .../clangd/index/config.cpp.A68A2AE9FDFA8117.idx | Bin 1382 -> 0 bytes .../clangd/index/config.hpp.C519F3A7E0A75094.idx | Bin 1040 -> 0 bytes .../clangd/index/format.cpp.047FF551BC8DE01E.idx | Bin 1078 -> 0 bytes .../clangd/index/main.cpp.AC604CCC20973D23.idx | Bin 436 -> 0 bytes .../index/markdown.cpp.A5D40F1BF5766683.idx | Bin 3162 -> 0 bytes .../index/markdown.hpp.66A7ABFD738DA42D.idx | Bin 1138 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx delete mode 100644 src/.cache/clangd/index/config.hpp.C519F3A7E0A75094.idx delete mode 100644 src/.cache/clangd/index/format.cpp.047FF551BC8DE01E.idx delete mode 100644 src/.cache/clangd/index/main.cpp.AC604CCC20973D23.idx delete mode 100644 src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx delete mode 100644 src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx diff --git a/src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx b/src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx deleted file mode 100644 index e7480b6ef8fe9b5e1d600506c1e56f8ebb249f4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1382 zcmWIYbaRViWngel@vO*AElFfyU|9;hPV)6;HWX-kzWhtT z(xoZwu>z?J1J;CbCGpGI=-o`&#e4Snq&H!!f86)IZMz~wQ>4wOqS9!lxv<0+`%5tv z(zD_+Qs%WE(~kbCx4e7#%|8ogoRxoX-)`_@z64XU;gWFaPiHJVA7_~`nXzv>(Xh8* z?PIU}-scBc4A{>E7pxUOvgA{8jHR>0z3s;$eYOb4Bu5nbXPBQ_@KEuUsd#o=pu@tQ zYg49o>G)oH!nRe5pDRss!;KdaJ#H^eRX!~KF*ka9Th8XATPMGp8tod96`uIvQHjvw zVx7>dOI@y*CP>>%JN4+?kCOGyH??%@H}bjMn{VT9m9o<0X~*+BHEEq!w+mVGpW?df z9xd#oG=~+X<#6;v$G3|3bP9fGH^06G6)JYin1~k zrKS~!Ff%ZmQ?Bl4vJ2*Ck`dw2=Fx{~1oG^8oMF6rUez4WcY7olc|=5+L^)x?KW$8# zR5$%lW)%?;kQR`E35$pbN(&U1pIfB(

JR@-PpYn{-N*z~&A`qE6Xp?-Vv^#3@$S6e+;PX|#u1=i4h{~u-YoMk zds`-po?(;`;S%RkgsCnS3X5e-nRylz@d5&ZFkxWC3kV|dgam|;cwz!#NIY=?aX4>> z+tiA64$p6ZjAIjkdlP6Jn;;TTh)oEIC&ng*#1m%|hx7K!F$m>MoN@=~7jAKGcq}i> z@n-P~Y>q$3&cVka0TZ^8`*b?SP;%DNA=Zm7$oJ3Ik6&EEJ2ZI=5AOZr!VGITaQ3O*G!IVNUCE!d( tk&C+=r?(EKHs~Kq}VpIf@4~Bt-()ys5C>Uj_tt71wyGyR+&%;JP zMj6#ZkgVVq?L&p3FJ=}N#abw4v}g!fhAW5~qTx%}oza6{nD1WBx!<|x`_7zj<>y;C zgpQtb1?t@XN_s>N`uY6c+Hd;KAQWhSa(AG>lq+A0AHN(Kt;q5Wd~R=jzR&z6Xf6Ke z$v))I%E&B#+`2G-{^{i4Ep_Ex(PC~@&DXYA=f#*SHvIirMpwtgi%>^a-&}L|mBy9! zN8>*f-i%6Wf0yTO-isR#$60@Jd0ixMhaEnRx+s4i5UQ)9NtpZPf%IQiNZW}L1 z=(Q78rD;`EZ3aNPMM?9x=3hH`79&IiED!^bV2~MNPVYG~>m2cv$;gI~f-$xc4Qn}&+%d}c6V^`oA`$Hd0KZoliROp5#R)6Z z*UiMN835_h-vi6R;^t+ZHPiAYY$671lt*57jqmCvml@G;7y1HsX;`-w!r&?^uDNNL ziI7ZGRuzB)&N7K>j;>zjNLW%}3^LKSYrCK`h|)Lp$$%L!`dPEDK)ZqltWM~o~}&$Lf4*tzLv_u`wq zF%uS@UTp7uf9tlb+a(Tvc$sj$N%QLa6`8lBH+)e3{qo-G&ZY=CDN($UH z=g8iSqOUsBrm+_2b~&G@sH%x@{<2@8v9_b8{l|RW`aTc8=V#BvH_zR7bWR@M%tx;z zU#{AHpX+w^?VDoXmul@U;f(s%5XM{CG9i9Omi<+c-xF4UnR;0$HZ|bhlpWK3c;ut( z&IS}$<|f$z!^ZRLr8V<2E|~Bzh%qn-u=210-+ zVA4gYX~hx1P<69jz2v>pRYpc00U>rFeweQB7qrxQJ_ztJ$_NPa2n)l6O>B>F-KdNb z0jg$aV&{N4L9T7%vilYnB^gBo#6-o!VX9%$Oj0N=lM#?)lN5p}+WA&dEG2ig70@Pe zUU9f^;N|lk5AweF1C5m8mJ)=iHoNw#Xh-OmV4$!#t2jGMSk++f{4k}J;Xq*tP6;lU z@Ko`3F~>TQI-sy1pP&d#_>uqXLYKn#(8tLmz$(Y80uu)E z%vfy@JT?_JEd-B4f=w8UG?HDCT^8o) z1#BMv3nSh<1BS7XfDqisqSTy3P+BW4N-nkrF@!+`1b}ij1TYGiSI^Kn!*%%%i=dFO k2!jwzf`LI0!A#Cg$q@i@dHDF4xLDa(n7P?G_&FJQ0ohq?KmY&$ diff --git a/src/.cache/clangd/index/main.cpp.AC604CCC20973D23.idx b/src/.cache/clangd/index/main.cpp.AC604CCC20973D23.idx deleted file mode 100644 index a2de7f591edc23e69079d2fdee95ea415f5f67a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 436 zcmWIYbaPw7$iU#7;#rZKT9U}Zz`!5^#Kk2=nV*65YoJ`koT>ee-bWmGT0f`TO!did z6j><#ag%z#T&mUNxovZ2PMKL&`uFR$H(C{|1%xUpe^xNMIDBzE7h|yUxt$5`1I7W);AAK zjoD)P<95aSsLQk5yNqH)Uqv0T`hCyT_csIEzXS1Kwy2!@-0Ju0>*2ISsYPt7j=n8l z*Qp|H?(5*KYvQr&?ft}wFVOzA3pHDKDI21p|~okKYwV@_<4_kcEYX z155yAAfPBUtymn$gsEecLYL1;1gR`8N-ow1F@!(_1PH?z3=9HrCZk|@dt%(3hNE%J e0z$$J$+;;xAW0rRJ|-?!HWp@Xb`E|{MqU7tmY4(p diff --git a/src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx b/src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx deleted file mode 100644 index 4050d1bdc47a8a2c710d9a4173d28c6ed1ab1155..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3162 zcmY*b4Ooon8vbUgnP%pj|F3WUo0)!Qs4>&uRQN_Ur5bIh{O_cdSfr#nPDw&b`CX(f zEsNMJPA%y~mm_r1D#}MUDu9VBjw+J9Bw36+yzB5G3b7^{lki9v@!kz$i29!fipy|$LxMuHP~IycW>*teWil#(CbfLHQdSiwmqtSdco6#!Ne~DG{%F? zSly|?J6zGBhh=>Wlk!J%r?}mHFG}BnAmcb z$ZOeIvj(5i!U(VMpXfSZh>m>aSuilS+NrF5-Luj@=i?jaHg^%UTtXn(>>_Bbl;D@gMBK;*<-(qEf1FT8BZyglP;^s4u7cs)f{?Q-*)ART8+Q5PLHA`>POPjmc*S=~`@6QLOEWs&hj>0O?p@H~ zxSun3_sP4FCRMFAbM1n4<6q~lHpJxSeLrxm@~4Q7+TOu{klZ}Kukg)R^RL#EptfWO|B?^9s ztvzt#*aW$QwK84x!guD&Z+}^^8oL?xYVqljJw4THHS_;)H*!CeoLhRRdh%PZ&fTs0 zVchnU^@zp z!bBoegxOB>JwTaeE?JuOyEB3~UTmFmw0;gkMR69L#UYL2(e!8zRMINTdBVuyI8iX% zG}UB*LbIj|w9oetP81YZ(N%0nH{M>p?3lTnMv>#bJYNx{zo_v~&Yogs0a~NcjE8g@ z7PgPZjpPE_gXbZJbh~?A@un#WHd=rSq>w&0E2XPBZV?7d>KS?#q}R6oN9k#vDh3W} zd^P@%7E6Z@-tDHl0wodj2sTXFd&0QMv-aQaju@`?QTsw^4A+g`41B5Jn|p8QziORRD+AJ( z^a+Rjo^1~Wx1kkl-JvGd>zk6wWYJV$7pLP)NC({dx$*w%Yf(U2E|JS1-PaU8N%!^f zXdvy!^dr5j53DWEyZs^>NTV3)3Z<#m-j#p$Pf)-#pG0EFR@eoc34$pR3(BP4Mtc5lq4wIx&oS+h9C`pAW z@78#~OacaYS{_;A95k&P-qGMQly`n{{Q`q zBo!Cy@QukCK#7niB#Wz5RD_4E$JT>dW^>pWJdEKMjs=4e0)$)CW01Q=15w!$^Yg3Y z+ls&)8e9w#sNmE!YQ|K=M!u1x9X=)udi7ta0^KHN zh&&S4?Fr|bROBx^3S4| zAezU9+tqj@wQ9R|(Su52G_D7gW`^z`;5r|_Qya}p^j`)}G_4G*;^lm@Sc zLPyRa3@6ltn|;ruHjxP4BWP^fdkj-wGfO_2GSqMfm{Y2i8hG}6WNA)K=s-8fDj_1& zkOnWX$V8$Y$G&^8YTaNDh(IM%DWOng1pmYn%8Fh<wh09Tp$S990($_vtn{d!MQX45vSczw}2rMOQbSaxk8C3$!$bpUyAHYxqZ1f YEoCJSKn{oJh|-;DPHYBK$a3KR7pxa(H~;_u diff --git a/src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx b/src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx deleted file mode 100644 index 5730bdac6978b44a3d5c59ddba51b45182c6fded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1138 zcmWIYbaTsMVPJ4h@vO*AElC728AO1%xTGj^FCzoPUS^xdyT4O=A7Q>U-z}GuU%WZ^vyzrBMT}&KRerg z=vO|f;KN=0yjP(kok!vN(i@sj{2m${WG*|zeMsuty_uX348`^_91fh^^!sa7?fe&I zH!`x_k8a#?^-ssPb794Sj5+tWty8wp+LCa0y--QVtzS1LuP|Afut@!>&E%u0KbQ9S z_LqmAJbv6pfBREE7Twj$m*wc)i%~hVZHm{Au00n->dHH2#Bdea+381YPo1)4uIO8} zrtMENdpcI@Hi={CI&Q&Kj){>R=M zb>Yjw;@s5R*H1j%Jp1~`4}V4Ib`~NPL^jnfPvw|IY zgG}}Qr7S5;xXkbUD{fh1&W%UU4TXFYmT2mo^1pM(osprqGB@caFgBNceV)l@w~CFA ziJgUkhnfUN8ZZzV69m@o@@w92*lbG4Qal zv+;uo22P0XGK+QlZO)ix@h}K8FmQ88aH;SJO9-nlNHQ_9iEuJJyKzce@zDKgd`#j% z!#Vjlg~0^O@cPuCuqzfzPV+H|0j0U5x#YnFO#0f*$||dU78iLKgn)*-^SF!fi1Ubx zfDC691v|vNsU>*hvgM14UmYHZR z5hPm>3p7NSRhSp%F_<(H7sTHXZ!-WD@d=B;6v1dlNr>;EidG+Gnw3z?)&Vq)zZ{fj%}K9(HziUYIj^csSWPd0`<2^olT-B+M&7>kNd=VAk;Ph_i}w!$XHh zTtQq7#)Ihx`VJJ_Fz3Sz0t$nI872(V1#~z#WT6fRhHOqEh+SNiT Date: Sun, 11 Jan 2026 22:34:47 +0100 Subject: [PATCH 5/9] added cache to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c528bab..5a81c0c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ posts/ src/build/ /src/blog /src/tests +/src/cache/ *.o From bc9228cdc7e367a84b83266f7d8ea65c539ed65f Mon Sep 17 00:00:00 2001 From: Szymon P Date: Sun, 11 Jan 2026 22:51:57 +0100 Subject: [PATCH 6/9] change test to take into account new io system --- .github/workflows/c-cpp.yml | 10 +- .gitignore | 2 +- .../index/config.cpp.A68A2AE9FDFA8117.idx | Bin 0 -> 1464 bytes .../index/config.hpp.C519F3A7E0A75094.idx | Bin 0 -> 1118 bytes .../index/format.cpp.047FF551BC8DE01E.idx | Bin 0 -> 604 bytes .../index/main.cpp.AC604CCC20973D23.idx | Bin 0 -> 436 bytes .../index/markdown.cpp.A5D40F1BF5766683.idx | Bin 0 -> 3110 bytes .../index/markdown.hpp.66A7ABFD738DA42D.idx | Bin 0 -> 1138 bytes src/tests.cpp | 104 +++++++++++++----- 9 files changed, 82 insertions(+), 34 deletions(-) create mode 100644 src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx create mode 100644 src/.cache/clangd/index/config.hpp.C519F3A7E0A75094.idx create mode 100644 src/.cache/clangd/index/format.cpp.047FF551BC8DE01E.idx create mode 100644 src/.cache/clangd/index/main.cpp.AC604CCC20973D23.idx create mode 100644 src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx create mode 100644 src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 2f9e96c..3c64889 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -17,7 +17,9 @@ jobs: run: | sudo apt update sudo apt install -y g++ catch2 libmd4c-dev libmd4c-html0-dev libtomlplusplus-dev - - name: make - run: make -C src - - name: make check - run: make check -C src + - name: make all + run: make all + - name: make test + run: make test + - name: make clean + run: make clean diff --git a/.gitignore b/.gitignore index 5a81c0c..3b73a2c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,5 @@ posts/ src/build/ /src/blog /src/tests -/src/cache/ +/src/.cache/ *.o diff --git a/src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx b/src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx new file mode 100644 index 0000000000000000000000000000000000000000..90887948e85c092b0abeff4d11d2ba4a6d173591 GIT binary patch literal 1464 zcmWIYbaUIl%D~{9;#rZKT9U}Zz`!5^#Kk2=nNt}V7uX{b?L|fnfow4`oBWnJ9`}ym2Qsw{OU9tcAcP2SKS$NV;LP&1w%<|2W z!rW@pM1}7!Ev_`P7xGjS5kA2(vx8YvdCOAEoQu*O_VaDnG-R}1D&(n3a`0bko^E)( zdS%%rW5Fqt7hY~p4V~&5xraUd_DZJElP>#S#hguhY8|#=@dxWWy!TqZuvlODq0wx5 z!Rn2|B&)eCIw{G!4+pK-mu}$Fbd60yIzMVt+F|>JS89@W@N)kARrY`LIjziqmup_C zdY5~q!oBp_MeRs>fwLgzpZC>v!?e;tPnS)UzPde{RlYj@o7WG>)PZt-M{E|o! zK5*-x)!%UL6Ct(tYBKpwR3z|zkWyUVbK{?&;i|2UI~}D1#IO3w1? zB4t&(^d~KT#++08K4E=+YR80sm6OH4&uQtOU%k#a)AZ}d~3prst3^EK1qU`MKf?{IqVuB2kOpJm;B8+0J3`MDF#Ua2rJf~dU(PS6Q&m<$t zqs^la(+K3*^EktJ^}MP%p6~WZF!G3sGKq4+gn!zYHmPpT06Oa*5LGT0x1(Dy71 z2Y*%>Q2{jpJ(#eJsGzE#E`ledCWIs>rXr?;kP}xGhpU8%GD?9X3mAi7aCCLtt*Z<8 zb3vB#a|ysy1#`OY%}o{P14akCEIZt(IvvaQ-~aP?6;POmlZO|k`on+Ild3CfH!=ZL zGqAJ4gn2}zn4~yhygTnVcigeLaRjKBgM$OEw`ET2xh+Rkk1@)Ka*1=nW2#grES524 z=2=k03kV3p3;{;GfFKf2NI(dQCng|<#1j_~hx2y0O|4kx@cahII5q*eH-W~n2_o@? z*o2UHVr*haJaIO0IB&lkgHX=IDR+Q=;TGqH$MV7)Zx*k>wnt1NqCCnxst8B(nDbb| zc$d^R9sA70{s9=`9DE!SFkvgXkEgQP5q~ zNd(1TaZz${Fo+=zA|OBl#$aF&LolTfOlbsD63%24Jz!CKwaiC^n@vnyLQ+baAvrfC YM*t|#$0xwT!_L9R%FD?m%+1UX04bsHyZ`_I literal 0 HcmV?d00001 diff --git a/src/.cache/clangd/index/config.hpp.C519F3A7E0A75094.idx b/src/.cache/clangd/index/config.hpp.C519F3A7E0A75094.idx new file mode 100644 index 0000000000000000000000000000000000000000..8e17046c01f6feefbf712ed77ae456d15ddfdcc6 GIT binary patch literal 1118 zcmWIYbaM-1VPJ4h@vO*AElC728AO1%xTGjkg^_`QkBNbyV$RZuXR{6)2(*-*3w|+S z+LK4Bjd3MKvo8r~aDI6nqrEAo`$UxTT8_+@yTkirGyH5tSd@8<=ZAHiT^7&1@B-_j zMlVIC%EwuCyKm*rH+%hk`tR*$^M2c=Z{BZIJnjA7i=y>zk)Nil^EunA{N(7X8jYZv z?yi&fOpe?3XVqPC59>z}AC;7Iat~@Jf4w>V*w^p8XI`jEmQ22r-F5FHuAKd(s2g!7^>hy7 z;q;AFHOXsVCNmglPnP$2JIS|gO`83~``bc_D|3@#fnha8OLfIrVJU7tCLUG>ets@~ zK`_C<0Sr$d5Ifg@(@Sip5Fe8uP+EXXKoCs8r0aQAb3EVekziv2s^{lq=i~zu44h!i zjQp(XTby1?T*wLIVGshw3p+czAio&9m>`2B6C*PVH&DS}VZ~sDJN}t`Od{+I{A_$| zB47e$!BJPmD1pWEYWbMBfYK~{EFxe6Ce0r9O>gp-_6>YYqMQu;+9V# o@-y*s!curqYEB|Zrno4%SRBL<01*(t@4+-f@D#^tQAPm<0H}XHF#rGn literal 0 HcmV?d00001 diff --git a/src/.cache/clangd/index/format.cpp.047FF551BC8DE01E.idx b/src/.cache/clangd/index/format.cpp.047FF551BC8DE01E.idx new file mode 100644 index 0000000000000000000000000000000000000000..8e67e132240f7ededef2d0d89cda121a98f21d81 GIT binary patch literal 604 zcmWIYbaM+~VqkDi@vO*AElFfyU|c6{_)Yt#m80Wo-AuW=i{|3Hnx6mY>bPorqc;-`TprF0*rctqrA|d-G>~W0R@juD_6ZHfWl#uhf@TZxN|UeIaN6-}9{A zdgiq2ocZYswo37Cyzuj5Vz1^O1I;(dldKp0&-q#Gk~Z5c!j8TChfwi8OR@Ra6rQZ# z^?U7#y=8N=SL%tK=1?n6(zn))dm#Jw--;s)#g(~9@<6|Pe!aA2e#Qk89tL3s1_5Rs zW(hC>l!1Vv)U@K$K&FZ95w07RQ6h{y0<27|958J#no$Zx+av$ig)WB!>KJ7NIM_IN zVXA^TUH9gu3iPq?2r$brtH6YTJTqn+1dm09MGL`WlVFpB@!p@Z;Cg5pH3{enHU&1g z0ofHfH;aCztp`~r#{m~s@Qh?_*e!4yD9kF!Dho4&p(r&c5#+n#qU2&_5JLz=fB~bx s{`V&i>h5r1WfBx(5QGUcFeK-uee-bWmGT0f`TO!did z6j><#ag%z#T&mUNxovZ2PMKL&`uFR$H(C{|1%xUpe^xNMIDBzE7h|yUxt$5`1I7W);AAK zjoD)P<95aSsLQk5yNqH)Uqv0T`hCyT_csIEzXS1Kwy2!@-0Ju0>*2ISsYPt7j=n8l z*Qp|H?(5*KYvQr&?ft}wFVOzA3pHDKDI21p|~okKYwV@_<4_kcEYX z155yAAfPBUtymn$gsEecLYL1;1gR`8N-ow1F@!(_1PH?z3=9HrCZk|@dt%(3hNE%J e0z$$J$+;;xAW0rRJ|-?!HWp@Xb`E|{MqU7tmY4(p literal 0 HcmV?d00001 diff --git a/src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx b/src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx new file mode 100644 index 0000000000000000000000000000000000000000..cb63c5ca91664f0c9d94a04c82ae4bd63d013b40 GIT binary patch literal 3110 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 literal 0 HcmV?d00001 diff --git a/src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx b/src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx new file mode 100644 index 0000000000000000000000000000000000000000..05e9cb1cd75a5f48c28a07596be05e406a607567 GIT binary patch literal 1138 zcmWIYbaTsMVPJ4h@vO*AElC728AO1%xTGj^FCzoPUS^xdyT4O=A7Q>U-z}GuU%WZ^vyzrBMT}&KRerg z=vO|f;KN=0yjP(kok!vN(i@sj{2m${WG*|zeMsuty_uX348`^_91fh^^!sa7?fe&I zH!`x_k8a#?^-ssPb794Sj5+tWty8wp+LCa0y--QVtzS1LuP|Afut@!>&E%u0KbQ9S z_LqmAJbv6pfBREE7Twj$m*wc)i%~hVZHm{Au00n->dHH2#Bdea+381YPo1)4uIO8} zrtMENdpcI@Hi={CI&Q&Kj){>R=M zb>Yjw;@s5R*H1j%Jp1~`4}V4Ib`~NPL^jnfPvw|IY zgG}}Qr7S5;xXkbUD{fh1&W%UU4TXFYmT2mo^1pM(osprqGB@caFgBNceV)l@w~CFA ziJgUkhnfUN8ZZzV69m@o@@w92*lbG4Qal zv+;uo22P0XGK+QlZO)ix@h}K8FmQ89aH{YKO9-nlNHQ_9iEuJJyKzce@zDKgd`#j% z!#Vjlg~0^O@cPuCuqzfzPV+H|0j0U5x#YnFO#0f*$||dU78iLKgn)*-@wkcbi1Ubx zfDC691v|vNsU>*hvgM14UmYHZR z5hPm>3p7NSRhSp%F_<(H7sTHXZ!-WD@d=B;6v1dlNr>;EidG+Gnw3z?)&Vq)zZ{fj%}K9(HziUYIj^csSWPd0`<2^olT-B+M&7>kNd=VAk;Ph_i}w!$XHh zTtQq7#)Ihx`VJJ_Fz3Sz0t$nI872(V1#~z#WT6fRhHOqEh+SNiT #include -TEST_CASE("Checking config file read", "[config]") { - const std::string FILE_NAME = "test_files/config.toml"; +namespace TestFiles { +constexpr const char *config_toml = R"([general] + lang = "en" + title = "Blog" - Config config = get_config(FILE_NAME); + [contact] + author = "author" + email = "email@example.com" + signal = "signal url")"; + +constexpr const char *formatter_html = R"( + + + + + Document + + + {{replace_me}} + +)"; + +constexpr const char *no_metadata_post_md = R"(# This markdown has no metadata. +That's bad. Don't do it. It's for tests only.)"; + +constexpr const char *post_md = R"(--- +[metadata] +author = "joseph" +date = 2026-01-01 +title = "Example of a blog post" +tags = ["blog", "test", "lalilulelo"] +--- +# This is an example post + +In this example we will do a couple of cool markdown things. + +## This is a h2 header +*This text is written in italic!* +### Look at this! +**This text is BOLD!** + +## Hello world! +```cpp +#include + +int main() { + std::cout << "Hello world!" << std::endl; +} +``` +This is super cool! + +## Time to link some random website! +This [should be clickable](https://example.com) + +## Image test +![this should show an image](./image.png) + +## This is an ordered list +1. one +2. six +3. seven + +## This is an unordered one +- six +- nine +- six +- nine)"; +} // namespace TestFiles + +TEST_CASE("Checking config file read", "[config]") { + Config config = get_config(TestFiles::config_toml); REQUIRE(config.contact.author == "author"); REQUIRE(config.contact.email == "email@example.com"); @@ -20,8 +87,7 @@ TEST_CASE("Checking config file read", "[config]") { } TEST_CASE("get_metadata function data correctness test") { - const std::string FILE_NAME = "./test_files/post.md"; - Metadata result = get_metadata(FILE_NAME).value(); + Metadata result = get_metadata(TestFiles::post_md).value(); std::string expected_author = "joseph"; struct tm datetime = {0}; @@ -41,14 +107,13 @@ TEST_CASE("get_metadata function data correctness test") { } TEST_CASE("get_metadata function test with a file that doesn't have metadata") { - const std::string FILE_NAME = ".test_files/no_metadata_post.md"; - std::optional result = get_metadata(FILE_NAME); + std::optional result = get_metadata(TestFiles::no_metadata_post_md); REQUIRE(result == std::nullopt); } TEST_CASE("get_html function parsing test") { - const std::string INPUT = "./test_files/post.md"; - const std::string EXPECTED_OUTPUT = R"HTML(

This is an example post

+ const std::string EXPECTED_OUTPUT = + R"HTML(

This is an example post

In this example we will do a couple of cool markdown things.

This is a h2 header

This text is written in italic!

@@ -81,24 +146,5 @@ int main() { )HTML"; - REQUIRE(get_html(INPUT) == EXPECTED_OUTPUT); -} - -TEST_CASE("formatter injection test") { - const std::string FILE_NAME = "./test_files/formatter.html"; - const std::string EXPECTED_OUTPUT = R"( - - - - - Document - - - I'm replaced! - - -)"; - const std::string output = - inject_html_into_template(FILE_NAME, "{{replace_me}}", "I'm replaced!"); - REQUIRE(EXPECTED_OUTPUT == output); + REQUIRE(get_html(TestFiles::post_md) == EXPECTED_OUTPUT); } From 8556937f580180696677ca6a7b7f31643ba8657f Mon Sep 17 00:00:00 2001 From: Szymon P Date: Sun, 11 Jan 2026 22:52:31 +0100 Subject: [PATCH 7/9] remove this annoying cache that i can't ignore for some reason --- .../clangd/index/config.cpp.A68A2AE9FDFA8117.idx | Bin 1464 -> 0 bytes .../clangd/index/config.hpp.C519F3A7E0A75094.idx | Bin 1118 -> 0 bytes .../clangd/index/format.cpp.047FF551BC8DE01E.idx | Bin 604 -> 0 bytes .../clangd/index/main.cpp.AC604CCC20973D23.idx | Bin 436 -> 0 bytes .../index/markdown.cpp.A5D40F1BF5766683.idx | Bin 3110 -> 0 bytes .../index/markdown.hpp.66A7ABFD738DA42D.idx | Bin 1138 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx delete mode 100644 src/.cache/clangd/index/config.hpp.C519F3A7E0A75094.idx delete mode 100644 src/.cache/clangd/index/format.cpp.047FF551BC8DE01E.idx delete mode 100644 src/.cache/clangd/index/main.cpp.AC604CCC20973D23.idx delete mode 100644 src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx delete mode 100644 src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx diff --git a/src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx b/src/.cache/clangd/index/config.cpp.A68A2AE9FDFA8117.idx deleted file mode 100644 index 90887948e85c092b0abeff4d11d2ba4a6d173591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1464 zcmWIYbaUIl%D~{9;#rZKT9U}Zz`!5^#Kk2=nNt}V7uX{b?L|fnfow4`oBWnJ9`}ym2Qsw{OU9tcAcP2SKS$NV;LP&1w%<|2W z!rW@pM1}7!Ev_`P7xGjS5kA2(vx8YvdCOAEoQu*O_VaDnG-R}1D&(n3a`0bko^E)( zdS%%rW5Fqt7hY~p4V~&5xraUd_DZJElP>#S#hguhY8|#=@dxWWy!TqZuvlODq0wx5 z!Rn2|B&)eCIw{G!4+pK-mu}$Fbd60yIzMVt+F|>JS89@W@N)kARrY`LIjziqmup_C zdY5~q!oBp_MeRs>fwLgzpZC>v!?e;tPnS)UzPde{RlYj@o7WG>)PZt-M{E|o! zK5*-x)!%UL6Ct(tYBKpwR3z|zkWyUVbK{?&;i|2UI~}D1#IO3w1? zB4t&(^d~KT#++08K4E=+YR80sm6OH4&uQtOU%k#a)AZ}d~3prst3^EK1qU`MKf?{IqVuB2kOpJm;B8+0J3`MDF#Ua2rJf~dU(PS6Q&m<$t zqs^la(+K3*^EktJ^}MP%p6~WZF!G3sGKq4+gn!zYHmPpT06Oa*5LGT0x1(Dy71 z2Y*%>Q2{jpJ(#eJsGzE#E`ledCWIs>rXr?;kP}xGhpU8%GD?9X3mAi7aCCLtt*Z<8 zb3vB#a|ysy1#`OY%}o{P14akCEIZt(IvvaQ-~aP?6;POmlZO|k`on+Ild3CfH!=ZL zGqAJ4gn2}zn4~yhygTnVcigeLaRjKBgM$OEw`ET2xh+Rkk1@)Ka*1=nW2#grES524 z=2=k03kV3p3;{;GfFKf2NI(dQCng|<#1j_~hx2y0O|4kx@cahII5q*eH-W~n2_o@? z*o2UHVr*haJaIO0IB&lkgHX=IDR+Q=;TGqH$MV7)Zx*k>wnt1NqCCnxst8B(nDbb| zc$d^R9sA70{s9=`9DE!SFkvgXkEgQP5q~ zNd(1TaZz${Fo+=zA|OBl#$aF&LolTfOlbsD63%24Jz!CKwaiC^n@vnyLQ+baAvrfC YM*t|#$0xwT!_L9R%FD?m%+1UX04bsHyZ`_I diff --git a/src/.cache/clangd/index/config.hpp.C519F3A7E0A75094.idx b/src/.cache/clangd/index/config.hpp.C519F3A7E0A75094.idx deleted file mode 100644 index 8e17046c01f6feefbf712ed77ae456d15ddfdcc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1118 zcmWIYbaM-1VPJ4h@vO*AElC728AO1%xTGjkg^_`QkBNbyV$RZuXR{6)2(*-*3w|+S z+LK4Bjd3MKvo8r~aDI6nqrEAo`$UxTT8_+@yTkirGyH5tSd@8<=ZAHiT^7&1@B-_j zMlVIC%EwuCyKm*rH+%hk`tR*$^M2c=Z{BZIJnjA7i=y>zk)Nil^EunA{N(7X8jYZv z?yi&fOpe?3XVqPC59>z}AC;7Iat~@Jf4w>V*w^p8XI`jEmQ22r-F5FHuAKd(s2g!7^>hy7 z;q;AFHOXsVCNmglPnP$2JIS|gO`83~``bc_D|3@#fnha8OLfIrVJU7tCLUG>ets@~ zK`_C<0Sr$d5Ifg@(@Sip5Fe8uP+EXXKoCs8r0aQAb3EVekziv2s^{lq=i~zu44h!i zjQp(XTby1?T*wLIVGshw3p+czAio&9m>`2B6C*PVH&DS}VZ~sDJN}t`Od{+I{A_$| zB47e$!BJPmD1pWEYWbMBfYK~{EFxe6Ce0r9O>gp-_6>YYqMQu;+9V# o@-y*s!curqYEB|Zrno4%SRBL<01*(t@4+-f@D#^tQAPm<0H}XHF#rGn diff --git a/src/.cache/clangd/index/format.cpp.047FF551BC8DE01E.idx b/src/.cache/clangd/index/format.cpp.047FF551BC8DE01E.idx deleted file mode 100644 index 8e67e132240f7ededef2d0d89cda121a98f21d81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 604 zcmWIYbaM+~VqkDi@vO*AElFfyU|c6{_)Yt#m80Wo-AuW=i{|3Hnx6mY>bPorqc;-`TprF0*rctqrA|d-G>~W0R@juD_6ZHfWl#uhf@TZxN|UeIaN6-}9{A zdgiq2ocZYswo37Cyzuj5Vz1^O1I;(dldKp0&-q#Gk~Z5c!j8TChfwi8OR@Ra6rQZ# z^?U7#y=8N=SL%tK=1?n6(zn))dm#Jw--;s)#g(~9@<6|Pe!aA2e#Qk89tL3s1_5Rs zW(hC>l!1Vv)U@K$K&FZ95w07RQ6h{y0<27|958J#no$Zx+av$ig)WB!>KJ7NIM_IN zVXA^TUH9gu3iPq?2r$brtH6YTJTqn+1dm09MGL`WlVFpB@!p@Z;Cg5pH3{enHU&1g z0ofHfH;aCztp`~r#{m~s@Qh?_*e!4yD9kF!Dho4&p(r&c5#+n#qU2&_5JLz=fB~bx s{`V&i>h5r1WfBx(5QGUcFeK-uee-bWmGT0f`TO!did z6j><#ag%z#T&mUNxovZ2PMKL&`uFR$H(C{|1%xUpe^xNMIDBzE7h|yUxt$5`1I7W);AAK zjoD)P<95aSsLQk5yNqH)Uqv0T`hCyT_csIEzXS1Kwy2!@-0Ju0>*2ISsYPt7j=n8l z*Qp|H?(5*KYvQr&?ft}wFVOzA3pHDKDI21p|~okKYwV@_<4_kcEYX z155yAAfPBUtymn$gsEecLYL1;1gR`8N-ow1F@!(_1PH?z3=9HrCZk|@dt%(3hNE%J e0z$$J$+;;xAW0rRJ|-?!HWp@Xb`E|{MqU7tmY4(p diff --git a/src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx b/src/.cache/clangd/index/markdown.cpp.A5D40F1BF5766683.idx deleted file mode 100644 index cb63c5ca91664f0c9d94a04c82ae4bd63d013b40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3110 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 diff --git a/src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx b/src/.cache/clangd/index/markdown.hpp.66A7ABFD738DA42D.idx deleted file mode 100644 index 05e9cb1cd75a5f48c28a07596be05e406a607567..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1138 zcmWIYbaTsMVPJ4h@vO*AElC728AO1%xTGj^FCzoPUS^xdyT4O=A7Q>U-z}GuU%WZ^vyzrBMT}&KRerg z=vO|f;KN=0yjP(kok!vN(i@sj{2m${WG*|zeMsuty_uX348`^_91fh^^!sa7?fe&I zH!`x_k8a#?^-ssPb794Sj5+tWty8wp+LCa0y--QVtzS1LuP|Afut@!>&E%u0KbQ9S z_LqmAJbv6pfBREE7Twj$m*wc)i%~hVZHm{Au00n->dHH2#Bdea+381YPo1)4uIO8} zrtMENdpcI@Hi={CI&Q&Kj){>R=M zb>Yjw;@s5R*H1j%Jp1~`4}V4Ib`~NPL^jnfPvw|IY zgG}}Qr7S5;xXkbUD{fh1&W%UU4TXFYmT2mo^1pM(osprqGB@caFgBNceV)l@w~CFA ziJgUkhnfUN8ZZzV69m@o@@w92*lbG4Qal zv+;uo22P0XGK+QlZO)ix@h}K8FmQ89aH{YKO9-nlNHQ_9iEuJJyKzce@zDKgd`#j% z!#Vjlg~0^O@cPuCuqzfzPV+H|0j0U5x#YnFO#0f*$||dU78iLKgn)*-@wkcbi1Ubx zfDC691v|vNsU>*hvgM14UmYHZR z5hPm>3p7NSRhSp%F_<(H7sTHXZ!-WD@d=B;6v1dlNr>;EidG+Gnw3z?)&Vq)zZ{fj%}K9(HziUYIj^csSWPd0`<2^olT-B+M&7>kNd=VAk;Ph_i}w!$XHh zTtQq7#)Ihx`VJJ_Fz3Sz0t$nI872(V1#~z#WT6fRhHOqEh+SNiT Date: Sun, 11 Jan 2026 22:53:38 +0100 Subject: [PATCH 8/9] updated makefile, adding new io module --- src/makefile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/makefile b/src/makefile index d921679..fa8f076 100644 --- a/src/makefile +++ b/src/makefile @@ -8,14 +8,16 @@ BUILD_DIR = build SOURCES = main.cpp \ config/config.cpp \ format/format.cpp \ - markdown/markdown.cpp + markdown/markdown.cpp \ + io/io.cpp OBJECTS = $(SOURCES:%.cpp=$(BUILD_DIR)/%.o) TEST_SOURCES = tests.cpp \ config/config.cpp \ format/format.cpp \ - markdown/markdown.cpp + markdown/markdown.cpp \ + io/io.cpp TEST_OBJECTS = $(TEST_SOURCES:%.cpp=$(BUILD_DIR)/%.o) From 858bd19f101ad5d13d6786ec8ead2dae2500c06e Mon Sep 17 00:00:00 2001 From: Szymon P Date: Sun, 11 Jan 2026 23:02:19 +0100 Subject: [PATCH 9/9] added io tests --- src/tests.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/tests.cpp b/src/tests.cpp index 9eace9e..e13575e 100644 --- a/src/tests.cpp +++ b/src/tests.cpp @@ -1,5 +1,6 @@ #include "config/config.hpp" #include "format/format.hpp" +#include "io/io.hpp" #include "markdown/markdown.hpp" #include #include @@ -9,13 +10,14 @@ namespace TestFiles { constexpr const char *config_toml = R"([general] - lang = "en" - title = "Blog" +lang = "en" +title = "Blog" - [contact] - author = "author" - email = "email@example.com" - signal = "signal url")"; +[contact] +author = "author" +email = "email@example.com" +signal = "signal url" +)"; constexpr const char *formatter_html = R"( @@ -76,6 +78,16 @@ This [should be clickable](https://example.com) - nine)"; } // namespace TestFiles +// IO tests +TEST_CASE("Test reading a file successful") { + std::string result = read_file("./test_files/config.toml"); + REQUIRE(result == TestFiles::config_toml); +} + +TEST_CASE("Test reading a file that doesn't exist") { + REQUIRE_THROWS(read_file("this/path/doesnt/exist")); +} + TEST_CASE("Checking config file read", "[config]") { Config config = get_config(TestFiles::config_toml);