From 2d30315a947f60035245b1000816c1ea538e5a62 Mon Sep 17 00:00:00 2001 From: danbugs Date: Thu, 9 Sep 2021 12:01:16 -0300 Subject: [PATCH 1/6] updated version --- Tarantella.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tarantella.toml b/Tarantella.toml index 7f5e228..8004d1e 100644 --- a/Tarantella.toml +++ b/Tarantella.toml @@ -1,6 +1,6 @@ [package] name = "dcw" -version = "0.4.0" # format: major.minor.patch +version = "0.5.0" # format: major.minor.patch module_type = "side_module" # main_module || side_module build_dir = "build" # when modifying this field, change BUILD_DIR in the Makefile too releases_repo = "https://github.com/danbugs/dancing_web" # format: https://github.com// From a9951c1be7a094edf4b03f62b63d6f9e85c98b7d Mon Sep 17 00:00:00 2001 From: danbugs Date: Thu, 9 Sep 2021 12:02:36 -0300 Subject: [PATCH 2/6] removed semi-colon from HTML fxn macro to allow adding it directly in fxn calls --- src/dcw.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dcw.h b/src/dcw.h index 2ff2920..fa207a4 100644 --- a/src/dcw.h +++ b/src/dcw.h @@ -16,7 +16,7 @@ /** A function macro to allow embedding HTML within C files. */ -#define HTML(...) #__VA_ARGS__; +#define HTML(...) #__VA_ARGS__ /** A utility function for easy debug. It prints the variable name and its' value. Usage: From 0f808d4a58dab18d4f9966315de56270a299769c Mon Sep 17 00:00:00 2001 From: danbugs Date: Thu, 9 Sep 2021 16:28:41 -0300 Subject: [PATCH 3/6] added insert_html, remove_html_children_of_id, render_html_loop, display_html_loop, and remove_html_with_class. renamed remove_html to remove_static_html. added more examples --- examples/form/.gitignore | 3 + examples/form/Makefile | 9 +++ examples/form/Tarantella.toml | 10 +++ .../form/dependencies/dcw/Tarantella.toml | 8 +++ examples/form/dependencies/dcw/dcw.h | 36 ++++++++++ examples/form/dependencies/dcw/dcw.js | 43 ++++++++++++ examples/form/dependencies/dcw/dcw.o | Bin 0 -> 5808 bytes examples/form/index.html | 11 +++ examples/form/src/main.c | 65 ++++++++++++++++++ 9 files changed, 185 insertions(+) create mode 100644 examples/form/.gitignore create mode 100644 examples/form/Makefile create mode 100644 examples/form/Tarantella.toml create mode 100644 examples/form/dependencies/dcw/Tarantella.toml create mode 100644 examples/form/dependencies/dcw/dcw.h create mode 100644 examples/form/dependencies/dcw/dcw.js create mode 100644 examples/form/dependencies/dcw/dcw.o create mode 100644 examples/form/index.html create mode 100644 examples/form/src/main.c diff --git a/examples/form/.gitignore b/examples/form/.gitignore new file mode 100644 index 0000000..bcda7b7 --- /dev/null +++ b/examples/form/.gitignore @@ -0,0 +1,3 @@ +build/ +releases/ +# dependencies/ folder is not ignored because tapm doesn't have a npm init equivalent command yet diff --git a/examples/form/Makefile b/examples/form/Makefile new file mode 100644 index 0000000..e09cd01 --- /dev/null +++ b/examples/form/Makefile @@ -0,0 +1,9 @@ +P=form +OBJECTS=src/main.c +EMCC=emcc +EMCC_CFLAGS=-s MAIN_MODULE=1 --js-library dependencies/dcw/dcw.js -s "EXPORTED_RUNTIME_METHODS=['allocateUTF8']" +BUILDDIR=build +DEPENDENCIES=dependencies/dcw/dcw.o + +$(P): $(OBJECTS) + $(EMCC) $(EMCC_CFLAGS) $(DEPENDENCIES) src/main.c -o $(BUILDDIR)/$(P).js \ No newline at end of file diff --git a/examples/form/Tarantella.toml b/examples/form/Tarantella.toml new file mode 100644 index 0000000..7088e8f --- /dev/null +++ b/examples/form/Tarantella.toml @@ -0,0 +1,10 @@ +[package] +name = "form" +version = "0.1.0" # format: major.minor.patch +module_type = "main_module" # main_module || side_module +build_dir = "build" # when modifying this field, change BUILD_DIR in the Makefile too +releases_repo = "" # format: https://github.com// + +[dependencies] # dependencies should not be added manually, use the tapm add command instead + +dcw = "danbugs/dancing_web 0.4.0" \ No newline at end of file diff --git a/examples/form/dependencies/dcw/Tarantella.toml b/examples/form/dependencies/dcw/Tarantella.toml new file mode 100644 index 0000000..912c770 --- /dev/null +++ b/examples/form/dependencies/dcw/Tarantella.toml @@ -0,0 +1,8 @@ +[package] +name = "dcw" +version = "0.4.0" # format: major.minor.patch +module_type = "side_module" # main_module || side_module +build_dir = "build" # when modifying this field, change BUILD_DIR in the Makefile too +releases_repo = "https://github.com/danbugs/dancing_web" # format: https://github.com// + +[dependencies] # dependencies should not be added manually, use the tapm add command instead diff --git a/examples/form/dependencies/dcw/dcw.h b/examples/form/dependencies/dcw/dcw.h new file mode 100644 index 0000000..2ad9068 --- /dev/null +++ b/examples/form/dependencies/dcw/dcw.h @@ -0,0 +1,36 @@ +/** \file + Useful macros intended to be used by the end-user. +*/ + +/* + * Copyright 2021 Danilo Chiarlone + * LICENSE: GNU AFFERO GENERAL PUBLIC LICENSE +*/ + +#ifndef DCW_H +#define DCW_H + +/** A macro that expands to the \c char* type — created to distinguish between normal strings and those that are meant to be rendered to the DOM. +*/ +#define html_t char * + +/** A function macro to allow embedding HTML within C files. +*/ +#define HTML(...) #__VA_ARGS__ + +#define HTMLIFY(str) (html_t) str + +/** A utility function for easy debug. It prints the variable name and its' value. + Usage: + char *hello_world = "Hello, World!"; + dbg(hello_world, %d); + + Output: + "hello_world: Hello, World!" +*/ +#define dbg(to_print, formatter) \ + { \ + printf(#to_print ": " #formatter "\n", to_print); \ + } + +#endif \ No newline at end of file diff --git a/examples/form/dependencies/dcw/dcw.js b/examples/form/dependencies/dcw/dcw.js new file mode 100644 index 0000000..2b02b78 --- /dev/null +++ b/examples/form/dependencies/dcw/dcw.js @@ -0,0 +1,43 @@ +mergeInto(LibraryManager.library, { + displayInner: function (html) { + var element = document.getElementById("output_dcw"); + if (!element) { + var element = document.createElement("div"); + element.id = "output_dcw"; + document.body.appendChild(element); + } + element.innerHTML += UTF8ToString(html); + }, + removeStaticInner: function (html) { + var element = document.getElementById("output_dcw"); + if (!element) { + var element = document.createElement("div"); + element.id = "output_dcw"; + document.body.appendChild(element); + } + element.innerHTML = element.innerHTML.replace(UTF8ToString(html), ""); + }, + removeWithClassInner: function (className) { + let element = document.querySelectorAll(`.${UTF8ToString(className)}`); + if (element) { + element.forEach(function (e) { + e.remove(); + }); + } + }, + removeChildrenOfIdInner: function (id) { + let element = document.querySelector(`#${UTF8ToString(id)}`); + while (element.lastChild) { + element.removeChild(element.lastChild); + } + }, + insertInner: function (html, id) { + let element = document.querySelector(`#${UTF8ToString(id)}`); + if (!element) { + element = document.createElement("div"); + element.id = UTF8ToString(id); + document.body.appendChild(element); + } + element.innerHTML += UTF8ToString(html); + } +}); diff --git a/examples/form/dependencies/dcw/dcw.o b/examples/form/dependencies/dcw/dcw.o new file mode 100644 index 0000000000000000000000000000000000000000..b9bc4e8f89acc45d637a26c245ec7c1c9f46d9e6 GIT binary patch literal 5808 zcmc&&Yiu0Xb-s6Yc4x_1l0$MOE}uGwq$rXSm+zq@%aT?SMN+0ES(0VhqP$uzha!hd zF1fqZBYsepWjU5)S&rfWMH9p*0;F|qv`Fd(2vDFvQ?x~06z!h|Mbo7IQ=n+kqDG4t zXn}rrX82GQ|LCt0oSl2mJ?Gr>yywgnnc|`pLdf5{dGn@-UY2We?XtF}enV^CD~y*n zkZaIZIco(&^m%l9MT<7oEj?;f5w;04|m?*@g6SetxOs6hdnr zxFQ{(rKdARC$uIMZlqW$WS4LFghs)+lFctJ3r#JlnRDIAijX%eE*HRU)?cf47K_=! z{Bp@zN*7j_(*7h31hK(3=PYebvYC>Xa`~*kbDd9ibZ$O3Q*f3}%}&g0p)}{0 zicX>ALkuNReHtpv%om(&DLuQolr7EYm(r!obk32>LKtJG&Lv^#^3gMAPMt}QpL=#v znf9*oWSNkdXtXq?>ci=HL9_{t;S{tx#3YMu~2-ZlFw!k3@ zwR=z!otj`hB{)nvM<~n&MaUTAXi9P!MX79s%eBMWVJaW35I(j^CdXpZY`f+0t)L3U zqmn8)W>So+C`47ZHl>htwmf1hAlA8>s<{Tl*s+#sxyGa#j)Nj@YZp>|ybZ%`E^nvp zTz5opg6b$SqKOo7J%;rzH&BBQNpK?|jV?D)lMk`D8IWd|Td2i{M0p1wJ6tCGDLxeH z)Gjb%6SlQuYIclUJqcSY1h#L(N}J2=)XqCopLyzaw0TzMU9^ijT<)Zu)Msh|2> z9-v+tSmz(+K@bco{vjU1aLDIBjN!22A7vXu8~jbB%oLBnQhNd32k<_Z_tSpb>+)0B z`T!sYTz;CKR*-{quq!0^5IseQMnWQ$;KQIw0Vn115jsMLT|Npb*ocm~JW8Vqa-5DU zsxdlBV~Wb+aZpVFXTs$Zbb`iReg;&NfK0mlEIq3rC+Vc3Iz`XWDMb}!CHQl|dCuiC zbcRm5d=^ya06FLK^YpxeoTu}O>IFJWFMx_dU7Srbu#VVA{09VK61Mi6GIdj` zgrJCvoG_3O!b=EAWtJZiyvBgC%dM$pZlhLeTS3I@yc40_ zzQ7&Sp$yXQ#W-ko*xIt<8|Ph~WV?LHt|JwE#k&HLx~Yr0T?9Xnn-KWBX^)GD4^xk= z4dK;kYkjFNJWnNqpzlSrCtdD?_xpj-uj0Rh`j7#rJU2xHby&AOfn%@^2?c?NPtXLNSm0-nAmBZT7x=2=0nd}*d5TWa$pt=5ryt`vX=^iq_Rj^p z&p?ecw$_f2xr+%fED7_uLp!Y1zD!s2j?>U;ID+@eN^N;E6*xF^9r!nh}A0r-D7Z7(HGLNl;MK5p{ zP`?)Zu+4Ffa@O055`Lw5Rdxg~Vz{VkR=6v4ftN5_@=uvOhIyBlY1w+u^VtdjE4KEr zRLYdNKn2!=pnR2!h>#K$d6i0hl~(EMalQu7b-G5^SNH~`xS*!nO^KD; zlHQbbTdwe165GEeH}=1ymfx0iNAlMty)F42Nf^8X%DZamo}{~y?t${Yr28HnG={M6 zLUnpq212A@6@=IW8N}FolJNgPy8KY#Jp|sQGSwu%ujcQ2bY4b%EcqK!9m0>)!Xr?8 zQ_?qOyT_2eA*;-XG8D#<9a%rJB?9+}1}3CV>n2tGnh+%+(p9Lcb|yq&TSIHn6|!)S zhbZEE)WFbiIZDyMq-6k<*;+!eNN_ooTVGcyVK3BFGF_bMF<+?vKZ)M?N{J@q7V}tN zVV;=MEvAyl@>)pbu4f+?hKa1}_BSCpv~Fn~+M^&+cwrL*eW7RR2*HO5%rwuue#5w5 z)Ka8J)P6oN5)e zU=j-|sOlMO(JaPk+ezLIY_B@5pgJbFUZsYI+n`=?RK*5W644ztQS&&r0DT8K#2qUr ziRdd$s%J)SaIi-cw<@{>xA|P!(a@nV(#{fhP@C!j(F&@Lw-aKcrm2Re3&SoKEnqjw zX~epx+~w^aMLFDUy|3nqTNGt+kAM33n)X1LB=t~og?l|sdp9)gORb?O_W4CILIb|J ze3=G8HbjFon8 zcqj^J6kdm_W$1tID}9hE5!L_1l}O6Fetn1q2LW0j)d^L?;g#!$v4>ct@b~!s-B{=m zZGMA9)l{>>wVo|%16#Cn9Qu0RUO+n(q3y_cKXmFatHUe^oi=k?^V1z(bVA8#QPDJ=wIlm5?cFxL2IwV@*qrd(AIRk_NwSipv#ZYAs4;N zVf191(Wz{nf>cK+MMqZns3+CY4Raks{EgBv8dZINgpT_*_ctE{**JO!boUcjn@}E5 z@uybf>Puif#+5PrFM>$$Mc_vzJyT`=UyrVLy+iO<9bF&zg<|7VS3@3bw)Vk}x_^A> z{_&+N8+u2at*O>Ng3~U7G$Oq#6h-LkWT?8U2Sp+Z01_Zhpo=31@KUv+4AtU+Czh%f z`v0mH<{v44mWh-wj~|%pKX^93=#=K>m#)w?XQ@Qj3VAieje$eUnL<%5l;#}D=5dvR z_53W|$gdVief{%+UN8_M^{2wrh5Ac54Mhyx04+dB zE&5A*w}>_&s%n(nPI|7im`h(PWR{nmf@TRRw%l7tp-U~AoJ`{SC)uxwTFsIII2*8m zkcbOmRc&FF%@-V@(6mjoL0v?I6%y7Kc0*xNA*}Ew(r`p1@A(wlDH7-_hjj55p|JSxuwgukNaG_sKZ!{3 z&ylG3)F?ClDk{zImz4|Scgl3}mu05-X<5wtUU`KuJ}w7kxoLb05&MZ*Y5bEZ%@1N# z!uU>17k>~l&Cg?&5VtB!aj&9Me1PYZib~`23Msy*s1|QkR*Q#tKB=q`|4=E!FRFz3 zORH8GZ&d5XpH)laXL$a-T8bam2=V7N+l;@jk;cE`xm_#8AJ+=;v)Vf2-)g1tUwGb+ zOY!}9z47C?H2wt7-(h~gu2FouE-rq%uEuzjkj962K21QeM6-FT-V(;$dR=^{zFPc# zeYN?M#uj0G)~Jh*ni|D>%{9hvHA~}1cs^^E;`3%Q{sZGXEzlBJIhGEtz7M+=%=^HYPcwV}4zJDm$m+Yg? zxl(DlxWBje3POE#I*EJQ-dygg|I-6P7nhbaJ7|yeXY9RuXQl`2fnjHMaAeS)1+;I_ znH|aOo1GrnYxnofc8T9mdsme*g)0v3I-N{uwcr%x?yALA@4mC=N-jU0$rb+xO-HX) literal 0 HcmV?d00001 diff --git a/examples/form/index.html b/examples/form/index.html new file mode 100644 index 0000000..00d8c9e --- /dev/null +++ b/examples/form/index.html @@ -0,0 +1,11 @@ + + + + + Tarantella App + + +

