diff --git a/asset-manifest.json b/asset-manifest.json index 5d08591..7c87a7d 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { - "main.css": "/free-programming-books-search/static/css/main.884191d3.chunk.css", - "main.js": "/free-programming-books-search/static/js/main.5c9d9d02.chunk.js", - "main.js.map": "/free-programming-books-search/static/js/main.5c9d9d02.chunk.js.map", + "main.css": "/free-programming-books-search/static/css/main.309cb973.chunk.css", + "main.js": "/free-programming-books-search/static/js/main.e1a738b6.chunk.js", + "main.js.map": "/free-programming-books-search/static/js/main.e1a738b6.chunk.js.map", "runtime-main.js": "/free-programming-books-search/static/js/runtime-main.74cd2dea.js", "runtime-main.js.map": "/free-programming-books-search/static/js/runtime-main.74cd2dea.js.map", "static/js/2.a21f7e60.chunk.js": "/free-programming-books-search/static/js/2.a21f7e60.chunk.js", @@ -10,7 +10,7 @@ "static/js/3.6304f7d0.chunk.js": "/free-programming-books-search/static/js/3.6304f7d0.chunk.js", "static/js/3.6304f7d0.chunk.js.map": "/free-programming-books-search/static/js/3.6304f7d0.chunk.js.map", "index.html": "/free-programming-books-search/index.html", - "static/css/main.884191d3.chunk.css.map": "/free-programming-books-search/static/css/main.884191d3.chunk.css.map", + "static/css/main.309cb973.chunk.css.map": "/free-programming-books-search/static/css/main.309cb973.chunk.css.map", "static/js/2.a21f7e60.chunk.js.LICENSE.txt": "/free-programming-books-search/static/js/2.a21f7e60.chunk.js.LICENSE.txt", "static/media/moon.dd634065.png": "/free-programming-books-search/static/media/moon.dd634065.png", "static/media/sun.4c5a4fb0.png": "/free-programming-books-search/static/media/sun.4c5a4fb0.png" @@ -18,7 +18,7 @@ "entrypoints": [ "static/js/runtime-main.74cd2dea.js", "static/js/2.a21f7e60.chunk.js", - "static/css/main.884191d3.chunk.css", - "static/js/main.5c9d9d02.chunk.js" + "static/css/main.309cb973.chunk.css", + "static/js/main.e1a738b6.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index d55cc5b..1214770 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.884191d3.chunk.css b/static/css/main.309cb973.chunk.css similarity index 74% rename from static/css/main.884191d3.chunk.css rename to static/css/main.309cb973.chunk.css index 5a8ccb2..b1b8157 100644 --- a/static/css/main.884191d3.chunk.css +++ b/static/css/main.309cb973.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:700}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}.sect-drop{background-color:#222;color:#fff}#root,.sect-drop{box-sizing:border-box}.dark-content{background-color:#000;color:#fff}.dark-content *{color:#fff}.frontPage{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;flex-direction:column;height:100;text-align:center}.frontPage,.search-results{display:flex;justify-content:center}.search-results{align-items:flex-start;flex-direction:row;flex-flow:row wrap;box-sizing:border-box;align-content:flex-start;padding-left:1em;padding-right:1em}.result{padding:.25em .5em}.filters{margin-top:-1em;max-height:13em;overflow:scroll;width:18em;overflow-x:hidden}.filterHeader{display:flex;justify-content:left}.filterHeader button{margin-left:1em;width:1.5em;height:1.7em}.langFilters{margin-top:.5em} -/*# sourceMappingURL=main.884191d3.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:700}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}.sect-drop{background-color:#222;color:#fff}#root,.sect-drop{box-sizing:border-box}.dark-content{background-color:#000}.dark-content .search-results,.dark-content a,.dark-content footer,.dark-content header{-webkit-filter:invert(1);filter:invert(1)}.dark-content a{color:#58a0d3}.frontPage{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;flex-direction:column;height:100;text-align:center}.frontPage,.search-results{display:flex;justify-content:center}.search-results{align-items:flex-start;flex-direction:row;flex-flow:row wrap;box-sizing:border-box;align-content:flex-start;padding-left:1em;padding-right:1em}.result{padding:.25em .5em}.filters{margin-top:-1em;max-height:13em;overflow:scroll;width:18em;overflow-x:hidden}.filterHeader{display:flex;justify-content:left}.filterHeader button{margin-left:1em;width:1.5em;height:1.7em}.langFilters{margin-top:.5em} +/*# sourceMappingURL=main.309cb973.chunk.css.map */ \ No newline at end of file diff --git a/static/css/main.309cb973.chunk.css.map b/static/css/main.309cb973.chunk.css.map new file mode 100644 index 0000000..f0d6ea6 --- /dev/null +++ b/static/css/main.309cb973.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,WAEE,qBAAyB,CACzB,UACF,CAEA,iBALE,qBAOF,CAGA,cACE,qBACF,CAOA,wFAJC,wBAAgB,CAAhB,gBAOD,CAHA,gBAEC,aACD,CAIA,WACE,mJAEY,CACZ,kCAAmC,CACnC,iCAAkC,CAElC,qBAAsB,CACtB,UAAW,CACX,iBAEF,CAEA,2BAPE,YAAa,CAIb,sBAcF,CAXA,gBAEE,sBAAuB,CAEvB,kBAAmB,CACnB,kBAAmB,CACnB,qBAAsB,CAEtB,wBAAyB,CACzB,gBAAiB,CACjB,iBACF,CAEA,QAEE,kBACF,CAGA,SACE,eAAgB,CAChB,eAAgB,CAChB,eAAgB,CAChB,UAAW,CACX,iBACF,CAEA,cACE,YAAa,CACb,oBACF,CAEA,qBACE,eAAgB,CAChB,WAAY,CACZ,YACF,CAEA,aACE,eACF","file":"main.309cb973.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: bold;\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.sect-drop {\r\n box-sizing: border-box;\r\n background-color: #222222;\r\n color: white;\r\n}\r\n\r\n#root {\r\n box-sizing: border-box;\r\n}\r\n\r\n\r\n.dark-content {\r\n background-color: black;\r\n}\r\n\r\n.dark-content footer, .dark-content header, .dark-content .search-results{\r\n\tfilter:invert(1);\r\n}\r\n\r\n\r\n.dark-content a{\r\n\tfilter: invert(1);\r\n\tcolor: #58a0d3;\r\n}\r\n\r\n\r\n\r\n.frontPage {\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\",\r\n \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\r\n sans-serif;\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n display: flex;\r\n flex-direction: column;\r\n height: 100;\r\n text-align: center;\r\n justify-content: center;\r\n}\r\n\r\n.search-results {\r\n justify-content: center;\r\n align-items: flex-start;\r\n display: flex;\r\n flex-direction: row;\r\n flex-flow: row wrap;\r\n box-sizing: border-box;\r\n /* justify-content: normal ; */\r\n align-content: flex-start;\r\n padding-left: 1em;\r\n padding-right: 1em;\r\n}\r\n\r\n.result {\r\n /* width: 30%; */\r\n padding: 0.25em 0.5em;\r\n}\r\n\r\n\r\n.filters {\r\n margin-top: -1em;\r\n max-height: 13em;\r\n overflow: scroll;\r\n width: 18em;\r\n overflow-x: hidden;\r\n}\r\n\r\n.filterHeader {\r\n display: flex;\r\n justify-content: left;\r\n}\r\n\r\n.filterHeader button {\r\n margin-left: 1em;\r\n width: 1.5em;\r\n height: 1.7em;\r\n}\r\n\r\n.langFilters {\r\n margin-top: 0.5em;\r\n}\r\n"]} \ No newline at end of file diff --git a/static/css/main.884191d3.chunk.css.map b/static/css/main.884191d3.chunk.css.map deleted file mode 100644 index eb8aa0f..0000000 --- a/static/css/main.884191d3.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,CAEA,WAEE,qBAAyB,CACzB,UACF,CAEA,iBALE,qBAOF,CAEA,cACE,qBAAuB,CACvB,UACF,CAEA,gBACC,UACD,CAEA,WACE,mJAEY,CACZ,kCAAmC,CACnC,iCAAkC,CAElC,qBAAsB,CACtB,UAAW,CACX,iBAEF,CAEA,2BAPE,YAAa,CAIb,sBAcF,CAXA,gBAEE,sBAAuB,CAEvB,kBAAmB,CACnB,kBAAmB,CACnB,qBAAsB,CAEtB,wBAAyB,CACzB,gBAAiB,CACjB,iBACF,CAEA,QAEE,kBACF,CAGA,SACE,eAAgB,CAChB,eAAgB,CAChB,eAAgB,CAChB,UAAW,CACX,iBACF,CAEA,cACE,YAAa,CACb,oBACF,CAEA,qBACE,eAAgB,CAChB,WAAY,CACZ,YACF,CAEA,aACE,eACF","file":"main.884191d3.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: bold;\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.sect-drop {\r\n box-sizing: border-box;\r\n background-color: #222222;\r\n color: white;\r\n}\r\n\r\n#root {\r\n box-sizing: border-box;\r\n}\r\n\r\n.dark-content {\r\n background-color: black;\r\n color: white;\r\n}\r\n\r\n.dark-content *{\r\n\tcolor: white;\r\n}\r\n\r\n.frontPage {\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\",\r\n \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\r\n sans-serif;\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n display: flex;\r\n flex-direction: column;\r\n height: 100;\r\n text-align: center;\r\n justify-content: center;\r\n}\r\n\r\n.search-results {\r\n justify-content: center;\r\n align-items: flex-start;\r\n display: flex;\r\n flex-direction: row;\r\n flex-flow: row wrap;\r\n box-sizing: border-box;\r\n /* justify-content: normal ; */\r\n align-content: flex-start;\r\n padding-left: 1em;\r\n padding-right: 1em;\r\n}\r\n\r\n.result {\r\n /* width: 30%; */\r\n padding: 0.25em 0.5em;\r\n}\r\n\r\n\r\n.filters {\r\n margin-top: -1em;\r\n max-height: 13em;\r\n overflow: scroll;\r\n width: 18em;\r\n overflow-x: hidden;\r\n}\r\n\r\n.filterHeader {\r\n display: flex;\r\n justify-content: left;\r\n}\r\n\r\n.filterHeader button {\r\n margin-left: 1em;\r\n width: 1.5em;\r\n height: 1.7em;\r\n}\r\n\r\n.langFilters {\r\n margin-top: 0.5em;\r\n}\r\n"]} \ No newline at end of file diff --git a/static/js/main.5c9d9d02.chunk.js b/static/js/main.5c9d9d02.chunk.js deleted file mode 100644 index 2f38139..0000000 --- a/static/js/main.5c9d9d02.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonpfpb_search_page=this.webpackJsonpfpb_search_page||[]).push([[0],{145:function(e,r,s){"use strict";s.r(r);var c=s(2),o=s.n(c),a=s(70),n=s.n(a),i=(s(86),s(38)),t=s(3),l=s(6),h=s(10),j=s(29),b=s.n(j),g=s(0),f=s(50);var d=function(e){var r,s=e.changeParameter,o=e.data,a=e.langCode,n=Object(c.useState)([]),i=Object(h.a)(n,2),t=i[0],l=i[1],j=Object(c.useState)(a),b=Object(h.a)(j,2),d=b[0],m=b[1],u=Object(c.useState)(!1),O=Object(h.a)(u,2),p=O[0],x=O[1],k=function(e){s("lang.code",e.target.value),m(e.target.value)};Object(c.useEffect)((function(){var e=f.parse(document.location.search);e.lang?"langs"===e.lang||"subjects"===e.lang?(s("lang.code","en"),m("en")):(s("lang.code",e.lang),m(e.lang)):(s("lang.code",""),m(""))}),[]),Object(c.useEffect)((function(){if(o){var e=[{code:"en",name:"English"}];o.children[0].children.forEach((function(r){"string"===typeof r.language.name&&r.language.name.length>0&&"en"!==r.language.code&&e.push(r.language)})),e.sort((function(e,r){return e.name>r.name})),l(e)}}),[o]),r=t&&t.map((function(e){return function(e){return Object(g.jsx)("div",{children:Object(g.jsxs)("label",{children:[Object(g.jsx)("input",{type:"radio",className:"lang",value:e.code,onChange:k,checked:e.code===d},e.code),e.name]})})}(e)}));var v=Object(g.jsxs)("form",{className:"filters",children:[Object(g.jsxs)("label",{children:[Object(g.jsx)("input",{type:"radio",className:"sect-select",value:"",onChange:k,checked:""===d},"all"),"All Languages"]}),r]});return Object(g.jsxs)("div",{className:"langFilters",children:[Object(g.jsxs)("div",{className:"filterHeader",children:[Object(g.jsx)("h3",{children:"Filter by Language"}),Object(g.jsx)("button",{onClick:function(){return x(!p)},children:p?"-":"+"})]}),p?v:""]})},m=s(50);var u=function(e){return Object(c.useEffect)((function(){var r=m.parse(document.location.search);r.search&&(document.getElementById("searchBar").value=r.search,e.changeParameter("searchTerm",r.search))}),[e]),Object(g.jsx)("form",{onSubmit:function(e){e.preventDefault()},name:"searchBar",className:"searchbar",children:Object(g.jsx)("input",{id:"searchBar",autoComplete:"off",type:"text",name:"searchTerm",placeholder:"Search Book or Author",className:"searchterm",onChange:function(r){e.changeParameter("searchTerm",r.target.value)}})})};var O=function(e){var r=e.data;return Object(g.jsx)("li",{className:"result",children:Object(g.jsxs)("a",{href:r.url,target:"_blank",rel:"noreferrer",children:["(",r.lang.code,") ",r.title,r.author?" by ".concat(r.author):""]})})},p=s(41),x=s.n(p),k=s(76),v={dark:"",light:"dark-content"},y=function(e){if(e===v.light)document.body.classList.add("dark-content");else document.body.classList.remove("dark-content")},w=Object(c.createContext)({theme:v.dark,changeTheme:function(){}});function T(e){var r=Object(c.useState)(e.theme),s=Object(h.a)(r,2),o=s[0],a=s[1];return y(o),Object(g.jsx)(w.Provider,{value:{theme:o,changeTheme:function(e){a(e)}},children:e.children})}var S=s(157);var F=function(){return Object(g.jsxs)("section",{children:[Object(g.jsx)("br",{}),Object(g.jsx)("h1",{id:"list-of-free-learning-resources-in-many-languages",children:"List of Free Learning Resources In Many Languages"}),Object(g.jsx)("div",{align:"center"}),Object(g.jsx)("h2",{id:"intro",children:"Intro"}),Object(g.jsxs)("p",{children:["This list was originally a clone of"," ",Object(g.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(g.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(g.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(g.jsxs)("p",{children:["The ",Object(g.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(g.jsx)("a",{href:"https://ebookfoundation.org/contributions.html",children:"Donations"})," to the Free Ebook Foundation are tax-deductible in the US."]}),Object(g.jsx)("h2",{id:"how-to-contribute",children:"How To Contribute"}),Object(g.jsxs)("p",{children:["Please read ",Object(g.jsx)("a",{href:"/free-programming-books/docs/CONTRIBUTING.html",children:"CONTRIBUTING"}),". If you\u2019re new to GitHub,"," ",Object(g.jsx)("a",{href:"/free-programming-books/docs/HOWTO.html",children:"welcome"}),"! Remember to abide by our"," ",Object(g.jsx)("a",{href:"/free-programming-books/docs/CODE_OF_CONDUCT.html",children:"Code of Conduct"})," too. (",Object(g.jsx)("a",{href:"/free-programming-books/docs/#translations",children:"translations"})," also available)"]}),Object(g.jsx)("h2",{id:"how-to-share",children:"How to Share"}),Object(g.jsxs)("ul",{children:[Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"http://twitter.com/intent/tweet?text=https://github.com/EbookFoundation/free-programming-books%0AFree%20Programming%20Books",children:"Share on Twitter"})}),Object(g.jsx)("li",{children:Object(g.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(g.jsx)("li",{children:Object(g.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(g.jsx)("li",{children:Object(g.jsx)("a",{href:"https://t.me/share/url?url=https://github.com/EbookFoundation/free-programming-books",children:"Share on Telegram"})})]}),Object(g.jsx)("h2",{id:"resources",children:"Resources"}),Object(g.jsx)("p",{children:"This project lists books and other resources grouped by genres:"}),Object(g.jsx)("h3",{id:"books",children:"Books"}),Object(g.jsx)("p",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-langs&lang=langs",children:"English, By Programming Language"})}),Object(g.jsx)("p",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-subjects&lang=subjects",children:"English, By Subject"})}),Object(g.jsx)("h4",{id:"other-languages",children:"Other Languages"}),Object(g.jsxs)("ul",{children:[Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ar&lang=ar",children:"Arabic / al arabiya / \u0627\u0644\u0639\u0631\u0628\u064a\u0629"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-az&lang=az",children:"Azerbaijani / \u0410\u0437\u04d9\u0440\u0431\u0430\u0458\u04b9\u0430\u043d \u0434\u0438\u043b\u0438 / \u0622\u0630\u0631\u0628\u0627\u064a\u062c\u0627\u0646\u062c\u0627 \u062f\u064a\u0644\u064a"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-bn&lang=bn",children:"Bengali / \u09ac\u09be\u0982\u09b2\u09be"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-bg&lang=bg",children:"Bulgarian / \u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-my&lang=my",children:"Burmese / \u1019\u103c\u1014\u103a\u1019\u102c\u1018\u102c\u101e\u102c"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-zh&lang=zh",children:"Chinese / \u4e2d\u6587"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-cs&lang=cs",children:"Czech / \u010de\u0161tina / \u010desk\xfd jazyk"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-dk&lang=dk",children:"Danish / dansk"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-nl&lang=nl",children:"Dutch / Nederlands"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-et&lang=et",children:"Estonian / eesti keel"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-fi&lang=fi",children:"Finnish / suomi / suomen kieli"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-fr&lang=fr",children:"French / fran\xe7ais"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-de&lang=de",children:"German / Deutsch"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-el&lang=el",children:"Greek / \u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-he&lang=he",children:"Hebrew / \u05e2\u05d1\u05e8\u05d9\u05ea"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-hi&lang=hi",children:"Hindi / \u0939\u093f\u0928\u094d\u0926\u0940"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-hu&lang=hu",children:"Hungarian / magyar / magyar nyelv"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-id&lang=id",children:"Indonesian / Bahasa Indonesia"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-it&lang=it",children:"Italian / italiano"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ja&lang=ja",children:"Japanese / \u65e5\u672c\u8a9e"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ko&lang=ko",children:"Korean / \ud55c\uad6d\uc5b4 [\u97d3\u570b\u8a9e]"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-no&lang=no",children:"Norwegian / Norsk"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-fa_IR&lang=fa_IR",children:"Persian / Farsi (Iran) / \u0641\u0627\u0631\u0633\u0649"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-pl&lang=pl",children:"Polish / polski / j\u0119zyk polski / polszczyzna"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-pt_BR&lang=pt_BR",children:"Portuguese (Brazil)"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-pt_PT&lang=pt_PT",children:"Portuguese (Portugal)"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ro&lang=ro",children:"Romanian (Romania) / limba rom\xe2n\u0103 / rom\xe2n"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ru&lang=ru",children:"Russian / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-sr&lang=sr",children:"Serbian / \u0441\u0440\u043f\u0441\u043a\u0438 \u0458\u0435\u0437\u0438\u043a / srpski jezik"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-sk&lang=sk",children:"Slovak / sloven\u010dina"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-es&lang=es",children:"Spanish / espa\xf1ol / castellano"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-sv&lang=sv",children:"Swedish / Svenska"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ta&lang=ta",children:"Tamil / \u0ba4\u0bae\u0bbf\u0bb4\u0bcd"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-th&lang=th",children:"Thai / \u0e44\u0e17\u0e22"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-tr&lang=tr",children:"Turkish / T\xfcrk\xe7e"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-uk&lang=uk",children:"Ukrainian / \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-vi&lang=vi",children:"Vietnamese / Ti\u1ebfng Vi\u1ec7t"})})]}),Object(g.jsx)("h3",{id:"cheat-sheets",children:"Cheat Sheets"}),Object(g.jsx)("ul",{children:Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-cheatsheets",children:"All Languages"})})}),Object(g.jsx)("h3",{id:"free-online-courses",children:"Free Online Courses"}),Object(g.jsxs)("ul",{children:[Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-ar&lang=ar",children:"Arabic / al arabiya / \u0627\u0644\u0639\u0631\u0628\u064a\u0629"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-bn&lang=bn",children:"Bengali / \u09ac\u09be\u0982\u09b2\u09be"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-bg&lang=bg",children:"Bulgarian / \u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-en&lang=en",children:"English"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-fi&lang=fi",children:"Finnish"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-fr&lang=fr",children:"French / fran\xe7ais"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-de&lang=de",children:"German / Deutsch"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-el&lang=el",children:"Greek / \u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-he&lang=he",children:"Hebrew / \u05e2\u05d1\u05e8\u05d9\u05ea"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-hi&lang=hi",children:"Hindi / \u0939\u093f\u0902\u0926\u0940"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-id&lang=id",children:"Indonesian / Bahasa Indonesia"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-it&lang=it",children:"Italian / italiano"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-ja&lang=ja",children:"Japanese / \u65e5\u672c\u8a9e"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-kk&lang=kk",children:"Kazakh / \u049b\u0430\u0437\u0430\u049b\u0448\u0430"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-km&lang=km",children:"Khmer / \u1797\u17b6\u179f\u17b6\u1781\u17d2\u1798\u17c2\u179a"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-ko&lang=ko",children:"Korean / \ud55c\uad6d\uc5b4 [\u97d3\u570b\u8a9e]"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-ml&lang=ml",children:"Malayalam / \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-fa_IR&lang=fa_IR",children:"Persian / Farsi (Iran) / \u0641\u0627\u0631\u0633\u0649"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-pl&lang=pl",children:"Polish / polski / j\u0119zyk polski / polszczyzna"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-pt_BR&lang=pt_BR",children:"Portuguese (Brazil)"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-pt_PT&lang=pt_PT",children:"Portuguese (Portugal)"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-ru&lang=ru",children:"Russian / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-si&lang=si",children:"Sinhala / \u0dc3\u0dd2\u0d82\u0dc4\u0dbd"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-es&lang=es",children:"Spanish / espa\xf1ol / castellano"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-th&lang=th",children:"Thai / \u0e20\u0e32\u0e29\u0e32\u0e44\u0e17\u0e22"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-tr&lang=tr",children:"Turkish / T\xfcrk\xe7e"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-uk&lang=uk",children:"Ukrainian / \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-vi&lang=vi",children:"Vietnamese / Ti\u1ebfng Vi\u1ec7t"})})]}),Object(g.jsx)("h3",{id:"interactive-programming-resources",children:"Interactive Programming Resources"}),Object(g.jsxs)("ul",{children:[Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-interactive-tutorials-zh&lang=zh",children:"Chinese / \u4e2d\u6587"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-interactive-tutorials-en&lang=en",children:"English"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-interactive-tutorials-pt_BR&lang=pt_BR",children:"Portuguese (Brazil)"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-interactive-tutorials-ru&lang=ru",children:"Russian / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a"})})]}),Object(g.jsx)("h3",{id:"problem-sets-and-competitive-programming",children:"Problem Sets and Competitive Programming"}),Object(g.jsx)("ul",{children:Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=more&file=problem-sets-competitive-programming",children:"Problem Sets"})})}),Object(g.jsx)("h3",{id:"podcast---screencast",children:"Podcast - Screencast"}),Object(g.jsx)("p",{children:"Free Podcasts and Screencasts:"}),Object(g.jsxs)("ul",{children:[Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-ar",children:"Arabic / al arabiya / \u0627\u0644\u0639\u0631\u0628\u064a\u0629"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-cs",children:"Czech / \u010de\u0161tina / \u010desk\xfd jazyk"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-en",children:"English"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-fi",children:"Finnish / Suomi"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-fr",children:"French / fran\xe7ais"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-he",children:"Hebrew / \u05e2\u05d1\u05e8\u05d9\u05ea"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-id",children:"Indonesian / Bahasa Indonesia"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-fa_IR",children:"Persian / Farsi (Iran) / \u0641\u0627\u0631\u0633\u0649"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-pl",children:"Polish / polski / j\u0119zyk polski / polszczyzna"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-pt_BR",children:"Portuguese (Brazil)"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-pt_PT",children:"Portuguese (Portugal)"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-ru",children:"Russian / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-si",children:"Sinhala / \u0dc3\u0dd2\u0d82\u0dc4\u0dbd"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-es",children:"Spanish / espa\xf1ol / castellano"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-sv",children:"Swedish / Svenska"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-tr",children:"Turkish / T\xfcrk\xe7e"})})]}),Object(g.jsx)("h3",{id:"programming-playgrounds",children:"Programming Playgrounds"}),Object(g.jsxs)("ul",{children:[Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-playgrounds-zh",children:"Chinese / \u4e2d\u6587"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-playgrounds",children:"English"})})]}),Object(g.jsx)("h2",{id:"translations",children:"Translations"}),Object(g.jsx)("p",{children:"Volunteers have translated many of our Contributing, How-to, and Code of Conduct documents into languages covered by our lists."}),Object(g.jsxs)("ul",{children:[Object(g.jsxs)("li",{children:["English",Object(g.jsxs)("ul",{children:[Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=docs&file=CODE_OF_CONDUCT",children:"Code of Conduct"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=docs&file=CONTRIBUTING",children:"Contributing"})}),Object(g.jsx)("li",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=docs&file=HOWTO",children:"How-to"})})]})]}),Object(g.jsxs)("li",{children:["\u2026"," ",Object(g.jsx)("em",{children:Object(g.jsx)("a",{href:"/free-programming-books-search?sect=docs&file=README",children:"More languages"})})," ","\u2026"]})]}),Object(g.jsxs)("p",{children:["You might notice that there are"," ",Object(g.jsx)("a",{href:"/free-programming-books/docs/#translations",children:"some missing translations here"})," - perhaps you would like to help out by"," ",Object(g.jsx)("a",{href:"/free-programming-books/docs/CONTRIBUTING.html#help-out-by-contributing-a-translation",children:"contributing a translation"}),"?"]}),Object(g.jsx)("h2",{id:"license",children:"License"}),Object(g.jsxs)("p",{children:["Each file included in this repository is licensed under the"," ",Object(g.jsx)("a",{href:"/free-programming-books/LICENSE",children:"CC BY License"}),"."]})]})},P=s.p+"static/media/sun.4c5a4fb0.png",C=s.p+"static/media/moon.dd634065.png",E=s(156),B=s(78),I=s(77);var z=function(e){var r=e.file,s=e.sect,o=Object(c.useState)(null),a=Object(h.a)(o,2),n=a[0],t=a[1],l=Object(c.useState)(!0),j=Object(h.a)(l,2),f=j[0],d=j[1];return Object(c.useEffect)((function(){function e(){return(e=Object(i.a)(b.a.mark((function e(){var c;return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,d(!0),e.next=4,x.a.get("https://raw.githubusercontent.com/EbookFoundation/free-programming-books/main/".concat(s,"/").concat(r,".md"));case 4:c=e.sent,t(c.data),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(0),console.log("Couldn't get data. Please try again later");case 11:d(!1);case 12:case"end":return e.stop()}}),e,null,[[0,8]])})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[r,s]),f?Object(g.jsx)("p",{children:"Loading..."}):Object(g.jsx)("section",{children:Object(g.jsx)(E.a,{children:n,remarkRehypeOptions:{allowDangerousHtml:!0},rehypePlugins:[B.a,I.a]})})},R=s(50),_=null;function N(e){var r=[],s=[];return e.children[0].children.forEach((function(e){e.sections.forEach((function(c){s.includes(c.section)||s.push(c.section),c.entries.forEach((function(s){r.push({author:s.author,title:s.title,url:s.url,lang:e.language,section:c.section})})),c.subsections.forEach((function(s){s.entries.forEach((function(o){r.push({author:o.author,title:o.title,url:o.url,lang:e.language,section:c.section,subsection:s.section})}))}))}))})),{arr:r,sections:s}}var L=function(){var e=Object(c.useState)(void 0),r=Object(h.a)(e,2),s=r[0],o=r[1],a=Object(c.useState)([]),n=Object(h.a)(a,2),j=n[0],f=n[1],m=Object(c.useState)(!0),p=Object(h.a)(m,2),T=p[0],E=p[1],B=Object(c.useState)({searchTerm:"","lang.code":""}),I=Object(h.a)(B,2),L=I[0],H=I[1],D=Object(c.useState)([]),A=Object(h.a)(D,2),G=A[0],M=A[1],U=Object(S.a)(["lightMode"]),V=Object(h.a)(U,3),K=V[0],J=V[1],W=(V[2],Object(c.useState)({lang:"",subject:""})),Y=Object(h.a)(W,2),$=Y[0],q=Y[1],Q=Object(c.useState)(""),X=Object(h.a)(Q,2),Z=X[0],ee=(X[1],null),re=function(e,r){H(Object(l.a)(Object(l.a)({},L),{},Object(t.a)({},e,r)))};return Object(c.useEffect)((function(){function e(){return(e=Object(i.a)(b.a.mark((function e(){var r,s,c,a,n;return b.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,x.a.get("https://raw.githubusercontent.com/FreeEbookFoundationBot/free-programming-books-json/main/fpb.json");case 3:r=e.sent,o(r.data),s=N(r.data),c=s.arr,s.sections,f(c),e.next=14;break;case 9:e.prev=9,e.t0=e.catch(0),o(_),a=N(_),n=a.arr,a.sections,f(n);case 14:E(!1);case 15:case"end":return e.stop()}}),e,null,[[0,9]])})))).apply(this,arguments)}q(R.parse(document.location.search)),$.lang&&("langs"===$.lang||"subjects"===$.lang?re("lang.code","en"):re("lang.code",$.lang)),y(K.lightMode?v.lightMode:v.darkMode),function(){e.apply(this,arguments)}()}),[]),Object(c.useEffect)((function(){if(j){for(var e=new k.a(j,{useExtendedSearch:!0,findAllMatches:!0,shouldSort:!0,includeScore:!0,threshold:.2,keys:["author","title","lang.code","section"]}),r=[],s=[],c=0,o=Object.entries(L);c {\r\n changeParameter(\"lang.code\", e.target.value);\r\n setSelected(e.target.value);\r\n };\r\n\r\n useEffect(() => {\r\n let queries = queryString.parse(document.location.search);\r\n if (queries.lang) {\r\n if (queries.lang === \"langs\" || queries.lang === \"subjects\") {\r\n changeParameter(\"lang.code\", \"en\");\r\n setSelected(\"en\");\r\n } else {\r\n changeParameter(\"lang.code\", queries.lang);\r\n setSelected(queries.lang);\r\n }\r\n } else {\r\n changeParameter(\"lang.code\", \"\");\r\n setSelected(\"\")\r\n }\r\n }, []);\r\n\r\n useEffect(\r\n // run whenever data changes\r\n () => {\r\n if (data) {\r\n let langArray = [{ code: \"en\", name: \"English\" }];\r\n data.children[0].children.forEach((document) => {\r\n if (typeof document.language.name === \"string\" && document.language.name.length > 0) {\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\") {\r\n // 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 };\r\n\r\n options =\r\n languages &&\r\n languages.map((language) => {\r\n return createOption(language);\r\n });\r\n\r\n let filterList = (\r\n
\r\n \r\n {options}\r\n
\r\n );\r\n\r\n return (\r\n
\r\n
\r\n

Filter by Language

\r\n \r\n
\r\n {showFilters ? filterList : \"\"}\r\n
\r\n );\r\n}\r\n\r\nexport default LangFilters;\r\n","import React, {useEffect} from \"react\";\r\nconst queryString = require(\"query-string\");\r\n\r\nfunction SearchBar(props) {\r\n useEffect(() => {\r\n let queries = queryString.parse(document.location.search);\r\n if (queries.search) {\r\n document.getElementById(\"searchBar\").value = queries.search;\r\n props.changeParameter(\"searchTerm\", queries.search);\r\n }\r\n }, [props]);\r\n\r\n const handleChange = (e) => {\r\n props.changeParameter(\"searchTerm\", 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}{data.author ? ` by ${data.author}` : \"\"}\r\n \r\n
  • \r\n );\r\n}\r\n\r\nexport default SearchResult;\r\n","import React, { useState, createContext } from \"react\";\r\n\r\n//https://levelup.gitconnected.com/dark-mode-in-react-533faaee3c6e\r\n\r\nexport const themes = {\r\n dark: \"\",\r\n light: \"dark-content\",\r\n};\r\n\r\nexport const swapMode = (theme) => {\r\n switch (theme) {\r\n case themes.light:\r\n document.body.classList.add('dark-content');\r\n break;\r\n case themes.dark:\r\n default:\r\n document.body.classList.remove('dark-content');\r\n break;\r\n }\r\n }\r\n\r\nexport const ThemeContext = createContext({\r\n theme: themes.dark,\r\n changeTheme: () => {},\r\n});\r\n\r\nexport default function ThemeContextWrapper(props) {\r\n const [theme, setTheme] = useState(props.theme);\r\n\r\n function changeTheme(theme) {\r\n setTheme(theme);\r\n }\r\n // console.log(theme)\r\n swapMode(theme)\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\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

    Resources

    \r\n\r\n

    This project lists books and other resources grouped by genres:

    \r\n\r\n

    Books

    \r\n\r\n

    \r\n English, By Programming Language\r\n

    \r\n\r\n

    \r\n English, By Subject\r\n

    \r\n

    Other Languages

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

    Cheat Sheets

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

    Free Online Courses

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

    Interactive Programming Resources

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

    Problem Sets and Competitive Programming

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

    Podcast - Screencast

    \r\n\r\n

    Free Podcasts and Screencasts:

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

    Programming Playgrounds

    \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","export default __webpack_public_path__ + \"static/media/sun.4c5a4fb0.png\";","export default __webpack_public_path__ + \"static/media/moon.dd634065.png\";","import React, { useEffect, useState } from \"react\";\r\nimport ReactMarkdown from \"react-markdown\";\r\nimport axios from \"axios\";\r\nimport rehypeSlug from \"rehype-slug\";\r\nimport rehypeRaw from \"rehype-raw\";\r\n\r\nfunction BookList({ file, sect }) {\r\n let [markdown, setMarkdown] = useState(null);\r\n const [loading, setLoading] = useState(true);\r\n\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/EbookFoundation/free-programming-books/main/${sect}/${file}.md`\r\n );\r\n setMarkdown(result.data);\r\n } catch (e) {\r\n console.log(\"Couldn't get data. Please try again later\");\r\n }\r\n setLoading(false);\r\n }\r\n fetchData();\r\n }, [file, sect]);\r\n\r\n if (loading) {\r\n return

    Loading...

    ;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default BookList;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport LangFilters from \"./components/LangFilters\";\r\nimport SearchBar from \"./components/SearchBar\";\r\nimport SearchResult from \"./components/SearchResult\";\r\nimport axios from \"axios\";\r\nimport Fuse from \"fuse.js\";\r\nimport { ThemeContext, themes, swapMode } from \"./darkMode\";\r\nimport { useCookies } from \"react-cookie\";\r\n\r\nimport Default from \"./components/Default\";\r\n\r\nimport SunImg from \"./img/sun.png\";\r\nimport MoonImg from \"./img/moon.png\";\r\nimport BookList from \"./components/BookList\";\r\nconst queryString = require(\"query-string\");\r\n\r\nconst fpb = null;\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 const [loading, setLoading] = useState(true); // Determines whether to show spinner\r\n const [searchParams, setSearchParams] = useState({ searchTerm: \"\", \"lang.code\": \"\" });\r\n const [searchResults, setSearchResults] = useState([]);\r\n // eslint-disable-next-line\r\n const [cookies, setCookie, removeCookie] = useCookies([\"lightMode\"]);\r\n const [queries, setQueries] = useState({ lang: \"\", subject: \"\" });\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\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 setQueries(queryString.parse(document.location.search));\r\n if (queries.lang) {\r\n if (queries.lang === \"langs\" || queries.lang === \"subjects\") {\r\n changeParameter(\"lang.code\", \"en\");\r\n } else {\r\n changeParameter(\"lang.code\", queries.lang);\r\n }\r\n }\r\n\r\n swapMode(cookies.lightMode ? themes.lightMode : themes.darkMode);\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 // eslint-disable-next-line\r\n let { arr, sections } = jsonToArray(result.data);\r\n setDataArray(arr);\r\n } catch (e) {\r\n setData(fpb);\r\n // eslint-disable-next-line\r\n let { arr, sections } = jsonToArray(fpb);\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 // Finds most relevant title or author\r\n // THIS IS THE MAIN SEARCH FUNCTION\r\n useEffect(() => {\r\n if (dataArray) {\r\n const fuseOptions = {\r\n useExtendedSearch: true, // see fuse.js documentation\r\n findAllMatches: true, //continue searching after first match\r\n shouldSort: true, // sort by proximity score\r\n includeScore: true, // includes score in results\r\n threshold: 0.2, // threshold for fuzzy-search,\r\n keys: [\"author\", \"title\", \"lang.code\", \"section\"],\r\n };\r\n\r\n // create new fuse given the array of books and the fuse options from above\r\n let fuse = new Fuse(dataArray, fuseOptions);\r\n let andQuery = []; // for filters that MUST be matched, like language\r\n let orQuery = []; // filters where any may be matched, like author or title\r\n\r\n // for each search param\r\n for (const [key, value] of Object.entries(searchParams)) {\r\n if (value === null || value === \"\") continue;\r\n if (key === \"lang.code\" || key === \"section\") {\r\n // the '^' means it must be an exact match at the beginning\r\n // this is because lang.code and section are strict filters\r\n andQuery.push({ [key]: `^${value}` });\r\n }\r\n if (key === \"searchTerm\") {\r\n orQuery.push({ author: value });\r\n orQuery.push({ title: value });\r\n }\r\n }\r\n // Nest the 'or' query inside the 'and' query\r\n // Necessary step, a quirk with fuse.js\r\n andQuery.push({ $or: orQuery });\r\n // Perform the search\r\n let result = fuse.search({\r\n $and: andQuery,\r\n });\r\n // filter to top results\r\n result = result.slice(0, 40);\r\n\r\n // Goes through the list of results\r\n let relevantLists = [];\r\n result.forEach((entry) => {\r\n // Checks if a new entry has already been made with the given programming language and human language.\r\n let obj = relevantLists.find(\r\n (o) => o.item.section === entry.item.section && o.item.lang.code === entry.item.lang.code\r\n );\r\n if (!obj && entry.item.lang.code) {\r\n let langCode = entry.item.lang.code;\r\n let section = entry.item.subsection ? entry.item.subsection : entry.item.section;\r\n // English is split into the subjects and langs file. The parser flags which type of entry it is to use here\r\n if (langCode === \"en\") {\r\n if (entry.item.lang.isSubject) {\r\n langCode = \"subjects\";\r\n } else {\r\n langCode = \"langs\";\r\n }\r\n }\r\n\r\n let id = section;\r\n\r\n // Some ids are in HTML tags, so this will extract that id to form proper links\r\n if (id.includes(\"Loading...;\r\n // }\r\n if (error) {\r\n return

    Error: {error}

    ;\r\n }\r\n if (searchParams.searchTerm && searchResults.length !== 0) {\r\n resultsList =\r\n searchResults &&\r\n searchResults.map((entry) => {\r\n return ;\r\n });\r\n }\r\n\r\n return (\r\n
    \r\n \r\n {({ changeTheme }) => {\r\n let willBeDarkMode = cookies.lightMode && cookies.lightMode.toLowerCase() !== \"true\"; //whether or not we are currently light mode and will become dark mode\r\n changeTheme(willBeDarkMode ? themes.light : themes.dark);\r\n return (\r\n {\r\n setCookie(\"lightMode\", willBeDarkMode);\r\n changeTheme(willBeDarkMode ? themes.light : themes.dark);\r\n }}\r\n style={{ width: \"20px\", height: \"20px\", display: \"block\", marginLeft: \"auto\" }}\r\n />\r\n );\r\n }}\r\n \r\n
    \r\n

    \r\n free-programming-books\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 {loading ? (\r\n

    \r\n ) : (\r\n

    \r\n {\" \"}\r\n {\" \"}\r\n
    \r\n )}\r\n
    \r\n
    \r\n\r\n
    \r\n {loading ? (\r\n

    Loading

    \r\n ) : resultsList ? (\r\n
    \r\n
    \r\n

    Search Results

    \r\n
      {resultsList}
    \r\n
    \r\n ) : searchParams.searchTerm ? (\r\n
    \r\n
    \r\n

    No results found.

    \r\n
    \r\n ) : queries.file && queries.sect ? (\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","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 ThemeContextWrapper from './darkMode';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport { CookiesProvider } from 'react-cookie';\r\n\r\nReactDOM.render(\r\n\r\n\t\r\n\t \r\n\t\t\r\n\t \r\n\t\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.e1a738b6.chunk.js b/static/js/main.e1a738b6.chunk.js new file mode 100644 index 0000000..1876d6b --- /dev/null +++ b/static/js/main.e1a738b6.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonpfpb_search_page=this.webpackJsonpfpb_search_page||[]).push([[0],{145:function(e,r,s){"use strict";s.r(r);var o=s(2),t=s.n(o),c=s(70),i=s.n(c),a=(s(86),s(38)),n=s(3),l=s(6),h=s(10),b=s(29),g=s.n(b),j=s(0),d=s(50);var m=function(e){var r,s=e.changeParameter,t=e.data,c=e.langCode,i=Object(o.useState)([]),a=Object(h.a)(i,2),n=a[0],l=a[1],b=Object(o.useState)(c),g=Object(h.a)(b,2),m=g[0],f=g[1],u=Object(o.useState)(!1),p=Object(h.a)(u,2),O=p[0],k=p[1],x=function(e){s("lang.code",e.target.value),f(e.target.value)};Object(o.useEffect)((function(){var e=d.parse(document.location.search);e.lang?"langs"===e.lang||"subjects"===e.lang?(s("lang.code","en"),f("en")):(s("lang.code",e.lang),f(e.lang)):(s("lang.code",""),f(""))}),[]),Object(o.useEffect)((function(){if(t){var e=[{code:"en",name:"English"}];t.children[0].children.forEach((function(r){"string"===typeof r.language.name&&r.language.name.length>0&&"en"!==r.language.code&&e.push(r.language)})),e.sort((function(e,r){return e.name>r.name})),l(e)}}),[t]),r=n&&n.map((function(e){return function(e){return Object(j.jsx)("div",{children:Object(j.jsxs)("label",{children:[Object(j.jsx)("input",{type:"radio",className:"lang",value:e.code,onChange:x,checked:e.code===m},e.code),e.name]})})}(e)}));var v=Object(j.jsxs)("form",{className:"filters",children:[Object(j.jsxs)("label",{children:[Object(j.jsx)("input",{type:"radio",className:"sect-select",value:"",onChange:x,checked:""===m},"all"),"All Languages"]}),r]});return Object(j.jsxs)("div",{className:"langFilters",children:[Object(j.jsxs)("div",{className:"filterHeader",children:[Object(j.jsx)("h3",{children:"Filter by Language"}),Object(j.jsx)("button",{onClick:function(){return k(!O)},children:O?"-":"+"})]}),O?v:""]})};s(50);var f=function(e){return Object(o.useEffect)((function(){document.getElementById("searchBar").value=e.defaultTerm}),[]),Object(j.jsx)("form",{onSubmit:function(e){e.preventDefault()},name:"searchBar",className:"searchbar",children:Object(j.jsx)("input",{id:"searchBar",autoComplete:"off",type:"text",name:"searchTerm",placeholder:"Search Book or Author",className:"searchterm",onChange:function(r){e.changeParameter("searchTerm",r.target.value)}})})};var u=function(e){var r=e.data;return Object(j.jsx)("li",{className:"result",children:Object(j.jsxs)("a",{href:r.url,target:"_blank",rel:"noreferrer",children:["(",r.lang.code,") ",r.title,r.author?" by ".concat(r.author):""]})})},p=s(41),O=s.n(p),k=s(76),x={dark:"",light:"dark-content"},v=function(e){if(e===x.light)document.body.classList.add("dark-content");else document.body.classList.remove("dark-content")},y=Object(o.createContext)({theme:x.dark,changeTheme:function(){}});function F(e){var r=Object(o.useState)(e.theme),s=Object(h.a)(r,2),t=s[0],c=s[1];return v(t),Object(j.jsx)(y.Provider,{value:{theme:t,changeTheme:function(e){c(e)}},children:e.children})}var w=s(157);var E=function(){return Object(j.jsxs)("section",{children:[Object(j.jsx)("br",{}),Object(j.jsx)("h1",{id:"list-of-free-learning-resources-in-many-languages",children:"List of Free Learning Resources In Many Languages"}),Object(j.jsx)("div",{align:"center",children:Object(j.jsxs)("p",{children:[Object(j.jsx)("a",{href:"https://github.com/sindresorhus/awesome",children:Object(j.jsx)("img",{src:"https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg",alt:"Awesome"})}),Object(j.jsx)("a",{href:"https://creativecommons.org/licenses/by/4.0/",children:Object(j.jsx)("img",{src:"https://img.shields.io/badge/License-CC%20BY%204.0-lightgrey.svg",alt:"License: CC BY 4.0"})})]})}),Object(j.jsx)("h2",{id:"intro",children:"Intro"}),Object(j.jsxs)("p",{children:["This list was originally a clone of"," ",Object(j.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(j.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(j.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(j.jsx)("div",{align:"center",children:Object(j.jsxs)("p",{children:[Object(j.jsx)("a",{href:"https://github.com/EbookFoundation/free-programming-books/network",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/forks/EbookFoundation/free-programming-books?style=flat&logo=github&logoColor=whitesmoke&label=Forks",alt:"GitHub repo forks"})}),"\xa0",Object(j.jsx)("a",{href:"https://github.com/EbookFoundation/free-programming-books/stargazers",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/stars/EbookFoundation/free-programming-books?style=flat&logo=github&logoColor=whitesmoke&label=Stars",alt:"GitHub repo stars"})}),"\xa0",Object(j.jsx)("a",{href:"https://github.com/EbookFoundation/free-programming-books/graphs/contributors",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/contributors-anon/EbookFoundation/free-programming-books?style=flat&logo=github&logoColor=whitesmoke&label=Contributors",alt:"GitHub repo contributors"})}),Object(j.jsx)("br",{}),Object(j.jsx)("a",{href:"https://github.com/sponsors/EbookFoundation",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/sponsors/EbookFoundation?style=flat&logo=github&logoColor=whitesmoke&label=Sponsors",alt:"GitHub org sponsors"})}),"\xa0",Object(j.jsx)("a",{href:"https://github.com/EbookFoundation/free-programming-books/watchers",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/watchers/EbookFoundation/free-programming-books?style=flat&logo=github&logoColor=whitesmoke&label=Watchers",alt:"GitHub repo watchers"})}),"\xa0",Object(j.jsx)("a",{href:"https://github.com/EbookFoundation/free-programming-books/archive/refs/heads/main.zip",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/repo-size/EbookFoundation/free-programming-books?style=flat&logo=github&logoColor=whitesmoke&label=Repo%20Size",alt:"GitHub repo size"})})]})}),Object(j.jsxs)("p",{children:["The ",Object(j.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(j.jsx)("a",{href:"https://ebookfoundation.org/contributions.html",children:"Donations"})," to the Free Ebook Foundation are tax-deductible in the US."]}),Object(j.jsx)("h2",{id:"how-to-contribute",children:"How To Contribute"}),Object(j.jsxs)("p",{children:["Please read ",Object(j.jsx)("a",{href:"/free-programming-books/docs/CONTRIBUTING.html",children:"CONTRIBUTING"}),". If you\u2019re new to GitHub,"," ",Object(j.jsx)("a",{href:"/free-programming-books/docs/HOWTO.html",children:"welcome"}),"! Remember to abide by our adapted from ",Object(j.jsx)("img",{src:"https://img.shields.io/badge/Contributor%20Covenant-1.3-4baaaa.svg",alt:"Contributor Covenant 1.3"})," ",Object(j.jsx)("a",{href:"/free-programming-books/docs/CODE_OF_CONDUCT.html",children:"Code of Conduct"})," too. (",Object(j.jsx)("a",{href:"/free-programming-books/docs/#translations",children:"translations"})," also available)"]}),Object(j.jsx)("p",{children:"Click on these badges to see how you might be able to help:"}),Object(j.jsx)("div",{align:"center",children:Object(j.jsxs)("p",{children:[Object(j.jsx)("a",{href:"https://github.com/EbookFoundation/free-programming-books/issues",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/issues/EbookFoundation/free-programming-books?style=flat&logo=github&logoColor=red&label=Issues",alt:"GitHub repo Issues"})}),"\xa0",Object(j.jsx)("a",{href:"https://github.com/EbookFoundation/free-programming-books/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/issues/EbookFoundation/free-programming-books/good%20first%20issue?style=flat&logo=github&logoColor=green&label=Good%20First%20issues",alt:"GitHub repo Good Issues for newbies"})}),"\xa0",Object(j.jsx)("a",{href:"https://github.com/EbookFoundation/free-programming-books/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/issues/EbookFoundation/free-programming-books/help%20wanted?style=flat&logo=github&logoColor=b545d1&label=%22Help%20Wanted%22%20issues",alt:"GitHub Help Wanted issues"})}),Object(j.jsx)("br",{}),Object(j.jsx)("a",{href:"https://github.com/EbookFoundation/free-programming-books/pulls",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/issues-pr/EbookFoundation/free-programming-books?style=flat&logo=github&logoColor=orange&label=PRs",alt:"GitHub repo PRs"})}),"\xa0",Object(j.jsx)("a",{href:"https://github.com/EbookFoundation/free-programming-books/pulls?q=is%3Apr+is%3Amerged",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/issues-search/EbookFoundation/free-programming-books?style=flat&logo=github&logoColor=green&label=Merged%20PRs&query=is%3Amerged",alt:"GitHub repo Merged PRs"})}),"\xa0",Object(j.jsx)("a",{href:"https://github.com/EbookFoundation/free-programming-books/pulls?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22",children:Object(j.jsx)("img",{src:"https://img.shields.io/github/issues-pr/EbookFoundation/free-programming-books/help%20wanted?style=flat&logo=github&logoColor=b545d1&label=%22Help%20Wanted%22%20PRs",alt:"GitHub Help Wanted PRs"})})]})}),Object(j.jsx)("h2",{id:"how-to-share",children:"How to Share"}),Object(j.jsxs)("ul",{children:[Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"http://twitter.com/intent/tweet?text=https://github.com/EbookFoundation/free-programming-books%0AFree%20Programming%20Books",children:"Share on Twitter"})}),Object(j.jsx)("li",{children:Object(j.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(j.jsx)("li",{children:Object(j.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(j.jsx)("li",{children:Object(j.jsx)("a",{href:"https://t.me/share/url?url=https://github.com/EbookFoundation/free-programming-books",children:"Share on Telegram"})})]}),Object(j.jsx)("h2",{id:"resources",children:"Resources"}),Object(j.jsx)("p",{children:"This project lists books and other resources grouped by genres:"}),Object(j.jsx)("h3",{id:"books",children:"Books"}),Object(j.jsx)("p",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-langs&lang=langs",children:"English, By Programming Language"})}),Object(j.jsx)("p",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-subjects&lang=subjects",children:"English, By Subject"})}),Object(j.jsx)("h4",{id:"other-languages",children:"Other Languages"}),Object(j.jsxs)("ul",{children:[Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ar&lang=ar",children:"Arabic / al arabiya / \u0627\u0644\u0639\u0631\u0628\u064a\u0629"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-az&lang=az",children:"Azerbaijani / \u0410\u0437\u04d9\u0440\u0431\u0430\u0458\u04b9\u0430\u043d \u0434\u0438\u043b\u0438 / \u0622\u0630\u0631\u0628\u0627\u064a\u062c\u0627\u0646\u062c\u0627 \u062f\u064a\u0644\u064a"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-bn&lang=bn",children:"Bengali / \u09ac\u09be\u0982\u09b2\u09be"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-bg&lang=bg",children:"Bulgarian / \u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-my&lang=my",children:"Burmese / \u1019\u103c\u1014\u103a\u1019\u102c\u1018\u102c\u101e\u102c"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-zh&lang=zh",children:"Chinese / \u4e2d\u6587"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-cs&lang=cs",children:"Czech / \u010de\u0161tina / \u010desk\xfd jazyk"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-dk&lang=dk",children:"Danish / dansk"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-nl&lang=nl",children:"Dutch / Nederlands"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-et&lang=et",children:"Estonian / eesti keel"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-fi&lang=fi",children:"Finnish / suomi / suomen kieli"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-fr&lang=fr",children:"French / fran\xe7ais"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-de&lang=de",children:"German / Deutsch"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-el&lang=el",children:"Greek / \u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-he&lang=he",children:"Hebrew / \u05e2\u05d1\u05e8\u05d9\u05ea"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-hi&lang=hi",children:"Hindi / \u0939\u093f\u0928\u094d\u0926\u0940"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-hu&lang=hu",children:"Hungarian / magyar / magyar nyelv"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-id&lang=id",children:"Indonesian / Bahasa Indonesia"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-it&lang=it",children:"Italian / italiano"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ja&lang=ja",children:"Japanese / \u65e5\u672c\u8a9e"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ko&lang=ko",children:"Korean / \ud55c\uad6d\uc5b4 [\u97d3\u570b\u8a9e]"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-no&lang=no",children:"Norwegian / Norsk"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-fa_IR&lang=fa_IR",children:"Persian / Farsi (Iran) / \u0641\u0627\u0631\u0633\u0649"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-pl&lang=pl",children:"Polish / polski / j\u0119zyk polski / polszczyzna"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-pt_BR&lang=pt_BR",children:"Portuguese (Brazil)"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-pt_PT&lang=pt_PT",children:"Portuguese (Portugal)"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ro&lang=ro",children:"Romanian (Romania) / limba rom\xe2n\u0103 / rom\xe2n"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ru&lang=ru",children:"Russian / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-sr&lang=sr",children:"Serbian / \u0441\u0440\u043f\u0441\u043a\u0438 \u0458\u0435\u0437\u0438\u043a / srpski jezik"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-sk&lang=sk",children:"Slovak / sloven\u010dina"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-es&lang=es",children:"Spanish / espa\xf1ol / castellano"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-sv&lang=sv",children:"Swedish / Svenska"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-ta&lang=ta",children:"Tamil / \u0ba4\u0bae\u0bbf\u0bb4\u0bcd"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-th&lang=th",children:"Thai / \u0e44\u0e17\u0e22"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-tr&lang=tr",children:"Turkish / T\xfcrk\xe7e"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-uk&lang=uk",children:"Ukrainian / \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=books&file=free-programming-books-vi&lang=vi",children:"Vietnamese / Ti\u1ebfng Vi\u1ec7t"})})]}),Object(j.jsx)("h3",{id:"cheat-sheets",children:"Cheat Sheets"}),Object(j.jsx)("ul",{children:Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-cheatsheets",children:"All Languages"})})}),Object(j.jsx)("h3",{id:"free-online-courses",children:"Free Online Courses"}),Object(j.jsxs)("ul",{children:[Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-ar&lang=ar",children:"Arabic / al arabiya / \u0627\u0644\u0639\u0631\u0628\u064a\u0629"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-bn&lang=bn",children:"Bengali / \u09ac\u09be\u0982\u09b2\u09be"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-bg&lang=bg",children:"Bulgarian / \u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-en&lang=en",children:"English"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-fi&lang=fi",children:"Finnish"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-fr&lang=fr",children:"French / fran\xe7ais"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-de&lang=de",children:"German / Deutsch"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-el&lang=el",children:"Greek / \u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-he&lang=he",children:"Hebrew / \u05e2\u05d1\u05e8\u05d9\u05ea"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-hi&lang=hi",children:"Hindi / \u0939\u093f\u0902\u0926\u0940"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-id&lang=id",children:"Indonesian / Bahasa Indonesia"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-it&lang=it",children:"Italian / italiano"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-ja&lang=ja",children:"Japanese / \u65e5\u672c\u8a9e"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-kk&lang=kk",children:"Kazakh / \u049b\u0430\u0437\u0430\u049b\u0448\u0430"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-km&lang=km",children:"Khmer / \u1797\u17b6\u179f\u17b6\u1781\u17d2\u1798\u17c2\u179a"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-ko&lang=ko",children:"Korean / \ud55c\uad6d\uc5b4 [\u97d3\u570b\u8a9e]"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-ml&lang=ml",children:"Malayalam / \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-fa_IR&lang=fa_IR",children:"Persian / Farsi (Iran) / \u0641\u0627\u0631\u0633\u0649"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-pl&lang=pl",children:"Polish / polski / j\u0119zyk polski / polszczyzna"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-pt_BR&lang=pt_BR",children:"Portuguese (Brazil)"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-pt_PT&lang=pt_PT",children:"Portuguese (Portugal)"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-ru&lang=ru",children:"Russian / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-si&lang=si",children:"Sinhala / \u0dc3\u0dd2\u0d82\u0dc4\u0dbd"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-es&lang=es",children:"Spanish / espa\xf1ol / castellano"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-th&lang=th",children:"Thai / \u0e20\u0e32\u0e29\u0e32\u0e44\u0e17\u0e22"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-tr&lang=tr",children:"Turkish / T\xfcrk\xe7e"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-uk&lang=uk",children:"Ukrainian / \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=courses&file=free-courses-vi&lang=vi",children:"Vietnamese / Ti\u1ebfng Vi\u1ec7t"})})]}),Object(j.jsx)("h3",{id:"interactive-programming-resources",children:"Interactive Programming Resources"}),Object(j.jsxs)("ul",{children:[Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-interactive-tutorials-zh&lang=zh",children:"Chinese / \u4e2d\u6587"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-interactive-tutorials-en&lang=en",children:"English"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-interactive-tutorials-pt_BR&lang=pt_BR",children:"Portuguese (Brazil)"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-interactive-tutorials-ru&lang=ru",children:"Russian / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a"})})]}),Object(j.jsx)("h3",{id:"problem-sets-and-competitive-programming",children:"Problem Sets and Competitive Programming"}),Object(j.jsx)("ul",{children:Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=more&file=problem-sets-competitive-programming",children:"Problem Sets"})})}),Object(j.jsx)("h3",{id:"podcast---screencast",children:"Podcast - Screencast"}),Object(j.jsx)("p",{children:"Free Podcasts and Screencasts:"}),Object(j.jsxs)("ul",{children:[Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-ar",children:"Arabic / al arabiya / \u0627\u0644\u0639\u0631\u0628\u064a\u0629"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-cs",children:"Czech / \u010de\u0161tina / \u010desk\xfd jazyk"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-en",children:"English"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-fi",children:"Finnish / Suomi"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-fr",children:"French / fran\xe7ais"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-he",children:"Hebrew / \u05e2\u05d1\u05e8\u05d9\u05ea"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-id",children:"Indonesian / Bahasa Indonesia"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-fa_IR",children:"Persian / Farsi (Iran) / \u0641\u0627\u0631\u0633\u0649"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-pl",children:"Polish / polski / j\u0119zyk polski / polszczyzna"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-pt_BR",children:"Portuguese (Brazil)"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-pt_PT",children:"Portuguese (Portugal)"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-ru",children:"Russian / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-si",children:"Sinhala / \u0dc3\u0dd2\u0d82\u0dc4\u0dbd"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-es",children:"Spanish / espa\xf1ol / castellano"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-sv",children:"Swedish / Svenska"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=casts&file=free-podcasts-screencasts-tr",children:"Turkish / T\xfcrk\xe7e"})})]}),Object(j.jsx)("h3",{id:"programming-playgrounds",children:"Programming Playgrounds"}),Object(j.jsxs)("ul",{children:[Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-playgrounds-zh",children:"Chinese / \u4e2d\u6587"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=more&file=free-programming-playgrounds",children:"English"})})]}),Object(j.jsx)("h2",{id:"translations",children:"Translations"}),Object(j.jsx)("p",{children:"Volunteers have translated many of our Contributing, How-to, and Code of Conduct documents into languages covered by our lists."}),Object(j.jsxs)("ul",{children:[Object(j.jsxs)("li",{children:["English",Object(j.jsxs)("ul",{children:[Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=docs&file=CODE_OF_CONDUCT",children:"Code of Conduct"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=docs&file=CONTRIBUTING",children:"Contributing"})}),Object(j.jsx)("li",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=docs&file=HOWTO",children:"How-to"})})]})]}),Object(j.jsxs)("li",{children:["\u2026"," ",Object(j.jsx)("em",{children:Object(j.jsx)("a",{href:"/free-programming-books-search?sect=docs&file=README",children:"More languages"})})," ","\u2026"]})]}),Object(j.jsxs)("p",{children:["You might notice that there are"," ",Object(j.jsx)("a",{href:"/free-programming-books/docs/#translations",children:"some missing translations here"})," - perhaps you would like to help out by"," ",Object(j.jsx)("a",{href:"/free-programming-books/docs/CONTRIBUTING.html#help-out-by-contributing-a-translation",children:"contributing a translation"}),"?"]}),Object(j.jsx)("h2",{id:"license",children:"License"}),Object(j.jsxs)("p",{children:["Each file included in this repository is licensed under the"," ",Object(j.jsx)("a",{href:"/free-programming-books/LICENSE",children:"CC BY License"}),"."]})]})},C=s.p+"static/media/sun.4c5a4fb0.png",P=s.p+"static/media/moon.dd634065.png",S=s(156),T=s(78),B=s(77);var I=function(e){var r=e.file,s=e.sect,t=Object(o.useState)(null),c=Object(h.a)(t,2),i=c[0],n=c[1],l=Object(o.useState)(!0),b=Object(h.a)(l,2),d=b[0],m=b[1];return Object(o.useEffect)((function(){function e(){return(e=Object(a.a)(g.a.mark((function e(){var o;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,m(!0),e.next=4,O.a.get("https://raw.githubusercontent.com/EbookFoundation/free-programming-books/main/".concat(s,"/").concat(r,".md"));case 4:o=e.sent,n(o.data),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(0),console.log("Couldn't get data. Please try again later");case 11:m(!1);case 12:case"end":return e.stop()}}),e,null,[[0,8]])})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[r,s]),d?Object(j.jsx)("p",{children:"Loading..."}):Object(j.jsx)("section",{children:Object(j.jsx)(S.a,{children:i,remarkRehypeOptions:{allowDangerousHtml:!0},rehypePlugins:[T.a,B.a]})})},H=s(50);function R(e){var r=[],s=[];return e.children[0].children.forEach((function(e){e.sections.forEach((function(o){s.includes(o.section)||s.push(o.section),o.entries.forEach((function(s){r.push({author:s.author,title:s.title,url:s.url,lang:e.language,section:o.section})})),o.subsections.forEach((function(s){s.entries.forEach((function(t){r.push({author:t.author,title:t.title,url:t.url,lang:e.language,section:o.section,subsection:s.section})}))}))}))})),{arr:r,sections:s}}var z=function(){var e=Object(o.useState)(void 0),r=Object(h.a)(e,2),s=r[0],t=r[1],c=Object(o.useState)([]),i=Object(h.a)(c,2),b=i[0],d=i[1],p=Object(o.useState)(!0),F=Object(h.a)(p,2),S=F[0],T=F[1],B=H.parse(document.location.search).search||"",z=Object(o.useState)({searchTerm:B,"lang.code":""}),A=Object(h.a)(z,2),_=A[0],G=A[1],N=Object(o.useState)([]),L=Object(h.a)(N,2),D=L[0],M=L[1],U=Object(o.useState)([]),V=Object(h.a)(U,2),W=(V[0],V[1],Object(w.a)(["lightMode"])),q=Object(h.a)(W,3),K=q[0],J=q[1],Y=(q[2],Object(o.useState)({lang:"",subject:""})),$=Object(h.a)(Y,2),Q=$[0],X=$[1],Z=Object(o.useState)(""),ee=Object(h.a)(Z,2),re=ee[0],se=ee[1],oe=null,te=function(e,r){G(Object(l.a)(Object(l.a)({},_),{},Object(n.a)({},e,r)))};return Object(o.useEffect)((function(){function e(){return(e=Object(a.a)(g.a.mark((function e(){var r,s,o;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,X(H.parse(document.location.search)),Q.lang&&("langs"===Q.lang||"subjects"===Q.lang?te("lang.code","en"):te("lang.code",Q.lang)),e.next=5,O.a.get("https://raw.githubusercontent.com/FreeEbookFoundationBot/free-programming-books-json/main/fpb.json");case 5:r=e.sent,t(r.data),s=R(r.data),o=s.arr,s.sections,d(o),e.next=14;break;case 11:e.prev=11,e.t0=e.catch(0),se("Couldn't get data. Please try again later");case 14:T(!1);case 15:case"end":return e.stop()}}),e,null,[[0,11]])})))).apply(this,arguments)}v(K.lightMode?x.lightMode:x.darkMode),function(){e.apply(this,arguments)}()}),[]),Object(o.useEffect)((function(){if(b){for(var e=new k.a(b,{useExtendedSearch:!0,findAllMatches:!0,shouldSort:!0,includeScore:!0,includeMatches:!0,threshold:.2,keys:["author","title","lang.code","section"]}),r=[],s=[],o=0,t=Object.entries(_);o {\r\n changeParameter(\"lang.code\", e.target.value);\r\n setSelected(e.target.value);\r\n };\r\n\r\n useEffect(() => {\r\n let queries = queryString.parse(document.location.search);\r\n if (queries.lang) {\r\n if (queries.lang === \"langs\" || queries.lang === \"subjects\") {\r\n changeParameter(\"lang.code\", \"en\");\r\n setSelected(\"en\");\r\n } else {\r\n changeParameter(\"lang.code\", queries.lang);\r\n setSelected(queries.lang);\r\n }\r\n } else {\r\n changeParameter(\"lang.code\", \"\");\r\n setSelected(\"\")\r\n }\r\n }, []);\r\n\r\n useEffect(\r\n // run whenever data changes\r\n () => {\r\n if (data) {\r\n let langArray = [{ code: \"en\", name: \"English\" }];\r\n data.children[0].children.forEach((document) => {\r\n if (typeof document.language.name === \"string\" && document.language.name.length > 0) {\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\") {\r\n // 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 };\r\n\r\n options =\r\n languages &&\r\n languages.map((language) => {\r\n return createOption(language);\r\n });\r\n\r\n let filterList = (\r\n
    \r\n \r\n {options}\r\n
    \r\n );\r\n\r\n return (\r\n
    \r\n
    \r\n

    Filter by Language

    \r\n \r\n
    \r\n {showFilters ? filterList : \"\"}\r\n
    \r\n );\r\n}\r\n\r\nexport default LangFilters;\r\n","import React, {useEffect} from \"react\";\r\nconst queryString = require(\"query-string\");\r\n\r\nfunction SearchBar(props) {\r\n useEffect(() => {\r\n document.getElementById(\"searchBar\").value = props.defaultTerm\r\n }, []);\r\n\r\n const handleChange = (e) => {\r\n props.changeParameter(\"searchTerm\", 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}{data.author ? ` by ${data.author}` : \"\"}\r\n \r\n
  • \r\n );\r\n}\r\n\r\nexport default SearchResult;\r\n","import React, { useState, createContext } from \"react\";\r\n\r\n//https://levelup.gitconnected.com/dark-mode-in-react-533faaee3c6e\r\n\r\nexport const themes = {\r\n dark: \"\",\r\n light: \"dark-content\",\r\n};\r\n\r\nexport const swapMode = (theme) => {\r\n switch (theme) {\r\n case themes.light:\r\n document.body.classList.add('dark-content');\r\n break;\r\n case themes.dark:\r\n default:\r\n document.body.classList.remove('dark-content');\r\n break;\r\n }\r\n }\r\n\r\nexport const ThemeContext = createContext({\r\n theme: themes.dark,\r\n changeTheme: () => {},\r\n});\r\n\r\nexport default function ThemeContextWrapper(props) {\r\n const [theme, setTheme] = useState(props.theme);\r\n\r\n function changeTheme(theme) {\r\n setTheme(theme);\r\n }\r\n // console.log(theme)\r\n swapMode(theme)\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\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

    \r\n \r\n \"Awesome\"\r\n \r\n \r\n \"License:\r\n \r\n

    \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 \r\n \"GitHub\r\n  \r\n \r\n \"GitHub\r\n  \r\n \r\n \"GitHub\r\n \r\n
    \r\n \r\n \"GitHub\r\n  \r\n \r\n \"GitHub\r\n  \r\n \r\n \"GitHub\r\n \r\n

    \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 adapted \r\n from \"Contributor{\" \"}\r\n Code of Conduct too. (\r\n translations also available)\r\n

    \r\n

    \r\n Click on these badges to see how you might be able to help:\r\n

    \r\n
    \r\n

    \r\n \r\n \"GitHub\r\n  \r\n \r\n \"GitHub\r\n  \r\n \r\n \"GitHub\r\n \r\n
    \r\n \r\n \"GitHub\r\n  \r\n \r\n \"GitHub\r\n  \r\n \r\n \"GitHub\r\n \r\n

    \r\n
    \r\n

    How to Share

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

    Resources

    \r\n\r\n

    This project lists books and other resources grouped by genres:

    \r\n\r\n

    Books

    \r\n\r\n

    \r\n English, By Programming Language\r\n

    \r\n\r\n

    \r\n English, By Subject\r\n

    \r\n

    Other Languages

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

    Cheat Sheets

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

    Free Online Courses

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

    Interactive Programming Resources

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

    Problem Sets and Competitive Programming

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

    Podcast - Screencast

    \r\n\r\n

    Free Podcasts and Screencasts:

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

    Programming Playgrounds

    \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","export default __webpack_public_path__ + \"static/media/sun.4c5a4fb0.png\";","export default __webpack_public_path__ + \"static/media/moon.dd634065.png\";","import React, { useEffect, useState } from \"react\";\r\nimport ReactMarkdown from \"react-markdown\";\r\nimport axios from \"axios\";\r\nimport rehypeSlug from \"rehype-slug\";\r\nimport rehypeRaw from \"rehype-raw\";\r\n\r\nfunction BookList({ file, sect }) {\r\n let [markdown, setMarkdown] = useState(null);\r\n const [loading, setLoading] = useState(true);\r\n\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/EbookFoundation/free-programming-books/main/${sect}/${file}.md`\r\n );\r\n setMarkdown(result.data);\r\n } catch (e) {\r\n console.log(\"Couldn't get data. Please try again later\");\r\n }\r\n setLoading(false);\r\n }\r\n fetchData();\r\n }, [file, sect]);\r\n\r\n if (loading) {\r\n return

    Loading...

    ;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default BookList;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport LangFilters from \"./components/LangFilters\";\r\nimport SearchBar from \"./components/SearchBar\";\r\nimport SearchResult from \"./components/SearchResult\";\r\nimport axios from \"axios\";\r\nimport Fuse from \"fuse.js\";\r\nimport { ThemeContext, themes, swapMode } from \"./darkMode\";\r\nimport { useCookies } from \"react-cookie\";\r\n\r\nimport Default from \"./components/Default\";\r\n\r\nimport SunImg from \"./img/sun.png\";\r\nimport MoonImg from \"./img/moon.png\";\r\nimport BookList from \"./components/BookList\";\r\nconst queryString = require(\"query-string\");\r\n\r\n\r\nfunction jsonToArray(json) {\r\n // list of all books\r\n let arr = [];\r\n // list of all topics (sections)\r\n let sections = [];\r\n // for each markdown document\r\n json.children[0].children.forEach((document) => {\r\n // for each topic in the markdown\r\n // these are typically h2 and h3 tags in the markdown\r\n document.sections.forEach((section) => {\r\n // Add section to master list if it's not there\r\n if (!sections.includes(section.section)) sections.push(section.section);\r\n // Add new entries that were under an h2 tag\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 // Add new entries that were under an h3 tag\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 // keeps the state of the json\r\n const [data, setData] = useState(undefined); \r\n // put all books into one array. uses more memory, but search is faster and less complex\r\n const [dataArray, setDataArray] = useState([]);\r\n // Keeps track if all resources are loaded\r\n const [loading, setLoading] = useState(true);\r\n // State keeping track of all search parameters\r\n // use the changeParameter function to set, NOT setSearchParams\r\n // changeParameter will retain the rest of the state\r\n let defaultSearch = queryString.parse(document.location.search).search || \"\";\r\n const [searchParams, setSearchParams] = useState({ searchTerm: defaultSearch, \"lang.code\": \"\" });\r\n // array of all search results\r\n const [searchResults, setSearchResults] = useState([]);\r\n // array of the topics the search results fall under\r\n const [sectionResults, setSectionResults] = useState([]);\r\n // eslint-disable-next-line\r\n const [cookies, setCookie, removeCookie] = useCookies([\"lightMode\"]);\r\n const [queries, setQueries] = useState({ lang: \"\", subject: \"\" });\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\r\n // Used to change the search parameters state\r\n // Heavily used in child components to set the state \r\n const changeParameter = (param, value) => {\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 \r\n\r\n swapMode(cookies.lightMode ? themes.lightMode : themes.darkMode);\r\n async function fetchData() {\r\n try {\r\n setQueries(queryString.parse(document.location.search));\r\n if (queries.lang) {\r\n if (queries.lang === \"langs\" || queries.lang === \"subjects\") {\r\n changeParameter(\"lang.code\", \"en\");\r\n } else {\r\n changeParameter(\"lang.code\", queries.lang);\r\n }\r\n }\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 // eslint-disable-next-line\r\n let { arr, sections } = jsonToArray(result.data);\r\n setDataArray(arr);\r\n } catch (e) {\r\n setError(\"Couldn't get data. Please try again later\")\r\n }\r\n setLoading(false);\r\n }\r\n fetchData();\r\n }, []);\r\n\r\n // fires when searchTerm changes\r\n // Finds most relevant title or author\r\n // THIS IS THE MAIN SEARCH FUNCTION\r\n useEffect(() => {\r\n if (dataArray) {\r\n const fuseOptions = {\r\n useExtendedSearch: true, // see fuse.js documentation\r\n findAllMatches: true, //continue searching after first match\r\n shouldSort: true, // sort by proximity score\r\n includeScore: true, // includes score in results\r\n includeMatches: true,\r\n threshold: 0.2, // threshold for fuzzy-search,\r\n keys: [\"author\", \"title\", \"lang.code\", \"section\"],\r\n };\r\n\r\n // create new fuse given the array of books and the fuse options from above\r\n let fuse = new Fuse(dataArray, fuseOptions);\r\n let andQuery = []; // for filters that MUST be matched, like language\r\n let orQuery = []; // filters where any may be matched, like author or title\r\n\r\n // for each search param\r\n for (const [key, value] of Object.entries(searchParams)) {\r\n if (value === null || value === \"\") continue;\r\n if (key === \"lang.code\" || key === \"section\") {\r\n // the '^' means it must be an exact match at the beginning\r\n // this is because lang.code and section are strict filters\r\n andQuery.push({ [key]: `^${value}` });\r\n }\r\n if (key === \"searchTerm\") {\r\n orQuery.push({ author: value });\r\n orQuery.push({ title: value });\r\n }\r\n }\r\n // Nest the 'or' query inside the 'and' query\r\n // Necessary step, a quirk with fuse.js\r\n andQuery.push({ $or: orQuery });\r\n // Perform the search\r\n let result = fuse.search({\r\n $and: andQuery,\r\n });\r\n // filter to top results\r\n result = result.slice(0, 40);\r\n console.log(result)\r\n\r\n // Goes through the list of results\r\n let relevantLists = [];\r\n result.forEach((entry) => {\r\n // Checks if a new entry has already been made with the given programming language and human language.\r\n let obj = relevantLists.find(\r\n (o) => o.item.section === entry.item.section && o.item.lang.code === entry.item.lang.code\r\n );\r\n if (!obj && entry.item.lang.code) {\r\n let langCode = entry.item.lang.code;\r\n let section = entry.item.subsection ? entry.item.subsection : entry.item.section;\r\n // English is split into the subjects and langs file. The parser flags which type of entry it is to use here\r\n if (langCode === \"en\") {\r\n if (entry.item.lang.isSubject) {\r\n langCode = \"subjects\";\r\n } else {\r\n langCode = \"langs\";\r\n }\r\n }\r\n\r\n let id = section;\r\n\r\n // Some ids are in HTML tags, so this will extract that id to form proper links\r\n if (id.includes(\"Loading...;\r\n // }\r\n if (error) {\r\n return

    Error: {error}

    ;\r\n }\r\n if (searchParams.searchTerm && searchResults.length !== 0) {\r\n resultsList =\r\n searchResults &&\r\n searchResults.map((entry) => {\r\n return ;\r\n });\r\n }\r\n\r\n return (\r\n
    \r\n \r\n {({ changeTheme }) => {\r\n let willBeDarkMode = cookies.lightMode && cookies.lightMode.toLowerCase() !== \"true\"; //whether or not we are currently light mode and will become dark mode\r\n changeTheme(willBeDarkMode ? themes.light : themes.dark);\r\n return (\r\n {\r\n setCookie(\"lightMode\", willBeDarkMode);\r\n changeTheme(willBeDarkMode ? themes.light : themes.dark);\r\n }}\r\n style={{ width: \"20px\", height: \"20px\", display: \"block\", marginLeft: \"auto\" }}\r\n />\r\n );\r\n }}\r\n \r\n
    \r\n

    \r\n free-programming-books\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 {loading ? (\r\n

    \r\n ) : (\r\n

    \r\n {\" \"}\r\n {\" \"}\r\n
    \r\n )}\r\n
    \r\n
    \r\n\r\n
    \r\n {loading ? (\r\n

    Loading

    \r\n ) : resultsList ? (\r\n
    \r\n
    \r\n

    Search Results

    \r\n
      {resultsList}
    \r\n
    \r\n ) : searchParams.searchTerm ? (\r\n
    \r\n
    \r\n

    No results found.

    \r\n
    \r\n ) : queries.file && queries.sect ? (\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","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 ThemeContextWrapper from './darkMode';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport { CookiesProvider } from 'react-cookie';\r\n\r\nReactDOM.render(\r\n\r\n\t\r\n\t \r\n\t\t\r\n\t \r\n\t\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