diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..39c428df --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,29 @@ +{ + "name": "Jekyll", + "image": "mcr.microsoft.com/devcontainers/jekyll:2-bullseye", + "onCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}", + "postCreateCommand": "bash .devcontainer/post-create.sh", + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.defaultProfile.linux": "zsh" + }, + "extensions": [ + // Liquid tags auto-complete + "killalau.vscode-liquid-snippets", + // Liquid syntax highlighting and formatting + "Shopify.theme-check-vscode", + // Shell + "timonwong.shellcheck", + "mkhl.shfmt", + // Common formatter + "EditorConfig.EditorConfig", + "esbenp.prettier-vscode", + "stylelint.vscode-stylelint", + "yzhang.markdown-all-in-one", + // Git + "mhutchie.git-graph" + ] + } + } +} diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh new file mode 100644 index 00000000..a4bc2825 --- /dev/null +++ b/.devcontainer/post-create.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +if [ -f package.json ]; then + bash -i -c "nvm install --lts && nvm install-latest-npm" + npm i + npm run build +fi + +# Install dependencies for shfmt extension +curl -sS https://webi.sh/shfmt | sh &>/dev/null + +# Add OMZ plugins +git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting +git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions +sed -i -E "s/^(plugins=\()(git)(\))/\1\2 zsh-syntax-highlighting zsh-autosuggestions\3/" ~/.zshrc + +# Avoid git log use less +echo -e "\nunset LESS" >>~/.zshrc diff --git a/.editorconfig b/.editorconfig index cdded464..2b740bfd 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,10 +2,18 @@ root = true [*] charset = utf-8 -# 2 space indentation indent_style = space indent_size = 2 trim_trailing_whitespace = true # Unix-style newlines with a newline ending every file end_of_line = lf insert_final_newline = true + +[*.{js,css,scss}] +quote_type = single + +[*.{yml,yaml}] +quote_type = double + +[*.md] +trim_trailing_whitespace = false diff --git a/.github/workflows/pages-deploy.yml b/.github/workflows/pages-deploy.yml index 1c1fc8c9..cc28f99f 100644 --- a/.github/workflows/pages-deploy.yml +++ b/.github/workflows/pages-deploy.yml @@ -28,7 +28,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 # submodules: true @@ -37,12 +37,12 @@ jobs: - name: Setup Pages id: pages - uses: actions/configure-pages@v1 + uses: actions/configure-pages@v4 - name: Setup Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: '3.0' # reads from a '.ruby-version' or '.tools-version' file if 'ruby-version' is omitted + ruby-version: 3.3 bundler-cache: true - name: Build site @@ -52,10 +52,12 @@ jobs: - name: Test site run: | - bundle exec htmlproofer _site --disable-external --check-html --allow_hash_href + bundle exec htmlproofer _site \ + \-\-disable-external \ + \-\-ignore-urls "/^http:\/\/127.0.0.1/,/^http:\/\/0.0.0.0/,/^http:\/\/localhost/" - name: Upload site artifact - uses: actions/upload-pages-artifact@v1 + uses: actions/upload-pages-artifact@v3 with: path: "_site${{ steps.pages.outputs.base_path }}" @@ -68,4 +70,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v1 \ No newline at end of file + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 3a9a8a6a..42001047 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,31 @@ +# Bundler cache +.bundle +vendor +Gemfile.lock + +# Jekyll cache +.jekyll-cache +.jekyll-metadata +_site + +# RubyGems +*.gem + +# NPM dependencies +node_modules +package-lock.json + +# IDE configurations +.idea +.vscode/* +!.vscode/settings.json +!.vscode/extensions.json +!.vscode/tasks.json + +# Misc +_sass/dist +assets/js/dist + # hidden files .* !.git* diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..082bc94c --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["ms-vscode-remote.remote-containers"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..5e8a04f3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,30 @@ +{ + // Prettier + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + // Shopify Liquid + "files.associations": { + "*.html": "liquid" + }, + "[markdown]": { + "editor.defaultFormatter": "yzhang.markdown-all-in-one" + }, + // Formatter + "[html][liquid]": { + "editor.defaultFormatter": "Shopify.theme-check-vscode" + }, + "[shellscript]": { + "editor.defaultFormatter": "mkhl.shfmt" + }, + // Disable vscode built-in stylelint + "css.validate": false, + "scss.validate": false, + "less.validate": false, + // Stylint extension settings + "stylelint.snippet": ["css", "scss"], + "stylelint.validate": ["css", "scss"], + // Run tasks in macOS + "terminal.integrated.profiles.osx": { + "zsh": { "path": "/bin/zsh", "args": ["-l", "-i"] } + } +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..7f0fdb8e --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,26 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Run Jekyll Server", + "type": "shell", + "command": "./tools/run.sh", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "detail": "Runs the Jekyll server with live reload." + }, + { + "label": "Build Jekyll Site", + "type": "shell", + "command": "./tools/test.sh", + "group": { + "kind": "build" + }, + "problemMatcher": [], + "detail": "Build the Jekyll site for production." + } + ] +} diff --git a/Gemfile b/Gemfile index d7a28260..dbd38721 100644 --- a/Gemfile +++ b/Gemfile @@ -2,27 +2,13 @@ source "https://rubygems.org" -gem "jekyll-theme-chirpy", "~> 5.5", ">= 5.5.2" +gem "jekyll-theme-chirpy", "~> 7.1", ">= 7.1.1" -group :test do - gem "html-proofer", "~> 3.18" -end +gem "html-proofer", "~> 5.0", group: :test -# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem -# and associated library. platforms :mingw, :x64_mingw, :mswin, :jruby do gem "tzinfo", ">= 1", "< 3" gem "tzinfo-data" end -# Performance-booster for watching directories on Windows gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin] - -# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem -# do not have a Java counterpart. -gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby] - -# Lock jekyll-sass-converter to 2.x on Linux-musl -if RUBY_PLATFORM =~ /linux-musl/ - gem "jekyll-sass-converter", "~> 2.0" -end \ No newline at end of file diff --git a/README.md b/README.md index c1b0375c..793cd084 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,37 @@ -# Chirpy Starter [![Gem Version](https://img.shields.io/gem/v/jekyll-theme-chirpy)](https://rubygems.org/gems/jekyll-theme-chirpy) [![GitHub license](https://img.shields.io/github/license/cotes2020/chirpy-starter.svg?color=blue)][mit] +# Chirpy Starter -When installing the [**Chirpy**][chirpy] theme through [RubyGems.org][gem], Jekyll can only read files in the folders `_includes`, `_layout`, `_sass` and `assets`, as well as a small part of options of the `_config.yml` file from the theme's gem. If you have ever installed this theme gem, you can use the command `bundle info --path jekyll-theme-chirpy` to locate these files. +[![Gem Version](https://img.shields.io/gem/v/jekyll-theme-chirpy)][gem]  +[![GitHub license](https://img.shields.io/github/license/cotes2020/chirpy-starter.svg?color=blue)][mit] -The Jekyll organization claims that this is to leave the ball in the user’s court, but this also results in users not being able to enjoy the out-of-the-box experience when using feature-rich themes. +When installing the [**Chirpy**][chirpy] theme through [RubyGems.org][gem], Jekyll can only read files in the folders +`_data`, `_layouts`, `_includes`, `_sass` and `assets`, as well as a small part of options of the `_config.yml` file +from the theme's gem. If you have ever installed this theme gem, you can use the command +`bundle info --path jekyll-theme-chirpy` to locate these files. -To fully use all the features of **Chirpy**, you need to copy the other critical files from the theme's gem to your Jekyll site. The following is a list of targets: +The Jekyll team claims that this is to leave the ball in the user’s court, but this also results in users not being +able to enjoy the out-of-the-box experience when using feature-rich themes. + +To fully use all the features of **Chirpy**, you need to copy the other critical files from the theme's gem to your +Jekyll site. The following is a list of targets: ```shell . ├── _config.yml -├── _data ├── _plugins ├── _tabs └── index.html ``` -In order to save your time, and to prevent you from missing some files when copying, we extract those files/configurations of the latest version of the **Chirpy** theme and the [CD][CD] workflow to here, so that you can start writing in minutes. - -## Prerequisites - -Follow the instructions in the [Jekyll Docs](https://jekyllrb.com/docs/installation/) to complete the installation of `Ruby`, `RubyGems`, `Jekyll` and `Bundler`. - -## Installation - -[**Use this template**][use-template] to generate a brand new repository and name it `.github.io`, where `GH_USERNAME` represents your GitHub username. +To save you time, and also in case you lose some files while copying, we extract those files/configurations of the +latest version of the **Chirpy** theme and the [CD][CD] workflow to here, so that you can start writing in minutes. -Then clone it to your local machine and run: +## Usage -``` -$ bundle -``` +Check out the [theme's docs](https://github.com/cotes2020/jekyll-theme-chirpy/wiki). -## Usage +## Contributing -Please see the [theme's docs](https://github.com/cotes2020/jekyll-theme-chirpy#documentation). +This repository is automatically updated with new releases from the theme repository. If you encounter any issues or want to contribute to its improvement, please visit the [theme repository][chirpy] to provide feedback. ## License @@ -41,6 +39,5 @@ This work is published under [MIT][mit] License. [gem]: https://rubygems.org/gems/jekyll-theme-chirpy [chirpy]: https://github.com/cotes2020/jekyll-theme-chirpy/ -[use-template]: https://github.com/cotes2020/chirpy-starter/generate [CD]: https://en.wikipedia.org/wiki/Continuous_deployment [mit]: https://github.com/cotes2020/chirpy-starter/blob/master/LICENSE diff --git a/_config.yml b/_config.yml index 588ad491..c5e21745 100644 --- a/_config.yml +++ b/_config.yml @@ -3,39 +3,33 @@ # Import the theme theme: jekyll-theme-chirpy -# Change the following value to '/PROJECT_NAME' ONLY IF your site type is GitHub Pages Project sites -# and doesn't have a custom domain. -baseurl: '' - # The language of the webpage › http://www.lingoes.net/en/translator/langcode.htm # If it has the same name as one of the files in folder `_data/locales`, the layout language will also be changed, # otherwise, the layout language will use the default value of 'en'. lang: en -# Additional parameters for datetime localization, optional. › https://github.com/iamkun/dayjs/tree/dev/src/locale -prefer_datetime_locale: - -# Change to your timezone › http://www.timezoneconverter.com/cgi-bin/findzone/findzone +# Change to your timezone › https://kevinnovak.github.io/Time-Zone-Picker timezone: # jekyll-seo-tag settings › https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md # ↓ -------------------------- -title: Tony Lambert # the main title +title: Tony Lambert # the main title -tagline: An educator that does security things # it will display as the sub-title +tagline: An educator that does security things # it will display as the subtitle -description: >- # used by seo meta and the atom feed +description: >- # used by seo meta and the atom feed Tony's blog about malware analysis and other security topics -# fill in the protocol & hostname for your site, e.g., 'https://username.github.io' -url: 'https://forensicitguy.github.io' +# Fill in the protocol & hostname for your site. +# E.g. 'https://username.github.io', note that it does not end with a '/'. +url: "https://forensicitguy.github.io" github: - username: ForensicITGuy # change to your github username + username: ForensicITGuy # change to your GitHub username twitter: - username: ForensicITGuy # change to your twitter username + username: ForensicITGuy # change to your Twitter username social: # Change to your full name. @@ -43,22 +37,44 @@ social: name: Tony Lambert links: # The first element serves as the copyright owner's link - - https://twitter.com/ForensicITGuy # change to your twitter homepage - - https://github.com/ForensicITGuy # change to your github homepage + - https://twitter.com/ForensicITGuy # change to your Twitter homepage + - https://github.com/ForensicITGuy # change to your GitHub homepage # Uncomment below to add more social links - - https://www.linkedin.com/in/tonymlambert - -google_site_verification: # fill in to your verification string + # - https://www.facebook.com/username + - https://www.linkedin.com/in/tonymlambert/ + +# Site Verification Settings +webmaster_verifications: + google: # fill in your Google verification code + bing: # fill in your Bing verification code + alexa: # fill in your Alexa verification code + yandex: # fill in your Yandex verification code + baidu: # fill in your Baidu verification code + facebook: # fill in your Facebook verification code # ↑ -------------------------- # The end of `jekyll-seo-tag` settings -google_analytics: - id: 'G-THRVSJGH6S' # 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 +# Web Analytics Settings +analytics: + google: + id: "G-THRVSJGH6S" # fill in your Google Analytics ID + goatcounter: + id: # fill in your GoatCounter ID + umami: + id: # fill in your Umami ID + domain: # fill in your Umami domain + matomo: + id: # fill in your Matomo ID + domain: # fill in your Matomo domain + cloudflare: + id: # fill in your Cloudflare Web Analytics token + fathom: + id: # fill in your Fathom Site ID + +# Page views settings +pageviews: + provider: # now only supports 'goatcounter' # Prefer color scheme setting. # @@ -68,51 +84,79 @@ google_analytics: # # Available options: # -# light - Use the light color scheme -# dark - Use the dark color scheme +# light — Use the light color scheme +# dark — Use the dark color scheme # -theme_mode: # [light|dark] +theme_mode: # [light | dark] + +# The CDN endpoint for media resources. +# Notice that once it is assigned, the CDN url +# will be added to all media resources (site avatar, posts' images, audio and video files) paths starting with '/' +# +# e.g. 'https://cdn.com' +cdn: # the avatar on sidebar, support local or CORS resources avatar: /assets/images/avatar.jpg -# boolean type, the global switch for ToC in posts. +# The URL of the site-wide social preview image used in SEO `og:image` meta tag. +# It can be overridden by a customized `page.image` in front matter. +social_preview_image: # string, local or CORS resources + +# boolean type, the global switch for TOC in posts. toc: true comments: - active: # The global switch for posts comments, e.g., 'disqus'. Keep it empty means disable - # The active options are as follows: + # Global switch for the post-comment system. Keeping it empty means disabled. + provider: # [disqus | utterances | giscus] + # The provider options are as follows: disqus: - shortname: # fill with the Disqus shortname. › https://help.disqus.com/en/articles/1717111-what-s-a-shortname + shortname: # fill with the Disqus shortname. › https://help.disqus.com/en/articles/1717111-what-s-a-shortname # utterances settings › https://utteranc.es/ utterances: - repo: # / - issue_term: # < url | pathname | title | ...> + repo: # / + issue_term: # < url | pathname | title | ...> # Giscus options › https://giscus.app giscus: - repo: # / + repo: # / repo_id: category: category_id: - mapping: # optional, default to 'pathname' - input_position: # optional, default to 'bottom' - lang: # optional, default to the value of `site.lang` + mapping: # optional, default to 'pathname' + strict: # optional, default to '0' + input_position: # optional, default to 'bottom' + lang: # optional, default to the value of `site.lang` + reactions_enabled: # optional, default to the value of `1` # Self-hosted static assets, optional › https://github.com/cotes2020/chirpy-static-assets assets: self_host: - enabled: # boolean, keep empty means false + enabled: # boolean, keep empty means false # specify the Jekyll environment, empty means both # only works if `assets.self_host.enabled` is 'true' - env: # [development|production] + env: # [development | production] + +pwa: + enabled: true # The option for PWA feature (installable) + cache: + enabled: true # The option for PWA offline cache + # Paths defined here will be excluded from the PWA cache. + # Usually its value is the `baseurl` of another website that + # shares the same domain name as the current website. + deny_paths: + # - "/example" # URLs match `/example/*` will not be cached by the PWA paginate: 10 +# The base URL of your site +baseurl: "" + # ------------ The following options are not recommended to be modified ------------------ kramdown: + footnote_backlink: "↩︎" syntax_highlighter: rouge - syntax_highlighter_opts: # Rouge Options › https://github.com/jneen/rouge#full-options + syntax_highlighter_opts: # Rouge Options › https://github.com/jneen/rouge#full-options css_class: highlight # default_lang: console span: @@ -128,12 +172,12 @@ collections: defaults: - scope: - path: '' # An empty string here means all files in the project + path: "" # An empty string here means all files in the project type: posts values: layout: post - comments: true # Enable comments in posts. - toc: true # Display TOC column in posts. + comments: true # Enable comments in posts. + toc: true # Display TOC column in posts. # DO NOT modify the following parameter unless you are confident enough # to update the code of all other post links in this project. permalink: /posts/:title/ @@ -142,19 +186,11 @@ defaults: values: comments: false - scope: - path: '' - type: tabs # see `site.collections` + path: "" + type: tabs # see `site.collections` values: layout: page permalink: /:title/ - - scope: - path: /assets/img/favicons - values: - swcache: true - - scope: - path: /assets/js/dist - values: - swcache: true sass: style: compressed @@ -169,13 +205,13 @@ compress_html: envs: [development] exclude: - - '*.gem' - - '*.gemspec' + - "*.gem" + - "*.gemspec" + - docs - tools - README.md - LICENSE - - gulpfile.js - - node_modules + - "*.config.js" - package*.json jekyll-archives: diff --git a/_data/contact.yml b/_data/contact.yml index 95aac494..6df4bf9a 100644 --- a/_data/contact.yml +++ b/_data/contact.yml @@ -1,28 +1,45 @@ # The contact options. -- - type: github - icon: 'fab fa-github' -- - type: twitter - icon: 'fab fa-twitter' -- - type: rss - icon: 'fas fa-rss' +- type: github + icon: "fab fa-github" + +- type: twitter + icon: "fa-brands fa-x-twitter" + +- type: email + icon: "fas fa-envelope" + noblank: true # open link in current tab + +- type: rss + icon: "fas fa-rss" noblank: true -- - type: ko-fi - icon: 'fas fa-mug-hot' - url: 'https://ko-fi.com/forensicitguy' -- - type: mastodon - icon: 'fab fa-mastodon' # icons powered by - url: 'https://infosec.exchange/web/@ForensicITGuy' # Fill with your mastodon account page -- - type: linkedin - icon: 'fab fa-linkedin' # icons powered by - url: 'https://www.linkedin.com/in/tonymlambert/' # Fill with your Linkedin homepage -# - -# type: stack-overflow + +- type: ko-fi + icon: "fas fa-mug-hot" + url: "https://ko-fi.com/forensicitguy" +# Uncomment and complete the url below to enable more contact options +# +- type: mastodon + icon: 'fab fa-mastodon' # icons powered by + url: 'https://infosec.exchange/web/@ForensicITGuy' # Fill with your Mastodon account page, rel="me" will be applied for verification + +- type: linkedin + icon: 'fab fa-linkedin' # icons powered by + url: 'https://www.linkedin.com/in/tonymlambert/' # Fill with your Linkedin homepage + +# - type: stack-overflow # icon: 'fab fa-stack-overflow' # url: '' # Fill with your stackoverflow homepage +# +# - type: bluesky +# icon: 'fa-brands fa-bluesky' +# url: '' # Fill with your Bluesky profile link +# +# - type: reddit +# icon: 'fa-brands fa-reddit' +# url: '' # Fill with your Reddit profile link +# +# - type: threads +# icon: 'fa-brands fa-threads' +# url: '' # Fill with your Threads profile link +# The contact options. diff --git a/_data/share.yml b/_data/share.yml index 55feb593..7cdea115 100644 --- a/_data/share.yml +++ b/_data/share.yml @@ -2,26 +2,49 @@ # Icons from platforms: - - - type: Twitter - icon: "fab fa-twitter" + - type: Twitter + icon: "fa-brands fa-square-x-twitter" link: "https://twitter.com/intent/tweet?text=TITLE&url=URL" - - - type: Facebook + + - type: Facebook icon: "fab fa-facebook-square" link: "https://www.facebook.com/sharer/sharer.php?title=TITLE&u=URL" - - - type: Telegram + + - type: Telegram icon: "fab fa-telegram" link: "https://t.me/share/url?url=URL&text=TITLE" # Uncomment below if you need to. - - - type: Linkedin + # + - type: Linkedin icon: "fab fa-linkedin" link: "https://www.linkedin.com/sharing/share-offsite/?url=URL" # - # - - # type: Weibo + # - type: Weibo # icon: "fab fa-weibo" - # link: "http://service.weibo.com/share/share.php?title=TITLE&url=URL" + # link: "https://service.weibo.com/share/share.php?title=TITLE&url=URL" + # + - type: Mastodon + icon: "fa-brands fa-mastodon" + # See: https://github.com/justinribeiro/share-to-mastodon#properties + instances: + - label: mastodon.social + link: "https://mastodon.social/" + - label: mastodon.online + link: "https://mastodon.online/" + - label: fosstodon.org + link: "https://fosstodon.org/" + - label: infosec.exchange + link: "https://infosec.exchange/" + # + # - type: Bluesky + # icon: "fa-brands fa-bluesky" + # link: "https://bsky.app/intent/compose?text=TITLE%20URL" + # + - type: Reddit + icon: "fa-brands fa-square-reddit" + link: "https://www.reddit.com/submit?url=URL&title=TITLE" + # + # - type: Threads + # icon: "fa-brands fa-square-threads" + # link: "https://www.threads.net/intent/post?text=TITLE%20URL" diff --git a/_posts/.placeholder b/_posts/.placeholder new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/_posts/.placeholder @@ -0,0 +1 @@ + diff --git a/assets/lib b/assets/lib new file mode 160000 index 00000000..a231bc7e --- /dev/null +++ b/assets/lib @@ -0,0 +1 @@ +Subproject commit a231bc7e2c67198e604950cb2be9147a0b2020c0 diff --git a/tools/run.sh b/tools/run.sh new file mode 100755 index 00000000..0efc452d --- /dev/null +++ b/tools/run.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# +# Run jekyll serve and then launch the site + +prod=false +command="bundle exec jekyll s -l" +host="127.0.0.1" + +help() { + echo "Usage:" + echo + echo " bash /path/to/run [options]" + echo + echo "Options:" + echo " -H, --host [HOST] Host to bind to." + echo " -p, --production Run Jekyll in 'production' mode." + echo " -h, --help Print this help information." +} + +while (($#)); do + opt="$1" + case $opt in + -H | --host) + host="$2" + shift 2 + ;; + -p | --production) + prod=true + shift + ;; + -h | --help) + help + exit 0 + ;; + *) + echo -e "> Unknown option: '$opt'\n" + help + exit 1 + ;; + esac +done + +command="$command -H $host" + +if $prod; then + command="JEKYLL_ENV=production $command" +fi + +if [ -e /proc/1/cgroup ] && grep -q docker /proc/1/cgroup; then + command="$command --force_polling" +fi + +echo -e "\n> $command\n" +eval "$command" diff --git a/tools/test.sh b/tools/test.sh new file mode 100755 index 00000000..331de1c3 --- /dev/null +++ b/tools/test.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +# +# Build and test the site content +# +# Requirement: html-proofer, jekyll +# +# Usage: See help information + +set -eu + +SITE_DIR="_site" + +_config="_config.yml" + +_baseurl="" + +help() { + echo "Build and test the site content" + echo + echo "Usage:" + echo + echo " bash $0 [options]" + echo + echo "Options:" + echo ' -c, --config "" Specify config file(s)' + echo " -h, --help Print this information." +} + +read_baseurl() { + if [[ $_config == *","* ]]; then + # multiple config + IFS="," + read -ra config_array <<<"$_config" + + # reverse loop the config files + for ((i = ${#config_array[@]} - 1; i >= 0; i--)); do + _tmp_baseurl="$(grep '^baseurl:' "${config_array[i]}" | sed "s/.*: *//;s/['\"]//g;s/#.*//")" + + if [[ -n $_tmp_baseurl ]]; then + _baseurl="$_tmp_baseurl" + break + fi + done + + else + # single config + _baseurl="$(grep '^baseurl:' "$_config" | sed "s/.*: *//;s/['\"]//g;s/#.*//")" + fi +} + +main() { + # clean up + if [[ -d $SITE_DIR ]]; then + rm -rf "$SITE_DIR" + fi + + read_baseurl + + # build + JEKYLL_ENV=production bundle exec jekyll b \ + -d "$SITE_DIR$_baseurl" -c "$_config" + + # test + bundle exec htmlproofer "$SITE_DIR" \ + --disable-external \ + --ignore-urls "/^http:\/\/127.0.0.1/,/^http:\/\/0.0.0.0/,/^http:\/\/localhost/" +} + +while (($#)); do + opt="$1" + case $opt in + -c | --config) + _config="$2" + shift + shift + ;; + -h | --help) + help + exit 0 + ;; + *) + # unknown option + help + exit 1 + ;; + esac +done + +main