Hello, Tarantella 💃🕷

+ + + \ No newline at end of file diff --git a/examples/form/src/main.c b/examples/form/src/main.c new file mode 100644 index 0000000..c5e8954 --- /dev/null +++ b/examples/form/src/main.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include "../dependencies/dcw/dcw.h" + +extern void remove_html_with_class(char *class_name); +extern void display_html(html_t raw_html); + +typedef struct +{ + char *first_name; + char *last_name; +} FormInput; + +FormInput finput; + +html_t form_h = HTMLIFY(" \ +
\ +
\ +
\ +
\ +

\ +
\ + \ +"); + +html_t display_h = HTMLIFY(" \ +
\ +

First Name: ${get_first_name()}$

\ +

Last Name: ${get_last_name()}$

\ +
\ +"); + +EMSCRIPTEN_KEEPALIVE +void set_first_name(char* value) { + asprintf(&(finput.first_name), "%s", value); + free(value); +} + +EMSCRIPTEN_KEEPALIVE +html_t get_first_name() { + return finput.first_name; +} + +EMSCRIPTEN_KEEPALIVE +void set_last_name(char* value) { + asprintf(&(finput.last_name), "%s", value); + free(value); +} + +EMSCRIPTEN_KEEPALIVE +html_t get_last_name() { + return finput.last_name; +} + +EMSCRIPTEN_KEEPALIVE +void form_submit(char* value) { + remove_html_with_class("display"); + display_html(display_h); +} + + +int main() { + display_html(form_h); +} \ No newline at end of file From 58c34fb658e536d5056d7da0ca368349965696d6 Mon Sep 17 00:00:00 2001 From: danbugs Date: Thu, 9 Sep 2021 16:29:16 -0300 Subject: [PATCH 4/6] forgot to cd to root --- example/dependencies/dcw/dcw.js | 23 ------ example/dependencies/dcw/dcw.o | Bin 3933 -> 0 bytes example/index.html | 11 --- examples/counter/.gitignore | 3 + {example => examples/counter}/Makefile | 18 ++--- {example => examples/counter}/Tarantella.toml | 19 ++--- .../counter}/dependencies/dcw/Tarantella.toml | 16 ++-- .../counter}/dependencies/dcw/dcw.h | 66 +++++++++-------- examples/counter/dependencies/dcw/dcw.js | 43 +++++++++++ examples/counter/dependencies/dcw/dcw.o | Bin 0 -> 5808 bytes .../counter}/frontend/favicon.ico | Bin .../counter}/frontend/hello_world.cml | 10 +-- examples/counter/index.html | 11 +++ .../counter/src/main.c | 67 +++++++++-------- examples/html_loop/.gitignore | 3 + examples/html_loop/Makefile | 9 +++ examples/html_loop/Tarantella.toml | 10 +++ .../dependencies/dcw/Tarantella.toml | 8 ++ examples/html_loop/dependencies/dcw/dcw.h | 36 +++++++++ examples/html_loop/dependencies/dcw/dcw.js | 43 +++++++++++ examples/html_loop/dependencies/dcw/dcw.o | Bin 0 -> 5795 bytes examples/html_loop/frontend/list.cml | 3 + examples/html_loop/frontend/main.cml | 3 + examples/html_loop/index.html | 11 +++ examples/html_loop/src/main.c | 40 ++++++++++ src/dcw.c | 69 +++++++++++++++++- src/dcw.h | 2 + src/dcw.js | 30 ++++++-- 28 files changed, 416 insertions(+), 138 deletions(-) delete mode 100644 example/dependencies/dcw/dcw.js delete mode 100644 example/dependencies/dcw/dcw.o delete mode 100644 example/index.html create mode 100644 examples/counter/.gitignore rename {example => examples/counter}/Makefile (53%) rename {example => examples/counter}/Tarantella.toml (85%) rename {example => examples/counter}/dependencies/dcw/Tarantella.toml (56%) rename {example => examples/counter}/dependencies/dcw/dcw.h (87%) create mode 100644 examples/counter/dependencies/dcw/dcw.js create mode 100644 examples/counter/dependencies/dcw/dcw.o rename {example => examples/counter}/frontend/favicon.ico (100%) rename {example => examples/counter}/frontend/hello_world.cml (83%) create mode 100644 examples/counter/index.html rename example/src/hello_world.c => examples/counter/src/main.c (74%) create mode 100644 examples/html_loop/.gitignore create mode 100644 examples/html_loop/Makefile create mode 100644 examples/html_loop/Tarantella.toml create mode 100644 examples/html_loop/dependencies/dcw/Tarantella.toml create mode 100644 examples/html_loop/dependencies/dcw/dcw.h create mode 100644 examples/html_loop/dependencies/dcw/dcw.js create mode 100644 examples/html_loop/dependencies/dcw/dcw.o create mode 100644 examples/html_loop/frontend/list.cml create mode 100644 examples/html_loop/frontend/main.cml create mode 100644 examples/html_loop/index.html create mode 100644 examples/html_loop/src/main.c diff --git a/example/dependencies/dcw/dcw.js b/example/dependencies/dcw/dcw.js deleted file mode 100644 index 8149f8c..0000000 --- a/example/dependencies/dcw/dcw.js +++ /dev/null @@ -1,23 +0,0 @@ -mergeInto(LibraryManager.library, { - displayInner: function (html) { - var element = document.getElementById("output_dcw"); - if (!element) { - var element = document.createElement("div"); - element.id = "output_dcw"; - document.body.appendChild(element); - } - element.innerHTML += UTF8ToString(html); - }, - removeInner: function (html) { - var element = document.getElementById("output_dcw"); - if (!element) { - var element = document.createElement("div"); - element.id = "output_dcw"; - document.body.appendChild(element); - } - element.innerHTML = element.innerHTML.replace( - UTF8ToString(html), - "" - ); - }, -}); diff --git a/example/dependencies/dcw/dcw.o b/example/dependencies/dcw/dcw.o deleted file mode 100644 index 56a638e372e46edef80ff0cee235134b09315025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3933 zcmc&%U2GKB6~1?7XJ@^$Yp-pH&2P@Z#@GlqStvt5&TVscjxA^}DlU zenk6R%d>OtchB#g^WC{4(&afRgpluDy?Rv`=jD=II}%au~5 zxL7qbOYU^0Fjo|sno=Y8lA95_KPneX@HSPQTjS1^Go@^?;^tGOg?y?yNI^l|ahr4V zcL$ktr5YnNRdQVsQZ8eY*>W+LUObl1yQL~*l~Bk9_a08(CWqFoalas(R`;xHL(QkcvEjyRHQC_**!9MukJ z2PoPf7gcSGERMyb)q-aQzj2ByAGK7=F^ghcM>^Hn+PG2&wa5FVgbDt(0;x!Q0c)XU@R*`022V|Yc>uG%z zN$>_B8$8}f8>>i!9|rQU$AmxShxB%Bj2S`L)()%DVcz6txG63Wz6CQa9=B2}Z+1TR z%WG@#SDCla7Hadjoi{b3FY(uo+ z-%`blb01b}7vSB1cYC~t_RubmA4TZBK=yk47(J$teYCGb7rdVyrTu-naGLo5tQ_b# z9v`HGbim_7u)-SAVUPQ%Um-{6h_V`>Lo}eQ5_}X^$Dnh}d(_4t(6>b964~@UwN+N0yNTC2Dasttn5Z&n6_n8bzN5>$+V98JU>p3tFTn-bt~GNL zJw#2jU<6PET0_mWW)^fXXsxYXQs^Zx0;;WG#5!8<@dgCkNE>LQ2O5OH0fWfaDtKxP zls(?$6uE^qQOi6!KE#{R+O4zPMr~?ATKyh}&BL}YoKg2JTx#$JSk|o=v2X{gMvqClum$Ja~?lK!!%CMtT-76s!P#uAf2Za zo%cAc{N{LqCIUP|Y07v!Nt3E>7dO;BMN_KoY1BPKGc-NRS<2p5w`*(XDN6&1o7Eoi zy?Q{r6(oz$!KB}~vv_~aR@*kmIm#toQkHnGlvS@C!E+Gj)H}=Q(8oBBQNFs%6d)En zE>bb^s{hR90nFRl2T~PN;S!ZN6g1^!E~7&#ROSV$@C90+3rF}Opi6X-F3s~IvRG6v zLO-Wx>Dg*V*gBqr)90%13v2>(8T+})WSF1F=y|pK8A13f0IsO;cVaFfz*R|0{DLHG zIM*aWxF(PAixM-}CA}!=x}4`565(&iJMnL->6awkl>D-!mn6R;3BoI|d{s>?OL|q( zGAv({^qOynijnN=D4kxHK@tvD1ugc540`MLwN!)rrW(KL+xd+8 zK=NBsZNj(J#BEr-E$MC9>N}*jWSwISy#@XD4g(YOyBV05)xuUBus_2?3vLaJ5O zaYiS@)^N1w&=c6lbqZIXs0q>ZI6{$NNoxSq*jlr4(acebCSF!0Ar{`LWO>-rW7VYo ze;K{No+~f*$Q(8tayDTkzGt`!`*9#Me{aIwEMLtyp zH471KPzk%KnaW%)b+ME#7TuDT5K`Q89+n~`wMcR>iIaY^TN901LJH{I!FK3kl@M0l zJ+3l^k}H&&c2}(@B*G%0i^M(db{Zls62@Jn-mti5WSau|urj3llcmCBx{^)?_A-(5hj$PBnn>KQlk67Iy3Z`R<3XtBL1^cL zQ163~jRpRrN-kP*bA?Ru(9q%jkZrD$X16rUn)Mq^7v}G@kob#cSl`pb!u)|A62H_9 z@o&R4Z-=G%ZCpPIOY!G$M0{k{n7@ul>zg%EVScA3Bz{$6iQm@5toNgFVSW&WWz;gi zYDw{-RcrpqlGZ!1I$^#W3yB}aEbH@FLWpZ|ODxB0#XGn@jMti<$EElpUN3Ic){9%X zKCEpJf2bAWvpQk@E72&-7wSXi&+Dc639i4_OY!{%A%4-Y+WdWkH2;e0dZQFSZ4}~@ z#wPP`kl$3~3d%j~j5>xiMlk&k1=kd@)C(E6RF*M_8Mj<^C$~>5N+Xj?=cmtf?@V?j zyQqDpQYn`AbaqZ>D>DldNqlH_=5iORKigsG;S-OhdhEXLw7qNBr~1;nrzZM#+1*`J9pW1*c3mZ1ns)JJ=%y - - - - - DanCing Web Example - - - - - diff --git a/examples/counter/.gitignore b/examples/counter/.gitignore new file mode 100644 index 0000000..bcda7b7 --- /dev/null +++ b/examples/counter/.gitignore @@ -0,0 +1,3 @@ +build/ +releases/ +# dependencies/ folder is not ignored because tapm doesn't have a npm init equivalent command yet diff --git a/example/Makefile b/examples/counter/Makefile similarity index 53% rename from example/Makefile rename to examples/counter/Makefile index 654a1e8..e12aa77 100644 --- a/example/Makefile +++ b/examples/counter/Makefile @@ -1,9 +1,9 @@ -P=hello_world -OBJECTS=src/hello_world.c -EMCC=emcc -EMCC_CFLAGS=-s MAIN_MODULE=1 --js-library dependencies/dcw/dcw.js -BUILDDIR=build -DEPENDENCIES=dependencies/dcw/dcw.o - -$(P): $(OBJECTS) - $(EMCC) $(EMCC_CFLAGS) $(DEPENDENCIES) src/hello_world.c -o $(BUILDDIR)/$(P).js \ No newline at end of file +P=counter +OBJECTS=src/main.c +EMCC=emcc +EMCC_CFLAGS=-s MAIN_MODULE=1 --js-library dependencies/dcw/dcw.js +BUILDDIR=build +DEPENDENCIES=dependencies/dcw/dcw.o + +$(P): $(OBJECTS) + $(EMCC) $(EMCC_CFLAGS) $(DEPENDENCIES) src/main.c -o $(BUILDDIR)/$(P).js \ No newline at end of file diff --git a/example/Tarantella.toml b/examples/counter/Tarantella.toml similarity index 85% rename from example/Tarantella.toml rename to examples/counter/Tarantella.toml index 7457a8c..1ccd82c 100644 --- a/example/Tarantella.toml +++ b/examples/counter/Tarantella.toml @@ -1,9 +1,10 @@ -[package] -name = "hello_world" -version = "0.1.0" # format: major.minor.patch -module_type = "main_module" # main_module || side_module -build_dir = "build" # when modifying this field, change BUILD_DIR in the Makefile too -releases_repo = "" # format: https://github.com// - -[dependencies] # dependencies should not be added manually, use the tapm add command instead -dcw = "danbugs/dancing_web 0.3.0" \ No newline at end of file +[package] +name = "counter" +version = "0.1.0" # format: major.minor.patch +module_type = "main_module" # main_module || side_module +build_dir = "build" # when modifying this field, change BUILD_DIR in the Makefile too +releases_repo = "" # format: https://github.com// + +[dependencies] # dependencies should not be added manually, use the tapm add command instead + +dcw = "danbugs/dancing_web 0.4.0" \ No newline at end of file diff --git a/example/dependencies/dcw/Tarantella.toml b/examples/counter/dependencies/dcw/Tarantella.toml similarity index 56% rename from example/dependencies/dcw/Tarantella.toml rename to examples/counter/dependencies/dcw/Tarantella.toml index 134507e..912c770 100644 --- a/example/dependencies/dcw/Tarantella.toml +++ b/examples/counter/dependencies/dcw/Tarantella.toml @@ -1,8 +1,8 @@ -[package] -name = "dcw" -version = "0.3.0" # format: major.minor.patch -module_type = "side_module" # main_module || side_module -build_dir = "build" # when modifying this field, change BUILD_DIR in the Makefile too -releases_repo = "https://github.com/danbugs/dancing_webhttps://github.com/danbugs/dancing_web" # format: https://github.com// - -[dependencies] # dependencies should not be added manually, use the tapm add command instead +[package] +name = "dcw" +version = "0.4.0" # format: major.minor.patch +module_type = "side_module" # main_module || side_module +build_dir = "build" # when modifying this field, change BUILD_DIR in the Makefile too +releases_repo = "https://github.com/danbugs/dancing_web" # format: https://github.com// + +[dependencies] # dependencies should not be added manually, use the tapm add command instead diff --git a/example/dependencies/dcw/dcw.h b/examples/counter/dependencies/dcw/dcw.h similarity index 87% rename from example/dependencies/dcw/dcw.h rename to examples/counter/dependencies/dcw/dcw.h index 4139fab..2ad9068 100644 --- a/example/dependencies/dcw/dcw.h +++ b/examples/counter/dependencies/dcw/dcw.h @@ -1,30 +1,36 @@ -#pragma once -/** \file - Useful macros intended to be used by the end-user. -*/ - -/* - * Copyright 2021 Danilo Chiarlone - * LICENSE: GNU AFFERO GENERAL PUBLIC LICENSE -*/ - -/** A macro that expands to the \c char* type — created to distinguish between normal strings and those that are meant to be rendered to the DOM. -*/ -#define html_t char * - -/** A function macro to allow embedding HTML within C files. -*/ -#define HTML(...) #__VA_ARGS__; - -/** A utility function for easy debug. It prints the variable name and its' value. - Usage: - char *hello_world = "Hello, World!"; - dbg(hello_world, %d); - - Output: - "hello_world: Hello, World!" -*/ -#define dbg(to_print, formatter) \ - { \ - printf(#to_print ": " #formatter "\n", to_print); \ - } \ No newline at end of file +/** \file + Useful macros intended to be used by the end-user. +*/ + +/* + * Copyright 2021 Danilo Chiarlone + * LICENSE: GNU AFFERO GENERAL PUBLIC LICENSE +*/ + +#ifndef DCW_H +#define DCW_H + +/** A macro that expands to the \c char* type — created to distinguish between normal strings and those that are meant to be rendered to the DOM. +*/ +#define html_t char * + +/** A function macro to allow embedding HTML within C files. +*/ +#define HTML(...) #__VA_ARGS__ + +#define HTMLIFY(str) (html_t) str + +/** A utility function for easy debug. It prints the variable name and its' value. + Usage: + char *hello_world = "Hello, World!"; + dbg(hello_world, %d); + + Output: + "hello_world: Hello, World!" +*/ +#define dbg(to_print, formatter) \ + { \ + printf(#to_print ": " #formatter "\n", to_print); \ + } + +#endif \ No newline at end of file diff --git a/examples/counter/dependencies/dcw/dcw.js b/examples/counter/dependencies/dcw/dcw.js new file mode 100644 index 0000000..2b02b78 --- /dev/null +++ b/examples/counter/dependencies/dcw/dcw.js @@ -0,0 +1,43 @@ +mergeInto(LibraryManager.library, { + displayInner: function (html) { + var element = document.getElementById("output_dcw"); + if (!element) { + var element = document.createElement("div"); + element.id = "output_dcw"; + document.body.appendChild(element); + } + element.innerHTML += UTF8ToString(html); + }, + removeStaticInner: function (html) { + var element = document.getElementById("output_dcw"); + if (!element) { + var element = document.createElement("div"); + element.id = "output_dcw"; + document.body.appendChild(element); + } + element.innerHTML = element.innerHTML.replace(UTF8ToString(html), ""); + }, + removeWithClassInner: function (className) { + let element = document.querySelectorAll(`.${UTF8ToString(className)}`); + if (element) { + element.forEach(function (e) { + e.remove(); + }); + } + }, + removeChildrenOfIdInner: function (id) { + let element = document.querySelector(`#${UTF8ToString(id)}`); + while (element.lastChild) { + element.removeChild(element.lastChild); + } + }, + insertInner: function (html, id) { + let element = document.querySelector(`#${UTF8ToString(id)}`); + if (!element) { + element = document.createElement("div"); + element.id = UTF8ToString(id); + document.body.appendChild(element); + } + element.innerHTML += UTF8ToString(html); + } +}); diff --git a/examples/counter/dependencies/dcw/dcw.o b/examples/counter/dependencies/dcw/dcw.o new file mode 100644 index 0000000000000000000000000000000000000000..b9bc4e8f89acc45d637a26c245ec7c1c9f46d9e6 GIT binary patch literal 5808 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 literal 0 HcmV?d00001 diff --git a/example/frontend/favicon.ico b/examples/counter/frontend/favicon.ico similarity index 100% rename from example/frontend/favicon.ico rename to examples/counter/frontend/favicon.ico diff --git a/example/frontend/hello_world.cml b/examples/counter/frontend/hello_world.cml similarity index 83% rename from example/frontend/hello_world.cml rename to examples/counter/frontend/hello_world.cml index f78447d..162939b 100644 --- a/example/frontend/hello_world.cml +++ b/examples/counter/frontend/hello_world.cml @@ -1,6 +1,6 @@ -HTML( -
-

${get_counter()}$

- -
+HTML( +
+

${get_counter()}$

+ +
); \ No newline at end of file diff --git a/examples/counter/index.html b/examples/counter/index.html new file mode 100644 index 0000000..b947803 --- /dev/null +++ b/examples/counter/index.html @@ -0,0 +1,11 @@ + + + + + Tarantella App + + +

Hello, Tarantella 💃🕷

+ + + \ No newline at end of file diff --git a/example/src/hello_world.c b/examples/counter/src/main.c similarity index 74% rename from example/src/hello_world.c rename to examples/counter/src/main.c index e5969c4..eb5a372 100644 --- a/example/src/hello_world.c +++ b/examples/counter/src/main.c @@ -1,35 +1,34 @@ -#include -#include -#include -#include "../dependencies/dcw/dcw.h" -// #include "../../src/dcw.h" -> for when I'm checking for mem leaks - -extern void remove_html(html_t raw_html); -extern void display_html(html_t raw_html); - -html_t main_h = -#include "../frontend/hello_world.cml" - ; - -int counter = 0; - -EMSCRIPTEN_KEEPALIVE -void increase_counter() -{ - remove_html(main_h); - counter++; - display_html(main_h); -} - -EMSCRIPTEN_KEEPALIVE -html_t get_counter() -{ - html_t tmp = malloc(128 * sizeof(char)); - sprintf(tmp, "%d\n", counter); - return tmp; -} - -int main() -{ - display_html(main_h); +#include +#include +#include +#include "../dependencies/dcw/dcw.h" + +extern void remove_html_with_class(char* class_name); +extern void display_html(html_t raw_html); + +html_t main_h = +#include "../frontend/hello_world.cml" + ; + +int counter = 0; + +EMSCRIPTEN_KEEPALIVE +void increase_counter() +{ + remove_html_with_class("counter"); + counter++; + display_html(main_h); +} + +EMSCRIPTEN_KEEPALIVE +html_t get_counter() +{ + html_t tmp = malloc(128 * sizeof(char)); + sprintf(tmp, "%d\n", counter); + return tmp; +} + +int main() +{ + display_html(main_h); } \ No newline at end of file diff --git a/examples/html_loop/.gitignore b/examples/html_loop/.gitignore new file mode 100644 index 0000000..bcda7b7 --- /dev/null +++ b/examples/html_loop/.gitignore @@ -0,0 +1,3 @@ +build/ +releases/ +# dependencies/ folder is not ignored because tapm doesn't have a npm init equivalent command yet diff --git a/examples/html_loop/Makefile b/examples/html_loop/Makefile new file mode 100644 index 0000000..e27e137 --- /dev/null +++ b/examples/html_loop/Makefile @@ -0,0 +1,9 @@ +P=html_loop +OBJECTS=src/main.c +EMCC=emcc +EMCC_CFLAGS=-s MAIN_MODULE=1 --js-library dependencies/dcw/dcw.js +BUILDDIR=build +DEPENDENCIES=dependencies/dcw/dcw.o + +$(P): $(OBJECTS) + $(EMCC) $(EMCC_CFLAGS) $(DEPENDENCIES) src/main.c -o $(BUILDDIR)/$(P).js \ No newline at end of file diff --git a/examples/html_loop/Tarantella.toml b/examples/html_loop/Tarantella.toml new file mode 100644 index 0000000..e3471ab --- /dev/null +++ b/examples/html_loop/Tarantella.toml @@ -0,0 +1,10 @@ +[package] +name = "html_loop" +version = "0.1.0" # format: major.minor.patch +module_type = "main_module" # main_module || side_module +build_dir = "build" # when modifying this field, change BUILD_DIR in the Makefile too +releases_repo = "" # format: https://github.com// + +[dependencies] # dependencies should not be added manually, use the tapm add command instead + +dcw = "danbugs/dancing_web 0.4.0" \ No newline at end of file diff --git a/examples/html_loop/dependencies/dcw/Tarantella.toml b/examples/html_loop/dependencies/dcw/Tarantella.toml new file mode 100644 index 0000000..912c770 --- /dev/null +++ b/examples/html_loop/dependencies/dcw/Tarantella.toml @@ -0,0 +1,8 @@ +[package] +name = "dcw" +version = "0.4.0" # format: major.minor.patch +module_type = "side_module" # main_module || side_module +build_dir = "build" # when modifying this field, change BUILD_DIR in the Makefile too +releases_repo = "https://github.com/danbugs/dancing_web" # format: https://github.com// + +[dependencies] # dependencies should not be added manually, use the tapm add command instead diff --git a/examples/html_loop/dependencies/dcw/dcw.h b/examples/html_loop/dependencies/dcw/dcw.h new file mode 100644 index 0000000..2ad9068 --- /dev/null +++ b/examples/html_loop/dependencies/dcw/dcw.h @@ -0,0 +1,36 @@ +/** \file + Useful macros intended to be used by the end-user. +*/ + +/* + * Copyright 2021 Danilo Chiarlone + * LICENSE: GNU AFFERO GENERAL PUBLIC LICENSE +*/ + +#ifndef DCW_H +#define DCW_H + +/** A macro that expands to the \c char* type — created to distinguish between normal strings and those that are meant to be rendered to the DOM. +*/ +#define html_t char * + +/** A function macro to allow embedding HTML within C files. +*/ +#define HTML(...) #__VA_ARGS__ + +#define HTMLIFY(str) (html_t) str + +/** A utility function for easy debug. It prints the variable name and its' value. + Usage: + char *hello_world = "Hello, World!"; + dbg(hello_world, %d); + + Output: + "hello_world: Hello, World!" +*/ +#define dbg(to_print, formatter) \ + { \ + printf(#to_print ": " #formatter "\n", to_print); \ + } + +#endif \ No newline at end of file diff --git a/examples/html_loop/dependencies/dcw/dcw.js b/examples/html_loop/dependencies/dcw/dcw.js new file mode 100644 index 0000000..3d4c6cf --- /dev/null +++ b/examples/html_loop/dependencies/dcw/dcw.js @@ -0,0 +1,43 @@ +mergeInto(LibraryManager.library, { + displayInner: function (html) { + var element = document.getElementById("output_dcw"); + if (!element) { + var element = document.createElement("div"); + element.id = "output_dcw"; + document.body.appendChild(element); + } + element.innerHTML += UTF8ToString(html); + }, + removeStaticInner: function (html) { + var element = document.getElementById("output_dcw"); + if (!element) { + var element = document.createElement("div"); + element.id = "output_dcw"; + document.body.appendChild(element); + } + element.innerHTML = element.innerHTML.replace(UTF8ToString(html), ""); + }, + removeWithClassInner: function (className) { + let element = document.querySelectorAll(`.${UTF8ToString(className)}`); + if (element) { + element.forEach(function (e) { + e.remove(); + }); + } + }, + removeWithIdInner: function (id) { + let element = document.querySelector(`#${UTF8ToString(id)}`); + while (element.lastChild) { + element.removeChild(element.lastChild); + } + }, + insertInner: function (html, id) { + let element = document.querySelector(`#${UTF8ToString(id)}`); + if (!element) { + element = document.createElement("div"); + element.id = UTF8ToString(id); + document.body.appendChild(element); + } + element.innerHTML += UTF8ToString(html); + } +}); diff --git a/examples/html_loop/dependencies/dcw/dcw.o b/examples/html_loop/dependencies/dcw/dcw.o new file mode 100644 index 0000000000000000000000000000000000000000..4b81978f3516936cde2f9c60140413abd78d15a7 GIT binary patch literal 5795 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 literal 0 HcmV?d00001 diff --git a/examples/html_loop/frontend/list.cml b/examples/html_loop/frontend/list.cml new file mode 100644 index 0000000..3198561 --- /dev/null +++ b/examples/html_loop/frontend/list.cml @@ -0,0 +1,3 @@ +HTML( +

%s

+); diff --git a/examples/html_loop/frontend/main.cml b/examples/html_loop/frontend/main.cml new file mode 100644 index 0000000..08d823a --- /dev/null +++ b/examples/html_loop/frontend/main.cml @@ -0,0 +1,3 @@ +HTML( +${list_elements()}$ +); diff --git a/examples/html_loop/index.html b/examples/html_loop/index.html new file mode 100644 index 0000000..d9d7de4 --- /dev/null +++ b/examples/html_loop/index.html @@ -0,0 +1,11 @@ + + + + + Tarantella App + + +

