diff --git a/www/data/css/styles.css b/www/data/css/styles.css index 3267014..de83522 100644 --- a/www/data/css/styles.css +++ b/www/data/css/styles.css @@ -202,6 +202,8 @@ body { margin: 0; padding: 0; height: 42px; } + #headerdiv .logowrapper a { + cursor: default; } #headerdiv .logowrapper .logo { min-width: 197.5px; height: 30px; @@ -709,6 +711,8 @@ html, body { color: black; } .prgl_elem:hover .prgl_elem_subinfo_data { color: black; } + .prgl_elem:hover .prgl_elem_left img { + filter: grayscale(100%); } .prgl_elem_left { padding: 4px; @@ -929,6 +933,80 @@ html, body { #prgv_header h1 { font-size: 28pt; } } /* 400px */ +.booklst_entry { + display: flex; + flex-direction: row; + text-decoration: none; + background: #BBB; + border: solid 1px #444; + margin: 5px 0; } + .booklst_entry:hover { + background: white; + color: black; + border: solid 1px black; } + .booklst_entry:hover .booklst_date { + color: black; } + .booklst_entry:hover .booklst_title { + color: black; } + .booklst_entry:hover .booklst_left img { + filter: grayscale(100%); } + .booklst_entry:hover .booklst_date span { + background: white; + border-left: 1px solid black; + border-bottom: 1px solid black; } + +.booklst_left { + padding: 4px; + display: flex; } + +.booklst_left img { + width: 150px; + height: auto; } + +.booklst_right { + display: flex; + flex-direction: column; + flex-grow: 1; } + +.booklst_title { + color: #222; + font-size: 40pt; + font-weight: bolder; + flex-grow: 1; + display: flex; + justify-content: center; + align-items: center; + text-align: center; } + +.booklst_date { + display: flex; + flex-direction: row-reverse; + color: #222; } + +.booklst_date span { + background: #AAA; + padding: 0 3px; + border-left: 1px solid transparent; + border-bottom: 1px solid transparent; } + +.booklst_content p { + color: #333; } + +@media (max-width: 767px) { + .booklst_left { + flex-direction: column; + align-items: center; } + + .booklst_entry { + flex-direction: column; } + + .booklst_date { + display: none; + visibility: hidden; } + + .booklst_title { + font-size: 32pt; } } +/* 400px */ .aboutcontent { display: block; width: 100%; } @@ -1187,6 +1265,8 @@ html, body { .programs_pnl_entry:hover .programs_pnl_bottom { background: white; border-top: 1px solid black; } + .programs_pnl_entry:hover .programs_pnl_img img { + filter: grayscale(100%); } .programs_pnl_img { display: flex; @@ -1283,6 +1363,51 @@ html, body { .blogpnl_title { text-align: center; } } /* 400px */ +.books_pnl_content { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-evenly; } + +.books_pnl_entry { + display: flex; + flex-direction: column; + margin: 4px; + border: 1px solid #333; + background: #AAA; + text-decoration: none; } + +.books_pnl_entry img { + margin: 4px; + width: 150px; + height: auto; } + +.books_pnl_entry div { + display: flex; + justify-content: center; + align-items: flex-end; + flex-grow: 1; + border-top: 1px solid transparent; + text-align: center; + font-weight: bold; + color: #222; + text-decoration: none; } + +@media (max-width: 850px) { + .books_pnl_extra { + display: none; + visibility: collapse; } } +.books_pnl_entry:hover { + border: 1px solid black; + background: white; } + +.books_pnl_entry:hover div { + color: black; } + +.books_pnl_entry:hover img { + filter: grayscale(100%); } + +/* 400px */ .bfjoust_runner_owner { border: 1px solid #888; background: #F8F8F8; diff --git a/www/data/css/styles.min.css b/www/data/css/styles.min.css index 64b5a7c..615dd43 100644 --- a/www/data/css/styles.min.css +++ b/www/data/css/styles.min.css @@ -43,6 +43,7 @@ body{background-color:#EEE;color:#CCC;font-family:serif} .stripedtable tbody tr:nth-child(odd){background-color:#ccc} #headerdiv{z-index:999;background-color:#333;display:flex;border-bottom:1px solid #111;box-shadow:0 0 8px #000;position:fixed;width:100%} #headerdiv .logowrapper{flex:initial;margin:0;padding:0;height:42px} +#headerdiv .logowrapper a{cursor:default} #headerdiv .logowrapper .logo{min-width:197.5px;height:30px;margin:4px 0 8px 6px;flex:initial} #headerdiv .tabrow{display:flex;flex:auto} #headerdiv .tabrow .tab{display:flex;justify-content:center;align-items:center;background-color:#222;color:#CCC;border-left:1px solid #000;border-right:1px solid #000;font-weight:bold;text-decoration:none;margin:0 0 0 20px;padding:2px 5px;min-width:64px;text-align:center;flex:initial} @@ -185,6 +186,7 @@ html,body{margin:0;padding:0;height:100%} .prgl_elem:hover .prgl_elem_sdesc{color:black} .prgl_elem:hover .prgl_elem_subinfo_caption{color:black} .prgl_elem:hover .prgl_elem_subinfo_data{color:black} +.prgl_elem:hover .prgl_elem_left img{filter:grayscale(100%)} .prgl_elem_left{padding:4px;display:flex} .prgl_elem_left img{width:250px;height:100%;min-height:100px} .prgl_elem_right{display:flex;flex-direction:column;flex-grow:1} @@ -236,6 +238,25 @@ html,body{margin:0;padding:0;height:100%} .prgv_right_lang{justify-content:space-evenly} #prgv_header h1{font-size:28pt} } +.booklst_entry{display:flex;flex-direction:row;text-decoration:none;background:#BBB;border:solid 1px #444;margin:5px 0} +.booklst_entry:hover{background:white;color:black;border:solid 1px black} +.booklst_entry:hover .booklst_date{color:black} +.booklst_entry:hover .booklst_title{color:black} +.booklst_entry:hover .booklst_left img{filter:grayscale(100%)} +.booklst_entry:hover .booklst_date span{background:white;border-left:1px solid black;border-bottom:1px solid black} +.booklst_left{padding:4px;display:flex} +.booklst_left img{width:150px;height:auto} +.booklst_right{display:flex;flex-direction:column;flex-grow:1} +.booklst_title{color:#222;font-size:40pt;font-weight:bolder;flex-grow:1;display:flex;justify-content:center;align-items:center;text-align:center} +.booklst_date{display:flex;flex-direction:row-reverse;color:#222} +.booklst_date span{background:#AAA;padding:0 3px;border-left:1px solid transparent;border-bottom:1px solid transparent} +.booklst_content p{color:#333} +@media(max-width:767px){ + .booklst_left{flex-direction:column;align-items:center} + .booklst_entry{flex-direction:column} + .booklst_date{display:none;visibility:hidden} + .booklst_title{font-size:32pt} +} .aboutcontent{display:block;width:100%} .aboutcontent .boxedcontent{margin-bottom:20px} .about_egh_container{display:flex;flex-direction:column;align-items:center} @@ -292,6 +313,7 @@ html,body{margin:0;padding:0;height:100%} .programs_pnl_entry:hover{background:white;color:black;border:1px solid black} .programs_pnl_entry:hover .programs_pnl_center{color:black} .programs_pnl_entry:hover .programs_pnl_bottom{background:white;border-top:1px solid black} +.programs_pnl_entry:hover .programs_pnl_img img{filter:grayscale(100%)} .programs_pnl_img{display:flex;flex-direction:column;justify-content:flex-start;margin:4px} .programs_pnl_img img{width:100%;height:auto} .programs_pnl_center{display:flex;justify-content:center;align-items:flex-end;text-align:center;color:black;font-weight:bolder;font-size:15pt;flex-grow:1;margin:0 2px} @@ -312,6 +334,14 @@ html,body{margin:0;padding:0;height:100%} .blogpnl_date{background-color:#AAA;border-bottom:1px solid transparent;padding:2px;font-size:.8em;font-style:italic} .blogpnl_title{font-weight:bold;font-size:1.2em;text-align:left;margin:2px 0 2px 10px} @media(max-width:850px){.blogpnl_title{text-align:center}} +.books_pnl_content{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-evenly} +.books_pnl_entry{display:flex;flex-direction:column;margin:4px;border:1px solid #333;background:#AAA;text-decoration:none} +.books_pnl_entry img{margin:4px;width:150px;height:auto} +.books_pnl_entry div{display:flex;justify-content:center;align-items:flex-end;flex-grow:1;border-top:1px solid transparent;text-align:center;font-weight:bold;color:#222;text-decoration:none} +@media(max-width:850px){.books_pnl_extra{display:none;visibility:collapse}} +.books_pnl_entry:hover{border:1px solid black;background:white} +.books_pnl_entry:hover div{color:black} +.books_pnl_entry:hover img{filter:grayscale(100%)} .bfjoust_runner_owner{border:1px solid #888;background:#f8f8f8;padding:6px} .bfjoust_runner_owner .hsplit{display:flex;flex-direction:row;flex-wrap:nowrap} .bfjoust_runner_owner .hsplit_1{flex:1;margin:4px} diff --git a/www/data/css/styles.scss b/www/data/css/styles.scss index 12a1138..e3894b1 100644 --- a/www/data/css/styles.scss +++ b/www/data/css/styles.scss @@ -9,6 +9,7 @@ @import 'styles_errorview'; @import 'styles_programslist'; @import 'styles_programsview'; +@import 'styles_bookslist'; @import 'styles_about'; @import 'styles_admin'; @import 'styles_login'; @@ -16,5 +17,6 @@ @import 'styles_eulerpanel'; @import 'styles_programspanel'; @import 'styles_blogpanel'; +@import 'styles_bookspanel'; @import 'styles_bfjoustrunner'; @import 'styles_befungerunner'; \ No newline at end of file diff --git a/www/data/css/styles_bookslist.scss b/www/data/css/styles_bookslist.scss new file mode 100644 index 0000000..66dde0d --- /dev/null +++ b/www/data/css/styles_bookslist.scss @@ -0,0 +1,79 @@ +@import 'styles_config'; + +.booklst_parent { + +} + +.booklst_entry { + display: flex; + flex-direction: row; + text-decoration: none; + + background: #BBB; + border: solid 1px #444; + margin: 5px 0; + + &:hover { + background: $COL_COMPLEXHOVER_BG; + color: $COL_COMPLEXHOVER_FG; + border: solid 1px $COL_COMPLEXHOVER_BRD; + .booklst_date { color: $COL_COMPLEXHOVER_FG; } + .booklst_title { color: $COL_COMPLEXHOVER_FG; } + .booklst_left img { filter: grayscale(100%); } + .booklst_date span { background: $COL_COMPLEXHOVER_BG; border-left: 1px solid $COL_COMPLEXHOVER_BRD; border-bottom: 1px solid $COL_COMPLEXHOVER_BRD; } + } +} + +.booklst_left { + padding: 4px; + display: flex; +} + +.booklst_left img { + width: 150px; + height: auto; +} + +.booklst_right { + display: flex; + flex-direction: column; + flex-grow: 1; +} + +.booklst_title { + color: $COL_TEXT_DARK_DARKER; + font-size: 40pt; + font-weight: bolder; + flex-grow: 1; + + display: flex; + justify-content: center; + align-items: center; + text-align: center; +} + +.booklst_date { + display: flex; + flex-direction: row-reverse; + + color: $COL_TEXT_DARK_DARKER; +} + +.booklst_date span { + background: #AAA; + padding: 0 3px; + border-left: 1px solid transparent; + border-bottom: 1px solid transparent; +} + +.booklst_content p { + color: $COL_TEXT_DARK; +} + + +@include rdmedia(0) { + .booklst_left { flex-direction: column; align-items: center;} + .booklst_entry { flex-direction: column;} + .booklst_date { display:none; visibility: hidden; } + .booklst_title { font-size: 32pt; } +} \ No newline at end of file diff --git a/www/data/css/styles_bookspanel.scss b/www/data/css/styles_bookspanel.scss new file mode 100644 index 0000000..4236154 --- /dev/null +++ b/www/data/css/styles_bookspanel.scss @@ -0,0 +1,60 @@ +@import 'styles_config'; + +.books_pnl_content { + display:flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-evenly; +} + +.books_pnl_entry { + display:flex; + flex-direction: column; + + margin: 4px; + border: 1px solid #333; + background: #AAA; + + text-decoration: none; +} + +.books_pnl_entry img { + + margin: 4px; + width: 150px; + height: auto; +} + +.books_pnl_entry div { + display: flex; + justify-content: center; + align-items: flex-end; + flex-grow: 1; + + border-top: 1px solid transparent; + text-align: center; + font-weight: bold; + color: $COL_TEXT_DARK_DARKER; + text-decoration: none; + +} + +@include rdmedia_range(0,1) { + .books_pnl_extra { + display: none; + visibility: collapse; + } +} + +.books_pnl_entry:hover { + border: 1px solid $COL_COMPLEXHOVER_BRD; + background: $COL_COMPLEXHOVER_BG; +} + +.books_pnl_entry:hover div { + color: $COL_COMPLEXHOVER_FG; +} + +.books_pnl_entry:hover img { + filter: grayscale(100%); +} \ No newline at end of file diff --git a/www/data/css/styles_header.scss b/www/data/css/styles_header.scss index 929b354..040d8e8 100644 --- a/www/data/css/styles_header.scss +++ b/www/data/css/styles_header.scss @@ -15,6 +15,8 @@ padding: 0; height: 42px; + a { cursor: default; } + .logo { min-width: 197.5px; // prevents flickering after DOM load height: 30px; diff --git a/www/data/css/styles_programslist.scss b/www/data/css/styles_programslist.scss index 5fc3750..a00e75e 100644 --- a/www/data/css/styles_programslist.scss +++ b/www/data/css/styles_programslist.scss @@ -24,6 +24,7 @@ .prgl_elem_sdesc { color: $COL_COMPLEXHOVER_FG; } .prgl_elem_subinfo_caption { color: $COL_COMPLEXHOVER_FG; } .prgl_elem_subinfo_data { color: $COL_COMPLEXHOVER_FG; } + .prgl_elem_left img { filter: grayscale(100%); } } } diff --git a/www/data/css/styles_programspanel.scss b/www/data/css/styles_programspanel.scss index fd2faae..2c87010 100644 --- a/www/data/css/styles_programspanel.scss +++ b/www/data/css/styles_programspanel.scss @@ -27,6 +27,7 @@ .programs_pnl_center { color: $COL_COMPLEXHOVER_FG; } .programs_pnl_bottom { background: $COL_COMPLEXHOVER_BG; border-top: 1px solid $COL_COMPLEXHOVER_BRD; } + .programs_pnl_img img { filter: grayscale(100%); } } } diff --git a/www/data/images/book_img/apgte_1_front.png b/www/data/images/book_img/apgte_1_front.png new file mode 100644 index 0000000..ee9be22 Binary files /dev/null and b/www/data/images/book_img/apgte_1_front.png differ diff --git a/www/data/images/book_img/apgte_1_full.png b/www/data/images/book_img/apgte_1_full.png new file mode 100644 index 0000000..b4df82e Binary files /dev/null and b/www/data/images/book_img/apgte_1_full.png differ diff --git a/www/data/images/book_img/hpmor_1_front.png b/www/data/images/book_img/hpmor_1_front.png new file mode 100644 index 0000000..feb442c Binary files /dev/null and b/www/data/images/book_img/hpmor_1_front.png differ diff --git a/www/data/images/book_img/hpmor_1_full.png b/www/data/images/book_img/hpmor_1_full.png new file mode 100644 index 0000000..979cc2a Binary files /dev/null and b/www/data/images/book_img/hpmor_1_full.png differ diff --git a/www/data/images/book_img/hpmor_2_front.png b/www/data/images/book_img/hpmor_2_front.png new file mode 100644 index 0000000..f2ce79e Binary files /dev/null and b/www/data/images/book_img/hpmor_2_front.png differ diff --git a/www/data/images/book_img/hpmor_2_full.png b/www/data/images/book_img/hpmor_2_full.png new file mode 100644 index 0000000..d89f44c Binary files /dev/null and b/www/data/images/book_img/hpmor_2_full.png differ diff --git a/www/data/images/book_img/hpmor_3_front.png b/www/data/images/book_img/hpmor_3_front.png new file mode 100644 index 0000000..62cbd42 Binary files /dev/null and b/www/data/images/book_img/hpmor_3_front.png differ diff --git a/www/data/images/book_img/hpmor_3_full.png b/www/data/images/book_img/hpmor_3_full.png new file mode 100644 index 0000000..8477541 Binary files /dev/null and b/www/data/images/book_img/hpmor_3_full.png differ diff --git a/www/data/images/book_img/mm_front.png b/www/data/images/book_img/mm_front.png new file mode 100644 index 0000000..c8d844e Binary files /dev/null and b/www/data/images/book_img/mm_front.png differ diff --git a/www/data/images/book_img/mm_full.png b/www/data/images/book_img/mm_full.png new file mode 100644 index 0000000..359df7c Binary files /dev/null and b/www/data/images/book_img/mm_full.png differ diff --git a/www/fragments/header.php b/www/fragments/header.php index 14de5cf..735f8b4 100644 --- a/www/fragments/header.php +++ b/www/fragments/header.php @@ -1,6 +1,6 @@
- +
diff --git a/www/fragments/panel_books.php b/www/fragments/panel_books.php new file mode 100644 index 0000000..6f53726 --- /dev/null +++ b/www/fragments/panel_books.php @@ -0,0 +1,34 @@ + + +
+ + + + +
\ No newline at end of file diff --git a/www/index.php b/www/index.php index 6e86fa1..a9d87e7 100644 --- a/www/index.php +++ b/www/index.php @@ -24,7 +24,11 @@ $URL_RULES = [ 'url' => ['downloads', '?{id}'], 'target' => 'pages/programs_download.php', 'options' => [ 'id' => '%URL%' ], ], [ 'url' => ['programs', 'download', '?{id}'], 'target' => 'pages/programs_download.php', 'options' => [ 'id' => '%URL%' ], ], [ 'url' => ['programs', 'download'], 'target' => 'pages/programs_download.php', 'options' => [ 'id' => '%GET%' ], ], - + + [ 'url' => ['books'], 'target' => 'pages/books_list.php', 'options' => [], ], + [ 'url' => ['books', 'list'], 'target' => 'pages/books_list.php', 'options' => [], ], + [ 'url' => ['books', 'view', '?{id}'], 'target' => 'pages/books_view.php', 'options' => [ 'id' => '%GET%' ], ], + [ 'url' => ['update.php'], 'target' => 'pages/api_updatecheck.php', 'options' => [ 'Name' => '%GET%' ], ], [ 'url' => ['update.php', '?{Name}'], 'target' => 'pages/api_updatecheck.php', 'options' => [ 'Name' => '%URL%' ], ], [ 'url' => ['update'], 'target' => 'pages/api_updatecheck.php', 'options' => [ 'Name' => '%GET%' ], ], diff --git a/www/internals/books.php b/www/internals/books.php new file mode 100644 index 0000000..29b1272 --- /dev/null +++ b/www/internals/books.php @@ -0,0 +1,73 @@ +'err', 'message' => 'Duplicate id ' . $prog['id']]; + $ids []= $prog['id']; + + if (!file_exists($prog['imgfront_path'])) return ['result'=>'err', 'message' => 'Image not found ' . $prog['title_short']]; + if (!file_exists($prog['imgfull_path'])) return ['result'=>'err', 'message' => 'Image not found ' . $prog['title_short']]; + } + + if ($warn != null) return $warn; + return ['result'=>'ok', 'message' => '']; + } + + public static function checkThumbnails() + { + foreach (self::listAll() as $book) + { + if (!file_exists($book['preview_path'])) return ['result'=>'err', 'message' => 'Preview not found ' . $book['title_short']]; + } + + return ['result'=>'ok', 'message' => '']; + } + + public static function createPreview($prog) + { + $src = $prog['imgfront_path']; + $dst = $prog['preview_path']; + + smart_resize_image($src , null, 200, 0, true, $dst, 100); + } +} \ No newline at end of file diff --git a/www/pages/admin.php b/www/pages/admin.php index 1592472..6698bdc 100644 --- a/www/pages/admin.php +++ b/www/pages/admin.php @@ -9,14 +9,17 @@ require_once (__DIR__ . '/../internals/euler.php'); require_once (__DIR__ . '/../internals/highscores.php'); require_once (__DIR__ . '/../internals/mikeschergitgraph.php'); require_once (__DIR__ . '/../internals/programs.php'); +require_once (__DIR__ . '/../internals/books.php'); Database::connect(); $consistency_blog = Blog::checkConsistency(); $consistency_prog = Programs::checkConsistency(); $consistency_euler = Euler::checkConsistency(); +$consistency_books = Books::checkConsistency(); $consistency_egh = MikescherGitGraph::checkConsistency(); $consistency_progimg = Programs::checkThumbnails(); +$consistency_bookimg = Books::checkThumbnails(); ?>
-
Program thumbnails:
-
ExtendedGitGraph:
-
Book thumbnails: ?
+
Program thumbnails:
+
ExtendedGitGraph:
+
Book thumbnails:
Blog data:
Euler data:
Programs data:
+
Books data:

