From 3a4cd1b5ac38826f855f74960ba74b1cd2186ddc Mon Sep 17 00:00:00 2001 From: Sohang Chopra Date: Wed, 5 Jun 2024 21:27:58 +0530 Subject: [PATCH] Allow installing as an offline Progressive Web App (#3) * Update readme.md Updated link to ngn's implementation of k9 in readme that was pointed to a deleted sr.ht page * accessibility updates for web interface: * updated version of the language bar * always use local lb.js * * * * * Added PWA Manifest * Added favicon * Show APL logo in title * Service Worker to cache urls for offline use * Now working offline! * log error if any url failed to add to cache * log error url * manifest: specify full start url Previously, in installed PWA, it was using sohang3112.github.io as base url (i.e., without /ngn-apl) * Disable cache * add preview screenshot image * replace sohang3112 with abrudz * undo formatting refactors to preserve original code style of abrudz repo * discard formatting changes - keep original repo's code style * ignore testing scripts in testing/ folder --------- Co-authored-by: Eli Mellen <3342274+eli-oat@users.noreply.github.com> Co-authored-by: eli-oat --- .gitignore | 40 +++++++++++++++++++++++ icons/apl-logo.png | Bin 0 -> 4275 bytes index.html | 8 +++++ manifest.json | 12 +++++++ ngn-apl-screenshot.png | Bin 0 -> 20847 bytes readme.md | 6 ++-- serviceWorker.js | 70 +++++++++++++++++++++++++++++++++++++++++ web/index.html | 18 +++++++++-- web/lb.js | 2 +- 9 files changed, 151 insertions(+), 5 deletions(-) create mode 100644 .gitignore create mode 100644 icons/apl-logo.png create mode 100644 manifest.json create mode 100644 ngn-apl-screenshot.png create mode 100644 serviceWorker.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f227c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +testing/ +util.sh + +# Created by https://www.toptal.com/developers/gitignore/api/macos +# Edit at https://www.toptal.com/developers/gitignore?templates=macos + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +# End of https://www.toptal.com/developers/gitignore/api/macos \ No newline at end of file diff --git a/icons/apl-logo.png b/icons/apl-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..65dac047b430fa596d31231c8d35ab6d0a898d38 GIT binary patch literal 4275 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 Vwn;ob+baM7002ovPDHLkV1gLB2v-0A literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 056a802..903f008 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,15 @@ ngn/apl + + + + + + + +

Demo

diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..691f153 --- /dev/null +++ b/manifest.json @@ -0,0 +1,12 @@ +{ + "name": "ngn/apl", + "icons": [ + { + "src": "icons/apl-logo.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": "https://abrudz.github.io/ngn-apl/web/index.html", + "display": "standalone" +} \ No newline at end of file diff --git a/ngn-apl-screenshot.png b/ngn-apl-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e877c60842da5f9825dda2c05d2f44c7f6d44050 GIT binary patch literal 20847 zcmeFYcT`i`+b)XRt=N!lfgp9O8&s+&y+vg!N>@tgQIOsYorDm}R+Oqzr3C4{1ccC| zLK3MFkQzvY009C72oN9%IlQV6S#Nx?+1K*hs^l+4tN|n%)8^>dTftZ90+`1aEq_9Pke!Q@w@v?lbd{e zsD$I}M~8UVN1xoa4dmlH*}ngK0PkP?n2+!N@Av+`X&L6UJSos(6`Td!Rf<05_003A z*LhEwc)RuNbf4$vl-(-N#yP8%xVro_J{s zdpzFc#ixA0U)HxgZFI(P-TZQ>?sDK3$$dGB@jHJQ2CgvXodw?-6ZEdyWWgf^y+^MT zbZT`^5$k#Tb=fd3! zpeltG;MHL#IJD(wl`!tJo)=dk0|u2}x@>J{qlR9Ad#yp&S>X3A6u#!1_?HmqrZUPK zGVx+^SY7Gd``N~=v#vkWso?qwd+SJ($jDCh7=br6zC-KlVBeh@AL2QiD}ZwKGXv!+y~ey*EQyr@{|VM{u+tFt0oo#rIx1+COW57-)$)F=D=9WR zS!$$r`A-|So2J#44zC~kUTLLKWjS8j-sofhA{q=T(6DV1`)9ycR{G%dm(6$LV=S4n zPt0qNCkyn&cB{7aQsLxUjwfH+NUvnkk@S!|9x6%Yj;Rp``SWx@zZ<^T*{f`YLgWqo zCz`HV3ui;d>ixQ%`=i$LCUUvuOQEjB(x7BOSy!qnF{IixMyWetWMpzYctU|VTp?Hm zzdYaFwlhc?j`Mr7DJZN?9HLYhcy83%$vu3N2M*>2(Dyi9ohE7k{Ph<5)H`j3Y zl;w8Zuj)6tkgi{6i49TPR($atMl}jUh4}L6wBc5=m9H3c9m)Fo&zLeJYay;vd2{pj z6_giInNq8uJ+blO_Rd~b;(O3r8c9vjiA1rPh#GM!rk~gPNNu>6ieJX=%rVAbT5@{e zTBqr(Y`T`gkRlpC+ZozaG|sT=9VkYsyhTusk4YY#T!hI9dguqxNP}@=bxqn=^1CY? zkuL)-MlD-RbV;<*kGqf`!2sU65^52avE$xo+d$G?*$1^G zn~BQ69$FD@Hu+U<=`q5`))jw}XpA9jRb@TV2H_1kb?(_#+}oYQ5jKb>yEaxN3{ z^X^}eL4-N=DEc~R$`rQgX+}>#ZRN+?Vc93+FQm~%+()}M(o&IvUZNN|;v9D4J%N+P zoXE`5pR-yHbtIAkjTagp?^-Q{Q|Hn-#WlVpvCskA(637kn(!=;m8xEluMsKXK=^X_ zxmk(ei*+@)?(-n-IlB~ipcx#o{?m^z-%rjxk*(;O;~|=f1T7phzuTu@b*`Fj3GU8a zpoJTNF1@teb@Z>2Okw-^XLHp7CreIREq%bz1D~)rX1V?o;TtUH4X2AS6_YZ{2ut?T zs31Pn33?w@fKs_W>CM_&*8fQLjC>+$ciwP4bHIGHDfGlRqtt)F7k$_RbJyBSB?Z=-fF9%&VwEMg{dr8UE(p2lw6I_q30DNe1^Q^#Kla!i(z*!baH(eFs zgpTmI-`#XOq;1(s-?pYIVy-4KLGjt19XAS$A5kNpxfHLVbNp@@EUoa%0tORg8Y`lv zvo{MWi>`=Ut{ZU*4;$~Pbb3t?9IxZ2Mc9}9ksEi=P4M=!g4v_m{&hz7P*8a5l zctwR?M$3b-VP@_%_s3f;M330wV|+%bi;~hWecGm8LDhYlP%|Pb=*QVcz_KixHHE6n zGx+Xjl{fMcWdp>*NyE=bdBJr16Sa!3?x|a78f@5aLJE4}YQXpzBYNM9I(*AB?Wj5Y zy8SRns=up#(~@KN%ISrzYghc-7q=FO^)TyGRY61L@kU-YFI;`g*`_FiEicP^ELqp6&cp#GRh4r& z!#EyN2MDZ8#H6HbmNebz9(R3+iRzx4`{G%-dAEH-$BJ0in3{zMaSm4j#X4R7P;;Ix zpX8H0#yF9b8VKDhhqz3~zfJgY7ek-?vdCLHOf>sT&)l5NB*ozR;*(L=CP9Z6U`Ljr ziuL$0K`?;4-P^i`xzqNSb?XM5^0{>@26!&~@u|#}GyaGf##%vds1T;#A#wH7>D9W+ z?30keDnolKS$^8e_ki^%_qxkZigF%CK5c2l(yD-;%_LKWj}QFz;Ki8^b%6Ax?1;YX z@G643i6P8Yn!nm!FX-N2q9KT00Va6wu@j?RL%x=Jn)FfEJU7*MFIGJS^@?FvithP$ zSqtq2nEdwT!k;B)+t!B%hFOuj+Trat?S7U>M2{%=H})RCvB12L=5LJh31gTYg_3 z_ZgE?d3;q>;Rr}pbZ0LefsTf&D|}S{P?LimU|!|U)yoM=%Z&>_7(a9W`p2tukFnHC z?T2bOB^+BYr=3qRje5r(G}V+NgN3ovBt7nue-g-nWIGZ7BhJEsxMvTA>LzLCsL zj7ne7tlfpBWi|U%0Jko^r*BK!iZ}uVA45;dawFEAj5{gTg*I0r)wwYEwsB}~xpHpX zsSDb#1ZPkx9JW`2v_d<2X2OeaH2S=TKvQ1DNCu zduZVH*y6~E^-X@K^_uA(b1fyGI(soB5G2f;pVHo;zH>60nyVsb!n12|Bf(e#&9cyV ze$UAgq1M|SnEbJ3R&QYG*4u+3mY`ddF7f(gdN_rHIzo$fF=Mukl295MSZvCDC6_J7JFeV)qs0LcYI>6ygDBJHoD#jaX;OXj{wR@z&vAKgurp z>CXKL^m2$~`{iEiqO8wc_ebB9&PveHWA8LX3{(ayK4d02@h$djX20?0Y_+9ntYg=} zN}QR)@#5W|$pD%4)!a@B zAm{GF!0OMe!+&{tq*=!^Mv}5NM8!XQK?65zx&%AMstd|p(YwJvgx{9Vp1-ly=2o$V zT`tFB*wJsp?^@I()$Lwd|D*Q7@XlUs9 zsOJ9F2b1ge7l?rFNdKp@2YR6vDI59azsDy_D?OP_Zi=uEKX8quDBSu`mg%b((Hw@U zA(xyrw~vZT{_4BeGC=uzT|@yIVD(#{&fmQlOu^Lck+n||o*eCD%3VmTM_4AUp!{K~ zWLfF4o44<3(vDYrU0_EptAG7Vs7WQs1gt;EtP6-JRrHX~_S_BM@`6UGwdj#Ad5cy> z>XzNUT?QB+RDVG=q5AKa6VpgExh{k!A(=Kiz*R zBjD4NpgF{Pu;;+9;X&VRLyx?+J7-O9x@8@zC*Nh{*p4-dkK3UcMOsGy%DU4Q2Dkw} zQmUFtDkr}Tj)2kN0_tu};H`ejB?a1W_VpsL)shm~)|LfJ=95|eV8_Ue4)Eo05~+y< zb#1vq5Hu6e3L6ac3W;1;)7HKdtl2il=~?_^c6NIKfn0jI;9W%m4G+9;;SN_qY!=E+?GtYHLnDb;NbEuVyz0 z-gref>M!c&+%Huv_v@}fa~4?^NiQ;zJ!|^xZ^M1o8i?IA18sAX&3n3$Djs(v6ClDO(gKUvVTDz>SsuAs|qS(t>Y zQ2q3uV`$0eCYGk22WF}ZG0wRxts3=^dudu7;w(=rZt1lMn0%*`_7U~ zA8Mb?a7?bZ-(1W6A{3sndF1W}TT3l5_mfJAXSIlF z-5$$BsX?G^dx0#I_yWdz7ia0Tik=LO?|@h>w_9U*5`!(dL&uYEdBNvXlw7BRn0KSn z3+DT+>>5`VCsVVvy;4bZZk*8hd&5Sd0X-gj z%7T8swRxl{x6&TrK$Eqw?sBs|=Y3y(&lrlq#gz`$_8*_jc~tP?0p*&B;HJ-% z+nf8CNNnngtdpGb9C_PcDJKD{duXM=!8|nxHfw3wtZOp2+1egzmx9U**pCbdw`_cV z3;1W?`F-f;%fJ$q;?E%pCbId-2M4v?U8@Sl#G#&FWN5DMHoY`u#MaMt1~$zswiFaD z{d9CXYL-$-D6zY*p(xiNe27G{R3pBNTIqyMlo?(yQC*s{-Kh703*M0&>|*bN^7T!$KVB6V8oj*#3HY`)yrrX!cBo@O*8T*&b=;z)cGMVVxm8zvXMP z)Fn~JcjycBu?PR09%D`ZjBXjy{jDoSQb528|8cr*O zr>3Iqq+Vex_>_I!O!g>X2H`%DO}(g)F7!`r^qmJEN>9KeH0175bu$lJnmipu%A0$a zUGfN~+)Z|SX6|{YIzr`Mr3MJ3E^B#ft&loD4lf&{naQDtW~0Urk8fn^zMV1;tr`q@ zH3+hVW-IO*C%Wiw?o`j~W+o^W%j=3sdllZe5??el+mogCPt8=LuC1tw9+l5VxC5GEBbn{?qeJb|Ujn#dy{WEwpQ6&|jnF zrG$oon>o3j?OqRL%(@RGCI&?8?g?yLD&7{HTsa)ua-!cw#5Y+!vs6*ZH7--&)iFT3 zfA{m%mh(CF{g;nh(r#6CY3gaWJr+3MOj2=h)a}baW?QsM)B`nT+_S+}V>KdKZ`Bn~ zzFlgzV%fTq2{ISu2S(WGbmKUpoUU0dboR4Jf66eXmJi*umzfe1eTPZRFfOvW)^~$9I+)_=ToWK^k5MOqfTxPj8*&FZQN$WE} zsK^e^G`5e=Xaq4}h183s@99qxN*;vdZ)94`9I_4n_yAKpkcWpBY7~J~Us=cBi|c;6 zvxZ?cSPy(Wsr`kv1(e;R6a+exAGK2|1eN*}F9d&m-Cm<<4m+-?Yx7OQ`Xti)BPpmXB zOlj9#3wU?zOPS&QH~vGindrkZh`hNS0O7i3M7`{Z+2nZKrFOg9k6OmwL`@nbO5P}F zb+fCxtbY9BBJ{=M?5|&LyKJl4-xWN*9ynhnvTeML2rjB9JE@fvQ#UTJ!&9y;70B9 zC)WKoNo>ES_m-c5XIqaA9yWV%wZx_dlqsdQ4`K zHU|`r8#Vof|GtO;pSgU}!^JpPL~SCnYA`w^L7*h}+6Zy|4o1aN5bdofy7$s>W?n-;jW10N!{1v`x}o%=T9BzwtIbDdl4(V) z3m0g*ACN}t>*f%hE>Z$1GBvb*Ix|_8CSY4J(!Q0*TtF0UPS0>U7elRB#{CT%R}1ki z^n@7f?FMA9q=wRB;iIzTR}@upzYo}B_{j*&aS-yD1qy}N1fQ#5v8}IYqb~xj3nUsu zvx?U5izd6+mc2VHv?-97jKd@G4PMEl%}(W<`QHbs`}5lRbBZa{Mt!>|k17}Z)3TK~ zdkJemj+f^}pEWzLE`My}r$=KzZ$6|@VrjR8rwppd@zcBW1*bC$0a04?cLY4fw@v%F z`C!c50{v|{z&kGk%BqUR@25;oj_Nx)Jt^gRZE}>_t@j)GY4zLn@;XATGfl@-Hffvd zOw|nICXF1+IV*3{nF}Qe* zjkfm9I#n(h`1t07T?tv+u6Uubdrbq+9flKIgYRY|++z$4w5zJt#RrFnUg=NDwY$Vn zfAm2rPm2Sd88WJslZBIH$rz-Ot=VLuMbU|{sf(J{R!~UY5p!j_W ziZS2Kt45Cj$L=yy&s#x^z^93)Q5JIVIWcWR_Lm{T+Hr)J`(8D*4^{9eALpAbFUI&&j`x2KD(TU;A5Z_Ib-x z+2oDxZ^hE$AgKBf=Xs=?Y|a=38W0jX49z*o=z# ziPHKkdL&sh5s(Es*FV;Dz;8IJtm_uNrKR}zrxZHV#3?k`Al}gb`zQJ2wxZ-6gm-*g z_+*LOxA1Y>^WN1xuH@M}!F#!1v@AkSD9prts2dUPe9^g4tF$tiWpx0UM`6) zx0BhuIg6fVKd?i0iK)XJZsVAV+pc7jVCQxFE80`M`kb`O^8Li6s&P_hsO0q<+eK zOxPB;)Ox~r+q%)_ z9$Y%-^l3GoMq#CLxPsr#b^eL)*%lc^mU#^FPG>74(Bsq}S)sOrNX=wU^XZfOe9a$) z_@QDaV^nr{bV=K0XUQ%CP%HVoj>>Iu9&R$eS}dD9(xw*n7dbUZv2HFWqF}^Rs%X7< zW7w}hY*2kcQ%=`Fnq_T&G3B(??CbTC{KX$8iSN}tR2M%Wmn>WbG!~A;9Hv¨sR* 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 +[Online Demo](https://abrudz.github.io/ngn-apl) - can also be installed offline as a [PWA (Progressive Web App)](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/What_is_a_progressive_web_app) + +![Screenshot](ngn-apl-screenshot.png) An [APL](https://aplwiki.com) interpreter written in JavaScript. Runs in a browser or [NodeJS](https://nodejs.org/). @@ -18,7 +20,7 @@ prototypes, modified assignment (`x+←1`), control structures (`:If`), object-o Used in [Paul L Jackson's web site](https://plj541.github.io/APL.js/), [repl.it](https://repl.it/languages/APL), and [tio.run](https://tio.run/#apl-ngn). -# Offline usage +# Offline usage with NodeJS Run `apl.js` with [Node](https://nodejs.org/) to start a REPL: diff --git a/serviceWorker.js b/serviceWorker.js new file mode 100644 index 0000000..6cb1134 --- /dev/null +++ b/serviceWorker.js @@ -0,0 +1,70 @@ +console.log('Service Worker running') +const CACHE_NAME = 'ngn/apl-v1'; +const urlsToCache = [ + '../icons/apl-logo.png', + '../web/index.html', + '../web/Apl385.woff', // font + '../web/index.js', + '../web/lb.js', + '../apl.js', + '../t.js', + '../t.apl' +]; + +async function addToCache() { + try { + let cache = await caches.open(CACHE_NAME); + console.log('Opened cache'); + await cache.addAll(urlsToCache); + console.log('All urls cached') + } catch(error) { + console.error('One or more URLs failed to cache:', error.url || error); + } +} + +self.addEventListener('install', function(event) { + console.log('Install - Add required urls to cache') + event.waitUntil(addToCache()); +}); + +// Function acts as proxy - any network request goes through this function +async function fetchEvent(event) { + let cacheResponse = await caches.match(event.request); + console.log('Cache hit', event.request.url) + if (cacheResponse) { + return cacheResponse; + } + + // Ideally there should be no cache miss + // as all urls should already be added to cache when service worker was installed + console.log('Cache missed', event.request.url) + + // IMPORTANT: Clone the request. A request is a stream and + // can only be consumed once. Since we are consuming this + // once by cache and once by the browser for fetch, we need + // to clone the response. + let fetchRequest = event.request.clone(); + + let response = await fetch(fetchRequest); + // Check if we received a valid response + if(!response || response.status !== 200 || response.type !== 'basic') { + console.log('Invalid response', event.request.url, response); + return response; + } + + // IMPORTANT: Clone the response. A response is a stream + // and because we want the browser to consume the response + // as well as the cache consuming the response, we need + // to clone it so we have two streams. + let responseToCache = response.clone(); + + let cache = await caches.open(CACHE_NAME); + await cache.put(event.request, responseToCache); + console.log('Put in cache', event.request.url); + + return response; +} + +self.addEventListener('fetch', function(event) { + event.respondWith(fetchEvent(event)); +}); diff --git a/web/index.html b/web/index.html index 8775cf2..b83de55 100644 --- a/web/index.html +++ b/web/index.html @@ -1,5 +1,19 @@ -ngn/apl