1
0
mirror of https://github.com/cotes2020/jekyll-theme-chirpy.git synced 2025-12-18 13:44:15 +00:00

Compare commits

..

34 Commits

Author SHA1 Message Date
Cotes Chung
0da2f80dd4 Merge branch 'master' into production 2023-07-02 21:25:57 +08:00
Cotes Chung
e8ef69ad17 chore(release): 6.1.0 2023-07-02 21:01:52 +08:00
Cotes Chung
2eb4267cdd build(release): remove extra blank lines in changelog 2023-07-02 21:01:52 +08:00
Anan
e4e76f0a11 chore(deps): upgrade actions/deploy-pages to version 2.x (#1121) 2023-07-02 20:25:53 +08:00
Cotes Chung
e07e6d46d7 refactor: revert media query range notation (#1072)
Media queries range syntax not supported by Safari for iOS under 16.4

See also:
- https://caniuse.com/?search=media-queries

This reverts commit 1682ce9d7c.
2023-07-02 20:16:36 +08:00
Cotes Chung
2bbfda79ad refactor(layout): improve margin bottom of the core block (#1116)
Improvement of commit 73af591
2023-06-28 20:21:30 +08:00
Cotes Chung
b0f4ae5eec chore(gh-actions): fix stale bot exempt condition 2023-06-28 20:16:20 +08:00
PENEKhun
8b0fbf5a83 fix: missing xml escape for alt of preview image (#1113)
Preview image display error when `alt` contains '<' or '>'


Co-authored-by: Cotes Chung <11371340+cotes2020@users.noreply.github.com>
2023-06-28 14:23:27 +08:00
PENEKhun
2639f8ed45 chore(tools): correct the file name in the tool's help message (#1114)
Removing `.sh` from the executable file name
2023-06-28 13:49:13 +08:00
Cotes Chung
926d1ca068 docs: update tutorial & readme (#1110)
- update feature list in README
- add screenshots to tutorial
2023-06-27 00:39:42 +08:00
Cotes Chung
df8ff546ec fix: the cached image is covered by shimmer (#1100) 2023-06-26 23:59:59 +08:00
Cotes Chung
c075e11a4e Revert "fix: shimmer has the potential to cover images (#1100)"
This reverts commit 74ab6f8adc.
2023-06-26 21:54:20 +08:00
Javen Leung
b6d1992f85 perf: CJK characters of the "Search Cancel" button will wrap (#1105) 2023-06-26 14:23:23 +08:00
Cotes Chung
74ab6f8adc fix: shimmer has the potential to cover images (#1100)
Resolves #1100
2023-06-24 21:23:30 +08:00
Cotes Chung
4fe145e980 perf(build): use jekyll-include-cache plugin to reduce build time (#1098)
Resolve #1094 and add margin bottom for layout tags

Co-authored-by: Jake Kerr <kodafox@gmail.com>
2023-06-19 14:41:40 +08:00
weeix
a60e90791d feat(i18n): add Thai locale file (#1087) 2023-06-13 00:57:40 +08:00
Cotes Chung
fa3257873e build: replace the stale app with gh-actions
The stale app is deprecated and  no longer maintained
2023-06-08 00:46:37 +08:00
Cotes Chung
1682ce9d7c style(scss): fix style-lint media-feature-range-notation issue (#1072)
See also: https://stylelint.io/user-guide/rules/media-feature-range-notation/
2023-06-04 12:29:33 +08:00
Cotes Chung
29a8bc26bc chore(deps): upgrade major version of npm packages
packages:
- rimraf
- stylelint-config-standard-scss
2023-06-04 12:21:16 +08:00
Cotes Chung
83625644ea refactor(core): remove GA page views report (#1071)
- Google Analytics superProxy has been archived and is no longer maintained.
- Google Analytics UA end of life.

See also: https://support.google.com/analytics/answer/11583528?hl=en
2023-06-04 10:56:31 +08:00
Cotes Chung
728094d1ba perf(ui): improve hover color of sidebar nav items in light mode 2023-06-04 09:36:32 +08:00
Cotes Chung
ce2f6f5abe perf(ui): avoid blank space at the bottom of the homepage preview image
When the title of the post has a line break, there will be a blank space at the bottom of the preview image.
2023-06-04 09:36:32 +08:00
Cotes Chung
c4da99c7ea fix(webfont): resume semi-bold of font family Source Sans Pro
font-weight 700
2023-06-04 09:36:29 +08:00
Cotes Chung
73af59194a fix(ui): min-height of page layout exceeds the mobile screen 2023-05-20 05:28:15 +08:00
Cotes Chung
f6bf6d0864 refactor: improve JS/HTML for button back2top (#1054)
The current "back to top" button is built by `<a>` tag, it would be more appropriate to replace it with the `<button>` tag.
2023-05-20 01:07:18 +08:00
Cotes Chung
bef2ac085e Merge branch 'hotfix/6.0.1' 2023-05-20 00:37:38 +08:00
Cotes Chung
7c9fa68331 Merge branch 'hotfix/6.0.1' into production 2023-05-20 00:37:36 +08:00
Cotes Chung
066c1cd039 chore(release): 6.0.1 2023-05-20 00:37:34 +08:00
Cotes Chung
98850e1e5d chore(build): tag on production branch instead of master (#1052) 2023-05-20 00:35:11 +08:00
Cotes Chung
83eecdabcb refactor: remove dead SCSS code (#1053) 2023-05-20 00:34:49 +08:00
Cotes Chung
a51d31c55a fix(typography): long string for update-list is not truncated (#1050)
Resolves #1049
2023-05-19 01:50:45 +08:00
Cotes Chung
eb40f51c84 fix(layout): restore the margin bottom of the main area (#1047) 2023-05-18 11:09:32 +08:00
Cotes Chung
3bd881da70 fix(post, page): image link loses shimmer effect (#1046) 2023-05-18 10:58:23 +08:00
Cotes Chung
aba9468b53 fix(home): preview image missing [alt] and img_path (#1044)
Close #1044
2023-05-18 10:46:15 +08:00
38 changed files with 244 additions and 695 deletions

17
.github/stale.yml vendored
View File

@@ -1,17 +0,0 @@
# Clean up the stale issues
daysUntilStale: 30
daysUntilClose: 1
exemptLabels:
- in progress
- pending
staleLabel: stale
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
closeComment: false

View File

@@ -68,4 +68,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1
uses: actions/deploy-pages@v2

30
.github/workflows/stale.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: "Close stale issues and PRs"
on:
schedule:
- cron: "0 0 * * *" # every day at 00:00 UTC
permissions:
issues: write
pull-requests: write
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v8
with:
days-before-stale: 30
days-before-close: 1
stale-issue-label: stale
exempt-issue-labels: pending
stale-issue-message: >
This issue has been automatically marked as stale because it has not had recent activity.
It will be closed if no further activity occurs.
Thank you for your contributions.
stale-pr-label: stale
exempt-pr-labels: pending
stale-pr-message: >
This PR has been automatically marked as stale because it has not had recent activity.
It will be closed if no further activity occurs.
Thank you for your contributions.

View File

@@ -17,6 +17,7 @@
"always",
{ "ignore": ["after-comment", "first-nested", "inside-block"] }
],
"value-keyword-case": ["lower", { "ignoreProperties": ["/^\\$/"] }]
"value-keyword-case": ["lower", { "ignoreProperties": ["/^\\$/"] }],
"media-feature-range-notation": "prefix"
}
}

View File

@@ -2,8 +2,36 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [6.0.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.6.1...v6.0.0) (2023-05-16)
## [6.1.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v6.0.0...v6.1.0) (2023-07-02)
### Features
* **i18n:** add Thai locale file ([#1087](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1087)) ([a60e907](https://github.com/cotes2020/jekyll-theme-chirpy/commit/a60e90791d24811caff78e21c71dc85d6a729438))
### Bug Fixes
* missing xml escape for `alt` of preview image ([#1113](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1113)) ([8b0fbf5](https://github.com/cotes2020/jekyll-theme-chirpy/commit/8b0fbf5a834276f273274e4d614edd71e339cbb0))
* the cached image is covered by shimmer ([#1100](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1100)) ([df8ff54](https://github.com/cotes2020/jekyll-theme-chirpy/commit/df8ff546ec1c8d21a3d25e0124665001fcf756f3))
* **ui:** min-height of `page` layout exceeds the mobile screen ([73af591](https://github.com/cotes2020/jekyll-theme-chirpy/commit/73af59194ab935d38b89d298fea0e96e13be7cb7))
* **webfont:** resume semi-bold of font family `Source Sans Pro` ([c4da99c](https://github.com/cotes2020/jekyll-theme-chirpy/commit/c4da99c7ea5d6e32b1f1b815d7d8d6ae7b0f55de))
### Improvements
* **build:** use `jekyll-include-cache` plugin to reduce build time ([#1098](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1098)) ([4fe145e](https://github.com/cotes2020/jekyll-theme-chirpy/commit/4fe145e9809ee1b370d9891135939534751462d0)), closes [#1094](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1094)
* CJK characters of the "Search Cancel" button will wrap ([#1105](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1105)) ([b6d1992](https://github.com/cotes2020/jekyll-theme-chirpy/commit/b6d1992f85ec543220e826087dcc89870e7e2c00))
* **ui:** avoid blank space at the bottom of the homepage preview image ([ce2f6f5](https://github.com/cotes2020/jekyll-theme-chirpy/commit/ce2f6f5abef7a8b874e08d1f18c1fd002650dbf1))
* **ui:** improve hover color of sidebar nav items in light mode ([728094d](https://github.com/cotes2020/jekyll-theme-chirpy/commit/728094d1ba67a1e7c0a11e1c6c69bf87af9a767b))
## [6.0.1](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v6.0.0...v6.0.1) (2023-05-19)
### Bug Fixes
* **home:** preview image missing `[alt]` and `img_path` ([#1044](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1044)) ([aba9468](https://github.com/cotes2020/jekyll-theme-chirpy/commit/aba9468b5332802db961166889d4c4a84e404a2c))
* **layout:** restore the margin bottom of the main area ([#1047](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1047)) ([eb40f51](https://github.com/cotes2020/jekyll-theme-chirpy/commit/eb40f51c84b011a7c301279527f544ad27efd5eb))
* **post, page:** image link loses shimmer effect ([#1046](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1046)) ([3bd881d](https://github.com/cotes2020/jekyll-theme-chirpy/commit/3bd881da70d685d10659f47bfe0e79cd02e7af92))
* **typography:** long string for update-list is not truncated ([#1050](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1050)) ([a51d31c](https://github.com/cotes2020/jekyll-theme-chirpy/commit/a51d31c55a37fbe034f0b0f699f4df0b6a14ba8f)), closes [#1049](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1049)
## [6.0.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.6.1...v6.0.0) (2023-05-16)
### ⚠ BREAKING CHANGES
@@ -22,18 +50,15 @@ All notable changes to this project will be documented in this file. See [standa
* **ui:** redesign the sidebar ([83bbe4a](https://github.com/cotes2020/jekyll-theme-chirpy/commit/83bbe4ac939edfd1706e68c080562e3462f83519))
* **ui:** show preview image in home page ([97b8dfe](https://github.com/cotes2020/jekyll-theme-chirpy/commit/97b8dfeed6ce7677f6472e28dc3b03f3c2968b12))
### Bug Fixes
* parameter parsing error in image URL ([#1022](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1022)) ([ee88cec](https://github.com/cotes2020/jekyll-theme-chirpy/commit/ee88cec270ea5938f98913a3edf28a684cfbd6c0))
* **rss:** double quotes in the post title will break the XML structure ([#965](https://github.com/cotes2020/jekyll-theme-chirpy/issues/965)) ([1719d81](https://github.com/cotes2020/jekyll-theme-chirpy/commit/1719d81d00b32b107c35b3903089be84a9b28a6c))
### refactor
* rename assets origin configuration files ([c283e77](https://github.com/cotes2020/jekyll-theme-chirpy/commit/c283e7782fa9562d82d9855fd280a573fd58c75f))
### Improvements
* **assets:** reduce HTTP requests to CDN ([9d97120](https://github.com/cotes2020/jekyll-theme-chirpy/commit/9d971201978e993a9af337d9cd5396a1ea225f00))
@@ -53,7 +78,6 @@ All notable changes to this project will be documented in this file. See [standa
## [5.6.1](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.6.0...v5.6.1) (2023-03-30)
### Bug Fixes
* **deps:** `tocbot` has no initialization detection ([#957](https://github.com/cotes2020/jekyll-theme-chirpy/issues/957)) ([8225174](https://github.com/cotes2020/jekyll-theme-chirpy/commit/8225174cb5e02fda7b3cc548ec821c876b0a5139))
@@ -62,14 +86,12 @@ All notable changes to this project will be documented in this file. See [standa
## [5.6.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.5.2...v5.6.0) (2023-03-17)
### Features
* change TOC plugin to `tocbot` ([#774](https://github.com/cotes2020/jekyll-theme-chirpy/issues/774)) ([02b7bd5](https://github.com/cotes2020/jekyll-theme-chirpy/commit/02b7bd5095a2affe5b4c5ed7b5b182baaf642ff3))
* **i18n:** add Greek Language Support. ([#903](https://github.com/cotes2020/jekyll-theme-chirpy/issues/903)) ([712a9b2](https://github.com/cotes2020/jekyll-theme-chirpy/commit/712a9b22401ce591cf4c0bb03fbdd1693fee30bb))
* **ux:** turn home page posts into clickable cards ([#895](https://github.com/cotes2020/jekyll-theme-chirpy/issues/895)) ([b85f633](https://github.com/cotes2020/jekyll-theme-chirpy/commit/b85f6330dea666350631c4461b742cdb54c5f052))
### Bug Fixes
* css selector string escaping vulnerability ([#888](https://github.com/cotes2020/jekyll-theme-chirpy/issues/888)) ([5c6ec9d](https://github.com/cotes2020/jekyll-theme-chirpy/commit/5c6ec9d06b6571e2c0efe6652078442dca8af477))
@@ -79,21 +101,18 @@ All notable changes to this project will be documented in this file. See [standa
## [5.5.2](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.5.1...v5.5.2) (2023-01-30)
### Bug Fixes
* position of prompt icon is incorrect in paragraph on mobile ([5df953f](https://github.com/cotes2020/jekyll-theme-chirpy/commit/5df953f6c877e2aa3f1f4981c97a0b8007abe6d4))
## [5.5.1](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.5.0...v5.5.1) (2023-01-29)
### Bug Fixes
* the icon position of the prompts in the list is incorrect ([0c9558d](https://github.com/cotes2020/jekyll-theme-chirpy/commit/0c9558de8a01e9ab795778f351a8bbf4d6b21763))
## [5.5.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.4.0...v5.5.0) (2023-01-29)
### Features
* **i18n:** add Arabic translation ([#857](https://github.com/cotes2020/jekyll-theme-chirpy/issues/857)) ([765af53](https://github.com/cotes2020/jekyll-theme-chirpy/commit/765af53b77e5c63804784d5728f5970ae274c2c7))
@@ -101,7 +120,6 @@ All notable changes to this project will be documented in this file. See [standa
* **i18n:** add Finnish translations ([#843](https://github.com/cotes2020/jekyll-theme-chirpy/issues/843)) ([d6d0318](https://github.com/cotes2020/jekyll-theme-chirpy/commit/d6d03183eaf94b44e037cc48b6e1c47cee183f6e))
* **i18n:** add Italian translation ([#850](https://github.com/cotes2020/jekyll-theme-chirpy/issues/850)) ([9a011e1](https://github.com/cotes2020/jekyll-theme-chirpy/commit/9a011e14d66195d8b2fb9ec62f3e60a3e56cd032))
### Bug Fixes
* copy command line incomplete(`.gp` part) ([41ed331](https://github.com/cotes2020/jekyll-theme-chirpy/commit/41ed33145639415148aec8e85edc7a6fd0de0ca3))
@@ -111,7 +129,6 @@ All notable changes to this project will be documented in this file. See [standa
## [5.4.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.3.2...v5.4.0) (2022-12-27)
### Features
* add `rel="me"` to Mastodon sidebar contact links for verification ([#807](https://github.com/cotes2020/jekyll-theme-chirpy/issues/807)) ([d2190c7](https://github.com/cotes2020/jekyll-theme-chirpy/commit/d2190c726f61c8c9732b88b4aecf699dc8bc7deb))
@@ -121,7 +138,6 @@ All notable changes to this project will be documented in this file. See [standa
* support dark and light mode images ([#481](https://github.com/cotes2020/jekyll-theme-chirpy/issues/481)) ([9306c7b](https://github.com/cotes2020/jekyll-theme-chirpy/commit/9306c7b39ecf9d9146bc1a25eebedc38eb2c3dd6))
* support LQIP for images ([bffaf63](https://github.com/cotes2020/jekyll-theme-chirpy/commit/bffaf6374f265cec96ef743d42b46fbec3b59797))
### Bug Fixes
* `hreflang` tag attribute of feed misses `site.alt_lang` ([7651d28](https://github.com/cotes2020/jekyll-theme-chirpy/commit/7651d2851b4bb7d8f0d068b62c036c89a1089bbc))
@@ -129,14 +145,12 @@ All notable changes to this project will be documented in this file. See [standa
* refactoring error when the image URL contains parameters ([ec98f07](https://github.com/cotes2020/jekyll-theme-chirpy/commit/ec98f07aca0b80a9c07fbcdc8e0d7d66dba98ed2))
* spaces in post title are encoded when sharing ([7efd2f8](https://github.com/cotes2020/jekyll-theme-chirpy/commit/7efd2f8aa2ea1c3aeb7d740bf9a018881c26fe65))
### Improvements
* **cdn:** optimize cache policy for static assets ([7fb0ee0](https://github.com/cotes2020/jekyll-theme-chirpy/commit/7fb0ee0bedb63eee3f90a49c6d7fb8b5d78c9830))
## [5.3.2](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.3.1...v5.3.2) (2022-11-22)
### Bug Fixes
* `mermaid` occasionally fails to initialize ([#536](https://github.com/cotes2020/jekyll-theme-chirpy/issues/536)) ([48f14e3](https://github.com/cotes2020/jekyll-theme-chirpy/commit/48f14e39ac81bbfb3b9913ea3ee789d775b2d1ae))
@@ -146,14 +160,12 @@ All notable changes to this project will be documented in this file. See [standa
## [5.3.1](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.3.0...v5.3.1) (2022-10-25)
### Bug Fixes
* 404 page missing title in tablet/desktop view ([5511b28](https://github.com/cotes2020/jekyll-theme-chirpy/commit/5511b2883fd5a395fddfb642588d00c122f18da7))
* prompt content overflows horizontally ([#705](https://github.com/cotes2020/jekyll-theme-chirpy/issues/705)) ([fb13e32](https://github.com/cotes2020/jekyll-theme-chirpy/commit/fb13e3219b5eca0d2e4f86a1ecabfab75240369f))
* **tools:** multiple configuration files will fail the test ([80cb0b3](https://github.com/cotes2020/jekyll-theme-chirpy/commit/80cb0b371754e96772a7907877a8ce196398ba3d))
### Improvements
* **layout:** improve the min-height of main content ([#674](https://github.com/cotes2020/jekyll-theme-chirpy/issues/674)) ([49bb93c](https://github.com/cotes2020/jekyll-theme-chirpy/commit/49bb93cc0c89ad9cfaad5edcf9cb28c3d5134575))
@@ -171,7 +183,6 @@ All notable changes to this project will be documented in this file. See [standa
## [5.3.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.2.1...v5.3.0) (2022-09-23)
### Features
* add multiple authors to a post ([#677](https://github.com/cotes2020/jekyll-theme-chirpy/issues/677)) ([f1d9e99](https://github.com/cotes2020/jekyll-theme-chirpy/commit/f1d9e99bc02d3cd0a6b0cd1beac545f0cc7a24f8)), closes [#675](https://github.com/cotes2020/jekyll-theme-chirpy/issues/675)
@@ -180,7 +191,6 @@ All notable changes to this project will be documented in this file. See [standa
* **i18n:** add Hungarian locale file ([#597](https://github.com/cotes2020/jekyll-theme-chirpy/issues/597), [#598](https://github.com/cotes2020/jekyll-theme-chirpy/issues/598)) ([b032977](https://github.com/cotes2020/jekyll-theme-chirpy/commit/b0329775fc24d0323e5cc04cda46ece8b4531802))
* **i18n:** add Turkish language ([#631](https://github.com/cotes2020/jekyll-theme-chirpy/issues/631)) ([ad137fa](https://github.com/cotes2020/jekyll-theme-chirpy/commit/ad137fa2945b1870b9c1dd5e9212a5f4af7c3580))
### Bug Fixes
* add missing color to linkedin icon for share list ([#683](https://github.com/cotes2020/jekyll-theme-chirpy/issues/683)) ([0dcd39d](https://github.com/cotes2020/jekyll-theme-chirpy/commit/0dcd39d491c9c49e4acf7f75f83fe6e1d1839e37))
@@ -191,7 +201,6 @@ All notable changes to this project will be documented in this file. See [standa
## [5.2.1](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.2.0...v5.2.1) (2022-06-17)
### Bug Fixes
* exclude CHANGELOG from output ([971fe03](https://github.com/cotes2020/jekyll-theme-chirpy/commit/971fe03ec329ae49e7d60fe3af6101cfbd1acd6c))
@@ -199,7 +208,6 @@ All notable changes to this project will be documented in this file. See [standa
## [5.2.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v5.1.0...v5.2.0) (2022-06-09)
### Features
* add es-ES support to locales ([#533](https://github.com/cotes2020/jekyll-theme-chirpy/issues/533)) ([efe75ad](https://github.com/cotes2020/jekyll-theme-chirpy/commit/efe75adf2784956afb7a0b67f6634b146d9cb03b))
@@ -210,7 +218,6 @@ All notable changes to this project will be documented in this file. See [standa
* **PWA:** add Service Worker update notification ([d127183](https://github.com/cotes2020/jekyll-theme-chirpy/commit/d127183b9774f6321e409acdb66bf8a85d8814be))
* support showing description of preview image ([2bd6efa](https://github.com/cotes2020/jekyll-theme-chirpy/commit/2bd6efa95a174ac44e30a3af1e57e6f40d6e0e3a))
### Bug Fixes
* alt is not a valid attribute for 'a' tag ([58928db](https://github.com/cotes2020/jekyll-theme-chirpy/commit/58928dbc9068db4e4cda4371eeae1865920dce6a))
@@ -230,7 +237,6 @@ All notable changes to this project will be documented in this file. See [standa
* use `jsonify` to generate valid json ([#521](https://github.com/cotes2020/jekyll-theme-chirpy/issues/521)) ([dd9d5a7](https://github.com/cotes2020/jekyll-theme-chirpy/commit/dd9d5a7207b746342d07176d8969dc4f2c380bf2))
* when the `site.img_cdn` is set to the local path, the preview-image path loses the `baseurl` ([9cefe58](https://github.com/cotes2020/jekyll-theme-chirpy/commit/9cefe58993d9ea3a3a28424e7ffd8e0911567c5c))
### Improvements
* avoid post pageviews from shifting while loading ([135a16f](https://github.com/cotes2020/jekyll-theme-chirpy/commit/135a16f13ee783d9308669ff9a824847a73c951c))

View File

@@ -40,7 +40,6 @@
- Search
- Atom Feeds
- Google Analytics
- Page Views Reporting
- SEO & Performance Optimization
</p>

View File

@@ -54,10 +54,6 @@ google_site_verification: # fill in to your verification string
google_analytics:
id: # fill in your Google Analytics ID
# Google Analytics pageviews report settings
pv:
proxy_endpoint: # fill in the Google Analytics superProxy endpoint of Google App Engine
cache_path: # the local PV cache data, friendly to visitors from GFW region
# Prefer color scheme setting.
#

91
_data/locales/th.yml Normal file
View File

@@ -0,0 +1,91 @@
# The layout text of site
# ----- Commons label -----
layout:
post: โพสต์
category: หมวดหมู่
tag: แท็ก
# The tabs of sidebar
tabs:
# format: <filename_without_extension>: <value>
home: หน้าแรก
categories: หมวดหมู่
tags: แท็ก
archives: คลังเก็บ
about: เกี่ยวกับ
# the text displayed in the search bar & search results
search:
hint: ค้นหา
cancel: ยกเลิก
no_results: โอ๊ะ! ไม่พบผลลัพธ์
panel:
lastmod: อัปเดตล่าสุด
trending_tags: แท็กยอดนิยม
toc: เนื้อหา
copyright:
# Shown at the bottom of the post
license:
template: โพสต์นี้อยู่ภายใต้การอนุญาต :LICENSE_NAME โดยผู้เขียน
name: CC BY 4.0
link: https://creativecommons.org/licenses/by/4.0/
# Displayed in the footer
brief: สงวนลิขสิทธิ์เป็นบางส่วน
verbose: >-
เว้นแต่ว่าจะระบุเป็นอย่างอื่น โพสต์บนเว็บไซต์นี้อยู่ภายใต้
สัญญาอนุญาตครีเอทีฟคอมมอนส์แบบ 4.0 นานาชาติ (CC BY 4.0) โดยผู้เขียน
meta: กำลังใช้ธีมของ :PLATFORM ชื่อ :THEME
not_found:
statment: ขออภัย เราวาง URL นั้นไว้ผิดที่ หรือมันชี้ไปยังสิ่งที่ไม่มีอยู่
notification:
update_found: มีเวอร์ชันใหม่ของเนื้อหา
update: อัปเดต
# ----- Posts related labels -----
post:
written_by: โดย
posted: โพสต์เมื่อ
updated: อัปเดตเมื่อ
words: คำ
pageview_measure: ครั้ง
read_time:
unit: นาที
prompt: อ่าน
relate_posts: อ่านต่อ
share: แชร์
button:
next: ใหม่กว่า
previous: เก่ากว่า
copy_code:
succeed: คัดลอกแล้ว!
share_link:
title: คัดลอกลิงก์
succeed: คัดลอกลิงก์เรียบร้อยแล้ว!
# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
post:
strftime: "%b %e, %Y"
dayjs: "ll"
archives:
strftime: "%b"
dayjs: "MMM"
# categories page
categories:
category_measure:
singular: หมวดหมู่
plural: หมวดหมู่
post_measure:
singular: โพสต์
plural: โพสต์

View File

@@ -31,9 +31,6 @@ dayjs:
relativeTime: /assets/lib/dayjs/plugin/relativeTime.min.js
localizedFormat: /assets/lib/dayjs/plugin/localizedFormat.min.js
countup:
js: /assets/lib/countup.js/countUp.min.js
magnific-popup:
css: /assets/lib/magnific-popup/magnific-popup.css
js: /assets/lib/magnific-popup/jquery.magnific-popup.min.js

View File

@@ -11,7 +11,7 @@ cdns:
# fonts
webfonts: https://fonts.googleapis.com/css2?family=Lato&family=Source+Sans+Pro:wght@400;600;900&display=swap
webfonts: https://fonts.googleapis.com/css2?family=Lato&family=Source+Sans+Pro:wght@400;600;700;900&display=swap
# Libraries
@@ -42,9 +42,6 @@ dayjs:
relativeTime: https://cdn.jsdelivr.net/npm/dayjs@1.11.7/plugin/relativeTime.min.js
localizedFormat: https://cdn.jsdelivr.net/npm/dayjs@1.11.7/plugin/localizedFormat.min.js
countup:
js: https://cdn.jsdelivr.net/npm/countup.js@1.9.3/dist/countUp.min.js
magnific-popup:
css: https://cdn.jsdelivr.net/npm/magnific-popup@1.1.0/dist/magnific-popup.min.css
js: https://cdn.jsdelivr.net/npm/magnific-popup@1.1.0/dist/jquery.magnific-popup.min.js

View File

@@ -11,16 +11,6 @@
content="width=device-width, user-scalable=no initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
{% if page.layout == 'home' or page.layout == 'post' %}
{% if site.google_analytics.pv.proxy_endpoint %}
<meta name="pv-proxy-endpoint" content="{{ site.google_analytics.pv.proxy_endpoint }}">
{% endif %}
{% if site.google_analytics.pv.cache_path %}
<meta name="pv-cache-path" content="{{ site.google_analytics.pv.cache_path | relative_url }}">
{% endif %}
{% endif %}
{% capture seo_tags %}
{% seo title=false %}
{% endcapture %}
@@ -55,7 +45,7 @@
{{ site.title }}
</title>
{% include favicons.html %}
{% include_cached favicons.html %}
{% if site.resources.ignore_env != jekyll.environment and site.resources.self_hosted %}
<link href="{{ site.data.origin[type].webfonts | relative_url }}" rel="stylesheet">
@@ -76,17 +66,6 @@
<link rel="preconnect" href="https://www.googletagmanager.com" crossorigin="anonymous">
<link rel="dns-prefetch" href="https://www.googletagmanager.com">
{% if site.google_analytics.pv.proxy_endpoint %}
{% assign proxy_url = site.google_analytics.pv.proxy_endpoint
| replace: 'https://', ''
| split: '/'
| first
| prepend: 'https://'
%}
<link rel="preconnect" href="{{ proxy_url }}" crossorigin="use-credentials">
<link rel="dns-prefetch" href="{{ proxy_url }}">
{% endif %}
{% endif %}
<!-- Bootstrap -->

View File

@@ -11,13 +11,6 @@
<!-- layout specified -->
{% if page.layout == 'post' %}
{% if site.google_analytics.pv.proxy_endpoint or site.google_analytics.pv.cache_path %}
<!-- pv-report needs countup.js -->
{% assign urls = urls | append: ',' | append: site.data.origin[type].countup.js %}
{% endif %}
{% endif %}
{% if page.layout == 'post' or page.layout == 'page' or page.layout == 'home' %}
{% assign urls = urls | append: ',' | append: site.data.origin[type].lazysizes.js %}

View File

@@ -1,6 +1,6 @@
<!-- The paginator for post list on HomgPage. -->
<ul class="pagination align-items-center my-4 ps-lg-2">
<ul class="pagination align-items-center mt-4 mb-1 ps-lg-2">
<!-- left arrow -->
{% if paginator.previous_page %}
{% assign prev_url = paginator.previous_page_path | relative_url %}

View File

@@ -1,6 +1,4 @@
<!--
Refactor the HTML structure.
-->
<!-- Refactor the HTML structure -->
{% assign _content = include.content %}
@@ -44,9 +42,9 @@
{% endif %}
<!-- images -->
{% assign IMG_TAG = '<img ' %}
{% if _content contains '<img' %}
{% assign IMG_TAG = '<img ' %}
{% if _content contains IMG_TAG %}
{% assign _img_content = nil %}
{% assign _img_snippets = _content | split: IMG_TAG %}
@@ -160,7 +158,15 @@
<!-- Bypass the HTML-proofer test -->
{% assign _left = _left | append: ' data-proofer-ignore' %}
{% if page.layout == 'post' %}
{% if page.layout == 'home' %}
<!-- create the image wrapper -->
{%- capture _wrapper_start -%}
<div class="preview-img {{ _class | strip }}">
{%- endcapture -%}
{% assign _img_content = _img_content | append: _wrapper_start %}
{% assign _right = _right | prepend: '></div' %}
{% else %}
<!-- make sure the `<img>` is wrapped by `<a>` -->
{% assign _parent = _right | slice: 1, 4 %}
@@ -179,16 +185,6 @@
{% assign _img_content = _img_content | append: _wrapper_start %}
{% assign _right = _right | prepend: '></a' %}
{% endif %}
{% endif %}
{% if page.layout == 'home' %}
<!-- create the image wrapper -->
{%- capture _wrapper_start -%}
<div class="preview-img {{ _class | strip }}">
{%- endcapture -%}
{% assign _img_content = _img_content | append: _wrapper_start %}
{% assign _right = _right | prepend: '></div' %}
{% endif %}
<!-- combine -->

View File

@@ -3,7 +3,7 @@
<div id="search-result-wrapper" class="d-flex justify-content-center unloaded">
<div class="col-11 post-content">
<div id="search-hints">
{% include trending-tags.html %}
{% include_cached trending-tags.html %}
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>

View File

@@ -1,6 +1,4 @@
{% comment %}
Get the last 5 posts from lastmod list.
{% endcomment %}
<!-- Get the last 5 posts from lastmod list. -->
{% assign MAX_SIZE = 5 %}
@@ -26,12 +24,12 @@
{% if update_list.size > 0 %}
<div id="access-lastmod" class="post">
<div class="panel-heading">{{- site.data.locales[include.lang].panel.lastmod -}}</div>
<ul class="post-content ps-0 pb-1 ms-1 mt-2">
<ul class="post-content list-unstyled ps-0 pb-1 ms-1 mt-2">
{% for item in update_list %}
{% assign index = item | split: '::' | last | plus: 0 %}
{% assign post = site.posts[index] %}
{% assign url = post.url | relative_url %}
<li>
<li class="text-truncate lh-lg">
<a href="{{ url }}">{{ post.title }}</a>
</li>
{% endfor %}

View File

@@ -3,15 +3,18 @@
*/
export function back2top() {
$(window).on('scroll', () => {
if ($(window).scrollTop() > 50) {
$('#back-to-top').fadeIn();
const $window = $(window);
const $btn = $('#back-to-top');
$window.on('scroll', () => {
if ($window.scrollTop() > 50) {
$btn.fadeIn();
} else {
$('#back-to-top').fadeOut();
$btn.fadeOut();
}
});
$('#back-to-top').on('click', () => {
window.scrollTo(0, 0);
$btn.on('click', () => {
$window.scrollTop(0);
});
}

View File

@@ -2,14 +2,26 @@
* Set up image lazy-load
*/
function stopShimmer($node) {
$node.parent().removeClass('shimmer');
}
export function imgLazy() {
if ($('#core-wrapper img[data-src]') <= 0) {
const $images = $('#core-wrapper img[data-src]');
if ($images.length <= 0) {
return;
}
/* Stop shimmer when image loaded */
document.addEventListener('lazyloaded', function (e) {
const $img = $(e.target);
$img.parent().removeClass('shimmer');
stopShimmer($(e.target));
});
/* Stop shimmer from cached images */
$images.each(function () {
if ($(this).hasClass('ls-is-cached')) {
stopShimmer($(this));
}
});
}

View File

@@ -1,248 +0,0 @@
/**
* Count page views form GA or local cache file.
*
* Dependencies:
* - jQuery
* - countUp.js <https://github.com/inorganik/countUp.js>
*/
const getInitStatus = (function () {
let hasInit = false;
return () => {
let ret = hasInit;
if (!hasInit) {
hasInit = true;
}
return ret;
};
})();
const PvOpts = (function () {
function getContent(selector) {
return $(selector).attr('content');
}
function hasContent(selector) {
let content = getContent(selector);
return typeof content !== 'undefined' && content !== false;
}
return {
getProxyMeta() {
return getContent('meta[name=pv-proxy-endpoint]');
},
getLocalMeta() {
return getContent('meta[name=pv-cache-path]');
},
hasProxyMeta() {
return hasContent('meta[name=pv-proxy-endpoint]');
},
hasLocalMeta() {
return hasContent('meta[name=pv-cache-path]');
}
};
})();
const PvStorage = (function () {
const Keys = {
KEY_PV: 'pv',
KEY_PV_SRC: 'pv_src',
KEY_CREATION: 'pv_created_date'
};
const Source = {
LOCAL: 'same-origin',
PROXY: 'cors'
};
function get(key) {
return localStorage.getItem(key);
}
function set(key, val) {
localStorage.setItem(key, val);
}
function saveCache(pv, src) {
set(Keys.KEY_PV, pv);
set(Keys.KEY_PV_SRC, src);
set(Keys.KEY_CREATION, new Date().toJSON());
}
return {
keysCount() {
return Object.keys(Keys).length;
},
hasCache() {
return localStorage.getItem(Keys.KEY_PV) !== null;
},
getCache() {
return JSON.parse(localStorage.getItem(Keys.KEY_PV));
},
saveLocalCache(pv) {
saveCache(pv, Source.LOCAL);
},
saveProxyCache(pv) {
saveCache(pv, Source.PROXY);
},
isExpired() {
let date = new Date(get(Keys.KEY_CREATION));
date.setHours(date.getHours() + 1); // per hour
return Date.now() >= date.getTime();
},
isFromLocal() {
return get(Keys.KEY_PV_SRC) === Source.LOCAL;
},
isFromProxy() {
return get(Keys.KEY_PV_SRC) === Source.PROXY;
},
newerThan(pv) {
return (
PvStorage.getCache().totalsForAllResults['ga:pageviews'] >
pv.totalsForAllResults['ga:pageviews']
);
},
inspectKeys() {
if (localStorage.length !== PvStorage.keysCount()) {
localStorage.clear();
return;
}
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
switch (key) {
case Keys.KEY_PV:
case Keys.KEY_PV_SRC:
case Keys.KEY_CREATION:
break;
default:
localStorage.clear();
return;
}
}
}
};
})(); /* PvStorage */
function countUp(min, max, destId) {
if (min < max) {
let numAnim = new CountUp(destId, min, max);
if (!numAnim.error) {
numAnim.start();
} else {
console.error(numAnim.error);
}
}
}
function countPV(path, rows) {
let count = 0;
if (typeof rows !== 'undefined') {
for (let i = 0; i < rows.length; ++i) {
const gaPath = rows[parseInt(i, 10)][0];
if (gaPath === path) {
/* path format see: site.permalink */
count += parseInt(rows[parseInt(i, 10)][1], 10);
break;
}
}
}
return count;
}
function tacklePV(rows, path, elem, hasInit) {
let count = countPV(path, rows);
count = count === 0 ? 1 : count;
if (!hasInit) {
elem.text(new Intl.NumberFormat().format(count));
} else {
const initCount = parseInt(elem.text().replace(/,/g, ''), 10);
if (count > initCount) {
countUp(initCount, count, elem.attr('id'));
}
}
}
function displayPageviews(data) {
if (typeof data === 'undefined') {
return;
}
let hasInit = getInitStatus();
const rows = data.rows; /* could be undefined */
if ($('.post').length > 0) {
/* the post */
const path = window.location.pathname;
tacklePV(rows, path, $('#pv'), hasInit);
}
}
function fetchProxyPageviews() {
if (PvOpts.hasProxyMeta()) {
$.ajax({
type: 'GET',
url: PvOpts.getProxyMeta(),
dataType: 'jsonp',
success: (data) => {
displayPageviews(data);
PvStorage.saveProxyCache(JSON.stringify(data));
},
error: (jqXHR, textStatus, errorThrown) => {
console.log(
'Failed to load pageviews from proxy server: ' + errorThrown
);
}
});
}
}
function fetchLocalPageviews(hasCache = false) {
return fetch(PvOpts.getLocalMeta())
.then((response) => response.json())
.then((data) => {
if (hasCache) {
// The cache from the proxy will sometimes be more recent than the local one
if (PvStorage.isFromProxy() && PvStorage.newerThan(data)) {
return;
}
}
displayPageviews(data);
PvStorage.saveLocalCache(JSON.stringify(data));
});
}
export function initPageviews() {
if ($('.pageviews').length <= 0) {
return;
}
PvStorage.inspectKeys();
if (PvStorage.hasCache()) {
displayPageviews(PvStorage.getCache());
if (PvStorage.isExpired()) {
if (PvOpts.hasLocalMeta()) {
fetchLocalPageviews(true).then(fetchProxyPageviews);
} else {
fetchProxyPageviews();
}
} else {
if (PvStorage.isFromLocal()) {
fetchProxyPageviews();
}
}
} else {
// no cached
if (PvOpts.hasLocalMeta()) {
fetchLocalPageviews().then(fetchProxyPageviews);
} else {
fetchProxyPageviews();
}
}
}

View File

@@ -3,5 +3,4 @@ export { initClipboard } from './components/clipboard';
export { imgLazy } from './components/img-lazyload';
export { imgPopup } from './components/img-popup';
export { initLocaleDatetime } from './components/locale-datetime';
export { initPageviews } from './components/pageviews';
export { toc } from './components/toc';

View File

@@ -4,7 +4,6 @@ import {
imgPopup,
initLocaleDatetime,
initClipboard,
initPageviews,
toc
} from './modules/plugins';
@@ -16,4 +15,3 @@ imgPopup();
initLocaleDatetime();
initClipboard();
toc();
initPageviews();

View File

@@ -26,17 +26,17 @@ layout: compress
<div id="main" class="container px-xxl-5">
{% include topbar.html lang=lang %}
{{ content }}
{% include search-results.html lang=lang %}
{% include_cached search-results.html lang=lang %}
</div>
</div>
{% include footer.html lang=lang %}
{% include_cached footer.html lang=lang %}
<div id="mask"></div>
<a id="back-to-top" href="#" aria-label="back-to-top" class="btn btn-lg btn-box-shadow" role="button">
<button id="back-to-top" aria-label="back-to-top" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</a>
</button>
{% if site.pwa.enabled %}
<div
@@ -71,6 +71,6 @@ layout: compress
{% include mermaid.html %}
{% endif %}
{% include search-loader.html %}
{% include_cached search-loader.html %}
</body>
</html>

View File

@@ -48,7 +48,15 @@ refactor: true
{% if post.image.lqip %}
{% capture lqip %}lqip="{{ post.image.lqip }}"{% endcapture %}
{% endif %}
<img src="{{ post.image.path | default: post.image }}" w="15" h="8" {{ lqip }}>
{% assign src = post.image.path | default: post.image %}
{% unless src contains '//' %}
{% assign src = post.img_path | append: '/' | append: src | replace: '//', '/' %}
{% endunless %}
{% assign alt = post.image.alt | xml_escape | default: 'Preview Image' %}
<img src="{{ src }}" w="17" h="10" alt="{{ alt }}" {{ lqip }}>
{% endif %}
<div class="card-body d-flex flex-column">

View File

@@ -5,7 +5,11 @@ layout: default
{% include lang.html %}
{% include origin-type.html %}
<div class="row">
{% if layout.tail_includes %}
{% assign has_tail = true %}
{% endif %}
<div class="row{% unless has_tail %} mb-5{% endunless %}">
<!-- core -->
<div id="core-wrapper" class="col-12 col-lg-11 col-xl-9 pe-xl-4">
{% capture padding %}
@@ -40,8 +44,8 @@ layout: default
<!-- panel -->
<div id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
{% include update-list.html lang=lang %}
{% include trending-tags.html lang=lang %}
{% include_cached update-list.html lang=lang %}
{% include_cached trending-tags.html lang=lang %}
</div>
{% for _include in layout.panel_includes %}
@@ -52,7 +56,7 @@ layout: default
</div>
<!-- tail -->
{% if layout.tail_includes %}
{% if has_tail %}
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-3 pe-xl-4 mt-5">
{% for _include in layout.tail_includes %}

View File

@@ -31,7 +31,7 @@ tail_includes:
{% if page.image %}
{% capture src %}src="{{ page.image.path | default: page.image }}"{% endcapture %}
{% capture class %}class="preview-img{% if page.image.no_bg %}{{ ' no-bg' }}{% endif %}"{% endcapture %}
{% capture alt %}alt="{{ page.image.alt | default: "Preview Image" }}"{% endcapture %}
{% capture alt %}alt="{{ page.image.alt | xml_escape | default: "Preview Image" }}"{% endcapture %}
{% capture lqip %}
{% if page.image.lqip %}
@@ -71,16 +71,6 @@ tail_includes:
</span>
<div>
<!-- page views -->
{% if site.google_analytics.pv.proxy_endpoint or site.google_analytics.pv.cache_path %}
<span>
<em id="pv" class="pageviews">
<i class="fas fa-spinner fa-spin fa-fw"></i>
</em>
{{ site.data.locales[lang].post.pageview_measure }}
</span>
{% endif %}
<!-- read time -->
{% include read-time.html content=content prompt=true lang=lang %}
</div>

View File

@@ -5,6 +5,7 @@ date: 2019-08-09 20:55:00 +0800
categories: [Blogging, Tutorial]
tags: [getting started]
pin: true
img_path: '/posts/20180809'
---
## Prerequisites
@@ -113,7 +114,9 @@ There are a few things to get ready for.
Next, configure the _Pages_ service.
1. Browse to your repository on GitHub. Select the tab _Settings_, then click _Pages_ in the left navigation bar. Then, in the **Source** section (under _Build and deployment_), select [**GitHub Actions**][pages-workflow-src] from the dropdown menu.
1. Browse to your repository on GitHub. Select the tab _Settings_, then click _Pages_ in the left navigation bar. Then, in the **Source** section (under _Build and deployment_), select [**GitHub Actions**][pages-workflow-src] from the dropdown menu.
![Build source](pages-source-light.png){: .light .border .normal w='375' h='140' }
![Build source](pages-source-dark.png){: .dark .normal w='375' h='140' }
2. Push any commits to GitHub to trigger the _Actions_ workflow. In the _Actions_ tab of your repository, you should see the workflow _Build and Deploy_ running. Once the build is complete and successful, the site will be deployed automatically.

View File

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

View File

@@ -255,16 +255,6 @@ i {
}
#access-lastmod {
li {
height: 1.8rem;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
list-style: none;
}
a {
&:hover {
@extend %link-hover;
@@ -290,16 +280,6 @@ i {
margin-top: 0;
margin-bottom: 0;
}
/* [scroll-focus] added by `smooth-scroll.js` */
&:target:not([scroll-focus]),
&[scroll-focus='true'] > p {
background-color: var(--footnote-target-bg);
width: -moz-fit-content;
width: -webkit-fit-content;
width: fit-content;
transition: background-color 1.5s ease-in-out;
}
}
}
@@ -311,12 +291,6 @@ i {
border-bottom-style: none !important;
transition: background-color 1.5s ease-in-out;
}
/* [scroll-focus] added by `smooth-scroll.js` */
@at-root sup:target:not([scroll-focus]),
sup[scroll-focus='true'] > a#{&} {
background-color: var(--footnote-target-bg);
}
}
.reversefootnote {
@@ -414,10 +388,6 @@ i {
}
}
.pageviews .fa-spinner {
font-size: 80%;
}
.post-meta {
font-size: 0.85rem;
@@ -986,8 +956,9 @@ $btn-mb: 0.5rem;
/* 'Cancel' link */
#search-cancel {
color: var(--link-color);
margin-left: 1rem;
margin-left: 0.75rem;
display: none;
white-space: nowrap;
@extend %cursor-pointer;
}
@@ -1113,10 +1084,6 @@ $btn-mb: 0.5rem;
@extend %no-bottom-border;
}
}
@at-root .row:only-child > #{&} {
padding-bottom: 3rem;
}
}
#mask {
@@ -1246,10 +1213,6 @@ $btn-mb: 0.5rem;
}
#core-wrapper {
min-height: calc(
100vh - #{$topbar-height} - #{$footer-height-mobile}
) !important;
.post-content {
> blockquote[class^='prompt-'] {
@include ml-mr(-1.25rem);

View File

@@ -39,7 +39,7 @@
--sidebar-bg: #f6f8fa;
--sidebar-muted-color: #a2a19f;
--sidebar-active-color: #1d1d1d;
--sidebar-hover-bg: rgb(227, 227, 227, 0.64);
--sidebar-hover-bg: rgb(223, 233, 241, 0.64);
--sidebar-btn-bg: white;
--sidebar-btn-color: #8e8e8e;
--avatar-border-color: white;

View File

@@ -1,5 +1,5 @@
/*!
* Chirpy v6.0.0 (https://github.com/cotes2020/jekyll-theme-chirpy)
* Chirpy v6.1.0 (https://github.com/cotes2020/jekyll-theme-chirpy)
* © 2019 Cotes Chung
* MIT Licensed
*/

View File

@@ -5,10 +5,6 @@
#post-list {
margin-top: 2rem;
&:only-child {
margin-bottom: 3.75rem;
}
a.card-wrapper {
display: block;
@@ -152,7 +148,7 @@
.card {
.preview-img {
width: 20rem;
height: 11.5rem; // can hold 2 lines each for title and content
height: 11.55rem; // can hold 2 lines each for title and content
}
.card-body {

View File

@@ -47,8 +47,4 @@ const allowedDomains = [
];
/* Requests that include the following path will be banned */
const denyUrls = [
{% if site.google_analytics.pv.cache_path %}
'{{ site.google_analytics.pv.cache_path | absolute_url }}'
{% endif %}
];
const denyUrls = [];

View File

@@ -2,7 +2,7 @@
Gem::Specification.new do |spec|
spec.name = "jekyll-theme-chirpy"
spec.version = "6.0.0"
spec.version = "6.1.0"
spec.authors = ["Cotes Chung"]
spec.email = ["cotes.chung@gmail.com"]
@@ -31,5 +31,6 @@ Gem::Specification.new do |spec|
spec.add_runtime_dependency "jekyll-seo-tag", "~> 2.7"
spec.add_runtime_dependency "jekyll-archives", "~> 2.2"
spec.add_runtime_dependency "jekyll-sitemap", "~> 1.4"
spec.add_runtime_dependency "jekyll-include-cache", "~> 0.2"
end

View File

@@ -1,6 +1,6 @@
{
"name": "jekyll-theme-chirpy",
"version": "6.0.0",
"version": "6.1.0",
"description": "A minimal, responsive and feature-rich Jekyll theme for technical writing.",
"repository": {
"type": "git",
@@ -26,10 +26,10 @@
"@babel/preset-env": "^7.20.2",
"@rollup/plugin-babel": "^6.0.3",
"@rollup/plugin-terser": "^0.4.0",
"rimraf": "^4.4.1",
"rimraf": "^5.0.1",
"rollup": "^3.20.2",
"rollup-plugin-license": "^3.0.1",
"stylelint": "^15.3.0",
"stylelint-config-standard-scss": "^7.0.1"
"stylelint-config-standard-scss": "^9.0.0"
}
}

View File

@@ -17,7 +17,7 @@ _no_gh=false
help() {
echo "Usage:"
echo
echo " bash /path/to/init.sh [options]"
echo " bash /path/to/init [options]"
echo
echo "Options:"
echo " --no-gh Do not deploy to Github."

View File

@@ -48,7 +48,7 @@ help() {
echo
echo "Usage:"
echo
echo " bash ./tools/release.sh [options]"
echo " bash ./tools/release [options]"
echo
echo "Options:"
echo " -k, --skip-versioning Skip the step of generating the version number."
@@ -164,15 +164,14 @@ build_gem() {
release() {
_version="$1" # X.Y.Z
git checkout "$PROD_BRANCH"
git merge --no-ff --no-edit "$working_branch"
# Create a new tag on working branch
echo -e "Create tag v$_version\n"
git tag "v$_version"
git checkout "$PROD_BRANCH"
git merge --no-ff --no-edit "$working_branch"
# merge from patch branch to the staging branch
# NOTE: This may break due to merge conflicts, so it may need to be resolved manually.
# Merge from patch branch to the staging branch
if [[ $working_branch == hotfix/* ]]; then
git checkout "$STAGING_BRANCH"
git merge --no-ff --no-edit "$working_branch"
@@ -194,6 +193,8 @@ main() {
# Change heading of Patch version to level 2 (a bug from `standard-version`)
sed -i "s/^### \[/## \[/g" CHANGELOG.md
# Replace multiple empty lines with a single empty line
sed -i "/^$/N;/^\n$/D" CHANGELOG.md
_version="$(grep '"version":' "$NODE_CONFIG" | sed 's/.*: "//;s/".*//')"

View File

@@ -19,7 +19,7 @@ help() {
echo
echo "Usage:"
echo
echo " bash ./tools/test.sh [options]"
echo " bash ./tools/test [options]"
echo
echo "Options:"
echo ' -c, --config "<config_a[,config_b[...]]>" Specify config file(s)'