1
0
mirror of https://github.com/cotes2020/jekyll-theme-chirpy.git synced 2025-12-19 14:14:17 +00:00

Compare commits

...

36 Commits

Author SHA1 Message Date
Cotes Chung
ec522e5219 Bump version to 3.0.1 2021-01-26 22:28:35 +08:00
Cotes Chung
4ee8f20df2 Meaningless commit
RubyGems doesn't allow re-pushing the yanked version (3.0.0), so we have to bump a new patch version
2021-01-26 22:26:32 +08:00
Cotes Chung
7d7c0da31b Bump version to 3.0.0 2021-01-26 21:40:46 +08:00
Cotes Chung
4343f1a8f8 Update the usage instructions 2021-01-26 20:31:26 +08:00
Cotes Chung
b85980e1e2 Optimize the embedded list style 2021-01-26 20:24:47 +08:00
Cotes Chung
893db51ff0 Improve the copyrights of the assets 2021-01-26 20:24:47 +08:00
Cotes Chung
cbb3bd4be5 Set default values for site variables
good for gem-based first run
2021-01-26 20:24:47 +08:00
Cotes Chung
7ed3bef1b1 Add gem-based settings 2021-01-26 20:24:47 +08:00
Cotes Chung
da9f7b8218 Process JS files with gulp 2021-01-25 06:43:02 +08:00
Cotes Chung
0e9104a58f Fix a typo on css 2021-01-25 02:44:35 +08:00
Cotes Chung
b7266aceac Contact theme styles 2021-01-25 02:44:35 +08:00
Cotes Chung
28f36bee23 Make code block 100% screen width on mobile 2021-01-23 13:19:51 +08:00
Cotes Chung
994b3e32d3 Optimize image width of list on mobile screens 2021-01-23 13:18:02 +08:00
Cotes Chung
75e9feb687 Optimize url filters 2021-01-19 00:01:01 +08:00
Cotes Chung
ab0e3f6ee4 Fix PV display when baseurl exists 2021-01-19 00:01:01 +08:00
Cotes Chung
0194bbced9 Fix baseUrl on rss-feed (#259) 2021-01-18 22:17:03 +08:00
dependabot-preview[bot]
e92cc239c1 Bump html-proofer from 3.18.3 to 3.18.5 (#257)
Bumps [html-proofer](https://github.com/gjtorikian/html-proofer) from 3.18.3 to 3.18.5.
- [Release notes](https://github.com/gjtorikian/html-proofer/releases)
- [Commits](https://github.com/gjtorikian/html-proofer/compare/v3.18.3...v3.18.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2021-01-17 22:29:34 +08:00
Cotes Chung
da976ce088 Allow the PRs from dependabot 2021-01-17 22:23:34 +08:00
Cotes Chung
6490b0fcbd Fix avatar url when site.baseurl exists (#253) 2021-01-17 21:47:11 +08:00
Ryan TG
ef1d05d342 Fix typo in dark typography SCSS (#249) 2021-01-15 02:29:28 +08:00
Cotes Chung
e8170f8379 Prevent the URLs of code block from being clickable 2021-01-10 18:48:36 +08:00
Cotes Chung
93fcf50131 Add image CDN tutorial 2021-01-09 23:05:55 +08:00
Cotes Chung
66a132c462 Remove the image files 2021-01-09 23:05:55 +08:00
Cotes Chung
6e6633c2fc Add image CDN support & improve image lazy loading 2021-01-09 23:05:55 +08:00
Cotes Chung
594eaf5100 Fix nokogiri vulnerability
Upgrade nokogiri to 1.11.0.rc4  or later
2021-01-06 01:46:45 +08:00
Dinesh Prasanth M K
940db20c5c Add instructions to setup Page Views
This patch adds a new blog post to setup Page Views
using Google analytics superProxy.

Signed-off-by: Dinesh Prasanth M K <mkdineshprasanth@gmail.com>
2021-01-06 00:05:15 +08:00
Cotes Chung
493e1d934b Bump version to 2.7.2 2020-12-31 22:54:58 +08:00
Cotes Chung
b9104d0f4c Upgrade dependencies in Gemfile.lock 2020-12-31 22:38:30 +08:00
Cotes Chung
3c72298563 Improve the smooth scrolling
- Add smooth scrolling to the footnotes
- Add hash to URL
2020-12-31 21:37:17 +08:00
Henk van Achterberg
ca2194770c Update pages-deploy.yml.hook (#229)
This change will make the baseurl configuration/testing work. Previous version failed. Posts should have /index.html as suffix in my experience.
2020-12-30 22:22:42 +08:00
Cotes Chung
08fbd06c63 Optimize the DOM of post link on homepage 2020-12-29 15:39:29 +08:00
Dinesh Prasanth M K
a20fd5bf6f Fix the dir name for hosting posts 2020-12-29 06:06:36 +08:00
Cotes Chung
7a88347c63 Remove inline code extra content 2020-12-28 19:38:24 +08:00
Cotes Chung
813443b206 Improve GitHub stuff
- Add more events to the issue interceptor
- Reduce issue label
2020-12-28 02:33:06 +08:00
Cotes Chung
c381353f86 Use liquid to determine whether to render ToC 2020-12-28 02:30:32 +08:00
Cotes Chung
aa6c33526a Fix the compatibility of the smooth scrolling in Safari
Safari(at least on v14) does not support CSS property `scroll-behavior`
2020-12-28 02:28:57 +08:00
128 changed files with 1373 additions and 1056 deletions

View File

@@ -1,7 +1,6 @@
--- ---
name: Bug Report name: Bug Report
about: Create a report to help us improve about: Create a report to help us improve
labels: suspect
--- ---
<!-- NOTE: Please maintain all sections, otherwise the issue will be automatically closed :) --> <!-- NOTE: Please maintain all sections, otherwise the issue will be automatically closed :) -->

View File

@@ -2,9 +2,9 @@ name: "Intercept bad issue/PRs"
on: on:
issues: issues:
types: [opened] types: [opened, reopened]
pull_request: pull_request:
types: [opened] types: [opened, reopened]
jobs: jobs:
autoclose: autoclose:
@@ -16,5 +16,5 @@ jobs:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
issue-pattern: "\\[x\\] I have read" issue-pattern: "\\[x\\] I have read"
issue-close-message: ":wave: Hi @${issue.user.login},\n\nThis issue is being automatically closed because it does not follow the issue template." issue-close-message: ":wave: Hi @${issue.user.login},\n\nThis issue is being automatically closed because it does not follow the issue template."
pr-pattern: "\\[x\\] Bug|\\[x\\] New feat|\\[x\\] Break|\\[x\\] Doc" pr-pattern: "\\[x\\] Bug|\\[x\\] New feat|\\[x\\] Break|\\[x\\] Doc|@dependabot"
pr-close-message: ":wave: Hi @${pull_request.user.login},\n\nThis PR is being automatically closed because it does not follow the PR template." pr-close-message: ":wave: Hi @${pull_request.user.login},\n\nThis PR is being automatically closed because it does not follow the PR template."

View File

@@ -44,28 +44,25 @@ jobs:
run: | run: |
baseurl="$(grep '^baseurl:' _config.yml | sed "s/.*: *//;s/['\"]//g;s/#.*//")" baseurl="$(grep '^baseurl:' _config.yml | sed "s/.*: *//;s/['\"]//g;s/#.*//")"
if [[ -n $baseurl ]]; then if [[ -n $baseurl ]]; then
echo "SPEC_TEST=_site_no_baseurl" >> $GITHUB_ENV echo "BASE_URL=$baseurl" >> $GITHUB_ENV
fi fi
- name: Build Site - name: Build Site
env: env:
JEKYLL_ENV: production JEKYLL_ENV: production
run: | run: |
bundle exec jekyll b bundle exec jekyll b -d "_site$BASE_URL"
if [[ -n $SPEC_TEST ]]; then
# Bypass the defects of htmlproofer
bundle exec jekyll b -b "" -d "$SPEC_TEST"
fi
- name: Test Site - name: Test Site
run: | run: |
if [[ -n $SPEC_TEST ]]; then
bash tools/test.sh -d "$SPEC_TEST"
else
bash tools/test.sh bash tools/test.sh
fi
- name: Deploy - name: Deploy
run: | run: |
if [[ -n $BASE_URL ]]; then
mv _site$BASE_URL _site-rename
rm -rf _site
mv _site-rename _site
fi
bash tools/deploy.sh bash tools/deploy.sh

9
.gitignore vendored
View File

@@ -5,3 +5,12 @@
# jekyll cache # jekyll cache
_site _site
vendor vendor
# rubygem
*.gem
# yard docs
doc
# npm dependencies
node_modules
package-lock.json

View File

@@ -1,14 +1,9 @@
--- ---
# The 404 page
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT License
layout: page layout: page
title: "404: Page not found" title: "404: Page not found"
permalink: /404.html permalink: /404.html
redirect_from: # part of site.sitemap_exclude redirect_from:
- /norobots/ - /norobots/
- /assets/ - /assets/
- /tabs/ - /tabs/

14
Gemfile
View File

@@ -1,18 +1,18 @@
source "https://rubygems.org" source "https://rubygems.org"
gem "jekyll", ">= 4.1.0", "< 5.0" gem "jekyll", "~> 4.1"
# plugins # plugins
group :jekyll_plugins do group :jekyll_plugins do
gem "jekyll-paginate" gem "jekyll-paginate", "~> 1.1"
gem "jekyll-redirect-from" gem "jekyll-redirect-from", "~> 0.16"
gem "jekyll-seo-tag" gem "jekyll-seo-tag", "~> 2.7"
gem "jekyll-archives" gem "jekyll-archives", "~> 2.2"
gem "jekyll-sitemap" gem "jekyll-sitemap", "~> 1.4"
end end
group :test do group :test do
gem "html-proofer" gem "html-proofer", "~> 3.18"
end end
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem # Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem

View File

@@ -11,9 +11,9 @@ GEM
ethon (0.12.0) ethon (0.12.0)
ffi (>= 1.3.0) ffi (>= 1.3.0)
eventmachine (1.2.7) eventmachine (1.2.7)
ffi (1.13.1) ffi (1.14.2)
forwardable-extended (2.6.0) forwardable-extended (2.6.0)
html-proofer (3.17.4) html-proofer (3.18.5)
addressable (~> 2.3) addressable (~> 2.3)
mercenary (~> 0.3) mercenary (~> 0.3)
nokogumbo (~> 2.0) nokogumbo (~> 2.0)
@@ -24,21 +24,21 @@ GEM
http_parser.rb (0.6.0) http_parser.rb (0.6.0)
i18n (1.8.5) i18n (1.8.5)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
jekyll (4.1.1) jekyll (4.2.0)
addressable (~> 2.4) addressable (~> 2.4)
colorator (~> 1.0) colorator (~> 1.0)
em-websocket (~> 0.5) em-websocket (~> 0.5)
i18n (~> 1.0) i18n (~> 1.0)
jekyll-sass-converter (~> 2.0) jekyll-sass-converter (~> 2.0)
jekyll-watch (~> 2.0) jekyll-watch (~> 2.0)
kramdown (~> 2.1) kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.0) kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0) liquid (~> 4.0)
mercenary (~> 0.4.0) mercenary (~> 0.4.0)
pathutil (~> 0.9) pathutil (~> 0.9)
rouge (~> 3.0) rouge (~> 3.0)
safe_yaml (~> 1.0) safe_yaml (~> 1.0)
terminal-table (~> 1.8) terminal-table (~> 2.0)
jekyll-archives (2.2.1) jekyll-archives (2.2.1)
jekyll (>= 3.6, < 5.0) jekyll (>= 3.6, < 5.0)
jekyll-paginate (1.1.0) jekyll-paginate (1.1.0)
@@ -61,32 +61,34 @@ GEM
rb-fsevent (~> 0.10, >= 0.10.3) rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10) rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0) mercenary (0.4.0)
mini_portile2 (2.4.0) mini_portile2 (2.5.0)
nokogiri (1.10.10) nokogiri (1.11.1)
mini_portile2 (~> 2.4.0) mini_portile2 (~> 2.5.0)
racc (~> 1.4)
nokogumbo (2.0.4) nokogumbo (2.0.4)
nokogiri (~> 1.8, >= 1.8.4) nokogiri (~> 1.8, >= 1.8.4)
parallel (1.20.1) parallel (1.20.1)
pathutil (0.16.2) pathutil (0.16.2)
forwardable-extended (~> 2.6) forwardable-extended (~> 2.6)
public_suffix (4.0.6) public_suffix (4.0.6)
racc (1.5.2)
rainbow (3.0.0) rainbow (3.0.0)
rb-fsevent (0.10.4) rb-fsevent (0.10.4)
rb-inotify (0.10.1) rb-inotify (0.10.1)
ffi (~> 1.0) ffi (~> 1.0)
rexml (3.2.4) rexml (3.2.4)
rouge (3.25.0) rouge (3.26.0)
safe_yaml (1.0.5) safe_yaml (1.0.5)
sassc (2.4.0) sassc (2.4.0)
ffi (~> 1.9) ffi (~> 1.9)
terminal-table (1.8.0) terminal-table (2.0.0)
unicode-display_width (~> 1.1, >= 1.1.1) unicode-display_width (~> 1.1, >= 1.1.1)
thread_safe (0.3.6) thread_safe (0.3.6)
typhoeus (1.4.0) typhoeus (1.4.0)
ethon (>= 0.9.0) ethon (>= 0.9.0)
tzinfo (1.2.8) tzinfo (1.2.9)
thread_safe (~> 0.1) thread_safe (~> 0.1)
tzinfo-data (1.2020.4) tzinfo-data (1.2020.6)
tzinfo (>= 1.0.0) tzinfo (>= 1.0.0)
unicode-display_width (1.7.0) unicode-display_width (1.7.0)
wdm (0.1.1) wdm (0.1.1)
@@ -96,16 +98,16 @@ PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
html-proofer html-proofer (~> 3.18)
jekyll (>= 4.1.0, < 5.0) jekyll (~> 4.1)
jekyll-archives jekyll-archives (~> 2.2)
jekyll-paginate jekyll-paginate (~> 1.1)
jekyll-redirect-from jekyll-redirect-from (~> 0.16)
jekyll-seo-tag jekyll-seo-tag (~> 2.7)
jekyll-sitemap jekyll-sitemap (~> 1.4)
tzinfo (~> 1.2) tzinfo (~> 1.2)
tzinfo-data tzinfo-data
wdm (~> 0.1.1) wdm (~> 0.1.1)
BUNDLED WITH BUNDLED WITH
2.1.4 2.2.4

114
README.md
View File

@@ -1,6 +1,6 @@
# Chirpy # Chirpy
Language: English | [简体中文](docs/README.zh-CN.md) Language: English | [简体中文](https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/docs/README.zh-CN.md)
[![Build Status](https://github.com/cotes2020/jekyll-theme-chirpy/workflows/build/badge.svg?branch=master&event=push)](https://github.com/cotes2020/jekyll-theme-chirpy/actions?query=branch%3Amaster+event%3Apush) [![Build Status](https://github.com/cotes2020/jekyll-theme-chirpy/workflows/build/badge.svg?branch=master&event=push)](https://github.com/cotes2020/jekyll-theme-chirpy/actions?query=branch%3Amaster+event%3Apush)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/8220b926db514f13afc3f02b7f884f4b)](https://app.codacy.com/manual/cotes2020/jekyll-theme-chirpy?utm_source=github.com&utm_medium=referral&utm_content=cotes2020/jekyll-theme-chirpy&utm_campaign=Badge_Grade_Dashboard) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/8220b926db514f13afc3f02b7f884f4b)](https://app.codacy.com/manual/cotes2020/jekyll-theme-chirpy?utm_source=github.com&utm_medium=referral&utm_content=cotes2020/jekyll-theme-chirpy&utm_campaign=Badge_Grade_Dashboard)
@@ -9,12 +9,13 @@ Language: English | [简体中文](docs/README.zh-CN.md)
A minimal, sidebar, responsive web design Jekyll theme that focuses on text presentation. Designed to help you record and share your knowledge easily. [Live Demo »](https://chirpy.cotes.info) A minimal, sidebar, responsive web design Jekyll theme that focuses on text presentation. Designed to help you record and share your knowledge easily. [Live Demo »](https://chirpy.cotes.info)
[![Devices Mockup](https://raw.githubusercontent.com/cotes2020/jekyll-theme-chirpy/master/assets/img/sample/devices-mockup.png)](https://chirpy.cotes.info) [![Devices Mockup](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/commons/devices-mockup.png)](https://chirpy.cotes.info)
## Table of Contents ## Table of Contents
- [Features](#features) - [Features](#features)
- [Installation](#installation) - [Installation](#installation)
- [Prerequisites](#prerequisites)
- [Usage](#usage) - [Usage](#usage)
- [Contributing](#contributing) - [Contributing](#contributing)
- [Credits](#credits) - [Credits](#credits)
@@ -39,45 +40,68 @@ A minimal, sidebar, responsive web design Jekyll theme that focuses on text pres
- GA Pageviews reporting (Advanced) - GA Pageviews reporting (Advanced)
- SEO and Performance Optimization - SEO and Performance Optimization
## Prerequisites
Follow the [Jekyll Docs](https://jekyllrb.com/docs/installation/) to complete the installation of `Ruby`, `RubyGems`, `Jekyll` and `Bundler`.
## Installation ## Installation
[Fork **Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/fork) on GitHub, rename the repository to `USERNAME.github.io` (where `USERNAME` is your GitHub username), and then open terminal and clone the fork to local by: There are two ways to get the theme:
```terminal - Install from [RubyGems](https://rubygems.org/gems/jekyll-theme-chirpy)
$ git clone https://github.com/USERNAME/USERNAME.github.io.git -b master --single-branch - Fork from GitHub
### Install From Rubygems
Add this line to your Jekyll site's `Gemfile`:
```ruby
gem "jekyll-theme-chirpy"
``` ```
### Setting up the local envrionment And add this line to your Jekyll site's `_config.yml`:
If you would like to run or build the project on your local machine, please follow the [Jekyll Docs](https://jekyllrb.com/docs/installation/) to complete the installation of `Ruby`, `RubyGems`, `Jekyll` and `Bundler`. ```yaml
theme: jekyll-theme-chirpy
Before running or building for the first time, please complete the installation of the Jekyll plugins. Go to the root directory of project and run:
```terminal
$ bundle install
``` ```
`bundle` will automatically install all the dependencies specified by `Gemfile`. And then execute:
### Setting up Docker environment (optional)
If you're a loyal fan of [**Docker**](https://www.docker.com/) or just too lazy to install the packages mentioned in [_Setting up the local envrionment_](#setting-up-the-local-envrionment), please make sure you have **Docker Engine** installed and running, and then get Docker image `jekyll/jekyll` from Docker Hub by the following command:
```console ```console
$ docker pull jekyll/jekyll $ bundle
``` ```
## Usage Finally, copy the missing files (refer to the [starter project][starter] for the detailed file directory structure) from the theme's gem to your Jekyll site, and append all the variables of the theme's `_config.yml` to your Jekyll site.
### Initialization > **Hint**: To locate the themes gem, execute:
>
```console
$ bundle info --path jekyll-theme-chirpy
```
Go to the root directory of the project and start initialization: Or you can [use the starter template][use-starter] to create a Jekyll site to save time copying contents from theme's gem.
[starter]: https://github.com/cotes2020/chirpy-starter
[use-starter]: https://github.com/cotes2020/chirpy-starter/generate
### Fork From GitHub
[Fork **Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/fork) from GitHub and clone your fork to local.
Install gem dependencies by:
```console
$ bundle
```
And then execute:
```console ```console
$ bash tools/init.sh $ bash tools/init.sh
``` ```
> **Note**: If you not intend to deploy it on GitHub Pages, append parameter option `--no-gh` at the end of the above command. > **Note**: If you don't plan to deploy your site on GitHub Pages, append parameter option `--no-gh` at the end of the above command.
What it does is: What it does is:
@@ -91,28 +115,26 @@ What it does is:
3. Automatically create a commit to save the changes. 3. Automatically create a commit to save the changes.
## Usage
### Configuration ### Configuration
Generally, go to `_config.yml` and configure the variables as needed. Some of them are typical options: Update the variables of `_config.yml` as needed. Some of them are typical options:
- `url` - `url`
- `avatar` - `avatar`
- `timezone` - `timezone`
- `theme_mode` - `theme_mode`
### Run Locally ### Running Local Server
You may want to preview the site contents before publishing, so just run it by: You may want to preview the site contents before publishing, so just run it by:
```terminal ```console
$ bundle exec jekyll s $ bundle exec jekyll s
``` ```
Then open a browser and visit to <http://localhost:4000>. Or run the site on Docker with the following command:
### Run on Docker
Run the site on Docker with the following command:
```terminal ```terminal
$ docker run -it --rm \ $ docker run -it --rm \
@@ -121,20 +143,32 @@ $ docker run -it --rm \
jekyll serve jekyll serve
``` ```
Open a browser and visit to _<http://localhost:4000>_.
### Deployment ### Deployment
Before the deployment begins, checkout the file `_config.yml` and make sure the `url` is configured correctly. Furthermore, if you prefer the [_project site_](https://help.github.com/en/github/working-with-github-pages/about-github-pages#types-of-github-pages-sites) and don't use a custom domain, or you want to visit your website with a base url on a web server other than **GitHub Pages**, remember to change the `baseurl` to your project name that starting with a slash. For example, `/project`. Before the deployment begins, checkout the file `_config.yml` and make sure the `url` is configured correctly. Furthermore, if you prefer the [**project site**](https://help.github.com/en/github/working-with-github-pages/about-github-pages#types-of-github-pages-sites) and don't use a custom domain, or you want to visit your website with a base url on a web server other than **GitHub Pages**, remember to change the `baseurl` to your project name that starting with a slash, e.g, `/project-name`.
Assuming you have already gone through the [initialization](#initialization), you can now choose ONE of the following methods to deploy your website. Now you can now choose ONE of the following methods to deploy your website.
#### Deploy on GitHub Pages #### Deploy on GitHub Pages
For security reasons, GitHub Pages build runs on `safe` mode, which restricts us from using plugins to generate additional page files. Therefore, we can use **GitHub Actions** to build the site, store the built site files on a new branch, and use that branch as the source of the Pages service. For security reasons, GitHub Pages build runs on `safe` mode, which restricts us from using plugins to generate additional page files. Therefore, we can use **GitHub Actions** to build the site, store the built site files on a new branch, and use that branch as the source of the GH Pages service.
1. Push any commit to `origin/master` to trigger the GitHub Actions workflow. Once the build is complete and successful, a new remote branch named `gh-pages` will appear to store the built site files. Ensure your Jekyll site has the file `/.github/workflows/pages-deploy.yml`.
Otherwise, create a new one and fill in the contents of the [workflow file][workflow], and the value of the `on.push.branches` should be the same as your repo's default branch name.
[workflow]:https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/.github/workflows/pages-deploy.yml.hook
Rename your repoistory to `<GH-USERNAME>.github.io` on GitHub.
And then publish your site by:
1. Push any commit to remote to trigger the GitHub Actions workflow. Once the build is complete and successful, a new remote branch named `gh-pages` will appear to store the built site files.
2. Browse to your repo's landing page on GitHub and select the branch `gh-pages` as the [publishing source](https://docs.github.com/en/github/working-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site) throught _Settings__Options__GitHub Pages_: 2. Browse to your repo's landing page on GitHub and select the branch `gh-pages` as the [publishing source](https://docs.github.com/en/github/working-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site) throught _Settings__Options__GitHub Pages_:
![gh-pages-sources](https://raw.githubusercontent.com/cotes2020/jekyll-theme-chirpy/master/assets/img/sample/gh-pages-sources.png)
![gh-pages-sources](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20190809/gh-pages-sources.png)
3. Visit your website at the address indicated by GitHub. 3. Visit your website at the address indicated by GitHub.
@@ -148,7 +182,7 @@ Go to the root of the source project, build your site by:
$ JEKYLL_ENV=production bundle exec jekyll b $ JEKYLL_ENV=production bundle exec jekyll b
``` ```
Or, build the site with Docker by: Or build the site with Docker by:
```terminal ```terminal
$ docker run -it --rm \ $ docker run -it --rm \
@@ -160,7 +194,7 @@ $ docker run -it --rm \
Unless you specified the output path, the generated site files will be placed in folder `_site` of the project's root directory. Now you should upload those files to your web server. Unless you specified the output path, the generated site files will be placed in folder `_site` of the project's root directory. Now you should upload those files to your web server.
### Documentation ## Documentation
For more details and the better reading experience, please check out the [tutorials on demo site](https://chirpy.cotes.info/categories/tutorial/). In the meanwhile, a copy of the tutorial is also available on the [Wiki](https://github.com/cotes2020/jekyll-theme-chirpy/wiki). For more details and the better reading experience, please check out the [tutorials on demo site](https://chirpy.cotes.info/categories/tutorial/). In the meanwhile, a copy of the tutorial is also available on the [Wiki](https://github.com/cotes2020/jekyll-theme-chirpy/wiki).
@@ -174,6 +208,12 @@ This theme is mainly built with [Jekyll](https://jekyllrb.com/) ecosystem, [Boot
:tada: Thanks to all the volunteers who contributed to this project, their GitHub IDs are on [this list](https://github.com/cotes2020/jekyll-theme-chirpy/graphs/contributors). Also, I won't forget those guys who submitted the issues or unmerged PR because they reported bugs, shared ideas or inspired me to write more readable documentation. :tada: Thanks to all the volunteers who contributed to this project, their GitHub IDs are on [this list](https://github.com/cotes2020/jekyll-theme-chirpy/graphs/contributors). Also, I won't forget those guys who submitted the issues or unmerged PR because they reported bugs, shared ideas or inspired me to write more readable documentation.
Also, thank [JetBrains][JB] for providing the open source license.
[![JB-logo](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/commons/jetbrains.svg)][JB]
[JB]:https://www.jetbrains.com/?from=jekyll-theme-chirpy
## Supporting ## Supporting
If you enjoy this theme or find it helpful, please consider becoming my sponsor, I'd really appreciate it! Click the button <kbd>:heart: Sponsor</kbd> at the top of the [Home Page](https://github.com/cotes2020/jekyll-theme-chirpy) and choose a link that suits you to donate; this will encourage and help me better maintain the project. If you enjoy this theme or find it helpful, please consider becoming my sponsor, I'd really appreciate it! Click the button <kbd>:heart: Sponsor</kbd> at the top of the [Home Page](https://github.com/cotes2020/jekyll-theme-chirpy) and choose a link that suits you to donate; this will encourage and help me better maintain the project.

View File

@@ -1,28 +1,21 @@
# The Site Settings # The Site Configuration
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT licensed
# jekyll-seo-tag settings https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md # jekyll-seo-tag settings https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md
# -------------------------- # --------------------------
title: Chirpy # the main title title: Chirpy # the main title
tagline: A text-focused Jekyll theme. # it will display as the sub-title tagline: A text-focused Jekyll theme # it will display as the sub-title
description: >- # used by seo meta and the atom feed description: >- # used by seo meta and the atom feed
A minimal, portfolio, sidebar, A minimal, portfolio, sidebar,
bootstrap Jekyll theme with responsive web design bootstrap Jekyll theme with responsive web design
and focuses on text presentation. and focuses on text presentation.
# fill in the base hostname & protocol for your site, e.g., 'https://username.github.io' # fill in the protocol & hostname for your site, e.g., 'https://username.github.io'
url: '' url: ''
author: your_full_name # change to your full name author: your_full_name # change to your full name
avatar: /assets/img/sample/avatar.jpg # support internet resources
github: github:
username: github_username # change to your github username username: github_username # change to your github username
@@ -79,7 +72,17 @@ disqus:
# #
# dark - Use the dark color scheme # dark - Use the dark color scheme
# #
theme_mode: # <light|dark> theme_mode: # [light|dark]
# The CDN endpoint for images.
# Notice that once it is assigned, the CDN url
# will be added to all image (site avatar & posts' images) paths starting with '/'
#
# e.g. 'https://cdn.com'
img_cdn: ''
# the avatar on sidebar, support local or CORS resources
avatar: https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/commons/avatar.jpg
# boolean type, the global switch for ToC in posts. # boolean type, the global switch for ToC in posts.
toc: true toc: true
@@ -167,7 +170,6 @@ defaults:
url: / url: /
sass: sass:
sass_dir: /assets/css
style: compressed style: compressed
compress_html: compress_html:
@@ -187,6 +189,10 @@ exclude:
- docs - docs
- README.md - README.md
- LICENSE - LICENSE
- gulpfile.js
- node_modules
- package.json
- package-lock.json
jekyll-archives: jekyll-archives:
enabled: [categories, tags] enabled: [categories, tags]

View File

@@ -1,8 +1,4 @@
# The contact options. # The contact options.
# v2.3
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT Licensed
- -
type: github type: github

View File

@@ -1,11 +1,7 @@
# The date format # The date format
# v2.1
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT Licensed
tooltip: "%a, %b %e, %Y, %l:%M %p %z" tooltip: "%a, %b %e, %Y, %l:%M %p %z"
post: post:
long: "%b %e, %Y" long: "%b %e, %Y"
short: "%b %e" short: "%b %e"

View File

@@ -1,8 +1,4 @@
# The label text of site. # The label text of site.
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT Licensed
panel: panel:
lastmod: Recent Update lastmod: Recent Update
@@ -11,6 +7,7 @@ panel:
post: post:
relate_posts: Further Reading relate_posts: Further Reading
share: Share
button: button:
next: Newer next: Newer
previous: Older previous: Older
@@ -18,3 +15,5 @@ post:
search_hint: Search # text show on search bar search_hint: Search # text show on search bar
pin_prompt: Pinned # pinned prompt pin_prompt: Pinned # pinned prompt
read_time_unit: min # see posts' time to read

View File

@@ -1,3 +0,0 @@
name: Chirpy
version: 2.7.1
homepage: https://github.com/cotes2020/jekyll-theme-chirpy/

View File

@@ -1,7 +0,0 @@
# words per minute
wpm: 180
# minimum value
min_time: 1
prompt: min

View File

@@ -1,10 +1,4 @@
# License data. # License data
#
# v2.1
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT Licensed
license: license:
name: CC BY 4.0 name: CC BY 4.0

View File

@@ -1,12 +1,5 @@
# Sharing options at the bottom of the post. # Sharing options at the bottom of the post.
# Icons from <https://fontawesome.com/> # Icons from <https://fontawesome.com/>
#
# v2.1
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT Licensed
label: "Share"
platforms: platforms:
- -

View File

@@ -1,26 +1,10 @@
<!-- <!--
CSS selector for site. CSS selector for site.
Chirpy v2.3
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT Licensed
--> -->
<link rel="stylesheet" href="{{ '/assets/css/style.css' | relative_url }}">
{% if page.layout == 'category' or page.layout == 'tag' %}
{% assign style = 'category-tag' %}
{% else %}
{% assign style = page.layout %}
{% endif %}
{% assign src = style | prepend: '/assets/css/' | append: '.css' | relative_url %}
<link rel="preload" href="{{ src }}" as="style">
<link rel="stylesheet" href="{{ src }}">
{% if page.layout == 'post' %}
{% if site.toc and page.toc %} {% if site.toc and page.toc %}
<link rel="preload" as="style" href="{{ '/assets/css/lib/bootstrap-toc.min.css' | relative_url }}"> <link rel="stylesheet"
<link rel="stylesheet" href="{{ '/assets/css/lib/bootstrap-toc.min.css' | relative_url }}" /> href="https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@1.0.1/dist/bootstrap-toc.min.css">
{% endif %}
{% endif %} {% endif %}

View File

@@ -1,25 +1,22 @@
<!-- <!--
The Disqus lazy loading. The Disqus lazy loading.
Powered by: https://osvaldas.info/lazy-loading-disqus-comments Powered by: <https://github.com/osvaldasvalutis/disqusLoader.js>
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2019 Cotes Chung
MIT License
--> -->
<div id="disqus" class="pt-2 pb-2"> <div id="disqus" class="pt-2 pb-2">
<p class="font-italic text-center text-muted small"> <p class="text-center text-muted pb-5">
Comments powered by <a href="https://disqus.com/">Disqus</a>. Loading comments from <a href="https://disqus.com/">Disqus</a> ...
</p> </p>
</div> </div>
<script src="{{ site.baseurl }}/assets/js/lib/jquery.disqusloader.min.js"></script> <script src="{{ '/assets/js/lib/jquery.disqusloader.min.js' | relative_url }}"></script>
<script> <script>
var options = { const options = {
scriptUrl: '//{{ site.disqus.shortname }}.disqus.com/embed.js', scriptUrl: '//{{ site.disqus.shortname }}.disqus.com/embed.js',
disqusConfig: function() { disqusConfig: function() {
this.page.url = '{{ site.url | append: site.baseurl | append: page.url }}'; this.page.title = '{{ page.title }}';
this.page.url = '{{ page.url | absolute_url }}';
this.page.identifier = '{{ page.url }}'; this.page.identifier = '{{ page.url }}';
} }
}; };

View File

@@ -1,10 +1,6 @@
<!-- <!--
The Favicons for Web, Android, Microsoft, and iOS (iPhone and iPad) Apps The Favicons for Web, Android, Microsoft, and iOS (iPhone and iPad) Apps
Generated by: https://www.favicon-generator.org/ Generated by: https://www.favicon-generator.org/
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2019 Cotes Chung
Published under the MIT license
--> -->
{% capture icon_url %}{{ site.baseurl }}/assets/img/favicons{% endcapture %} {% capture icon_url %}{{ site.baseurl }}/assets/img/favicons{% endcapture %}

View File

@@ -1,9 +1,5 @@
<!-- <!--
The Footer The Footer
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2017-2019 Cotes Chung
MIT License
--> -->
<footer class="d-flex w-100 justify-content-center"> <footer class="d-flex w-100 justify-content-center">

View File

@@ -1,9 +1,5 @@
<!-- <!--
The GA snippet The GA snippet
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2017-2019 Cotes Chung
MIT License
--> -->
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script defer src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics.id }}"></script> <script defer src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics.id }}"></script>

View File

@@ -1,15 +1,26 @@
<!-- <!--
The Head The Head
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2017-2019 Cotes Chung
MIT License
--> -->
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme" content="{{ site.data.meta.name }} v{{ site.data.meta.version }}">
{% if page.layout == 'home' or page.layout == 'post' %}
<meta name="pv-cache-enabled" content="{{ site.google_analytics.pv.enabled }}">
{% if site.google_analytics.pv.enabled %}
{% if site.google_analytics.pv.proxy_endpoint != ''
and site.google_analytics.pv.proxy_endpoint %}
<meta name="pv-proxy-endpoint" content="{{ site.google_analytics.pv.proxy_endpoint }}">
{% endif %}
{% if site.google_analytics.pv.cache %}
<meta name="pv-cache-data" content="{{ '/assets/js/data/pageviews.json' | relative_url }}">
{% endif %}
{% endif %}
{% endif %}
{% seo title=false %} {% seo title=false %}

View File

@@ -1,20 +1,25 @@
<!-- <!--
JS selector for site. JS selector for site.
Chirpy v2.3
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT Licensed
--> -->
{% if page.layout == 'home' or page.layout == 'post' or page.layout == 'categories' %} {% if page.layout == 'home' or page.layout == 'post' %}
{% assign js = page.layout %} {% if site.google_analytics.pv.enabled %}
{% else %} <!-- pv-report needs countup.js -->
{% assign js = "page" %} <script async src="https://cdn.jsdelivr.net/npm/countup.js@1.9.3/dist/countUp.min.js"></script>
<script async src="{{ '/assets/js/dist/pvreport.min.js' | relative_url }}"></script>
{% endif %}
{% endif %} {% endif %}
{% assign js_src = js | prepend: '/assets/js/' | append: '.min.js' | relative_url %} {% if page.layout == 'home'
or page.layout == 'post'
or page.layout == 'categories' %}
{% assign type = page.layout %}
{% else %}
{% assign type = "page" %}
{% endif %}
<script async src="{{ js_src }}"></script> {% assign js = type | prepend: '/assets/js/dist/' | append: '.min.js' %}
<script defer src="{{ js | relative_url }}"></script>
{% if page.math %} {% if page.math %}
<!-- MathJax --> <!-- MathJax -->

View File

@@ -1,8 +1,10 @@
<!-- image lazy load: https://github.com/ApoorvSaxena/lozad.js --> <!--
image lazy load: https://github.com/ApoorvSaxena/lozad.js
-->
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/lozad/dist/lozad.min.js"></script> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/lozad/dist/lozad.min.js"></script>
<script type="text/javascript"> <script type="text/javascript">
const imgs = document.querySelectorAll('#post-wrapper img'); const imgs = document.querySelectorAll('.post-content img');
const observer = lozad(imgs); const observer = lozad(imgs);
observer.observe(); observer.observe();
</script> </script>

View File

@@ -1,7 +1,8 @@
<!-- <!--
mermaid-js loader mermaid-js loader
--> -->
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/mermaid@8/dist/mermaid.min.js"></script>
<script> <script>
$(function() { $(function() {
let initTheme = "default"; let initTheme = "default";

View File

@@ -1,10 +1,5 @@
<!-- <!--
Switch the mode between dark and light. Switch the mode between dark and light.
v2.1
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT License
--> -->
<i class="mode-toggle fas fa-adjust"></i> <i class="mode-toggle fas fa-adjust"></i>

View File

@@ -1,9 +1,5 @@
{% comment %} {% comment %}
Remove the line number of the code snippet. Remove the line number of the code snippet.
v2.2
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
Published under the MIT License
{% endcomment %} {% endcomment %}
{% assign content = include.content %} {% assign content = include.content %}

View File

@@ -1,9 +1,5 @@
<!-- <!--
The Pannel on right side (Desktop views) The Pannel on right side (Desktop views)
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2017-2019 Cotes Chung
MIT License
--> -->
<div id="panel-wrapper" class="col-xl-3 pl-2 text-muted topbar-down"> <div id="panel-wrapper" class="col-xl-3 pl-2 text-muted topbar-down">
@@ -15,7 +11,7 @@
{% if update_list.size > 0 %} {% if update_list.size > 0 %}
<div id="access-lastmod" class="post"> <div id="access-lastmod" class="post">
<span>{{- site.data.label.panel.lastmod -}}</span> <span>{{- site.data.label.panel.lastmod | default: 'Recent Update' -}}</span>
<ul class="post-content pl-0 pb-1 ml-1 mt-2"> <ul class="post-content pl-0 pb-1 ml-1 mt-2">
{% for item in update_list %} {% for item in update_list %}
@@ -34,7 +30,7 @@
{% if trending_tags.size > 0 %} {% if trending_tags.size > 0 %}
<div id="access-tags"> <div id="access-tags">
<span>{{- site.data.label.panel.trending_tags -}}</span> <span>{{- site.data.label.panel.trending_tags | default: 'Trending Tags' -}}</span>
<div class="d-flex flex-wrap mt-3 mb-1 mr-3"> <div class="d-flex flex-wrap mt-3 mb-1 mr-3">
{% for tag_name in trending_tags %} {% for tag_name in trending_tags %}
@@ -47,10 +43,12 @@
{% endif %} {% endif %}
</div> <!-- .access --> </div> <!-- .access -->
{% if page.layout == 'post' and site.toc and page.toc %} {% if include.toc %}
<!-- BS-toc.js will be loaded at medium priority -->
<script src="https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@1.0.1/dist/bootstrap-toc.min.js"></script>
<div id="toc-wrapper" class="pl-0 pr-4 mb-5"> <div id="toc-wrapper" class="pl-0 pr-4 mb-5">
<span class="pl-3 pt-2 mb-2"> <span class="pl-3 pt-2 mb-2">
{{- site.data.label.panel.toc -}} {{- site.data.label.panel.toc | default: 'Contents' -}}
</span> </span>
<nav id="toc" data-toggle="toc"></nav> <nav id="toc" data-toggle="toc"></nav>
</div> </div>

View File

@@ -1,15 +1,11 @@
<!-- <!--
Navigation buttons at the bottom of the post. Navigation buttons at the bottom of the post.
v2.1
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT License
--> -->
<div class="post-navigation d-flex justify-content-between"> <div class="post-navigation d-flex justify-content-between">
{% if page.previous.url %} {% if page.previous.url %}
<a href="{{ site.baseurl }}{{ page.previous.url }}" class="btn btn-outline-primary"> <a href="{{ site.baseurl }}{{ page.previous.url }}" class="btn btn-outline-primary"
prompt="{{ site.data.label.post.button.previous | default: 'previous' }}">
<p>{{ page.previous.title }}</p> <p>{{ page.previous.title }}</p>
</a> </a>
{% else %} {% else %}
@@ -19,7 +15,8 @@
{% endif %} {% endif %}
{% if page.next.url %} {% if page.next.url %}
<a href="{{ site.baseurl }}{{page.next.url}}" class="btn btn-outline-primary"> <a href="{{ site.baseurl }}{{page.next.url}}" class="btn btn-outline-primary"
prompt="{{ site.data.label.post.button.next | default: 'next' }}">
<p>{{ page.next.title }}</p> <p>{{ page.next.title }}</p>
</a> </a>
{% else %} {% else %}

View File

@@ -1,10 +1,5 @@
<!-- <!--
The paginator for post list on HomgPage. The paginator for post list on HomgPage.
v2.1
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT License
--> -->
<ul class="pagination mt-4 mb-0 pl-lg-2"> <ul class="pagination mt-4 mb-0 pl-lg-2">

View File

@@ -1,17 +1,12 @@
<!-- <!--
Post sharing snippet Post sharing snippet
v2.1
https://github.com/cotes2020/jekyll-theme-chirpy
© 2019 Cotes Chung
Published under the MIT License
--> -->
<div class="share-wrapper"> <div class="share-wrapper">
<span class="share-label text-muted mr-1">{{ site.data.share.label }}</span> <span class="share-label text-muted mr-1">{{ site.data.label.post.share | default: 'Share' }}</span>
<span class="share-icons"> <span class="share-icons">
{% capture title %}{{ page.title }} - {{ site.title }}{% endcapture %} {% capture title %}{{ page.title }} - {{ site.title }}{% endcapture %}
{% assign url = page.url | relative_url | prepend: site.url %} {% assign url = page.url | absolute_url %}
{% for share in site.data.share.platforms %} {% for share in site.data.share.platforms %}
{% assign link = share.link | replace: 'TITLE', title | replace: 'URL', url %} {% assign link = share.link | replace: 'TITLE', title | replace: 'URL', url %}

View File

@@ -3,13 +3,17 @@
--> -->
{% assign words = include.content | strip_html | number_of_words: "auto" %} {% assign words = include.content | strip_html | number_of_words: "auto" %}
{% assign read_time = words | divided_by: site.data.read_time.wpm %} <!-- words per minute -->
{% assign wpm = 180 %}
{% assign min_time = 1 %}
{% assign read_time = words | divided_by: wpm %}
{% unless read_time > 0 %} {% unless read_time > 0 %}
{% assign read_time = site.data.read_time.min_time %} {% assign read_time = min_time %}
{% endunless %} {% endunless %}
<!-- return element --> <!-- return element -->
<span class="readtime" data-toggle="tooltip" data-placement="bottom" title="{{ words }} words"> <span class="readtime" data-toggle="tooltip" data-placement="bottom" title="{{ words }} words">
{{- read_time -}}{{" "}}{{- site.data.read_time.prompt -}} {{- read_time -}}{{" "}}{{- site.data.label.read_time_unit | default: "min" -}}
</span> </span>

View File

@@ -35,5 +35,32 @@
%} %}
{% endif %} {% endif %}
{% if _content contains '<img src="' %}
{% if site.img_cdn != '' %}
{% assign img_path_replacement = '<img src="' | append: site.img_cdn | append: '/' %}
{% else %}
{% assign img_path_replacement = '<img src="' | append: site.baseurl | append: '/' %}
{% endif %}
{% assign _content = _content | replace: '<img src="/', img_path_replacement %}
<!-- lazy-load images <https://github.com/ApoorvSaxena/lozad.js#usage> -->
{% assign lozad = true %}
{% assign img_placehodler
= 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' %}
{% assign lozad_replacement = '<img src="'
| append: img_placehodler
| append: '" data-src="' %}
{% assign _content = _content | replace: '<img src="', lozad_replacement %}
{% endif %}
<!-- return --> <!-- return -->
{{ _content }} {{ _content }}
{% if lozad %}
{% include lozad.html %}
{% endif %}

View File

@@ -1,11 +1,6 @@
<!-- <!--
Recommend the other 3 posts according to the tags and categories of the current post, Recommend the other 3 posts according to the tags and categories of the current post,
if the number is not enough, use the other latest posts to supplement. if the number is not enough, use the other latest posts to supplement.
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2019 Cotes Chung
Published under the MIT License
--> -->
<!-- The total size of related posts --> <!-- The total size of related posts -->
@@ -85,7 +80,8 @@
{% if index_list.size > 0 %} {% if index_list.size > 0 %}
<div id="related-posts" class="mt-5 mb-2 mb-sm-4"> <div id="related-posts" class="mt-5 mb-2 mb-sm-4">
<h3 class="pt-2 mt-1 mb-4 ml-1" data-toc-skip>{{ site.data.label.post.relate_posts }}</h3> <h3 class="pt-2 mt-1 mb-4 ml-1"
data-toc-skip>{{ site.data.label.post.relate_posts | default: 'Further Reading' }}</h3>
<div class="card-deck mb-4"> <div class="card-deck mb-4">
{% for entry in index_list %} {% for entry in index_list %}
{% assign index = entry | plus: 0 %} {% assign index = entry | plus: 0 %}

View File

@@ -1,9 +1,5 @@
<!-- <!--
Jekyll Simple Search loader Jekyll Simple Search loader
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2017-2019 Cotes Chung
MIT License
--> -->
{% capture result_elem %} {% capture result_elem %}
@@ -25,7 +21,7 @@
SimpleJekyllSearch({ SimpleJekyllSearch({
searchInput: document.getElementById('search-input'), searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'), resultsContainer: document.getElementById('search-results'),
json: '{{ site.baseurl }}/assets/js/data/search.json', json: '{{ '/assets/js/data/search.json' | relative_url }}',
searchResultTemplate: '{{ result_elem | strip_newlines }}', searchResultTemplate: '{{ result_elem | strip_newlines }}',
noResultsText: '{{ not_found }}' noResultsText: '{{ not_found }}'
}); });

View File

@@ -1,14 +1,10 @@
<!-- <!--
The Search results The Search results
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2017-2019 Cotes Chung
MIT License
--> -->
<div id="search-result-wrapper" class="d-flex justify-content-center unloaded"> <div id="search-result-wrapper" class="d-flex justify-content-center unloaded">
<div class="col-12 col-xl-11 post-content"> <div class="col-12 col-xl-11 post-content">
<div id="search-hints"> <div id="search-hints">
<h4 class="text-muted mb-4">{{ site.data.label.panel.trending_tags }}</h4> <h4 class="text-muted mb-4">{{ site.data.label.panel.trending_tags | default: 'Trending Tags' }}</h4>
{% include trending-tags.html %} {% include trending-tags.html %}

View File

@@ -1,21 +1,21 @@
<!-- <!--
The Side Bar The Side Bar
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2017-2019 Cotes Chung
MIT License
--> -->
<div id="sidebar" class="d-flex flex-column align-items-end"> <div id="sidebar" class="d-flex flex-column align-items-end">
<div class="profile-wrapper text-center"> <div class="profile-wrapper text-center">
<div id="avatar"> <div id="avatar">
<a href="{{ site.baseurl }}/" alt="avatar" class="mx-auto"> <a href="{{ '/' | relative_url }}" alt="avatar" class="mx-auto">
{% assign avatar_url = site.avatar %} {% capture avatar_url %}
{% capture start %}{{ site.avatar | slice: 0 }}{% endcapture %} {%- if site.avatar contains '://' -%}
{% if start == '/' %} {{ site.avatar }}
{% assign avatar_url = avatar_url | prepend: site.baseurl %} {%- elsif site.img_cdn != '' and site.img_cdn -%}
{% endif %} {{ site.avatar | prepend: site.img_cdn }}
{%- else -%}
{{ site.avatar | relative_url }}
{%- endif -%}
{% endcapture %}
<img src="{{ avatar_url }}" alt="avatar" onerror="this.style.display='none'"> <img src="{{ avatar_url }}" alt="avatar" onerror="this.style.display='none'">
</a> </a>
</div> </div>

View File

@@ -1,25 +1,25 @@
<!-- <!--
Date format snippet Date format snippet
v2.4.1
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT License
--> -->
{% assign tooltip_df = site.data.date_format.tooltip | default: '%a, %b %e, %Y, %l:%M %p %z' %}
{% assign post_long_df = site.data.date_format.post.long | default: '%b %e, %Y' %}
{% assign post_short_df = site.data.date_format.post.short | default: '%b %e' %}
<span class="timeago {% if include.class %}{{ include.class }}{% endif %}" <span class="timeago {% if include.class %}{{ include.class }}{% endif %}"
{% if include.tooltip %} {% if include.tooltip %}
data-toggle="tooltip" data-toggle="tooltip"
data-placement="bottom" data-placement="bottom"
title="{{ include.date | date: site.data.date_format.tooltip }}" title="{{ include.date | date: tooltip_df }}"
{% endif %}> {% endif %}>
{% assign this_year = site.time | date: "%Y" %} {% assign this_year = site.time | date: "%Y" %}
{% assign post_year = include.date | date: "%Y" %} {% assign post_year = include.date | date: "%Y" %}
{% if post_year == this_year %} {% if post_year == this_year %}
{{ include.date | date: site.data.date_format.post.short }} {{ include.date | date: post_short_df }}
{% else %} {% else %}
{{ include.date | date: site.data.date_format.post.long }} {{ include.date | date: post_long_df }}
{% endif %} {% endif %}
<i class="unloaded">{{ include.date | date_to_xmlschema }}</i> <i class="unloaded">{{ include.date | date_to_xmlschema }}</i>

View File

@@ -1,10 +1,7 @@
<!-- <!--
The Top Bar The Top Bar
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2017-2019 Cotes Chung
MIT License
--> -->
<div id="topbar-wrapper" class="row justify-content-center topbar-down"> <div id="topbar-wrapper" class="row justify-content-center topbar-down">
<div id="topbar" class="col-11 d-flex h-100 align-items-center justify-content-between"> <div id="topbar" class="col-11 d-flex h-100 align-items-center justify-content-between">
<span id="breadcrumb"> <span id="breadcrumb">
@@ -42,7 +39,7 @@
<span id="search-wrapper" class="align-items-center"> <span id="search-wrapper" class="align-items-center">
<i class="fas fa-search fa-fw"></i> <i class="fas fa-search fa-fw"></i>
<input class="form-control" id="search-input" type="search" <input class="form-control" id="search-input" type="search"
aria-label="search" placeholder="{{ site.data.label.search_hint }}..."> aria-label="search" placeholder="{{ site.data.label.search_hint | default: 'Search' }}...">
<i class="fa fa-times-circle fa-fw" id="search-cleaner"></i> <i class="fa fa-times-circle fa-fw" id="search-cleaner"></i>
</span> </span>
<span id="search-cancel" >Cancel</span> <span id="search-cancel" >Cancel</span>

View File

@@ -1,9 +1,5 @@
{% comment %} {% comment %}
The trending tags list The trending tags list
v2.0
https://github.com/cotes2020/jekyll-theme-chirpy
© 2019 Cotes Chung
MIT Licensed
{% endcomment %} {% endcomment %}
{% assign MAX = 10 %} {% assign MAX = 10 %}

View File

@@ -1,9 +1,5 @@
{% comment %} {% comment %}
Get the last 5 posts from lastmod list. Get the last 5 posts from lastmod list.
v2.2
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT License
{% endcomment %} {% endcomment %}
{% assign MAX_SIZE = 5 %} {% assign MAX_SIZE = 5 %}

View File

@@ -1,11 +1,6 @@
--- ---
layout: page layout: page
# The Archives of posts. # The Archives of posts.
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT License
--- ---

View File

@@ -1,11 +1,6 @@
--- ---
layout: page layout: page
# All the Categories of posts # All the Categories of posts
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT License
--- ---

View File

@@ -1,9 +1,6 @@
--- ---
layout: page layout: page
# The Category layout # The Category layout
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# MIT Licensed
--- ---
<div id="page-category"> <div id="page-category">
@@ -14,11 +11,13 @@ layout: page
</h1> </h1>
<ul class="post-content pl-0"> <ul class="post-content pl-0">
{% assign post_long_df = site.data.date_format.post.long | default: '%b %e, %Y' %}
{% for post in page.posts %} {% for post in page.posts %}
<li class="d-flex justify-content-between pl-md-3 pr-md-3"> <li class="d-flex justify-content-between pl-md-3 pr-md-3">
<a href="{{ post.url | relative_url }}">{{ post.title }}</a> <a href="{{ post.url | relative_url }}">{{ post.title }}</a>
<span class="dash flex-grow-1"></span> <span class="dash flex-grow-1"></span>
<span class="text-muted small">{{ post.date | date: site.data.date_format.post.long }}</span> <span class="text-muted small">{{ post.date | date: post_long_df }}</span>
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>

View File

@@ -1,10 +1,6 @@
--- ---
layout: compress layout: compress
# Default layout # Default layout
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT Licensed
--- ---
<!DOCTYPE html> <!DOCTYPE html>

View File

@@ -1,10 +1,6 @@
--- ---
layout: page layout: page
# The Home page layout # The Home page layout
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT Licensed
--- ---
@@ -49,9 +45,9 @@ layout: page
{% for post in posts %} {% for post in posts %}
<div class="post-preview"> <div class="post-preview">
<a href="{{ post.url | relative_url }}"> <h1>
<h1>{{ post.title }}</h1> <a href="{{ post.url | relative_url }}">{{ post.title }}</a>
</a> </h1>
<div class="post-content"> <div class="post-content">
<p> <p>
@@ -83,7 +79,7 @@ layout: page
{% if post.pin %} {% if post.pin %}
<div class="pin"> <div class="pin">
<i class="fas fa-thumbtack fa-fw"></i> <i class="fas fa-thumbtack fa-fw"></i>
<span>{{ site.data.label.pin_prompt }}</span> <span>{{ site.data.label.pin_prompt | default: 'Pinned' }}</span>
</div> </div>
{% endif %} {% endif %}

View File

@@ -1,10 +1,6 @@
--- ---
layout: default layout: default
# The page layout # The page layout
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT License
--- ---
<div class="row"> <div class="row">

View File

@@ -1,10 +1,6 @@
--- ---
layout: default layout: default
# The posts' layout # The posts' layout
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT Licensed
--- ---
<div class="row"> <div class="row">
@@ -47,21 +43,13 @@ layout: default
</div> <!-- .post-meta --> </div> <!-- .post-meta -->
<div class="post-content"> <div class="post-content">
{%- capture img_placehodler -%}
data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
{%- endcapture -%}
{% if page.image %} {% if page.image %}
<img src="{{ img_placehodler }}" data-src="{{ page.image }}" class="preview-img"> <img src="{{ page.image }}" class="preview-img" alt="Preview Image">
{% endif %} {% endif %}
<!-- Using lozad. See: <https://github.com/ApoorvSaxena/lozad.js#usage> -->
{% if content contains '<img src=' %}
{% assign replacement = '<img src="' | append: img_placehodler | append: '" data-src=' %}
{{ content | replace: '<img src=', replacement }}
{% else %}
{{ content }} {{ content }}
{% endif %}
</div> </div>
<div class="post-tail-wrapper text-muted"> <div class="post-tail-wrapper text-muted">
@@ -111,7 +99,15 @@ layout: default
</div> <!-- #post-wrapper --> </div> <!-- #post-wrapper -->
{% include panel.html %} {% assign enable_toc = false %}
{% if site.toc and page.toc %}
{% if content contains '<h2' or content contains '<h3' %}
{% assign enable_toc = true %}
{% endif %}
{% endif %}
{% include panel.html toc=enable_toc %}
</div> <!-- .row --> </div> <!-- .row -->
@@ -132,5 +128,3 @@ layout: default
</div> <!-- .col-* --> </div> <!-- .col-* -->
</div> <!-- .row --> </div> <!-- .row -->
{% include lozad.html %}

View File

@@ -1,12 +1,9 @@
--- ---
layout: page layout: page
# The layout for Tag page # The layout for Tag page
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT Licensed
--- ---
<div id="page-tag"> <div id="page-tag">
<h1 class="pl-lg-2"> <h1 class="pl-lg-2">
<i class="fa fa-tag fa-fw text-muted"></i> <i class="fa fa-tag fa-fw text-muted"></i>
@@ -14,11 +11,13 @@ layout: page
<span class="lead text-muted pl-2">{{ page.posts | size }}</span> <span class="lead text-muted pl-2">{{ page.posts | size }}</span>
</h1> </h1>
<ul class="post-content pl-0"> <ul class="post-content pl-0">
{% assign post_long_df = site.data.date_format.post.long | default: '%b %e, %Y' %}
{% for post in page.posts %} {% for post in page.posts %}
<li class="d-flex justify-content-between pl-md-3 pr-md-3"> <li class="d-flex justify-content-between pl-md-3 pr-md-3">
<a href="{{ post.url | relative_url }}">{{ post.title }}</a> <a href="{{ post.url | relative_url }}">{{ post.title }}</a>
<span class="dash flex-grow-1"></span> <span class="dash flex-grow-1"></span>
<span class="text-muted small">{{ post.date | date: site.data.date_format.post.long }}</span> <span class="text-muted small">{{ post.date | date: post_long_df }}</span>
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>

View File

@@ -1,11 +1,6 @@
--- ---
layout: page layout: page
# All the Tags of posts. # All the Tags of posts.
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT License
--- ---
<div id="tags" class="d-flex flex-wrap ml-xl-2 mr-xl-2"> <div id="tags" class="d-flex flex-wrap ml-xl-2 mr-xl-2">

View File

@@ -1,4 +1,7 @@
#!/usr/bin/env ruby
#
# Check for changed posts # Check for changed posts
Jekyll::Hooks.register :posts, :post_init do |post| Jekyll::Hooks.register :posts, :post_init do |post|
commit_num = `git rev-list --count HEAD "#{ post.path }"` commit_num = `git rev-list --count HEAD "#{ post.path }"`

View File

@@ -6,7 +6,7 @@ categories: [Blogging, Demo]
tags: [typography] tags: [typography]
math: true math: true
mermaid: true mermaid: true
image: /assets/img/sample/devices-mockup.png image: https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/commons/devices-mockup.png
--- ---
This post is to show Markdown syntax rendering on [**Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/fork), you can also use it as an example of writing. Now, let's start looking at text and typography. This post is to show Markdown syntax rendering on [**Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/fork), you can also use it as an example of writing. Now, let's start looking at text and typography.
@@ -97,34 +97,34 @@ Click the hook will locate the footnote[^footnote], and here is another footnote
- Default (with caption) - Default (with caption)
![Desktop View](/assets/img/sample/mockup.png) ![Desktop View](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20190808/mockup.png)
_Full screen width and center alignment_ _Full screen width and center alignment_
<br> <br>
- Specify width - Specify width
![Desktop View](/assets/img/sample/mockup.png){: width="400"} ![Desktop View](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20190808/mockup.png){: width="400"}
_400px image width_ _400px image width_
<br> <br>
- Left aligned - Left aligned
![Desktop View](/assets/img/sample/mockup.png){: width="350" .normal} ![Desktop View](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20190808/mockup.png){: width="350" .normal}
<br> <br>
- Float to left - Float to left
![Desktop View](/assets/img/sample/mockup.png){: width="240" .left} ![Desktop View](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20190808/mockup.png){: width="240" .left}
"A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space." "A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space."
<br> <br>
- Float to right - Float to right
![Desktop View](/assets/img/sample/mockup.png){: width="240" .right} ![Desktop View](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20190808/mockup.png){: width="240" .right}
"A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space." "A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space. A repetitive and meaningless text is used to fill the space."
<br> <br>

View File

@@ -8,7 +8,7 @@ tags: [writing]
## Naming and Path ## Naming and Path
Create a new file named `YYYY-MM-DD-TITLE.EXTENSION` and put it in the `_post/` of the root directory. Please note that the `EXTENSION` must be one of `md` and `markdown`. Create a new file named `YYYY-MM-DD-TITLE.EXTENSION` and put it in the `_posts/` of the root directory. Please note that the `EXTENSION` must be one of `md` and `markdown`.
## Front Matter ## Front Matter
@@ -118,22 +118,44 @@ By default, the image is centered, but you can specify the position by using one
Image will be left aligned in below sample: Image will be left aligned in below sample:
```markdown ```markdown
![Desktop View](/assets/img/sample/mockup.png){: width="350" .normal} ![Desktop View](/assets/img/sample/mockup.png){: .normal}
``` ```
- **Float to the left** - **Float to the left**
```markdown ```markdown
![Desktop View](/assets/img/sample/mockup.png){: width="240" .left} ![Desktop View](/assets/img/sample/mockup.png){: .left}
``` ```
- **Float to the right** - **Float to the right**
```markdown ```markdown
![Desktop View](/assets/img/sample/mockup.png){: width="240" .right} ![Desktop View](/assets/img/sample/mockup.png){: .right}
``` ```
> **Limitation**: Once you specify the position of an image, it is forbidden to add the image caption. **Limitation**: Once you specify the position of an image, it is forbidden to add the image caption.
### CDN URL
If you host the images on the CDN, you can save the time of repeatedly writing the CDN url by assigning the variable `img_cdn` of `_config.yml` file:
```yaml
img_cdn: https://cdn.com
```
Once `img_cdn` is assigned, the CDN url will be added to the path of all images (images of site avatar and posts) starting with `/`.
For instance, when using images:
```markdown
![The flower](/path/to/flower.png)
```
The parsing result will automatically add the CDN prefix `https://cdn.com` before the image path:
```html
<img src="https://cdn.com/path/to/flower.png" alt="The flower">
```
## Pinned Posts ## Pinned Posts

View File

@@ -7,46 +7,67 @@ tags: [getting started]
pin: true pin: true
--- ---
## Prerequisites
Follow the [Jekyll Docs](https://jekyllrb.com/docs/installation/) to complete the installation of `Ruby`, `RubyGems`, `Jekyll` and `Bundler`.
## Installation ## Installation
[Fork **Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/fork) on GitHub, rename the repository to `USERNAME.github.io` (where `USERNAME` is your GitHub username), and then open terminal and clone the fork to local by: There are two ways to get the theme:
```terminal - Install from [RubyGems](https://rubygems.org/gems/jekyll-theme-chirpy)
$ git clone https://github.com/USERNAME/USERNAME.github.io.git -b master --single-branch - Fork from GitHub
### Install From Rubygems
Add this line to your Jekyll site's `Gemfile`:
```ruby
gem "jekyll-theme-chirpy"
``` ```
### Setting up the local envrionment And add this line to your Jekyll site's `_config.yml`:
If you would like to run or build the project on your local machine, please follow the [Jekyll Docs](https://jekyllrb.com/docs/installation/) to complete the installation of `Ruby`, `RubyGems`, `Jekyll` and `Bundler`. ```yaml
theme: jekyll-theme-chirpy
Before running or building for the first time, please complete the installation of the Jekyll plugins. Go to the root directory of project and run:
```terminal
$ bundle install
``` ```
`bundle` will automatically install all the dependencies specified by `Gemfile`. And then execute:
### Setting up Docker environment (optional)
If you're a loyal fan of [**Docker**](https://www.docker.com/) or just too lazy to install the packages mentioned in [_Setting up the local envrionment_](#setting-up-the-local-envrionment), please make sure you have **Docker Engine** installed and running, and then get Docker image `jekyll/jekyll` from Docker Hub by the following command:
```console ```console
$ docker pull jekyll/jekyll $ bundle
``` ```
## Usage Finally, copy the missing files (refer to the [starter project][starter] for the detailed file directory structure) from the theme's gem to your Jekyll site, and append all the variables of the theme's `_config.yml` to your Jekyll site.
### Initialization > **Hint**: To locate the themes gem, execute:
>
```console
$ bundle info --path jekyll-theme-chirpy
```
Go to the root directory of the project and start initialization: Or you can [use the starter template][use-starter] to create a Jekyll site to save time copying contents from theme's gem.
[starter]: https://github.com/cotes2020/chirpy-starter
[use-starter]: https://github.com/cotes2020/chirpy-starter/generate
### Fork From GitHub
[Fork **Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/fork) from GitHub and clone your fork to local.
Install gem dependencies by:
```console
$ bundle
```
And then execute:
```console ```console
$ bash tools/init.sh $ bash tools/init.sh
``` ```
> **Note**: If you not intend to deploy it on GitHub Pages, append parameter option `--no-gh` at the end of the above command. > **Note**: If you don't plan to deploy your site on GitHub Pages, append parameter option `--no-gh` at the end of the above command.
What it does is: What it does is:
@@ -60,51 +81,61 @@ What it does is:
3. Automatically create a commit to save the changes. 3. Automatically create a commit to save the changes.
## Usage
### Configuration ### Configuration
Generally, go to `_config.yml` and configure the variables as needed. Some of them are typical options: Update the variables of `_config.yml` as needed. Some of them are typical options:
- `url` - `url`
- `avatar` - `avatar`
- `timezone` - `timezone`
- `theme_mode` - `theme_mode`
### Run Locally ### Running Local Server
You may want to preview the site contents before publishing, so just run it by: You may want to preview the site contents before publishing, so just run it by:
```terminal ```console
$ bundle exec jekyll s $ bundle exec jekyll s
``` ```
Then open a browser and visit to <http://localhost:4000>. Or run the site on Docker with the following command:
### Run on Docker
Run the site on Docker with the following command:
```terminal ```terminal
$ docker run --rm -it \ $ docker run -it --rm \
--volume="$PWD:/srv/jekyll" \ --volume="$PWD:/srv/jekyll" \
-p 4000:4000 jekyll/jekyll \ -p 4000:4000 jekyll/jekyll \
jekyll serve jekyll serve
``` ```
Open a browser and visit to _<http://localhost:4000>_.
### Deployment ### Deployment
Before the deployment begins, checkout the file `_config.yml` and make sure the `url` is configured correctly. Furthermore, if you prefer the [_project site_](https://help.github.com/en/github/working-with-github-pages/about-github-pages#types-of-github-pages-sites) and don't use a custom domain, or you want to visit your website with a base url on a web server other than **GitHub Pages**, remember to change the `baseurl` to your project name that starting with a slash. For example, `/project`. Before the deployment begins, checkout the file `_config.yml` and make sure the `url` is configured correctly. Furthermore, if you prefer the [**project site**](https://help.github.com/en/github/working-with-github-pages/about-github-pages#types-of-github-pages-sites) and don't use a custom domain, or you want to visit your website with a base url on a web server other than **GitHub Pages**, remember to change the `baseurl` to your project name that starting with a slash, e.g, `/project-name`.
Assuming you have already gone through the [initialization](#initialization), you can now choose ONE of the following methods to deploy your website. Now you can now choose ONE of the following methods to deploy your website.
#### Deploy on GitHub Pages #### Deploy on GitHub Pages
For security reasons, GitHub Pages build runs on `safe` mode, which restricts us from using plugins to generate additional page files. Therefore, we can use **GitHub Actions** to build the site, store the built site files on a new branch, and use that branch as the source of the Pages service. For security reasons, GitHub Pages build runs on `safe` mode, which restricts us from using plugins to generate additional page files. Therefore, we can use **GitHub Actions** to build the site, store the built site files on a new branch, and use that branch as the source of the GH Pages service.
1. Push any commit to `origin/master` to trigger the GitHub Actions workflow. Once the build is complete and successful, a new remote branch named `gh-pages` will appear to store the built site files. Ensure your Jekyll site has the file `/.github/workflows/pages-deploy.yml`.
Otherwise, create a new one and fill in the contents of the [workflow file][workflow], and the value of the `on.push.branches` should be the same as your repo's default branch name.
[workflow]:https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/.github/workflows/pages-deploy.yml.hook
Rename your repoistory to `<GH-USERNAME>.github.io` on GitHub.
And then publish your site by:
1. Push any commit to remote to trigger the GitHub Actions workflow. Once the build is complete and successful, a new remote branch named `gh-pages` will appear to store the built site files.
2. Browse to your repo's landing page on GitHub and select the branch `gh-pages` as the [publishing source](https://docs.github.com/en/github/working-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site) throught _Settings__Options__GitHub Pages_: 2. Browse to your repo's landing page on GitHub and select the branch `gh-pages` as the [publishing source](https://docs.github.com/en/github/working-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site) throught _Settings__Options__GitHub Pages_:
![gh-pages-sources](/assets/img/sample/gh-pages-sources.png){: width="650" class="normal"}
![gh-pages-sources](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20190809/gh-pages-sources.png)
3. Visit your website at the address indicated by GitHub. 3. Visit your website at the address indicated by GitHub.
@@ -118,7 +149,7 @@ Go to the root of the source project, build your site by:
$ JEKYLL_ENV=production bundle exec jekyll b $ JEKYLL_ENV=production bundle exec jekyll b
``` ```
Or, build the site with Docker by: Or build the site with Docker by:
```terminal ```terminal
$ docker run -it --rm \ $ docker run -it --rm \

View File

@@ -11,11 +11,11 @@ In [**Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/), the image fi
With a square image (PNG, JPG or GIF) in hand, open the site [*Favicon & App Icon Generator*](https://www.favicon-generator.org/) and upload your original image. With a square image (PNG, JPG or GIF) in hand, open the site [*Favicon & App Icon Generator*](https://www.favicon-generator.org/) and upload your original image.
![upload-image](/assets/img/sample/upload-image.png) ![upload-image](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20190811/upload-image.png)
Click button <kbd>Create Favicon</kbd> and wait a moment for the website to generate the icons of various sizes automatically. Click button <kbd>Create Favicon</kbd> and wait a moment for the website to generate the icons of various sizes automatically.
![download-icons](/assets/img/sample/download-icons.png){: width="600"} ![download-icons](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20190811/download-icons.png){: width="600"}
Download the generated package, unzip and delete the following two from the extracted files: Download the generated package, unzip and delete the following two from the extracted files:

View File

@@ -0,0 +1,245 @@
---
title: Enable Google Page Views
author: Dinesh Prasanth Moluguwan Krishnamoorthy
date: 2021-01-03 18:32:00 -0500
categories: [Blogging, Tutorial]
tags: [google analytics, pageviews]
---
This post is to enable Page Views on the [**Chirpy**][chirpy-homepage] theme based blog that you just built. This requires technical knowledge and it's recommended to keep the `google_analytics.pv` disabled unless you have a good reason. If your website has low traffic, the page views count would discourage you to write more blogs. With that said, let's start with the setup.
## Set up Google Analytics
### Create GA account and property
First, you need to setup your account on Google analytics. While your create your account, you must create your first **Property** as well.
1. Head to <https://analytics.google.com/> and click on **Start Measuring**
2. Enter your desired *Account Name* and choose the desired checkboxes
3. Enter your desired *Property Name*. This is the name of the tracker project that appears on your Google Analytics dashboard
4. Enter the required information *About your business*
5. Hit *Create* and accept any license popup to setup your Google Analytics account and create your property
### Create Data Stream
With your property created, you now need to set up Data Stream to track your blog traffic. After you signup, the prompt should automatically take you to creating your first **Data Stream**. If not, follow these steps:
1. Go to **Admin** on the left column
2. Select the desired property from the drop down on the second column
3. Click on **Data Streams**
4. Add a stream and click on **Web**
5. Enter your blog's URL
It should look like this:
![google-analytics-data-stream](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20210103/01-google-analytics-data-stream.png)
Now, click on the new data stream and grab the **Measurement ID**. It should look something like `G-V6XXXXXXXX`. Copy this to your `_config.yml` file
```yaml
google_analytics:
id: 'G-V6XXXXXXX' # Fill with your Google Analytics ID
pv:
# The Google Analytics pageviews switch.
enabled: false
# the next options only valid when `google_analytics.pv` is enabled.
proxy_url: ''
proxy_endpoint: ''
cache: false # pv data local cache, good for the users from GFW area.
```
When you push these changes to your blog, you should start seeing the traffic on your Google Analytics. Play around with Google Analytics dashboard to get familiar with the options available as it takes like 5 mins to pickup your changes. You should now be able to monitor your traffic in realtime.
![google-analytics-realtime](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20210103/02-google-analytics-realtime.png)
## Setup Page Views
There is a detailed [tutorial](https://developers.google.com/analytics/solutions/google-analytics-super-proxy) available to set up Google Analytics superProxy. But, if you are interested to just quickly get your Chirpy-based blog display page views, follow along. These steps were tested on a Linux machine. If you are running Windows, you can use Git bash terminal to run Unix-like commands.
### Setup Google App Engine
1. Visit <https://console.cloud.google.com/appengine>
2. Click on **Create Application**
3. Click on **Create Project**
4. Enter the name and choose the data center close to you
5. Select **Python** language and **Standard** environment
6. Enable billing account. Yeah, you have to link your credit card. But, you won't be billed unless you exceed your free quota. For a simple blog, free quota is more than sufficient.
7. Go to your App Engine dashboard on your browser and select **API & Services** from the left navigation menu
8. Click on **Enable APIs and Services** button on the top
9. Enable the following APIs: *Google Analytics API*
10. On the left, Click on *OAuth Consent Screen* and accept **Configure Consent Screen**. Select **External** since your blog is probably hosted for the public. Click on **Publish** under *Publishing Status*
11. Click on **Credentials** on the left and create a new **OAuth Client IDs** credential. Make sure to add a entry under `Authorized redirect URIs` that matches: `https://<project-id>.<region>.r.appspot.com/admin/auth`
12. Note down the **Your Client ID** and **Your Client Secret**. You'll need this in the next section.
13. Download and install the cloud SDK for your platform: <https://cloud.google.com/sdk/docs/quickstart>
14. Run the following commands:
```console
[root@bc96abf71ef8 /]# gcloud init
~snip~
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=XYZ.apps.googleusercontent.com&redirect_uri=ABCDEFG
Enter verification code: <VERIFICATION CODE THAT YOU GET AFTER YOU VISIT AND AUTHENTICATE FROM THE ABOVE LINK>
You are logged in as: [blah_blah@gmail.com].
Pick cloud project to use:
[1] chirpy-test-300716
[2] Create a new project
Please enter numeric choice or text value (must exactly match list
item): 1
[root@bc96abf71ef8 /]# gcloud info
# Your selected project info should be displayed here
```
### Setup Google Analytics superProxy
1. Clone the **Google Analytics superProxy** project on Github: <https://github.com/googleanalytics/google-analytics-super-proxy> to your local.
2. Remove the first 2 lines in the [`src/app.yaml`](https://github.com/googleanalytics/google-analytics-super-proxy/blob/master/src/app.yaml#L1-L2) file:
```diff
- application: your-project-id
- version: 1
```
3. In `src/config.py`, add the `OAUTH_CLIENT_ID` and `OAUTH_CLIENT_SECRET` that you gathered from you App Engine Dashboard.
4. Enter any random key for `XSRF_KEY`, your `config.py` should look similar to this
```python
#!/usr/bin/python2.7
__author__ = 'pete.frisella@gmail.com (Pete Frisella)'
# OAuth 2.0 Client Settings
AUTH_CONFIG = {
'OAUTH_CLIENT_ID': 'YOUR_CLIENT_ID',
'OAUTH_CLIENT_SECRET': 'YOUR_CLIENT_SECRET',
'OAUTH_REDIRECT_URI': '%s%s' % (
'https://chirpy-test-XXXXXX.ue.r.appspot.com',
'/admin/auth'
)
}
# XSRF Settings
XSRF_KEY = 'OnceUponATimeThereLivedALegend'
```
**Tip:** You can configure a custom domain instead of `https://PROJECT_ID.REGION_ID.r.appspot.com`. But, for the sake of keeping it simple, we will be using the Google provided default URL.
5. From inside the src/ directory, deploy the app
```console
[root@bc96abf71ef8 src]# gcloud app deploy
Services to deploy:
descriptor: [/tmp/google-analytics-super-proxy/src/app.yaml]
source: [/tmp/google-analytics-super-proxy/src]
target project: [chirpy-test-XXXX]
target service: [default]
target version: [VESRION_NUM]
target url: [https://chirpy-test-XXXX.ue.r.appspot.com]
Do you want to continue (Y/n)? Y
Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 1 file to Google Cloud Storage ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://chirpy-test-XXXX.ue.r.appspot.com]
You can stream logs from the command line by running:
$ gcloud app logs tail -s default
To view your application in the web browser run:
$ gcloud app browse
```
6. Visit the deployed service. Add a `/admin` to the end of the URL.
7. Click on **Authorize Users** and make sure to add yourself as a managed user.
8. If you get any errors, please Google it. The errors are self-explanatory and should be easy to fix.
If everything went good, you'll get this screen:
![superProxy-deployed](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20210103/03-superProxy-deployed.png)
### Create Google Analytics Query
Head to `https://PROJECT_ID.REGION_ID.r.appspot.com/admin` and create a query after verifying the account. **GA Core Reporting API** query request can be created in [Query Explorer](https://ga-dev-tools.appspot.com/query-explorer/).
The query parameters are as follows:
- **start-date**: fill in the first day of blog posting
- **end-date**: fill in `today` (this is a parameter supported by GA Report, which means that it will always end according to the current query date)
- **metrics**: select `ga:pageviews`
- **dimensions**: select `ga:pagePath`
In order to reduce the returned results and reduce the network bandwidth, we add custom filtering rules [^ga-filters]:
- **filters**: fill in `ga:pagePath=~^/posts/.*/$;ga:pagePath!@=`
Among them, `;` means using _logical AND_ to concatenate two rules.
If the `site.baseurl` is specified, change the first filtering rule to `ga:pagePath=~^/BASE_URL/posts/.*/$`, where `BASE_URL` is the value of `site.baseurl`.
After <kbd>Run Query</kbd>, copy the generated contents of **API Query URI** at the bottom of the page, and fill in the **Encoded URI for the query** of SuperProxy on GAE.
After the query is saved on GAE, a **Public Endpoint** (public access address) will be generated, and we will get the query result in JSON format when accessing it. Finally, click <kbd>Enable Endpoint</kbd> in **Public Request Endpoint** to make the query effective, and click <kbd>Start Scheduling</kbd> in **Scheduling** to start the scheduled task.
![superproxy-query](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20210103/04-superproxy-query.png)
## Configure Chirpy to Display Page View
Once all the hard part is done, it is very easy to enable the Page View on Chirpy theme. Your superProxy dashboard should look something like below and you can grab the required values.
![superproxy-dashboard](https://cdn.jsdelivr.net/gh/cotes2020/chirpy-images/posts/20210103/05-superproxy-dashboard.png)
Update the `_config.yml` file of [**Chirpy**][chirpy-homepage] project with the values from your dashboard, to look similar to the following:
```yaml
google_analytics:
id: 'G-XXXXXXXXXX' # Fill with your Google Analytics ID
pv:
# The Google Analytics pageviews switch.
enabled: true
# the next options only valid when `google_analytics.pv` is enabled.
proxy_url: 'https://PROJECT_ID.REGION_ID.r.appspot.com'
proxy_endpoint: 'https://PROJECT_ID.REGION_ID.r.appspot.com/query?id=<ID FROM SUPER PROXY>'
cache: false # pv data local cache, good for the users from GFW area.
```
Now, you should see the Page View enabled on your blog.
## Reference
[^ga-filters]: [Google Analytics Core Reporting API: Filters](https://developers.google.com/analytics/devguides/reporting/core/v3/reference#filters)
[chirpy-homepage]: https://github.com/cotes2020/jekyll-theme-chirpy/

View File

@@ -1,19 +1,8 @@
/* /*
* The main styles. The common styles
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2018-2019 Cotes Chung
* MIT Licensed
*/ */
@import "_addon/module";
@import "_addon/variables";
@import "_colors/light-typography";
@import "_colors/dark-typography";
@import url('https://fonts.googleapis.com/css2?family=Lato&family=Source+Sans+Pro:wght@400;600;900&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Lato&family=Source+Sans+Pro:wght@400;600;900&display=swap');
@mixin mode-toggle($dark-mode: false) { @mixin mode-toggle($dark-mode: false) {
@if $dark-mode { @if $dark-mode {
@include dark-scheme; @include dark-scheme;
@@ -48,7 +37,6 @@ html[mode=dark] {
:root { :root {
font-size: 16px; font-size: 16px;
scroll-behavior: smooth;
} }
body { body {
@@ -61,7 +49,7 @@ body {
/*--- sidebar layout ---*/ /*--- sidebar layout ---*/
$tab-count: {{ site.tabs | size | plus: 1 }}; // plus 1 for home tab $tab-count: 5 !default;
$sidebar-display: "sidebar-display"; $sidebar-display: "sidebar-display";
@@ -657,6 +645,12 @@ h5 {
font-size: 1.1rem; font-size: 1.1rem;
} }
ol, ul {
ol, ul {
margin-bottom: 1rem;
}
}
blockquote { blockquote {
border-left: 5px solid var(--blockquote-border-color); border-left: 5px solid var(--blockquote-border-color);
padding-left: 1rem; padding-left: 1rem;
@@ -672,27 +666,19 @@ kbd {
margin: 0 0.3rem; margin: 0 0.3rem;
} }
sup {
z-index: 1;
&:target {
@extend %anchor;
z-index: 0;
}
}
.footnotes > ol { .footnotes > ol {
padding-left: 2rem; padding-left: 2rem;
margin-top: 0.5rem; margin-top: 0.5rem;
> li { > li {
+ li { &:not(:last-child) {
margin-top: 0.3rem; margin-bottom: 0.3rem;
} }
> p { > p {
margin-left: 0.25em; margin-left: 0.25em;
margin-top: 0; margin-top: 0;
margin-bottom: 0; margin-bottom: 0;
} }
&:target > p { &:target:not([scroll-focus]), &[scroll-focus=true] > p { // [scroll-focus] added by `smooth-scroll.js`
background-color: var(--footnote-target-bg); background-color: var(--footnote-target-bg);
width: fit-content; width: fit-content;
-webkit-transition: background-color 1.5s ease-in-out; -webkit-transition: background-color 1.5s ease-in-out;
@@ -704,14 +690,14 @@ sup {
.footnote { .footnote {
@at-root a#{&} { @at-root a#{&} {
margin: 0 0.2em; @include ml-mr(1px);
@include pl-pr(2px);
border-bottom-style: none !important; border-bottom-style: none !important;
-webkit-transition: background-color 1.5s ease-in-out; /* Safari prior 6.1 */ -webkit-transition: background-color 1.5s ease-in-out; /* Safari prior 6.1 */
transition: background-color 1.5s ease-in-out; transition: background-color 1.5s ease-in-out;
} }
@at-root sup:target > a#{&} { @at-root sup:target:not([scroll-focus]), sup[scroll-focus=true] > a#{&} { // [scroll-focus] added by `smooth-scroll.js`
background-color: var(--footnote-target-bg); background-color: var(--footnote-target-bg);
padding: 0 2px;
} }
} }
@@ -727,10 +713,10 @@ sup {
} }
a { a {
@at-root p>#{&} { p > & {
@extend %link-color; @extend %link-color;
} }
@at-root span>#{&} { span > & {
@extend %link-color; @extend %link-color;
} }
.post-preview & { .post-preview & {
@@ -996,7 +982,7 @@ img {
display: none !important; display: none !important;
} }
.visable { .visible {
visibility: visible !important; visibility: visible !important;
} }
@@ -1205,13 +1191,9 @@ img {
justify-content: center!important; justify-content: center!important;
} }
sup:target {
padding-top: 3.4rem;
}
.footnotes ol > li { .footnotes ol > li {
padding-top: 3.5rem; padding-top: 3.5rem;
margin-top: -3.2rem !important; margin-top: -3.2rem;
&:first-child { &:first-child {
margin-top: -3.5rem; margin-top: -3.5rem;
} }

View File

@@ -6,8 +6,8 @@
* MIT Licensed * MIT Licensed
*/ */
@import "_colors/light-syntax"; @import "colors/light-syntax";
@import "_colors/dark-syntax"; @import "colors/dark-syntax";
html:not([mode]), html:not([mode]),
html[mode=light] { html[mode=light] {
@@ -132,6 +132,15 @@ code {
td.rouge-code { td.rouge-code {
padding: 1.5rem 1.5rem 1.5rem 1rem; padding: 1.5rem 1.5rem 1.5rem 1rem;
// Prevent some browser extends from
// changing the URL string of code block.
a {
color: inherit !important;
border-bottom: none !important;
pointer-events: none;
}
} }
/* Hide line numbers for default, console, and terminal code snippets */ /* Hide line numbers for default, console, and terminal code snippets */
@@ -149,7 +158,7 @@ div {
} }
} }
[class^='language-']::before { div[class^='language-']::before {
content: attr(lang); content: attr(lang);
position: absolute; position: absolute;
right: 1.8rem; right: 1.8rem;
@@ -161,7 +170,7 @@ div {
} }
@media (min-width: 768px) { @media (min-width: 768px) {
[class^='language-']::before { div[class^='language-']::before {
right: 3.1rem; right: 3.1rem;
} }
} }

View File

@@ -1,9 +1,5 @@
/*! /*
* The syntax dark mode styles. * The syntax dark mode styles.
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2018-2019 Cotes Chung
* MIT Licensed
*/ */
@mixin dark-syntax { @mixin dark-syntax {

View File

@@ -1,9 +1,5 @@
/*! /*
* The main dark mode styles * The main dark mode styles
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2018-2019 Cotes Chung
* MIT Licensed
*/ */
@mixin dark-scheme { @mixin dark-scheme {
@@ -52,7 +48,7 @@
--btn-paginator-border-color: var(--btn-border-color); --btn-paginator-border-color: var(--btn-border-color);
--btn-paginator-shadow: var(--main-wrapper-bg); --btn-paginator-shadow: var(--main-wrapper-bg);
--pin-bg: rgb(34 35 37); --pin-bg: rgb(34 35 37);
--pin-color: iherit; --pin-color: inherit;
/* Posts */ /* Posts */
--toc-highlight: rgb(116, 178, 243); --toc-highlight: rgb(116, 178, 243);

View File

@@ -1,9 +1,5 @@
/*! /*
* The syntax light mode code snippet colors. * The syntax light mode code snippet colors.
* v2.1
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2020 Cotes Chung
* MIT Licensed
*/ */
@mixin light-syntax { @mixin light-syntax {

View File

@@ -1,9 +1,5 @@
/*! /*
* The syntax light mode typography colors * The syntax light mode typography colors
* v2.1
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2020 Cotes Chung
* MIT Licensed
*/ */
@mixin light-scheme { @mixin light-scheme {

View File

@@ -0,0 +1,22 @@
/*!
* The styles for Jekyll theme Chirpy
*
* Chirpy v3.0.1 (https://github.com/cotes2020/jekyll-theme-chirpy)
* © 2021 Cotes Chung
* MIT Licensed
*/
@import "colors/light-typography";
@import "colors/dark-typography";
@import "addon/module";
@import "addon/variables";
@import 'addon/syntax';
@import "addon/commons";
@import "layout/home";
@import "layout/post";
@import "layout/tags";
@import "layout/archives";
@import "layout/categories";
@import "layout/category-tag";

View File

@@ -1,13 +1,6 @@
--- /*
# Style for Archives Style for Archives
# v2.0 */
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2019 Cotes Chung
# MIT License
---
{% include_relative _addon/main.scss %}
%date-timeline { %date-timeline {
content: ""; content: "";

View File

@@ -1,13 +1,6 @@
--- /*
# Style for Tab Categories Style for Tab Categories
# v2.0 */
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2019 Cotes Chung
# MIT License
---
{% include_relative _addon/main.scss %}
%category-icon-color { %category-icon-color {
color: gray; color: gray;

View File

@@ -1,13 +1,6 @@
--- /*
# Style for page Category and Tag Style for page Category and Tag
# v2.0 */
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2019 Cotes Chung
# MIT License
---
{% include_relative _addon/main.scss %}
#page-category, #page-tag { #page-category, #page-tag {
ul > li { ul > li {

View File

@@ -1,12 +1,6 @@
--- /*
# Style for Homepage Style for Homepage
# v2.0 */
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2019 Cotes Chung
# MIT License
---
{% include_relative _addon/main.scss %}
#post-list { #post-list {
margin-top: 1rem; margin-top: 1rem;

View File

@@ -1,17 +1,6 @@
--- /*
# Post-specific style Post-specific style
# v2.0 */
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2019 Cotes Chung
# MIT License
---
{% include_relative _addon/main.scss %}
{% include_relative _addon/syntax.scss %}
$prompt-older: "{{ site.data.label.post.button.previous }}";
$prompt-newer: "{{ site.data.label.post.button.next }}";
@mixin btn-sharing-color($light-color, $important: false) { @mixin btn-sharing-color($light-color, $important: false) {
@if $important { @if $important {
@@ -34,15 +23,17 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
padding-right: $pr; padding-right: $pr;
} }
.post .post-meta { #post-wrapper .post-meta {
> div:nth-child(2) { > div:nth-child(2) {
> span:not(:first-child)::before { > span:not(:first-child)::before {
@include dot; @include dot;
} }
} }
#pv::after { #pv::after {
content: " views"; content: " views";
} }
.readtime::after { .readtime::after {
content: " read"; content: " read";
} }
@@ -100,27 +91,22 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
white-space: normal; white-space: normal;
} }
a, span { a {
&::before { &::before {
color: var(--text-muted-color); color: var(--text-muted-color);
font-size: 0.65rem; font-size: 0.65rem;
text-transform: uppercase; text-transform: uppercase;
content: attr(prompt);
} }
&:first-child { &:first-child {
border-top-right-radius: 0; border-top-right-radius: 0;
border-bottom-right-radius: 0; border-bottom-right-radius: 0;
left: 0.5px; left: 0.5px;
&::before {
content: $prompt-older
}
} }
&:last-child { &:last-child {
border-top-left-radius: 0; border-top-left-radius: 0;
border-bottom-left-radius: 0; border-bottom-left-radius: 0;
right: 0.5px; right: 0.5px;
&::before {
content: $prompt-newer
}
} }
} }
} // .post-navigation } // .post-navigation
@@ -312,16 +298,26 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
margin-top: 1rem; margin-top: 1rem;
} }
} }
.post-content > div[class^='language-'] {
@include ml-mr(-1.25rem);
border-radius: 0;
&::before { // the lang badge
right: 1rem;
}
}
} }
@media all and (max-width: 768px) { @media all and (max-width: 768px) {
.post img { .post-content > p > img {
max-width: calc(100% + 1rem); max-width: calc(100% + 1rem);
} }
} }
@media all and (min-width: 768px) { @media all and (min-width: 768px) {
.post { #post-wrapper {
.post-meta { .post-meta {
>div:not(:first-child)::before { >div:not(:first-child)::before {
@include dot(0.5rem, 0.2rem); @include dot(0.5rem, 0.2rem);

View File

@@ -1,13 +1,6 @@
--- /*
# Styles for Tab Tags Styles for Tab Tags
# v2.0 */
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2019 Cotes Chung
# MIT License
---
{% include_relative _addon/main.scss %}
.tag { .tag {
border-radius: 0.7em; border-radius: 0.7em;

View File

@@ -2,12 +2,6 @@
title: About title: About
icon: fas fa-info icon: fas fa-info
order: 4 order: 4
# The About page
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT License
--- ---

4
app.js
View File

@@ -1,9 +1,5 @@
--- ---
layout: compress layout: compress
# Chirpy v2.2
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT Licensed
--- ---
/* Registering Service Worker */ /* Registering Service Worker */

View File

@@ -1,4 +0,0 @@
/*!
* Bootstrap Table of Contents v1.0.1 (http://afeld.github.io/bootstrap-toc/)
* Copyright 2015 Aidan Feldman
* Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */nav[data-toggle=toc] .nav>li>a{display:block;padding:4px 20px;font-size:13px;font-weight:500;color:#767676}nav[data-toggle=toc] .nav>li>a:focus,nav[data-toggle=toc] .nav>li>a:hover{padding-left:19px;color:#563d7c;text-decoration:none;background-color:transparent;border-left:1px solid #563d7c}nav[data-toggle=toc] .nav-link.active,nav[data-toggle=toc] .nav-link.active:focus,nav[data-toggle=toc] .nav-link.active:hover{padding-left:18px;font-weight:700;color:#563d7c;background-color:transparent;border-left:2px solid #563d7c}nav[data-toggle=toc] .nav-link+ul{display:none;padding-bottom:10px}nav[data-toggle=toc] .nav .nav>li>a{padding-top:1px;padding-bottom:1px;padding-left:30px;font-size:12px;font-weight:400}nav[data-toggle=toc] .nav .nav>li>a:focus,nav[data-toggle=toc] .nav .nav>li>a:hover{padding-left:29px}nav[data-toggle=toc] .nav .nav>li>.active,nav[data-toggle=toc] .nav .nav>li>.active:focus,nav[data-toggle=toc] .nav .nav>li>.active:hover{padding-left:28px;font-weight:500}nav[data-toggle=toc] .nav-link.active+ul{display:block}

View File

@@ -1,10 +0,0 @@
---
# The default style for layout Page
# v2.2
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT License
---
{% include_relative _addon/main.scss %}
{% include_relative _addon/syntax.scss %}

7
assets/css/style.scss Normal file
View File

@@ -0,0 +1,7 @@
---
---
// see: /_sass/addon/commons.scss
$tab-count: {{ site.tabs | size | plus: 1 }}; // plus 1 for home tab
@import "jekyll-theme-chirpy";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

5
assets/js/.copyright Normal file
View File

@@ -0,0 +1,5 @@
/*!
* Chirpy v3.0.1 (https://github.com/cotes2020/jekyll-theme-chirpy/)
* © 2021 Cotes Chung
* MIT Licensed
*/

View File

@@ -1,23 +0,0 @@
/*!
Aggregation of common JS.
Chirpy@2.3
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT License
*/
{% include_relative _commons/back-to-top.js %}
{% include_relative _commons/search-display.js %}
{% include_relative _commons/sidebar.js %}
{% include_relative _commons/topbar-switch.js %}
{% include_relative _commons/topbar-title.js %}
{% include_relative _commons/copy-link.js %}
{% include_relative _commons/checkbox.js %}
{% include_relative _utils/tooltip-loader.js %}

View File

@@ -12,7 +12,9 @@ $(function() {
}); });
$("#back-to-top").click(() => { $("#back-to-top").click(() => {
$("body,html").scrollTop(0); $("body,html").animate({
scrollTop: 0
}, 800);
return false; return false;
}); });
}); });

View File

@@ -1,9 +1,5 @@
/* /*
* Copy current page url to clipboard. * Copy current page url to clipboard.
* v2.1
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2020 Cotes Chung
* MIT License
*/ */
function copyLink(url) { function copyLink(url) {
@@ -11,7 +7,7 @@ function copyLink(url) {
url = window.location.href; url = window.location.href;
} }
var $temp = $("<input>"); const $temp = $("<input>");
$("body").append($temp); $("body").append($temp);
$temp.val(url).select(); $temp.val(url).select();
document.execCommand("copy"); document.execCommand("copy");

View File

@@ -1,31 +1,27 @@
/* /*
* This script make #search-result-wrapper switch to unloaded or shown automatically. * This script make #search-result-wrapper switch to unloaded or shown automatically.
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2018-2019 Cotes Chung
* MIT License
*/ */
$(function() { $(function() {
var btnSbTrigger = $("#sidebar-trigger"); const btnSbTrigger = $("#sidebar-trigger");
var btnSearchTrigger = $("#search-trigger"); const btnSearchTrigger = $("#search-trigger");
var btnCancel = $("#search-cancel"); const btnCancel = $("#search-cancel");
var btnClear = $("#search-cleaner"); const btnClear = $("#search-cleaner");
var main = $("#main"); const main = $("#main");
var topbarTitle = $("#topbar-title"); const topbarTitle = $("#topbar-title");
var searchWrapper = $("#search-wrapper"); const searchWrapper = $("#search-wrapper");
var resultWrapper = $("#search-result-wrapper"); const resultWrapper = $("#search-result-wrapper");
var results = $("#search-results"); const results = $("#search-results");
var input = $("#search-input"); const input = $("#search-input");
var hints = $("#search-hints"); const hints = $("#search-hints");
/*--- Actions in small screens (Sidebar unloaded) ---*/ /*--- Actions in small screens (Sidebar unloaded) ---*/
var scrollBlocker = (function() { const scrollBlocker = (function () {
var offset = 0; let offset = 0;
return { return {
block() { block() {
offset = $(window).scrollTop(); offset = $(window).scrollTop();
@@ -39,7 +35,7 @@ $(function() {
}; };
}()); }());
var mobileSearchBar = (function() { const mobileSearchBar = (function () {
return { return {
on() { on() {
btnSbTrigger.addClass("unloaded"); btnSbTrigger.addClass("unloaded");
@@ -58,37 +54,37 @@ $(function() {
}; };
}()); }());
var resultSwitch = (function() { const resultSwitch = (function () {
var visable = false; let visible = false;
return { return {
on() { on() {
if (!visable) { if (!visible) {
resultWrapper.removeClass("unloaded"); resultWrapper.removeClass("unloaded");
main.addClass("hidden"); main.addClass("hidden");
visable = true; visible = true;
scrollBlocker.block(); scrollBlocker.block();
} }
}, },
off() { off() {
if (visable) { if (visible) {
results.empty(); results.empty();
if (hints.hasClass("unloaded")) { if (hints.hasClass("unloaded")) {
hints.removeClass("unloaded"); hints.removeClass("unloaded");
} }
resultWrapper.addClass("unloaded"); resultWrapper.addClass("unloaded");
btnClear.removeClass("visable"); btnClear.removeClass("visible");
main.removeClass("hidden"); main.removeClass("hidden");
input.val(""); input.val("");
visable = false; visible = false;
scrollBlocker.release(); scrollBlocker.release();
} }
}, },
isVisable() { isVisible() {
return visable; return visible;
} }
}; };
@@ -130,7 +126,7 @@ $(function() {
resultSwitch.on(); resultSwitch.on();
if (!btnClear.hasClass("visible")) { if (!btnClear.hasClass("visible")) {
btnClear.addClass("visable"); btnClear.addClass("visible");
} }
if (isMobileView()) { if (isMobileView()) {
@@ -149,7 +145,7 @@ $(function() {
resultSwitch.off(); resultSwitch.off();
} }
input.focus(); input.focus();
btnClear.removeClass("visable"); btnClear.removeClass("visible");
}); });
}); });

View File

@@ -1,17 +1,13 @@
/** /**
* Expand or close the sidebar in mobile screens. * Expand or close the sidebar in mobile screens.
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2018-2019 Cotes Chung
* MIT License
*/ */
$(function() { $(function() {
var sidebarUtil = (function() { const sidebarUtil = (function () {
const ATTR_DISPLAY = "sidebar-display"; const ATTR_DISPLAY = "sidebar-display";
var isExpanded = false; let isExpanded = false;
var body = $("body"); const body = $("body");
return { return {
toggle() { toggle() {

View File

@@ -1,9 +1,5 @@
/** /**
* Initial Bootstrap Tooltip. * Initial Bootstrap Tooltip.
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2019 Cotes Chung
* MIT License
*/ */
$(function () { $(function () {
$("[data-toggle=\"tooltip\"]").tooltip(); $("[data-toggle=\"tooltip\"]").tooltip();

View File

@@ -1,17 +1,19 @@
/* /*
* Hide Header on scroll down * Hide Header on scroll down
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2018-2019 Cotes Chung
* MIT License
*/ */
$(function() { $(function() {
var didScroll; const topbarWrapper = $("#topbar-wrapper");
var lastScrollTop = 0; const toc = $("#toc-wrapper");
var delta = 5; const access = $(".access");
var topbarHeight = $("#topbar-wrapper").outerHeight(); const searchInput = $("#search-input");
let didScroll;
let lastScrollTop = 0;
const delta = 5;
const topbarHeight = topbarWrapper.outerHeight();
function hasScrolled() { function hasScrolled() {
var st = $(this).scrollTop(); var st = $(this).scrollTop();
@@ -23,30 +25,28 @@ $(function() {
if (st > lastScrollTop && st > topbarHeight) { if (st > lastScrollTop && st > topbarHeight) {
/* Scroll Down */ /* Scroll Down */
$("#topbar-wrapper").removeClass("topbar-down").addClass("topbar-up"); topbarWrapper.removeClass("topbar-down").addClass("topbar-up");
if ($("#toc-wrapper").length > 0) { if (toc.length > 0) {
$("#toc-wrapper").removeClass("topbar-down"); toc.removeClass("topbar-down");
} }
if ($(".access").length > 0) { if (access.length > 0) {
$(".access").removeClass("topbar-down"); access.removeClass("topbar-down");
} }
if ($("#search-input").is(":focus")) { if (searchInput.is(":focus")) {
$("#search-input").blur(); /* remove focus */ searchInput.blur(); /* remove focus */
} }
} else { } else if (st + $(window).height() < $(document).height()) {
/* Scroll Up */ /* Scroll Up */
if (st + $(window).height() < $(document).height()) { topbarWrapper.removeClass("topbar-up").addClass("topbar-down");
$("#topbar-wrapper").removeClass("topbar-up").addClass("topbar-down"); if (toc.length > 0) {
if ($("#toc-wrapper").length > 0) { toc.addClass("topbar-down");
$("#toc-wrapper").addClass("topbar-down");
}
if ($(".access").length > 0) {
$(".access").addClass("topbar-down");
} }
if (access.length > 0) {
access.addClass("topbar-down");
} }
} }

View File

@@ -1,16 +1,16 @@
/* /*
* Top bar title auto change while scrolling in mobile screens. * Top bar title auto change while scrolling in mobile screens.
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2018-2019 Cotes Chung
* MIT License
*/ */
$(function() { $(function() {
var DEFAULT = $("#topbar-title").text().trim(); const topbarTitle = $("#topbar-title");
var title = ($("div.post>h1").length > 0) ? const postTitle = $("div.post>h1");
$("div.post>h1").text().trim() : $("h1").text().trim();
const DEFAULT = topbarTitle.text().trim();
let title = (postTitle.length > 0) ?
postTitle.text().trim() : $("h1").text().trim();
if ($("#page-category").length || $("#page-tag").length) { if ($("#page-category").length || $("#page-tag").length) {
/* The title in Category or Tag page will be "<title> <count_of_posts>" */ /* The title in Category or Tag page will be "<title> <count_of_posts>" */
@@ -22,25 +22,25 @@ $(function() {
/* Replace topbar title while scroll screens. */ /* Replace topbar title while scroll screens. */
$(window).scroll(function () { $(window).scroll(function () {
if ($("#post-list").length /* in Home page */ if ($("#post-list").length /* in Home page */
|| $("div.post>h1").is(":hidden") /* is tab pages */ || postTitle.is(":hidden") /* is tab pages */
|| $("#topbar-title").is(":hidden") /* not mobile screens */ || topbarTitle.is(":hidden") /* not mobile screens */
|| $("#sidebar.sidebar-expand").length) { /* when the sidebar trigger is clicked */ || $("#sidebar.sidebar-expand").length) { /* when the sidebar trigger is clicked */
return false; return false;
} }
if ($(this).scrollTop() >= 95) { if ($(this).scrollTop() >= 95) {
if ($("#topbar-title").text() !== title) { if (topbarTitle.text() !== title) {
$("#topbar-title").text(title); topbarTitle.text(title);
} }
} else { } else {
if ($("#topbar-title").text() !== DEFAULT) { if (topbarTitle.text() !== DEFAULT) {
$("#topbar-title").text(DEFAULT); topbarTitle.text(DEFAULT);
} }
} }
}); });
/* Click title remove hover effect. */ /* Click title remove hover effect. */
$("#topbar-title").click(function() { topbarTitle.click(function() {
$("body,html").animate({scrollTop: 0}, 800); $("body,html").animate({scrollTop: 0}, 800);
}); });

View File

@@ -1,22 +0,0 @@
/*!
JS group for layout Home or Post
Chirpy v2.3
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT License
*/
{% include_relative _commons.js %}
{% include_relative _utils/timeago.js %}
{% if site.google_analytics.pv.enabled %}
{% include_relative _pv-config.js %}
{% include_relative _utils/pageviews.js %}
{% include_relative lib/_countUp.min.js %}
{% endif %}

View File

@@ -1,14 +0,0 @@
/*!
PV configuration and Javascript conversion.
*/
const proxyEndpoint = "{{ site.google_analytics.pv.proxy_endpoint }}";
{% if site.google_analytics.pv.cache and site.google_analytics.pv.enabled %}
{% assign enabled = true %}
{% else %}
{% assign enabled = false %}
{% endif %}
const pvCacheEnabled = {{ enabled }};

View File

@@ -1,32 +1,29 @@
/* /*
* Tab 'Categories' expand/close effect. * Tab 'Categories' expand/close effect.
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2018-2019 Cotes Chung
* MIT License
*/ */
$(function() { $(function() {
var childPrefix = "l_"; const childPrefix = "l_";
var parentPrefix = "h_"; const parentPrefix = "h_";
const collapse = $(".collapse");
/* close up top-category */ /* close up top-category */
$(".collapse").on("hide.bs.collapse", function() { /* Bootstrap collapse events. */ collapse.on("hide.bs.collapse", function () { /* Bootstrap collapse events. */
var parentId = parentPrefix + $(this).attr("id").substring(childPrefix.length); const parentId = parentPrefix + $(this).attr("id").substring(childPrefix.length);
if (parentId) { if (parentId) {
$("#" + parentId + " .far.fa-folder-open").attr("class", "far fa-folder fa-fw"); $(`#${parentId} .far.fa-folder-open`).attr("class", "far fa-folder fa-fw");
$("#" + parentId + " i.fas").addClass("rotate"); $(`#${parentId} i.fas`).addClass("rotate");
$("#" + parentId).removeClass("hide-border-bottom"); $(`#${parentId}`).removeClass("hide-border-bottom");
} }
}); });
/* expand the top category */ /* expand the top category */
$(".collapse").on("show.bs.collapse", function() { collapse.on("show.bs.collapse", function() {
var parentId = parentPrefix + $(this).attr("id").substring(childPrefix.length); const parentId = parentPrefix + $(this).attr("id").substring(childPrefix.length);
if (parentId) { if (parentId) {
$("#" + parentId + " .far.fa-folder").attr("class", "far fa-folder-open fa-fw"); $(`#${parentId} .far.fa-folder`).attr("class", "far fa-folder-open fa-fw");
$("#" + parentId + " i.fas").removeClass("rotate"); $(`#${parentId} i.fas`).removeClass("rotate");
$("#" + parentId).addClass("hide-border-bottom"); $(`#${parentId}`).addClass("hide-border-bottom");
} }
}); });

View File

@@ -1,16 +1,8 @@
/* /*
* Find out the <a> tag contains an image and mark it. * Find out the <a> tag contains an image and mark it.
*
* v2.5.1
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2020 Cotes Chung
* MIT Licensed
*/ */
$(function() { $(function() {
const MARK = "img-hyperlink";
var MARK="img-hyperlink";
$("a:has(img)").addClass(MARK); $("a:has(img)").addClass(MARK);
}); });

View File

@@ -7,11 +7,11 @@ $(function() {
const regex = new RegExp(`^${prefix}([a-z])+$`); const regex = new RegExp(`^${prefix}([a-z])+$`);
$(`div[class^=${prefix}`).each(function() { $(`div[class^=${prefix}`).each(function() {
let clzsses = $(this).attr("class").split(" "); let classes = $(this).attr("class").split(" ");
clzsses.forEach((clzss) => { classes.forEach((_class) => {
if (regex.test(clzss)) { if (regex.test(_class)) {
let lang = clzss.substring(prefix.length); let lang = _class.substring(prefix.length);
$(this).attr("lang", `${lang}`); $(this).attr("lang", `${lang}`);
} }
}); });

View File

@@ -1,18 +1,13 @@
/** /*
* Count page views form GA or local cache file. * Count page views form GA or local cache file.
* *
* Dependences: * Dependencies:
* - jQuery * - jQuery
* - countUp.js <https://github.com/inorganik/countUp.js> * - countUp.js <https://github.com/inorganik/countUp.js>
*
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2018-2019 Cotes Chung
* MIT License
*/ */
var getInitStatus = (function () { const getInitStatus = (function () {
var hasInit = false; let hasInit = false;
return () => { return () => {
let ret = hasInit; let ret = hasInit;
if (!hasInit) { if (!hasInit) {
@@ -22,13 +17,26 @@ var getInitStatus = (function () {
}; };
}()); }());
const PvOpts = (function () {
return {
isEnabled() {
return "true" === $("meta[name=pv-cache-enabled]").attr("content");
},
getProxyEndpoint() {
return $("meta[name=pv-proxy-endpoint]").attr("content");
},
getLocalData() {
return $("meta[name=pv-cache-data]").attr("content");
}
}
}());
var PvCache = (function () { const PvCache = (function () {
const KEY_PV = "pv"; const KEY_PV = "pv";
const KEY_CREATION = "pv_created_date"; const KEY_CREATION = "pv_created_date";
const KEY_PV_SRC = "pv_source"; const KEY_PV_SRC = "pv_source";
var Source = { const Source = {
ORIGIN: "origin", ORIGIN: "origin",
PROXY: "proxy" PROXY: "proxy"
}; };
@@ -43,6 +51,7 @@ var PvCache = (function () {
return { return {
getData() { getData() {
// get data from browser cache
return JSON.parse(localStorage.getItem(KEY_PV)); return JSON.parse(localStorage.getItem(KEY_PV));
}, },
saveOriginCache(pv) { saveOriginCache(pv) {
@@ -74,11 +83,11 @@ var PvCache = (function () {
} }
return false; return false;
}, },
getAllPagevies() { getAllPageviews() {
return PvCache.getData().totalsForAllResults["ga:pageviews"]; return PvCache.getData().totalsForAllResults["ga:pageviews"];
}, },
newerThan(pv) { newerThan(pv) {
return PvCache.getAllPagevies() > pv.totalsForAllResults["ga:pageviews"]; return PvCache.getAllPageviews() > pv.totalsForAllResults["ga:pageviews"];
}, },
inspectKeys() { inspectKeys() {
if (localStorage.getItem(KEY_PV) === null if (localStorage.getItem(KEY_PV) === null
@@ -91,9 +100,10 @@ var PvCache = (function () {
}()); /* PvCache */ }()); /* PvCache */
function countUp(min, max, destId) { function countUp(min, max, destId) {
if (min < max) { if (min < max) {
var numAnim = new CountUp(destId, min, max); let numAnim = new CountUp(destId, min, max);
if (!numAnim.error) { if (!numAnim.error) {
numAnim.start(); numAnim.start();
} else { } else {
@@ -104,11 +114,11 @@ function countUp(min, max, destId) {
function countPV(path, rows) { function countPV(path, rows) {
var count = 0; let count = 0;
if (typeof rows !== "undefined" ) { if (typeof rows !== "undefined" ) {
for (var i = 0; i < rows.length; ++i) { for (let i = 0; i < rows.length; ++i) {
var gaPath = rows[parseInt(i, 10)][0]; const gaPath = rows[parseInt(i, 10)][0];
if (gaPath === path) { /* path format see: site.permalink */ if (gaPath === path) { /* path format see: site.permalink */
count += parseInt(rows[parseInt(i, 10)][1], 10); count += parseInt(rows[parseInt(i, 10)][1], 10);
break; break;
@@ -121,13 +131,13 @@ function countPV(path, rows) {
function tacklePV(rows, path, elem, hasInit) { function tacklePV(rows, path, elem, hasInit) {
var count = countPV(path, rows); let count = countPV(path, rows);
count = (count === 0 ? 1 : count); count = (count === 0 ? 1 : count);
if (!hasInit) { if (!hasInit) {
elem.text(new Intl.NumberFormat().format(count)); elem.text(new Intl.NumberFormat().format(count));
} else { } else {
var initCount = parseInt(elem.text().replace(/,/g, ""), 10); const initCount = parseInt(elem.text().replace(/,/g, ""), 10);
if (count > initCount) { if (count > initCount) {
countUp(initCount, count, elem.attr("id")); countUp(initCount, count, elem.attr("id"));
} }
@@ -140,17 +150,17 @@ function displayPageviews(data) {
return; return;
} }
var hasInit = getInitStatus(); let hasInit = getInitStatus();
var rows = data.rows; /* could be undefined */ const rows = data.rows; /* could be undefined */
if ($("#post-list").length > 0) { /* the Home page */ if ($("#post-list").length > 0) { /* the Home page */
$(".post-preview").each(function() { $(".post-preview").each(function() {
var path = $(this).find("a").attr("href"); const path = $(this).find("a").attr("href");
tacklePV(rows, path, $(this).find(".pageviews"), hasInit); tacklePV(rows, path, $(this).find(".pageviews"), hasInit);
}); });
} else if ($(".post").length > 0) { /* the post */ } else if ($(".post").length > 0) { /* the post */
var path = window.location.pathname; const path = window.location.pathname;
tacklePV(rows, path, $("#pv"), hasInit); tacklePV(rows, path, $("#pv"), hasInit);
} }
} }
@@ -159,7 +169,7 @@ function displayPageviews(data) {
function fetchProxyPageviews() { function fetchProxyPageviews() {
$.ajax({ $.ajax({
type: "GET", type: "GET",
url: proxyEndpoint, /* see: /assets/js/_pv-config.js */ url: PvOpts.getProxyEndpoint(),
dataType: "jsonp", dataType: "jsonp",
jsonpCallback: "displayPageviews", jsonpCallback: "displayPageviews",
success: (data, textStatus, jqXHR) => { success: (data, textStatus, jqXHR) => {
@@ -173,9 +183,8 @@ function fetchProxyPageviews() {
function fetchPageviews(fetchOrigin = true, filterOrigin = false) { function fetchPageviews(fetchOrigin = true, filterOrigin = false) {
/* pvCacheEnabled see: /assets/js/_pv-config.js */ if (PvOpts.isEnabled() && fetchOrigin) {
if (pvCacheEnabled && fetchOrigin) { fetch(PvOpts.getLocalData())
fetch("/assets/js/data/pageviews.json")
.then((response) => response.json()) .then((response) => response.json())
.then((data) => { .then((data) => {
if (filterOrigin) { if (filterOrigin) {
@@ -196,9 +205,7 @@ function fetchPageviews(fetchOrigin = true, filterOrigin = false) {
$(function() { $(function() {
if ($(".pageviews").length > 0) { if ($(".pageviews").length > 0) {
PvCache.inspectKeys(); PvCache.inspectKeys();
let cache = PvCache.getData(); let cache = PvCache.getData();

View File

@@ -0,0 +1,81 @@
/*
Safari doesn't support CSS `scroll-behavior: smooth`,
so here is a compatible solution for all browser to smooth scrolling
See: <https://css-tricks.com/snippets/jquery/smooth-scrolling/>
Warning: It must be called after all `<a>` tags (e.g., the dynamic TOC) are ready.
*/
$(function() {
$("a[href*='#']")
.not("[href='#']")
.not("[href='#0']")
.click(function(event) {
if (this.pathname.replace(/^\//, "") === location.pathname.replace(/^\//, "")) {
if (location.hostname === this.hostname) {
const REM = 16; /* 16px */
const hash = decodeURI(this.hash);
let isFnRef = RegExp(/^#fnref:/).test(hash);
let isFn = RegExp(/^#fn:/).test(hash);
let selector = hash.includes(":") ? hash.replace(/\:/, "\\:") : hash;
let target = $(selector);
if (target.length) {
event.preventDefault();
if (history.pushState) { /* add hash to URL */
history.pushState(null, null, hash);
}
let curOffset = $(this).offset().top;
let destOffset = target.offset().top;
const scrollUp = (destOffset < curOffset);
const topbarHeight = $("#topbar-wrapper").outerHeight();
if (scrollUp && isFnRef) {
/* Avoid the top-bar covering `fnref` when scrolling up
because `fnref` has no `%anchor`(see: module.scss) style. */
destOffset -= (topbarHeight + REM / 2);
}
$("html,body").animate({
scrollTop: destOffset
}, 800, () => {
const $target = $(target);
$target.focus();
const SCROLL_MARK = "scroll-focus";
/* clean up old scroll mark */
if ($(`[${SCROLL_MARK}=true]`).length) {
$(`[${SCROLL_MARK}=true]`).attr(SCROLL_MARK, false);
}
/* Clean :target links */
if ($(":target").length) { /* element that visited by the URL with hash */
$(":target").attr(SCROLL_MARK, false);
}
/* set scroll mark to footnotes */
if (isFn || isFnRef) {
$target.attr(SCROLL_MARK, true);
}
if ($target.is(":focus")) { /* Checking if the target was focused */
return false;
} else {
$target.attr("tabindex", "-1"); /* Adding tabindex for elements not focusable */
$target.focus(); /* Set focus again */
}
});
}
}
}
}); /* click() */
});

View File

@@ -1,16 +1,14 @@
/* /*
* Caculate the Timeago * Calculate the Timeago
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2019 Cotes Chung
* MIT Licensed
*/ */
$(function() { $(function() {
var toRefresh = $(".timeago").length; const timeagoElem = $(".timeago");
var intervalId = void 0; let toRefresh = timeagoElem.length;
let intervalId = void 0;
function timeago(iso, isLastmod) { function timeago(iso, isLastmod) {
let now = new Date(); let now = new Date();
@@ -57,10 +55,10 @@ $(function() {
function updateTimeago() { function updateTimeago() {
$(".timeago").each(function() { $(".timeago").each(function() {
if ($(this).children("i").length > 0) { if ($(this).children("i").length > 0) {
var basic = $(this).text(); $(this).text();
var isLastmod = $(this).hasClass("lastmod"); let isLastmod = $(this).hasClass("lastmod");
var node = $(this).children("i"); let node = $(this).children("i");
var date = node.text(); /* ISO Date: "YYYY-MM-DDTHH:MM:SSZ" */ let date = node.text(); /* ISO Date: "YYYY-MM-DDTHH:MM:SSZ" */
$(this).text(timeago(date, isLastmod)); $(this).text(timeago(date, isLastmod));
$(this).append(node); $(this).append(node);
} }

View File

@@ -1,14 +0,0 @@
/*
* Hide the empty ToC in posts.
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2019 Cotes Chung
* MIT Licensed
*/
$(function() {
if ($("#post-wrapper .post-content h1").length === 0
&& $("#post-wrapper .post-content h2").length === 0) {
$("#toc-wrapper").addClass("unloaded");
}
});

Some files were not shown because too many files have changed in this diff Show More