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

Compare commits

...

53 Commits

Author SHA1 Message Date
Cotes Chung
d7443aad5d Bump version to 3.1.0 2021-02-03 01:42:10 +08:00
Cotes Chung
b2beaa0f4c Update travis settings for release-branches
- drop the deprecated flag `--deployment` of bundle (so we have to specify the bundler caching path)
2021-02-03 00:46:36 +08:00
Cotes Chung
83a7878043 Improved bump tool to fit the release branches 2021-02-02 21:56:17 +08:00
Cotes Chung
94b99350fc Restore the prompt in the page nav button in the latest/oldest articles 2021-02-02 21:56:17 +08:00
Cotes Chung
6dc9cdfa25 Reduce the font size of the Disqus prompt 2021-02-02 21:56:17 +08:00
Cotes Chung
fa56ea48c3 Improve docs 2021-02-02 21:56:17 +08:00
dependabot-preview[bot]
7d3e25c90d Bump tzinfo-data from 1.2020.6 to 1.2021.1 (#272)
Bumps [tzinfo-data](https://github.com/tzinfo/tzinfo-data) from 1.2020.6 to 1.2021.1.
- [Release notes](https://github.com/tzinfo/tzinfo-data/releases)
- [Commits](https://github.com/tzinfo/tzinfo-data/compare/v1.2020.6...v1.2021.1)

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

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2021-02-01 19:33:45 +08:00
Cotes Chung
6c9ab6e5f8 Fix gemfile 2021-02-01 18:03:27 +08:00
Cotes Chung
91da99282d Add lang option to the site config sample 2021-02-01 17:38:50 +08:00
Cotes Chung
413a86277b Generate the breadcrumb by Liquid
also subtracted '/tabs/' from the tabs path
2021-01-31 22:06:10 +08:00
Cotes Chung
1879b94f3d Exclude gem-spec from output 2021-01-30 05:28:33 +08:00
Cotes Chung
7b5f7086b7 Fix post feature image style 2021-01-30 03:12:43 +08:00
Cotes Chung
a8b8a379f6 Improve the docs
- Add missing url references in the tutorial
- Add gem version badge in README
2021-01-30 02:00:34 +08:00
Bogdan Stoica
eacad65cbb Add alt attribute to the post's preview image (#271) 2021-01-30 01:14:03 +08:00
Cotes Chung
7a87ab4d05 Bump version to 3.0.3 2021-01-28 23:44:53 +08:00
Cotes Chung
c4be7c0cd6 Add more spec meta to gem 2021-01-28 23:39:03 +08:00
Cotes Chung
c9765e6923 Merge gem-build & bump tool
Drop the yard doc
2021-01-28 23:17:16 +08:00
Cotes Chung
5c04d4e45b Bypass the jekyll build on source branch 2021-01-28 20:56:23 +08:00
Cotes Chung
4d969ca0c5 Fix toc of readme 2021-01-28 20:56:23 +08:00
Cotes Chung
4a084eb681 Add new tool to build gem 2021-01-28 04:57:11 +08:00
Cotes Chung
adc117972a Fix the year of copyright 2021-01-28 03:37:08 +08:00
Cotes Chung
8e84c6b9d6 Improve code style
- js/css
- markdown
- shell
2021-01-28 03:21:58 +08:00
Cotes Chung
d8a42d9bb4 Bump version to 3.0.2 2021-01-27 03:41:12 +08:00
Cotes Chung
c1b20d8f71 Fix bump tool 2021-01-27 03:40:17 +08:00
Cotes Chung
08ce9f6c7c Fix typo of docs 2021-01-27 03:13:26 +08:00
Cotes Chung
0b4e40bcdf Fix footer links 2021-01-27 02:51:50 +08:00
Cotes Chung
9ae2aee222 Improve the gh-actions CD script 2021-01-26 23:26:03 +08:00
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
127 changed files with 2320 additions and 1962 deletions

View File

@@ -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."

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

@@ -4,19 +4,29 @@ dist: bionic
language: ruby language: ruby
rvm: 2.7.0 rvm: 2.7.0
cache: bundler cache:
directories:
- $TRAVIS_BUILD_DIR/vendor/bundle
before_install:
- gem install bundler:2.2.4 # match the Gemfile.lock, travis' bundle is 2.1.2
- bundle config path 'vendor/bundle'
install:
# overriding to drop the travis `--development` flag
- bundle install --jobs=3 --retry=3
addons: addons:
apt: apt:
packages: packages:
- libcurl4-openssl-dev # required to avoid SSL error (for htmlproofer) - libcurl4-openssl-dev # required to avoid SSL error (for htmlproofer)
script: script:
- git -C "$HOME" clone "$BUILDER_REPO" --depth=1 -q - git -C "$HOME" clone "$BUILDER_REPO" --depth=1 -q
- eval "$BUILD_CMD" - eval "$BUILD_CMD"
branches: branches:
only: production only: /.*-stable$/
git: git:
depth: false # for posts lastmod depth: false # for posts lastmod

View File

@@ -1,19 +1,11 @@
--- ---
# 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/
- /categories/
- /tags/
- /posts/ - /posts/
dynamic_title: true dynamic_title: true
@@ -21,5 +13,9 @@ dynamic_title: true
<div class="lead"> <div class="lead">
<p>Sorry, we've misplaced that URL or it's pointing to something that doesn't exist. </p> <p>Sorry, we've misplaced that URL or it's pointing to something that doesn't exist. </p>
<p><a href="{{ site.baseurl }}/">Head back Home</a> to try finding it again, or search for it on the <a href="{{ site.baseurl }}/tabs/archives">Archives page</a>.</p> <p>
</div> <a href="{{ '/' | relative_url }}">Head back Home</a>
to try finding it again, or search for it on the
<a href="{{ 'archives' | relative_url }}">Archives page</a>.
</p>
</div>

15
Gemfile
View File

@@ -1,18 +1,11 @@
# frozen_string_literal: true
source "https://rubygems.org" source "https://rubygems.org"
gem "jekyll", ">= 4.1.0", "< 5.0" gemspec
# plugins
group :jekyll_plugins do
gem "jekyll-paginate"
gem "jekyll-redirect-from"
gem "jekyll-seo-tag"
gem "jekyll-archives"
gem "jekyll-sitemap"
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

@@ -1,10 +1,21 @@
PATH
remote: .
specs:
jekyll-theme-chirpy (3.0.3)
jekyll (~> 4.1)
jekyll-archives (~> 2.2)
jekyll-paginate (~> 1.1)
jekyll-redirect-from (~> 0.16)
jekyll-seo-tag (~> 2.7)
jekyll-sitemap (~> 1.4)
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
addressable (2.7.0) addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0) public_suffix (>= 2.0.2, < 5.0)
colorator (1.1.0) colorator (1.1.0)
concurrent-ruby (1.1.7) concurrent-ruby (1.1.8)
em-websocket (0.5.2) em-websocket (0.5.2)
eventmachine (>= 0.12.9) eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0) http_parser.rb (~> 0.6.0)
@@ -13,7 +24,7 @@ GEM
eventmachine (1.2.7) eventmachine (1.2.7)
ffi (1.14.2) ffi (1.14.2)
forwardable-extended (2.6.0) forwardable-extended (2.6.0)
html-proofer (3.18.3) html-proofer (3.18.5)
addressable (~> 2.3) addressable (~> 2.3)
mercenary (~> 0.3) mercenary (~> 0.3)
nokogumbo (~> 2.0) nokogumbo (~> 2.0)
@@ -22,7 +33,7 @@ GEM
typhoeus (~> 1.3) typhoeus (~> 1.3)
yell (~> 2.0) yell (~> 2.0)
http_parser.rb (0.6.0) http_parser.rb (0.6.0)
i18n (1.8.5) i18n (1.8.7)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
jekyll (4.2.0) jekyll (4.2.0)
addressable (~> 2.4) addressable (~> 2.4)
@@ -57,19 +68,19 @@ GEM
kramdown-parser-gfm (1.1.0) kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0) kramdown (~> 2.0)
liquid (4.0.3) liquid (4.0.3)
listen (3.3.3) listen (3.4.1)
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) nokogiri (1.11.1-x86_64-darwin)
nokogiri (1.10.10) racc (~> 1.4)
mini_portile2 (~> 2.4.0)
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)
@@ -86,26 +97,21 @@ GEM
ethon (>= 0.9.0) ethon (>= 0.9.0)
tzinfo (1.2.9) tzinfo (1.2.9)
thread_safe (~> 0.1) thread_safe (~> 0.1)
tzinfo-data (1.2020.6) tzinfo-data (1.2021.1)
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)
yell (2.2.2) yell (2.2.2)
PLATFORMS PLATFORMS
ruby x86_64-darwin-20
DEPENDENCIES DEPENDENCIES
html-proofer html-proofer (~> 3.18)
jekyll (>= 4.1.0, < 5.0) jekyll-theme-chirpy!
jekyll-archives
jekyll-paginate
jekyll-redirect-from
jekyll-seo-tag
jekyll-sitemap
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