Hello, Tarantella 💃🕷

+ + + \ No newline at end of file diff --git a/examples/html_loop/src/main.c b/examples/html_loop/src/main.c new file mode 100644 index 0000000..8a83f2e --- /dev/null +++ b/examples/html_loop/src/main.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include "../dependencies/dcw/dcw.h" + +html_t main_h = HTMLIFY("
"); +html_t list_h = HTMLIFY("

%s

"); + +extern html_t render_html_loop(html_t html_formatter, char **elements, int num_elements, bool reverse); +extern void insert_html(html_t raw_html, char *id); +extern void display_html(html_t raw_html); + +html_t list_elements() +{ + const int num_months = 12; + + char *months[num_months] = { + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December"}; + + html_t some_html = render_html_loop(list_h, months, num_months, false); + insert_html(some_html, "main_body"); + free(some_html); +} + +int main() +{ + list_elements(); +} \ No newline at end of file diff --git a/src/dcw.c b/src/dcw.c index af8c625..f168943 100644 --- a/src/dcw.c +++ b/src/dcw.c @@ -17,6 +17,7 @@ #include // needed for sprintf #include // needed for free #include // needed for strcat, and strlen +#include // needed for bool, true, and false /** \mainpage \n @@ -39,7 +40,13 @@ extern void displayInner(html_t html); /** A JS funtion that removes HTML from the DOM. \param html The HTML you want to remove. This should be of type html_t or char*. */ -extern void removeInner(html_t html); +extern void removeStaticInner(html_t html); + +extern void removeWithClassInner(char *class_name); + +extern void removeChildrenOfIdInner(char *id); + +extern void insertInner(html_t html, char* id); /** A wrapper around \c parse_html_core to allow setting default argument values. \param in This should contain the some raw html and, maybe, the type @@ -157,8 +164,62 @@ void display_html(html_t raw_html) or char*. */ EMSCRIPTEN_KEEPALIVE -void remove_html(html_t raw_html) +void remove_static_html(html_t raw_html) +{ + html_t rendered_html = parse_html(raw_html); + removeStaticInner(rendered_html); +} + +EMSCRIPTEN_KEEPALIVE +void remove_html_with_class(char *class_name) +{ + removeWithClassInner(class_name); +} + +EMSCRIPTEN_KEEPALIVE +void display_html_loop(html_t html_formatter, char **elements, int num_elements, bool reverse) +{ + int i; + + for ((reverse) ? (i = num_elements - 1) : (i = 0); (reverse) ? (i >= 0) : (i < num_elements); (reverse) ? (i--) : (i++)) + { + char *tmp; + asprintf(&tmp, html_formatter, + *(elements + i)); + display_html(tmp); + free(tmp); + } +} + +EMSCRIPTEN_KEEPALIVE +html_t render_html_loop(html_t html_formatter, char **elements, int num_elements, bool reverse) +{ + int i; + + char *result = (char*) NULL; + char *full_formatter = malloc(sizeof(html_formatter) + 4); + strcat(full_formatter, "%s"); + strcat(full_formatter, html_formatter); + + for ((reverse) ? (i = num_elements - 1) : (i = 0); (reverse) ? (i >= 0) : (i < num_elements); (reverse) ? (i--) : (i++)) + { + asprintf(&result, full_formatter, (result) ? (result) : (""), + *(elements + i)); + } + + free(full_formatter); + return result; +} + +EMSCRIPTEN_KEEPALIVE +void remove_html_children_of_id(char *id) +{ + removeChildrenOfIdInner(id); +} + +EMSCRIPTEN_KEEPALIVE +void insert_html(html_t raw_html, char *id) { html_t rendered_html = parse_html(raw_html); - removeInner(rendered_html); -} \ No newline at end of file + insertInner(rendered_html, id); +}; \ No newline at end of file diff --git a/src/dcw.h b/src/dcw.h index fa207a4..76c72e9 100644 --- a/src/dcw.h +++ b/src/dcw.h @@ -18,6 +18,8 @@ */ #define HTML(...) #__VA_ARGS__ +#define HTMLIFY(str) (html_t) str + /** A utility function for easy debug. It prints the variable name and its' value. Usage: char *hello_world = "Hello, World!"; diff --git a/src/dcw.js b/src/dcw.js index 8149f8c..4f02173 100644 --- a/src/dcw.js +++ b/src/dcw.js @@ -8,16 +8,36 @@ mergeInto(LibraryManager.library, { } element.innerHTML += UTF8ToString(html); }, - removeInner: function (html) { + removeStaticInner: function (html) { var element = document.getElementById("output_dcw"); if (!element) { var element = document.createElement("div"); element.id = "output_dcw"; document.body.appendChild(element); } - element.innerHTML = element.innerHTML.replace( - UTF8ToString(html), - "" - ); + element.innerHTML = element.innerHTML.replace(UTF8ToString(html), ""); }, + removeWithClassInner: function (className) { + let element = document.querySelectorAll(`.${UTF8ToString(className)}`); + if (element) { + element.forEach(function (e) { + e.remove(); + }); + } + }, + removeChildrenOfIdInner: function (id) { + let element = document.querySelector(`#${UTF8ToString(id)}`); + while (element.lastChild) { + element.removeChild(element.lastChild); + } + }, + insertInner: function (html, id) { + let element = document.querySelector(`#${UTF8ToString(id)}`); + if (!element) { + element = document.createElement("div"); + element.id = UTF8ToString(id); + document.body.appendChild(element); + } + element.innerHTML += UTF8ToString(html); + } }); From d78c64cbc58cab6b82bb81e1c444d959a11fcfa4 Mon Sep 17 00:00:00 2001 From: danbugs Date: Thu, 9 Sep 2021 16:40:01 -0300 Subject: [PATCH 5/6] updated doxygen docs --- docs/dcw_8c.html | 352 +++++++++++++++++++++++++----- docs/dcw_8c__incl.map | 23 +- docs/dcw_8c__incl.md5 | 2 +- docs/dcw_8c__incl.png | Bin 19646 -> 21948 bytes docs/dcw_8h.html | 42 +++- docs/dcw_8h_source.html | 36 +-- docs/dcw__internal_8h_source.html | 83 +++---- docs/globals.html | 34 ++- docs/globals_defs.html | 2 +- docs/globals_func.html | 32 ++- docs/search/all_0.js | 5 +- docs/search/all_1.js | 2 +- docs/search/all_2.js | 4 +- docs/search/all_3.js | 4 +- docs/search/all_4.js | 6 +- docs/search/all_5.js | 6 +- docs/search/all_6.html | 30 +++ docs/search/all_6.js | 10 + docs/search/classes_0.js | 2 +- docs/search/classes_1.js | 2 +- docs/search/defines_0.js | 2 +- docs/search/defines_1.js | 4 +- docs/search/defines_2.js | 2 +- docs/search/enums_0.js | 2 +- docs/search/files_0.js | 6 +- docs/search/functions_0.js | 5 +- docs/search/functions_1.js | 4 +- docs/search/functions_2.js | 4 +- docs/search/functions_3.html | 30 +++ docs/search/functions_3.js | 10 + docs/search/searchdata.js | 4 +- docs/search/variables_0.js | 2 +- examples/html_loop/src/main.c | 4 +- src/dcw.c | 60 ++++- src/dcw.js | 2 +- 35 files changed, 645 insertions(+), 173 deletions(-) create mode 100644 docs/search/all_6.html create mode 100644 docs/search/all_6.js create mode 100644 docs/search/functions_3.html create mode 100644 docs/search/functions_3.js diff --git a/docs/dcw_8c.html b/docs/dcw_8c.html index 4f2832a..4d7ba53 100644 --- a/docs/dcw_8c.html +++ b/docs/dcw_8c.html @@ -70,7 +70,6 @@
@@ -84,43 +83,56 @@ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <stdbool.h>
#include "error.cml"
Include dependency graph for dcw.c:
- - - - - - - - - + + + + + + + + + +
- - - -