Update Program Thumbnails diff --git a/www/pages/admin_cmd.php b/www/pages/admin_cmd.php index 1a3c13a..9f54b85 100644 --- a/www/pages/admin_cmd.php +++ b/www/pages/admin_cmd.php @@ -3,6 +3,7 @@ global $OPTIONS; require_once (__DIR__ . '/../internals/base.php'); +require_once (__DIR__ . '/../internals/books.php'); require_once (__DIR__ . '/../internals/programs.php'); $cmd = $OPTIONS['cmd']; @@ -35,7 +36,27 @@ if ($cmd === 'createProgramThumbnails') if ($cmd === 'createBookThumbnails') { - //TODO + echo ''; + echo ''; + echo ''; + echo ''; + echo 'Mikescher.com - AdminExec'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + foreach (Books::listAll() as $book) + { + echo 'Create preview for ' . $book['title'] . '
' . "\n"; + Books::createPreview($book); + } + echo 'Finished.' . '
' . "\n"; + + echo ''; + echo ''; + echo ''; exit; } diff --git a/www/pages/blog_view.php b/www/pages/blog_view.php index daf8842..7bff421 100644 --- a/www/pages/blog_view.php +++ b/www/pages/blog_view.php @@ -12,7 +12,9 @@ $post = Blog::getBlogpost($id); if ($post === NULL) httpError(404, 'Blogpost not found'); -$isSubEuler = ($post['type'] === 'euler' && $subview !== ''); +$isSubEuler = ($post['type'] === 'euler' && $subview !== ''); +$isBaseEuler = ($post['type'] === 'euler'); + $eulerproblem = null; if ($isSubEuler) { @@ -34,7 +36,7 @@ if ($eulerproblem === null) $isSubEuler = false;
- +
diff --git a/www/pages/books_list.php b/www/pages/books_list.php new file mode 100644 index 0000000..ea6837f --- /dev/null +++ b/www/pages/books_list.php @@ -0,0 +1,62 @@ + + + + + + Mikescher.com - Converted Books + + + + + +
+ + + +
+ +
+ +

Books/Webserials I self-printed


+ +

+ These are some books I read but that do not have an official print version.
+ So I type-setted them myself (mostly in LyX) and printed them online.
+ I do not own the rights of any of these books.
+ The LyX files and generated PDF's are public and everyone who wants can print them on his own. +

+ + ' . "\n"; + foreach ($allbooks as $book) + { + echo ''; + echo '
'; + echo ' Thumbnail '  . $book['title'] . ''; + echo '
'; + echo '
'; + echo '
' . $book['date'] . '
'; + echo '
' . htmlspecialchars($book['title']) . '
'; + echo '
'; + echo '
' . "\n"; + } + echo '
' . "\n"; + + ?> + +
+ +
+ + + +
+ + \ No newline at end of file diff --git a/www/pages/main.php b/www/pages/main.php index d98d875..eab5c09 100644 --- a/www/pages/main.php +++ b/www/pages/main.php @@ -22,6 +22,8 @@ + +
diff --git a/www/pages/programs_download.php b/www/pages/programs_download.php new file mode 100644 index 0000000..9a41f91 --- /dev/null +++ b/www/pages/programs_download.php @@ -0,0 +1,21 @@ + 'hpmor_1', + 'title' => 'Harry Potter and the Methods of Rationality: Book 1', + 'title_short' => 'HPMoR: Book 1', + 'date' => '2015-04-04', + 'github' => 'https://github.com/Mikescher/HPMOR-LyX', + 'pages' => '597', + 'pdf' => 'https://github.com/Mikescher/HPMOR-LyX/raw/master/hpmor_volume1_16x23.pdf', + 'online' => 'http://www.hpmor.com/', + 'author' => 'Eliezer Yudkowsky', + 'size' => '17.0cm x 24.0cm', + ], + + [ + 'id' => 'hpmor_2', + 'title' => 'Harry Potter and the Methods of Rationality: Book 2', + 'title_short' => 'HPMoR: Book 2', + 'date' => '2015-04-04', + 'github' => 'https://github.com/Mikescher/HPMOR-LyX', + 'pages' => '719', + 'pdf' => 'https://github.com/Mikescher/HPMOR-LyX/raw/master/hpmor_volume2_16x23.pdf', + 'online' => 'http://www.hpmor.com/', + 'author' => 'Eliezer Yudkowsky', + 'size' => '17.0cm x 24.0cm', + ], + + [ + 'id' => 'hpmor_3', + 'title' => 'Harry Potter and the Methods of Rationality: Book 3', + 'title_short' => 'HPMoR: Book 3', + 'date' => '2015-04-04', + 'github' => 'https://github.com/Mikescher/HPMOR-LyX', + 'pages' => '493', + 'pdf' => 'https://github.com/Mikescher/HPMOR-LyX/raw/master/hpmor_volume3_16x23.pdf', + 'online' => 'http://www.hpmor.com/', + 'author' => 'Eliezer Yudkowsky', + 'size' => '17.0cm x 24.0cm', + ], + + [ + 'id' => 'apgte_1', + 'title' => 'A Practical Guide to Evil: Book 1', + 'title_short' => 'APGtE: Book 1', + 'date' => '2016-12-23', + 'github' => 'https://github.com/Mikescher/A-Practical-Guide-To-Evil-Lyx', + 'pages' => '501', + 'pdf' => 'https://github.com/Mikescher/A-Practical-Guide-To-Evil-Lyx/raw/master/APGTE_1/APGTE.pdf', + 'online' => 'https://practicalguidetoevil.wordpress.com/', + 'author' => 'David Verburg', + 'size' => '12.5cm x 19.0cm', + ], + + [ + 'id' => 'mm', + 'title' => 'The Metropolitan Man', + 'title_short' => 'The Metropolitan Man', + 'date' => '2017-12-02', + 'github' => 'https://github.com/Mikescher/Metropolitan-Man-Lyx', + 'pages' => '258', + 'pdf' => 'https://github.com/Mikescher/Metropolitan-Man-Lyx/raw/master/src/MM.pdf', + 'online' => 'https://www.fanfiction.net/s/10360716/1/', + 'author' => 'Alexandr Wales', + 'size' => '12.5cm x 19.0cm', + ], + ];