121
README.md
View File

@@ -1,21 +1,24 @@
# 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)
[![Gem Version](https://img.shields.io/gem/v/jekyll-theme-chirpy?color=brightgreen)](https://rubygems.org/gems/jekyll-theme-chirpy)
[![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)
[![GitHub license](https://img.shields.io/github/license/cotes2020/jekyll-theme-chirpy.svg)](https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/LICENSE) [![GitHub license](https://img.shields.io/github/license/cotes2020/jekyll-theme-chirpy.svg?color=blue)](https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/LICENSE)
[![996.icu](https://img.shields.io/badge/link-996.icu-%23FF4D5B.svg)](https://996.icu) [![996.icu](https://img.shields.io/badge/link-996.icu-%23FF4D5B.svg)](https://996.icu)
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)
- [Prerequisites](#prerequisites)
- [Installation](#installation) - [Installation](#installation)
- [Usage](#usage) - [Usage](#usage)
- [Documentation](#documentation)
- [Contributing](#contributing) - [Contributing](#contributing)
- [Credits](#credits) - [Credits](#credits)
- [Supporting](#supporting) - [Supporting](#supporting)
@@ -39,50 +42,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** - Easy to upgrade, isolate irrelevant project files so you can focus on writing.
$ git clone https://github.com/USERNAME/USERNAME.github.io.git -b master --single-branch - **Fork from GitHub** - Convenient for custom development, but difficult to upgrade, only suitable for web developers.
### 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 required files from the theme's gem (for detailed files, see [starter project][starter]) to your Jekyll site.
### Initialization > **Hint**: To locate the installed 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 files from theme's gem. We have prepared everything for you there!
### 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:
1. Remove some files or directories from your repository: 1. Remove some files or directories from your repository:
- `.travis.yml` - `.travis.yml`
- files under `_posts` - files under `_posts`
- folder `docs` - folder `docs`
@@ -91,28 +112,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` - `lang`
### 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 +140,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 choose ONE of the following methods to deploy your Jekyll site.
#### 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. Quickly check the files needed for GitHub Actions build:
- 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.
- Ensuer your Jekyll site has file `tools/test.sh` and `tools/deploy.sh`. Otherwise, copy them from this repo to your Jekyll site.
And then rename your repoistory to `<GH-USERNAME>.github.io` on GitHub.
Now publish your Jekyll 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 +179,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 +191,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 +205,10 @@ 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]
## 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.
@@ -181,3 +216,9 @@ If you enjoy this theme or find it helpful, please consider becoming my sponsor,
## License ## License
This work is published under [MIT](https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/LICENSE) License. This work is published under [MIT](https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/LICENSE) License.
[starter]: https://github.com/cotes2020/chirpy-starter
[use-starter]: https://github.com/cotes2020/chirpy-starter/generate
[workflow]: https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/.github/workflows/pages-deploy.yml.hook
[jb]: https://www.jetbrains.com/?from=jekyll-theme-chirpy

View File

@@ -1,28 +1,34 @@
# The Site Settings # The Site Configuration
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2017-2019 Cotes Chung
# MIT licensed
# Import the theme
theme: jekyll-theme-chirpy
# Only if your site type is GitHub Project sites and doesn't have a custom domain,
# change below value to '/projectname'.
baseurl: ''
# the HTML language tag https://www.w3.org/International/questions/qa-choosing-language-tags
lang: en-US
# Change to your timezone http://www.timezoneconverter.com/cgi-bin/findzone/findzone
timezone: Asia/Shanghai
# 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
@@ -43,14 +49,6 @@ social:
google_site_verification: google_meta_tag_verification # change to your verification string google_site_verification: google_meta_tag_verification # change to your verification string
# -------------------------- # --------------------------
# Only if your site type is GitHub Project sites and doesn't have a custom domain,
# change below value to '/projectname'.
baseurl: ''
# Change to your timezone http://www.timezoneconverter.com/cgi-bin/findzone/findzone
timezone: Asia/Shanghai
google_analytics: google_analytics:
id: '' # Fill with your Google Analytics ID id: '' # Fill with your Google Analytics ID
pv: pv:
@@ -62,11 +60,6 @@ google_analytics:
proxy_endpoint: '' proxy_endpoint: ''
cache: false # pv data local cache, good for the users from GFW area. cache: false # pv data local cache, good for the users from GFW area.
disqus:
comments: false # boolean type, the global switch for posts comments.
shortname: '' # Fill with your Disqus shortname. https://help.disqus.com/en/articles/1717111-what-s-a-shortname
# Prefer color scheme setting. # Prefer color scheme setting.
# #
# Note: Keep empty will follow the system prefer color by default, # Note: Keep empty will follow the system prefer color by default,
@@ -76,16 +69,31 @@ disqus:
# Available options: # Available options:
# #
# light - Use the light color scheme # light - Use the light color scheme
#
# 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
disqus:
comments: false # boolean type, the global switch for posts comments.
shortname: '' # Fill with your Disqus shortname. https://help.disqus.com/en/articles/1717111-what-s-a-shortname
paginate: 10 paginate: 10
# ------------ The following options are not recommended to be modified ------------------
kramdown: kramdown:
syntax_highlighter: rouge syntax_highlighter: rouge
syntax_highlighter_opts: # Rouge Options https://github.com/jneen/rouge#full-options syntax_highlighter_opts: # Rouge Options https://github.com/jneen/rouge#full-options
@@ -98,7 +106,7 @@ kramdown:
start_line: 1 start_line: 1
# DO NOT change this unless you're a Pro user on Jekyll and Web development, # DO NOT change this unless you're a Pro user on Jekyll and Web development,
# or you think you're smart enough to change other relevant URLs within this template. # Or you think you're smart enough to change other relevant URLs within this template.
permalink: /posts/:title/ permalink: /posts/:title/
collections: collections:
@@ -116,58 +124,21 @@ defaults:
layout: post layout: post
comments: true # Enable comments in posts. comments: true # Enable comments in posts.
toc: true # Display TOC column in posts. toc: true # Display TOC column in posts.
breadcrumb:
-
label: Posts
url: /
- -
scope: scope:
path: _drafts path: _drafts
values: values:
comments: false comments: false
-
scope:
path: index.html
values:
breadcrumb:
-
label: Posts
-
scope:
path: tags
values:
breadcrumb:
-
label: Home
url: /
-
label: Tags
url: /tabs/tags/
-
scope:
path: categories
values:
breadcrumb:
-
label: Home
url: /
-
label: Categories
url: /tabs/categories/
- -
scope: scope:
path: '' path: ''
type: tabs # see `site.collections` type: tabs # see `site.collections`
values: values:
layout: page layout: page
permalink: /:title/
dynamic_title: true # Hide title in mobile screens. dynamic_title: true # Hide title in mobile screens.
breadcrumb:
-
label: Home
url: /
sass: sass:
sass_dir: /assets/css
style: compressed style: compressed
compress_html: compress_html:
@@ -181,12 +152,17 @@ compress_html:
exclude: exclude:
- vendor - vendor
- Gemfile.lock
- Gemfile - Gemfile
- Gemfile.lock
- jekyll-theme-chirpy.gemspec
- tools - tools
- 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,10 +7,13 @@ panel:
post: post:
relate_posts: Further Reading relate_posts: Further Reading
share: Share
button: button:
next: Newer next: Newer
previous: Older previous: Older
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.2
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
@@ -14,4 +8,4 @@ brief: Some rights reserved.
verbose: >- verbose: >-
Except where otherwise noted, the blog posts on this site are licensed Except where otherwise noted, the blog posts on this site are licensed
under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author. under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.

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' %} {% if site.toc and page.toc %}
{% assign style = 'category-tag' %} <link rel="stylesheet"
{% else %} href="https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@1.0.1/dist/bootstrap-toc.min.css">
{% 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 %}
<link rel="preload" as="style" href="{{ '/assets/css/lib/bootstrap-toc.min.css' | relative_url }}">
<link rel="stylesheet" href="{{ '/assets/css/lib/bootstrap-toc.min.css' | relative_url }}" />
{% endif %}
{% endif %} {% endif %}

View File

@@ -1,28 +1,25 @@
<!-- <!--
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 small 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 }}';
} }
}; };
$.disqusLoader('#disqus', options); $.disqusLoader('#disqus', options);
</script> </script>

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">
@@ -24,7 +20,8 @@
Powered by Powered by
<a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a> <a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a>
with with
<a href="{{ site.data.meta.homepage }}" target="_blank" rel="noopener">{{ site.data.meta.name }}</a> <a href="https://github.com/cotes2020/jekyll-theme-chirpy"
target="_blank" rel="noopener">Chirpy</a>
theme. theme.
</p> </p>
</div> </div>

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 %}
@@ -48,9 +44,11 @@
</div> <!-- .access --> </div> <!-- .access -->
{% if include.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,31 +1,30 @@
<!-- <!--
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 %}
<span class="btn btn-outline-primary disabled"> <span class="btn btn-outline-primary disabled"
prompt="{{ site.data.label.post.button.previous | default: 'previous' }}">
<p>-</p> <p>-</p>
</span> </span>
{% 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 %}
<span class="btn btn-outline-primary disabled"> <span class="btn btn-outline-primary disabled"
prompt="{{ site.data.label.post.button.next | default: 'next' }}">
<p>-</p> <p>-</p>
</span> </span>
{% endif %} {% endif %}
</div> </div>

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,8 +21,8 @@
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 }}'
}); });
</script> </script>

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,27 +1,27 @@
<!-- <!--
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>
</span> </span>

View File

@@ -1,28 +1,46 @@
<!-- <!--
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">
{% for item in page.breadcrumb %}
{% if item.url %} {% assign paths = page.url | split: '/' %}
{% if paths.size == 0 %}
<!-- index page -->
<span>{{ 'Posts' }}</span>
{% else %}
{% for item in paths %}
{% if forloop.first %}
{% unless page.layout == 'post' %}
<span>
<a href="{{ '/' | relative_url }}">{{ 'Home' }}</a>
</span>
{% endunless %}
{% elsif forloop.last %}
<span>{{ page.title }}</span>
{% else %}
<span> <span>
<a href="{{ site.baseurl }}{{ item.url | remove: '.html'}}"> {% assign url = item %}
{{ item.label }} {% if item == 'posts' and page.layout == 'post' %}
{% assign url = '/' %}
{% endif %}
<a href="{{ url | relative_url }}">
{{ item | capitalize }}
</a> </a>
</span> </span>
{% else %}
<span>{{ item.label }}</span>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% unless page.layout == "home" %} {% endif %}
<span>{{ page.title }}</span>
{% endunless %}
</span><!-- endof #breadcrumb --> </span><!-- endof #breadcrumb -->
@@ -42,7 +60,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>
@@ -15,7 +11,7 @@ layout: compress
{% endif %} {% endif %}
{% endcapture %} {% endcapture %}
<html lang="{{ site.lang | split: "_" | first | default: "en" }}" {{ prefer_mode }}> <html lang="{{ site.lang | default: "en-US" }}" {{ prefer_mode }}>
{% include head.html %} {% include head.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
--- ---
@@ -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.src %}
<img src="{{ img_placehodler }}" data-src="{{ page.image }}" class="preview-img"> <img src="{{ page.image.src }}" class="preview-img" alt="{{ page.image.alt | default: "Preview Image" }}">
{% endif %} {% endif %}
<!-- Using lozad. See: <https://github.com/ApoorvSaxena/lozad.js#usage> --> {{ content }}
{% if content contains '<img src=' %}
{% assign replacement = '<img src="' | append: img_placehodler | append: '" data-src=' %}
{{ content | replace: '<img src=', replacement }}
{% else %}
{{ content }}
{% endif %}
</div> </div>
<div class="post-tail-wrapper text-muted"> <div class="post-tail-wrapper text-muted">
@@ -140,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,8 @@ categories: [Blogging, Demo]
tags: [typography] tags: [typography]
math: true math: true
mermaid: true mermaid: true
image: /assets/img/sample/devices-mockup.png image:
src: 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 +98,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

@@ -84,11 +84,13 @@ Then you can use it like other markdown language: surround the graph code with `
### Preview image ### Preview image
If you want to add an image to the top of the post contents, specify the url for the image by: If you want to add an image to the top of the post contents, specify the url and alt attribute for the image:
```yaml ```yaml
--- ---
image: /path/to/image-file image:
src: /path/to/image/file
alt: image alternative text
--- ---
``` ```
@@ -118,22 +120,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,104 +7,130 @@ 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** - Easy to upgrade, isolate irrelevant project files so you can focus on writing.
$ git clone https://github.com/USERNAME/USERNAME.github.io.git -b master --single-branch - **Fork from GitHub** - Convenient for custom development, but difficult to upgrade, only suitable for web developers.
### 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 required files from the theme's gem (for detailed files, see [starter project][starter]) to your Jekyll site.
### Initialization > **Hint**: To locate the installed 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 files from theme's gem. We have prepared everything for you there!
### 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:
1. Remove some files or directories from your repository: 1. Remove some files or directories from your repository:
- `.travis.yml` - `.travis.yml`
- files under `_posts` - files under `_posts`
- folder `docs` - folder `docs`
2. If you use the `--no-gh` option, the directory `.github` will be deleted. Otherwise, setup the GitHub Action workflow by removing extension `.hook` of `.github/workflows/pages-deploy.yml.hook`, and then remove the other files and directories in folder `.github`. 2. If you use the `--no-gh` option, the directory `.github` will be deleted. Otherwise, setup the GitHub Action workflow by removing extension `.hook` of `.github/workflows/pages-deploy.yml.hook`, and then remove the other files and directories in folder `.github`.
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` - `lang`
### 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 choose ONE of the following methods to deploy your Jekyll site.
#### 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. Quickly check the files needed for GitHub Actions build:
- 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.
- Ensuer your Jekyll site has file `tools/test.sh` and `tools/deploy.sh`. Otherwise, copy them from this repo to your Jekyll site.
And then rename your repoistory to `<GH-USERNAME>.github.io` on GitHub.
Now publish your Jekyll 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 +144,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 \
@@ -129,3 +155,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.
[starter]: https://github.com/cotes2020/chirpy-starter
[use-starter]: https://github.com/cotes2020/chirpy-starter/generate
[workflow]: https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/.github/workflows/pages-deploy.yml.hook

View File

@@ -11,17 +11,17 @@ 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:
- browserconfig.xml - browserconfig.xml
- manifest.json - manifest.json
Now, copy the remaining image files (`.PNG` and `.ICO`) from the extracted `.zip` file to cover the original files in the folder `assets/img/favicons/`. Now, copy the remaining image files (`.PNG` and `.ICO`) from the extracted `.zip` file to cover the original files in the folder `assets/img/favicons/`.
The following table helps you understand the changes to the icon file: The following table helps you understand the changes to the icon file:

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:
```yaml
-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/

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,5 @@
/* /*
* Mainly scss modules, only imported to `assets/css/main.scss` * Mainly scss modules, only imported to `assets/css/main.scss`
*
* v2.1
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2020 Cotes Chung
* MIT Licensed
*/ */
/* ---------- scss placeholder --------- */ /* ---------- scss placeholder --------- */
@@ -100,6 +95,7 @@
@mixin panel-label { @mixin panel-label {
@include label(inherit); @include label(inherit);
display: block; display: block;
line-height: 1.2; line-height: 1.2;
padding-top: 0.5rem; padding-top: 0.5rem;

View File

@@ -1,13 +1,9 @@
/* /*
* The syntax highlight. * The syntax highlight.
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2018-2019 Cotes Chung
* 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 +128,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 */

View File

@@ -1,10 +1,5 @@
/* /*
* Mainly scss variables * Mainly scss variables
*
* v2.1
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2020 Cotes Chung
* MIT Licensed
*/ */
/* --- ↓ width and height ---- */ /* --- ↓ width and height ---- */

View File

@@ -1,10 +1,6 @@
/*! /*
* 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 {
/* ----- My styles ------ */ /* ----- My styles ------ */

View File

@@ -1,10 +1,6 @@
/*! /*
* 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 {
/* framework */ /* framework */
@@ -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,10 +1,6 @@
/*! /*
* 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 {
/* see: <https://raw.githubusercontent.com/jwarby/pygments-css/master/github.css> */ /* see: <https://raw.githubusercontent.com/jwarby/pygments-css/master/github.css> */

View File

@@ -1,10 +1,6 @@
/*! /*
* 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 {
/* Common */ /* Common */

View File

@@ -0,0 +1,23 @@
/*!
* The styles for Jekyll theme Chirpy
*
* Chirpy v3.1.0 (https://github.com/cotes2020/jekyll-theme-chirpy)
* © 2019 Cotes Chung
* MIT Licensed
*/
@import
"colors/light-typography",
"colors/dark-typography",
"addon/module",
"addon/variables",
"addon/syntax",
"addon/commons",
"layout/home",
"layout/post",
"layout/tags",
"layout/archives",
"layout/categories",
"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: "";
@@ -21,34 +14,12 @@
#archives { #archives {
letter-spacing: 0.03rem; letter-spacing: 0.03rem;
li {
font-size: 1.1rem;
line-height: 3rem;
&:nth-child(odd) {
background-color: var(--main-wrapper-bg, #fff);
background-image: linear-gradient(
to left, #fff, #fbfbfb, #fbfbfb, #fbfbfb, #fff);
}
> div {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
span.lead { span.lead {
font-size: 1.5rem; font-size: 1.5rem;
position: relative; position: relative;
left: 8px; left: 8px;
&:not(:first-child) {
position: relative;
left: 4px;
&::after {
left: 67px;
}
}
&::after { /* Year dot */ &::after { /* Year dot */
content: ""; content: "";
display: block; display: block;
@@ -66,8 +37,64 @@
box-shadow: 0 0 2px 0 #c2c6cc; box-shadow: 0 0 2px 0 #c2c6cc;
z-index: 1; z-index: 1;
} }
&:not(:first-child) {
position: relative;
left: 4px;
&::after {
left: 67px;
}
}
} // #archives span.lead } // #archives span.lead
ul {
li {
font-size: 1.1rem;
line-height: 3rem;
div {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
a {
/* post title in Archvies */
margin-left: 2.5rem;
position: relative;
top: 0.1rem;
}
}
&:nth-child(odd) {
background-color: var(--main-wrapper-bg, #fff);
background-image: linear-gradient(to left, #fff, #fbfbfb, #fbfbfb, #fbfbfb, #fff);
}
&::after {
@extend %date-timeline;
height: 2.8rem;
top: -1.3rem;
}
&:first-child::before {
@extend %date-timeline;
height: 3.06rem;
top: -1.61rem;
}
}
&:not(:last-child) > li:last-child::after {
height: 3.4rem;
}
&:last-child > li:last-child::after {
display: none;
}
} // #archives ul
.date { .date {
white-space: nowrap; white-space: nowrap;
display: inline-block; display: inline-block;
@@ -104,36 +131,8 @@
} }
} // #archives .date } // #archives .date
ul {
> li {
> div > a {
/* post title in Archvies */
margin-left: 2.5rem;
position: relative;
top: 0.1rem;
}
&::after {
@extend %date-timeline;
height: 2.8rem;
top: -1.3rem;
}
&:first-child::before {
@extend %date-timeline;
height: 3.06rem;
top: -1.61rem;
}
}
&:not(:last-child) > li:last-child::after {
height: 3.4rem;
}
&:last-child > li:last-child::after {
display: none;
}
} // #archives ul
} // #archives } // #archives
@media all and (max-width: 576px) { @media all and (max-width: 576px) {
#archives { #archives {
margin-top: -1rem; margin-top: -1rem;

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;
@@ -18,6 +11,14 @@
.card-header { .card-header {
padding-right: 12px; padding-right: 12px;
} }
i {
&.far,
&.fas {
font-size: 86%; // fontawesome icons
}
}
.list-group-item { .list-group-item {
border-left: none; border-left: none;
border-right: none; border-right: none;
@@ -36,12 +37,6 @@
@extend %category-icon-color; @extend %category-icon-color;
} }
i {
&.far, &.fas {
font-size: 86%; // fontawesome icons
}
}
} // .categories } // .categories
.category-trigger { .category-trigger {
@@ -49,7 +44,7 @@
height: 1.7rem; height: 1.7rem;
border-radius: 50%; border-radius: 50%;
text-align: center; text-align: center;
color: #6c757d!important; color: #6c757d !important;
> i.fas { > i.fas {
position: relative; position: relative;
height: 0.7rem; height: 0.7rem;

View File

@@ -1,18 +1,18 @@
--- /*
# 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
---
.dash {
margin: 0 .5rem .6rem .5rem;
border-bottom: 2px dotted var(--dash-color);
}
{% include_relative _addon/main.scss %} #page-category,
#page-tag {
#page-category, #page-tag {
ul > li { ul > li {
line-height: 1.5rem; line-height: 1.5rem;
padding: 0.6rem 0; padding: 0.6rem 0;
&::before { // dot &::before { // dot
background: #999; background: #999;
width: 5px; width: 5px;
@@ -24,14 +24,16 @@
top: 0.6rem; top: 0.6rem;
margin-right: 0.5rem; margin-right: 0.5rem;
} }
> a { /* post's title */ > a { /* post's title */
font-size: 1.1rem;
@extend %no-bottom-border; @extend %no-bottom-border;
font-size: 1.1rem;
} }
> span:last-child { > span:last-child {
white-space: nowrap; white-space: nowrap;
} } /* post's date */
/* post's date */
} }
} }
@@ -43,22 +45,19 @@
font-size: 1.25rem; font-size: 1.25rem;
} }
a:hover { #page-category,
#page-category &, #page-tag,
#page-tag &, #access-lastmod {
#access-lastmod & { a:hover {
@extend %link-hover; @extend %link-hover;
margin-bottom: -1px; // Avoid jumping margin-bottom: -1px; // Avoid jumping
} }
} }
.dash {
margin: 0 .5rem .6rem .5rem;
border-bottom: 2px dotted var(--dash-color);
}
@media all and (max-width: 576px) { @media all and (max-width: 576px) {
#page-category, #page-tag { #page-category,
#page-tag {
ul > li { ul > li {
&::before { &::before {
margin: 0 .5rem; margin: 0 .5rem;

View File

@@ -1,12 +1,60 @@
--- /*
# 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 %} .pagination {
font-size: 1rem;
a:hover {
text-decoration: none;
}
.page-item {
.page-link {
color: var(--btn-patinator-text-color);
width: 2.5rem;
height: 2.5rem;
padding: 0;
text-align: center;
display: -webkit-box;
display: flex;
-webkit-box-pack: center;
justify-content: center;
-webkit-box-align: center;
align-items: center;
border-radius: 50%;
border: 1px solid var(--btn-paginator-border-color);
font-family: 'Lato', sans-serif;
background-color: var(--button-bg);
&:hover {
background-color: var(--btn-paginator-hover-color);
}
}
&.active {
.page-link {
background-color: var(--btn-active-bg);
border-color: var(--btn-active-border-color);
box-shadow: 0 0 8px 0 var(--btn-paginator-shadow) !important;
color: var(--btn-text-color);
}
}
&.disabled {
cursor: not-allowed;
.page-link {
color: rgba(108, 117, 125, 0.57);
border-color: var(--btn-paginator-border-color);
background-color: var(--button-bg);
}
}
&:first-child .page-link,
&:last-child .page-link {
border-radius: 50%;
}
&:not(:last-child) {
margin-right: 0.7rem;
}
} // .page-item
} // .pagination
#post-list { #post-list {
margin-top: 1rem; margin-top: 1rem;
@@ -17,6 +65,10 @@
padding-bottom: 1rem; padding-bottom: 1rem;
border-bottom: 1px solid var(--main-border-color); border-bottom: 1px solid var(--main-border-color);
a:hover {
@extend %link-hover;
}
h1 { h1 {
font-size: 1.4rem; font-size: 1.4rem;
margin: 0; margin: 0;
@@ -61,60 +113,6 @@
} // #post-list } // #post-list
.pagination {
font-size: 1rem;
a:hover {
text-decoration: none;
}
.page-item {
.page-link {
color: var(--btn-patinator-text-color);
width: 2.5rem;
height: 2.5rem;
padding: 0;
text-align: center;
display: -webkit-box;
display: flex;
-webkit-box-pack: center;
justify-content: center;
-webkit-box-align: center;
align-items: center;
border-radius: 50%;
border: 1px solid var(--btn-paginator-border-color);
font-family: 'Lato', sans-serif;
background-color: var(--button-bg);
&:hover {
background-color: var(--btn-paginator-hover-color)
}
}
&.active {
.page-link {
background-color: var(--btn-active-bg);
border-color: var(--btn-active-border-color);
box-shadow: 0 0 8px 0 var(--btn-paginator-shadow) !important;
color: var(--btn-text-color);
}
}
&.disabled {
cursor: not-allowed;
.page-link {
color: rgba(108, 117, 125, 0.57);
border-color: var(--btn-paginator-border-color);
background-color: var(--button-bg);
}
}
&:first-child .page-link,
&:last-child .page-link {
border-radius: 50%;
}
&:not(:last-child) {
margin-right: 0.7rem;
}
} // .page-item
} // .pagination
/* Hide SideBar and TOC */ /* Hide SideBar and TOC */
@media all and (max-width: 830px) { @media all and (max-width: 830px) {
.pagination { .pagination {

View File

@@ -1,21 +1,10 @@
--- /*
# 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 {
color: var(--btn-share-color, $light-color)!important; color: var(--btn-share-color, $light-color) !important;
} @else { } @else {
color: var(--btn-share-color, $light-color); color: var(--btn-share-color, $light-color);
} }
@@ -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";
} }
@@ -50,9 +41,10 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
.post-content { .post-content {
.preview-img { .preview-img {
margin-top: 0;
margin-bottom: 2.5rem;
@include align-center; @include align-center;
margin-top: 0;
margin-bottom: 2.5rem !important;
} }
} }
@@ -72,6 +64,7 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
.btn { .btn {
@include btn-post-nav; @include btn-post-nav;
color: var(--link-color); color: var(--link-color);
&:hover { &:hover {
background: #2a408e; background: #2a408e;
@@ -80,6 +73,7 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
} }
&.disabled { &.disabled {
@include btn-post-nav; @include btn-post-nav;
pointer-events: auto; pointer-events: auto;
cursor: not-allowed; cursor: not-allowed;
background: none; background: none;
@@ -91,6 +85,12 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
&.btn-outline-primary.disabled:focus { &.btn-outline-primary.disabled:focus {
box-shadow: none; box-shadow: none;
} }
&::before {
color: var(--text-muted-color);
font-size: 0.65rem;
text-transform: uppercase;
content: attr(prompt);
}
} }
p { p {
@@ -100,29 +100,19 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
white-space: normal; white-space: normal;
} }
a, span { a {
&::before {
color: var(--text-muted-color);
font-size: 0.65rem;
text-transform: uppercase;
}
&: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
@keyframes fade-up { @keyframes fade-up {
@@ -153,17 +143,16 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
} }
} }
#toc li>a { #toc li > a {
line-height: 1rem; line-height: 1rem;
padding-top: 0.5rem; padding-top: 0.5rem;
padding-bottom: 0.5rem; padding-bottom: 0.5rem;
} }
/* --- Related Posts --- */
/*--- Related Posts ---*/
#related-posts { #related-posts {
>h3 { > h3 {
@include label(1.1rem, 600); @include label(1.1rem, 600);
} }
.card { .card {
@@ -179,7 +168,7 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
&:hover { &:hover {
-webkit-transform: translate3d(0, -3px, 0); -webkit-transform: translate3d(0, -3px, 0);
transform: translate3d(0, -3px, 0); transform: translate3d(0, -3px, 0);
box-shadow: 0 10px 15px -4px rgba(0,0,0,0.15); box-shadow: 0 10px 15px -4px rgba(0, 0, 0, 0.15);
} }
} }
@@ -204,7 +193,7 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
ul { ul {
list-style-type: none; list-style-type: none;
padding-inline-start: 1.5rem; padding-inline-start: 1.5rem;
>li::before { > li::before {
background: #c2c9d4; background: #c2c9d4;
width: 5px; width: 5px;
height: 5px; height: 5px;
@@ -230,12 +219,17 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
} }
%btn-share-hovor { %btn-share-hovor {
color: var(--btn-share-hover-color)!important; color: var(--btn-share-hover-color) !important;
} }
.share-wrapper { .share-wrapper {
vertical-align: middle; vertical-align: middle;
user-select: none; user-select: none;
i {
font-weight: 400;
}
.share-icons { .share-icons {
font-size: 1.2rem; font-size: 1.2rem;
a { a {
@@ -244,12 +238,12 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
} }
&:hover { &:hover {
text-decoration: none; text-decoration: none;
>i { > i {
@extend %btn-share-hovor; @extend %btn-share-hovor;
} }
} }
} }
>i { > i {
padding-top: 0.35rem; padding-top: 0.35rem;
&:hover { &:hover {
@extend %btn-share-hovor; @extend %btn-share-hovor;
@@ -257,7 +251,7 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
} }
.fab { .fab {
&.fa-twitter { &.fa-twitter {
@include btn-sharing-color(rgba(29, 161, 242, 1.00)); @include btn-sharing-color(rgba(29, 161, 242, 1));
} }
&.fa-facebook-square { &.fa-facebook-square {
@include btn-sharing-color(rgb(66, 95, 156)); @include btn-sharing-color(rgb(66, 95, 156));
@@ -278,9 +272,9 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
} // .share-wrapper } // .share-wrapper
.share-label { .share-label {
@include label(inherit, 400, inherit); @include label(inherit, 400, inherit);
&::after { &::after {
content: ":"; content: ":";
} }
@@ -288,49 +282,56 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
.license-wrapper { .license-wrapper {
line-height: 1.2rem; line-height: 1.2rem;
>a { > a {
font-weight: 600; font-weight: 600;
&:hover { &:hover {
@extend %link-hover; @extend %link-hover;
} }
} }
i {
font-weight: 400;
}
span:last-child { span:last-child {
font-size: 0.85rem; font-size: 0.85rem;
} }
} // .license-wrapper } // .license-wrapper
@media all and (max-width: 576px) { @media all and (max-width: 576px) {
.post-tail-bottom { .post-tail-bottom {
-ms-flex-wrap: wrap-reverse!important; -ms-flex-wrap: wrap-reverse !important;
flex-wrap: wrap-reverse!important; flex-wrap: wrap-reverse !important;
>div:first-child { >div:first-child {
width: 100%; width: 100%;
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);
} }
&.flex-column { &.flex-column {
-webkit-box-orient: horizontal!important; -webkit-box-orient: horizontal !important;
-webkit-box-direction: normal!important; -webkit-box-direction: normal !important;
-ms-flex-direction: row!important; -ms-flex-direction: row !important;
flex-direction: row!important; flex-direction: row !important;
} }
} }
} // .post } // .post

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
--- ---

6
app.js
View File

@@ -1,12 +1,8 @@
--- ---
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 */
if('serviceWorker' in navigator) { if('serviceWorker' in navigator) {
navigator.serviceWorker.register('{{ "/sw.js" | relative_url }}'); navigator.serviceWorker.register('{{ "/sw.js" | relative_url }}');
}; };

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";

View File

@@ -2,10 +2,6 @@
layout: compress layout: compress
# A part of the Favicons # A part of the Favicons
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2019 Cotes Chung
# MIT License
--- ---
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<browserconfig> <browserconfig>
@@ -17,4 +13,4 @@ layout: compress
<TileColor>#ffffff</TileColor> <TileColor>#ffffff</TileColor>
</tile> </tile>
</msapplication> </msapplication>
</browserconfig> </browserconfig>

View File

@@ -2,10 +2,6 @@
layout: compress layout: compress
# #
# A part of the Favicons # A part of the Favicons
# Chirpy v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2019 Cotes Chung
# MIT License
--- ---
{% assign icon_url = "/assets/img/favicons" | relative_url %} {% assign icon_url = "/assets/img/favicons" | relative_url %}

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.1.0 (https://github.com/cotes2020/jekyll-theme-chirpy/)
* © 2019 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

@@ -1,17 +1,13 @@
/* /*
* 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) {
if (!url || 0 === url.length) { if (!url || 0 === url.length) {
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) {
if ($(".access").length > 0) { access.addClass("topbar-down");
$(".access").addClass("topbar-down");
}
} }
} }
@@ -66,4 +66,4 @@ $(function() {
} }
}, 250); }, 250);
}); });

View File

@@ -1,16 +1,16 @@
/* /*
* Topbar 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,26 +22,26 @@ $(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,33 +1,30 @@
/* /*
* 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 pageviews 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,17 +51,18 @@ var PvCache = (function () {
return { return {
getData() { getData() {
return JSON.parse(localStorage.getItem(KEY_PV) ); // get data from browser cache
return JSON.parse(localStorage.getItem(KEY_PV));
}, },
saveOriginCache(pv) { saveOriginCache(pv) {
set(KEY_PV, pv); set(KEY_PV, pv);
set(KEY_PV_SRC, Source.ORIGIN ); set(KEY_PV_SRC, Source.ORIGIN);
set(KEY_CREATION, new Date().toJSON() ); set(KEY_CREATION, new Date().toJSON());
}, },
saveProxyCache(pv) { saveProxyCache(pv) {
set(KEY_PV, pv); set(KEY_PV, pv);
set(KEY_PV_SRC, Source.PROXY ); set(KEY_PV_SRC, Source.PROXY);
set(KEY_CREATION, new Date().toJSON() ); set(KEY_CREATION, new Date().toJSON());
}, },
isFromOrigin() { isFromOrigin() {
return get(KEY_PV_SRC) === Source.ORIGIN; return get(KEY_PV_SRC) === Source.ORIGIN;
@@ -62,23 +71,23 @@ var PvCache = (function () {
return get(KEY_PV_SRC) === Source.PROXY; return get(KEY_PV_SRC) === Source.PROXY;
}, },
isExpired() { isExpired() {
if (PvCache.isFromOrigin() ) { if (PvCache.isFromOrigin()) {
let date = new Date(get(KEY_CREATION)); let date = new Date(get(KEY_CREATION));
date.setDate(date.getDate() + 1); /* update origin records every day */ date.setDate(date.getDate() + 1); /* update origin records every day */
return Date.now() >= date.getTime(); return Date.now() >= date.getTime();
} else if (PvCache.isFromProxy() ) { } else if (PvCache.isFromProxy()) {
let date = new Date(get(KEY_CREATION) ); let date = new Date(get(KEY_CREATION));
date.setHours(date.getHours() + 1); /* update proxy records per hour */ date.setHours(date.getHours() + 1); /* update proxy records per hour */
return Date.now() >= date.getTime(); return Date.now() >= date.getTime();
} }
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

@@ -1,6 +1,6 @@
/* /*
Safari doesn't support CSS `scroll-behavior: smooth`, Safari doesn't support CSS `scroll-behavior: smooth`,
so here is a compatible sollution for all browser to smooth scrolling so here is a compatible solution for all browser to smooth scrolling
See: <https://css-tricks.com/snippets/jquery/smooth-scrolling/> See: <https://css-tricks.com/snippets/jquery/smooth-scrolling/>
@@ -13,66 +13,67 @@ $(function() {
.not("[href='#0']") .not("[href='#0']")
.click(function(event) { .click(function(event) {
if (location.pathname.replace(/^\//, "") === this.pathname.replace(/^\//, "") if (this.pathname.replace(/^\//, "") === location.pathname.replace(/^\//, "")) {
&& location.hostname === this.hostname) { if (location.hostname === this.hostname) {
const REM = 16; /* 16px */ const REM = 16; /* 16px */
const hash = decodeURI(this.hash); const hash = decodeURI(this.hash);
let isFnRef = RegExp(/^#fnref:/).test(hash); let isFnRef = RegExp(/^#fnref:/).test(hash);
let isFn = RegExp(/^#fn:/).test(hash); let isFn = RegExp(/^#fn:/).test(hash);
let selector = hash.includes(":") ? hash.replace(/\:/, "\\:") : hash; let selector = hash.includes(":") ? hash.replace(/\:/, "\\:") : hash;
const target = $(selector); let target = $(selector);
if (target.length) { if (target.length) {
event.preventDefault(); event.preventDefault();
if (history.pushState) { /* add hash to URL */ if (history.pushState) { /* add hash to URL */
history.pushState(null, null, hash); 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 */
}
});
} }
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, () => {
var $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 */
}
});
} }
} }

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,13 +0,0 @@
---
layout: compress
# JS for layout tab Categories.
# Chirpy v2.3
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT License
---
{% include_relative _commons.js %}
{% include_relative _utils/category-collapse.js %}

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