-Macros

#define dbg(to_print, formatter)
 
- - + + + + + + + + - - + + + + + + + + + + + +

Functions

void displayInner (html_t html)
 
void removeInner (html_t html)
 
void removeStaticInner (html_t html)
 
void removeWithClassInner (char *class_name)
 
void removeChildrenOfIdInner (char *id)
 
void insertAtIdInner (html_t html, char *id)
 
html_t parse_html_wrapper (parse_html_args in)
 
html_t parse_html_core (html_t raw_html, marker_t marker)
 
EMSCRIPTEN_KEEPALIVE void display_html (html_t raw_html)
 
EMSCRIPTEN_KEEPALIVE void remove_html (html_t raw_html)
 
EMSCRIPTEN_KEEPALIVE void remove_static_html (html_t raw_html)
 
EMSCRIPTEN_KEEPALIVE void remove_html_with_class (char *class_name)
 
EMSCRIPTEN_KEEPALIVE void display_html_loop (html_t html_formatter, char **elements, int num_elements, bool reverse)
 
EMSCRIPTEN_KEEPALIVE html_t render_html_loop (html_t html_formatter, char **elements, int num_elements, bool reverse)
 
EMSCRIPTEN_KEEPALIVE void remove_html_children_of_id (char *id)
 
EMSCRIPTEN_KEEPALIVE void insert_html_at_id (html_t raw_html, char *id)
 
