From 60539470594c09e3330873ba6aae3826475574ba Mon Sep 17 00:00:00 2001 From: Brogan Clements Date: Fri, 4 Mar 2022 11:27:15 -0500 Subject: [PATCH] Updates --- asset-manifest.json | 12 ++++++------ index.html | 2 +- static/css/main.19f1180e.chunk.css.map | 1 - ...in.19f1180e.chunk.css => main.55502cd7.chunk.css} | 4 ++-- static/css/main.55502cd7.chunk.css.map | 1 + static/js/main.ad62f30d.chunk.js | 2 -- static/js/main.ad62f30d.chunk.js.map | 1 - static/js/main.fa8e79c7.chunk.js | 2 ++ static/js/main.fa8e79c7.chunk.js.map | 1 + 9 files changed, 13 insertions(+), 13 deletions(-) delete mode 100644 static/css/main.19f1180e.chunk.css.map rename static/css/{main.19f1180e.chunk.css => main.55502cd7.chunk.css} (89%) create mode 100644 static/css/main.55502cd7.chunk.css.map delete mode 100644 static/js/main.ad62f30d.chunk.js delete mode 100644 static/js/main.ad62f30d.chunk.js.map create mode 100644 static/js/main.fa8e79c7.chunk.js create mode 100644 static/js/main.fa8e79c7.chunk.js.map diff --git a/asset-manifest.json b/asset-manifest.json index ed2fc98..ded9d87 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { - "main.css": "/free-programming-books-search/static/css/main.19f1180e.chunk.css", - "main.js": "/free-programming-books-search/static/js/main.ad62f30d.chunk.js", - "main.js.map": "/free-programming-books-search/static/js/main.ad62f30d.chunk.js.map", + "main.css": "/free-programming-books-search/static/css/main.55502cd7.chunk.css", + "main.js": "/free-programming-books-search/static/js/main.fa8e79c7.chunk.js", + "main.js.map": "/free-programming-books-search/static/js/main.fa8e79c7.chunk.js.map", "runtime-main.js": "/free-programming-books-search/static/js/runtime-main.a9bb282d.js", "runtime-main.js.map": "/free-programming-books-search/static/js/runtime-main.a9bb282d.js.map", "static/js/2.0771d3bc.chunk.js": "/free-programming-books-search/static/js/2.0771d3bc.chunk.js", @@ -10,7 +10,7 @@ "static/js/3.8f51dd3f.chunk.js": "/free-programming-books-search/static/js/3.8f51dd3f.chunk.js", "static/js/3.8f51dd3f.chunk.js.map": "/free-programming-books-search/static/js/3.8f51dd3f.chunk.js.map", "index.html": "/free-programming-books-search/index.html", - "static/css/main.19f1180e.chunk.css.map": "/free-programming-books-search/static/css/main.19f1180e.chunk.css.map", + "static/css/main.55502cd7.chunk.css.map": "/free-programming-books-search/static/css/main.55502cd7.chunk.css.map", "static/js/2.0771d3bc.chunk.js.LICENSE.txt": "/free-programming-books-search/static/js/2.0771d3bc.chunk.js.LICENSE.txt", "static/media/moon.6ad80c47.png": "/free-programming-books-search/static/media/moon.6ad80c47.png", "static/media/sun.d499a97b.png": "/free-programming-books-search/static/media/sun.d499a97b.png" @@ -18,7 +18,7 @@ "entrypoints": [ "static/js/runtime-main.a9bb282d.js", "static/js/2.0771d3bc.chunk.js", - "static/css/main.19f1180e.chunk.css", - "static/js/main.ad62f30d.chunk.js" + "static/css/main.55502cd7.chunk.css", + "static/js/main.fa8e79c7.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index 0b62401..020dfe1 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -free-programming-books | Freely available programming books
\ No newline at end of file +free-programming-books | Freely available programming books
\ No newline at end of file diff --git a/static/css/main.19f1180e.chunk.css.map b/static/css/main.19f1180e.chunk.css.map deleted file mode 100644 index 95aa2a3..0000000 --- a/static/css/main.19f1180e.chunk.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://src/App.css"],"names":[],"mappings":"AAAA,KACE,qBAAsB,CACtB,YAAY,CACZ,0MAAyN,CACzN,aAAa,CACb,eACF,CAEA,kBACE,UAAU,CACV,eACF,CAEA,qBACE,eACF,CAEA,SACE,eACF,CAEA,GACE,cAEF,CAEA,MAHE,eAMF,CAHA,GACE,aAEF,CAEA,YACE,aAAa,CACb,eACF,CAEA,EACE,aAAa,CACb,oBACF,CAEA,QACE,UAAU,CACV,eACF,CAEA,QACE,cAAc,CAEd,gBAAiB,CACjB,aACF,CAEA,sBALE,UAOF,CAEA,SACE,WAAW,CACX,aACF,CAEA,WACE,6BAA6B,CAC7B,QAAQ,CACR,kBAAkB,CAClB,iBACF,CAEA,SACE,mIAA2I,CAC3I,UACF,CAEA,IACE,gBAAgB,CAChB,kBAAmB,CACnB,iBAAiB,CACjB,wBAAwB,CACxB,eACF,CAEA,MACE,UAAU,CACV,wBACF,CAEA,MACE,eAAe,CACf,gBAAgB,CAChB,+BACF,CAEA,GAEE,eACF,CAEA,MAJE,UAMF,CAEA,IACE,cACF,CAEA,OACE,WAAW,CACX,UAAU,CACV,cAAc,CACd,2CACF,CAEA,UACE,eAAe,CACf,WAAW,CACX,SAAS,CACT,kBAAmB,CACnB,iBAAiB,CACjB,wBAAwB,CACxB,WACF,CAEA,UACE,UAAU,CACV,UAAU,CACV,8BAA8B,CAC9B,WACF,CAEA,wBACE,yBACF,CAEA,uBACE,yBACF,CAEA,YACE,aAAa,CACb,cAAc,CACd,UAAU,CACV,aAAa,CACb,iBAAiB,CACjB,eAAe,CACf,WACF,CAEA,kBACE,UACF,CAEA,mBACE,wBACF,CAEA,OACE,UAAU,CACV,eACF,CAEA,mBACE,iBAAiB,CACjB,UACF,CAEA,mBACE,cAAc,CACd,aAAa,CACb,UACF,CAEA,QACE,WAAW,CACX,WAAW,CACX,mBACF,CAEA,MACE,cACF,CAEA,GACE,QAAQ,CACR,kBAAkB,CAClB,UAAU,CACV,eACF,CAEA,OACE,WAAW,CACX,UAAU,CACV,cAAc,CACd,WAAW,CACX,2CACF,CAEA,0CAEE,YACE,UAAU,CACV,QACF,CAEA,sBACE,UAAU,CACV,eAAe,CACf,UACF,CAEA,OACE,mBACF,CAEA,QAEE,wBAAkB,CAAlB,kBAAkB,CAClB,cAAc,CACd,eACF,CAEA,eACE,cACF,CAEA,UACE,iBAAiB,CACjB,UAAU,CACV,QACF,CACF,CAEA,0CACE,KACE,oBACF,CAEA,OACE,SACF,CAEA,wBACE,eACF,CAEA,SACE,gBACF,CACF,CAEA,0CACE,KACE,YACF,CAEA,UACE,SACF,CAEA,6BACE,SACF,CACF,CAEA,aACE,KACE,YAAa,CACb,cAAc,CACd,UACF,CACF,CAEA,WACE,mBACF,CAEA,YAIE,UACF,CAEA,uBANE,qBAAsB,CACtB,kBAAoB,CACpB,aAUF,CANA,WAIE,YAEF","file":"main.19f1180e.chunk.css","sourcesContent":["body {\r\n background-color: #fff;\r\n padding:50px;\r\n font: 14px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\r\n color:#595959;\r\n font-weight:400;\r\n}\r\n\r\nh1, h2, h3, h4, h5, h6 {\r\n color:#222;\r\n margin:0 0 20px;\r\n}\r\n\r\np, ul, ol, table, pre, dl {\r\n margin:0 0 20px;\r\n}\r\n\r\nh1, h2, h3 {\r\n line-height:1.1;\r\n}\r\n\r\nh1 {\r\n font-size:28px;\r\n font-weight: bold;\r\n}\r\n\r\nh2 {\r\n color:#393939;\r\n font-weight: bold;\r\n}\r\n\r\nh3, h4, h5, h6 {\r\n color:#494949;\r\n font-weight: 500;\r\n}\r\n\r\na {\r\n color:#267CB9;\r\n text-decoration:none;\r\n}\r\n\r\na:hover {\r\n color:#069;\r\n font-weight: bold;\r\n}\r\n\r\na small {\r\n font-size:11px;\r\n color:#777;\r\n margin-top:-0.3em;\r\n display:block;\r\n}\r\n\r\na:hover small {\r\n color:#777;\r\n}\r\n\r\n.wrapper {\r\n width:860px;\r\n margin:0 auto;\r\n}\r\n\r\nblockquote {\r\n border-left:1px solid #e5e5e5;\r\n margin:0;\r\n padding:0 0 0 20px;\r\n font-style:italic;\r\n}\r\n\r\ncode, pre {\r\n font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal, Consolas, Liberation Mono, DejaVu Sans Mono, Courier New, monospace;\r\n color:#333;\r\n}\r\n\r\npre {\r\n padding:8px 15px;\r\n background: #f8f8f8;\r\n border-radius:5px;\r\n border:1px solid #e5e5e5;\r\n overflow-x: auto;\r\n}\r\n\r\ntable {\r\n width:100%;\r\n border-collapse:collapse;\r\n}\r\n\r\nth, td {\r\n text-align:left;\r\n padding:5px 10px;\r\n border-bottom:1px solid #e5e5e5;\r\n}\r\n\r\ndt {\r\n color:#444;\r\n font-weight:500;\r\n}\r\n\r\nth {\r\n color:#444;\r\n}\r\n\r\nimg {\r\n max-width:100%;\r\n}\r\n\r\nheader {\r\n width:270px;\r\n float:left;\r\n position:fixed;\r\n -webkit-font-smoothing:subpixel-antialiased;\r\n}\r\n\r\nheader ul {\r\n list-style:none;\r\n height:40px;\r\n padding:0;\r\n background: #f4f4f4;\r\n border-radius:5px;\r\n border:1px solid #e0e0e0;\r\n width:270px;\r\n}\r\n\r\nheader li {\r\n width:89px;\r\n float:left;\r\n border-right:1px solid #e0e0e0;\r\n height:40px;\r\n}\r\n\r\nheader li:first-child a {\r\n border-radius:5px 0 0 5px;\r\n}\r\n\r\nheader li:last-child a {\r\n border-radius:0 5px 5px 0;\r\n}\r\n\r\nheader ul a {\r\n line-height:1;\r\n font-size:11px;\r\n color:#999;\r\n display:block;\r\n text-align:center;\r\n padding-top:6px;\r\n height:34px;\r\n}\r\n\r\nheader ul a:hover {\r\n color:#999;\r\n}\r\n\r\nheader ul a:active {\r\n background-color:#f0f0f0;\r\n}\r\n\r\nstrong {\r\n color:#222;\r\n font-weight:500;\r\n}\r\n\r\nheader ul li + li + li {\r\n border-right:none;\r\n width:89px;\r\n}\r\n\r\nheader ul a strong {\r\n font-size:14px;\r\n display:block;\r\n color:#222;\r\n}\r\n\r\nsection {\r\n width:500px;\r\n float:right;\r\n padding-bottom:50px;\r\n}\r\n\r\nsmall {\r\n font-size:11px;\r\n}\r\n\r\nhr {\r\n border:0;\r\n background:#e5e5e5;\r\n height:1px;\r\n margin:0 0 20px;\r\n}\r\n\r\nfooter {\r\n width:270px;\r\n float:left;\r\n position:fixed;\r\n bottom:50px;\r\n -webkit-font-smoothing:subpixel-antialiased;\r\n}\r\n\r\n@media print, screen and (max-width: 960px) {\r\n\r\n div.wrapper {\r\n width:auto;\r\n margin:0;\r\n }\r\n\r\n header, section, footer {\r\n float:none;\r\n position:static;\r\n width:auto;\r\n }\r\n\r\n header {\r\n padding-right:320px;\r\n }\r\n\r\n section {\r\n border:1px solid #e5e5e5;\r\n border-width:1px 0;\r\n padding:20px 0;\r\n margin:0 0 20px;\r\n }\r\n\r\n header a small {\r\n display:inline;\r\n }\r\n\r\n header ul {\r\n position:absolute;\r\n right:50px;\r\n top:52px;\r\n }\r\n}\r\n\r\n@media print, screen and (max-width: 720px) {\r\n body {\r\n word-wrap:break-word;\r\n }\r\n\r\n header {\r\n padding:0;\r\n }\r\n\r\n header ul, header p.view {\r\n position:static;\r\n }\r\n\r\n pre, code {\r\n word-wrap:normal;\r\n }\r\n}\r\n\r\n@media print, screen and (max-width: 480px) {\r\n body {\r\n padding:15px;\r\n }\r\n\r\n header ul {\r\n width:99%;\r\n }\r\n\r\n header li, header ul li + li + li {\r\n width:33%;\r\n }\r\n}\r\n\r\n@media print {\r\n body {\r\n padding:0.4in;\r\n font-size:12pt;\r\n color:#444;\r\n }\r\n}\r\n\r\n.searchbar {\r\n padding-bottom: 0.3em;\r\n}\r\n\r\n.searchterm {\r\n border: 1px solid #666;\r\n border-radius: 0.3em;\r\n padding: 0.15em 0.15em 0.15em 0.15em;\r\n width: 15em;\r\n}\r\n\r\n.languages {\r\n border: 1px solid #666;\r\n border-radius: 0.3em;\r\n padding: 0.15em 0.15em 0.15em 0.15em;\r\n width: 15.4em;\r\n\r\n}\r\n"]} \ No newline at end of file diff --git a/static/css/main.19f1180e.chunk.css b/static/css/main.55502cd7.chunk.css similarity index 89% rename from static/css/main.19f1180e.chunk.css rename to static/css/main.55502cd7.chunk.css index 5dcb991..251d731 100644 --- a/static/css/main.19f1180e.chunk.css +++ b/static/css/main.55502cd7.chunk.css @@ -1,2 +1,2 @@ -body{background-color:#fff;padding:50px;font:14px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";color:#595959;font-weight:400}h1,h2,h3,h4,h5,h6{color:#222;margin:0 0 20px}dl,ol,p,pre,table,ul{margin:0 0 20px}h1,h2,h3{line-height:1.1}h1{font-size:28px}h1,h2{font-weight:700}h2{color:#393939}h3,h4,h5,h6{color:#494949;font-weight:500}a{color:#267cb9;text-decoration:none}a:hover{color:#069;font-weight:700}a small{font-size:11px;margin-top:-.3em;display:block}a:hover small,a small{color:#777}.wrapper{width:860px;margin:0 auto}blockquote{border-left:1px solid #e5e5e5;margin:0;padding:0 0 0 20px;font-style:italic}code,pre{font-family:Monaco,Bitstream Vera Sans Mono,Lucida Console,Terminal,Consolas,Liberation Mono,DejaVu Sans Mono,Courier New,monospace;color:#333}pre{padding:8px 15px;background:#f8f8f8;border-radius:5px;border:1px solid #e5e5e5;overflow-x:auto}table{width:100%;border-collapse:collapse}td,th{text-align:left;padding:5px 10px;border-bottom:1px solid #e5e5e5}dt{font-weight:500}dt,th{color:#444}img{max-width:100%}header{width:270px;float:left;position:fixed;-webkit-font-smoothing:subpixel-antialiased}header ul{list-style:none;height:40px;padding:0;background:#f4f4f4;border-radius:5px;border:1px solid #e0e0e0;width:270px}header li{width:89px;float:left;border-right:1px solid #e0e0e0;height:40px}header li:first-child a{border-radius:5px 0 0 5px}header li:last-child a{border-radius:0 5px 5px 0}header ul a{line-height:1;font-size:11px;color:#999;display:block;text-align:center;padding-top:6px;height:34px}header ul a:hover{color:#999}header ul a:active{background-color:#f0f0f0}strong{color:#222;font-weight:500}header ul li+li+li{border-right:none;width:89px}header ul a strong{font-size:14px;display:block;color:#222}section{width:500px;float:right;padding-bottom:50px}small{font-size:11px}hr{border:0;background:#e5e5e5;height:1px;margin:0 0 20px}footer{width:270px;float:left;position:fixed;bottom:50px;-webkit-font-smoothing:subpixel-antialiased}@media print,screen and (max-width:960px){div.wrapper{width:auto;margin:0}footer,header,section{float:none;position:static;width:auto}header{padding-right:320px}section{border:1px solid #e5e5e5;border-width:1px 0;padding:20px 0;margin:0 0 20px}header a small{display:inline}header ul{position:absolute;right:50px;top:52px}}@media print,screen and (max-width:720px){body{word-wrap:break-word}header{padding:0}header p.view,header ul{position:static}code,pre{word-wrap:normal}}@media print,screen and (max-width:480px){body{padding:15px}header ul{width:99%}header li,header ul li+li+li{width:33%}}@media print{body{padding:.4in;font-size:12pt;color:#444}}.searchbar{padding-bottom:.3em}.searchterm{width:15em}.languages,.searchterm{border:1px solid #666;border-radius:.3em;padding:.15em}.languages{width:15.4em} -/*# sourceMappingURL=main.19f1180e.chunk.css.map */ \ No newline at end of file +body{background-color:#fff;padding:50px;font:14px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";color:#595959;font-weight:400}h1,h2,h3,h4,h5,h6{color:#222;margin:0 0 20px}dl,ol,p,pre,table,ul{margin:0 0 20px}h1,h2,h3{line-height:1.1}h1{font-size:28px}h1,h2{font-weight:700}h2{color:#393939}h3,h4,h5,h6{color:#494949;font-weight:500}a{color:#267cb9;text-decoration:none}a:hover{color:#069;font-weight:700}a small{font-size:11px;margin-top:-.3em;display:block}a:hover small,a small{color:#777}.wrapper{width:860px;margin:0 auto}blockquote{border-left:1px solid #e5e5e5;margin:0;padding:0 0 0 20px;font-style:italic}code,pre{font-family:Monaco,Bitstream Vera Sans Mono,Lucida Console,Terminal,Consolas,Liberation Mono,DejaVu Sans Mono,Courier New,monospace;color:#333}pre{padding:8px 15px;background:#f8f8f8;border-radius:5px;border:1px solid #e5e5e5;overflow-x:auto}table{width:100%;border-collapse:collapse}td,th{text-align:left;padding:5px 10px;border-bottom:1px solid #e5e5e5}dt{font-weight:500}dt,th{color:#444}img{max-width:100%}header{width:270px;float:left;position:fixed;-webkit-font-smoothing:subpixel-antialiased}header ul{list-style:none;height:40px;padding:0;background:#f4f4f4;border-radius:5px;border:1px solid #e0e0e0;width:270px}header li{width:89px;float:left;border-right:1px solid #e0e0e0;height:40px}header li:first-child a{border-radius:5px 0 0 5px}header li:last-child a{border-radius:0 5px 5px 0}header ul a{line-height:1;font-size:11px;color:#999;display:block;text-align:center;padding-top:6px;height:34px}header ul a:hover{color:#999}header ul a:active{background-color:#f0f0f0}strong{color:#222;font-weight:500}header ul li+li+li{border-right:none;width:89px}header ul a strong{font-size:14px;display:block;color:#222}section{width:500px;float:right;padding-bottom:50px}small{font-size:11px}hr{border:0;background:#e5e5e5;height:1px;margin:0 0 20px}footer{width:270px;float:left;position:fixed;bottom:50px;-webkit-font-smoothing:subpixel-antialiased}@media print,screen and (max-width:960px){div.wrapper{width:auto;margin:0}footer,header,section{float:none;position:static;width:auto}header{padding-right:320px}section{border:1px solid #e5e5e5;border-width:1px 0;padding:20px 0;margin:0 0 20px}header a small{display:inline}header ul{position:absolute;right:50px;top:52px}}@media print,screen and (max-width:720px){body{word-wrap:break-word}header{padding:0}header p.view,header ul{position:static}code,pre{word-wrap:normal}}@media print,screen and (max-width:480px){body{padding:15px}header ul{width:99%}header li,header ul li+li+li{width:33%}}@media print{body{padding:.4in;font-size:12pt;color:#444}}.searchbar{padding-bottom:.3em}.searchterm{width:15em}.languages,.searchterm{border:1px solid #666;border-radius:.3em;padding:.15em}.languages{width:15.4em}.section-results{display:inline;padding:10px 40px;justify-content:space-between;flex-wrap:wrap}.section-results button{border-radius:0;box-shadow:none;border:1px solid #222}.sect-drop{box-sizing:border-box;width:10rem;align-self:center} +/*# sourceMappingURL=main.55502cd7.chunk.css.map */ \ No newline at end of file diff --git a/static/css/main.55502cd7.chunk.css.map b/static/css/main.55502cd7.chunk.css.map new file mode 100644 index 0000000..7efb9bf --- /dev/null +++ b/static/css/main.55502cd7.chunk.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://src/App.css"],"names":[],"mappings":"AAAA,KACE,qBAAsB,CACtB,YAAY,CACZ,0MAAyN,CACzN,aAAa,CACb,eACF,CAEA,kBACE,UAAU,CACV,eACF,CAEA,qBACE,eACF,CAEA,SACE,eACF,CAEA,GACE,cAEF,CAEA,MAHE,eAMF,CAHA,GACE,aAEF,CAEA,YACE,aAAa,CACb,eACF,CAEA,EACE,aAAa,CACb,oBACF,CAEA,QACE,UAAU,CACV,eACF,CAEA,QACE,cAAc,CAEd,gBAAiB,CACjB,aACF,CAEA,sBALE,UAOF,CAEA,SACE,WAAW,CACX,aACF,CAEA,WACE,6BAA6B,CAC7B,QAAQ,CACR,kBAAkB,CAClB,iBACF,CAEA,SACE,mIAA2I,CAC3I,UACF,CAEA,IACE,gBAAgB,CAChB,kBAAmB,CACnB,iBAAiB,CACjB,wBAAwB,CACxB,eACF,CAEA,MACE,UAAU,CACV,wBACF,CAEA,MACE,eAAe,CACf,gBAAgB,CAChB,+BACF,CAEA,GAEE,eACF,CAEA,MAJE,UAMF,CAEA,IACE,cACF,CAEA,OACE,WAAW,CACX,UAAU,CACV,cAAc,CACd,2CACF,CAEA,UACE,eAAe,CACf,WAAW,CACX,SAAS,CACT,kBAAmB,CACnB,iBAAiB,CACjB,wBAAwB,CACxB,WACF,CAEA,UACE,UAAU,CACV,UAAU,CACV,8BAA8B,CAC9B,WACF,CAEA,wBACE,yBACF,CAEA,uBACE,yBACF,CAEA,YACE,aAAa,CACb,cAAc,CACd,UAAU,CACV,aAAa,CACb,iBAAiB,CACjB,eAAe,CACf,WACF,CAEA,kBACE,UACF,CAEA,mBACE,wBACF,CAEA,OACE,UAAU,CACV,eACF,CAEA,mBACE,iBAAiB,CACjB,UACF,CAEA,mBACE,cAAc,CACd,aAAa,CACb,UACF,CAEA,QACE,WAAW,CACX,WAAW,CACX,mBACF,CAEA,MACE,cACF,CAEA,GACE,QAAQ,CACR,kBAAkB,CAClB,UAAU,CACV,eACF,CAEA,OACE,WAAW,CACX,UAAU,CACV,cAAc,CACd,WAAW,CACX,2CACF,CAEA,0CAEE,YACE,UAAU,CACV,QACF,CAEA,sBACE,UAAU,CACV,eAAe,CACf,UACF,CAEA,OACE,mBACF,CAEA,QAEE,wBAAkB,CAAlB,kBAAkB,CAClB,cAAc,CACd,eACF,CAEA,eACE,cACF,CAEA,UACE,iBAAiB,CACjB,UAAU,CACV,QACF,CACF,CAEA,0CACE,KACE,oBACF,CAEA,OACE,SACF,CAEA,wBACE,eACF,CAEA,SACE,gBACF,CACF,CAEA,0CACE,KACE,YACF,CAEA,UACE,SACF,CAEA,6BACE,SACF,CACF,CAEA,aACE,KACE,YAAa,CACb,cAAc,CACd,UACF,CACF,CAEA,WACE,mBACF,CAEA,YAIE,UACF,CAEA,uBANE,qBAAsB,CACtB,kBAAoB,CACpB,aAUF,CANA,WAIE,YAEF,CAEA,iBACE,cAAc,CACd,iBAAkB,CAClB,6BAA8B,CAC9B,cAMF,CAEA,wBACE,eAAgB,CAChB,eAAgB,CAGhB,qBACF,CAEA,WACE,qBAAsB,CACtB,WAAY,CACZ,iBACF","file":"main.55502cd7.chunk.css","sourcesContent":["body {\r\n background-color: #fff;\r\n padding:50px;\r\n font: 14px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\r\n color:#595959;\r\n font-weight:400;\r\n}\r\n\r\nh1, h2, h3, h4, h5, h6 {\r\n color:#222;\r\n margin:0 0 20px;\r\n}\r\n\r\np, ul, ol, table, pre, dl {\r\n margin:0 0 20px;\r\n}\r\n\r\nh1, h2, h3 {\r\n line-height:1.1;\r\n}\r\n\r\nh1 {\r\n font-size:28px;\r\n font-weight: bold;\r\n}\r\n\r\nh2 {\r\n color:#393939;\r\n font-weight: bold;\r\n}\r\n\r\nh3, h4, h5, h6 {\r\n color:#494949;\r\n font-weight: 500;\r\n}\r\n\r\na {\r\n color:#267CB9;\r\n text-decoration:none;\r\n}\r\n\r\na:hover {\r\n color:#069;\r\n font-weight: bold;\r\n}\r\n\r\na small {\r\n font-size:11px;\r\n color:#777;\r\n margin-top:-0.3em;\r\n display:block;\r\n}\r\n\r\na:hover small {\r\n color:#777;\r\n}\r\n\r\n.wrapper {\r\n width:860px;\r\n margin:0 auto;\r\n}\r\n\r\nblockquote {\r\n border-left:1px solid #e5e5e5;\r\n margin:0;\r\n padding:0 0 0 20px;\r\n font-style:italic;\r\n}\r\n\r\ncode, pre {\r\n font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal, Consolas, Liberation Mono, DejaVu Sans Mono, Courier New, monospace;\r\n color:#333;\r\n}\r\n\r\npre {\r\n padding:8px 15px;\r\n background: #f8f8f8;\r\n border-radius:5px;\r\n border:1px solid #e5e5e5;\r\n overflow-x: auto;\r\n}\r\n\r\ntable {\r\n width:100%;\r\n border-collapse:collapse;\r\n}\r\n\r\nth, td {\r\n text-align:left;\r\n padding:5px 10px;\r\n border-bottom:1px solid #e5e5e5;\r\n}\r\n\r\ndt {\r\n color:#444;\r\n font-weight:500;\r\n}\r\n\r\nth {\r\n color:#444;\r\n}\r\n\r\nimg {\r\n max-width:100%;\r\n}\r\n\r\nheader {\r\n width:270px;\r\n float:left;\r\n position:fixed;\r\n -webkit-font-smoothing:subpixel-antialiased;\r\n}\r\n\r\nheader ul {\r\n list-style:none;\r\n height:40px;\r\n padding:0;\r\n background: #f4f4f4;\r\n border-radius:5px;\r\n border:1px solid #e0e0e0;\r\n width:270px;\r\n}\r\n\r\nheader li {\r\n width:89px;\r\n float:left;\r\n border-right:1px solid #e0e0e0;\r\n height:40px;\r\n}\r\n\r\nheader li:first-child a {\r\n border-radius:5px 0 0 5px;\r\n}\r\n\r\nheader li:last-child a {\r\n border-radius:0 5px 5px 0;\r\n}\r\n\r\nheader ul a {\r\n line-height:1;\r\n font-size:11px;\r\n color:#999;\r\n display:block;\r\n text-align:center;\r\n padding-top:6px;\r\n height:34px;\r\n}\r\n\r\nheader ul a:hover {\r\n color:#999;\r\n}\r\n\r\nheader ul a:active {\r\n background-color:#f0f0f0;\r\n}\r\n\r\nstrong {\r\n color:#222;\r\n font-weight:500;\r\n}\r\n\r\nheader ul li + li + li {\r\n border-right:none;\r\n width:89px;\r\n}\r\n\r\nheader ul a strong {\r\n font-size:14px;\r\n display:block;\r\n color:#222;\r\n}\r\n\r\nsection {\r\n width:500px;\r\n float:right;\r\n padding-bottom:50px;\r\n}\r\n\r\nsmall {\r\n font-size:11px;\r\n}\r\n\r\nhr {\r\n border:0;\r\n background:#e5e5e5;\r\n height:1px;\r\n margin:0 0 20px;\r\n}\r\n\r\nfooter {\r\n width:270px;\r\n float:left;\r\n position:fixed;\r\n bottom:50px;\r\n -webkit-font-smoothing:subpixel-antialiased;\r\n}\r\n\r\n@media print, screen and (max-width: 960px) {\r\n\r\n div.wrapper {\r\n width:auto;\r\n margin:0;\r\n }\r\n\r\n header, section, footer {\r\n float:none;\r\n position:static;\r\n width:auto;\r\n }\r\n\r\n header {\r\n padding-right:320px;\r\n }\r\n\r\n section {\r\n border:1px solid #e5e5e5;\r\n border-width:1px 0;\r\n padding:20px 0;\r\n margin:0 0 20px;\r\n }\r\n\r\n header a small {\r\n display:inline;\r\n }\r\n\r\n header ul {\r\n position:absolute;\r\n right:50px;\r\n top:52px;\r\n }\r\n}\r\n\r\n@media print, screen and (max-width: 720px) {\r\n body {\r\n word-wrap:break-word;\r\n }\r\n\r\n header {\r\n padding:0;\r\n }\r\n\r\n header ul, header p.view {\r\n position:static;\r\n }\r\n\r\n pre, code {\r\n word-wrap:normal;\r\n }\r\n}\r\n\r\n@media print, screen and (max-width: 480px) {\r\n body {\r\n padding:15px;\r\n }\r\n\r\n header ul {\r\n width:99%;\r\n }\r\n\r\n header li, header ul li + li + li {\r\n width:33%;\r\n }\r\n}\r\n\r\n@media print {\r\n body {\r\n padding:0.4in;\r\n font-size:12pt;\r\n color:#444;\r\n }\r\n}\r\n\r\n.searchbar {\r\n padding-bottom: 0.3em;\r\n}\r\n\r\n.searchterm {\r\n border: 1px solid #666;\r\n border-radius: 0.3em;\r\n padding: 0.15em 0.15em 0.15em 0.15em;\r\n width: 15em;\r\n}\r\n\r\n.languages {\r\n border: 1px solid #666;\r\n border-radius: 0.3em;\r\n padding: 0.15em 0.15em 0.15em 0.15em;\r\n width: 15.4em;\r\n\r\n}\r\n\r\n.section-results {\r\n display:inline;\r\n padding: 10px 40px;\r\n justify-content: space-between;\r\n flex-wrap: wrap;\r\n /* padding-left: 1em;\r\n padding-right: 1em;\r\n justify-content: center;\r\n align-items: flex-start;\r\n display: flex; */\r\n}\r\n\r\n.section-results button {\r\n border-radius: 0;\r\n box-shadow: none;\r\n border-style: solid;\r\n border-width: 1px;\r\n border-color: #222222;\r\n}\r\n\r\n.sect-drop {\r\n box-sizing: border-box;\r\n width: 10rem;\r\n align-self: center;\r\n}"]} \ No newline at end of file diff --git a/static/js/main.ad62f30d.chunk.js b/static/js/main.ad62f30d.chunk.js deleted file mode 100644 index e25f93a..0000000 --- a/static/js/main.ad62f30d.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonpfpb_search_page=this.webpackJsonpfpb_search_page||[]).push([[0],{28:function(e,t,r){},49:function(e,t,r){"use strict";r.r(t);var n=r(1),o=r.n(n),a=r(20),c=r.n(a),s=(r(28),r(21)),i=r(5),l=r(4),h=r(2),b=r(11),j=r.n(b),u=r(22),d=r.n(u),g=r(23),m=r(0);var f=function(e){var t,r=e.changeParameter,o=e.data,a=Object(n.useState)([]),c=Object(h.a)(a,2),s=c[0],i=c[1];return Object(n.useEffect)((function(){if(o){var e=[];o.children[0].children.forEach((function(t){"string"===typeof t.language.name&&t.language.name.length>0&&"en-US"!==t.language.code&&e.push(t.language)})),e.sort((function(e,t){return e.name>t.name})),i(e)}}),[o]),t=s&&s.map((function(e){return function(e){return Object(m.jsx)("option",{class:"lang",value:e.code,children:e.name},e.code)}(e)})),Object(m.jsxs)("select",{onChange:function(e){r("lang.code",e.target.value)},name:"languages",id:"languages",class:"languages",children:[Object(m.jsx)("option",{value:"",children:"All Languages"},"allLangs"),t]})};var O=function(e){return Object(m.jsx)("form",{onSubmit:function(e){e.preventDefault()},name:"searchBar",className:"searchbar",children:Object(m.jsx)("input",{autoComplete:"off",type:"text",name:"searchTerm",placeholder:"Enter Book Name",className:"searchterm",onChange:function(t){e.changeParameter("title",t.target.value)}})})};var p=function(e){var t=e.data;return Object(m.jsx)("li",{class:"result",children:Object(m.jsxs)("a",{href:t.url,target:"_blank",rel:"noreferrer",children:["(",t.lang.code,") ",t.title," by ",t.author?t.author:"Unknown Author"]})})};var x=function(){return Object(m.jsxs)("section",{children:[Object(m.jsx)("br",{}),Object(m.jsx)("h1",{id:"list-of-free-learning-resources-in-many-languages",children:"List of Free Learning Resources In Many Languages"}),Object(m.jsx)("div",{align:"center"}),Object(m.jsx)("h2",{id:"intro",children:"Intro"}),Object(m.jsxs)("p",{children:["This list was originally a clone of"," ",Object(m.jsx)("a",{href:"https://web.archive.org/web/20140606191453/http://stackoverflow.com/questions/194812/list-of-freely-available-programming-books/392926",children:"StackOverflow - List of Freely Available Programming Books"})," ","with contributions from Karan Bhangui and George Stocker."]}),Object(m.jsxs)("p",{children:["The list was moved to GitHub by Victor Felder for collaborative updating and maintenance. It has grown to become one of ",Object(m.jsx)("a",{href:"https://octoverse.github.com/",children:"GitHub\u2019s most popular repositories"}),", with 221,000+ stars, 6,900+ commits, 1,900+ contributors, and 47,100+ forks."]}),Object(m.jsxs)("p",{children:["The ",Object(m.jsx)("a",{href:"https://ebookfoundation.org",children:"Free Ebook Foundation"})," now administers the repo, a not-for-profit organization devoted to promoting the creation, distribution, archiving, and sustainability of free ebooks."," ",Object(m.jsx)("a",{href:"https://ebookfoundation.org/contributions.html",children:"Donations"})," to the Free Ebook Foundation are tax-deductible in the US."]}),Object(m.jsx)("h2",{id:"how-to-contribute",children:"How To Contribute"}),Object(m.jsxs)("p",{children:["Please read ",Object(m.jsx)("a",{href:"/free-programming-books/docs/CONTRIBUTING.html",children:"CONTRIBUTING"}),". If you\u2019re new to GitHub,"," ",Object(m.jsx)("a",{href:"/free-programming-books/docs/HOWTO.html",children:"welcome"}),"! Remember to abide by our"," ",Object(m.jsx)("a",{href:"/free-programming-books/docs/CODE_OF_CONDUCT.html",children:"Code of Conduct"})," too. (",Object(m.jsx)("a",{href:"/free-programming-books/docs/#translations",children:"translations"})," also available)"]}),Object(m.jsx)("h2",{id:"how-to-share",children:"How to Share"}),Object(m.jsxs)("ul",{children:[Object(m.jsx)("li",{children:Object(m.jsx)("a",{href:"http://twitter.com/intent/tweet?text=https://github.com/EbookFoundation/free-programming-books%0AFree%20Programming%20Books",children:"Share on Twitter"})}),Object(m.jsx)("li",{children:Object(m.jsx)("a",{href:"https://www.facebook.com/share.php?u=https%3A%2F%2Fgithub.com%2FEbookFoundation%2Ffree-programming-books&p%5Bimages%5D%5B0%5D=&p%5Btitle%5D=Free%20Programming%20Books&p%5Bsummary%5D=",children:"Share on Facebook"})}),Object(m.jsx)("li",{children:Object(m.jsx)("a",{href:"http://www.linkedin.com/shareArticle?mini=true&url=https://github.com/EbookFoundation/free-programming-books&title=Free%20Programming%20Books&summary=&source=",children:"Share on LinkedIn"})}),Object(m.jsx)("li",{children:Object(m.jsx)("a",{href:"https://t.me/share/url?url=https://github.com/EbookFoundation/free-programming-books",children:"Share on Telegram"})})]}),Object(m.jsx)("h2",{id:"translations",children:"Translations"}),Object(m.jsx)("p",{children:"Volunteers have translated many of our Contributing, How-to, and Code of Conduct documents into languages covered by our lists."}),Object(m.jsxs)("ul",{children:[Object(m.jsxs)("li",{children:["English",Object(m.jsxs)("ul",{children:[Object(m.jsx)("li",{children:Object(m.jsx)("a",{href:"/free-programming-books/docs/CODE_OF_CONDUCT.html",children:"Code of Conduct"})}),Object(m.jsx)("li",{children:Object(m.jsx)("a",{href:"/free-programming-books/docs/CONTRIBUTING.html",children:"Contributing"})}),Object(m.jsx)("li",{children:Object(m.jsx)("a",{href:"/free-programming-books/docs/HOWTO.html",children:"How-to"})})]})]}),Object(m.jsxs)("li",{children:["\u2026"," ",Object(m.jsx)("em",{children:Object(m.jsx)("a",{href:"/free-programming-books/docs/#translations",children:"More languages"})})," ","\u2026"]})]}),Object(m.jsxs)("p",{children:["You might notice that there are"," ",Object(m.jsx)("a",{href:"/free-programming-books/docs/#translations",children:"some missing translations here"})," - perhaps you would like to help out by"," ",Object(m.jsx)("a",{href:"/free-programming-books/docs/CONTRIBUTING.html#help-out-by-contributing-a-translation",children:"contributing a translation"}),"?"]}),Object(m.jsx)("h2",{id:"license",children:"License"}),Object(m.jsxs)("p",{children:["Each file included in this repository is licensed under the"," ",Object(m.jsx)("a",{href:"/free-programming-books/LICENSE",children:"CC BY License"}),"."]})]})},k=(r.p,r.p,null);function v(e){var t=[],r=[];return e.children[0].children.forEach((function(e){e.sections.forEach((function(n){r.includes(n.section)||r.push(n.section),n.entries.forEach((function(r){t.push({author:r.author,title:r.title,url:r.url,lang:e.language,section:n.section})})),n.subsections.forEach((function(r){r.entries.forEach((function(o){t.push({author:o.author,title:o.title,url:o.url,lang:e.language,section:n.section,subsection:r.section})}))}))}))})),{arr:t,sections:r}}var w=function(){var e=Object(n.useState)(void 0),t=Object(h.a)(e,2),r=t[0],o=t[1],a=Object(n.useState)([]),c=Object(h.a)(a,2),b=c[0],u=c[1],w=Object(n.useState)([]),F=Object(h.a)(w,2),E=(F[0],F[1]),C=Object(n.useState)(!0),y=Object(h.a)(C,2),S=y[0],T=y[1],B=Object(n.useState)({title:""}),N=Object(h.a)(B,2),I=N[0],_=N[1],H=Object(n.useState)([]),L=Object(h.a)(H,2),P=L[0],D=L[1],G=Object(n.useState)([]),U=Object(h.a)(G,2),R=U[0],A=U[1],M=Object(n.useState)(!0),V=Object(h.a)(M,2),J=(V[0],V[1],Object(n.useState)("")),W=Object(h.a)(J,2),Y=W[0],q=(W[1],null),z=function(e,t){_(Object(l.a)(Object(l.a)({},I),{},Object(i.a)({},e,t)))};return Object(n.useEffect)((function(){function e(){return(e=Object(s.a)(j.a.mark((function e(){var t,r,n,a,c,s,i;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,T(!0),e.next=4,d.a.get("https://raw.githubusercontent.com/FreeEbookFoundationBot/free-programming-books-json/main/fpb.json");case 4:t=e.sent,o(t.data),r=v(t.data),n=r.arr,a=r.sections,u(n),E(a),e.next=17;break;case 11:e.prev=11,e.t0=e.catch(0),o(k),c=v(k),s=c.arr,i=c.sections,E(i),u(s);case 17:T(!1);case 18:case"end":return e.stop()}}),e,null,[[0,11]])})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[]),Object(n.useEffect)((function(){if(b){for(var e=new g.a(b,{useExtendedSearch:!0,findAllMatches:!0,shouldSort:!0,includeScore:!0,threshold:.2,keys:["title","lang.code"]}),t=[],r=0,n=Object.entries(I);r {\r\n changeParameter(\"lang.code\", e.target.value);\r\n };\r\n\r\n useEffect(\r\n // run whenever data changes\r\n () => {\r\n if (data) {\r\n let langArray = [];\r\n data.children[0].children.forEach((document) => {\r\n if (\r\n typeof document.language.name === \"string\" &&\r\n document.language.name.length > 0\r\n ) {\r\n //make sure the language is valid and not blank\r\n //console.log(\"LANGUAGE: \" + document.language.name)\r\n if (document.language.code !== \"en-US\") { // used to ensure only one English is listed\r\n langArray.push(document.language);\r\n }\r\n }\r\n });\r\n langArray.sort((a, b) => a.name > b.name);\r\n setLanguages(langArray);\r\n }\r\n },\r\n [data]\r\n );\r\n\r\n const createOption = (language) => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n options =\r\n languages &&\r\n languages.map((language) => {\r\n return createOption(language);\r\n });\r\n // console.log(options);\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport default LangDropdown;\r\n","import React from \"react\";\r\n\r\nfunction SearchBar(props) {\r\n const handleChange = (e) => {\r\n props.changeParameter(\"title\", e.target.value);\r\n };\r\n\r\n return (\r\n {\r\n e.preventDefault();\r\n }}\r\n name=\"searchBar\"\r\n className=\"searchbar\"\r\n >\r\n \r\n \r\n );\r\n}\r\n\r\nexport default SearchBar;\r\n","import React from \"react\";\r\n\r\nfunction SearchResult({ data }) {\r\n return (\r\n
  • \r\n \r\n ({data.lang.code}) {data.title} by {data.author ? data.author : \"Unknown Author\"}\r\n \r\n
  • \r\n );\r\n}\r\n\r\nexport default SearchResult;\r\n","import React from \"react\";\r\n\r\nfunction Default() {\r\n return (\r\n
    \r\n
    \r\n\r\n

    List of Free Learning Resources In Many Languages

    \r\n\r\n
    \r\n {/*

    \"Awesome\" */}\r\n {/* \"License:

    */}\r\n
    \r\n\r\n

    Intro

    \r\n\r\n

    \r\n This list was originally a clone of{\" \"}\r\n \r\n StackOverflow - List of Freely Available Programming Books\r\n {\" \"}\r\n with contributions from Karan Bhangui and George Stocker.\r\n

    \r\n\r\n

    \r\n The list was moved to GitHub by Victor Felder for collaborative updating and maintenance. It has grown to become\r\n one of GitHub’s most popular repositories, with 221,000+ stars,\r\n 6,900+ commits, 1,900+ contributors, and 47,100+ forks.\r\n

    \r\n\r\n

    \r\n The Free Ebook Foundation now administers the repo, a not-for-profit\r\n organization devoted to promoting the creation, distribution, archiving, and sustainability of free ebooks.{\" \"}\r\n Donations to the Free Ebook Foundation are\r\n tax-deductible in the US.\r\n

    \r\n\r\n

    How To Contribute

    \r\n\r\n

    \r\n Please read CONTRIBUTING. If you’re new to GitHub,{\" \"}\r\n welcome! Remember to abide by our{\" \"}\r\n Code of Conduct too. (\r\n translations also available)\r\n

    \r\n\r\n

    How to Share

    \r\n\r\n \r\n\r\n

    Translations

    \r\n\r\n

    \r\n Volunteers have translated many of our Contributing, How-to, and Code of Conduct documents into languages\r\n covered by our lists.\r\n

    \r\n\r\n \r\n\r\n

    \r\n You might notice that there are{\" \"}\r\n some missing translations here - perhaps you would like\r\n to help out by{\" \"}\r\n \r\n contributing a translation\r\n \r\n ?\r\n

    \r\n\r\n

    License

    \r\n\r\n

    \r\n Each file included in this repository is licensed under the{\" \"}\r\n CC BY License.\r\n

    \r\n
    \r\n );\r\n}\r\n\r\nexport default Default;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport axios from \"axios\";\r\nimport Fuse from \"fuse.js\";\r\n\r\nimport LangDropdown from \"./components/LangDropdown\";\r\nimport SearchBar from \"./components/SearchBar\";\r\nimport SearchResult from \"./components/SearchResult\";\r\nimport LightSwitch from \"./components/LightSwitch\";\r\nimport Default from \"./components/Default\";\r\n\r\nimport SunImg from \"./img/sun.png\";\r\nimport MoonImg from \"./img/moon.png\";\r\n\r\nconst fpb = null;\r\n\r\n// eslint-disable-next-line\r\nfunction makeBook(author, hLang, cLang, title, url) {\r\n //returns a struct with basic book info (author, human language, computer language, book title, url)\r\n return {\r\n author: author,\r\n hLang: hLang, //human language\r\n cLang: cLang, //computer language\r\n title: title,\r\n url: url,\r\n };\r\n}\r\n\r\n// eslint-disable-next-line\r\nfunction forEachBook(func, json) {\r\n //Runs func on each section, entry, and book in json, which is a list of entries\r\n if (typeof func !== \"function\") {\r\n // eslint-disable-next-line\r\n throw \"ERROR in forEachBook: parameter not a fucntion\";\r\n }\r\n\r\n for (const hLang in json) {\r\n //for each human language\r\n if (Array.isArray(hLang.sections)) {\r\n //check if sections is an array\r\n hLang.sections.forEach(\r\n (\r\n cLang //for each computer lanuage\r\n ) => {\r\n if (Array.isArray(cLang.entries)) {\r\n //verify is entries is an array\r\n cLang.entries.forEach(\r\n (\r\n book //for each book\r\n ) => {\r\n if (typeof book === \"object\") {\r\n //verify that book is an object\r\n func(json[hLang], cLang, book); //run the function\r\n }\r\n }\r\n );\r\n }\r\n }\r\n );\r\n }\r\n }\r\n}\r\n\r\n// Sorts search results by their score\r\n// eslint-disable-next-line\r\nfunction sortByScore(results) {\r\n results.sort(function (a, b) {\r\n return a.score - b.score;\r\n });\r\n return results;\r\n}\r\n\r\nfunction jsonToArray(json) {\r\n let arr = [];\r\n let sections = [];\r\n json.children[0].children.forEach((document) => {\r\n document.sections.forEach((section) => {\r\n if (!sections.includes(section.section)) sections.push(section.section);\r\n section.entries.forEach((entry) => {\r\n arr.push({\r\n author: entry.author,\r\n title: entry.title,\r\n url: entry.url,\r\n lang: document.language,\r\n section: section.section,\r\n });\r\n });\r\n section.subsections.forEach((subsection) => {\r\n subsection.entries.forEach((entry) => {\r\n arr.push({\r\n author: entry.author,\r\n title: entry.title,\r\n url: entry.url,\r\n lang: document.language,\r\n section: section.section,\r\n subsection: subsection.section,\r\n });\r\n });\r\n });\r\n });\r\n });\r\n return { arr: arr, sections: sections };\r\n}\r\n\r\nfunction App() {\r\n const [data, setData] = useState(undefined); // keeps the state of the json\r\n const [dataArray, setDataArray] = useState([]); // put everything into one array. uses more memory, but search is faster and less complex\r\n // eslint-disable-next-line\r\n const [index, setIndex] = useState([]); // used for \"table of contents\". currently unused\r\n const [loading, setLoading] = useState(true); // Determines whether to show spinner\r\n const [searchParams, setSearchParams] = useState({ title: \"\" });\r\n const [searchResults, setSearchResults] = useState([]);\r\n const [sectionResults, setSectionResults] = useState([]);\r\n const [lightMode, setLightMode] = useState(true);\r\n\r\n // eslint-disable-next-line\r\n const [error, setError] = useState(\"\");\r\n\r\n let resultsList = null; // the html string containing the search results\r\n let sectionResultsList = null;\r\n\r\n const changeParameter = (param, value) => {\r\n // Lets a child component set the value of the search term\r\n setSearchParams({ ...searchParams, [param]: value });\r\n };\r\n\r\n // fetches data the first time the page renders\r\n useEffect(() => {\r\n async function fetchData() {\r\n try {\r\n setLoading(true);\r\n let result = await axios.get(\r\n \"https://raw.githubusercontent.com/FreeEbookFoundationBot/free-programming-books-json/main/fpb.json\"\r\n );\r\n setData(result.data);\r\n let { arr, sections } = jsonToArray(result.data);\r\n setDataArray(arr);\r\n setIndex(sections);\r\n } catch (e) {\r\n // setError(\"Couldn't get data. Please try again later\")\r\n setData(fpb);\r\n let { arr, sections } = jsonToArray(fpb);\r\n setIndex(sections);\r\n setDataArray(arr);\r\n }\r\n setLoading(false);\r\n }\r\n fetchData();\r\n }, []);\r\n\r\n // fires when searchTerm changes\r\n // THIS IS THE MAIN SEARCH FUNCTION CURRENTLY\r\n useEffect(() => {\r\n if (dataArray) {\r\n // Finds most relevant titles\r\n const fuseOptions = {\r\n useExtendedSearch: true,\r\n findAllMatches: true,\r\n shouldSort: true,\r\n includeScore: true,\r\n threshold: 0.2,\r\n keys: [\"title\", \"lang.code\"],\r\n };\r\n\r\n let fuse = new Fuse(dataArray, fuseOptions);\r\n let query = [];\r\n for (const [key, value] of Object.entries(searchParams)) {\r\n if (value === null || value === \"\") continue;\r\n if (key === \"lang.code\") {\r\n query.push({ \"lang.code\": `^${value}` });\r\n continue;\r\n }\r\n query.push({ [key]: value });\r\n }\r\n let result = fuse.search({\r\n $and: query,\r\n });\r\n result = result.slice(0, 40);\r\n setSearchResults(result);\r\n\r\n let sResults = []; // section results\r\n // Finds the most relevant sections\r\n result.forEach((entry) => {\r\n let section = entry.item.section;\r\n if (!sResults.includes(section)) sResults.push(section);\r\n });\r\n setSectionResults(sResults);\r\n }\r\n }, [searchParams, dataArray]);\r\n\r\n if (loading) {\r\n // if still fetching resource\r\n return

    Loading...

    ;\r\n }\r\n if (error) {\r\n return

    Error: {error}

    ;\r\n }\r\n if (searchParams.title && searchResults.length !== 0) {\r\n resultsList =\r\n searchResults &&\r\n searchResults.map((entry) => {\r\n return ;\r\n });\r\n sectionResultsList =\r\n sectionResults &&\r\n sectionResults.map((section) => {\r\n return
  • {section}
  • ;\r\n });\r\n }\r\n return (\r\n \r\n
    \r\n {/* setLightMode(!lightMode)}\r\n style={{\r\n width: \"100px\",\r\n height: \"100px\",\r\n display: \"block\",\r\n marginLeft: \"auto\",\r\n marginRight: \"auto\",\r\n }}\r\n /> */}\r\n

    \r\n \r\n free-programming-books\r\n \r\n

    \r\n\r\n

    \r\n {\" \"}\r\n Freely available programming books\r\n

    \r\n\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n\r\n

    \r\n \r\n View the Project on GitHub EbookFoundation/free-programming-books\r\n \r\n

    \r\n

    \r\n Does a link not work?\r\n
    \r\n \r\n Report an error on GitHub\r\n \r\n

    \r\n {/*

    Section Results

    \r\n {sectionResultsList &&

    This feature is not complete!

    }\r\n
    {sectionResultsList}
    */}\r\n
    \r\n\r\n
    \r\n {resultsList ? (\r\n
    \r\n
    \r\n

    Search Results

    \r\n
      {resultsList}
    \r\n
    \r\n ) : (\r\n \r\n )}\r\n
    \r\n\r\n \r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","export default __webpack_public_path__ + \"static/media/sun.d499a97b.png\";","export default __webpack_public_path__ + \"static/media/moon.6ad80c47.png\";","const reportWebVitals = onPerfEntry => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './App.css';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.fa8e79c7.chunk.js b/static/js/main.fa8e79c7.chunk.js new file mode 100644 index 0000000..6bb66a3 --- /dev/null +++ b/static/js/main.fa8e79c7.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonpfpb_search_page=this.webpackJsonpfpb_search_page||[]).push([[0],{28:function(e,t,n){},49:function(e,t,n){"use strict";n.r(t);var r=n(1),o=n.n(r),c=n(20),s=n.n(c),a=(n(28),n(21)),i=n(5),l=n(4),h=n(2),b=n(11),u=n.n(b),j=n(22),d=n.n(j),g=n(23),f=n(0);var m=function(e){var t,n=e.changeParameter,o=e.data,c=Object(r.useState)([]),s=Object(h.a)(c,2),a=s[0],i=s[1];return Object(r.useEffect)((function(){if(o){var e=[];o.children[0].children.forEach((function(t){"string"===typeof t.language.name&&t.language.name.length>0&&"en-US"!==t.language.code&&e.push(t.language)})),e.sort((function(e,t){return e.name>t.name})),i(e)}}),[o]),t=a&&a.map((function(e){return function(e){return Object(f.jsx)("option",{class:"lang",value:e.code,children:e.name},e.code)}(e)})),Object(f.jsxs)("select",{onChange:function(e){n("lang.code",e.target.value)},name:"languages",id:"languages",class:"languages",children:[Object(f.jsx)("option",{value:"",children:"All Languages"},"allLangs"),t]})};var O=function(e){var t,n=e.changeParameter,o=e.data,c=e.value,s=Object(r.useState)([]),a=Object(h.a)(s,2),i=a[0],l=a[1];return Object(r.useEffect)((function(){if(o){var e=[];o.children[0].children.forEach((function(t){Array.isArray(t.sections)&&t.sections.length;for(var n=0;n {\r\n changeParameter(\"lang.code\", e.target.value);\r\n };\r\n\r\n useEffect(\r\n // run whenever data changes\r\n () => {\r\n if (data) {\r\n let langArray = [];\r\n data.children[0].children.forEach((document) => {\r\n if (\r\n typeof document.language.name === \"string\" &&\r\n document.language.name.length > 0\r\n ) {\r\n //make sure the language is valid and not blank\r\n //console.log(\"LANGUAGE: \" + document.language.name)\r\n if (document.language.code !== \"en-US\") { // used to ensure only one English is listed\r\n langArray.push(document.language);\r\n }\r\n }\r\n });\r\n langArray.sort((a, b) => a.name > b.name);\r\n setLanguages(langArray);\r\n }\r\n },\r\n [data]\r\n );\r\n\r\n const createOption = (language) => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n options =\r\n languages &&\r\n languages.map((language) => {\r\n return createOption(language);\r\n });\r\n // console.log(options);\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport default LangDropdown;\r\n","import React, { useState, useEffect } from \"react\";\r\n\r\nfunction SectDropdown({ changeParameter, data, value}) {\r\n const [sections, setSections] = useState([]);\r\n let options = null;\r\n\r\n const handleChange = (e) => {\r\n changeParameter(\"section\", e.target.value);\r\n };\r\n\r\n useEffect(\r\n // run whenever data changes\r\n () => {\r\n if (data) {\r\n let sectArray = [];\r\n data.children[0].children.forEach((document) => {\r\n // console.log(document)\r\n if (\r\n Array.isArray(document.sections) &&\r\n document.sections.length > 0\r\n ); {\r\n // console.log(document.sections.length);\r\n // console.log(Array.isArray(document.sections));\r\n for (let i = 0; i < document.sections.length; i++) {\r\n // console.log(\"h\")\r\n // console.log(document.sections[i]);\r\n if(sectArray.indexOf(document.sections[i].section) == -1){\r\n sectArray.push(document.sections[i].section.trim());\r\n }\r\n // sectArray.push(document.sections[i].section);\r\n }\r\n }\r\n })\r\n sectArray.sort((a, b) => a.localeCompare(b));\r\n setSections(sectArray);\r\n }\r\n },\r\n [data]\r\n );\r\n// key={section} value={section}\r\n const createOption = (section) => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n options =\r\n sections &&\r\n sections.map((section) => {\r\n return createOption(section);\r\n });\r\n // console.log(options);\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport default SectDropdown;\r\n","import React from \"react\";\r\n\r\nfunction SearchBar(props) {\r\n const handleChange = (e) => {\r\n props.changeParameter(\"title\", e.target.value);\r\n };\r\n\r\n return (\r\n {\r\n e.preventDefault();\r\n }}\r\n name=\"searchBar\"\r\n className=\"searchbar\"\r\n >\r\n \r\n \r\n );\r\n}\r\n\r\nexport default SearchBar;\r\n","import React from \"react\";\r\n\r\nfunction SearchResult({ data }) {\r\n return (\r\n
  • \r\n \r\n ({data.lang.code}) {data.title} by {data.author ? data.author : \"Unknown Author\"}\r\n \r\n
  • \r\n );\r\n}\r\n\r\nexport default SearchResult;\r\n","import React from \"react\";\r\n\r\nfunction Default() {\r\n return (\r\n
    \r\n
    \r\n\r\n

    List of Free Learning Resources In Many Languages

    \r\n\r\n
    \r\n {/*

    \"Awesome\" */}\r\n {/* \"License:

    */}\r\n
    \r\n\r\n

    Intro

    \r\n\r\n

    \r\n This list was originally a clone of{\" \"}\r\n \r\n StackOverflow - List of Freely Available Programming Books\r\n {\" \"}\r\n with contributions from Karan Bhangui and George Stocker.\r\n

    \r\n\r\n

    \r\n The list was moved to GitHub by Victor Felder for collaborative updating and maintenance. It has grown to become\r\n one of GitHub’s most popular repositories, with 221,000+ stars,\r\n 6,900+ commits, 1,900+ contributors, and 47,100+ forks.\r\n

    \r\n\r\n

    \r\n The Free Ebook Foundation now administers the repo, a not-for-profit\r\n organization devoted to promoting the creation, distribution, archiving, and sustainability of free ebooks.{\" \"}\r\n Donations to the Free Ebook Foundation are\r\n tax-deductible in the US.\r\n

    \r\n\r\n

    How To Contribute

    \r\n\r\n

    \r\n Please read CONTRIBUTING. If you’re new to GitHub,{\" \"}\r\n welcome! Remember to abide by our{\" \"}\r\n Code of Conduct too. (\r\n translations also available)\r\n

    \r\n\r\n

    How to Share

    \r\n\r\n \r\n\r\n

    Translations

    \r\n\r\n

    \r\n Volunteers have translated many of our Contributing, How-to, and Code of Conduct documents into languages\r\n covered by our lists.\r\n

    \r\n\r\n \r\n\r\n

    \r\n You might notice that there are{\" \"}\r\n some missing translations here - perhaps you would like\r\n to help out by{\" \"}\r\n \r\n contributing a translation\r\n \r\n ?\r\n

    \r\n\r\n

    License

    \r\n\r\n

    \r\n Each file included in this repository is licensed under the{\" \"}\r\n CC BY License.\r\n

    \r\n
    \r\n );\r\n}\r\n\r\nexport default Default;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport axios from \"axios\";\r\nimport Fuse from \"fuse.js\";\r\n\r\nimport LangDropdown from \"./components/LangDropdown\";\r\nimport SectDropdown from \"./components/SectDropdown\";\r\nimport SearchBar from \"./components/SearchBar\";\r\nimport SearchResult from \"./components/SearchResult\";\r\nimport LightSwitch from \"./components/LightSwitch\";\r\nimport Default from \"./components/Default\";\r\n\r\nimport SunImg from \"./img/sun.png\";\r\nimport MoonImg from \"./img/moon.png\";\r\n\r\nconst fpb = null;\r\n\r\n// eslint-disable-next-line\r\nfunction makeBook(author, hLang, cLang, title, url) {\r\n //returns a struct with basic book info (author, human language, computer language, book title, url)\r\n return {\r\n author: author,\r\n hLang: hLang, //human language\r\n cLang: cLang, //computer language\r\n title: title,\r\n url: url,\r\n };\r\n}\r\n\r\n// eslint-disable-next-line\r\nfunction forEachBook(func, json) {\r\n //Runs func on each section, entry, and book in json, which is a list of entries\r\n if (typeof func !== \"function\") {\r\n // eslint-disable-next-line\r\n throw \"ERROR in forEachBook: parameter not a fucntion\";\r\n }\r\n\r\n for (const hLang in json) {\r\n //for each human language\r\n if (Array.isArray(hLang.sections)) {\r\n //check if sections is an array\r\n hLang.sections.forEach(\r\n (\r\n cLang //for each computer lanuage\r\n ) => {\r\n if (Array.isArray(cLang.entries)) {\r\n //verify is entries is an array\r\n cLang.entries.forEach(\r\n (\r\n book //for each book\r\n ) => {\r\n if (typeof book === \"object\") {\r\n //verify that book is an object\r\n func(json[hLang], cLang, book); //run the function\r\n }\r\n }\r\n );\r\n }\r\n }\r\n );\r\n }\r\n }\r\n}\r\n\r\n// Sorts search results by their score\r\n// eslint-disable-next-line\r\nfunction sortByScore(results) {\r\n results.sort(function (a, b) {\r\n return a.score - b.score;\r\n });\r\n return results;\r\n}\r\n\r\nfunction jsonToArray(json) {\r\n let arr = [];\r\n let sections = [];\r\n json.children[0].children.forEach((document) => {\r\n document.sections.forEach((section) => {\r\n if (!sections.includes(section.section)) sections.push(section.section);\r\n section.entries.forEach((entry) => {\r\n arr.push({\r\n author: entry.author,\r\n title: entry.title,\r\n url: entry.url,\r\n lang: document.language,\r\n section: section.section,\r\n });\r\n });\r\n section.subsections.forEach((subsection) => {\r\n subsection.entries.forEach((entry) => {\r\n arr.push({\r\n author: entry.author,\r\n title: entry.title,\r\n url: entry.url,\r\n lang: document.language,\r\n section: section.section,\r\n subsection: subsection.section,\r\n });\r\n });\r\n });\r\n });\r\n });\r\n return { arr: arr, sections: sections };\r\n}\r\n\r\nfunction App() {\r\n const [data, setData] = useState(undefined); // keeps the state of the json\r\n const [dataArray, setDataArray] = useState([]); // put everything into one array. uses more memory, but search is faster and less complex\r\n // eslint-disable-next-line\r\n const [index, setIndex] = useState([]); // used for \"table of contents\". currently unused\r\n const [loading, setLoading] = useState(true); // Determines whether to show spinner\r\n const [searchParams, setSearchParams] = useState({ title: \"\" });\r\n const [searchResults, setSearchResults] = useState([]);\r\n const [sectionResults, setSectionResults] = useState([]);\r\n const [lightMode, setLightMode] = useState(true);\r\n\r\n // eslint-disable-next-line\r\n const [error, setError] = useState(\"\");\r\n\r\n let resultsList = null; // the html string containing the search results\r\n let sectionResultsList = null;\r\n\r\n const changeParameter = (param, value) => {\r\n // Lets a child component set the value of the search term\r\n setSearchParams({ ...searchParams, [param]: value });\r\n };\r\n\r\n // fetches data the first time the page renders\r\n useEffect(() => {\r\n async function fetchData() {\r\n try {\r\n setLoading(true);\r\n let result = await axios.get(\r\n \"https://raw.githubusercontent.com/FreeEbookFoundationBot/free-programming-books-json/main/fpb.json\"\r\n );\r\n setData(result.data);\r\n let { arr, sections } = jsonToArray(result.data);\r\n console.log(arr);\r\n setDataArray(arr);\r\n setIndex(sections);\r\n } catch (e) {\r\n // setError(\"Couldn't get data. Please try again later\")\r\n setData(fpb);\r\n let { arr, sections } = jsonToArray(fpb);\r\n setIndex(sections);\r\n setDataArray(arr);\r\n }\r\n setLoading(false);\r\n }\r\n fetchData();\r\n }, []);\r\n\r\n // fires when searchTerm changes\r\n // THIS IS THE MAIN SEARCH FUNCTION CURRENTLY\r\n useEffect(() => {\r\n if (dataArray) {\r\n // Finds most relevant titles\r\n const fuseOptions = {\r\n useExtendedSearch: true,\r\n findAllMatches: true,\r\n shouldSort: true,\r\n includeScore: true,\r\n threshold: 0.2,\r\n keys: [\"title\", \"lang.code\", \"section\"],\r\n };\r\n\r\n let fuse = new Fuse(dataArray, fuseOptions);\r\n let query = [];\r\n for (const [key, value] of Object.entries(searchParams)) {\r\n if (value === null || value === \"\") continue;\r\n if (key === \"lang.code\") {\r\n query.push({ \"lang.code\": `^${value}` });\r\n continue;\r\n }\r\n if (key === \"section\"){\r\n query.push({\"section\": `^${value}`});\r\n continue;\r\n }\r\n query.push({ [key]: value });\r\n }\r\n let result = fuse.search({\r\n $and: query,\r\n });\r\n result = result.slice(0, 40);\r\n setSearchResults(result);\r\n\r\n let sResults = []; // section results\r\n // Finds the most relevant sections\r\n result.forEach((entry) => {\r\n let section = entry.item.section;\r\n if (!sResults.includes(section)) sResults.push(section);\r\n });\r\n setSectionResults(sResults);\r\n }\r\n }, [searchParams, dataArray]);\r\n\r\n if (loading) {\r\n // if still fetching resource\r\n return

    Loading...

    ;\r\n }\r\n if (error) {\r\n return

    Error: {error}

    ;\r\n }\r\n if (searchParams.title && searchResults.length !== 0) {\r\n resultsList =\r\n searchResults &&\r\n searchResults.map((entry) => {\r\n return ;\r\n });\r\n sectionResultsList =\r\n sectionResults &&\r\n sectionResults.map((section) => {\r\n return ;\r\n });\r\n }\r\n return (\r\n \r\n
    \r\n {/* setLightMode(!lightMode)}\r\n style={{\r\n width: \"100px\",\r\n height: \"100px\",\r\n display: \"block\",\r\n marginLeft: \"auto\",\r\n marginRight: \"auto\",\r\n }}\r\n /> */}\r\n

    \r\n \r\n free-programming-books\r\n \r\n

    \r\n\r\n

    \r\n {\" \"}\r\n Freely available programming books\r\n

    \r\n\r\n

    \r\n \r\n View the Project on GitHub EbookFoundation/free-programming-books\r\n \r\n

    \r\n

    \r\n Does a link not work?\r\n
    \r\n \r\n Report an error on GitHub\r\n \r\n

    \r\n\r\n
    \r\n \r\n \r\n \r\n
    {sectionResultsList}
    \r\n
    \r\n
    \r\n\r\n
    \r\n {resultsList ? (\r\n
    \r\n
    \r\n

    Search Results

    \r\n
      {resultsList}
    \r\n
    \r\n ) : (\r\n \r\n )}\r\n
    \r\n\r\n \r\n\r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","export default __webpack_public_path__ + \"static/media/sun.d499a97b.png\";","export default __webpack_public_path__ + \"static/media/moon.6ad80c47.png\";","const reportWebVitals = onPerfEntry => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './App.css';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""} \ No newline at end of file