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

Compare commits

...

81 Commits
v2.2.1 ... v2.5

Author SHA1 Message Date
Cotes Chung
ad7d8ac1c9 Merge branch 'release/2.5' 2020-08-03 03:44:13 +08:00
Cotes Chung
adff74b27b Update docs for v2.5 2020-08-03 03:28:53 +08:00
Cotes Chung
1c3c22bb68 Merge branch 'feature/improve-typography' into develop 2020-08-03 02:24:12 +08:00
Cotes Chung
628d4de095 Merge branch 'feature/build-by-gh-actions' into develop 2020-08-03 02:19:13 +08:00
Cotes Chung
48b3df2ea7 Added new tools and workflow. 2020-08-03 02:05:15 +08:00
Cotes Chung
3b0cf90f5c Improved the build tool.
Allows to specify an empty base-url.
2020-08-02 01:48:47 +08:00
Cotes Chung
544f72efff Optimized font colors. 2020-07-30 05:28:16 +08:00
Cotes Chung
112091cbf6 Improved the posts layout. 2020-07-30 05:12:36 +08:00
Cotes Chung
b04bb847b1 Merge branch 'hotfix/2.4.2' 2020-07-30 02:50:19 +08:00
Cotes Chung
a71bade6eb Merge tag 'v2.4.2' into develop
Fix the CI workflow
2020-07-30 02:50:19 +08:00
Cotes Chung
6ef97f1fad Fixed CI workflow. 2020-07-30 02:48:08 +08:00
Cotes Chung
4675d42f90 Merge branch 'feature/improve-pv-fetching' into develop 2020-07-26 22:25:39 +08:00
Cotes Chung
a624b9a472 Update pv fetching tool. 2020-07-26 22:25:26 +08:00
Cotes Chung
ad48a9ab06 Fixed empty PV issue. 2020-07-26 22:25:26 +08:00
Cotes Chung
18bd1a91ef Merge branch 'hotfix/2.4.1' 2020-07-26 18:31:56 +08:00
Cotes Chung
4cff8879ac Merge tag 'v2.4.1' into develop
use git-flow to improve development
2020-07-26 18:31:56 +08:00
Cotes Chung
4dd4915bed Update issues template 2020-07-26 18:30:12 +08:00
Cotes Chung
a227ae386d Updated the contribution guide. 2020-07-26 17:06:33 +08:00
Cotes Chung
32bd36f016 Updated the CI/CD scripts. 2020-07-25 23:08:37 +08:00
Cotes Chung
aa23becd14 Split post date format code snippets.
Code improvement
2020-07-24 04:15:38 +08:00
Cotes Chung
b2f0b4cb1b Improved post date display. 2020-07-23 20:57:11 +08:00
Cotes Chung
209058b84a Code improvement.
Passing parameters to includes
2020-07-22 23:02:11 +08:00
Cotes Chung
562fcd4fd8 Fixed posts' base-url on cache list. 2020-07-17 16:27:11 +08:00
Cotes Chung
22115f3797 Optimized update list & fixed sw cache list. 2020-07-16 21:00:19 +08:00
Cotes Chung
9f3619e54a Fixed last-mod display for non-English named posts. 2020-07-16 21:00:19 +08:00
Cotes Chung
5b0aaa5403 Improved script tools.
- Allows posts to be placed in subdirectories (#41, #87).
- Identify posts file with the suffix ‘.markdown’.

**Page creator**
- Pass the posts without any categories or tags.
- Omit the YAML comments for categories/tags.

**Lastmod**
- compatible with one-digit month or day post files.
2020-07-14 23:16:43 +08:00
Cotes Chung
733bb0fbfa Updated the PR template. 2020-07-14 12:03:23 +08:00
Cotes Chung
0d47beba97 Improved the tool scripts.
- Avoid the empty lastmod file.
- Check if there is no post.
- Fixed the prompt message.
2020-07-14 03:24:25 +08:00
Cotes Chung
c0ba181246 Improved the PV fetching.
Discard some of the old permalink PV records.
2020-07-14 03:24:25 +08:00
Cotes Chung
313c44f238 Update Docs. 2020-07-12 01:30:55 +08:00
Cotes Chung
46c2cfe64e Improved the page recognition.
Useful for label localization
2020-06-30 17:39:14 +08:00
Cotes Chung
cc4f18a5a2 Simplify the publishing process.
Renamed the tool script.
2020-06-26 18:48:11 +08:00
Cotes Chung
4491c82b02 Omit the license. 2020-06-26 17:33:43 +08:00
Cotes Chung
b9b8dd8cf1 Beautified the comment block. 2020-06-24 20:47:01 +08:00
Cotes Chung
9a1eab2635 Improved the issue templates. 2020-06-24 20:46:24 +08:00
Cotes Chung
30b013f354 Make the tables responsive. (#85) 2020-06-24 20:08:38 +08:00
Cotes Chung
4d4e9a063e Ensure the LocalStroage keys are valid.
Also update the cache key name.
2020-06-24 02:57:02 +08:00
Cotes Chung
afccb144b1 Improved styles for hiding line numbers. 2020-06-24 02:57:02 +08:00
Cotes Chung
e87ef0d40e Fixed the PV cache. 2020-06-24 02:57:02 +08:00
Cotes Chung
42e0617bde Prettified the inline-code code style. 2020-06-22 21:17:58 +08:00
Cotes Chung
edeb08aa28 Removed the line number of the snippet in the search results. 2020-06-17 21:22:44 +08:00
Cotes Chung
b0a35de9c6 Resume page link hover effect. 2020-06-17 16:17:03 +08:00
Cotes Chung
b3e6fc56f7 Improved the generation rules of Categories ID.
Avoid invalidation of icon animations for closed and opened top categories when category names contain a dot.
2020-06-16 16:01:12 +08:00
Cotes Chung
618ae9dcbc Optimized the TOC position. 2020-06-11 22:01:15 +08:00
Felix Wolfsteller
47e5c3a917 Add option for mastodon contact. 2020-06-09 21:05:20 +08:00
Cotes Chung
f9706411e7 Optimized pin icon size. 2020-06-09 20:37:42 +08:00
Cotes Chung
b22da94134 Updated the docs.
- Updated the build badge on ReadMe.
- Improved the PR template.
2020-06-09 20:37:42 +08:00
Cotes Chung
4476a7d755 Improved the community docs.
- Added the PR template & code of conduct
- Improved the issue templates.
2020-06-08 22:54:40 +08:00
Felix Wolfsteller
ea4cd78921 typo fix: s/defualt/default/ 2020-06-08 15:44:59 +02:00
Cotes Chung
752d0330b7 Remove invalid links from categories page. (#79)
To pass the HTML-Proofer test.
2020-06-07 21:51:11 +08:00
Cotes Chung
fbbd387402 Otpimized pin icon layout. 2020-06-07 21:51:11 +08:00
Cotes Chung
bec344f6e9 Fixed references in the Docs. 2020-06-07 21:29:39 +08:00
Cotes Chung
ba47cc0509 Optimized responsive layout. 2020-06-07 21:22:24 +08:00
Cotes Chung
34d54f9349 Super feature: Pinned posts. 2020-06-06 18:51:56 +08:00
Cotes Chung
d1963af964 Update workflow. 2020-06-06 04:01:17 +08:00
Cotes Chung
eff2a24f4c Enhanced the related posts.
If the number of related posts is less than 3, use the latest posts to supplement.
2020-06-05 06:14:40 +08:00
Cotes Chung
3caafbd50d Unified file naming style. 2020-06-05 06:14:40 +08:00
Cotes Chung
cb37a1909d Updated the comments in site config. 2020-06-05 06:14:40 +08:00
Cotes Chung
88eac91909 Fixed anchor position (desktop views). 2020-06-02 22:14:40 +08:00
Cotes Chung
0bb9c47cf9 Hide broken image of avatar. 2020-06-02 16:18:40 +08:00
Cotes Chung
b28724b4d4 Hide the empty trending tags from panel. 2020-06-02 02:34:24 +08:00
Cotes Chung
75c57d1725 Simplified the post JS file. 2020-06-02 02:34:24 +08:00
Cotes Chung
032f5c7f83 Updated the Chinese version README. 2020-06-01 19:51:58 +08:00
Cotes Chung
75e462a9e9 Replaced the blank loading image with HTML trick. 2020-06-01 19:50:29 +08:00
mattpopovich
ef3860004e Small grammar fix 2020-06-01 16:38:31 +08:00
mattpopovich
032706d27f Fixed some spelling/typos 2020-06-01 16:38:31 +08:00
Cotes Chung
02a269910f Optimized sidebar icons location.
screen width >= 1650px
2020-06-01 16:38:31 +08:00
Cotes Chung
abdf73fff4 Added issues cleaner. 2020-05-30 19:21:09 +08:00
Cotes Chung
be1d1554ea Corrected url within mainfest. 2020-05-30 17:48:16 +08:00
Cotes Chung
a2deea6537 Split the CSS selection from head tag. 2020-05-30 17:48:16 +08:00
Cotes Chung
1a2767ca24 Combine local JS.
’yui-compressor’ is no longer used.
2020-05-30 17:48:16 +08:00
Cotes Chung
cfb67a1cb9 Fixed image lazy loading. 2020-05-29 06:18:53 +08:00
Cotes Chung
171faafc67 Unify local links to posts (#65). 2020-05-29 06:18:53 +08:00
Cotes Chung
db5eb0a18a Beautified syntax highlight for language diff. 2020-05-29 06:18:53 +08:00
Cotes Chung
582ea30459 Support the mathematical expressions (#55). 2020-05-29 06:18:53 +08:00
Cotes Chung
064cefd9ff Combine CDN resources. 2020-05-26 23:25:57 +08:00
Cotes Chung
a57baf7e2c Optimized dark mode colors.
- the further reading cards
- button back-to-top
- table
2020-05-26 14:49:54 +08:00
Cotes Chung
473ab64f74 Added Linkedin share on posts (#60). 2020-05-26 00:01:15 +08:00
Cotes Chung
c5783c1289 Reduce the heading font weight. 2020-05-23 20:41:08 +08:00
Cotes Chung
a64d00c1e6 Make lang attribute configurable 2020-05-23 17:07:06 +08:00
Cotes Chung
7382eaa953 Feature: make contact options configurable (#58, #59). 2020-05-23 15:58:21 +08:00
101 changed files with 1854 additions and 1425 deletions

76
.github/CODE_OF_CONDUCT.md vendored Normal file
View File

@@ -0,0 +1,76 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at cotes.chung@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

View File

@@ -2,15 +2,21 @@
I want to thank you for sparing a time to improve this project! Here are some guidelines for contributing I want to thank you for sparing a time to improve this project! Here are some guidelines for contributing
To ensure that the blog design is not confused, this project do not accept suggestions for design changes, such as colors scheme, fonts, typography, etc. If your request is about enhancement, it is recommended to first submit a `Feature Request` type issue to discuss whether your idea fits the project. To ensure that the blog design is not confused, this project does not accept suggestions for design changes, such as color scheme, fonts, typography, etc. If your request is about an enhancement, it is recommended to first submit a [`Feature Request`](https://github.com/cotes2020/jekyll-theme-chirpy/issues/new?labels=enhancement&template=feature_request.md) issue to discuss whether your idea fits the project.
Generally, contribute to the project by: Generally, contribute to the project by:
1. Fork this project. 1. Fork this project on GitHub and clone it locally.
2. Create a new branch `my-new-freature`(or `fix-a-bug`), then complete the development, commit and push. 2. Create a new branch named `feature/my-feature` (or `feature/fix-a-bug`), which branch from `develop`:
3. Submit a new `Pull Request`.
```console
$ git checkout -b feature/<my-feature> develop
```
> Please note that the new branch name must include the prefix `feature/`.
3. After completing the development, commit and push to remote.
4. Submit a new **pull request** to the `develop` branch of upstream, i.e., `cotes2020/jekyll-theme-chirpy:develop`.
--- ---
:tada:Your volunteering will make the open source world more beautiful, thanks again!:tada: :tada: Your volunteering will make the open source world more beautiful, thanks again! :tada:

View File

@@ -4,19 +4,27 @@ about: Create a report to help us improve
labels: bug labels: bug
--- ---
<!-- Please make sure you have read the README or Wiki, and your question does not appear in other existing issues (including closed ones). Thanks for your cooperation! Now let's start it. --> <!-- Note: Please follow the template to open a new issue, otherwise your question will probably be ignored. -->
**Describe the bug** ## Checklist
<!-- Please complete the following list of tasks, and then check it by change the "[ ]" to "[x]" -->
- [ ] I have read the [tutorials](https://chirpy.cotes.info/categories/tutorial/) and know the correct effect of the functional design.
- [ ] There are no similar reports on existing issues (including closed ones).
- [ ] I found the bug on the latest code of `master` branch.
## Describe the bug
<!-- A clear and concise description of what the bug is. --> <!-- A clear and concise description of what the bug is. -->
**To Reproduce** **To Reproduce**
<!--
Steps to reproduce the behavior: Steps to reproduce the behavior:
1. Go to '...' 1. Go to '...'
2. Click on '....' 2. Click on '....'
3. Scroll down to '....' 3. Scroll down to '....'
4. See error 4. See error
-->
**Expected behavior** **Expected behavior**
<!-- A clear and concise description of what you expected to happen. --> <!-- A clear and concise description of what you expected to happen. -->
@@ -24,12 +32,14 @@ Steps to reproduce the behavior:
**Screenshots** **Screenshots**
<!-- If applicable, add screenshots to help explain your problem. --> <!-- If applicable, add screenshots to help explain your problem. -->
**Desktop (please complete the following information):** **Desktop**
<!-- Please complete the following information -->
- OS: [e.g. iOS] - OS: [e.g. iOS]
- Browser: [e.g. chrome, safari] - Browser: [e.g. chrome, safari]
- Version: [e.g. 22] - Version: [e.g. 22]
**Smartphone (please complete the following information):** **Smartphone**
<!-- please complete the following information -->
- Device: [e.g. iPhone6] - Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1] - OS: [e.g. iOS8.1]
- Browser: [e.g. stock browser, safari] - Browser: [e.g. stock browser, safari]

View File

@@ -4,18 +4,27 @@ about: Suggest an idea for this project
labels: enhancement labels: enhancement
--- ---
<!-- Please make sure your request does not appear in other existing issues (including closed ones). Thanks for your cooperation. Now, I can't wait to listen your idea! --> <!-- Note: Please follow the template to open a new issue, otherwise your question will probably be ignored. -->
## Checklist
<!-- Please complete the following list of tasks, and then check it by change the "[ ]" to "[x]" -->
- [ ] I have read the [contributing guidelines](https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/.github/CONTRIBUTING.md).
- [ ] There are no similar request on existing issues (including closed ones).
- [ ] I have read the [project progress](https://github.com/cotes2020/jekyll-theme-chirpy/projects) and know the current progress of the project.
- [ ] I was in the `develop` branch of the latest code.
**Is your feature request related to a problem? Please describe.** ## Is your feature request related to a problem? Please describe
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] --> <!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
**Describe the solution you'd like**
## Describe the solution you'd like
<!-- A clear and concise description of what you want to happen. --> <!-- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered**
## Describe alternatives you've considered
<!-- A clear and concise description of any alternative solutions or features you've considered. --> <!-- A clear and concise description of any alternative solutions or features you've considered. -->
**Additional context** ## Additional context
<!-- Add any other context or screenshots about the feature request here. --> <!-- Add any other context or screenshots about the feature request here. -->

View File

@@ -4,54 +4,17 @@ about: Ask what ever you want
labels: question labels: question
--- ---
<!-- Please make sure you have read the README or Wiki, and your question does not appear in other existing issues (including closed ones). Thanks for your cooperation. Now, uncomment the relevant part to describe the situation. --> <!-- Note: Please follow the template to open a new issue, otherwise your question will probably be ignored. -->
<!-- ## Checklist
**Don't understand what the README or Wiki says.**
Point out the parts that are hard for you to understand.
-->
<!-- <!-- Please complete the following list of tasks, and then check it by change the "[ ]" to "[x]" -->
**Want to complain about my bad days.**
Don't hesitate to share your story!
-->
<!-- - [ ] I have read the [tutorials](https://chirpy.cotes.info/categories/tutorial/) and know the correct effect of the functional design.
**Just wanted to say hi to the author.** - [ ] There are no similar question on existing issues (including closed ones).
Hi, I'm ..., have a nice day ! - [ ] I searched the Internet for related problems, but still couldn't solve it.
--> - [ ] My question is based on the latest code of `master` branch.
<!-- ## Description
**Not sure if it's a bug** <!-- Please describe your question. -->
Please try to describe the problem
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser: [e.g. chrome, safari]
- Version: [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser: [e.g. stock browser, safari]
- Version: [e.g. 22]
**Additional context**
Add any other context about the problem here.
-->

45
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,45 @@
## Description
<!--
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.
-->
e.g. Fixes #(issue)
## Type of change
<!--
Please select the desired item checkbox and change it to "[x]", then delete options that are not relevant.
-->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation update
## How has this been tested?
<!--
Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration
-->
- [ ] I have run `bash ./tools/build.sh && bash ./tools/test.sh` (at the root of the project) locally and passed
- [ ] I have tested this feature in the browser
**Test Configuration**
* Browerser type & version:
* Operating system:
* Bundler version:
* Ruby version:
* Jekyll version:
## Checklist:
<!-- Select checkboxes by change the "[ ]" to "[x]" -->
- [ ] My code follows the [Google style guidelines](https://google.github.io/styleguide/)
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] Any dependent changes have been merged and published in downstream modules

View File

@@ -1,13 +1,13 @@
name: build name: 'Continuous Integration'
on: on:
push: push:
branches-ignore: branches:
- stable - '*'
tags-ignore: tags-ignore:
- '*' - '*'
paths-ignore: paths-ignore:
- '.github/**' - '.github/**'
- '!.github/workflows/**' - '!.github/workflows/ci.yml'
- '.travis.yml' - '.travis.yml'
- '.gitignore' - '.gitignore'
- 'docs/**' - 'docs/**'
@@ -15,7 +15,7 @@ on:
- 'LICENSE' - 'LICENSE'
pull_request: pull_request:
paths: paths:
- "**" - '**'
jobs: jobs:
ci: ci:

24
.github/workflows/issues-cleaner.yml vendored Normal file
View File

@@ -0,0 +1,24 @@
name: "Close stale issues"
on:
schedule:
- cron: "0 0 * * *"
jobs:
stale:
runs-on: ubuntu-latest
steps:
- env:
DAYS_TO_STALE: ${{ 5 }}
DAYS_TO_CLOSE: ${{ 2 }}
uses: actions/stale@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue is stale because it has been open ${{ env.DAYS_TO_STALE }} days with no activity. Remove stale label or comment or this will be closed in ${{ env.DAYS_TO_CLOSE }} days'
stale-issue-label: 'stale'
exempt-issue-labels: 'pending, in progress'
stale-pr-message: 'This PR is stale because it has been open ${{ env.DAYS_TO_STALE }} days with no activity. Remove stale label or comment or this will be closed in ${{ env.DAYS_TO_CLOSE }} days'
stale-pr-label: 'stale'
exempt-pr-labels: 'pending, in progress'
days-before-stale: ${{ env.DAYS_TO_STALE }}
days-before-close: ${{ env.DAYS_TO_CLOSE }}
# debug-only: true

99
.github/workflows/pages-deploy.yml.hook vendored Normal file
View File

@@ -0,0 +1,99 @@
name: 'Automatic build'
on:
push:
branches:
- master
paths-ignore:
- '.gitignore'
- 'README.md'
- 'LICENSE'
jobs:
build-n-test:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-ruby@v1
with:
ruby-version: '2.6.x'
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Bundle Caching
id: bundle-cache
uses: actions/cache@v1
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile') }}
restore-keys: |
${{ runner.os }}-gems-
- name: Bundle config
run: |
bundle config path vendor/bundle
- name: Bundle Install
if: steps.bundle-cache.outputs.cache-hit != 'true'
run: |
bundle install
- name: Bundle Install locally
if: steps.bundle-cache.outputs.cache-hit == 'true'
run: |
bundle install --local
- name: Build Site
run: |
bash tools/build.sh -b ""
- name: Test Site
run: |
bash tools/test.sh
deploy:
needs: build-n-test
runs-on: ubuntu-latest
steps:
- uses: actions/setup-ruby@v1
with:
ruby-version: '2.6.x'
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Bundle Caching
id: bundle-cache
uses: actions/cache@v1
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile') }}
restore-keys: |
${{ runner.os }}-gems-
- name: Bundle config
run: |
bundle config path vendor/bundle
- name: Bundle Install
if: steps.bundle-cache.outputs.cache-hit != 'true'
run: |
bundle install
- name: Bundle Install locally
if: steps.bundle-cache.outputs.cache-hit == 'true'
run: |
bundle install --local
- name: Build site
run: |
bash tools/build.sh
- name: Deploy
run: |
bash tools/deploy.sh

View File

@@ -23,7 +23,7 @@ script:
- bash _cibuild.sh - bash _cibuild.sh
branches: branches:
only: stable only: master
git: git:
depth: false # for posts lastmod depth: false # for posts lastmod

217
README.md
View File

@@ -2,7 +2,7 @@
🌏 English • [简体中文](docs/README_zh-CN.md) 🌏 English • [简体中文](docs/README_zh-CN.md)
[![Build Status](https://github.com/cotes2020/jekyll-theme-chirpy/workflows/build/badge.svg?event=push)](https://github.com/cotes2020/jekyll-theme-chirpy/actions?query=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)
[![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)](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)
@@ -13,7 +13,7 @@ A minimal, sidebar, responsive web design Jekyll theme, focusing on text present
## Table of Contents ## Table of Contents
* [Features](#features) * [Features](#features)
* [Installing](#installing) * [Installation](#installation)
* [Usage](#usage) * [Usage](#usage)
* [Contributing](#contributing) * [Contributing](#contributing)
* [Credits](#credits) * [Credits](#credits)
@@ -22,12 +22,14 @@ A minimal, sidebar, responsive web design Jekyll theme, focusing on text present
## Features ## Features
* Pinned Posts
* Configurable theme mode * Configurable theme mode
* Two-level Categories * Double-level Categories
* Last modified date for posts * Last modified date for posts
* Table of Contents * Table of Contents
* Automatically recommend related posts * Automatically recommend related posts
* Syntax highlighting * Syntax highlighting
* Mathematical expressions
* Search * Search
* Atom Feeds * Atom Feeds
* Disqus Comments * Disqus Comments
@@ -35,210 +37,143 @@ A minimal, sidebar, responsive web design Jekyll theme, focusing on text present
* GA Pageviews reporting (Advanced) * GA Pageviews reporting (Advanced)
* SEO and Performance Optimization * SEO and Performance Optimization
## Installing
### Prerequisites ## Installation
Follow the [Jekyll Docs](https://jekyllrb.com/docs/installation/) to complete the installtion of basic environment (`Ruby `, `RubyGems` and `Bundler`). [Fork **Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/fork) on GitHub, and clone the fork to local by:
To improve the writing experience, we need to use some script tools. If your machine is running Debian or macOS, make sure that [GNU coreutils](https://www.gnu.org/software/coreutils/) is installed. Otherwise, install by: ```terminal
$ git clone git@github.com:<username>/jekyll-theme-chirpy -b master --single-branch
* Debian
```console
$ sudo apt-get install coreutils
``` ```
* macOS ### Setting up the local envrionment
```console 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` and `Bundler`.
$ brew install coreutils
```
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:
### Jekyll Plugins
[Fork **Chirpy** from GitHub](https://github.com/cotes2020/jekyll-theme-chirpy/fork), then clone your forked repo to local:
```console
$ git clone git@github.com:USER/jekyll-theme-chirpy.git -b master
```
and replace the `USER` above to your GitHub username.
The first time you run or build the project on local machine, perform the installation of Jekyll plugins. Go to the root of repo and run:
```terminal ```terminal
$ bundle install $ bundle install
``` ```
`bundle` will automatically install all the dependent Jekyll Plugins that listed in the `Gemfile`. `bundle` will automatically install all the dependencies specified by `Gemfile`.
What's more, in order to generate some extra files (*categories*, *tags* and *last modified list*), we need to use some tool scripts. If your machine is running Debian or macOS, make sure that [GNU coreutils](https://www.gnu.org/software/coreutils/) is installed. Otherwise, install by:
* Debian
```console
$ sudo apt-get install coreutils
```
* macOS
```console
$ brew install coreutils
```
## Usage ## Usage
Running [**Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/) requires some extra files, which cannot be generated by Jekyll native commands, so please strictly follow the methods mentioned below to run or deploy your website.
### Directory Structure ### Initialization
The main files and related brief introductions are listed below. Go to the root directory of the project and start initialization:
```sh ```console
jekyll-theme-chirpy/ $ bash tools/init.sh
├── _data
├── _includes
├── _layouts
├── _posts # posts stay here
├── _scripts
├── .travis.yml # remove it
├── .github # remove this, too
├── assets
├── tabs
│   └── about.md # the ABOUT page
├── .gitignore
├── 404.html
├── Gemfile
├── LICENSE
├── README.md
├── _config.yml # configuration file
├── tools # script tools
├── docs
├── feed.xml
├── index.html
├── robots.txt
└── sitemap.xml
``` ```
> If you not intend to deploy it on GitHub Pages, append parameter option `--no-gh` at the end of the above command.
As mentioned above, some files or directories should be removed from your repo: What it does is:
- .travis.yml 1. Remove some files or directories from your repository:
- .github - `.travis.yml`
- everything under `.github/`
- files under `_posts/`
- folder `docs/`
2. Unless the option `--no-gh` was enabled, setup the GitHub action workflow by renaming `pages-deploy.yml.hook` of directory `.github/workflows/` to `pages-deploy.yml`.
3. Automatically create a commit to save the changes.
### Configuration ### Configuration
Generally, go to `_config.yml` and configure the variables as needed. Some of them are typical options: Generally, go to `_config.yml` and configure the variables as needed. Some of them are typical options:
* `url` * `url`
Set to your website url and there should be no slash symbol at the tail. Format: `<protocol>://<domain>`.
* `avatar` * `avatar`
It defines the image file location of avatar. The sample image is `/assets/img/sample/avatar.jpg`, and should be replaced by your own one(a square image). Notice that a huge image file will increase the load time of your site, so keep your avatar image size as samll as possible(may be *<https://tinypng.com/>* will help).
* `timezone` * `timezone`
To ensure that the posts' release date matches the city you live in, please modify the field `timezone` correctly. A list of all available values can be found on [TimezoneConverter](http://www.timezoneconverter.com/cgi-bin/findzone/findzone) or [Wikipedia](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
* `theme_mode` * `theme_mode`
There are three options for the theme color scheme:
- **dual** - The default color scheme will follow the system settings, but if the system does not support dark mode, or the browser does not support `Media Queries Level 5`, the theme will be displayed as `light` mode by default. Anyway, the bottom left corner of the Sidebar will provide a button for users to switch color schemes.
- **dark** - Always show dark mode.
- **light** - Always show light mode.
### Run Locally ### Run Locally
You may want to preview the site content before publishing, so just run the script tool: You may want to preview the site contents before publishing, so just run it by:
```terminal ```terminal
$ bash tools/run.sh $ bash tools/run.sh
``` ```
Open a modern brower and visit at <http://localhost:4000>. Then open a browser and visit to <http://localhost:4000>.
Few days later, you may find that the file modification(e.g. edits to a post) does not refresh in real time by using `run.sh`. Don't worry, the advanced option `-r` (or `--realtime`) will solve this problem, but it requires [**fswatch**](http://emcrisostomo.github.io/fswatch/) to be installed on your machine. Type `-h` for more information. Few days later, you may find that the file changes does not refresh in real time by using `run.sh`. Don't worry, the advanced option `-r` (or `--realtime`) will solve this problem, but it requires [**fswatch**](http://emcrisostomo.github.io/fswatch/) to be installed on your machine.
### Deploying to GitHub Pages ### Deployment
Before the deployment begins, checkout the file `_config.yml` and make sure that the `url` has been configured. What's more, if you prefer the [Project site on GitHub](https://help.github.com/en/github/working-with-github-pages/about-github-pages#types-of-github-pages-sites) and also use the default domain `<username>.github.io`, 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. For example, `/project`.
#### Option 1: Built by GitHub Pages Assuming you have already gone through the [initialization](#initialization), you can now choose any of the following methods to deploy your website.
By deploying the site in this way, you're allowed to push the source code directly to the remote. #### Deploy on GitHub Pages
> **Note**: If you want to use any third-party Jekyll plugins that not in [this list](https://pages.github.com/versions/), stop reading the current approach and go to [*Option 2: Build locally*](#option-2-build-locally). For security reasons, GitHub Pages build runs on `safe` mode, which restricts us from using tool scripts 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.
**1**. Rename the repository to: 1. Push any commit to `origin/master` to trigger the GitHub Actions workflow. Once the build is complete, a new remote branch called `gh-pages` will appear, which is used to store the built site files.
|Site Type | Repo's Name| 2. Unless you prefer to project sites, rename your repository to `<username>.github.io` on GitHub.
|:---|:---|
|User or Organization | `<username>.github.io`|
|Project| Any one except `<username>.github.io`, let's say `project`|
**2**. Commit the changes of the repo first, then run the initialization script: 3. Choose branch `gh-pages` as your GitHub Pages source.
```terminal 4. Visit your website at the address indicated by GitHub.
$ bash tools/init.sh
#### Deploy on Other Platforms
On platforms other than GitHub, e.g. GitLab, we cannot enjoy the convenience of **GitHub Actions**. However, we have a tool to make up for this shortcoming.
Commit the changes of your repository first, then run the publish script:
```console
$ bash tools/publish.sh
``` ```
>**Note**: The *Recent Update* requires the posts' latest git-log date, so make sure the changes in `_posts` have been committed before running this command. > Please note that the *Recent Update* list requires the latest git-log date of posts, thus make sure the changes in `_posts` have been committed before running this command.
it will automatically generates the *Latest Modified Date* and *Categories / Tags* page for the posts and submit a commit. Its output is similar to the following log: It will automatically generates the *Latest Modified Date* and *Categories / Tags* page for the posts and submit a commit, then push to `origin/master`. Its output is similar to the following log:
```terminal ```terminal
[INFO] Success to update lastmod for 4 post(s). [INFO] Success to update lastmod for 4 post(s).
[INFO] Succeed! 3 category-pages created. [INFO] Succeed! 3 category-pages created.
[INFO] Succeed! 4 tag-pages created. [INFO] Succeed! 4 tag-pages created.
[Automation] Updated the Categories, Tags, Lastmod for post(s). [INFO] Published successfully!
11 files changed, 46 insertions(+), 3 deletions(-)
...
Updated the Categories, Tags, Lastmod for post(s).
``` ```
**3**. Push the changes to `origin/master` then go to GitHub website and enable GitHub Pages service for the repo. Lastly, enable the pages service according to the instructions of the platform you choose.
**4**. Check it out: #### Deploy on Private Server
|Site Type | Site URL | In the root of the source project, build your site by:
|:---|:---|
|User or Organization | `https://<username>.github.io/`|
|Project| `https://<username>.github.io/project/`|
#### Option 2: Build Locally
For security reasons, GitHub Pages runs on `safe` mode, which means the third-party Jekyll plugins or custom scripts won't work. If you want to use any another plugins that not in the [whitelist](https://pages.github.com/versions/), **you have to generate the site locally rather than on GitHub Pages**.
**1**. Browse to GitHub website, create a brand new repo named:
|Site Type | Repo's Name|
|:---|:---|
|User or Organization | `<username>.github.io`|
|Project| Any one except `<username>.github.io`, let's say `project`|
and clone it.
**2**. In the root of the source project, build your site by:
```console ```console
$ bash tools/build.sh -d /path/to/local/project/ $ bash tools/build.sh -d /path/to/site/
``` ```
The generated static files will be placed in the root of `/path/to/local/project`. Commit and push the changes to the `master` branch on GitHub. The generated site files will be placed in the root of `/path/to/site/`. Now you should upload those files to your web server, such as Nginx.
**3**. Go to GitHub website and enable Pages service for the new repository.
**4**. Visit at:
|Site Type | Site URL |
|:---|:---|
|User or Organization | `https://<username>.github.io/`|
|Project| `https://<username>.github.io/project/`|
#### Finishing work
No matter which way you choose to deploy the website on GitHub, please enforce the `HTTPS` for it. See official docs: [Configuring a publishing source for your GitHub Pages site](https://help.github.com/en/github/working-with-github-pages/securing-your-github-pages-site-with-https).
### Documentation ### Documentation
For more details and the better reading experience, please check out the [tutorial in 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).
## Contributing ## Contributing
@@ -247,14 +182,14 @@ The old saying, "Two heads are better than one." Consequently, welcome to report
## Credits ## Credits
This theme is mainly built with [Jekyll](https://jekyllrb.com/) ecosystem, [Bootstrap](https://getbootstrap.com/), [Font Awesome](https://fontawesome.com/) and some other wonderful tools(their copyright information can be found in the relevant files). This theme is mainly built with [Jekyll](https://jekyllrb.com/) ecosystem, [Bootstrap](https://getbootstrap.com/), [Font Awesome](https://fontawesome.com/) and some other wonderful tools (their copyright information can be found in the relevant files).
: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.
## Support ## Support
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.
## License ## License

View File

@@ -45,18 +45,18 @@ google_site_verification: google_meta_tag_verification # change to your verifica
#-------------------------- #--------------------------
# if your site type is Project Pages site, change below value to '/projectname'
# Only if your site type is GitHub Project sites and doesn't have a custom domain,
# change below value to '/projectname'.
baseurl: '' baseurl: ''
# Change to your timezone http://www.timezoneconverter.com/cgi-bin/findzone/findzone # Change to your timezone http://www.timezoneconverter.com/cgi-bin/findzone/findzone
timezone: Asia/Shanghai timezone: Asia/Shanghai
google_analytics: google_analytics:
# Fill with your Google Analytics ID id: '' # Fill with your Google Analytics ID
id: ''
# The Google Analytics pageviews switch.
pv: pv:
# The Google Analytics pageviews switch.
# DO NOT enable it unless you know how to deploy the Google Analytics superProxy. # DO NOT enable it unless you know how to deploy the Google Analytics superProxy.
enabled: false enabled: false
# the next options only valid when `google_analytics.pv` is enabled. # the next options only valid when `google_analytics.pv` is enabled.
@@ -101,6 +101,8 @@ kramdown:
line_numbers: true line_numbers: true
start_line: 1 start_line: 1
# 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.
permalink: /posts/:title/ permalink: /posts/:title/
defaults: defaults:
@@ -158,11 +160,6 @@ defaults:
- -
label: Home label: Home
url: / url: /
-
scope:
path: assets/data
values:
layout: compress
sass: sass:
@@ -181,12 +178,13 @@ compress_html:
envs: [] envs: []
exclude: exclude:
- vendor # Avoid Jekyll mistakenly read the vender directory on Travis-CI's VM . - vendor # Avoid Jekyll mistakenly read the vendor directory on Travis-CI's VM .
- Gemfile.lock - Gemfile.lock
- Gemfile - Gemfile
- tools - tools
- docs - docs
- README.md - README.md
- LICENSE
sitemap_exclude: # Sitemap will exclude the following items. sitemap_exclude: # Sitemap will exclude the following items.
fuzzy: fuzzy:

31
_data/contact.yml Normal file
View File

@@ -0,0 +1,31 @@
# The contact options.
# v2.3
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT Licensed
-
type: github
icon: 'fab fa-github-alt'
-
type: twitter
icon: 'fab fa-twitter'
-
type: email
icon: 'fas fa-envelope'
noblank: true # open link in current tab
-
type: rss
icon: 'fas fa-rss'
noblank: true
# Uncomment and complete the url below to enable more contact options
# -
# icon: 'fab fa-mastodon' # icons powered by <https://fontawesome.com/>
# url: '' # Fill with your mastodon account page
# -
# icon: 'fab fa-linkedin' # icons powered by <https://fontawesome.com/>
# url: '' # Fill with your Linkedin homepage
# -
# icon: 'fab fa-stack-overflow'
# url: '' # Fill with your stackoverflow homepage

View File

@@ -6,4 +6,6 @@
tooltip: "%a, %b %e, %Y, %l:%M %p %z" tooltip: "%a, %b %e, %Y, %l:%M %p %z"
post: "%b %e, %Y" post:
long: "%b %e, %Y"
short: "%b %e"

View File

@@ -24,6 +24,11 @@ platforms:
# Uncomment below if you need to. # Uncomment below if you need to.
# - # -
# type: Linkedin
# icon: "fab fa-linkedin"
# link: "https://www.linkedin.com/sharing/share-offsite/?url=URL"
#
# -
# type: Weibo # type: Weibo
# icon: "fab fa-weibo" # icon: "fab fa-weibo"
# link: "http://service.weibo.com/share/share.php?title=TITLE&url=URL" # link: "http://service.weibo.com/share/share.php?title=TITLE&url=URL"

View File

@@ -0,0 +1,54 @@
<!--
CSS selector for site.
Chirpy v2.3
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT Licensed
-->
{% if page.layout == 'home' %}
<link rel="preload" href="{{ '/assets/css/home.css' | relative_url }}" as="style">
<link rel="stylesheet" href="{{ '/assets/css/home.css' | relative_url }}">
{% elsif page.layout == 'page' %}
{% if page.type == 'categories' %}
<link rel="preload" href="{{ '/assets/css/categories.css' | relative_url }}" as="style">
<link rel="stylesheet" href="{{ '/assets/css/categories.css' | relative_url }}">
{% elsif page.type == 'tags' %}
<link rel="preload" href="{{ '/assets/css/tags.css' | relative_url }}" as="style">
<link rel="stylesheet" href="{{ '/assets/css/tags.css' | relative_url }}">
{% elsif page.type == 'archives' %}
<link rel="preload" href="{{ '/assets/css/archives.css' | relative_url }}" as="style">
<link rel="stylesheet" href="{{ '/assets/css/archives.css' | relative_url }}">
{% else %}
<link rel="preload" href="{{ '/assets/css/page.css' | relative_url }}" as="style">
<link rel="stylesheet" href="{{ '/assets/css/page.css' | relative_url }}">
{% endif %}
{% elsif page.layout == 'category' or page.layout == 'tag' %}
<link rel="preload" href="{{ '/assets/css/category-tag.css' | relative_url }}" as="style">
<link rel="stylesheet" href="{{ '/assets/css/category-tag.css' | relative_url }}">
{% elsif page.layout == 'post' %}
<link rel="preload" as="style" href="{{ '/assets/css/post.css' | relative_url }}">
<link rel="stylesheet" href="{{ '/assets/css/post.css' | relative_url }}">
{% 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 %}

View File

@@ -7,11 +7,13 @@
MIT License MIT License
--> -->
<div id="disqus" class="pt-2 pb-4"> <div id="disqus" class="pt-2 pb-2">
<p class="font-italic text-muted small">Comments powered by <a href="https://disqus.com/">Disqus</a>.</p> <p class="font-italic text-center text-muted small">
Comments powered by <a href="https://disqus.com/">Disqus</a>.
</p>
</div> </div>
<script src="{{ site.baseurl }}/assets/lib/jquery.disqusloader.min.js"></script> <script src="{{ site.baseurl }}/assets/js/lib/jquery.disqusloader.min.js"></script>
<script> <script>
var options = { var options = {
scriptUrl: '//{{ site.disqus.shortname }}.disqus.com/embed.js', scriptUrl: '//{{ site.disqus.shortname }}.disqus.com/embed.js',

View File

@@ -3,7 +3,10 @@
https://github.com/penibelst/jekyll-compress-html/issues/101 https://github.com/penibelst/jekyll-compress-html/issues/101
https://github.com/penibelst/jekyll-compress-html/issues/71#issuecomment-188144901 https://github.com/penibelst/jekyll-compress-html/issues/71#issuecomment-188144901
--> -->
{% if _content contains '<pre class="highlight">' %} {% if include.content contains '<pre class="highlight">' %}
{% assign _content = _content | replace: '<pre class="highlight"><code', '<code' %} {% assign content = include.content | replace: '<pre class="highlight"><code', '<code' %}
{% assign _content = _content | replace: '</code></pre>', '</code>' %} {% assign content = content | replace: '</code></pre>', '</code>' %}
{% endif %} {{ content }}
{% else %}
{{ include.content }}
{% endif %}

View File

@@ -11,22 +11,21 @@
<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">
<title> <title>
{%- if page.layout == "home" -%} {%- unless page.layout == "home" -%}
{{- site.title -}} {{ page.title | append: " | "}}
{%- else -%} {%- endunless -%}
{{ page.title }} | {{ site.title }} {{ site.title }}
{%- endif -%}
</title> </title>
{% seo title=false %} {% seo title=false %}
{% include favicons.html %} {% include favicons.html %}
<!-- google fonts --> <!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous">
<link rel="dns-prefetch" href="https://fonts.gstatic.com"> <link rel="dns-prefetch" href="https://fonts.gstatic.com">
<!-- ga --> <!-- GA -->
{% if jekyll.environment == 'production' %} {% if jekyll.environment == 'production' %}
<link rel="preconnect" href="https://www.google-analytics.com" crossorigin="use-credentials"> <link rel="preconnect" href="https://www.google-analytics.com" crossorigin="use-credentials">
<link rel="dns-prefetch" href="https://www.google-analytics.com"> <link rel="dns-prefetch" href="https://www.google-analytics.com">
@@ -40,113 +39,37 @@
{% endif %} {% endif %}
{% endif %} {% endif %}
<!-- jsdelivr CDN --> <!-- jsDelivr CDN -->
<link rel="preconnect" href="cdn.jsdelivr.net"> <link rel="preconnect" href="cdn.jsdelivr.net">
<link rel="dns-prefetch" href="cdn.jsdelivr.net"> <link rel="dns-prefetch" href="cdn.jsdelivr.net">
<!-- Bootstrap -->
<link rel="preload" as="style" <link rel="preload" as="style"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css"
integrity="sha256-LA89z+k9fjgMKQ/kq4OO2Mrf8VltYml/VES+Rg0fh20=" crossorigin> integrity="sha256-LA89z+k9fjgMKQ/kq4OO2Mrf8VltYml/VES+Rg0fh20=" crossorigin>
<link rel="preload" as="style"
href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.11.2/css/all.min.css"
integrity="sha256-+N4/V/SbAFiW1MPBCXnfnP9QSN3+Keu+NlB+0ev/YKQ="
crossorigin="anonymous">
<link rel="stylesheet" <link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css"
integrity="sha256-LA89z+k9fjgMKQ/kq4OO2Mrf8VltYml/VES+Rg0fh20=" crossorigin="anonymous"> integrity="sha256-LA89z+k9fjgMKQ/kq4OO2Mrf8VltYml/VES+Rg0fh20=" crossorigin="anonymous">
<!-- Font Awesome -->
<link rel="stylesheet" <link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.11.2/css/all.min.css" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.11.2/css/all.min.css"
integrity="sha256-+N4/V/SbAFiW1MPBCXnfnP9QSN3+Keu+NlB+0ev/YKQ=" integrity="sha256-+N4/V/SbAFiW1MPBCXnfnP9QSN3+Keu+NlB+0ev/YKQ="
crossorigin="anonymous"> crossorigin="anonymous">
{% if page.layout == 'home' %} {% include css-selector.html %}
<link rel="preload" href="{{ site.baseurl }}/assets/css/home.css" as="style">
<link rel="stylesheet" href="{{ site.baseurl }}/assets/css/home.css">
{% elsif page.layout == 'page' %} <!-- JavaScripts -->
{% if page.title == 'Categories' %} <link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/jquery@3.4.1"
<link rel="preload" href="{{ site.baseurl }}/assets/css/categories.css" as="style">
<link rel="stylesheet" href="{{ site.baseurl }}/assets/css/categories.css">
{% elsif page.title == 'Tags' %}
<link rel="preload" href="{{ site.baseurl }}/assets/css/tags.css" as="style">
<link rel="stylesheet" href="{{ site.baseurl }}/assets/css/tags.css">
{% elsif page.title == 'Archives' %}
<link rel="preload" href="{{ site.baseurl }}/assets/css/archives.css" as="style">
<link rel="stylesheet" href="{{ site.baseurl }}/assets/css/archives.css">
{% else %}
<link rel="preload" href="{{ site.baseurl }}/assets/css/page.css" as="style">
<link rel="stylesheet" href="{{ site.baseurl }}/assets/css/page.css">
{% endif %}
{% elsif page.layout == 'category' or page.layout == 'tag' %}
<link rel="preload" href="{{ site.baseurl }}/assets/css/category-tag.css" as="style">
<link rel="stylesheet" href="{{ site.baseurl }}/assets/css/category-tag.css">
{% elsif page.layout == 'post' %}
<link rel="preload" as="style" href="{{ site.baseurl }}/assets/css/post.css">
<link rel="stylesheet" href="{{ site.baseurl }}/assets/css/post.css">
{% if site.toc and page.toc %}
<link rel="preload" as="style" href="{{ site.baseurl }}/assets/lib/bootstrap-toc-1.0.1/bootstrap-toc.min.css">
<link rel="stylesheet" href="{{ site.baseurl }}/assets/lib/bootstrap-toc-1.0.1/bootstrap-toc.min.css" />
{% endif %}
{% endif %}
<!-- jquery -->
<link rel="preload" as="script"
href="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"> integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous">
<!-- popper --> <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1"
<link rel="preload" as="script"
href="https://cdn.jsdelivr.net/npm/popper.js@1.15.0/dist/umd/popper.min.js"
integrity="sha256-fTuUgtT7O2rqoImwjrhDgbXTKUwyxxujIMRIK7TbuNU=" crossorigin>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script> integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<script> <script src="https://cdn.jsdelivr.net/combine/npm/popper.js@1.15.0,npm/bootstrap@4.0.0/dist/js/bootstrap.min.js" async></script>
window.jQuery || document.write('<script src="{{ site.baseurl }}/assets/lib/jquery-3.4.1.min.js"><\/script>');
</script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.15.0/dist/umd/popper.min.js" {% include js-selector.html %}
integrity="sha256-fTuUgtT7O2rqoImwjrhDgbXTKUwyxxujIMRIK7TbuNU=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/js/bootstrap.min.js"
integrity="sha256-5+02zu5UULQkO7w1GIr6vftCgMfFdZcAHeDtFnKZsBs=" crossorigin="anonymous" async></script>
<script src="{{ site.baseurl }}/assets/js/dist/commons.js" async></script>
{% if page.layout == 'home' or page.layout == 'post' %}
<script src="{{ site.baseurl }}/assets/js/dist/timeago.min.js" async></script>
{% if site.google_analytics.pv.enabled %}
<script src="{{ site.baseurl }}/assets/data/pv-data.json"></script>
<script src="{{ site.baseurl }}/assets/lib/countUp.min.js" async></script>
<script src="{{ site.baseurl }}/assets/js/dist/pageviews.min.js" async></script>
{% endif %}
{% endif %}
{% if site.toc and page.toc and page.layout == 'post' %}
<link rel="preload" as="script" href="{{ site.baseurl }}/assets/lib/bootstrap-toc-1.0.1/bootstrap-toc.min.js">
<script src="{{ site.baseurl }}/assets/lib/bootstrap-toc-1.0.1/bootstrap-toc.min.js" async></script>
<script src="{{ site.baseurl }}/assets/js/dist/toc.min.js" async></script>
{% endif %}
<script src="{{ site.baseurl }}/assets/js/dist/tooltip-loader.min.js" async></script>
<!-- PWA -->
{% if jekyll.environment == 'production' %}
<script src="{{ '/app.js' | relative_url }}" defer></script>
{% endif %}
</head> </head>

View File

@@ -0,0 +1,41 @@
<!--
JS selector for site.
Chirpy v2.3
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT Licensed
-->
{% if page.layout == 'home' %}
<script src="{{ '/assets/js/home.min.js' | relative_url }}" async></script>
{% elsif page.layout == 'post' %}
<script src="{{ '/assets/js/post.min.js' | relative_url }}" async></script>
{% if page.math %}
<!-- MathJax -->
<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" async></script>
{% endif %}
{% elsif page.layout == 'page' %}
{% if page.type == 'categories' %}
<script src="{{ '/assets/js/categories.min.js' | relative_url }}" async></script>
{% else %}
<script src="{{ '/assets/js/page.min.js' | relative_url }}" async></script>
{% endif %}
{% else %}
<script src="{{ '/assets/js/page.min.js' | relative_url }}" async></script>
{% endif %}
<!-- PWA -->
{% if jekyll.environment == 'production' %}
<script src="{{ '/app.js' | relative_url }}" defer></script>
{% endif %}

View File

@@ -1,7 +1,8 @@
<!-- 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 el = document.querySelectorAll('#post-wrapper img'); const imgs = document.querySelectorAll('#post-wrapper img');
const observer = lozad(el); const observer = lozad(imgs);
observer.observe(); observer.observe();
</script> </script>

View File

@@ -1,12 +1,14 @@
{% comment %} {% comment %}
Remove line numbers from code snippets. Remove the line number of the code snippet.
v2.2 v2.2
https://github.com/cotes2020/jekyll-theme-chirpy https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung © 2020 Cotes Chung
Published under the MIT License Published under the MIT License
{% endcomment %} {% endcomment %}
{% if _content contains '<td class="rouge-gutter gl"><pre class="lineno">' %} {% assign content = include.content %}
{% assign _content = _content | replace: '<td class="rouge-gutter gl"><pre class="lineno">', '<!-- <td class="rouge-gutter gl"><pre class="lineno">'%}
{% assign _content = _content | replace: '</td><td class="rouge-code">', '</td> --><td class="rouge-code">' %} {% if content contains '<td class="rouge-gutter gl"><pre class="lineno">' %}
{% assign content = content | replace: '<td class="rouge-gutter gl"><pre class="lineno">', '<!-- <td class="rouge-gutter gl"><pre class="lineno">'%}
{% assign content = content | replace: '</td><td class="rouge-code">', '</td> --><td class="rouge-code">' %}
{% endif %} {% endif %}

View File

@@ -12,7 +12,7 @@
{% if site.data.updates %} {% if site.data.updates %}
{% include update_list.html %} {% include update-list.html %}
{% if update_list.size > 0 %} {% if update_list.size > 0 %}
@@ -23,17 +23,12 @@
<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 %}
{% assign post_url = item | split: "::" | last | prepend: "/posts/" | append: "/" %} {% assign post_url = item | split: "::" | last | url_encode | prepend: "/posts/" | append: "/" %}
{% assign post = site.posts | where: "url", post_url | first %} {% assign post = site.posts | where: "url", post_url | first %}
{% if post %} {% if post %}
{% assign url = post.url | prepend: site.baseurl %} {% assign url = post.url | relative_url %}
<li><a href="{{ url }}">{{ post.title }}</a></li> <li><a href="{{ url }}">{{ post.title }}</a></li>
{% assign sum = sum | plus: 1 %}
{% if sum >= MAX_SIZE %} {% break %} {% endif %}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
@@ -45,24 +40,27 @@
{% endif %} <!-- site.data.updates --> {% endif %} <!-- site.data.updates -->
{% include trending-tags.html %}
{% if trending_tags.size > 0 %}
<div id="access-tags"> <div id="access-tags">
<h3 data-toc-skip> <h3 data-toc-skip>
{{- site.data.label.panel.trending_tags -}} {{- site.data.label.panel.trending_tags -}}
</h3> </h3>
<div class="d-flex flex-wrap mt-3 mb-1 mr-3"> <div class="d-flex flex-wrap mt-3 mb-1 mr-3">
{% include trending-tags.html %}
{% for tag in trending_tags %} {% for tag in trending_tags %}
{% capture url %}/tags/{{ tag | downcase | url_encode }}/{% endcapture %} {% capture url %}/tags/{{ tag | downcase | url_encode }}/{% endcapture %}
<a class="post-tag" href="{{ url | relative_url }}">{{ tag | replace: '-', ' ' }}</a> <a class="post-tag" href="{{ url | relative_url }}">{{ tag | replace: '-', ' ' }}</a>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
{% endif %}
</div> <!-- .access --> </div> <!-- .access -->
{% if page.layout == 'post' and site.toc and page.toc %} {% if page.layout == 'post' and site.toc and page.toc %}
<div id="toc-wrapper" class="pl-0 pr-4 mb-5"> <div id="toc-wrapper" class="pl-0 pr-4 mb-5">
<h3 data-toc-skip class="pl-3 pt-2 mb-3"> <h3 data-toc-skip class="pl-3 pt-2 mb-2">
{{- site.data.label.panel.toc -}} {{- site.data.label.panel.toc -}}
</h3> </h3>
<nav id="toc" data-toggle="toc"></nav> <nav id="toc" data-toggle="toc"></nav>

View File

@@ -1,75 +1,110 @@
<!-- <!--
The related posts of current post. Recommend the other 3 posts according to the tags and categories of the current post,
Placed in the bottom of every single post. if the number is not enough, use the other latest posts to supplement.
v2.0 v2.0
https://github.com/cotes2020/jekyll-theme-chirpy https://github.com/cotes2020/jekyll-theme-chirpy
© 2019 Cotes Chung © 2019 Cotes Chung
Published under the MIT License Published under the MIT License
--> -->
{% assign MAX_SIZE = 3 %} <!-- The total size of related posts -->
{% assign TOTAL_SIZE = 3 %}
<!-- An random integer that bigger than 0 -->
{% assign TAG_SCORE = 1 %} {% assign TAG_SCORE = 1 %}
<!-- Equals to TAG_SCORE / {max_categories_hierarchy} -->
{% assign CATEGORY_SCORE = 0.5 %} {% assign CATEGORY_SCORE = 0.5 %}
{% assign SEPARATOR = ":" %}
{% assign score_list = "" | split: "" %} {% assign score_list = "" | split: "" %}
{% assign post_index = 0 %} {% assign last_index = site.posts.size | minus: 1 %}
{% for post in site.posts %} {% for i in (0..last_index) %}
{% if post.url != page.url %} {% assign post = site.posts[i] %}
{% assign score = 0 %}
{% for tag in post.tags %}
{% if page.tags contains tag %}
{% assign score = score | plus: TAG_SCORE %}
{% endif %}
{% endfor %}
{% for category in post.categories %}
{% if page.categories contains category %}
{% assign score = score | plus: CATEGORY_SCORE %}
{% endif %}
{% endfor %}
{% if score > 0 %}
{% capture score_item %}{{ score }}:{{ post_index }}{% endcapture %}
{% assign score_list = score_list | push: score_item %}
{% endif %}
{% if post.url == page.url %}
{% continue %}
{% endif %} {% endif %}
{% assign post_index = post_index | plus: 1 %}
{% assign score = 0 %}
{% for tag in post.tags %}
{% if page.tags contains tag %}
{% assign score = score | plus: TAG_SCORE %}
{% endif %}
{% endfor %}
{% for category in post.categories %}
{% if page.categories contains category %}
{% assign score = score | plus: CATEGORY_SCORE %}
{% endif %}
{% endfor %}
{% if score > 0 %}
{% capture score_item %}{{ score }}{{ SEPARATOR }}{{ i }}{% endcapture %}
{% assign score_list = score_list | push: score_item %}
{% endif %}
{% endfor %} {% endfor %}
{% assign index_list = "" | split: "" %}
{% if score_list.size > 0 %} {% if score_list.size > 0 %}
{% assign score_list = score_list | sort | reverse %} {% assign score_list = score_list | sort | reverse %}
{% assign count = 0 %} {% for entry in score_list limit: TOTAL_SIZE %}
<div id="related-posts" class="mt-4 mb-2 mb-sm-4 pb-2"> {% assign index = entry | split: SEPARATOR | last %}
{% assign index_list = index_list | push: index %}
{% endfor %}
{% endif %}
<!-- Fill with the other newlest posts -->
{% assign less = TOTAL_SIZE | minus: index_list.size %}
{% if less > 0 %}
{% for i in (0..last_index) %}
{% assign post = site.posts[i] %}
{% if post.url != page.url %}
{% capture cur_index %}{{ i }}{% endcapture %}
{% unless index_list contains cur_index %}
{% assign index_list = index_list | push: cur_index %}
{% assign less = less | minus: 1 %}
{% if less <= 0 %}
{% break %}
{% endif %}
{% endunless %}
{% endif %}
{% endfor %}
{% endif %}
{% if index_list.size > 0 %}
<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 }}</h3>
<div class="card-deck mb-4"> <div class="card-deck mb-4">
{% for score_item in score_list %} {% for entry in index_list %}
{% assign data = score_item | split: ":" %} {% assign index = entry | plus: 0 %}
{% assign index = data[1] | plus: 0 %}
{% assign post = site.posts[index] %} {% assign post = site.posts[index] %}
<div class="card"> <div class="card">
<a href="{{ post.url | relative_url }}"> <a href="{{ post.url | relative_url }}">
<div class="card-body"> <div class="card-body">
<span class="timeago small"> {% include timeago.html date=post.date class="small" %}
{{ post.date | date: site.data.date_format.post }}
<i class="unloaded">{{ post.date | date_to_xmlschema }}</i>
</span>
<h3 class="pt-0 mt-1 mb-3" data-toc-skip>{{ post.title }}</h3> <h3 class="pt-0 mt-1 mb-3" data-toc-skip>{{ post.title }}</h3>
<div class="text-muted small"> <div class="text-muted small">
{% assign content = post.content %} <p>
{% include no-linenos.html %} {% include no-linenos.html content=post.content %}
<p>{{ content | markdownify | strip_html | truncate: 200 | replace: '&', '&amp;' }}</p> {{ content | markdownify | strip_html | truncate: 200 }}
</p>
</div> </div>
</div> </div>
</a> </a>
</div> </div>
{% assign count = count | plus: 1 %}
{% if count >= MAX_SIZE %}
{% break %}
{% endif %}
{% endfor %} {% endfor %}
</div> <!-- .card-deck --> </div> <!-- .card-deck -->
</div> </div> <!-- #related-posts -->
{% endif %} {% endif %}

View File

@@ -5,7 +5,6 @@
© 2017-2019 Cotes Chung © 2017-2019 Cotes Chung
MIT License MIT License
--> -->
<script src="https://cdn.jsdelivr.net/npm/simple-jekyll-search@1.7.3/dest/simple-jekyll-search.min.js" integrity="sha256-qcLR00zq6pJk4je3MLgAri8Nn+ZumUlXgTKR2H/xCY0=" crossorigin="anonymous"></script>
{% capture result_elem %} {% capture result_elem %}
<div class="pl-1 pr-1 pl-sm-2 pr-sm-2 pl-lg-4 pr-lg-4 pl-xl-0 pr-xl-0"> <div class="pl-1 pr-1 pl-sm-2 pr-sm-2 pl-lg-4 pr-lg-4 pl-xl-0 pr-xl-0">
@@ -20,11 +19,13 @@
{% capture not_found %}<p class="mt-5">Oops! No result founds.</p>{% endcapture %} {% capture not_found %}<p class="mt-5">Oops! No result founds.</p>{% endcapture %}
<script src="https://cdn.jsdelivr.net/npm/simple-jekyll-search@1.7.3/dest/simple-jekyll-search.min.js"></script>
<script> <script>
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/data/search.json', json: '{{ site.baseurl }}/assets/js/data/search.json',
searchResultTemplate: '{{ result_elem | strip_newlines }}', searchResultTemplate: '{{ result_elem | strip_newlines }}',
noResultsText: '{{ not_found }}' noResultsText: '{{ not_found }}'
}); });

View File

@@ -9,11 +9,14 @@
<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 }}</h4>
{% include trending-tags.html %} {% include trending-tags.html %}
{% for tag in trending_tags %} {% for tag in trending_tags %}
{% capture url %}/tags/{{ tag | downcase | url_encode }}/{% endcapture %} {% capture url %}/tags/{{ tag | downcase | url_encode }}/{% endcapture %}
<a class="post-tag" href="{{ url | relative_url }}">{{ tag | replace: '-', ' ' }}</a> <a class="post-tag" href="{{ url | relative_url }}">{{ tag | replace: '-', ' ' }}</a>
{% endfor %} {% endfor %}
</div> </div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div> <div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div> </div>

View File

@@ -15,15 +15,15 @@
{% if start == '/' %} {% if start == '/' %}
{% assign avatar_url = avatar_url | prepend: site.baseurl %} {% assign avatar_url = avatar_url | prepend: site.baseurl %}
{% endif %} {% endif %}
<img src="{{ avatar_url }}" alt="avatar"> <img src="{{ avatar_url }}" alt="avatar" onerror="this.style.display='none'">
</a> </a>
</div> </div>
<div class="profile-text mt-3"> <div class="profile-text mt-3">
<div id="site-title"> <div class="site-title">
<a href="{{ site.baseurl }}/">{{- site.title -}}</a> <a href="{{ '/' | relative_url }}">{{- site.title -}}</a>
</div> </div>
<div id="site-subtitle" class="font-italic">{{- site.tagline -}}</div> <div class="site-subtitle font-italic">{{- site.tagline -}}</div>
</div> </div>
</div> </div>
@@ -45,7 +45,7 @@
or item.name == page.tab_active or item.name == page.tab_active
or item.name == "Home" and page.layout == "home" %}active{% endif %}"> or item.name == "Home" and page.layout == "home" %}active{% endif %}">
<a href="{{ ref }}" class="nav-link d-flex justify-content-center align-items-center w-100"> <a href="{{ ref }}" class="nav-link d-flex justify-content-center align-items-center w-100">
<i class="fa-fw {{ item.icon }} ml-3 mr-3 unloaded"></i> <i class="fa-fw {{ item.icon }} ml-xl-3 mr-xl-3 unloaded"></i>
<span>{{ item.name | upcase }}</span> <span>{{ item.name | upcase }}</span>
</a> </a>
</li> <!-- .nav-item --> </li> <!-- .nav-item -->
@@ -64,18 +64,27 @@
<span class="icon-border"></span> <span class="icon-border"></span>
{% endif %} {% endif %}
<a href="https://github.com/{{ site.github.username }}" target="_blank"> {% for entry in site.data.contact %}
<i class="fab fa-github-alt"></i> {% capture url %}
</a> {%- if entry.type == 'github' -%}
<a href="https://twitter.com/{{ site.twitter.username }}" target="_blank"> https://github.com/{{ site.github.username }}
<i class="fab fa-twitter"></i> {%- elsif entry.type == 'twitter' -%}
</a> https://twitter.com/{{ site.twitter.username }}
{% assign email = site.social.email | split: '@' %} {%- elsif entry.type == 'email' -%}
<a href="javascript:window.open('mailto:' + ['{{ email[0] }}','{{ email[1] }}'].join('@'))"> {% assign email = site.social.email | split: '@' %}
<i class="fas fa-envelope"></i> javascript:window.open('mailto:' + ['{{ email[0] }}','{{ email[1] }}'].join('@'))
</a> {%- elsif entry.type == 'rss' -%}
<a href="{{ site.baseurl }}/feed.xml" target="_blank"> {{ "/feed.xml" | relative_url }}
<i class="fas fa-rss"></i> {%- else -%}
</a> {{ entry.url }}
{%- endif -%}
{% endcapture %}
{% if url != '' %}
<a href="{{ url }}" {% unless entry.noblank %}target="_blank"{% endunless %}>
<i class="{{ entry.icon }}"></i>
</a>
{% endif %}
{% endfor %}
</div> </div>

27
_includes/timeago.html Normal file
View File

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

View File

@@ -1,5 +1,5 @@
{% comment %} {% comment %}
Get the last 5 post from lastmod list. Get the last 5 posts from lastmod list.
v2.2 v2.2
https://github.com/cotes2020/jekyll-theme-chirpy https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung © 2020 Cotes Chung
@@ -7,15 +7,20 @@
{% endcomment %} {% endcomment %}
{% assign MAX_SIZE = 5 %} {% assign MAX_SIZE = 5 %}
{% assign sum = 0 %}
{% assign update_list = "" | split: "" %} {% assign all_list = "" | split: "" %}
{% for entry in site.data.updates %} {% for entry in site.data.updates %}
{% capture elem %} {% capture elem %}
{{- entry.lastmod -}}::{{- entry.filename -}} {{- entry.lastmod -}}::{{- entry.filename -}}
{% endcapture %} {% endcapture %}
{% assign all_list = all_list | push: elem %}
{% assign update_list = update_list | push: elem %}
{% endfor %} {% endfor %}
{% assign update_list = update_list | sort | reverse %} {% assign all_list = all_list | sort | reverse %}
{% assign update_list = "" | split: "" %}
{% for entry in all_list limit:MAX_SIZE %}
{% assign update_list = update_list | push: entry %}
{% endfor %}

View File

@@ -16,9 +16,9 @@ layout: page
<ul class="post-content pl-0"> <ul class="post-content pl-0">
{% for post in site.categories[page.category] %} {% for post in site.categories[page.category] %}
<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 | absolute_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 }}</span> <span class="text-muted small">{{ post.date | date: site.data.date_format.post.long }}</span>
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>

View File

@@ -9,13 +9,19 @@ layout: compress
<!DOCTYPE html> <!DOCTYPE html>
{% if site.lang %}
{% assign lang = site.lang | split: "_" | first %}
{% else %}
{% assign lang = 'en' %}
{% endif %}
{% capture prefer_mode %} {% capture prefer_mode %}
{% if site.theme_mode != "dual" %} {% if site.theme_mode != "dual" %}
mode="{{ site.theme_mode }}" mode="{{ site.theme_mode }}"
{% endif %} {% endif %}
{% endcapture %} {% endcapture %}
<html lang="en" {{ prefer_mode }} > <html lang="{{ lang }}" {{ prefer_mode }} >
{% include head.html %} {% include head.html %}
@@ -30,15 +36,12 @@ layout: compress
<div id="main-wrapper"> <div id="main-wrapper">
<div id="main"> <div id="main">
{% capture _content %} {% include fixlinenos.html content=content %}
{{ content }}
{% endcapture %}
{% include fixlinenos.html %}
{{ _content }}
{% include footer.html %} {% include footer.html %}
</div> </div>
{% include search-results.html %} {% include search-results.html %}
</div> <!-- #main-wrapper --> </div> <!-- #main-wrapper -->

View File

@@ -7,28 +7,67 @@ layout: page
# MIT Licensed # MIT Licensed
--- ---
{% assign pinned = site.posts | where_exp: "item", "item.pin == true" %}
{% assign default = site.posts | where_exp: "item", "item.pin == nil " %}
{% assign posts = "" | split: "" %}
<!-- Get pinned posts -->
{% assign offset = paginator.page | minus: 1 | times: paginator.per_page %}
{% assign pinned_num = pinned.size | minus: offset %}
{% if pinned_num > 0 %}
{% for i in (offset..pinned.size) limit: pinned_num %}
{% assign posts = posts | push: pinned[i] %}
{% endfor %}
{% else %}
{% assign pinned_num = 0 %}
{% endif %}
<!-- Get default posts -->
{% assign default_beg = offset | minus: pinned.size %}
{% if default_beg < 0 %}
{% assign default_beg = 0 %}
{% endif %}
{% assign default_num = paginator.posts | size | minus: pinned_num %}
{% assign default_end = default_beg | plus: default_num | minus: 1 %}
{% if default_num > 0 %}
{% for i in (default_beg..default_end) %}
{% assign posts = posts | push: default[i] %}
{% endfor %}
{% endif %}
<div id="post-list"> <div id="post-list">
{% for post in paginator.posts %}
{% for post in posts %}
<div class="post-preview"> <div class="post-preview">
<h1> <div class="d-flex justify-content-between pr-xl-2">
<a href="{{ site.baseurl }}{{ post.url }}">{{ post.title }}</a> <h1><a href="{{ post.url | relative_url }}">{{ post.title }}</a></h1>
</h1> {% if post.pin %}
<i class="fas fa-thumbtack fa-fw text-muted mt-1 ml-2 mt-xl-2" data-toggle="tooltip" data-placement="left"
title="Pinned"></i>
{% endif %}
</div>
<div class="post-content"> <div class="post-content">
<p> <p>
{% assign _content = post.content %} {% include no-linenos.html content=post.content %}
{% include no-linenos.html %} {{ content | markdownify | strip_html | truncate: 200 }}
{{ _content | markdownify | strip_html | truncate: 200 }}
</p> </p>
</div> </div>
<div class="post-meta text-muted"> <div class="post-meta text-muted">
<!-- posted date --> <!-- posted date -->
<i class="far fa-clock fa-fw"></i> <i class="far fa-clock fa-fw"></i>
<span class="timeago" data-toggle="tooltip" data-placement="bottom" {% include timeago.html date=post.date tooltip=true %}
title="{{ post.date | date: site.data.date_format.tooltip }}">
{{ post.date | date: site.data.date_format.post }}
<i class="unloaded">{{ post.date | date_to_xmlschema }}</i>
</span>
<!-- page views --> <!-- page views -->
{% if site.google_analytics.pv.enabled %} {% if site.google_analytics.pv.enabled %}
<i class="far fa-eye fa-fw"></i> <i class="far fa-eye fa-fw"></i>
@@ -38,7 +77,9 @@ layout: page
{% endif %} {% endif %}
</div> </div>
</div> <!-- .post-review --> </div> <!-- .post-review -->
{% endfor %}
{% endfor %}
</div> <!-- #post-list --> </div> <!-- #post-list -->
{% if paginator.total_pages > 0 %} {% if paginator.total_pages > 0 %}

View File

@@ -19,16 +19,12 @@ layout: default
<!-- Published date and author --> <!-- Published date and author -->
<div> <div>
Posted Posted
<span class="timeago" data-toggle="tooltip" data-placement="bottom" {% include timeago.html date=page.date tooltip=true %}
title="{{ page.date | date: site.data.date_format.tooltip }}">
{{ page.date | date: site.data.date_format.post }}
<i class="unloaded">{{ page.date | date_to_xmlschema }}</i>
</span>
by by
<span class="author"> <span class="author">
{% if page.author %} {% if page.author %}
{{ page.author }} {{ page.author }}
{% else%} {% else %}
{{ site.author }} {{ site.author }}
{% endif %} {% endif %}
</span> </span>
@@ -39,17 +35,18 @@ layout: default
{{ page.url | split: "/" | last }} {{ page.url | split: "/" | last }}
{%- endcapture -%} {%- endcapture -%}
{% assign record = site.data.updates | where: "filename", filename | first %} {% for item in site.data.updates %}
{% assign encode_filename = item.filename | url_encode %}
{% if filename == encode_filename %}
{% assign lastmod = item.lastmod %}
{% break %}
{% endif %}
{% endfor %}
{% if record %} {% if lastmod %}
<div> <div>
Updated Updated
<span class="timeago lastmod" {% include timeago.html date=lastmod class="lastmod" tooltip=true %}
data-toggle="tooltip" data-placement="bottom"
title="{{ record.lastmod | date: site.data.date_format.tooltip }}">
{{ record.lastmod | date: site.data.date_format.post }}
<i class="unloaded">{{ record.lastmod | date_to_xmlschema}}</i>
</span>
</div> </div>
{% endif %} {% endif %}
@@ -64,13 +61,15 @@ layout: default
</div> <!-- .post-meta --> </div> <!-- .post-meta -->
<div class="post-content"> <div class="post-content">
{% if page.image %} {% if page.image %}
<img src="{{ page.image }}"> <img src="{{ page.image }}">
{% endif %} {% endif %}
<!-- Using lozad. See: <https://github.com/ApoorvSaxena/lozad.js#usage> -->
{{ content }} {% if content contains '<img src=' %}
{{ content | replace: '<img src=', '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-src=' }}
{% else %}
{{ content }}
{% endif %}
</div> </div>
<div class="post-tail-wrapper text-muted"> <div class="post-tail-wrapper text-muted">
@@ -100,7 +99,7 @@ layout: default
{% endif %} {% endif %}
<div class="post-tail-bottom <div class="post-tail-bottom
d-flex justify-content-between align-items-center pt-5 pb-2"> d-flex justify-content-between align-items-center mt-3 pt-5 pb-2">
{% if site.data.rights.license %} {% if site.data.rights.license %}
<div class="license-wrapper"> <div class="license-wrapper">
This post is licensed under This post is licensed under
@@ -117,6 +116,7 @@ layout: default
</div> <!-- .post --> </div> <!-- .post -->
</div> <!-- #post-wrapper --> </div> <!-- #post-wrapper -->
{% include panel.html %} {% include panel.html %}
@@ -124,21 +124,20 @@ layout: default
</div> <!-- .row --> </div> <!-- .row -->
<div class="row"> <div class="row">
<div id="post-extend-wrapper" class="col-12 col-lg-11 col-xl-8"> <div class="col-12 col-lg-11 col-xl-8">
<div id="post-extend-wrapper" class="pl-1 pr-1 pl-sm-2 pr-sm-2 pl-md-4 pr-md-4">
<div class="pl-1 pr-1 pl-sm-2 pr-sm-2 pl-md-4 pr-md-4"> {% include related-posts.html %}
{% include post-nav.html %} {% include post-nav.html %}
{% if site.disqus.comments and page.comments %} {% if site.disqus.comments and page.comments %}
{% include disqus.html %} {% include disqus.html %}
{% endif %} {% endif %}
{% include related-posts.html %} </div> <!-- #post-extend-wrapper -->
</div> <!-- .pl-1 pr-1 --> </div> <!-- .col-* -->
</div> <!-- #post-extend-wrapper -->
</div> <!-- .row --> </div> <!-- .row -->

View File

@@ -16,9 +16,9 @@ layout: page
<ul class="post-content pl-0"> <ul class="post-content pl-0">
{% for post in site.tags[page.tag] %} {% for post in site.tags[page.tag] %}
<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 | absolute_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 }}</span> <span class="text-muted small">{{ post.date | date: site.data.date_format.post.long }}</span>
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>

View File

@@ -4,9 +4,10 @@ author: Cotes Chung
date: 2019-08-08 11:33:00 +0800 date: 2019-08-08 11:33:00 +0800
categories: [Blogging, Demo] categories: [Blogging, Demo]
tags: [typography] tags: [typography]
math: true
--- ---
This Jekyll template totally compatible with Markdown syntax. Now, let's take a look for the text and typography in this theme. This Jekyll template totally compatible with Markdown syntax. Now, let's take a look for the text and typography in here.
## Titles ## Titles
@@ -49,7 +50,7 @@ Fluttering and dancing in the breeze.
## Link ## Link
[http://127.0.0.1:4000](http://127.0.0.1:4000) <http://127.0.0.1:4000>
## Footnote ## Footnote
@@ -66,6 +67,15 @@ Click the hook will locate the footnote[^footnote].
This is an example of `Inline Code`. This is an example of `Inline Code`.
## Mathematics
The mathematics powered by [**MathJax**](https://www.mathjax.org/):
$$ \sum_{n=1}^\infty 1/n^2 = \frac{\pi^2}{6} $$
When \\(a \ne 0\\), there are two solutions to \\(ax^2 + bx + c = 0\\) and they are
$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$
## Code Snippet ## Code Snippet

View File

@@ -8,7 +8,7 @@ tags: [writing]
## Naming and Path ## Naming and Path
Create a new file named with the format `YYYY-MM-DD-title.md` then put it into `_post` of the root directory. Create a new file named `YYYY-MM-DD-TITLE.EXTENSION` and put it in the `_post/` of the root directory. The `EXTENSION` must be one of `md` and `markdown`. From `v2.4.1`, you can create sub-directories under `_posts/` to categorize posts.
## Front Matter ## Front Matter
@@ -33,27 +33,28 @@ In order to accurately record the release date of a post, you should not only se
The `categories` of each post is designed to contain up to two elements, and the number of elements in `tags` can be zero to infinity. The `categories` of each post is designed to contain up to two elements, and the number of elements in `tags` can be zero to infinity.
The list of posts belonging to the same category/tag is recorded on a separate page. The number of such *category*/*tag* type pages is equal to the number of `categories`/`tags` for all posts, they must match perfectly. The list of posts belonging to the same _category_/_tag_ is recorded on a separate page. At the same time, the number of these _category_/_tag_ type pages is equal to the number of `categories` / `tags` elements for all posts, which means that the two number must be exactly the same.
For instance, let's say there is a post with front matter:
let's say there is a post with front matter:
```yaml ```yaml
categories: [Animal, Insect] categories: [Animal, Insect]
tags: bee tags: bee
``` ```
then we should have two *category* type pages placed in folder `categories` of root and one *tag* type page placed in folder `tags` of root: Then we should have two _category_ type pages placed in folder `categories` of root and one _tag_ type page placed in folder `tags` of root:
```terminal ```sh
jekyll-theme-chirpy .
├── categories ├── categories
│   ├── animal.html │   ├── animal.html # a category type page
│   └── insect.html │   └── insect.html
├── tags ├── tags
  └── bee.html   └── bee.html # a tag type page
... ...
``` ```
and the content of a *category* type page is and the content of a _category_ type page is
```yaml ```yaml
--- ---
@@ -63,7 +64,7 @@ category: CATEGORY_NAME # e.g. Insect
--- ---
``` ```
the content of a *tag* type page is the content of a _tag_ type page is
```yaml ```yaml
--- ---
@@ -73,11 +74,11 @@ tag: TAG_NAME # e.g. bee
--- ---
``` ```
With the increasing number of posts, the number of categories and tags will increase several times! If we still manually create these *category*/*tag* type files, it will obviously be a super time-consuming job, and it is very likely to miss some of them(i.e. when you click on the missing `category` or `tag` link from a post or somewhere, it will complain to you '404'). The good news is that we got a lovely script tool `_scripts/sh/create_pages.sh` to finish the boring task. Basically we will use it via `tools/init.sh` instead of running it separately. Check out its use case [here]({{ "/posts/getting-started/#option-1-built-by-github-pages" | relative_url }}). With the increasing number of posts, the number of categories and tags will increase several times! If we still manually create these *category*/_tag_ type files, it will obviously be a super time-consuming job, and it is very likely to miss some of them, i.e., when you click on the missing `category` or `tag` link from a post or somewhere, the browser will complain to you "404 Not Found". The good news is we got a lovely script tool `_scripts/sh/create_pages.sh` to finish the boring tasks. Basically we will use it via `run.sh`, `build.sh`, `deploy.sh` or `publish.sh` that placed in `tools/` instead of running it separately. Check out its use case [here]({{ "/posts/getting-started/#deployment" | relative_url }}).
## Last modified date ## Last modified date
The last modified date of a post is obtained according to its latest git commit date, and all the modified date of the posts should be stored in `_data/updates.yml`. For example: The last modified date of a post is obtained according to the post's latest git commit date, and the modified date of all posts are designed to be stored in the file `_data/updates.yml`. Then contents of that file may be as follows:
```yaml ```yaml
- -
@@ -87,13 +88,13 @@ The last modified date of a post is obtained according to its latest git commit
... ...
``` ```
You can choose to create this file manually, but as you may notice, the better approach is to let it be automatically generated by a tool script. And `_scripts/sh/dump_lastmod.py` was born for this! Similar to the another script `_scripts/sh/create_pages.sh` mentioned above, it is also be called from `tools/init.sh`, so it doesn't have to be used separately. You can choose to create this file manually, But the better approach is to let it be automatically generated by a script tool, and `_scripts/sh/dump_lastmod.sh` was born for this! Similar to the other script (`create_pages.sh`) mentioned above, it is also be called from the other superior tools, so it doesn't have to be used separately.
When some posts have been modified since their published date and also the file `_data/updates.yml` was created correctly, a list with the label **Recent Updates** will be displayed in the right panel of the desktop view, which records the five most recently modified articles. When some posts have been modified since their published date and also the file `_data/updates.yml` was created correctly, a list with the label **Recent Updates** will be displayed in the right panel of the desktop view, which records the five most recently modified posts.
## Table of Contents ## Table of Contents
By default, the **T**able **o**f **C**ontents (TOC) is displayed on the right panel of the post. If you want to turn it off globally, go to `_config.yml` and set the variable `toc` to `false`. If you want to turn off TOC for specific post, add the following to post's [Front Matter](https://jekyllrb.com/docs/front-matter/): By default, the **T**able **o**f **C**ontents (TOC) is displayed on the right panel of the post. If you want to turn it off globally, go to `_config.yml` and set the value of variable `toc` to `false`. If you want to turn off TOC for specific post, add the following to post's [Front Matter](https://jekyllrb.com/docs/front-matter/):
```yaml ```yaml
--- ---
@@ -113,6 +114,28 @@ comments: false
``` ```
## Mathematics
For website performance reasons, the mathematical feature won't be loaded by default. But it can be enabled by:
```yaml
---
math: true
---
```
## Pinned Posts
You can pin one or more posts to the top of the home page, and the fixed posts are sorted in reverse order according to their release date. Enable by:
```yaml
---
pin: true
---
```
## Code Block ## Code Block
Markdown symbols <code class="highlighter-rouge">```</code> can easily create a code block as following examples. Markdown symbols <code class="highlighter-rouge">```</code> can easily create a code block as following examples.
@@ -136,7 +159,7 @@ items:
quantity: 4 quantity: 4
``` ```
#### Liquid codes #### Liquid Codes
If you want to display the **Liquid** snippet, surround the liquid code with `{% raw %}{%{% endraw %} raw {%raw%}%}{%endraw%}` and `{% raw %}{%{% endraw %} endraw {%raw%}%}{%endraw%}` . If you want to display the **Liquid** snippet, surround the liquid code with `{% raw %}{%{% endraw %} raw {%raw%}%}{%endraw%}` and `{% raw %}{%{% endraw %} endraw {%raw%}%}{%endraw%}` .
@@ -148,6 +171,8 @@ If you want to display the **Liquid** snippet, surround the liquid code with `{%
``` ```
{% endraw %} {% endraw %}
## Learn More ## Learn More
For more knowledge about Jekyll posts, visit the [Jekyll Docs: Posts](https://jekyllrb.com/docs/posts/). For more knowledge about Jekyll posts, visit the [Jekyll Docs: Posts](https://jekyllrb.com/docs/posts/).

View File

@@ -4,200 +4,139 @@ author: Cotes Chung
date: 2019-08-09 20:55:00 +0800 date: 2019-08-09 20:55:00 +0800
categories: [Blogging, Tutorial] categories: [Blogging, Tutorial]
tags: [getting started] tags: [getting started]
pin: true
--- ---
## Prerequisites
Follow the [Jekyll Docs](https://jekyllrb.com/docs/installation/) to complete the installtion of basic environment (`Ruby `, `RubyGems` and `Bundler`). ## Installation
To improve the writing experience, we need to use some script tools. If your machine is running Debian or macOS, make sure that [GNU coreutils](https://www.gnu.org/software/coreutils/) is installed. Otherwise, install by: [Fork **Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/fork) on GitHub, and clone the fork to local by:
* Debian ```terminal
$ git clone git@github.com:<username>/jekyll-theme-chirpy -b master --single-branch
```console
$ sudo apt-get install coreutils
``` ```
* macOS ### Setting up the local envrionment
```console 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` and `Bundler`.
$ brew install coreutils
```
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:
## Jekyll Plugins
[Fork **Chirpy** from GitHub](https://github.com/cotes2020/jekyll-theme-chirpy/fork), then clone your forked repo to local:
```console
$ git clone git@github.com:USER/jekyll-theme-chirpy.git -b master
```
and replace the `USER` above to your GitHub username.
The first time you run or build the project on local machine, perform the installation of Jekyll plugins. Go to the root of repo and run:
```terminal ```terminal
$ bundle install $ bundle install
``` ```
`bundle` will automatically install all the dependent Jekyll Plugins that listed in the `Gemfile`. `bundle` will automatically install all the dependencies specified by `Gemfile`.
What's more, in order to generate some extra files (*categories*, *tags* and *last modified list*), we need to use some tool scripts. If your machine is running Debian or macOS, make sure that [GNU coreutils](https://www.gnu.org/software/coreutils/) is installed. Otherwise, install by:
* Debian
```console
$ sudo apt-get install coreutils
```
* macOS
```console
$ brew install coreutils
```
## Directory Structure ## Usage
The main files and related brief introductions are listed below. Running [**Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/) requires some extra files, which cannot be generated by Jekyll native commands, so please strictly follow the methods mentioned below to run or deploy your website.
```sh ### Initialization
jekyll-theme-chirpy/
├── _data
├── _includes
├── _layouts
├── _posts # posts stay here
├── _scripts
├── .travis.yml # remove it
├── .github # remove this, too
├── assets
├── tabs
│   └── about.md # the ABOUT page
├── .gitignore
├── 404.html
├── Gemfile
├── LICENSE
├── README.md
├── _config.yml # configuration file
├── tools # script tools
├── feed.xml
├── index.html
├── robots.txt
└── sitemap.xml
```
Go to the root directory of the project and start initialization:
As mentioned above, some files or directories should be removed from your repo:
- .travis.yml
- .github
## Configuration
Generally, go to `_config.yml` and configure the variables as needed. Some of them are typical options:
* `url`
Set to your website url and there should be no slash symbol at the tail. Format: `<protocol>://<domain>`.
* `avatar`
It defines the image file location of avatar. The sample image is `/assets/img/sample/avatar.jpg`, and should be replaced by your own one(a square image). Notice that a huge image file will increase the load time of your site, so keep your avatar image size as samll as possible(may be *<https://tinypng.com/>* will help).
* `timezone`
To ensure that the posts' release date matches the city you live in, please modify the field `timezone` correctly. A list of all available values can be found on [TimezoneConverter](http://www.timezoneconverter.com/cgi-bin/findzone/findzone) or [Wikipedia](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
* `theme_mode`
There are three options for the theme color scheme:
- **dual** - The default color scheme will follow the system settings, but if the system does not support dark mode, or the browser does not support `Media Queries Level 5`, the theme will be displayed as `light` mode by default. Anyway, the bottom left corner of the Sidebar will provide a button for users to switch color schemes.
- **dark** - Always show dark mode.
- **light** - Always show light mode.
## Run Locally
You may want to preview the site content before publishing, so just run the script tool:
```terminal
$ bash tools/run.sh
```
Open a brower and visit <http://localhost:4000>.
Few days later, you may find that the file changes does not refresh in real time by using `run.sh`. Don't worry, the advanced option `-r` (or `--realtime`) will solve this problem, but it requires [**fswatch**](http://emcrisostomo.github.io/fswatch/) to be installed on your machine.
## Deploying to GitHub Pages
Before the deployment begins, checkout the file `_config.yml` and make sure that the `url` has been configured. What's more, if you prefer the [Project site on GitHub](https://help.github.com/en/github/working-with-github-pages/about-github-pages#types-of-github-pages-sites) and also use the default domain `<username>.github.io`, remember to change the `baseurl` to your project name that starting with a slash. For example, `/project`.
### Option 1: Built by GitHub Pages
By deploying the site in this way, you're allowed to push the source code directly to the remote.
> **Note**: If you want to use any third-party Jekyll plugins that not in [this list](https://pages.github.com/versions/), stop reading the current approach and go to [*Option 2: Build locally*](#option-2-build-locally).
**1**. Rename the repository to:
|Site Type | Repo's Name|
|:---|:---|
|User or Organization | `<username>.github.io`|
|Project| Any one except `<username>.github.io`, let's say `project`|
**2**. Commit the changes of the repo first, then run the initialization script:
```console ```console
$ bash tools/init.sh $ bash tools/init.sh
``` ```
> If you not intend to deploy it on GitHub Pages, append parameter option `--no-gh` at the end of the above command.
What it does is:
1. Remove some files or directories from your repository:
- `.travis.yml`
- everything under `.github/`
- files under `_posts/`
- folder `docs/`
2. Unless the option `--no-gh` was enabled, setup the GitHub action workflow by renaming `pages-deploy.yml.hook` of directory `.github/workflows/` to `pages-deploy.yml`.
3. Automatically create a commit to save the changes.
### Configuration
Generally, go to `_config.yml` and configure the variables as needed. Some of them are typical options:
* `url`
* `avatar`
* `timezone`
* `theme_mode`
### Run Locally
You may want to preview the site contents before publishing, so just run it by:
```terminal
$ bash tools/run.sh
```
Then open a browser and visit to <http://localhost:4000>.
Few days later, you may find that the file changes does not refresh in real time by using `run.sh`. Don't worry, the advanced option `-r` (or `--realtime`) will solve this problem, but it requires [**fswatch**](http://emcrisostomo.github.io/fswatch/) to be installed on your machine.
### 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`.
Assuming you have already gone through the [initialization](#initialization), you can now choose any of the following methods to deploy your website.
#### Deploy on GitHub Pages
For security reasons, GitHub Pages build runs on `safe` mode, which restricts us from using tool scripts 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.
1. Push any commit to `origin/master` to trigger the GitHub Actions workflow. Once the build is complete, a new remote branch called `gh-pages` will appear, which is used to store the built site files.
2. Unless you prefer to project sites, rename your repository to `<username>.github.io` on GitHub.
3. Choose branch `gh-pages` as your GitHub Pages source.
4. Visit your website at the address indicated by GitHub.
#### Deploy on Other Platforms
On platforms other than GitHub, e.g. GitLab, we cannot enjoy the convenience of **GitHub Actions**. However, we have a tool to make up for this shortcoming.
Commit the changes of your repository first, then run the publish script:
```console
$ bash tools/publish.sh
```
> Please note that the *Recent Update* list requires the latest git-log date of posts, thus make sure the changes in `_posts` have been committed before running this command. > Please note that the *Recent Update* list requires the latest git-log date of posts, thus make sure the changes in `_posts` have been committed before running this command.
it will automatically generates the *Latest Modified Date* and *Categories / Tags* page for the posts and submit a commit. Its output is similar to the following log: It will automatically generates the *Latest Modified Date* and *Categories / Tags* page for the posts and submit a commit, then push to `origin/master`. Its output is similar to the following log:
```terminal ```terminal
[INFO] Success to update lastmod for 4 post(s). [INFO] Success to update lastmod for 4 post(s).
[INFO] Succeed! 3 category-pages created. [INFO] Succeed! 3 category-pages created.
[INFO] Succeed! 4 tag-pages created. [INFO] Succeed! 4 tag-pages created.
[Automation] Updated the Categories, Tags, Lastmod for post(s). [INFO] Published successfully!
11 files changed, 46 insertions(+), 3 deletions(-)
...
Updated the Categories, Tags, Lastmod for post(s).
``` ```
Lastly, enable the pages service according to the instructions of the platform you choose.
**3**. Push the changes to `origin/master` then go to GitHub website and enable GitHub Pages service for the repo. #### Deploy on Private Server
**4**. Check it out: In the root of the source project, build your site by:
|Site Type | Site URL |
|:---|:---|
|User or Organization | `https://<username>.github.io/`|
|Project| `https://<username>.github.io/project/`|
### Option 2: Build Locally
For security reasons, GitHub Pages runs on `safe` mode, which means the third-party Jekyll plugins or custom scripts won't work. If you want to use any another plugins that not in the [whitelist](https://pages.github.com/versions/), **you have to generate the site locally rather than on GitHub Pages**.
**1**. Browse to GitHub website, create a brand new repo named:
|Site Type | Repo's Name|
|:---|:---|
|User or Organization | `<username>.github.io`|
|Project| Any one except `<username>.github.io`, let's say `project`|
and clone it.
**2**. In the root of the source project, build your site by:
```console ```console
$ bash tools/build.sh -d /path/to/local/project/ $ bash tools/build.sh -d /path/to/site/
``` ```
The generated static files will be placed in the root of `/path/to/local/project`. Commit and push the changes to the `master` branch on GitHub. The generated site files will be placed in the root of `/path/to/site/`. Now you should upload those files to your web server, such as Nginx.
**3**. Go to GitHub website and enable Pages service for the new repository.
**4**. Visit at:
|Site Type | Site URL |
|:---|:---|
|User or Organization | `https://<username>.github.io/`|
|Project| `https://<username>.github.io/project/`|
### Finishing work
No matter which way you choose to deploy the website on GitHub, please enforce the `HTTPS` for it. See official docs: [Configuring a publishing source for your GitHub Pages site](https://help.github.com/en/github/working-with-github-pages/securing-your-github-pages-site-with-https).

View File

@@ -9,7 +9,7 @@ toc: false
In [**Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/), the image files of [Favicons](https://www.favicon-generator.org/about/) are placed in `assets/img/favicons/`. You may need to replace them with your own. So let's see how to customize these Favicons. In [**Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/), the image files of [Favicons](https://www.favicon-generator.org/about/) are placed in `assets/img/favicons/`. You may need to replace them with your own. So let's see how to customize these Favicons.
Whit 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" | relative_url }}) ![upload-image]({{ "/assets/img/sample/upload-image.png" | relative_url }})

View File

@@ -31,20 +31,21 @@ read_categories() {
local _category=$(echo "$_yaml" | grep "^category:") local _category=$(echo "$_yaml" | grep "^category:")
if [[ ! -z "$_categories" ]]; then if [[ ! -z "$_categories" ]]; then
echo "$_categories" | sed "s/categories: *//;s/\[//;s/\]//;s/, */,/g;s/\"//g;s/'//g" echo "$_categories" | sed "s/categories: *//;s/\[//;s/\].*//;s/, */,/g;s/\"//g;s/'//g"
elif [[ ! -z "_category" ]]; then elif [[ ! -z "_category" ]]; then
echo "$_category" | sed "s/category: *//;s/\[//;s/\]//;s/, */,/g;s/\"//g;s/'//g" echo "$_category" | sed "s/category: *//;s/\[//;s/\].*//;s/, */,/g;s/\"//g;s/'//g"
fi fi
} }
read_tags() { read_tags() {
local _yaml=$(_read_yaml $1) local _yaml=$(_read_yaml $1)
echo "$_yaml" | grep "^tags:" | sed "s/tags: *//;s/\[//;s/\]//;s/, */,/g;s/\"//g;s/'//g" echo "$_yaml" | grep "^tags:" | sed "s/tags: *//;s/\[//;s/\].*//;s/, */,/g;s/\"//g;s/'//g"
} }
init() { init() {
if [[ -d categories ]]; then if [[ -d categories ]]; then
rm -rf categories rm -rf categories
fi fi
@@ -53,39 +54,47 @@ init() {
rm -rf tags rm -rf tags
fi fi
if [[ ! -d _posts ]]; then
exit 0
fi
mkdir categories tags mkdir categories tags
} }
create_category() { create_category() {
local _name=$1 if [[ ! -z $1 ]]; then
local _filepath="categories/$(echo $_name | sed 's/ /-/g' | awk '{print tolower($0)}').html" local _name=$1
local _filepath="categories/$(echo $_name | sed 's/ /-/g' | awk '{print tolower($0)}').html"
if [[ ! -f $_filepath ]]; then if [[ ! -f $_filepath ]]; then
echo "---" > $_filepath echo "---" > $_filepath
echo "layout: category" >> $_filepath echo "layout: category" >> $_filepath
echo "title: $_name" >> $_filepath echo "title: $_name" >> $_filepath
echo "category: $_name" >> $_filepath echo "category: $_name" >> $_filepath
echo "---" >> $_filepath echo "---" >> $_filepath
((category_count=category_count+1)) ((category_count=category_count+1))
fi
fi fi
} }
create_tag() { create_tag() {
local _name=$1 if [[ ! -z $1 ]]; then
local _filepath="tags/$( echo $_name | sed "s/ /-/g;s/'//g" | awk '{print tolower($0)}' ).html" local _name=$1
local _filepath="tags/$( echo $_name | sed "s/ /-/g;s/'//g" | awk '{print tolower($0)}' ).html"
if [[ ! -f $_filepath ]]; then if [[ ! -f $_filepath ]]; then
echo "---" > $_filepath echo "---" > $_filepath
echo "layout: tag" >> $_filepath echo "layout: tag" >> $_filepath
echo "title: $_name" >> $_filepath echo "title: $_name" >> $_filepath
echo "tag: $_name" >> $_filepath echo "tag: $_name" >> $_filepath
echo "---" >> $_filepath echo "---" >> $_filepath
((tag_count=tag_count+1)) ((tag_count=tag_count+1))
fi
fi fi
} }
@@ -97,46 +106,45 @@ create_tag() {
# $2 - type specified option # $2 - type specified option
######################################### #########################################
create_pages() { create_pages() {
if [[ $1 == '' ]]; then if [[ ! -z $1 ]]; then
exit 0 # split string to array
IFS_BAK=$IFS
IFS=','
local _string=$1
case $2 in
$TYPE_CATEGORY)
for i in ${_string#,}; do
create_category $i
done
;;
$TYPE_TAG)
for i in ${_string#,}; do
create_tag $i
done
;;
*)
;;
esac
IFS=$IFS_BAK
fi fi
# split string to array }
IFS_BAK=$IFS
IFS=','
local _string=$1
case $2 in
$TYPE_CATEGORY)
for i in ${_string#,}; do
create_category $i
done
;;
$TYPE_TAG)
for i in ${_string#,}; do
create_tag $i
done
;;
*)
;;
esac
IFS=$IFS_BAK
}
main() { main() {
init init
for _file in $(ls "_posts") for _file in $(find "_posts" -type f \( -iname \*.md -o -iname \*.markdown \))
do do
local _path="_posts/$_file" local _categories=$(read_categories "$_file")
local _categories=$(read_categories "$_path") local _tags=$(read_tags "$_file")
local _tags=$(read_tags "$_path")
create_pages "$_categories" $TYPE_CATEGORY create_pages "$_categories" $TYPE_CATEGORY
create_pages "$_tags" $TYPE_TAG create_pages "$_tags" $TYPE_TAG

View File

@@ -19,6 +19,7 @@ OUTPUT_FILE=updates.yml
_init() { _init() {
if [[ ! -d "$OUTPUT_DIR" ]]; then if [[ ! -d "$OUTPUT_DIR" ]]; then
mkdir "$OUTPUT_DIR" mkdir "$OUTPUT_DIR"
fi fi
@@ -27,7 +28,9 @@ _init() {
rm -f "$OUTPUT_DIR/$OUTPUT_FILE" rm -f "$OUTPUT_DIR/$OUTPUT_FILE"
fi fi
touch "$OUTPUT_DIR/$OUTPUT_FILE" if [[ ! -d $POST_DIR ]]; then
exit 0
fi
} }
@@ -55,6 +58,10 @@ _has_changed() {
_dump() { _dump() {
local _lasmod="`git log -1 --pretty=%ad --date=iso $2`" local _lasmod="`git log -1 --pretty=%ad --date=iso $2`"
if [[ ! -f "$OUTPUT_DIR/$OUTPUT_FILE" ]]; then
touch "$OUTPUT_DIR/$OUTPUT_FILE"
fi
echo "-" >> "$OUTPUT_DIR/$OUTPUT_FILE" echo "-" >> "$OUTPUT_DIR/$OUTPUT_FILE"
echo " filename: '$1'" >> "$OUTPUT_DIR/$OUTPUT_FILE" echo " filename: '$1'" >> "$OUTPUT_DIR/$OUTPUT_FILE"
echo " lastmod: '$_lasmod'" >> "$OUTPUT_DIR/$OUTPUT_FILE" echo " lastmod: '$_lasmod'" >> "$OUTPUT_DIR/$OUTPUT_FILE"
@@ -67,14 +74,12 @@ main() {
local _count=0 local _count=0
for _file in $(ls -r "$POST_DIR") for _file in $(find ${POST_DIR} -type f \( -iname \*.md -o -iname \*.markdown \))
do do
_filepath="$POST_DIR/$_file" _filename=$(basename $_file | sed 's/[0-9]\([0-9]*-\)//g;s/\..*//' ) # remove date and extension
_filename="${_file%.*}" # jekyll cannot read the extension of a file, so omit it.
_filename=${_filename:11} # remove the date
if _has_changed "$_filepath"; then if _has_changed "$_file"; then
_dump "$_filename" "$_filepath" _dump "$_filename" "$_file"
((_count=_count+1)) ((_count=_count+1))
fi fi

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Files sync monitoer # Files sync monitor
# v2.0 # v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy # https://github.com/cotes2020/jekyll-theme-chirpy
# © 2019 Cotes Chung # © 2019 Cotes Chung
@@ -8,7 +8,7 @@
# $1 -> the origin file with absolute path. # $1 -> the origin file with absolute path.
# $2 -> the origin sync directory # $2 -> the origin sync directory
# $3 -> the destination sync direcotry # $3 -> the destination sync directory
# Omit the system temp file # Omit the system temp file
if [[ ! -f $1 ]]; then if [[ ! -f $1 ]]; then

View File

@@ -77,11 +77,34 @@ $sidebar-display: "sidebar-display";
overflow-y: auto; overflow-y: auto;
width: $sidebar-width-medium; width: $sidebar-width-medium;
z-index: 99; z-index: 99;
background: rgb(42, 30, 107);
background: var(--sidebar-bg); background: var(--sidebar-bg);
a { a {
@include sidebar-links; @include sidebar-links;
} }
.site-title {
text-align: center;
a {
// color: var(--site-title-color);
font-weight: 900;
font-size: 1.5rem;
letter-spacing: .5px;
&:hover {
color: #fff;
text-decoration: none;
}
}
}
.site-subtitle {
font-size: 95%;
text-align: center;
color: #828282;
line-height: 1.2rem;
word-spacing: 1px;
margin: .5rem 1.5rem 2rem 1.5rem;
}
.sidebar-bottom { .sidebar-bottom {
.icon-border+a { // the icon behide mode-toggle .icon-border+a { // the icon behide mode-toggle
margin-left: .1rem; margin-left: .1rem;
@@ -239,29 +262,6 @@ $sidebar-display: "sidebar-display";
} }
} // #avatar } // #avatar
#site-title {
text-align: center;
a {
// color: var(--site-title-color);
font-weight: 900;
font-size: 1.5rem;
letter-spacing: .5px;
&:hover {
color: #fff;
text-decoration: none;
}
}
}
#site-subtitle {
font-size: 95%;
text-align: center;
color: #828282;
line-height: 1.2rem;
word-spacing: 1px;
margin: .5rem 1.5rem 2rem 1.5rem;
}
#search-result-wrapper { #search-result-wrapper {
display: none; display: none;
position: fixed; position: fixed;
@@ -493,8 +493,7 @@ footer {
} }
} }
a { a {
@include semi-bold; color: var(--footer-link);
color: var(---footer-link);
&:link { &:link {
@include no-text-decoration; @include no-text-decoration;
} }
@@ -755,6 +754,8 @@ a {
div.post-content { div.post-content {
>table, li>table { >table, li>table {
min-width: 60%; min-width: 60%;
display: block;
overflow-x: auto;
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0; border-spacing: 0;
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
@@ -946,7 +947,7 @@ table {
height: 5rem; height: 5rem;
} }
#site-subtitle { .site-subtitle {
@include ml-mr(1.8rem); @include ml-mr(1.8rem);
} }
@@ -1188,12 +1189,12 @@ table {
max-width: 700px; max-width: 700px;
} }
#site-title { .site-title {
font-size: 1.3rem; font-size: 1.3rem;
margin-left: 0!important; margin-left: 0!important;
} }
#site-subtitle { .site-subtitle {
font-size: 90%; font-size: 90%;
@include ml-mr(1rem); @include ml-mr(1rem);
} }
@@ -1352,56 +1353,54 @@ table {
} }
#profile-wrapper { #profile-wrapper {
margin-top: 4rem; margin: 4rem 2rem 3rem 4rem;
margin-bottom: 3rem;
padding-left: 18%;
-ms-flex-direction: column!important; -ms-flex-direction: column!important;
}
#avatar { #avatar {
-webkit-box-pack: normal !important; -webkit-box-pack: normal !important;
-ms-flex-pack: normal !important; -ms-flex-pack: normal !important;
justify-content: normal !important; justify-content: normal !important;
>a { >a {
width: 6.2rem; width: 6.2rem;
height: 6.2rem; height: 6.2rem;
}
} }
}
.profile-text { .profile-text {
padding-left: .5rem; margin-left: .5rem;
/* .d-flex */ /* .d-flex */
display: -webkit-box!important; display: -webkit-box!important;
display: -ms-flexbox!important; display: -ms-flexbox!important;
display: flex!important; display: flex!important;
/* .flex-wrap */ /* .flex-wrap */
-ms-flex-wrap: wrap!important; -ms-flex-wrap: wrap!important;
flex-wrap: wrap!important; flex-wrap: wrap!important;
/* .align-content-center */ /* .align-content-center */
-ms-flex-line-pack: center!important; -ms-flex-line-pack: center!important;
align-content: center!important; align-content: center!important;
} >div {
text-align: left !important;
#site-title a { width: 100%;
font-size: 1.7rem; }
letter-spacing: 1px; }
}
.profile-text>div {
text-align: left !important;
width: 100%;
}
#site-subtitle {
word-spacing: 0;
padding-right: 3rem;
margin: .3rem 0 0 0;
} }
#sidebar { #sidebar {
width: $sidebar-width-large; width: $sidebar-width-large;
.site-title a {
font-size: 1.7rem;
letter-spacing: 1px;
margin: 0;
}
.site-subtitle {
word-spacing: 0;
margin: .3rem 0 0 0;
}
ul { ul {
margin-left: 5%; margin-left: 3%;
>li>a { >li>a {
padding-left: 2.5rem; padding-left: 2.5rem;
-webkit-box-pack: start!important; -webkit-box-pack: start!important;
@@ -1457,10 +1456,8 @@ table {
margin-left: 0; margin-left: 0;
} }
} }
} // .sidebar-bottom } // .sidebar-bottom
} // #sidebar } // #sidebar
footer>div.d-flex { footer>div.d-flex {
width: 87%; width: 87%;
max-width: 1140px; max-width: 1140px;
@@ -1475,6 +1472,7 @@ table {
} // min-width: 1650px } // min-width: 1650px
@media all and (min-width: 1700px) { @media all and (min-width: 1700px) {
#topbar-wrapper { #topbar-wrapper {
padding-right: calc(100% - #{$sidebar-width-large} padding-right: calc(100% - #{$sidebar-width-large}

View File

@@ -38,6 +38,7 @@
} }
%heading { %heading {
font-weight: 400;
font-family: 'Lato', 'Microsoft Yahei', sans-serif; font-family: 'Lato', 'Microsoft Yahei', sans-serif;
} }
@@ -49,11 +50,8 @@
} }
%anchor { %anchor {
.post-content>&, padding-top: 3.5rem;
#page>& { margin-top: -2.5rem;
padding-top: 3.5rem;
margin-top: -2.5rem;
}
} }
/*---------- scss mixin ---------*/ /*---------- scss mixin ---------*/

View File

@@ -39,7 +39,7 @@ html[mode=dark] {
} }
.highlighter-rouge { .highlighter-rouge {
background: var(--highlight-bg-color); background-color: var(--highlight-bg-color);
@extend %code-snippet-radius; @extend %code-snippet-radius;
color: var(--highlighter-rouge-color); color: var(--highlighter-rouge-color);
margin-bottom: 1.2em; /* Override BS Inline-code style */ margin-bottom: 1.2em; /* Override BS Inline-code style */
@@ -94,16 +94,21 @@ code {
-moz-hyphens: none; -moz-hyphens: none;
hyphens: none; hyphens: none;
&.highlighter-rouge { &.highlighter-rouge {
padding: 2px 4px; padding: 3px 5px;
margin: 0 .15rem; margin: 0 .15rem;
border-radius: 4px; border-radius: 4px;
background-color: var(--inline-code-bg);
} }
@at-root a>&.highlighter-rouge { @at-root a>&.highlighter-rouge {
padding-bottom: 0; // show link's underlinke padding-bottom: 0; // show link's underlinke
color: inherit;
} }
@at-root a:hover>&.highlighter-rouge { @at-root a:hover>&.highlighter-rouge {
border-bottom: none; border-bottom: none;
} }
blockquote &.highlighter-rouge {
color: inherit;
}
} }
td.rouge-code { td.rouge-code {
@@ -111,9 +116,10 @@ td.rouge-code {
padding-right: 1rem; padding-right: 1rem;
} }
/* Hide line numbers for defualt, console, and terminal code snippets */ /* Hide line numbers for default, console, and terminal code snippets */
div { div {
&[class^='highlighter-rouge'], &[class^='highlighter-rouge'],
&.language-plaintext.highlighter-rouge,
&.language-console.highlighter-rouge, &.language-console.highlighter-rouge,
&.language-terminal.highlighter-rouge { &.language-terminal.highlighter-rouge {
pre.lineno { pre.lineno {

View File

@@ -71,8 +71,8 @@
.highlight .gh { } /* Generic Heading & Diff Header */ .highlight .gh { } /* Generic Heading & Diff Header */
.highlight .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */ .highlight .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */
.highlight .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */ .highlight .gd { color: #f92672; background-color: #561c08 } /* Generic.Deleted & Diff Deleted */
.highlight .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */ .highlight .gi { color: #a6e22e; background-color: #0b5858 } /* Generic.Inserted & Diff Inserted */
/*----- My styles ------*/ /*----- My styles ------*/
@@ -83,6 +83,8 @@
--highlight-lineno-color: #6c6c6d; --highlight-lineno-color: #6c6c6d;
--highlight-lineno-border-color: #3c4042; --highlight-lineno-border-color: #3c4042;
--inline-code-bg: var(--highlight-bg-color);
.highlight { .highlight {
.gp { color: #818c96; } .gp { color: #818c96; }
} }

View File

@@ -23,7 +23,7 @@
--link-color: rgb(138, 180, 248); --link-color: rgb(138, 180, 248);
--link-underline-color: rgb(82, 108, 150); --link-underline-color: rgb(82, 108, 150);
--main-border-color: rgb(44, 45, 45); --main-border-color: rgb(44, 45, 45);
--button-bg: rgb(39, 40, 33); --button-bg: rgb(39, 40, 43);
--blockquote-border-color: rgb(66, 66, 66); --blockquote-border-color: rgb(66, 66, 66);
--blockquote-text-color: rgb(117, 117, 117); --blockquote-text-color: rgb(117, 117, 117);
@@ -32,7 +32,6 @@
--btn-backtotop-border-color: var(--btn-border-color); --btn-backtotop-border-color: var(--btn-border-color);
--btn-box-shadow: var(--main-wrapper-bg); --btn-box-shadow: var(--main-wrapper-bg);
--card-bg: rgb(39, 40, 33);
--card-header-bg: rgb(51, 50, 50); --card-header-bg: rgb(51, 50, 50);
--label-color: rgb(108, 117, 125); --label-color: rgb(108, 117, 125);
@@ -46,6 +45,7 @@
/* Home page */ /* Home page */
--post-list-text-color: rgb(175, 176, 177); --post-list-text-color: rgb(175, 176, 177);
--btn-patinator-text-color: var(--text-color); --btn-patinator-text-color: var(--text-color);
--btn-paginator-hover-color: rgb(64, 65, 66);
--btn-active-bg: rgba(28, 52, 94, 1); --btn-active-bg: rgba(28, 52, 94, 1);
--btn-active-border-color: rgb(66, 94, 138); --btn-active-border-color: rgb(66, 94, 138);
--btn-text-color: var(--text-color); --btn-text-color: var(--text-color);
@@ -56,14 +56,15 @@
--toc-highlight: rgb(116, 178, 243); --toc-highlight: rgb(116, 178, 243);
--tag-bg: rgb(41, 40, 40); --tag-bg: rgb(41, 40, 40);
--tag-hover: rgb(43, 56, 62); --tag-hover: rgb(43, 56, 62);
--tb-odd-bg: rgba(52, 53, 42, 0.52); /* odd rows of the posts' table */ --tb-odd-bg: rgba(42, 47, 53, 0.52); /* odd rows of the posts' table */
--tb-even-bg: rgb(31, 31, 34); /* even rows of the posts' table */ --tb-even-bg: rgb(31, 31, 34); /* even rows of the posts' table */
--tb-border-color: var(--tb-odd-bg); --tb-border-color: var(--tb-odd-bg);
--footnote-target-bg: rgb(63, 81, 181); --footnote-target-bg: rgb(63, 81, 181);
--btn-share-color: #6c757d; --btn-share-color: #6c757d;
--btn-share-hover-color: #bfc1ca; --btn-share-hover-color: #bfc1ca;
--relate-post-date: var(--text-muted-color); --relate-post-date: var(--text-muted-color);
--card-border-color: var(--main-wrapper-bg); --card-bg: rgb(39, 40, 43);
--card-border-color: rgb(53, 53, 60);
--card-box-shadow: var(--main-wrapper-bg); --card-box-shadow: var(--main-wrapper-bg);
/* tags */ /* tags */
@@ -83,7 +84,7 @@
--timeline-year-dot-color: var(--timeline-color); --timeline-year-dot-color: var(--timeline-color);
/* Footer */ /* Footer */
---footer-link: rgb(146, 146, 146); --footer-link: rgb(171 171 171);
.post-content img { .post-content img {
filter: brightness(90%); filter: brightness(90%);

View File

@@ -17,11 +17,11 @@
.highlight .cp { color: #999999; font-weight: bold; font-style: italic } /* Comment.Preproc */ .highlight .cp { color: #999999; font-weight: bold; font-style: italic } /* Comment.Preproc */
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .gd { color: #d01040; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ .highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #999999 } /* Generic.Heading */ .highlight .gh { color: #999999 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .gi { color: #008080; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */ .highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gs { font-weight: bold } /* Generic.Strong */
@@ -76,4 +76,5 @@
--highlight-lineno-color: #c2c6cc; --highlight-lineno-color: #c2c6cc;
--highlight-lineno-border-color: #e9ecef; --highlight-lineno-border-color: #e9ecef;
--inline-code-bg: #f3f3f3;
} // light-syntax } // light-syntax

View File

@@ -63,12 +63,14 @@
--input-focus-border-color: var(--btn-border-color); --input-focus-border-color: var(--btn-border-color);
/* Home */ /* Home page */
--post-list-text-color: dimgray; --post-list-text-color: dimgray;
--btn-patinator-text-color: #555555; --btn-patinator-text-color: #555555;
--btn-paginator-hover-color: #e9ecef;
--btn-active-bg: #2a408e; --btn-active-bg: #2a408e;
--btn-active-border-color: #007bff; --btn-active-border-color: #007bff;
@@ -118,5 +120,5 @@
--footnote-target-bg: lightcyan; --footnote-target-bg: lightcyan;
---footer-link: inherit; --footer-link: #424242;
} }

View File

@@ -11,90 +11,101 @@
#post-list { #post-list {
margin-top: 1rem; margin-top: 1rem;
padding-right: .5rem; padding-right: .5rem;
.post-meta {
i:not(:first-child) { // post-meta icons on HOME .post-preview {
margin-left: 1.5rem; padding-top: 1.5rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(--main-border-color);
h1 {
font-size: 1.4rem;
margin: 0;
~i { // pinned icon
font-size: .86rem;
}
} }
}
} .post-meta {
i {
font-size: .73rem;
&:not(:first-child) { // post-meta icons on the homepage
margin-left: 1.5rem;
}
}
}
.post-content {
margin-top: .6rem;
margin-bottom: .6rem;
color: var(--post-list-text-color);
>p {
/* Make preview shorter on the homepage */
margin: 0;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
}
} // .post-preview
} // #post-list
.pagination { .pagination {
font-size: 1rem; font-size: 1rem;
a:hover { a:hover {
text-decoration: none; text-decoration: none;
} }
}
.post-preview { .page-item {
padding-top: 1.5rem; .page-link {
padding-bottom: 1rem; color: var(--btn-patinator-text-color);
border-bottom: 1px solid var(--main-border-color); width: 2.5rem;
>h1 { height: 2.5rem;
font-size: 1.4rem; padding: 0;
margin: 0; text-align: center;
}
i.far { /* fontawesome icons */
font-size: 86%;
}
.post-content {
margin-top: .6rem;
margin-bottom: .6rem;
color: var(--post-list-text-color);
>p { /* Make preview shorter in Home page*/
margin: 0;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; display: flex;
-webkit-box-orient: vertical; -webkit-box-pack: center;
} justify-content: center;
} -webkit-box-align: center;
} align-items: center;
border-radius: 50%;
.page-item { border: 1px solid var(--btn-paginator-border-color);
.page-link { font-family: 'Lato', sans-serif;
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);
}
&.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); background-color: var(--button-bg);
&:hover {
background-color: var(--btn-paginator-hover-color)
}
} }
} &.active {
&:first-child .page-link, .page-link {
&:last-child .page-link { background-color: var(--btn-active-bg);
border-radius: 50%; border-color: var(--btn-active-border-color);
} box-shadow: 0 0 8px 0 var(--btn-paginator-shadow) !important;
&:not(:last-child) { color: var(--btn-text-color);
margin-right: 0.6rem; }
} }
&.disabled {
} // .page-item 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
@media all and (max-width: 576px) { @media all and (max-width: 576px) {
#post-list .post-meta>span i:not(:first-child) { #post-list .post-meta>span i:not(:first-child) {
@@ -118,12 +129,12 @@
.pagination { .pagination {
font-size: .85rem; font-size: .85rem;
.page-item .page-link {
width: 2.2rem;
height: 2.2rem;
}
} }
.page-item .page-link {
width: 2.2rem;
height: 2.2rem;
}
} }
/* Pannel hidden */ /* Pannel hidden */

View File

@@ -27,10 +27,6 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
border-color: var(--btn-border-color); border-color: var(--btn-border-color);
} }
.author {
@include semi-bold;
}
.post { .post {
img { img {
max-width: 100%; max-width: 100%;
@@ -45,7 +41,7 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
} }
.post-tail-wrapper { .post-tail-wrapper {
margin-top: 4rem; margin-top: 6rem;
border-bottom: 1px double var(--main-border-color); border-bottom: 1px double var(--main-border-color);
font-size: 0.85rem; font-size: 0.85rem;
} }
@@ -56,7 +52,7 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
.post-navigation { .post-navigation {
padding-top: 3rem; padding-top: 3rem;
padding-bottom: 2rem; padding-bottom: 4rem;
.btn { .btn {
@include btn-post-nav; @include btn-post-nav;
@@ -127,6 +123,7 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
} }
#toc-wrapper { #toc-wrapper {
margin-top: 7rem;
border-left: 1px solid rgba(158, 158, 158, 0.17); border-left: 1px solid rgba(158, 158, 158, 0.17);
position: -webkit-sticky; position: -webkit-sticky;
position: sticky; position: sticky;
@@ -208,6 +205,9 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
#post-extend-wrapper { #post-extend-wrapper {
min-height: 2rem; min-height: 2rem;
#disqus_thread {
margin-bottom: 2rem;
}
} }
.post-tail-bottom a { .post-tail-bottom a {
@@ -349,31 +349,3 @@ $prompt-newer: "{{ site.data.label.post.button.next }}";
} }
} }
/*
The following resposive design aim to
make #post-extend-wrapper margin-right same as pannel's width
*/
@media all and (min-width: 1200px) {
#post-extend-wrapper {
margin-right: 25%;
}
}
@media all and (min-width: 1460px) {
#post-extend-wrapper {
margin-right: 300px;
}
}
@media all and (min-width: 1650px) {
#post-extend-wrapper {
margin-right: calc((100% - 1150px) / 10 + 300px);
}
}
@media all and (min-width: 1700px) {
#post-extend-wrapper {
margin-right: calc((100% - 1150px) / 8 + 300px);
}
}

View File

@@ -1,12 +0,0 @@
---
---
const proxyData = '{"url": "{{ site.google_analytics.pv.proxy_endpoint }}"}';
{%- capture pv_data -%}
{%- if site.google_analytics.pv.cache and site.google_analytics.pv.enabled -%}
{% include_relative _pageviews.json %}
{%- endif -%}
{%- endcapture -%}
const pageviews = '{{ pv_data }}';

View File

@@ -8,7 +8,7 @@ layout: compress
# MIT License # MIT License
--- ---
{% assign icon_url = "/assets/img/favicons/" | relative_url %} {% assign icon_url = "/assets/img/favicons" | relative_url %}
{ {
"name": "{{ site.title }}", "name": "{{ site.title }}",

21
assets/js/_commons.js Normal file
View File

@@ -0,0 +1,21 @@
/*!
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 _utils/tooltip-loader.js %}

View File

@@ -5,6 +5,7 @@
* © 2018-2019 Cotes Chung * © 2018-2019 Cotes Chung
* MIT License * MIT License
*/ */
$(function() { $(function() {
var didScroll; var didScroll;
@@ -13,7 +14,7 @@ $(function() {
var topbarHeight = $('#topbar-wrapper').outerHeight(); var topbarHeight = $('#topbar-wrapper').outerHeight();
$(window).scroll(function(event) { $(window).scroll(function(event) {
if ($("#topbar-title").is(":hidden")) { // Not in small screens if ($("#topbar-title").is(":hidden")) { /* Not in small screens */
didScroll = true; didScroll = true;
} }
}); });
@@ -28,12 +29,12 @@ $(function() {
function hasScrolled() { function hasScrolled() {
var st = $(this).scrollTop(); var st = $(this).scrollTop();
// Make sure they scroll more than delta /* Make sure they scroll more than delta */
if (Math.abs(lastScrollTop - st) <= delta) if (Math.abs(lastScrollTop - st) <= delta)
return; return;
if (st > lastScrollTop && st > topbarHeight) { if (st > lastScrollTop && st > topbarHeight) {
// Scroll Down /* Scroll Down */
$('#topbar-wrapper').removeClass('topbar-down').addClass('topbar-up'); $('#topbar-wrapper').removeClass('topbar-down').addClass('topbar-up');
if ( $('#toc-wrapper').length > 0) { if ( $('#toc-wrapper').length > 0) {
@@ -45,11 +46,11 @@ $(function() {
} }
if ($('#search-input').is(':focus')) { if ($('#search-input').is(':focus')) {
$('#search-input').blur(); // remove focus $('#search-input').blur(); /* remove focus */
} }
} else { } else {
// Scroll Up /* Scroll Up */
if (st + $(window).height() < $(document).height()) { if (st + $(window).height() < $(document).height()) {
$('#topbar-wrapper').removeClass('topbar-up').addClass('topbar-down'); $('#topbar-wrapper').removeClass('topbar-up').addClass('topbar-down');
if ( $('#toc-wrapper').length > 0) { if ( $('#toc-wrapper').length > 0) {

View File

@@ -5,7 +5,8 @@
* © 2018-2019 Cotes Chung * © 2018-2019 Cotes Chung
* MIT License * MIT License
*/ */
$(function(){
$(function() {
var DEFAULT = $("#topbar-title").text().trim(); var DEFAULT = $("#topbar-title").text().trim();
var title = ($("div.post>h1").length > 0) ? var title = ($("div.post>h1").length > 0) ?
@@ -18,12 +19,12 @@ $(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 || $("div.post>h1").is(":hidden") /* is tab pages */
|| $("#topbar-title").is(":hidden") // not mobile screens || $("#topbar-title").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;
} }
@@ -36,9 +37,9 @@ $(function(){
$("#topbar-title").text(DEFAULT); $("#topbar-title").text(DEFAULT);
} }
} }
}) });
// Click title remove hover effect. /* Click title remove hover effect. */
$('#topbar-title').click(function() { $('#topbar-title').click(function() {
$('body,html').animate({scrollTop: 0}, 800); $('body,html').animate({scrollTop: 0}, 800);
}); });

22
assets/js/_home-post.js Normal file
View File

@@ -0,0 +1,22 @@
/*!
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 %}

14
assets/js/_pv-config.js Normal file
View File

@@ -0,0 +1,14 @@
/*!
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,78 +0,0 @@
/*
* Caculate the Timeago
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2019 Cotes Chung
* MIT Licensed
*/
$(function() {
function timeago(date, isLastmod) {
var now = new Date();
var past = new Date(date);
var seconds = Math.floor((now - past) / 1000);
var year = Math.floor(seconds / 31536000);
if (year >= 1) {
return year + " year" + (year > 1 ? "s" : "") + " ago";
}
var month = Math.floor(seconds / 2592000);
if (month >= 1) {
return month + " month" + (month > 1 ? "s" : "") + " ago";
}
var week = Math.floor(seconds / 604800);
if (week >= 1) {
return week + " week" + (week > 1 ? "s" : "") + " ago";
}
var day = Math.floor(seconds / 86400);
if (day >= 1) {
return day + " day" + (day > 1 ? "s" : "") + " ago";
}
var hour = Math.floor(seconds / 3600);
if (hour >= 1) {
return hour + " hour" + (hour > 1 ? "s" : "") + " ago";
}
var minute = Math.floor(seconds / 60);
if (minute >= 1) {
return minute + " minute" + (minute > 1 ? "s" : "") + " ago";
}
return (isLastmod? "just" : "Just") + " now";
}
function updateTimeago() {
$(".timeago").each(function() {
if ($(this).children("i").length > 0) {
var isLastmod = $(this).hasClass('lastmod');
var node = $(this).children("i");
var date = node.text(); /* ISO Dates: 'YYYY-MM-DDTHH:MM:SSZ' */
$(this).text(timeago(date, isLastmod));
$(this).append(node);
}
});
if (vote == 0 && intervalId != undefined) {
clearInterval(intervalId); /* stop interval */
}
return vote;
}
var vote = $(".timeago").length;
if (vote == 0) {
return;
}
if (updateTimeago() > 0) { /* run immediately */
vote = $(".timeago").length; /* resume */
var intervalId = setInterval(updateTimeago, 60000); /* loop every minutes */
}
});

View File

@@ -10,8 +10,8 @@ $(function() {
var child_prefix = "l_"; var child_prefix = "l_";
var parent_prefix = "h_"; var parent_prefix = "h_";
// 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 parent_id = parent_prefix + $(this).attr('id').substring(child_prefix.length); var parent_id = parent_prefix + $(this).attr('id').substring(child_prefix.length);
if (parent_id) { if (parent_id) {
$("#" + parent_id + " .far.fa-folder-open").attr("class", "far fa-folder fa-fw"); $("#" + parent_id + " .far.fa-folder-open").attr("class", "far fa-folder fa-fw");
@@ -20,7 +20,7 @@ $(function() {
} }
}); });
// expand the top category /* expand the top category */
$(".collapse").on("show.bs.collapse", function() { $(".collapse").on("show.bs.collapse", function() {
var parent_id = parent_prefix + $(this).attr('id').substring(child_prefix.length); var parent_id = parent_prefix + $(this).attr('id').substring(child_prefix.length);
if (parent_id) { if (parent_id) {

View File

@@ -24,19 +24,15 @@ function countUp(min, max, destId) {
function countPV(path, rows) { function countPV(path, rows) {
/* path permalink looks like: '/posts/post-title/' */
var fileName = path.replace(/\/posts\//g, '').replace(/\//g, '.html'); /* e.g. post-title.html */
var count = 0; var count = 0;
var _v2_url = path.replace(/posts\//g, ''); /* the v2.0+ blog permalink: "/post-title/" */ if (rows !== undefined ) {
for (var i = 0; i < rows.length; ++i) {
for (var i = 0; i < rows.length; ++i) { var gaPath = rows[i][0];
var gaPath = rows[i][0]; if (gaPath == path) { /* path format see: site.permalink */
if (gaPath == path || count += parseInt(rows[i][1]);
gaPath == _v2_url || break;
gaPath.concat('/') == _v2_url || }
gaPath.slice(gaPath.lastIndexOf('/') + 1) === fileName) { // old permalink record
count += parseInt(rows[i][1]);
} }
} }
@@ -65,15 +61,15 @@ function displayPageviews(data) {
} }
var hasInit = getInitStatus(); var hasInit = getInitStatus();
var rows = data.rows; var 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).children("h1").children("a").attr("href"); var path = $(this).children("div").children("h1").children("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; var path = window.location.pathname;
tacklePV(rows, path, $('#pv'), hasInit); tacklePV(rows, path, $('#pv'), hasInit);
} }
@@ -94,10 +90,10 @@ var getInitStatus = (function() {
var PvCache = (function() { var 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_TYPE = "pv-type"; const KEY_PV_SRC = "pv_source";
var PvType = { var Source = {
ORIGIN: "origin", ORIGIN: "origin",
PROXY: "proxy" PROXY: "proxy"
}; };
@@ -116,29 +112,29 @@ var PvCache = (function() {
}, },
saveOriginCache: function(pv) { saveOriginCache: function(pv) {
set(KEY_PV, pv); set(KEY_PV, pv);
set(KEY_PV_TYPE, PvType.ORIGIN ); set(KEY_PV_SRC, Source.ORIGIN );
set(KEY_CREATION, new Date().toJSON() ); set(KEY_CREATION, new Date().toJSON() );
}, },
saveProxyCache: function(pv) { saveProxyCache: function(pv) {
set(KEY_PV, pv); set(KEY_PV, pv);
set(KEY_PV_TYPE, PvType.PROXY ); set(KEY_PV_SRC, Source.PROXY );
set(KEY_CREATION, new Date().toJSON() ); set(KEY_CREATION, new Date().toJSON() );
}, },
isOriginCache: function() { isFromOrigin: function() {
return get(KEY_PV_TYPE) == PvType.ORIGIN; return get(KEY_PV_SRC) == Source.ORIGIN;
}, },
isProxyCache: function() { isFromProxy: function() {
return get(KEY_PV_TYPE) == PvType.PROXY; return get(KEY_PV_SRC) == Source.PROXY;
}, },
isExpired: function() { isExpired: function() {
if (PvCache.isOriginCache() ) { if (PvCache.isFromOrigin() ) {
let date = new Date(get(KEY_CREATION)); let date = new Date(get(KEY_CREATION));
date.setDate(date.getDate() + 1); // fetch origin-data 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.isProxyCache() ) { } else if (PvCache.isFromProxy() ) {
let date = new Date(get(KEY_CREATION) ); let date = new Date(get(KEY_CREATION) );
date.setHours(date.getHours() + 1); // proxy-data is updated every 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;
@@ -148,26 +144,46 @@ var PvCache = (function() {
}, },
newerThan: function(pv) { newerThan: function(pv) {
return PvCache.getAllPagevies() > pv.totalsForAllResults["ga:pageviews"]; return PvCache.getAllPagevies() > pv.totalsForAllResults["ga:pageviews"];
},
inspectKeys: function() {
if (localStorage.getItem(KEY_PV) == null
|| localStorage.getItem(KEY_PV_SRC) == null
|| localStorage.getItem(KEY_CREATION) == null) {
localStorage.clear();
}
} }
}; };
})(); // PvCache })(); /* PvCache */
function fetchOriginPageviews(pvData) { function fetchPageviews(fetchOrigin = true, filterOrigin = false) {
if (pvData === undefined) { /* pvCacheEnabled see: /assets/js/_pv-config.js */
return; if (pvCacheEnabled && fetchOrigin) {
fetch('/assets/js/data/pageviews.json')
.then(response => response.json())
.then(data => {
if (filterOrigin) {
if (PvCache.newerThan(data)) {
return;
}
}
displayPageviews(data);
PvCache.saveOriginCache(JSON.stringify(data));
})
.then(() => fetchProxyPageviews());
} else {
fetchProxyPageviews();
} }
displayPageviews(pvData);
PvCache.saveOriginCache(JSON.stringify(pvData));
} }
function fetchProxyPageviews() { function fetchProxyPageviews() {
let proxy = JSON.parse(proxyData); // see file '/assets/data/pv-data.json'
$.ajax({ $.ajax({
type: 'GET', type: 'GET',
url: proxy.url, url: proxyEndpoint, /* see: /assets/js/_pv-config.js */
dataType: 'jsonp', dataType: 'jsonp',
jsonpCallback: "displayPageviews", jsonpCallback: "displayPageviews",
success: function(data, textStatus, jqXHR) { success: function(data, textStatus, jqXHR) {
@@ -184,40 +200,25 @@ $(function() {
if ($('.pageviews').length > 0) { if ($('.pageviews').length > 0) {
PvCache.inspectKeys();
let cache = PvCache.getData(); let cache = PvCache.getData();
if (cache) { if (cache) {
displayPageviews(cache);
if (PvCache.isExpired()) { if (PvCache.isExpired()) {
if (PvCache.isProxyCache() ) { fetchPageviews(true, PvCache.isFromProxy());
let originPvData = pageviews ? JSON.parse(pageviews) : undefined;
if (originPvData) {
if (PvCache.newerThan(originPvData)) {
displayPageviews(cache);
} else {
fetchOriginPageviews(originPvData);
}
}
fetchProxyPageviews(); } else {
} else if (PvCache.isOriginCache() ) { if (PvCache.isFromOrigin()) {
fetchOriginPageviews(originPvData); fetchPageviews(false);
fetchProxyPageviews();
}
} else { // still valid
displayPageviews(cache);
if (PvCache.isOriginCache() ) {
fetchProxyPageviews();
} }
} }
} else { } else {
let originPvData = pageviews ? JSON.parse(pageviews) : undefined; fetchPageviews();
fetchOriginPageviews(originPvData);
fetchProxyPageviews();
} }
} }

View File

@@ -0,0 +1,83 @@
/*
* Caculate the Timeago
* v2.0
* https://github.com/cotes2020/jekyll-theme-chirpy
* © 2019 Cotes Chung
* MIT Licensed
*/
$(function() {
function timeago(iso, isLastmod) {
let now = new Date();
let past = new Date(iso);
if (past.getFullYear() != now.getFullYear()) {
toRefresh -= 1;
return past.toLocaleString("en-US", {
year: 'numeric',
month: 'short',
day: 'numeric'
});
}
if (past.getMonth() != now.getMonth()) {
toRefresh -= 1;
return past.toLocaleString("en-US", {
month: 'short',
day: 'numeric'
});
}
let seconds = Math.floor((now - past) / 1000);
let day = Math.floor(seconds / 86400);
if (day >= 1) {
toRefresh -= 1;
return day + " day" + (day > 1 ? "s" : "") + " ago";
}
let hour = Math.floor(seconds / 3600);
if (hour >= 1) {
return hour + " hour" + (hour > 1 ? "s" : "") + " ago";
}
let minute = Math.floor(seconds / 60);
if (minute >= 1) {
return minute + " minute" + (minute > 1 ? "s" : "") + " ago";
}
return (isLastmod? "just" : "Just") + " now";
}
function updateTimeago() {
$(".timeago").each(function() {
if ($(this).children("i").length > 0) {
var basic = $(this).text();
var isLastmod = $(this).hasClass('lastmod');
var node = $(this).children("i");
var date = node.text(); /* ISO Date: 'YYYY-MM-DDTHH:MM:SSZ' */
$(this).text(timeago(date, isLastmod));
$(this).append(node);
}
});
if (toRefresh == 0 && intervalId != undefined) {
clearInterval(intervalId); /* stop interval */
}
return toRefresh;
}
var toRefresh = $(".timeago").length;
if (toRefresh == 0) {
return;
}
if (updateTimeago() > 0) { /* run immediately */
var intervalId = setInterval(updateTimeago, 60000); /* run every minute */
}
});

View File

@@ -7,4 +7,4 @@
*/ */
$(function () { $(function () {
$('[data-toggle="tooltip"]').tooltip(); $('[data-toggle="tooltip"]').tooltip();
}) });

13
assets/js/categories.min.js vendored Normal file
View File

@@ -0,0 +1,13 @@
---
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 %}

View File

@@ -1,4 +1,6 @@
--- ---
layout: compress
# The list to be cached by PWA # The list to be cached by PWA
# Chirpy v2.2 # Chirpy v2.2
# https://github.com/cotes2020/jekyll-theme-chirpy # https://github.com/cotes2020/jekyll-theme-chirpy
@@ -17,15 +19,13 @@ const include = [
'{{ "/assets/css/page.css" | relative_url }}', '{{ "/assets/css/page.css" | relative_url }}',
'{{ "/assets/css/post.css" | relative_url }}', '{{ "/assets/css/post.css" | relative_url }}',
'{{ "/assets/css/category-tag.css" | relative_url }}', '{{ "/assets/css/category-tag.css" | relative_url }}',
'{{ "/assets/lib/bootstrap-toc-1.0.1/bootstrap-toc.min.css" | relative_url }}', '{{ "/assets/css/lib/bootstrap-toc.min.css" | relative_url }}',
/*--- Javascripts ---*/ /*--- Javascripts ---*/
'{{ "/assets/js/dist/commons.js" | relative_url }}', '{{ "/assets/js/home.min.js" | relative_url }}',
'{{ "/assets/js/dist/timeago.min.js" | relative_url }}', '{{ "/assets/js/page.min.js" | relative_url }}',
'{{ "/assets/js/dist/category-collapse.min.js" | relative_url }}', '{{ "/assets/js/post.min.js" | relative_url }}',
'{{ "/assets/js/dist/toc.min.js" | relative_url }}',
'{{ "/assets/lib/bootstrap-toc-1.0.1/bootstrap-toc.min.js" | relative_url }}',
/*--- HTML ---*/ /*--- HTML ---*/
@@ -42,19 +42,16 @@ const include = [
/* The posts of first Home page and recent update list */ /* The posts of first Home page and recent update list */
{% assign post_list = "" | split: "" %} {% assign post_list = "" | split: "" %}
{% assign sum = 0 %}
{% for post in site.posts %} {% for post in site.posts limit: site.paginate %}
{% assign post_list = post_list | push: post.url %} {% capture post_url %}{{ post.url | relative_url }}{% endcapture %}
{% assign sum = sum | plus: 1 %} {% assign post_list = post_list | push: post_url %}
{% if sum >= site.paginate %}
{% break %}
{% endif %}
{% endfor %} {% endfor %}
{% include update_list.html %} {% include update-list.html %}
{% for item in update_list %} {% for item in update_list %}
{% assign url = item | split: "::" | last | prepend: "/posts/" | append: "/" %} {% assign url = item | split: "::" | last | url_encode | prepend: "/posts/" | append: "/" | relative_url %}
{% assign post_list = post_list | push: url %} {% assign post_list = post_list | push: url %}
{% endfor %} {% endfor %}
@@ -98,12 +95,7 @@ const include = [
/*--- Others ---*/ /*--- Others ---*/
{% if site.google_analytics.pv.enabled %} '{{ "/assets/js/data/search.json" | relative_url }}',
'{{ "/assets/lib/countUp.min.js" | relative_url }}',
'{{ "/assets/js/dist/pageviews.min.js" | relative_url }}',
{% endif %}
'{{ "/assets/data/search.json" | relative_url }}',
'{{ "/404.html" | relative_url }}', '{{ "/404.html" | relative_url }}',
'{{ "/app.js" | relative_url }}', '{{ "/app.js" | relative_url }}',
@@ -111,6 +103,9 @@ const include = [
]; ];
const exclude = [ const exclude = [
'/assets/data/pv-data.json', {%- if site.google_analytics.pv.proxy_url and site.google_analytics.pv.enabled -%}
'{{ site.google_analytics.pv.proxy_url }}',
{%- endif -%}
'/assets/js/data/pageviews.json',
'/img.shields.io/' '/img.shields.io/'
]; ];

View File

@@ -1,4 +1,5 @@
--- ---
layout: compress
--- ---
[ [
@@ -9,8 +10,7 @@
"categories": "{{ post.categories | join: ', '}}", "categories": "{{ post.categories | join: ', '}}",
"tags": "{{ post.tags | join: ', ' }}", "tags": "{{ post.tags | join: ', ' }}",
"date": "{{ post.date }}", "date": "{{ post.date }}",
{% assign content = post.content %} {% include no-linenos.html content=post.content %}
{% include no-linenos.html %}
"snippet": "{{ content | strip_html | strip_newlines | remove_chars | escape | truncate: 300 | replace: '\', '\\\\' }}" "snippet": "{{ content | strip_html | strip_newlines | remove_chars | escape | truncate: 300 | replace: '\', '\\\\' }}"
}{% unless forloop.last %},{% endunless %} }{% unless forloop.last %},{% endunless %}
{% endfor %} {% endfor %}

View File

@@ -1 +0,0 @@
$(window).scroll(function(){if($(this).scrollTop()>50&&$("#sidebar-trigger").css("display")=="none"){$("#back-to-top").fadeIn()}else{$("#back-to-top").fadeOut()}});$(function(){$("#back-to-top").click(function(){$("body,html").animate({scrollTop:0},800);return false})});

View File

@@ -1 +0,0 @@
function copyLink(a){if(!a||0===a.length){a=window.location.href}var b=$("<input>");$("body").append(b);b.val(a).select();document.execCommand("copy");b.remove();alert("Link copied successfully!")};

View File

@@ -1 +0,0 @@
$(function(){var j=$("#sidebar-trigger");var o=$("#search-trigger");var h=$("#search-cancel");var b=$("#search-cleaner");var e=$("#main");var c=$("#topbar-title");var k=$("#search-wrapper");var i=$("#search-result-wrapper");var g=$("#search-results");var l=$("#search-input");var a=$("#search-hints");var d=(function(){var p=0;return{block:function(){p=$(window).scrollTop()},release:function(){$("html,body").scrollTop(p)},getOffset:function(){return p}}})();var m=(function(){return{on:function(){j.addClass("unloaded");c.addClass("unloaded");o.addClass("unloaded");k.addClass("d-flex");h.addClass("loaded")},off:function(){h.removeClass("loaded");k.removeClass("d-flex");j.removeClass("unloaded");c.removeClass("unloaded");o.removeClass("unloaded")}}})();var n=(function(){var p=false;return{on:function(){if(!p){i.removeClass("unloaded");e.addClass("hidden");p=true;d.block()}},off:function(){if(p){g.empty();if(a.hasClass("unloaded")){a.removeClass("unloaded")}i.addClass("unloaded");b.removeClass("visable");e.removeClass("hidden");l.val("");p=false;d.release()}},isVisable:function(){return p}}})();function f(){return h.hasClass("loaded")}o.click(function(){m.on();n.on();l.focus()});h.click(function(){m.off();n.off()});l.focus(function(){k.addClass("input-focus")});l.focusout(function(){k.removeClass("input-focus")});l.on("keyup",function(p){if(p.keyCode==8&&l.val()==""){if(!f()){n.off()}else{a.removeClass("unloaded")}}else{if(l.val()!=""){n.on();if(!b.hasClass("visible")){b.addClass("visable")}if(f()){a.addClass("unloaded")}}}});b.on("click",function(){l.val("");if(f()){a.removeClass("unloaded");g.empty()}else{n.off()}l.focus();b.removeClass("visable")})});

View File

@@ -1 +0,0 @@
$(function(){var a=(function(){const c="sidebar-display";var d=false;var b=$("body");return{toggle:function(){if(d==false){b.attr(c,"")}else{b.removeAttr(c)}d=!d}}})();$("#sidebar-trigger").click(a.toggle);$("#mask").click(a.toggle)});

View File

@@ -1 +0,0 @@
$(function(){var d;var c=0;var e=5;var b=$("#topbar-wrapper").outerHeight();$(window).scroll(function(f){if($("#topbar-title").is(":hidden")){d=true}});setInterval(function(){if(d){a();d=false}},250);function a(){var f=$(this).scrollTop();if(Math.abs(c-f)<=e){return}if(f>c&&f>b){$("#topbar-wrapper").removeClass("topbar-down").addClass("topbar-up");if($("#toc-wrapper").length>0){$("#toc-wrapper").removeClass("topbar-down")}if($(".access").length>0){$(".access").removeClass("topbar-down")}if($("#search-input").is(":focus")){$("#search-input").blur()}}else{if(f+$(window).height()<$(document).height()){$("#topbar-wrapper").removeClass("topbar-up").addClass("topbar-down");if($("#toc-wrapper").length>0){$("#toc-wrapper").addClass("topbar-down")}if($(".access").length>0){$(".access").addClass("topbar-down")}}}c=f}});

View File

@@ -1 +0,0 @@
$(function(){var a=$("#topbar-title").text().trim();var b=($("div.post>h1").length>0)?$("div.post>h1").text().trim():$("h1").text().trim();if($("#page-category").length||$("#page-tag").length){if(/\s/.test(b)){b=b.replace(/[0-9]/g,"").trim()}}$(window).scroll(function(){if($("#post-list").length||$("div.post>h1").is(":hidden")||$("#topbar-title").is(":hidden")||$("#sidebar.sidebar-expand").length){return false}if($(this).scrollTop()>=95){if($("#topbar-title").text()!=b){$("#topbar-title").text(b)}}else{if($("#topbar-title").text()!=a){$("#topbar-title").text(a)}}});$("#topbar-title").click(function(){$("body,html").animate({scrollTop:0},800)})});

View File

@@ -1 +0,0 @@
$(function(){var b="l_";var a="h_";$(".collapse").on("hide.bs.collapse",function(){var c=a+$(this).attr("id").substring(b.length);if(c){$("#"+c+" .far.fa-folder-open").attr("class","far fa-folder fa-fw");$("#"+c+" i.fas").addClass("rotate");$("#"+c).removeClass("hide-border-bottom")}});$(".collapse").on("show.bs.collapse",function(){var c=a+$(this).attr("id").substring(b.length);if(c){$("#"+c+" .far.fa-folder").attr("class","far fa-folder-open fa-fw");$("#"+c+" i.fas").removeClass("rotate");$("#"+c).addClass("hide-border-bottom")}})});

View File

@@ -1,12 +0,0 @@
---
# Aggregation of common JS.
# © 2018-2019 Cotes Chung
# MIT License
---
{% include_relative _commons/back-to-top.min.js %}
{% include_relative _commons/search-display.min.js %}
{% include_relative _commons/sidebar.min.js %}
{% include_relative _commons/topbar-switch.min.js %}
{% include_relative _commons/topbar-title.min.js %}
{% include_relative _commons/copy-link.min.js %}

View File

@@ -1 +0,0 @@
function countUp(b,a,d){if(b<a){var c=new CountUp(d,b,a);if(!c.error){c.start()}else{console.error(c.error)}}}function countPV(f,e){var g=f.replace(/\/posts\//g,"").replace(/\//g,".html");var d=0;var c=f.replace(/posts\//g,"");for(var b=0;b<e.length;++b){var a=e[b][0];if(a==f||a==c||a.concat("/")==c||a.slice(a.lastIndexOf("/")+1)===g){d+=parseInt(e[b][1])}}return d}function tacklePV(e,f,d,b){var c=countPV(f,e);c=(c==0?1:c);if(!b){d.text(new Intl.NumberFormat().format(c))}else{var a=parseInt(d.text().replace(/,/g,""));if(c>a){countUp(a,c,d.attr("id"))}}}function displayPageviews(c){if(c===undefined){return}var a=getInitStatus();var b=c.rows;if($("#post-list").length>0){$(".post-preview").each(function(){var e=$(this).children("h1").children("a").attr("href");tacklePV(b,e,$(this).find(".pageviews"),a)})}else{if($(".post").length>0){var d=window.location.pathname;tacklePV(b,d,$("#pv"),a)}}}var getInitStatus=(function(){var a=false;return function(){let ret=a;if(!a){a=true}return ret}})();var PvCache=(function(){const e="pv";const b="pv-created-date";const d="pv-type";var c={ORIGIN:"origin",PROXY:"proxy"};function a(g){return localStorage.getItem(g)}function f(g,h){localStorage.setItem(g,h)}return{getData:function(){return JSON.parse(localStorage.getItem(e))},saveOriginCache:function(g){f(e,g);f(d,c.ORIGIN);f(b,new Date().toJSON())},saveProxyCache:function(g){f(e,g);f(d,c.PROXY);f(b,new Date().toJSON())},isOriginCache:function(){return a(d)==c.ORIGIN},isProxyCache:function(){return a(d)==c.PROXY},isExpired:function(){if(PvCache.isOriginCache()){let date=new Date(a(b));date.setDate(date.getDate()+1);return Date.now()>=date.getTime()}else{if(PvCache.isProxyCache()){let date=new Date(a(b));date.setHours(date.getHours()+1);return Date.now()>=date.getTime()}}return false},getAllPagevies:function(){return PvCache.getData().totalsForAllResults["ga:pageviews"]},newerThan:function(g){return PvCache.getAllPagevies()>g.totalsForAllResults["ga:pageviews"]}}})();function fetchOriginPageviews(a){if(a===undefined){return}displayPageviews(a);PvCache.saveOriginCache(JSON.stringify(a))}function fetchProxyPageviews(){let proxy=JSON.parse(proxyData);$.ajax({type:"GET",url:proxy.url,dataType:"jsonp",jsonpCallback:"displayPageviews",success:function(b,c,a){PvCache.saveProxyCache(JSON.stringify(b))},error:function(a,c,b){console.log("Failed to load pageviews from proxy server: "+b)}})}$(function(){if($(".pageviews").length>0){let cache=PvCache.getData();if(cache){if(PvCache.isExpired()){if(PvCache.isProxyCache()){let originPvData=pageviews?JSON.parse(pageviews):undefined;if(originPvData){if(PvCache.newerThan(originPvData)){displayPageviews(cache)}else{fetchOriginPageviews(originPvData)}}fetchProxyPageviews()}else{if(PvCache.isOriginCache()){fetchOriginPageviews(originPvData);fetchProxyPageviews()}}}else{displayPageviews(cache);if(PvCache.isOriginCache()){fetchProxyPageviews()}}}else{let originPvData=pageviews?JSON.parse(pageviews):undefined;fetchOriginPageviews(originPvData);fetchProxyPageviews()}}});

View File

@@ -1 +0,0 @@
$(function(){function d(h,g){var f=new Date();var o=new Date(h);var n=Math.floor((f-o)/1000);var l=Math.floor(n/31536000);if(l>=1){return l+" year"+(l>1?"s":"")+" ago"}var k=Math.floor(n/2592000);if(k>=1){return k+" month"+(k>1?"s":"")+" ago"}var e=Math.floor(n/604800);if(e>=1){return e+" week"+(e>1?"s":"")+" ago"}var m=Math.floor(n/86400);if(m>=1){return m+" day"+(m>1?"s":"")+" ago"}var j=Math.floor(n/3600);if(j>=1){return j+" hour"+(j>1?"s":"")+" ago"}var i=Math.floor(n/60);if(i>=1){return i+" minute"+(i>1?"s":"")+" ago"}return(g?"just":"Just")+" now"}function c(){$(".timeago").each(function(){if($(this).children("i").length>0){var g=$(this).hasClass("lastmod");var f=$(this).children("i");var e=f.text();$(this).text(d(e,g));$(this).append(f)}});if(a==0&&b!=undefined){clearInterval(b)}return a}var a=$(".timeago").length;if(a==0){return}if(c()>0){a=$(".timeago").length;var b=setInterval(c,60000)}});

View File

@@ -1 +0,0 @@
$(function(){if($("#post-wrapper .post-content h1").length==0&&$("#post-wrapper .post-content h2").length==0){$("#toc-wrapper").addClass("unloaded")}});

View File

@@ -1 +0,0 @@
$(function(){$('[data-toggle="tooltip"]').tooltip()});

11
assets/js/home.min.js vendored Normal file
View File

@@ -0,0 +1,11 @@
---
layout: compress
# JS for layout home.
# Chirpy v2.3
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT License
---
{% include_relative _home-post.js %}

11
assets/js/page.min.js vendored Normal file
View File

@@ -0,0 +1,11 @@
---
layout: compress
# JS for layout page by default.
# Chirpy v2.3
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT License
---
{% include_relative _commons.js %}

15
assets/js/post.min.js vendored Normal file
View File

@@ -0,0 +1,15 @@
---
layout: compress
# JS for layout post.
# Chirpy v2.3
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT License
---
{% include_relative _home-post.js %}
{% include_relative lib/_bootstrap-toc.min.js %}
{% include_relative _utils/toc-filter.js %}

File diff suppressed because one or more lines are too long

View File

@@ -2,35 +2,39 @@
🌏 [English](../README.md) • 简体中文 🌏 [English](../README.md) • 简体中文
[![Build Status](https://github.com/cotes2020/jekyll-theme-chirpy/workflows/build/badge.svg?event=push)](https://github.com/cotes2020/jekyll-theme-chirpy/actions?query=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)
[![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)](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)
一个不一样的响应式设计 Jekyll 主题(内附神秘工具),采用响应式设计,方便记录、管理、分享你的知识和经验。 一个不一样的 Jekyll 主题,采用响应式设计,方便记录、管理、分享你的知识和经验。[懂的进 »](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://raw.githubusercontent.com/cotes2020/jekyll-theme-chirpy/master/assets/img/sample/devices-mockup.png)](https://chirpy.cotes.info)
> ⚠️ 中文版文档存在更新不及时的风险(开源文档以英文为主,请见谅)。如果发现中、英文内容不匹配的情况,一切以英文版内容为准。如果您愿意的话,可提交 issuse 提醒作者更新中文版 README谢谢。
## 目录 ## 目录
* [功能](#功能) * [功能](#功能)
* [安装](#安装) * [安装](#安装)
* [运行指南](#运行指南) * [使用](#使用)
* [参与贡献](#参与贡献) * [参与贡献](#参与贡献)
* [感谢](#感谢) * [感谢](#感谢)
* [赞助](#赞助) * [赞助](#赞助)
* [许可证书](#许可证书) * [许可证书](#许可证书)
## 功能 ## 功能
* 自动暗夜模式 * 文章置顶
* 可配置的全局主题颜色
* 文章最后修改日期 * 文章最后修改日期
* 文章目录 * 文章目录
* 自动推荐相关文章 * 自动推荐相关文章
* 语法高亮 * 语法高亮
* 二级目录 * 二级目录
* 数学表达式
* 搜索 * 搜索
* Atom 订阅 * Atom 订阅
* Disqus 评论 * Disqus 评论
* Google 分析 * Google 分析
* GA 浏览报告(高级功能) * GA 浏览报告(高级功能)
* SEO 优化 * SEO 优化
@@ -39,98 +43,76 @@
## 安装 ## 安装
### 准备工作 [Fork **Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/fork),然后克隆到本地:
按照 [Jekyll 官方文档](https://jekyllrb.com/docs/installation/) 完成基础环境的安装 (RubyRubyGemBundler 和 Jekyll)。 ```terminal
$ git clone git@github.com:<username>/jekyll-theme-chirpy -b master --single-branch
为了使用项目内免费提供的脚本工具提升你的写作体验,如果你的机器系统是 Debian 或者 macOS则需要确保安装了 [GNU coreutils](https://www.gnu.org/software/coreutils/)。否则,通过以下方式获得:
* Debian
```console
$ sudo apt-get install coreutils
```
* macOS
```console
$ brew install coreutils
```
接着,[fork](https://github.com/cotes2020/jekyll-theme-chirpy/fork) 一份代码,然后克隆你 Fork 的仓库到本地机器上。
```console
$ git clone git@github.com:USER/jekyll-theme-chirpy.git -b master
``` ```
把上述的`USER` 替换为你的 GitHub username。 ### 设置本地环境
如果你想在本地运行或构建, 参考 [Jekyll Docs](https://jekyllrb.com/docs/installation/)安装 `Ruby` `RubyGems``Bundler`
首次运行或构建时, 请先安装 Jekyll plugins。在项目根目录运行
### 安装 Jekyll 插件
本地首次运行或编译,请在项目根目录下运行:
```terminal ```terminal
$ bundle install $ bundle install
``` ```
`bundle` 命令会自动安装 `Gemfile` 内声明的依赖插件.
`bundle` 会自动安装 `Gemfile` 内指定的依赖插件。
另外,为了生成一些额外的文件( Post 的分类、标签以及更新时间列表),需要用到一些脚本工具。如果你电脑的操作系统是 Debian 或者 macOS请确保已经安装了[GNU coreutils](https://www.gnu.org/software/coreutils/),否则,通过以下方式完成安装:
* Debian
```console
$ sudo apt-get install coreutils
```
* macOS
```console
$ brew install coreutils
```
## 使用
## 运行指南 运行 [**Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/) 需要一些额外的文件, 它们不能通过 Jekyll 原生的命令生成,所以请严格依照下列说明去运行或部署此项目。
### 文件目录 ### 初始化
下面是主要的文件目录: 在项目根目录,开始初始化:
```sh ```console
jekyll-theme-chirpy/ $ bash tools/init.sh
├── _data
├── _includes
├── _layouts
├── _posts # posts stay here
├── _scripts
├── .travis.yml # remove it
├── .github # remove this, too
├── assets
├── tabs
│   └── about.md # the ABOUT page
├── .gitignore
├── 404.html
├── Gemfile
├── LICENSE
├── README.md
├── _config.yml # configuration file
├── tools # script tools
├── docs
├── feed.xml
├── index.html
├── robots.txt
└── sitemap.xml
``` ```
> 如果你不打算部署到 GitHub Pages, 在上述命令后附加参数选项 `--no-gh`。
你需要将以下文件或目录删除: 上述脚本完成了以下工作:
- .travis.yml 1. 从你的仓库中删除了:
- .github - `.travis.yml`
- `.github` 下的文件和目录
- `_posts` 下的文件
- `docs` 目录
2. 配置了 GitHub Actions把 `.github/workflows/` 的文件 `pages-deploy.yml.hook` 重命名为 `pages-deploy.yml`。
3. 自动提交一个 Commit 以保存文件的更改。
### 配置文件 ### 配置文件
根据个人需要去修改 `_config.yml` 的变量,大部分都有注释介绍用法。 根据个人需要去修改 `_config.yml` 的变量,大部分都有注释介绍用法。典型的几个选项是:
* 头像 * `url`
* `avatar`
示例的头像文件放置在:`/assets/img/sample/avatar.jpg`. 把它换成你自己的头像,路径不限定,越小越好。(压缩图像体积可上这个网站:*<https://tinypng.com/>* ). * `timezone`
* `theme_mode`
* 时区 ### 本地运行
时区由 `timezone` 定义,默认为 `亚洲/上海`,如果肉身翻墙要换城市可在此列表找到: [TimezoneConverter](http://www.timezoneconverter.com/cgi-bin/findzone/findzone) 或者 [Wikipedia](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
### 本地运行
使用以下工具可轻松运行: 使用以下工具可轻松运行:
@@ -142,95 +124,77 @@ $ bash tools/run.sh
如果你想在本地服务运行后,把修改源文件的更改实时刷新,可使用选项 `-r` (或 `--realtime`),不过要先安装依赖 [**fswatch**](http://emcrisostomo.github.io/fswatch/) 。 如果你想在本地服务运行后,把修改源文件的更改实时刷新,可使用选项 `-r` (或 `--realtime`),不过要先安装依赖 [**fswatch**](http://emcrisostomo.github.io/fswatch/) 。
### 部署到 GitHub Pages
### 部署
部署开始前,把 `_config.yml` 的 `url` 改为 `https://<username>.github.io`(或者你的私有域名,如:`https://yourdomain.com`)。另外,如果你想使用 [Project 类型网站](https://help.github.com/en/github/working-with-github-pages/about-github-pages#types-of-github-pages-sites),修改配置文件的 `baseurl` 为项目名称,以斜杠开头,如:`/project`。 部署开始前,把 `_config.yml` 的 `url` 改为 `https://<username>.github.io`(或者你的私有域名,如:`https://yourdomain.com`)。另外,如果你想使用 [Project 类型网站](https://help.github.com/en/github/working-with-github-pages/about-github-pages#types-of-github-pages-sites),修改配置文件的 `baseurl` 为项目名称,以斜杠开头,如:`/project`。
#### 方法 1: 由 GitHub Pages 生成站点 假设你已经完成了 [初始化](#初始化),现在你可以选择下列其中一个方式去站点部署。
依照本方法,你可以直接把源码推送到远端仓库。 #### 部署到 GitHub Pages
> **注**: 如果你想使用任何不在这个[列表](https://pages.github.com/versions/)上的插件,越过此方法,直接看 [*方法 2: 本地构建*](#方法-2-本地构建). 由于安全原因GitHub Pages 的构建强制加了 `safe`参数,这导致了我们不能使用脚本工具去创建所需的附加页面。因此,我们可以使用 GitHub Actions 去构建站点,把站点文件存储在一个新分支上,再指定该分支作为 Pages 服务的源。
**1**. 仓库改名为: 1. 推送任意一个 commit 到 `origin/master` 以触发 GitHub Actions workflow。一旦 build 完毕,远端将会自动出现一个新分支 `gh-pages` 用来存储构建的站点文件。
|站点类型 | 仓库名称| 2. 除非你是使用 project 站点, 否则重命名你的仓库为 `<username>.github.io`。
|:---|:---|
|User or Organization | `<username>.github.io`|
|Project| `<username>.github.io` 以外的名字,譬如 `project`|
**2**. 提交本地更改,然后运行: 3. 选择分支 `gh-pages` 作为 GitHub Pages 的源.
4. 按照 GitHub 指示的地址去访问你的网站。
#### 部署到其他 Pages 平台
在 GitHub 之外的平台,例如 GitLab就没法享受 **GitHub Actions** 的便利了。不过先别慌,可以通过工具来弥补这个遗憾。
先把本地仓库的 upstream 改为新平台的仓库地址,推送一发。以后每次更新内容后,提交 commit ,然后运行:
```console ```console
$ bash tools/init.sh $ bash tools/publish.sh
``` ```
>**注**: *最后更新* 列表根据文章的 git 修改记录生成,所以运行前先把 `_posts` 目录的修改提交。 >**注**: *最后更新* 列表根据文章的 git 修改记录生成,所以运行前先把 `_posts` 目录的修改提交。
它会自动生成文章的 *最后修改日期* 和 *分类 / 标签* 页面. 它会自动生成文章的 *最后修改日期* 和 *分类 / 标签* 页面,并自动提交一个 commit 并推送到 `origin/master` 。输出日志类似如下:
**3**. 推送到 `origin/master` 然后到 GitHub 网页为该项目开启 Pages 服务。 ```terminal
[INFO] Success to update lastmod for 4 post(s).
[INFO] Succeed! 3 category-pages created.
[INFO] Succeed! 4 tag-pages created.
[INFO] Published successfully!
```
**4**. 网站将运行在: 最后,根据平台的说明文档为项目开启 Pages 服务。
|站点类型 | 网站 URL | #### 部署到私人服务器
|:---|:---|
|User or Organization | `https://<username>.github.io/`|
|Project| `https://<username>.github.io/project/`|
在项目更目录,运行:
#### 方法 2: 本地构建
由于安全原因GitHub Pages 不允许第三方插件运行,如果你想突破规则,就要本地构建站点内容。
**1**. 到 GitHub 网页,创建一个新的仓库,根据以下规则命名:
|站点类型 | 仓库名称|
|:---|:---|
|User or Organization | `<username>.github.io`|
|Project| `<username>.github.io` 以外的名字, 例如 `project`|
然后 Clone 新仓库到本地。
**2**. 构建站点:
```console ```console
$ bash tools/build.sh -d /path/to/local/project/ $ bash tools/build.sh -d /path/to/site/
``` ```
> `project` 为新仓库名称。
生成的静态文件将会在 `/path/to/local/project`. 把新仓库的修改提交并推送到远端 `master` 分支.
**3**. 回到 GithHub 网页,为该仓库开启 Pages 服务。
**4**. 网站将运行在:
|站点类型 | 站点 URL |
|:---|:---|
|User or Organization | `https://<username>.github.io/`|
|Project| `https://<username>.github.io/project/`|
生成的静态文件将会在 `/path/to/site/` 把内部的文件上传到服务器即可。
### 文档 ### 文档
更多细节及更佳的阅读体验,请参阅 [线上教程](https://chirpy.cotes.info/categories/tutorial/)。 与此同时,[Wiki](https://github.com/cotes2020/jekyll-theme-chirpy/wiki) 也有一份教程的拷贝。 若想要更多细节及更佳的阅读体验,请参阅 [线上教程](https://chirpy.cotes.info/categories/tutorial/)。 与此同时,[Wiki](https://github.com/cotes2020/jekyll-theme-chirpy/wiki) 也有一份教程的拷贝。
## 参与贡献 ## 参与贡献
三人行必有我师,欢迎提报告 bug, 帮助改进代码质量,或者提交新功能。具体操作规则请参考[此文](.github/CONTRIBUTING.md),谢谢🙏。 三人行必有我师,欢迎提报告 bug, 帮助改进代码质量,或者提交新功能。具体操作规则请参考 [贡献指南](../.github/CONTRIBUTING.md),谢谢 🙏。
## 感谢 ## 感谢
这个主题的开发主要基于 [Jekyll](https://jekyllrb.com/) 生态、[Bootstrap](https://getbootstrap.com/)、[Font Awesome](https://fontawesome.com/) 和其他一些出色的工具 (相关文件中可以找到这些工具的版权信息). 这个主题的开发主要基于 [Jekyll](https://jekyllrb.com/) 生态、[Bootstrap](https://getbootstrap.com/)、[Font Awesome](https://fontawesome.com/) 和其他一些出色的工具 (相关文件中可以找到这些工具的版权信息).
:tada:感谢所有参与代码贡献的小伙伴, 他们的 GayHub ID 在这个[列表](https://github.com/cotes2020/jekyll-theme-chirpy/graphs/contributors)。 另外, 提交过 issues(或者未被合并 PR)的高富帅和白富美也不会被遗忘,他/她们帮助报告 bug、分享新点子或者启发了我写出更通俗易懂的文档。 :tada: 感谢所有参与代码贡献的小伙伴, 他们的 GayHub ID 在这个[列表](https://github.com/cotes2020/jekyll-theme-chirpy/graphs/contributors)。 另外, 提交过 issues(或者未被合并 PR) 的高富帅和白富美也不会被遗忘,他/她们帮助报告 bug、分享新点子或者启发了我写出更通俗易懂的文档。
## 赞助 ## 赞助
如果您喜欢这个主题或者它对您有帮助,请考虑打赏作者:在 [项目主页](https://github.com/cotes2020/jekyll-theme-chirpy) 点击按钮 <kbd>:heart:Sponsor</kbd> 选择适合的链接即可完成(国内一般选第二个链接,支付宝/微信赞助),您的打赏将会极大地鼓励作者,并帮助作者更好地维护项目! 如果您喜欢这个主题或者它对您有帮助,请考虑打赏作者:在 [项目主页](https://github.com/cotes2020/jekyll-theme-chirpy) 点击按钮 <kbd>:heart: Sponsor</kbd> 选择适合的链接即可完成(国内一般选第二个链接,支付宝/微信赞助),您的打赏将会极大地鼓励作者,并帮助作者更好地维护项目!
## 许可证书 ## 许可证书

3
sw.js
View File

@@ -1,12 +1,13 @@
--- ---
layout: compress layout: compress
# Chirpy v2.2 # Chirpy v2.2
# https://github.com/cotes2020/jekyll-theme-chirpy # https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung # © 2020 Cotes Chung
# MIT Licensed # MIT Licensed
--- ---
self.importScripts('{{ "/assets/data/cache-list.js" | relative_url }}'); self.importScripts('{{ "/assets/js/data/cache-list.js" | relative_url }}');
var cacheName = 'chirpy-{{ "now" | date: "%Y%m%d.%H%M" }}'; var cacheName = 'chirpy-{{ "now" | date: "%Y%m%d.%H%M" }}';

View File

@@ -1,6 +1,6 @@
--- ---
title: Archives title: Archives
type: archives
# The Archives of posts. # The Archives of posts.
# v2.0 # v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy # https://github.com/cotes2020/jekyll-theme-chirpy
@@ -24,7 +24,7 @@ title: Archives
{% capture this_month %}{{ post.date | date: "%b" }}{% endcapture %} {% capture this_month %}{{ post.date | date: "%b" }}{% endcapture %}
<span class="date day">{{ this_day }}</span> <span class="date day">{{ this_day }}</span>
<span class="date month small text-muted">{{ this_month }}</span> <span class="date month small text-muted">{{ this_month }}</span>
<a href="{{ site.baseurl }}{{ post.url }}">{{ post.title }}</a> <a href="{{ post.url | relative_url }}">{{ post.title }}</a>
</div> </div>
</li> </li>
{% if forloop.last %} {% if forloop.last %}

View File

@@ -1,6 +1,6 @@
--- ---
title: Categories title: Categories
type: categories
# All the Categories of posts # All the Categories of posts
# v2.0 # v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy # https://github.com/cotes2020/jekyll-theme-chirpy
@@ -8,6 +8,11 @@ title: Categories
# MIT License # MIT License
--- ---
{% assign HEAD_PREFIX = "h_" %}
{% assign LIST_PREFIX = "l_" %}
{% assign group_index = 0 %}
{% assign sort_categories = site.categories | sort %} {% assign sort_categories = site.categories | sort %}
{% for category in sort_categories %} {% for category in sort_categories %}
@@ -32,7 +37,8 @@ title: Categories
<div class="card categories"> <div class="card categories">
<!-- top-category --> <!-- top-category -->
<div class="card-header d-flex justify-content-between hide-border-bottom" id="h_{{ category_name }}"> <div class="card-header d-flex justify-content-between hide-border-bottom"
id="{{ HEAD_PREFIX }}{{ group_index }}">
<span> <span>
{% if sub_categories_size > 0 %} {% if sub_categories_size > 0 %}
<i class="far fa-folder-open fa-fw"></i> <i class="far fa-folder-open fa-fw"></i>
@@ -40,33 +46,39 @@ title: Categories
<i class="far fa-folder fa-fw"></i> <i class="far fa-folder fa-fw"></i>
{% endif %} {% endif %}
<a href="{{ site.baseurl }}/categories/{{ category_name | replace: ' ', '-' | downcase | url_encode }}/" <a href="{{ site.baseurl }}/categories/{{ category_name | replace: ' ', '-' | downcase | url_encode }}/"
class="ml-1 mr-2">{{ category_name }}</a> class="ml-1 mr-2">
{{ category_name }}
</a>
<!-- content count --> <!-- content count -->
{% assign top_posts_size = site.categories[category_name] | size %} {% assign top_posts_size = site.categories[category_name] | size %}
<span class="text-muted small font-weight-light"> <span class="text-muted small font-weight-light">
{% if sub_categories_size > 0 %} {% if sub_categories_size > 0 %}
{{ sub_categories_size }} {{ sub_categories_size }}
{% if sub_categories_size > 1 %}categories{% else %}category{% endif %}, {% if sub_categories_size > 1 %}categories{% else %}category{% endif %},
{% endif %} {% endif %}
{{ top_posts_size }} {{ top_posts_size }}
post{% if top_posts_size > 1 %}s{% endif %} post{% if top_posts_size > 1 %}s{% endif %}
</span> </span>
</span> </span>
<!-- arrow --> <!-- arrow -->
<a href="#l_{{ category_name }}" data-toggle="collapse" aria-expanded="true" class="category-trigger hide-border-bottom"> {% if sub_categories_size > 0%}
{% if sub_categories_size > 0%} <a href="#{{ LIST_PREFIX }}{{ group_index }}" data-toggle="collapse" aria-expanded="true"
class="category-trigger hide-border-bottom">
<i class="fas fa-fw fa-angle-down"></i> <i class="fas fa-fw fa-angle-down"></i>
{% else %}
<i class="fas fa-fw fa-angle-right disabled"></i>
{% endif %}
</a> </a>
{% else %}
<span data-toggle="collapse" class="category-trigger hide-border-bottom disabled">
<i class="fas fa-fw fa-angle-right"></i>
</span>
{% endif %}
</div> <!-- .card-header --> </div> <!-- .card-header -->
<!-- Sub-categories --> <!-- Sub-categories -->
{% if sub_categories_size > 0 %} {% if sub_categories_size > 0 %}
<div id="l_{{ category_name }}" class="collapse show" aria-expanded="true"> <div id="{{ LIST_PREFIX }}{{ group_index }}" class="collapse show" aria-expanded="true">
<ul class="list-group"> <ul class="list-group">
{% for sub_category in sub_categories %} {% for sub_category in sub_categories %}
<li class="list-group-item"> <li class="list-group-item">
@@ -85,7 +97,7 @@ title: Categories
</div> <!-- .card --> </div> <!-- .card -->
{% assign group_index = group_index | plus: 1 %}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
<script src="{{ site.baseurl }}/assets/js/dist/category-collapse.min.js" async></script>

View File

@@ -1,6 +1,6 @@
--- ---
title: Tags title: Tags
type: tags
# All the Tags of posts. # All the Tags of posts.
# v2.0 # v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy # https://github.com/cotes2020/jekyll-theme-chirpy

View File

@@ -86,14 +86,11 @@ main() {
opt="$1" opt="$1"
case $opt in case $opt in
-b|--baseurl) -b|--baseurl)
_check_unset $2 local _baseurl="$2"
if [[ $2 == \/* ]] if [[ -z "$_baseurl" ]]; then
then _baseurl='""'
CMD+=" -b $2"
else
_help
exit 1
fi fi
CMD+=" -b $_baseurl"
shift shift
shift shift
;; ;;

43
tools/deploy.sh Executable file
View File

@@ -0,0 +1,43 @@
#!/bin/bash
#
# Deploy the content of _site to 'origin/<pages_branch>'
#
# v2.5
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# Published under MIT License
set -eu
PAGES_BRANCH="gh-pages"
_no_branch=false
if [[ -z `git branch -av | grep $PAGES_BRANCH` ]]; then
_no_branch=true
git checkout -b $PAGES_BRANCH
else
git checkout $PAGES_BRANCH
fi
mv _site ../
mv .git ../
rm -rf * && rm -rf .[^.] .??*
mv ../_site/* .
mv ../.git .
git config --global user.name "GitHub Actions"
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
git update-ref -d HEAD
git add -A
git commit -m "[Automation] Site update No.${GITHUB_RUN_NUMBER}"
if [[ $_no_branch = true ]]; then
git push -u origin $PAGES_BRANCH
else
git push -f
fi

View File

@@ -1,95 +1,89 @@
#!/bin/bash #!/bin/bash
# #
# Initial the Categories/Tags pages and Lastmod for posts. # Init the evrionment for new user.
# v2.0 #
# v2.5
# https://github.com/cotes2020/jekyll-theme-chirpy # https://github.com/cotes2020/jekyll-theme-chirpy
# © 2019 Cotes Chung # © 2020 Cotes Chung
# Published under MIT License # Published under MIT License
set -eu set -eu
CATEGORIES=false
TAGS=false
LASTMOD=false
WORK_DIR=$(dirname $(dirname $(realpath "$0"))) ACTIONS_WORKFLOW=pages-deploy.yml
check_status() { help() {
local _watching_dirs=( echo "Usage:"
"_post" echo
"_data") echo " bash /path/to/init.sh [options]"
echo
for i in "${!_watching_dirs[@]}" echo "Options:"
do echo " --no-gh Do not deploy to Github."
local _dir=${_watching_dirs[${i}]} echo " -h, --help Print this help information."
if [[ ! -z $(git status $_dir -s) ]]; then
echo "Warning: Commit the changes of the directory '$_dir' first."
git status -s | grep $_dir
exit 1
fi
done
} }
check_init() {
local _has_inited=false
update_files() { if [[ -d .github ]]; then
bash _scripts/sh/create_pages.sh if [[ -f .github/workflows/$ACTIONS_WORKFLOW
bash _scripts/sh/dump_lastmod.sh && $(find .github/workflows/ -type f -name "*.yml" | wc -l) == 1 ]]; then
_has_inited=true
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
}
commit() {
msg="Updated"
if [[ ! -z $(git status categories -s) ]]; then
git add categories/
msg+=" the Categories"
CATEGORIES=true
fi
if [[ ! -z $(git status tags -s) ]]; then
git add tags/
if [[ $CATEGORIES = true ]]; then
msg+=","
else
msg+=" the"
fi fi
msg+=" Tags"
TAGS=true
fi
if [[ ! -z $(git status _data -s) ]]; then
git add _data
if [[ $CATEGORIES = true || $TAGS = true ]]; then
msg+=","
else
msg+=" the"
fi
msg+=" Lastmod"
LASTMOD=true
fi
if [[ $CATEGORIES = true || $TAGS = true || $LASTMOD = true ]]; then
msg+=" for post(s)."
git commit -m "[Automation] $msg"
else else
msg="Nothing changed." _has_inited=true
fi fi
echo $msg if [[ $_has_inited = true ]]; then
echo "Already initialized."
exit 0
fi
} }
main() { init_files() {
cd $WORK_DIR if [[ $_no_gh = true ]]; then
rm -rf .github
else
mv .github/workflows/$ACTIONS_WORKFLOW.hook .
rm -rf .github
mkdir -p .github/workflows
mv ./${ACTIONS_WORKFLOW}.hook .github/workflows/${ACTIONS_WORKFLOW}
fi
check_status rm -f .travis.yml
rm -rf _posts/* docs
update_files git add -A && git add .github -f
git commit -m "[Automation] Initialize the environment." -q
commit echo "[INFO] Initialization successful!"
} }
main
check_init
_no_gh=false
while (( $# ))
do
opt="$1"
case $opt in
--no-gh)
_no_gh=true
shift
;;
-h|--help)
help
exit 0
;;
*)
# unknown option
help
exit 1
;;
esac
done
init_files

View File

@@ -1,80 +0,0 @@
#!/bin/bash
#
# A development tool that use yuicompressor to compress JS files.
#
#
# Requirement:
# - wget
# - JRE
# - yuicompressor https://github.com/yui/yuicompressor
#
#
# Usage: bash /path/to/js-compress.sh
#
# Process:
# input: /path/to/js/source.js --> output: /path/to/js/dist/source.min.js
#
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2020 Cotes Chung
# MIT Licensed
set -eu
PROJ_HOME=$(dirname $(dirname $(realpath "$0")))
YUICOMPRESSOR_SRC=https://github.com/yui/yuicompressor/releases/download/v2.4.8/yuicompressor-2.4.8.jar
YUICOMPRESSOR=${PROJ_HOME}/tools/package/yuicompressor-2.4.8.jar
JS_ROOT=${PROJ_HOME}/assets/js/
JS_SRC=${JS_ROOT}_src # JS source files
JS_DEST=${JS_ROOT}dist # Compressed output directory
PREFIX_LEN=${#JS_ROOT} # To beautify the log
function init() {
if [[ ! -f $YUICOMPRESSOR ]]; then
if [[ ! -d "${PROJ_HOME}/tools/package/" ]]; then
mkdir -p "${PROJ_HOME}/tools/package/"
fi
wget "$YUICOMPRESSOR_SRC" -P "${PROJ_HOME}/tools/package/" -q
fi
}
function compress() {
# $1 is the source dir
# $2 is the destination dir
# $3 is the sub dir of source dir, nullable
if [[ -z ${3:+unset} ]]
then
sub_dir=""
else
sub_dir="$3/"
fi
for item in $(ls $1)
do
src="$1/$item"
if [[ -d "$src" ]]; then
compress $src $2 $item # recursion
else
if [[ -z $(git status $src -s) ]]; then
continue
fi
if [[ ! -d "$2/${sub_dir}" ]]; then
mkdir -p $2/${sub_dir}
fi
output=$2/${sub_dir}${item%.*}.min.js
echo "java -jar $(basename $YUICOMPRESSOR) ${src:$PREFIX_LEN} -o ${output:$PREFIX_LEN}"
java -jar $YUICOMPRESSOR $src -o $output
fi
done
sub_dir="" # clean up for next recursion.
}
init
compress $JS_SRC $JS_DEST

96
tools/publish.sh Executable file
View File

@@ -0,0 +1,96 @@
#!/bin/bash
#
# Initial the Categories/Tags pages and Lastmod for posts and then push to remote
#
# v2.0
# https://github.com/cotes2020/jekyll-theme-chirpy
# © 2019 Cotes Chung
# Published under MIT License
set -eu
CATEGORIES=false
TAGS=false
LASTMOD=false
WORK_DIR=$(dirname $(dirname $(realpath "$0")))
check_status() {
local _change=$(git status . -s)
if [[ ! -z ${_change} ]]; then
echo "Warning: Commit the following changes first:"
echo "$_change"
exit 1
fi
}
update_files() {
bash _scripts/sh/create_pages.sh
bash _scripts/sh/dump_lastmod.sh
}
commit() {
msg="Updated"
if [[ ! -z $(git status categories -s) ]]; then
git add categories/
msg+=" the Categories"
CATEGORIES=true
fi
if [[ ! -z $(git status tags -s) ]]; then
git add tags/
if [[ $CATEGORIES = true ]]; then
msg+=","
else
msg+=" the"
fi
msg+=" Tags"
TAGS=true
fi
if [[ ! -z $(git status _data -s) ]]; then
git add _data
if [[ $CATEGORIES = true || $TAGS = true ]]; then
msg+=","
else
msg+=" the"
fi
msg+=" Lastmod"
LASTMOD=true
fi
if [[ $CATEGORIES = true || $TAGS = true || $LASTMOD = true ]]; then
msg+=" for post(s)."
git commit -m "[Automation] $msg" -q
else
msg="Nothing changed."
fi
}
push() {
git push origin master -q
echo "[INFO] Published successfully!"
}
main() {
cd $WORK_DIR
check_status
update_files
commit
push
}
main

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