@@ -129,24 +141,61 @@

Variables

Detailed Description

A framework to write HTML directly within C and have it call C functions. Users interact with it through the display_html and remove_html functions, and the html_t and HTML macros in dcw.h.

-

Macro Definition Documentation

- -

◆ dbg

+

Function Documentation

+ +

◆ display_html()

- + - - + + + + +
#define dbgEMSCRIPTEN_KEEPALIVE void display_html ( to_print, html_t raw_html)
+
+

A wrapper for parse_html, and the JS funtion displayInner .

+
Parameters
+ + +
raw_htmlThe HTML you want to display. This should be of type html_t or char*.
+
+
+ +
+
+ +

◆ display_html_loop()

+ +
+
+ + + + + + + + + + + + - - + + + + + + + + @@ -155,58 +204,108 @@

-Value:
{ \
-
printf(#to_print ": " #formatter "\n", to_print); \
-
}
-

A utility function for easy debug. It prints the variable name and its' value. Usage: char *hello_world = "Hello, World!"; dbg(hello_world, d);

-

Output: "hello_world: Hello, World!"

+

Displays a char** as HTML inside a specific HTML formatter.

+
Parameters
+

EMSCRIPTEN_KEEPALIVE void display_html_loop (html_t html_formatter,
char ** elements,
 formatter int num_elements,
bool reverse 
+ + + + +
html_formatterWhere each element of your char** will be rendered (e.g., "<p>%s</p>") - use normal C formatters.
elementsThe array you want to render.
num_elementsThe number of elements of the elements array.
reverseIf true , the array will be rendered in reverse. or char*.
+ +
-

Function Documentation

-
-

◆ display_html()

+ +

◆ displayInner()

- + - +
EMSCRIPTEN_KEEPALIVE void display_html void displayInner ( html_t raw_html)html)
-

A wrapper for parse_html, and the JS funtion displayInner .

+

A JS funtion that renders the HTML to the DOM.

Parameters
+ + +
htmlThe HTML you want to render. This should be of type html_t or char*.
+
+
+ +
+
+ +

◆ insert_html_at_id()

+ +
+
+ + + + + + + + + + + + + + + + + + +
EMSCRIPTEN_KEEPALIVE void insert_html_at_id (html_t raw_html,
char * id 
)
+
+

A wrapper for parse_html, and the JS funtion insertAtIdInner .

Parameters
+
raw_htmlThe HTML you want to display. This should be of type html_t or char*.
idThe ID where you want to insert the parsed HTML at.
- -

◆ displayInner()

+ +

◆ insertAtIdInner()

- + - + + + + + + + + + + +
void displayInner void insertAtIdInner ( html_t html)html,
char * id 
)
-

