Digital Bookshelf V2 (#2866)

Since I was annoyed at not being able to use
[jekyll-archives](https://github.com/jekyll/jekyll-archives) to create
an archive for the books, I decided to implement myself the
[jekyll-archives-v2](https://github.com/george-gca/jekyll-archives-v2)
that doesn't have this limitation.

Closes #923.

---------

Signed-off-by: George Araújo <george.gcac@gmail.com>
This commit is contained in:
George 2025-02-28 13:57:36 -03:00 committed by GitHub
parent 14aaf4726e
commit 6625f2395a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 537 additions and 155 deletions

View File

@ -49,4 +49,4 @@ jobs:
with:
fail: true
# removed md files that include liquid tags
args: --user-agent 'curl/7.54' --exclude-path README.md --exclude-path _pages/404.md --exclude-path _pages/blog.md --exclude-path _posts/2018-12-22-distill.md --exclude-path _posts/2023-04-24-videos.md --verbose --no-progress './**/*.md' './**/*.html'
args: --user-agent 'curl/7.54' --exclude-path README.md --exclude-path _pages/404.md --exclude-path _pages/blog.md --exclude-path _posts/2018-12-22-distill.md --exclude-path _posts/2023-04-24-videos.md --exclude-path _books/the_godfather.md --verbose --no-progress './**/*.md' './**/*.html'

View File

@ -59,10 +59,12 @@ You can create new pages by adding new Markdown files in the [\_pages](_pages/)
## Creating new blog posts
To create a new blog post, you can add a new Markdown file in the [\_posts](_posts/) directory. The [name of the file must follow](https://jekyllrb.com/docs/posts/#creating-posts) the format `YYYY-MM-DD-title.md`. The easiest way to do this is to copy an existing blog post and modify it. Note that some blog posts have optional fields in the [frontmatter](https://jekyllrb.com/docs/front-matter/) that are used to enable specific behaviors or functions.
To create a new blog post, you can add a new Markdown file in the [\_posts](_posts/) directory, which is the [default location for posts in Jekyll](https://jekyllrb.com/docs/posts/). The [name of the file must follow](https://jekyllrb.com/docs/posts/#creating-posts) the format `YYYY-MM-DD-title.md`. The easiest way to do this is to copy an existing blog post and modify it. Note that some blog posts have optional fields in the [frontmatter](https://jekyllrb.com/docs/front-matter/) that are used to enable specific behaviors or functions.
If you want to create blog posts that are not ready to be published, but you want to track it with git, you can create a [\_drafts](https://jekyllrb.com/docs/posts/#drafts) directory and store them there.
Note that `posts` is also a collection, but it is a default collection created automatically by Jekyll. To access the posts, you can use the `site.posts` variable in your templates.
## Creating new projects
You can create new projects by adding new Markdown files in the [\_projects](_projects/) directory. The easiest way to do this is to copy an existing project and modify it.
@ -73,10 +75,14 @@ You can add news in the about page by adding new Markdown files in the [\_news](
## Adding Collections
This Jekyll theme implements `collections` to let you break up your work into categories. The theme comes with two default collections: `news` and `projects`. Items from the `news` collection are automatically displayed on the home page. Items from the `projects` collection are displayed on a responsive grid on projects page.
This Jekyll theme implements [collections](https://jekyllrb.com/docs/collections/) to let you break up your work into categories. The theme comes with three default collections: `news`, `projects`, and `books`. Items from the `news` collection are automatically displayed on the home page, while items from the `projects` collection are displayed on a responsive grid on projects page and items from the `books` collection are displayed on its own `bookshelf` page inside `submenus`.
You can easily create your own collections, apps, short stories, courses, or whatever your creative work is. To do this, edit the collections in the [\_config.yml](_config.yml) file, create a corresponding folder, and create a landing page for your collection, similar to [\_pages/projects.md](_pages/projects.md).
If you wish to create a collection with support for categories and tags, like the blog posts, you just need to add this collection to the `jekyll-archives` section of your [\_config.yml](_config.yml) file. You can check how this is done with the `books` collection. For more information about customizing the archives section or creating your own archives page, check the [jekyll-archives-v2 documentation](https://george-gca.github.io/jekyll-archives-v2/).
To access the collections, you can use the `site.COLLECTION_NAME` variable in your templates.
## Adding a new publication
To add publications create a new entry in the [\_bibliography/papers.bib](_bibliography/papers.bib) file. You can find the BibTeX entry of a publication in Google Scholar by clicking on the quotation marks below the publication title, then clicking on "BibTeX", or also in the conference page itself. By default, the publications will be sorted by year and the most recent will be displayed first. You can change this behavior and more in the `Jekyll Scholar` section in [\_config.yml](_config.yml) file.
@ -183,11 +189,9 @@ You can also:
- delete [\_includes/latest_posts.liquid](_includes/latest_posts.liquid)
- delete [\_includes/related_posts.liquid](_includes/related_posts.liquid)
- delete [\_layouts/archive-category.liquid](_layouts/archive-category.liquid)
- delete [\_layouts/archive-tag.liquid](_layouts/archive-tag.liquid)
- delete [\_layouts/archive-year.liquid](_layouts/archive-year.liquid)
- delete [\_layouts/archive.liquid](_layouts/archive.liquid) (unless you have a custom collection that uses it)
- delete [\_plugins/external-posts.rb](_plugins/external-posts.rb)
- remove the `jekyll-archives` gem from the [Gemfile](Gemfile) and the `plugins` section in [\_config.yml](_config.yml)
- remove the `jekyll-archives-v2` gem from the [Gemfile](Gemfile) and the `plugins` section in [\_config.yml](_config.yml) (unless you have a custom collection that uses it)
- remove the `classifier-reborn` gem from the [Gemfile](Gemfile)
### Removing the news section

View File

@ -4,7 +4,7 @@ gem 'jekyll'
# Core plugins that directly affect site building
group :jekyll_plugins do
gem 'jekyll-archives'
gem 'jekyll-archives-v2'
gem 'jekyll-email-protect'
gem 'jekyll-feed'
gem 'jekyll-get-json'
@ -32,7 +32,7 @@ group :other_plugins do
gem 'httparty'
gem 'observer' # used by jekyll-scholar
gem 'ostruct' # used by jekyll-twitter-plugin
gem 'terser' # used by jekyll-terser
# gem 'terser' # used by jekyll-terser
# gem 'unicode_utils' -- should be already installed by jekyll
# gem 'webrick' -- should be already installed by jekyll
end

View File

@ -1,8 +1,8 @@
GIT
remote: https://github.com/RobertoJBeltran/jekyll-terser.git
revision: 2f737004fe4732b92021c84e4de71e6a8585ff01
revision: 1085bf66d692799af09fe39f8162a1e6e42a3cc4
specs:
jekyll-terser (0.2.2)
jekyll-terser (0.2.3)
jekyll (>= 0.10.0)
terser (>= 1.0.0)
@ -30,8 +30,13 @@ GEM
latex-decode (~> 0.0)
racc (~> 1.7)
bigdecimal (3.1.9)
citeproc (1.0.10)
citeproc (1.1.0)
date
forwardable
json
namae (~> 1.0)
observer (< 1.0)
open-uri (< 1.0)
citeproc-ruby (1.1.14)
citeproc (~> 1.0, >= 1.0.9)
csl (~> 1.6)
@ -51,6 +56,7 @@ GEM
addressable
cssminify2 (2.0.1)
csv (3.3.2)
date (3.4.1)
deep_merge (1.2.2)
drb (2.2.1)
em-websocket (0.5.3)
@ -70,6 +76,7 @@ GEM
ffi (1.17.1-x86_64-darwin)
ffi (1.17.1-x86_64-linux-gnu)
ffi (1.17.1-x86_64-linux-musl)
forwardable (1.3.3)
forwardable-extended (2.6.0)
gemoji (4.1.0)
google-protobuf (4.29.3)
@ -96,25 +103,29 @@ GEM
csv
mini_mime (>= 1.0.0)
multi_xml (>= 0.5.2)
i18n (1.14.6)
i18n (1.14.7)
concurrent-ruby (~> 1.0)
jekyll (4.3.4)
jekyll (4.4.1)
addressable (~> 2.4)
base64 (~> 0.2)
colorator (~> 1.0)
csv (~> 3.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (>= 2.0, < 4.0)
jekyll-watch (~> 2.0)
json (~> 2.6)
kramdown (~> 2.3, >= 2.3.1)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (>= 0.3.6, < 0.5)
mercenary (~> 0.3, >= 0.3.6)
pathutil (~> 0.9)
rouge (>= 3.0, < 5.0)
safe_yaml (~> 1.0)
terminal-table (>= 1.8, < 4.0)
webrick (~> 1.7)
jekyll-archives (2.3.0)
jekyll-archives-v2 (0.0.6)
activesupport
jekyll (>= 3.6, < 5.0)
jekyll-email-protect (1.1.0)
jekyll-feed (0.17.0)
@ -136,8 +147,8 @@ GEM
jekyll-paginate-v2 (3.0.0)
jekyll (>= 3.0, < 5.0)
jekyll-regex-replace (1.1.0)
jekyll-sass-converter (3.0.0)
sass-embedded (~> 1.54)
jekyll-sass-converter (3.1.0)
sass-embedded (~> 1.75)
jekyll-scholar (7.1.3)
bibtex-ruby (~> 6.0)
citeproc-ruby (~> 1.0)
@ -157,7 +168,7 @@ GEM
gemoji (>= 3, < 5)
html-pipeline (~> 2.2)
jekyll (>= 3.0, < 5.0)
json (2.9.1)
json (2.10.1)
json-minify (0.0.3)
json (> 0)
kramdown (2.5.1)
@ -169,7 +180,7 @@ GEM
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
logger (1.6.5)
logger (1.6.6)
loofah (2.24.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
@ -198,6 +209,10 @@ GEM
nokogiri (1.18.3-x86_64-linux-musl)
racc (~> 1.4)
observer (0.1.2)
open-uri (0.5.0)
stringio
time
uri
ostruct (0.6.1)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
@ -207,37 +222,40 @@ GEM
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
rexml (3.4.0)
rexml (3.4.1)
rouge (4.5.1)
safe_yaml (1.0.5)
sass-embedded (1.83.4-aarch64-linux-gnu)
sass-embedded (1.85.1-aarch64-linux-gnu)
google-protobuf (~> 4.29)
sass-embedded (1.83.4-aarch64-linux-musl)
sass-embedded (1.85.1-aarch64-linux-musl)
google-protobuf (~> 4.29)
sass-embedded (1.83.4-arm-linux-gnueabihf)
sass-embedded (1.85.1-arm-linux-gnueabihf)
google-protobuf (~> 4.29)
sass-embedded (1.83.4-arm-linux-musleabihf)
sass-embedded (1.85.1-arm-linux-musleabihf)
google-protobuf (~> 4.29)
sass-embedded (1.83.4-arm64-darwin)
sass-embedded (1.85.1-arm64-darwin)
google-protobuf (~> 4.29)
sass-embedded (1.83.4-x86_64-darwin)
sass-embedded (1.85.1-x86_64-darwin)
google-protobuf (~> 4.29)
sass-embedded (1.83.4-x86_64-linux-gnu)
sass-embedded (1.85.1-x86_64-linux-gnu)
google-protobuf (~> 4.29)
sass-embedded (1.83.4-x86_64-linux-musl)
sass-embedded (1.85.1-x86_64-linux-musl)
google-protobuf (~> 4.29)
sax-machine (1.3.2)
securerandom (0.4.1)
stringio (3.1.5)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
terser (1.2.4)
terser (1.2.5)
execjs (>= 0.3.0, < 3)
time (0.4.1)
date
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
uglifier (4.2.1)
execjs (>= 0.3.0, < 3)
unicode-display_width (2.6.0)
uri (1.0.2)
uri (1.0.3)
webrick (1.9.1)
PLATFORMS
@ -260,7 +278,7 @@ DEPENDENCIES
feedjira
httparty
jekyll
jekyll-archives
jekyll-archives-v2
jekyll-email-protect
jekyll-feed
jekyll-get-json
@ -279,7 +297,6 @@ DEPENDENCIES
jemoji
observer
ostruct
terser
BUNDLED WITH
2.6.2
2.6.5

View File

@ -210,7 +210,7 @@ If you installed **al-folio** as described above, you can manually update your c
# Assuming the current directory is <your-repo-name>
$ git remote add upstream https://github.com/alshedivat/al-folio.git
$ git fetch upstream
$ git rebase v0.13.4
$ git rebase v0.14.0
```
If you have extensively customized a previous version, it might be trickier to upgrade.

27
_books/the_godfather.md Normal file
View File

@ -0,0 +1,27 @@
---
layout: book-review
title: The Godfather
author: Mario Puzo
cover: assets/img/book_covers/the_godfather.jpg
olid: OL43499941M # use Open Library ID to fetch cover (if no `cover` is provided)
isbn: 7539967447 # use ISBN to fetch cover (if no `olid` is provided, dashes are optional)
categories: classics crime historical-fiction mystery novels thriller
tags: top-100
buy_link: https://www.amazon.com/Godfather-Deluxe-Mario-Puzo/dp/0593542592
started: 2024-08-23
finished: 2024-09-07
released: 1969
stars: 5
goodreads_review: 6318556633
status: Finished
---
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sollicitudin eros sit amet ante aliquet, sit amet vulputate lectus mattis. Aenean ullamcorper pretium nunc, sed egestas lorem elementum id. Nulla id mi id neque ultrices egestas ut in urna. Sed ac ultricies nunc. Nam convallis placerat urna id egestas. Nulla porta, est interdum vestibulum venenatis, lorem odio laoreet sapien, in pulvinar tellus eros a dolor. Vivamus sapien justo, ullamcorper a mi eget, scelerisque euismod nunc. In augue augue, ultrices a ornare non, tincidunt quis justo. Donec sit amet consectetur eros. Nullam neque leo, tincidunt id ipsum ac, volutpat lobortis mi. Phasellus consequat ultricies arcu, eu semper ligula ultrices eget. Ut in fringilla elit, ac tincidunt nisi.
Nunc commodo elit nec turpis feugiat consectetur. Nullam in nisi egestas, fermentum ligula hendrerit, euismod enim. Nulla eu hendrerit eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin et velit ante. Vestibulum pretium vitae quam et sagittis. Proin eu nunc vel velit accumsan eleifend. Nulla facilisis, diam tempus imperdiet ultrices, massa ipsum consequat orci, sed efficitur eros mi a felis. Cras lobortis turpis sem, sed lobortis nunc ullamcorper tristique. Nam vehicula rhoncus ante, in faucibus sapien scelerisque et. Donec semper libero et tincidunt mattis. In vestibulum, nulla pretium dictum commodo, risus nulla vestibulum felis, at tincidunt massa mi in odio. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
Donec efficitur ultrices purus sit amet imperdiet. Nam consequat metus in erat sodales faucibus. Aliquam maximus fermentum nulla id finibus. Aliquam iaculis sed odio vel rutrum. Curabitur sed odio est. Praesent nec sollicitudin tortor. Praesent pharetra, turpis quis porttitor rhoncus, ante massa fringilla lacus, nec porttitor magna turpis vitae felis. Nullam tristique massa id odio imperdiet, nec sodales massa egestas. Proin nisi metus, euismod sed accumsan vitae, facilisis vel risus. Morbi suscipit auctor erat, nec viverra elit fringilla eu. Mauris congue, purus id tristique facilisis, felis nisi efficitur magna, eu consectetur augue sem vitae lacus. Aliquam erat volutpat. Cras at nibh ultricies, volutpat arcu vitae, dictum est. In ac dolor sagittis, egestas lectus et, semper nisl. Etiam consectetur purus vitae sapien porttitor auctor.
Nulla sit amet venenatis odio. Suspendisse ac lacus quis augue mollis tempus vel in lorem. Donec augue turpis, eleifend nec nibh eu, elementum dictum metus. Proin ut est ligula. Etiam vehicula facilisis metus, sit amet consectetur risus ullamcorper porttitor. In congue nibh quis sollicitudin iaculis. Donec a mollis lorem, non mollis lacus. Nulla et leo ex. Aliquam erat volutpat. Nam sit amet tincidunt mauris. Vivamus vitae est sit amet nisi semper egestas. Donec in diam pharetra, commodo diam vitae, imperdiet ligula. Cras iaculis ac diam eget vehicula. Proin suscipit ante enim, quis vehicula mi porta bibendum. Aliquam a diam porttitor, sollicitudin justo vitae, tempor odio.
Cras fermentum dignissim pretium. Donec quis turpis eu neque lacinia facilisis in sit amet nibh. Nulla non tortor ultricies, euismod est in, blandit nibh. Ut a neque metus. Sed convallis condimentum nibh quis finibus. Praesent aliquam sem iaculis eros maximus accumsan. Nulla venenatis mauris id aliquet maximus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin at enim vitae ex porttitor vestibulum sed eget nibh. Suspendisse accumsan feugiat quam eget ultricies.

View File

@ -144,14 +144,14 @@ newsletter:
# -----------------------------------------------------------------------------
collections:
books:
output: true
news:
defaults:
layout: post
output: true
permalink: /:collection/:title/
projects:
output: true
permalink: /:collection/:title/
# -----------------------------------------------------------------------------
# Jekyll settings
@ -198,7 +198,7 @@ keep_files:
# Plug-ins
plugins:
- jekyll-archives
- jekyll-archives-v2
- jekyll-email-protect
- jekyll-feed
- jekyll-get-json
@ -247,15 +247,14 @@ terser:
# -----------------------------------------------------------------------------
jekyll-archives:
enabled: [year, tags, categories] # enables year, tag and category archives (remove if you need to disable one of them).
layouts:
year: archive-year
tag: archive-tag
category: archive-category
permalinks:
year: "/blog/:year/"
tag: "/blog/tag/:name/"
category: "/blog/category/:name/"
posts:
enabled: [year, tags, categories] # enables year, tag and category archives (remove if you need to disable one of them).
permalinks:
year: "/blog/:year/"
tags: "/blog/:type/:name/"
categories: "/blog/:type/:name/"
books:
enabled: [year, tags, categories] # enables year, tag and category archives (remove if you need to disable one of them).
display_tags: ["formatting", "images", "links", "math", "code", "blockquotes"] # these tags will be displayed on the front page of your blog
display_categories: ["external-services"] # these categories will be displayed on the front page of your blog

View File

@ -1,30 +0,0 @@
---
layout: default
---
<div class="post">
<header class="post-header">
<h1 class="post-title"><i class="fa-solid fa-tag fa-sm"></i> {{ page.title }}</h1>
<p class="post-description">an archive of posts in this category</p>
</header>
<article class="archive">
<div class="table-responsive">
<table class="table table-sm table-borderless">
{% for post in page.posts %}
<tr>
<th scope="row">{{ post.date | date: '%b %d, %Y' }}</th>
<td>
{% if post.redirect == blank %}
<a class="post-link" href="{{ post.url | relative_url }}">{{ post.title }}</a>
{% elsif post.redirect contains '://' %}
<a class="post-link" href="{{ post.redirect }}" target="_blank">{{ post.title }}</a>
{% else %}
<a class="post-link" href="{{ post.redirect | relative_url }}">{{ post.title }}</a>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
</div>
</article>
</div>

View File

@ -1,30 +0,0 @@
---
layout: default
---
<div class="post">
<header class="post-header">
<h1 class="post-title"><i class="fa-solid fa-hashtag fa-sm"></i> {{ page.title }}</h1>
<p class="post-description">an archive of posts with this tag</p>
</header>
<article class="archive">
<div class="table-responsive">
<table class="table table-sm table-borderless">
{% for post in page.posts %}
<tr>
<th scope="row">{{ post.date | date: '%b %d, %Y' }}</th>
<td>
{% if post.redirect == blank %}
<a class="post-link" href="{{ post.url | relative_url }}">{{ post.title }}</a>
{% elsif post.redirect contains '://' %}
<a class="post-link" href="{{ post.redirect }}" target="_blank">{{ post.title }}</a>
{% else %}
<a class="post-link" href="{{ post.redirect | relative_url }}">{{ post.title }}</a>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
</div>
</article>
</div>

View File

@ -1,30 +0,0 @@
---
layout: default
---
<div class="post">
<header class="post-header">
<h1 class="post-title"><i class="fa-solid fa-calendar fa-sm"></i> {{ page.date | date: '%Y' }}</h1>
<p class="post-description">an archive of posts from this year</p>
</header>
<article class="archive">
<div class="table-responsive">
<table class="table table-sm table-borderless">
{% for post in page.posts %}
<tr>
<th scope="row">{{ post.date | date: '%b %d, %Y' }}</th>
<td>
{% if post.redirect == blank %}
<a class="post-link" href="{{ post.url | relative_url }}">{{ post.title }}</a>
{% elsif post.redirect contains '://' %}
<a class="post-link" href="{{ post.redirect }}" target="_blank">{{ post.title }}</a>
{% else %}
<a class="post-link" href="{{ post.redirect | relative_url }}">{{ post.title }}</a>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
</div>
</article>
</div>

38
_layouts/archive.liquid Normal file
View File

@ -0,0 +1,38 @@
---
layout: default
---
<div class="post">
<header class="post-header">
{% if page.type == 'categories' %}
<h1 class="post-title"><i class="fa-solid fa-tag fa-sm"></i> {{ page.title }}</h1>
<p class="post-description">an archive of {{ page.collection_name }} in this category</p>
{% elsif page.type == 'year' %}
<h1 class="post-title"><i class="fa-solid fa-calendar fa-sm"></i> {{ page.date | date: '%Y' }}</h1>
<p class="post-description">an archive of {{ page.collection_name }} from this year</p>
{% elsif page.type == 'tags' %}
<h1 class="post-title"><i class="fa-solid fa-hashtag fa-sm"></i> {{ page.title }}</h1>
<p class="post-description">an archive of {{ page.collection_name }} with this tag</p>
{% endif %}
</header>
<article class="archive">
<div class="table-responsive">
<table class="table table-sm table-borderless">
{% for document in page.documents %}
<tr>
<th scope="row">{{ document.date | date: '%b %d, %Y' }}</th>
<td>
{% if document.redirect == blank %}
<a class="post-link" href="{{ document.url | relative_url }}">{{ document.title }}</a>
{% elsif document.redirect contains '://' %}
<a class="post-link" href="{{ document.redirect }}" target="_blank">{{ document.title }}</a>
{% else %}
<a class="post-link" href="{{ document.redirect | relative_url }}">{{ document.title }}</a>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
</div>
</article>
</div>

257
_layouts/book-review.liquid Normal file
View File

@ -0,0 +1,257 @@
---
layout: default
---
{% assign year = page.started | date: '%Y' %}
{% assign tags = page.tags | join: '' %}
{% assign categories = page.categories | join: '' %}
{% if page._styles %}
<!-- Page/Post style -->
<style type="text/css">
{{ page._styles }}
</style>
{% endif %}
<div class="post">
<header class="post-header">
<h1 class="post-title">{{ page.title }}</h1>
{% if page.author or page.released %}
<p class="post-meta">
{% if page.author %}
{{ page.author }}
{% endif %}
{% if page.author and page.released %} &nbsp;&middot;&nbsp; {% endif %}
{% if page.released %}
{{ page.released }}
{% endif %}
</p>
{% endif %}
{% if page.started or page.finished or page.stars %}
<p class="post-meta">
{% if page.started %}
<i class="fa-solid fa-play fa-sm" style="color: var(--global-tip-block) !important"></i> <em>{{ page.started }}</em>
{% endif %}
{% if page.finished %}
{% if page.started %}
&nbsp;&middot;&nbsp;
{% endif %}
<i class="fa-solid fa-stop fa-sm" style="color: #e56565 !important"></i> <em>{{ page.finished }}</em>
{% endif %}
{% if page.stars %}
{% if page.started or page.finished %}
&nbsp;&middot;&nbsp;
{% endif %}
{% if page.goodreads_review %}
<a target="_blank" href="https://www.goodreads.com/review/show/{{ page.goodreads_review }}"><i class="fa-brands fa-goodreads-g"></i>
{% endif %}
{% assign full_stars = page.stars | floor %}
{% assign half_star = page.stars | minus: full_stars %}
{% assign empty_stars = 5 | minus: full_stars %}
{% if half_star > 0 %}
{% assign empty_stars = empty_stars | minus: 1 %}
{% endif %}
{% for i in (1..full_stars) -%}
<i class="fa-solid fa-star fa-sm"></i>
{%- endfor -%}
{%- if half_star > 0 %}<i class="fa-solid fa-star-half-stroke fa-sm"></i>{% endif -%}
{%- for i in (1..empty_stars) -%}
<i class="fa-regular fa-star fa-sm"></i>
{%- endfor -%}
{% if page.goodreads_review %}
</a>
{% endif %}
{% endif %}
{% if page.buy_link %}
{% if page.started or page.finished or page.stars %}
&nbsp;&middot;&nbsp;
{% endif %}
<a target="_blank" href="{{ page.buy_link }}"
><i class="fa-solid fa-cart-shopping"></i>
{% assign is_amazon_link = page.buy_link | slice: 0, 19 %}
{% if is_amazon_link == 'https://www.amazon.' %}
<i class="fa-brands fa-amazon"></i>
{% endif %}
</a>
{% endif %}
</p>
{% endif %}
<p class="post-tags">
<a href="{{ year | prepend: '/books/' | relative_url }}"> <i class="fa-solid fa-calendar fa-sm"></i> {{ year }}</a>
{% if tags != '' %}
&nbsp;&middot;&nbsp;
{% for tag in page.tags %}
<a href="{{ tag | slugify | prepend: '/books/tag/' | relative_url }}"> <i class="fa-solid fa-hashtag fa-sm"></i> {{ tag }}</a>
{% unless forloop.last %}
&nbsp;
{% endunless %}
{% endfor %}
{% endif %}
{% if categories != '' %}
&nbsp;&middot;&nbsp;
{% for category in page.categories %}
<a href="{{ category | slugify | prepend: '/books/category/' | relative_url }}"> <i class="fa-solid fa-tag fa-sm"></i> {{ category }}</a>
{% unless forloop.last %}
&nbsp;
{% endunless %}
{% endfor %}
{% endif %}
</p>
<hr>
</header>
<article>
{% if content == '' %}
<figure class="empty-review">
{% if page.cover %}
<img class="empty-review-cover" alt="{{ page.title }} cover" src="{{ site.baseurl }}/{{ page.cover }}">
<figcaption class="empty-review-caption">
Cover of <em>{{ page.title }}</em>
</figcaption>
{% elsif page.olid %}
<img class="empty-review-cover" alt="{{ page.title }} cover" src="http://covers.openlibrary.org/b/olid/{{ page.olid }}-L.jpg?default=false">
<figcaption class="empty-review-caption">
Cover of <em>{{ page.title }}</em> on the <a href="https://openlibrary.org/olid/{{ page.olid }}">Open Library</a>.
</figcaption>
{% elsif page.isbn %}
<img class="empty-review-cover" alt="{{ page.title }} cover" src="http://covers.openlibrary.org/b/isbn/{{ page.isbn }}-L.jpg?default=false">
<figcaption class="empty-review-caption">
Cover of <em>{{ page.title }}</em> on the <a href="https://openlibrary.org/isbn/{{ page.isbn }}">Open Library</a>.
</figcaption>
{% endif %}
</figure>
{% assign status = page.status | upcase %}
<div class="clearfix">
<h4>{{ status }}</h4>
</div>
{% else %}
<figure>
{% if page.cover %}
<img alt="{{ page.title }} cover" src="{{ site.baseurl }}/{{ page.cover }}">
<figcaption>
Cover of <em>{{ page.title }}</em>
</figcaption>
{% elsif page.olid %}
<img alt="{{ page.title }} cover" src="http://covers.openlibrary.org/b/olid/{{ page.olid }}-L.jpg?default=false">
<figcaption>
Cover of <em>{{ page.title }}</em> on the <a href="https://openlibrary.org/olid/{{ page.olid }}">Open Library</a>.
</figcaption>
{% elsif page.isbn %}
<img alt="{{ page.title }} cover" src="http://covers.openlibrary.org/b/isbn/{{ page.isbn }}-L.jpg?default=false">
<figcaption>
Cover of <em>{{ page.title }}</em> on the <a href="https://openlibrary.org/isbn/{{ page.isbn }}">Open Library</a>.
</figcaption>
{% endif %}
</figure>
<br class="mobile-break" clear="right">
<h4>
{% if page.start %} Start Date: {{ page.start | date: '%-d %B %Y' }}. {% endif %}
{% if page.end %} End Date: {{ page.end | date: '%-d %B %Y' }}. {% endif %}
</h4>
{{ content }}
{% endif %}
</article>
{% if site.giscus and page.giscus_comments %}
{% include giscus.liquid %}
{% endif %}
</div>
<style>
figure {
float: none;
width: auto;
display: block;
margin-right: auto;
margin-left: auto;
}
figure > img {
vertical-align: top;
display: block;
margin-right: 0px;
margin-left: 0px;
padding: 0px;
}
figure figcaption {
display: block;
caption-side: bottom;
text-align: center;
}
@media screen and (min-width: 600px) {
.empty-review{
float: left;
display: block; /* in-line block; */
margin: 0px 0px 0px 0px; /* adjust as needed */
padding: 0px 0px 0px 20px;
/* top right bottom left */
}
.empty-review-caption {
caption-side: left;
text-align: left;
}
.empty-review-cover {
width:250px;
vertical-align: top;
padding-right: 40px;
}
figure {
float: right;
display: in-line block; /* in-line block; */
margin: 0px 0px 0px 0px; /* adjust as needed */
padding: 0px 0px 0px 20px;
/* top right bottom left */
}
figure img {
width:300px;
vertical-align: top;
}
figure figcaption {
caption-side: bottom;
text-align: left;
}
.mobile-break { display: none; }
/* =Blockquote
-------------------------------------------------------------- */
blockquote {
position: relative;
marign: 0px;
display: table;
}
blockquote:before, blockquote:after {
/* properties to format the block quotes /*
}
blockquote:before {
top: 0;
left: 0;
}
blockquote:after {
top: 0;
right: 0;
}
</style>

View File

@ -0,0 +1,49 @@
---
layout: page
---
{{ content }}
{% if page.collection and page.collection.size > 0 %}
{% assign collection = site[page.collection] %}
{% if collection and collection.size > 0 %}
{% for item in collection reversed %}
{% assign current_year = item.date | date: '%Y' %}
{% if current_year != year %}
{% unless forloop.first %}
</ul>
{% endunless %}
<h1 id="y{{item.date | date: "%Y"}}">
<a href="{{ current_year | prepend: '/books/' | relative_url }}">{{ current_year }}</a>
</h1>
<ul>
{% assign year = current_year %}
{% endif %}
<figure class="cover">
<a class="cover-link" href="{{ item.url | relative_url }}">
{% if item.cover %}
<img alt="{{ item.title }} cover" src="{{ item.cover | prepend: page.covers | relative_url }}" style="height:200px">
{% elsif item.olid %}
<img alt="{{ item.title }} cover" src="http://covers.openlibrary.org/b/olid/{{ item.olid }}-L.jpg?default=false" style="height:200px">
{% elsif item.isbn %}
<img alt="{{ item.title }} cover" src="http://covers.openlibrary.org/b/isbn/{{ item.isbn }}-L.jpg?default=false" style="height:200px">
{% endif %}
{% if item.status %}
{% assign statuses = 'abandoned,finished,interested,paused,queued,reading,reread' | split: ',' %}
{% assign status = item.status | downcase | strip %}
{% if statuses contains status %}
<figcaption class="{{ status | downcase }}">{{ status | upcase }}</figcaption>
{% else %}
<figcaption class="uncategorized">UNCATEGORIZED</figcaption>
{% endif %}
{% else %}
<figcaption class="uncategorized">UNCATEGORIZED</figcaption>
{% endif %}
</a>
</figure>
{% if forloop.last %}
</ul>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}

View File

@ -4,6 +4,7 @@ layout: default
{% assign year = page.date | date: '%Y' %}
{% assign tags = page.tags | join: '' %}
{% assign categories = page.categories | join: '' %}
{% assign url_beginning = page.url | slice: 0, 6 %}
{% if page._styles %}
<!-- Page/Post style -->
@ -12,8 +13,6 @@ layout: default
</style>
{% endif %}
{% assign url_beginning = page.url | slice: 0, 6 %}
<div class="post">
<header class="post-header">
<h1 class="post-title">{{ page.title }}</h1>
@ -25,7 +24,7 @@ layout: default
</p>
<p class="post-tags">
{% if url_beginning == '/blog/' %}
<a href="{{ year | prepend: '/blog/' | prepend: site.baseurl}}"> <i class="fa-solid fa-calendar fa-sm"></i> {{ year }} </a>
<a href="{{ year | prepend: '/blog/' | relative_url }}"> <i class="fa-solid fa-calendar fa-sm"></i> {{ year }} </a>
{% else %}
<i class="fa-solid fa-calendar fa-sm"></i> {{ year }}
{% endif %}
@ -33,7 +32,7 @@ layout: default
&nbsp; &middot; &nbsp;
{% for tag in page.tags %}
{% if url_beginning == '/blog/' %}
<a href="{{ tag | slugify | prepend: '/blog/tag/' | prepend: site.baseurl}}"> <i class="fa-solid fa-hashtag fa-sm"></i> {{ tag }}</a>
<a href="{{ tag | slugify | prepend: '/blog/tag/' | relative_url }}"> <i class="fa-solid fa-hashtag fa-sm"></i> {{ tag }}</a>
{% else %}
<i class="fa-solid fa-hashtag fa-sm"></i> {{ tag }}
{% endif %}
@ -47,9 +46,7 @@ layout: default
&nbsp; &middot; &nbsp;
{% for category in page.categories %}
{% if url_beginning == '/blog/' %}
<a href="{{ category | slugify | prepend: '/blog/category/' | prepend: site.baseurl}}">
<i class="fa-solid fa-tag fa-sm"></i> {{ category -}}
</a>
<a href="{{ category | slugify | prepend: '/blog/category/' | relative_url }}"> <i class="fa-solid fa-tag fa-sm"></i> {{ category -}}</a>
{% else %}
<i class="fa-solid fa-tag fa-sm"></i> {{ category }}
{% endif %}

View File

@ -85,7 +85,7 @@ pagination:
<p class="post-meta">
{{ read_time }} min read &nbsp; &middot; &nbsp;
<a href="{{ year | prepend: '/blog/' | prepend: site.baseurl}}">
<a href="{{ year | prepend: '/blog/' | relative_url }}">
<i class="fa-solid fa-calendar fa-sm"></i> {{ year }} </a>
</p>
</div>
@ -148,13 +148,13 @@ pagination:
{% endif %}
</p>
<p class="post-tags">
<a href="{{ year | prepend: '/blog/' | prepend: site.baseurl}}">
<a href="{{ year | prepend: '/blog/' | relative_url }}">
<i class="fa-solid fa-calendar fa-sm"></i> {{ year }} </a>
{% if tags != "" %}
&nbsp; &middot; &nbsp;
{% for tag in post.tags %}
<a href="{{ tag | slugify | prepend: '/blog/tag/' | prepend: site.baseurl}}">
<a href="{{ tag | slugify | prepend: '/blog/tag/' | relative_url }}">
<i class="fa-solid fa-hashtag fa-sm"></i> {{ tag }}</a>
{% unless forloop.last %}
&nbsp;
@ -165,7 +165,7 @@ pagination:
{% if categories != "" %}
&nbsp; &middot; &nbsp;
{% for category in post.categories %}
<a href="{{ category | slugify | prepend: '/blog/category/' | prepend: site.baseurl}}">
<a href="{{ category | slugify | prepend: '/blog/category/' | relative_url }}">
<i class="fa-solid fa-tag fa-sm"></i> {{ category }}</a>
{% unless forloop.last %}
&nbsp;

13
_pages/books.md Normal file
View File

@ -0,0 +1,13 @@
---
layout: book-shelf
title: bookshelf
permalink: /books/
nav: false
collection: books
---
> What an astonishing thing a book is. It's a flat object made from a tree with flexible parts on which are imprinted lots of funny dark squiggles. But one glance at it and you're inside the mind of another person, maybe somebody dead for thousands of years. Across the millennia, an author is speaking clearly and silently inside your head, directly to you. Writing is perhaps the greatest of human inventions, binding together people who never knew each other, citizens of distant epochs. Books break the shackles of time. A book is proof that humans are capable of working magic.
>
> -- Carl Sagan, Cosmos, Part 11: The Persistence of Memory (1980)
## Books that I am reading, have read, or will read

View File

@ -5,11 +5,8 @@ nav: true
nav_order: 8
dropdown: true
children:
- title: publications
permalink: /publications/
- title: divider
- title: projects
permalink: /projects/
- title: bookshelf
permalink: /books/
- title: divider
- title: blog
permalink: /blog/

View File

@ -1343,3 +1343,77 @@ ninja-keys::part(ninja-input-wrapper) {
background-color: var(--global-theme-color);
color: var(--global-text-color);
}
figure.cover {
display: inline-block;
text-align: center;
margin: 0.5rem; /* adjust as needed */
img {
vertical-align: bottom;
}
figcaption.abandoned {
font-family: monospace;
color: #23212d;
text-transform: uppercase;
background-color: #ee5f5b;
}
figcaption.finished,
figcaption.watched {
font-family: monospace;
color: #23212d;
text-transform: uppercase;
background-color: #62c462;
}
figcaption.interested {
font-family: monospace;
color: #23212d;
text-transform: uppercase;
background-color: #7691db;
}
figcaption.paused {
font-family: monospace;
color: #23212d;
text-transform: uppercase;
background-color: #bdac7e;
}
figcaption.queued {
font-family: monospace;
color: #23212d;
text-transform: uppercase;
background-color: #9e76b5;
}
figcaption.reading,
figcaption.watching {
font-family: monospace;
color: #23212d;
text-transform: uppercase;
background-color: #f89406;
}
figcaption.reread,
figcaption.rewatch {
font-family: monospace;
color: #23212d;
text-transform: uppercase;
background-color: #a6517d;
}
figcaption.uncategorized {
font-family: monospace;
color: #23212d;
text-transform: uppercase;
background-color: #b0abb3;
}
/* mouse over link */
a.cover-link:hover {
color: #23212d !important;
}
}

View File

@ -25,7 +25,7 @@ ninja.data = [
{%- unless child.title == 'divider' -%}
{
{%- assign title = child.title | escape | strip -%}
{%- if child.permalink contains "/blog/" -%}{%- assign url = "/blog/" -%} {%- else -%}{%- assign url = child.url -%}{%- endif -%}
{%- if child.permalink contains "/blog/" -%}{%- assign url = "/blog/" -%} {%- else -%}{%- assign url = child.permalink -%}{%- endif -%}
id: "dropdown-{{ title | slugify }}",
title: "{{ title | truncatewords: 13 }}",
description: "{{ child.description | strip_html | strip_newlines | escape | strip }}",

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@ -1,7 +1,7 @@
# this file uses prebuilt image in dockerhub
services:
jekyll:
image: amirpourmand/al-folio:v0.13.4
image: amirpourmand/al-folio:v0.14.0
build: .
# uncomment these if you are having this issue with the build:
# /usr/local/bundle/gems/jekyll-4.3.4/lib/jekyll/site.rb:509:in `initialize': Permission denied @ rb_sysopen - /srv/jekyll/.jekyll-cache/.gitignore (Errno::EACCES)