A JS funtion that renders the HTML to the DOM.

Parameters
+

A JS funtion that renders the HTML to the DOM at a specific ID.

Parameters
+
htmlThe HTML you want to render. This should be of type html_t or char*.
idThe id of the HTML you want to render.
@@ -273,14 +372,64 @@

-

◆ remove_html()

+ +

◆ remove_html_children_of_id()

+ +
+
+ + + + + + + + +
EMSCRIPTEN_KEEPALIVE void remove_html_children_of_id (char * id)
+
+

A wrapper for the JS funtion removeChildrenOfIdInner .

+
Parameters
+ + +
class_nameThe id of the HTML you want to remove the children of. This should be of type html_t or char*.
+
+
+ +
+
+ +

◆ remove_html_with_class()

- + + + + + + +
EMSCRIPTEN_KEEPALIVE void remove_html EMSCRIPTEN_KEEPALIVE void remove_html_with_class (char * class_name)
+
+

A wrapper for the JS funtion removeWithClassInner .

+
Parameters
+ + +
class_nameThe class of the HTML you want to remove. This should be of type html_t or char*.
+
+
+ +
+
+ +

◆ remove_static_html()

+ +
+
+ + + @@ -288,7 +437,7 @@

-

A wrapper for parse_html, and the JS funtion removeInner .

+

A wrapper for parse_html, and the JS funtion removeStaticInner .

Parameters

EMSCRIPTEN_KEEPALIVE void remove_static_html ( html_t  raw_html)
@@ -298,14 +447,38 @@

-

◆ removeInner()

+ +

◆ removeChildrenOfIdInner()

+ +
+
+
raw_htmlThe HTML you want to remove. This should be of type html_t or char*.
+ + + + + + + +
void removeChildrenOfIdInner (char * id)
+
+

A JS funtion that removes the children of an HTML node with a specific ID.

Parameters
+ + +
htmlThe ID of the parent HTML.
+
+
+ +
+
+ +

◆ removeStaticInner()

- + @@ -313,13 +486,88 @@

-

A JS funtion that removes HTML from the DOM.

Parameters
+

A JS funtion that removes static HTML from the DOM.

Parameters

void removeInner void removeStaticInner ( html_t  html)
htmlThe HTML you want to remove. This should be of type html_t or char*.

+
+
+ +

◆ removeWithClassInner()

+ +
+
+ + + + + + + + +
void removeWithClassInner (char * class_name)
+
+

A JS funtion that removes HTML from the DOM with a specific class.

Parameters
+ + +
htmlThe class of the HTML you want to remove.
+
+
+ +
+
+ +

◆ render_html_loop()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EMSCRIPTEN_KEEPALIVE html_t render_html_loop (html_t html_formatter,
char ** elements,
int num_elements,
bool reverse 
)
+
+

Renders a char** as HTML inside a specific HTML formatter.

+
Parameters
+ + + + + +
html_formatterWhere each element of your char** will be rendered (e.g., "<p>%s</p>") - use normal C formatters.
elementsThe array you want to render.
num_elementsThe number of elements of the elements array.
reverseIf true , the array will be rendered in reverse.
+
+
+
Returns
The rendered HTML that can be inserted into any part of the DOM. or char*.
+

Variable Documentation

@@ -335,7 +583,7 @@

Initial value:
=
-
# 31 "/mnt/c/Users/danil/source/repos/dancing_web/src/dcw.c" 2
+
# 32 "/mnt/c/Users/danil/source/repos/dancing_web/src/dcw.c" 2

The HTML that is displayed to the users then there is DCW encounters an error.

diff --git a/docs/dcw_8c__incl.map b/docs/dcw_8c__incl.map index 55e55c0..4481b0b 100644 --- a/docs/dcw_8c__incl.map +++ b/docs/dcw_8c__incl.map @@ -1,11 +1,12 @@ - - - - - - - - - - - + + + + + + + + + + + + diff --git a/docs/dcw_8c__incl.md5 b/docs/dcw_8c__incl.md5 index 3383d7c..93fad17 100644 --- a/docs/dcw_8c__incl.md5 +++ b/docs/dcw_8c__incl.md5 @@ -1 +1 @@ -5ce12cf315bdc2fd53b0abe1d271605e \ No newline at end of file +a660977b8c4d102b08b7bf46ef82af80 \ No newline at end of file diff --git a/docs/dcw_8c__incl.png b/docs/dcw_8c__incl.png index b299d4c730892519bd4b1486626c77ec2514dfd0..821af52b913ae8b3ddc97eaba10cb19941fb0edc 100644 GIT binary patch literal 21948 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 literal 19646 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 #define 
html_t   char *   -#define HTML(...)   #__VA_ARGS__; +#define HTML(...)   #__VA_ARGS__   + +#define HTMLIFY(str)   (html_t) str +  +#define dbg(to_print, formatter) + 

Detailed Description

Useful macros intended to be used by the end-user.

Macro Definition Documentation

+ +

◆ dbg

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define dbg( to_print,
 formatter 
)
+
+Value:
{ \
+
printf(#to_print ": " #formatter "\n", to_print); \
+
}
+

A utility function for easy debug. It prints the variable name and its' value. Usage: char *hello_world = "Hello, World!"; dbg(hello_world, d);

+

Output: "hello_world: Hello, World!"

+ +
+

◆ HTML

@@ -109,7 +147,7 @@

  ...) -    #__VA_ARGS__; +    #__VA_ARGS__
diff --git a/docs/dcw_8h_source.html b/docs/dcw_8h_source.html index ad79a00..7eb2f0e 100644 --- a/docs/dcw_8h_source.html +++ b/docs/dcw_8h_source.html @@ -73,21 +73,27 @@
dcw.h
-Go to the documentation of this file.
1 #pragma once
-
2 
-
6 /*
-
7  * Copyright 2021 Danilo Chiarlone
-
8  * LICENSE: GNU AFFERO GENERAL PUBLIC LICENSE
-
9 */
-
10 
-
13 #define html_t char *
-
14 
-
17 #define HTML(...) #__VA_ARGS__;
-
18 
-
27 #define dbg(to_print, formatter) \
-
28  { \
-
29  printf(#to_print ": " #formatter "\n", to_print); \
-
30  }
+Go to the documentation of this file.
1 
+
5 /*
+
6  * Copyright 2021 Danilo Chiarlone
+
7  * LICENSE: GNU AFFERO GENERAL PUBLIC LICENSE
+
8 */
+
9 
+
10 #ifndef DCW_H
+
11 #define DCW_H
+
12 
+
15 #define html_t char *
+
16 
+
19 #define HTML(...) #__VA_ARGS__
+
20 
+
21 #define HTMLIFY(str) (html_t) str
+
22 
+
31 #define dbg(to_print, formatter) \
+
32  { \
+
33  printf(#to_print ": " #formatter "\n", to_print); \
+
34  }
+
35 
+
36 #endif
Go to the documentation of this file.
1 
-
5 #include "dcw.h"
-
6 
- -
12 {
-
13  RENDERABLE_MARKERS,
-
14  EXECUTABLE_MARKERS,
-
15 };
-
16 
-
20 typedef struct
-
21 {
-
22  char expression[20]; // maximum 20 chars (using this instead of char* to avoid a null-pointer-dereference)
-
23  enum marker_type type;
-
24  int size;
-
25  int front_size;
-
26  int back_size;
-
27  int eval_increment;
-
28  // ^ how many characters we need to add to the expression when evaluated
-
29  // (i.e., 1 for RENDERABLE_MARKERS due to the '_' , and 8 for EXECUTABLE_MARKERS due to the 'Module._')
-
30 } marker_t;
-
31 
-
35 typedef struct
-
36 {
-
37  html_t raw_html;
-
38  enum marker_type marker;
- -
40 
-
44 #define parse_html(...) parse_html_wrapper((parse_html_args){__VA_ARGS__});
-
45 
- -
47 
-
48 html_t parse_html_core(html_t raw_html, marker_t marker);
-
49 
-
50 void display_html(html_t raw_html);
+
4 #ifndef DCW_INTERNAL_H
+
5 #define DCW_INTERNAL_H
+
6 #include "dcw.h"
+
7 
+ +
13 {
+
14  RENDERABLE_MARKERS,
+
15  EXECUTABLE_MARKERS,
+
16 };
+
17 
+
21 typedef struct
+
22 {
+
23  char expression[20]; // maximum 20 chars (using this instead of char* to avoid a null-pointer-dereference)
+
24  enum marker_type type;
+
25  int size;
+
26  int front_size;
+
27  int back_size;
+
28  int eval_increment;
+
29  // ^ how many characters we need to add to the expression when evaluated
+
30  // (i.e., 1 for RENDERABLE_MARKERS due to the '_' , and 8 for EXECUTABLE_MARKERS due to the 'Module._')
+
31 } marker_t;
+
32 
+
36 typedef struct
+
37 {
+
38  html_t raw_html;
+
39  enum marker_type marker;
+ +
41 
+
45 #define parse_html(...) parse_html_wrapper((parse_html_args){__VA_ARGS__});
+
46 
+ +
48 
+
49 html_t parse_html_core(html_t raw_html, marker_t marker);
+
50 
+
51 void display_html(html_t raw_html);
+
52 #endif
-
html_t parse_html_core(html_t raw_html, marker_t marker)
Definition: dcw.c:79
-
Definition: dcw_internal.h:35
-
marker_type
Definition: dcw_internal.h:11
+
html_t parse_html_core(html_t raw_html, marker_t marker)
Definition: dcw.c:98
+
Definition: dcw_internal.h:36
+
marker_type
Definition: dcw_internal.h:12
-
html_t parse_html_wrapper(parse_html_args in)
Definition: dcw.c:48
-
#define html_t
Definition: dcw.h:13
-
void display_html(html_t raw_html)
Definition: dcw.c:148
-
Definition: dcw_internal.h:20
+
html_t parse_html_wrapper(parse_html_args in)
Definition: dcw.c:66
+
#define html_t
Definition: dcw.h:15
+
void display_html(html_t raw_html)
Definition: dcw.c:167
+
Definition: dcw_internal.h:21