mirror of
https://github.com/gethinode/hinode.git
synced 2025-10-14 05:23:15 +00:00
Compare commits
136 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
17973c1090 | ||
![]() |
28b5bd8c58 | ||
![]() |
62f94369c9 | ||
![]() |
c9fc53a546 | ||
![]() |
946f8ca938 | ||
![]() |
ffbeb3ede7 | ||
![]() |
6dd4678339 | ||
![]() |
82090571d6 | ||
![]() |
63bfe64e71 | ||
![]() |
5121f92870 | ||
![]() |
1b95b3a265 | ||
![]() |
e8d926eca8 | ||
![]() |
2076081405 | ||
![]() |
da5b898250 | ||
![]() |
cf2f806820 | ||
![]() |
3ebbea542b | ||
![]() |
cce963aaba | ||
![]() |
4e6156cae0 | ||
![]() |
457f122861 | ||
![]() |
d94b54b90f | ||
![]() |
834ac4744b | ||
![]() |
2716af78be | ||
![]() |
3d37a93336 | ||
![]() |
1d976cb7df | ||
![]() |
4e2a5a39e9 | ||
![]() |
63ef832ab4 | ||
![]() |
f480dfa6b4 | ||
![]() |
bd85cabce9 | ||
![]() |
76a5408bda | ||
![]() |
61537afb93 | ||
![]() |
12417340f2 | ||
![]() |
b7533957b2 | ||
![]() |
15512c9448 | ||
![]() |
f69efa7ec8 | ||
![]() |
f3c392760a | ||
![]() |
d59e6ea87b | ||
![]() |
476d36d41c | ||
![]() |
0ccc0c64f4 | ||
![]() |
c5b4db6141 | ||
![]() |
6d0f917a0e | ||
![]() |
497dbe6bce | ||
![]() |
1da8133e09 | ||
![]() |
b3354a35ad | ||
![]() |
827fe5b5e1 | ||
![]() |
fc98b2d768 | ||
![]() |
dd5c6886cd | ||
![]() |
72f6f5d260 | ||
![]() |
d54fd6abf8 | ||
![]() |
5c75a78a3d | ||
![]() |
653c2b9d4b | ||
![]() |
dba91ad560 | ||
![]() |
108672e9a1 | ||
![]() |
18499d12c5 | ||
![]() |
79e97f0b5b | ||
![]() |
dba7ad3e09 | ||
![]() |
d260ada9ec | ||
![]() |
1503937c48 | ||
![]() |
585f4d7c5c | ||
![]() |
b125085315 | ||
![]() |
ee605fb4eb | ||
![]() |
2e14d200ed | ||
![]() |
de28b1b2e3 | ||
![]() |
467815e8d5 | ||
![]() |
98687a0ec1 | ||
![]() |
bc92818c53 | ||
![]() |
3fd6806549 | ||
![]() |
3f76ed2f59 | ||
![]() |
c4b9f91376 | ||
![]() |
c797a2f7a8 | ||
![]() |
c23ceafddd | ||
![]() |
e0b1b0250c | ||
![]() |
ce54758f36 | ||
![]() |
a80efa9578 | ||
![]() |
04bad29146 | ||
![]() |
8816c0c40e | ||
![]() |
b6c9ce4a9f | ||
![]() |
c8d16104d5 | ||
![]() |
215d125032 | ||
![]() |
ccdf4ab391 | ||
![]() |
8bd7d68d2e | ||
![]() |
03f1df615e | ||
![]() |
86ee2d3d2f | ||
![]() |
9c608b0583 | ||
![]() |
bdc84fb36d | ||
![]() |
4dda37ad3d | ||
![]() |
7559010b83 | ||
![]() |
75644ae046 | ||
![]() |
994ffe5ab5 | ||
![]() |
1dc016a6f8 | ||
![]() |
44e3b31c67 | ||
![]() |
3cbfd60098 | ||
![]() |
fc0715aa97 | ||
![]() |
84fff0fe8b | ||
![]() |
153ef9bf1f | ||
![]() |
bbe8f3a32c | ||
![]() |
eb7c9b5c3c | ||
![]() |
90e73ed010 | ||
![]() |
e613017c13 | ||
![]() |
6404bb84ed | ||
![]() |
55ec9acccf | ||
![]() |
0197b79427 | ||
![]() |
828e531b52 | ||
![]() |
23279d9710 | ||
![]() |
0caf473897 | ||
![]() |
8e68534b28 | ||
![]() |
0f07ccfd3f | ||
![]() |
77fad02da7 | ||
![]() |
7a9cb1b2ca | ||
![]() |
d82ed79989 | ||
![]() |
ff82ded064 | ||
![]() |
78167f2d03 | ||
![]() |
80f2084822 | ||
![]() |
a7d67e993f | ||
![]() |
317eab54f8 | ||
![]() |
cb90ef363b | ||
![]() |
f31309f863 | ||
![]() |
a76a692075 | ||
![]() |
f52f758962 | ||
![]() |
bcc3a7877e | ||
![]() |
7b52da5ce0 | ||
![]() |
e7403bd1a4 | ||
![]() |
2881eb4546 | ||
![]() |
c7cc2269ba | ||
![]() |
014158bc63 | ||
![]() |
8dcccb17ad | ||
![]() |
325a222386 | ||
![]() |
9b4f4229f7 | ||
![]() |
3b719bf145 | ||
![]() |
136d5d2e15 | ||
![]() |
1c10a00089 | ||
![]() |
a8d9401de3 | ||
![]() |
e77fa7dfbc | ||
![]() |
8d3c0cc4ce | ||
![]() |
87e04c8c4b | ||
![]() |
e1f4228c31 | ||
![]() |
4cb4bef579 |
15
.github/workflows/auto-merge.yml
vendored
15
.github/workflows/auto-merge.yml
vendored
@@ -16,27 +16,24 @@ jobs:
|
||||
uses: dependabot/fetch-metadata@v1
|
||||
with:
|
||||
github-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
|
||||
- name: Enable auto-merge for Dependabot PRs
|
||||
run: gh pr merge --auto --merge "$PR_URL"
|
||||
env:
|
||||
PR_URL: ${{github.event.pull_request.html_url}}
|
||||
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
|
||||
- name: Approve patch and minor updates
|
||||
if: ${{steps.dependabot-metadata.outputs.update-type == 'version-update:semver-patch' || steps.dependabot-metadata.outputs.update-type == 'version-update:semver-minor'}}
|
||||
run: gh pr review $PR_URL --approve -b "I'm **approving** this pull request because **it includes a patch or minor update**"
|
||||
env:
|
||||
PR_URL: ${{github.event.pull_request.html_url}}
|
||||
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
- name: Approve major updates of development dependencies
|
||||
if: ${{steps.dependabot-metadata.outputs.update-type == 'version-update:semver-major' && steps.dependabot-metadata.outputs.dependency-type == 'direct:development'}}
|
||||
run: gh pr review $PR_URL --approve -b "I'm **approving** this pull request because **it includes a major update of a dependency used only in development**"
|
||||
env:
|
||||
PR_URL: ${{github.event.pull_request.html_url}}
|
||||
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
- name: Comment on major updates of non-development dependencies
|
||||
if: ${{steps.dependabot-metadata.outputs.update-type == 'version-update:semver-major' && steps.dependabot-metadata.outputs.dependency-type == 'direct:production'}}
|
||||
|
||||
- name: Comment on major updates of any dependencies
|
||||
if: ${{steps.dependabot-metadata.outputs.update-type == 'version-update:semver-major'}}
|
||||
run: |
|
||||
gh pr comment $PR_URL --body "I'm **not approving** this PR because **it includes a major update of a dependency used in production**"
|
||||
gh pr comment $PR_URL --body "I'm **not approving** this PR because **it includes a major update of a dependency**"
|
||||
gh pr edit $PR_URL --add-label "requires-manual-qa"
|
||||
env:
|
||||
PR_URL: ${{github.event.pull_request.html_url}}
|
||||
|
30
.github/workflows/build.yml
vendored
30
.github/workflows/build.yml
vendored
@@ -1,30 +0,0 @@
|
||||
name: build
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- v*
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
node-version: [16.x, 18.x, 20.x]
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
- run: npm ci
|
||||
- run: npm run build
|
||||
- run: npm run build:example
|
78
.github/workflows/lint-build.yml
vendored
Normal file
78
.github/workflows/lint-build.yml
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
name: Lint & build
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
tags:
|
||||
- v*
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
env:
|
||||
CACHE_KEY: 'hugo-hinode'
|
||||
CACHE_PATH_DEBIAN: '/tmp/hugo_cache_runner'
|
||||
CACHE_PATH_WIN: '~\AppData\Local\hugo_cache'
|
||||
CACHE_PATH_MAC: '/Users/runner/Library/Caches/hugo_cache'
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: lts/*
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
- name: Perform clean install of npm
|
||||
run: npm ci
|
||||
|
||||
- name: Lint the source files
|
||||
run: npm run lint
|
||||
|
||||
build:
|
||||
needs: lint
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
node-version: [16.x, 18.x, 20.x]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
- name: Perform clean install of npm
|
||||
run: npm ci
|
||||
|
||||
# Cache Hugo cachedir and resourcedir (configured in config/ci/hugo.toml) for each OS
|
||||
# No additional cache invalidation is needed, Hugo uses checksums itself
|
||||
- name: Use Hugo cache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ${{ runner.os == 'Windows' && env.CACHE_PATH_WIN || runner.os == 'macOS' && env.CACHE_PATH_MAC || env.CACHE_PATH_DEBIAN }}
|
||||
key: ${{ runner.os }}-${{ env.CACHE_KEY }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-${{ env.CACHE_KEY }}
|
||||
|
||||
- name: Build main site
|
||||
run: npm run build:cache
|
||||
|
||||
# The example site is to be published to demo.gethinode.com
|
||||
- name: Build example site
|
||||
run: npm run build:example:ci
|
31
.github/workflows/lint.yml
vendored
31
.github/workflows/lint.yml
vendored
@@ -1,31 +0,0 @@
|
||||
name: lint
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- v*
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [16.x, 18.x, 20.x]
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
- run: npm ci --ignore-scripts
|
||||
- run: npm run lint
|
60
.github/workflows/mod-update.yml
vendored
Normal file
60
.github/workflows/mod-update.yml
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
name: Update Hugo dependencies
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 3 * * *' # run daily at 03:00 AM
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
update-mod:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: lts/*
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
- name: Perform clean install of npm
|
||||
run: npm ci
|
||||
|
||||
- name: Update Hugo module dependencies
|
||||
id: mod-updates
|
||||
run: |
|
||||
MOD_OUTPUT=$(npm run mod:update 2>&1)
|
||||
echo "$MOD_OUTPUT"
|
||||
MOD_UPDATES=$(echo "$MOD_OUTPUT" | grep '^go: upgraded' | sed 's/go: / - /' | sort -u)
|
||||
echo 'MOD_UPDATES<<EOF' >> $GITHUB_OUTPUT
|
||||
echo "$MOD_UPDATES" >> "$GITHUB_OUTPUT"
|
||||
echo 'EOF' >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: gethinode-actions/create-pull-request@v5
|
||||
with:
|
||||
token: ${{ secrets.HUGO_MOD_PR }}
|
||||
commit-message: 'fix: update Hugo module dependencies'
|
||||
committer: GitHub <noreply@github.com>
|
||||
branch: hugo-mod-dependencies
|
||||
delete-branch: true
|
||||
title: 'Update Hugo module dependencies'
|
||||
body: |
|
||||
This PR is auto-generated by [create-pull-request][1].
|
||||
|
||||
Changes to go.mod:
|
||||
|
||||
${{ steps.mod-updates.outputs.MOD_UPDATES }}
|
||||
|
||||
[1]: https://github.com/peter-evans/create-pull-request
|
||||
labels: dependencies
|
||||
add-paths: |
|
||||
go.mod
|
||||
go.sum
|
||||
**/go.mod
|
||||
**/go.sum
|
53
.github/workflows/npm-publish.yml
vendored
53
.github/workflows/npm-publish.yml
vendored
@@ -1,35 +1,40 @@
|
||||
# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
|
||||
|
||||
name: Node.js Package
|
||||
# This workflow will run tests using node and then publish a package to npmjs.org when a release is created
|
||||
# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages
|
||||
name: Publish package to npmjs
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
branches: [ main ]
|
||||
release:
|
||||
types: [created]
|
||||
types: [published]
|
||||
|
||||
env:
|
||||
REGISTRY_URL: 'https://registry.npmjs.org/'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm ci
|
||||
- run: npm test
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
node-version: [20.x]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
publish-npm:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup .npmrc file to publish to npm
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
registry-url: https://registry.npmjs.org/
|
||||
- run: npm ci
|
||||
- run: npm publish
|
||||
node-version: ${{ matrix.node-version }}
|
||||
registry-url: ${{ env.REGISTRY_URL }}
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '**/package-lock.json'
|
||||
|
||||
- name: Perform clean install of npm
|
||||
run: npm ci
|
||||
|
||||
- name: Publish package to npm
|
||||
run: npm publish
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{secrets.npm_token}}
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
|
37
.github/workflows/update.yml
vendored
37
.github/workflows/update.yml
vendored
@@ -1,37 +0,0 @@
|
||||
name: Update Hugo Dependencies
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 3 * * *' # run daily at 03:00 AM
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
update-dep:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: "lts/*"
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
- name: Update Hugo module dependencies
|
||||
run: npm run mod:update
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v5
|
||||
with:
|
||||
token: ${{ secrets.HUGO_MOD_PR }}
|
||||
commit-message: 'fix: update Hugo module dependencies'
|
||||
branch: hugo-mod-dependencies
|
||||
delete-branch: true
|
||||
title: 'Update Hugo module dependencies'
|
||||
body: >
|
||||
This PR is auto-generated by
|
||||
[create-pull-request](https://github.com/peter-evans/create-pull-request).
|
||||
labels: dependencies
|
@@ -31,5 +31,5 @@ defaultMarkdownHandler = "goldmark"
|
||||
block = true
|
||||
[goldmark.renderer]
|
||||
hardWraps = false
|
||||
unsafe = true
|
||||
unsafe = false
|
||||
xhtml = false
|
@@ -27,6 +27,7 @@
|
||||
[debugging]
|
||||
showJS = false
|
||||
showSCSS = false
|
||||
purgeHTMLComments = false
|
||||
# toml-docs-end debugging
|
||||
|
||||
# toml-docs-start docs
|
||||
@@ -55,6 +56,7 @@
|
||||
breadcrumb = true
|
||||
toc = true
|
||||
sidebar = true
|
||||
size = "md"
|
||||
# toml-docs-end navigation
|
||||
|
||||
# toml-docs-start messages
|
||||
|
23
config/ci/hugo.toml
Normal file
23
config/ci/hugo.toml
Normal file
@@ -0,0 +1,23 @@
|
||||
# cachedir default on POSIX: '/tmp/hugo_cache_runner'
|
||||
# cachedir default on Windows: '~\AppData\Local\hugo_cache'
|
||||
# cachedir default on macOS: '/Users/runner/Library/Caches/hugo_cache'
|
||||
|
||||
[caches]
|
||||
[caches.assets]
|
||||
dir = ':cacheDir/resources/_gen' # map to cacheDir instead of resourceDir to utilize GitHub action/cache
|
||||
maxAge = -1
|
||||
[caches.getcsv]
|
||||
dir = ':cacheDir/:project'
|
||||
maxAge = -1
|
||||
[caches.getjson]
|
||||
dir = ':cacheDir/:project'
|
||||
maxAge = -1
|
||||
[caches.getresource]
|
||||
dir = ':cacheDir/:project'
|
||||
maxAge = -1
|
||||
[caches.images]
|
||||
dir = ':cacheDir/resources/_gen' # map to cacheDir instead of resourceDir to utilize GitHub action/cache
|
||||
maxAge = -1
|
||||
[caches.modules]
|
||||
dir = ':cacheDir/modules'
|
||||
maxAge = -1
|
@@ -1,3 +1,4 @@
|
||||
resourcedir = '../resources/'
|
||||
title = "Hinode"
|
||||
copyright = "Copyright © 2023 Mark Dumay."
|
||||
paginate = 9
|
||||
|
@@ -31,5 +31,5 @@ defaultMarkdownHandler = "goldmark"
|
||||
block = true
|
||||
[goldmark.renderer]
|
||||
hardWraps = false
|
||||
unsafe = true
|
||||
unsafe = false
|
||||
xhtml = false
|
@@ -21,6 +21,7 @@
|
||||
[debugging]
|
||||
showJS = false
|
||||
showSCSS = false
|
||||
purgeHTMLComments = true # prevents a Goldmark warning when processing HTML comments (as used by markdownlint)
|
||||
|
||||
[docs]
|
||||
basePath = "/" # TODO: replace
|
||||
@@ -44,6 +45,7 @@
|
||||
breadcrumb = true
|
||||
toc = true
|
||||
sidebar = true
|
||||
size = "md"
|
||||
|
||||
[messages]
|
||||
placement = "bottom-right"
|
||||
|
22
exampleSite/config/ci/hugo.toml
Normal file
22
exampleSite/config/ci/hugo.toml
Normal file
@@ -0,0 +1,22 @@
|
||||
# cachedir default on POSIX: '/tmp/hugo_cache_runner'
|
||||
# cachedir default on Windows: '~\AppData\Local\hugo_cache'
|
||||
|
||||
[caches]
|
||||
[caches.assets]
|
||||
dir = ':cacheDir/resources/_gen' # map to cacheDir instead of resourceDir to utilize GitHub action/cache
|
||||
maxAge = -1
|
||||
[caches.getcsv]
|
||||
dir = ':cacheDir/:project'
|
||||
maxAge = -1
|
||||
[caches.getjson]
|
||||
dir = ':cacheDir/:project'
|
||||
maxAge = -1
|
||||
[caches.getresource]
|
||||
dir = ':cacheDir/:project'
|
||||
maxAge = -1
|
||||
[caches.images]
|
||||
dir = ':cacheDir/resources/_gen' # map to cacheDir instead of resourceDir to utilize GitHub action/cache
|
||||
maxAge = -1
|
||||
[caches.modules]
|
||||
dir = ':cacheDir/modules'
|
||||
maxAge = -1
|
@@ -6,29 +6,19 @@ updated: 2023-08-02
|
||||
showComments: false
|
||||
---
|
||||
|
||||
<p class="text-center"><svg class="img-fluid w-50"><use href="/img/logo_var.svg#logo"></use></svg></p>
|
||||
{{< image src="/img/logo_var.svg#logo" class="img-fluid w-50" wrapper="text-center" >}}
|
||||
|
||||
<section class="section section-sm mt-5 mb-5">
|
||||
<div class="container-fluid">
|
||||
<div class="row justify-content-center text-center">
|
||||
<div class="col-lg-4">
|
||||
{{< icon fab bootstrap fa-2xl >}}
|
||||
<h2 class="h4">Bootstrap framework</h2>
|
||||
<p>Build fast, responsive sites with Bootstrap 5. Easily customize your site with the source Sass files.</p>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
{{< icon fas magnifying-glass fa-2xl >}}
|
||||
<h2 class="h4">Full text search</h2>
|
||||
<p>Search your site with FlexSearch, a full-text search library with zero dependencies.</p>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
{{< icon fas code fa-2xl >}}
|
||||
<h2 class="h4">Development tools</h2>
|
||||
<p>Use Node Package Manager to automate the build process and to keep track of dependencies.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{< card-group class="text-center border-0" padding="3" >}}
|
||||
{{< card title="Bootstrap framework" icon="fab bootstrap" >}}
|
||||
Build fast, responsive sites with Bootstrap 5. Easily customize your site with the source Sass files.
|
||||
{{< /card >}}
|
||||
{{< card title="Full text search" icon="fas magnifying-glass" >}}
|
||||
Search your site with FlexSearch, a full-text search library with zero dependencies.
|
||||
{{< /card >}}
|
||||
{{< card title="Development tools" icon="fas code" >}}
|
||||
Use Node Package Manager to automate the build process and to keep track of dependencies.
|
||||
{{< /card >}}
|
||||
{{< /card-group >}}
|
||||
|
||||
Additional features include:
|
||||
|
||||
|
@@ -22,11 +22,10 @@ As an example, the following shortcode displays an accordion with three elements
|
||||
{{< example lang="hugo" >}}
|
||||
{{</* accordion */>}}
|
||||
{{</* accordion-item header="Accordion Item #1" show="true" */>}}
|
||||
This is the first item's accordion body. It supports HTML content. The item is shown by adding the value
|
||||
<code>show</code> to the <code>class</code> argument.
|
||||
This is the first item's accordion body. It supports HTML content, if enabled in the goldmark renderer. The item is shown by adding the value `show` to the `class` argument.
|
||||
{{</* /accordion-item */>}}
|
||||
{{</* accordion-item header="Accordion Item #2" */>}}
|
||||
This is the second item's accordion body. It supports HTML content too.
|
||||
This is the second item's accordion body.
|
||||
{{</* /accordion-item */>}}
|
||||
{{</* accordion-item header="Accordion Item #3" */>}}
|
||||
This is the third item's accordion body.
|
||||
@@ -102,7 +101,28 @@ As an example, the following shortcode displays a stacked card that links to the
|
||||
|
||||
<!-- markdownlint-disable MD037 -->
|
||||
{{< example lang="hugo" >}}
|
||||
{{</* card path="about" padding="3" class="w-50" color="body-tertiary" header="publication" footer="none" */>}}
|
||||
{{</* card path="about" padding="3" class="col-6 mx-auto" color="body-tertiary" header="publication" footer="none" /*/>}}
|
||||
{{< /example >}}
|
||||
<!-- markdownlint-enable MD037 -->
|
||||
|
||||
## Card group
|
||||
|
||||
As an example, the following shortcode displays a card group of three elements.
|
||||
|
||||
<!-- markdownlint-disable MD037 -->
|
||||
{{< example lang="hugo" >}}
|
||||
{{</* card-group padding="3" */>}}
|
||||
{{</* card title="Bootstrap framework" icon="fab bootstrap" */>}}
|
||||
Build fast, responsive sites with Bootstrap 5. Easily customize your site with the source
|
||||
Sass files.
|
||||
{{</* /card */>}}
|
||||
{{</* card title="Full text search" icon="fas magnifying-glass" */>}}
|
||||
Search your site with FlexSearch, a full-text search library with zero dependencies.
|
||||
{{</* /card */>}}
|
||||
{{</* card title="Development tools" icon="fas code" */>}}
|
||||
Use Node Package Manager to automate the build process and to keep track of dependencies.
|
||||
{{</* /card */>}}
|
||||
{{</* /card-group */>}}
|
||||
{{< /example >}}
|
||||
<!-- markdownlint-enable MD037 -->
|
||||
|
||||
@@ -217,6 +237,31 @@ As an example, the following shortcode displays an image with rounded corners an
|
||||
{{< /example >}}
|
||||
<!-- markdownlint-enable MD037 -->
|
||||
|
||||
## Link
|
||||
|
||||
As an example, the following shortcodes render links in different formats.
|
||||
|
||||
<!-- markdownlint-disable MD037 -->
|
||||
{{< example lang="hugo" >}}
|
||||
|
||||
- {{</* link hinode >}}Named link with default settings{{< /link */>}}
|
||||
- {{</* link name=hinode cue=false tab=false >}}Named link opening in current tab w/o icon{{< /link */>}}
|
||||
- {{</* link name=hinode cue=true tab=true >}}Named link opening in new tab with icon{{< /link */>}}
|
||||
- {{</* link hinode /*/>}}
|
||||
- {{</* link href="https://developer.mozilla.org" >}}External link{{< /link */>}}
|
||||
- {{</* link "./projects/another-project" >}}Internal link with title{{< /link */>}}
|
||||
- {{</* link url="projects/another-project" /*/>}}
|
||||
- {{</* link url="/projects/another-project" /*/>}}
|
||||
- {{</* link url="../projects/another-project" case=false /*/>}}
|
||||
- {{</* link "/about/" /*/>}}
|
||||
- {{</* link "/fr/about/" /*/>}}
|
||||
- {{</* link "/fr/about" >}}About (French){{< /link */>}}
|
||||
- {{</* link "#image" /*/>}}
|
||||
- {{</* link "components/#map" /*/>}}
|
||||
|
||||
{{< /example >}}
|
||||
<!-- markdownlint-enable MD037 -->
|
||||
|
||||
## Nav
|
||||
|
||||
As an example, the following shortcode displays a tab group with vertically aligned pills.
|
||||
@@ -225,11 +270,10 @@ As an example, the following shortcode displays a tab group with vertically alig
|
||||
{{< example lang="hugo" >}}
|
||||
{{</* nav type="pills" vertical="true" */>}}
|
||||
{{</* nav-item header="Nav Item #1" show="true" */>}}
|
||||
This is the first item's nav body. It supports HTML content. The item is shown by adding the value
|
||||
<code>show</code> to the <code>class</code> argument.
|
||||
This is the first item's nav body. It supports HTML content, if enabled in the goldmark renderer. The item is shown by adding the value `show` to the `class` argument.
|
||||
{{</* /nav-item */>}}
|
||||
{{</* nav-item header="Nav Item #2" */>}}
|
||||
This is the second item's nav body. It too supports HTML content.
|
||||
This is the second item's nav body.
|
||||
{{</* /nav-item */>}}
|
||||
{{</* nav-item header="Nav Item #3" */>}}
|
||||
This is the third item's nav body.
|
||||
|
@@ -7,30 +7,19 @@ updated: 2023-08-02
|
||||
showComments: false
|
||||
---
|
||||
|
||||
<p class="text-center"><svg class="img-fluid w-50"><use href="/img/logo_var.svg#logo"></use></svg></p>
|
||||
{{< image src="/img/logo_var.svg#logo" class="img-fluid w-50" wrapper="text-center" >}}
|
||||
|
||||
<section class="section section-sm mt-5">
|
||||
<div class="container-fluid">
|
||||
<div class="row justify-content-center text-center">
|
||||
<div class="row justify-content-center text-center">
|
||||
<div class="col-lg-4">
|
||||
{{< icon fab bootstrap fa-2xl >}}
|
||||
<h2 class="h4">Framework Bootstrap</h2>
|
||||
<p>Créez des sites rapides et réactifs avec Bootstrap 5. Personnalisez facilement votre site avec les fichiers source Sass.</p>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
{{< icon fas magnifying-glass fa-2xl >}}
|
||||
<h2 class="h4">Recherche en texte intégral</h2>
|
||||
<p>Recherchez votre site avec FlexSearch, une bibliothèque de recherche en texte intégral avec zéro dépendances.</p>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
{{< icon fas code fa-2xl >}}
|
||||
<h2 class="h4">Outils de développement</h2>
|
||||
<p>Utilisez Node Package Manager pour automatiser le processus de construction et suivre les dépendances.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{< card-group class="text-center border-0" padding="3" >}}
|
||||
{{< card title="Framework Bootstrap" icon="fab bootstrap" >}}
|
||||
Créez des sites rapides et réactifs avec Bootstrap 5. Personnalisez facilement votre site avec les fichiers source Sass.
|
||||
{{< /card >}}
|
||||
{{< card title="Recherche en texte intégral" icon="fas magnifying-glass" >}}
|
||||
Recherchez votre site avec FlexSearch, une bibliothèque de recherche en texte intégral avec zéro dépendances.
|
||||
{{< /card >}}
|
||||
{{< card title="Outils de développement" icon="fas code" >}}
|
||||
Utilisez Node Package Manager pour automatiser le processus de construction et suivre les dépendances.
|
||||
{{< /card >}}
|
||||
{{< /card-group >}}
|
||||
|
||||
Les fonctionnalités supplémentaires incluent:
|
||||
|
||||
|
@@ -7,30 +7,20 @@ updated: 2023-08-02
|
||||
showComments: false
|
||||
---
|
||||
|
||||
<p class="text-center"><svg class="img-fluid w-50"><use href="/img/logo_var.svg#logo"></use></svg></p>
|
||||
|
||||
<section class="section section-sm mt-5">
|
||||
<div class="container-fluid">
|
||||
<div class="row justify-content-center text-center">
|
||||
<div class="row justify-content-center text-center">
|
||||
<div class="col-lg-4">
|
||||
{{< icon fab bootstrap fa-2xl >}}
|
||||
<h2 class="h4">Bootstrap raamwerk</h2>
|
||||
<p>Bouw snelle websites geschikt voor mobiele en desktop schermen met Bootstrap 5. Pas de site eenvoudig aan met bronbestanden in Sass.</p>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
{{< icon fas magnifying-glass fa-2xl >}}
|
||||
<h2 class="h4">Volledig doorzoekbaar</h2>
|
||||
<p>Doorzoek je site met FlexSearch, een software bibliotheek zonder afhankelijkheden.</p>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
{{< icon fas code fa-2xl >}}
|
||||
<h2 class="h4">Ontwikkelgereedschap</h2>
|
||||
<p>Gebruik Node Package Manager om het bouwproces inclusief versiebeheer volledig te automatiseren.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{< image src="/img/logo_var.svg#logo" class="img-fluid w-50" wrapper="text-center" >}}
|
||||
|
||||
{{< card-group class="text-center border-0" padding="3" >}}
|
||||
{{< card title="Bootstrap raamwerk" icon="fab bootstrap" >}}
|
||||
Bouw snelle websites geschikt voor mobiele en desktop schermen met Bootstrap 5. Pas de site eenvoudig aan met bronbestanden in Sass.
|
||||
{{< /card >}}
|
||||
{{< card title="Volledig doorzoekbaar" icon="fas magnifying-glass" >}}
|
||||
Doorzoek je site met FlexSearch, een software bibliotheek zonder afhankelijkheden.
|
||||
{{< /card >}}
|
||||
{{< card title="Ontwikkelgereedschap" icon="fas code" >}}
|
||||
Gebruik Node Package Manager om het bouwproces inclusief versiebeheer volledig te automatiseren.
|
||||
{{< /card >}}
|
||||
{{< /card-group >}}
|
||||
|
||||
Overige functies:
|
||||
|
||||
|
@@ -10,6 +10,7 @@ github.com/gethinode/mod-fontawesome v1.2.4 h1:SqE3CQ+boaBIhrVh3MPu4nz0uoHPfEH5t
|
||||
github.com/gethinode/mod-fontawesome v1.2.4/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
|
||||
github.com/gethinode/mod-fontawesome v1.2.5 h1:RqkLRj6+s+gM4nKd0IwNMMDA8cRmxfp0fxkVH4FdAGU=
|
||||
github.com/gethinode/mod-fontawesome v1.2.5/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
|
||||
github.com/gethinode/mod-katex v1.0.1/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
|
||||
github.com/gethinode/mod-katex v1.0.2 h1:pIG4n3qLl/IVe7BEiwn+GL8r5lOCtF6FDxlcrPKdAXk=
|
||||
github.com/gethinode/mod-katex v1.0.2/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
|
||||
github.com/gethinode/mod-leaflet v0.3.4 h1:oY+YQ0JiJuhFQNrk9XgFdg0NMsTUQPXNfnILp4ia4r4=
|
||||
|
@@ -27,13 +27,13 @@
|
||||
"link",
|
||||
"meta",
|
||||
"nav",
|
||||
"nil",
|
||||
"noscript",
|
||||
"ol",
|
||||
"p",
|
||||
"path",
|
||||
"pre",
|
||||
"script",
|
||||
"section",
|
||||
"small",
|
||||
"span",
|
||||
"strong",
|
||||
@@ -162,8 +162,8 @@
|
||||
"fa",
|
||||
"fa-10x",
|
||||
"fa-2x",
|
||||
"fa-2xl",
|
||||
"fa-2xs",
|
||||
"fa-4x",
|
||||
"fa-arrow-left",
|
||||
"fa-arrow-right",
|
||||
"fa-bootstrap",
|
||||
@@ -213,11 +213,11 @@
|
||||
"fw-bold",
|
||||
"fw-semibold",
|
||||
"g-0",
|
||||
"g-3",
|
||||
"gap-2",
|
||||
"gap-3",
|
||||
"gradient",
|
||||
"h-100",
|
||||
"h4",
|
||||
"h6",
|
||||
"heading",
|
||||
"highlight",
|
||||
@@ -258,7 +258,7 @@
|
||||
"mt-3",
|
||||
"mt-5",
|
||||
"mt-auto",
|
||||
"multi-docs-collapse-14",
|
||||
"multi-docs-collapse-15",
|
||||
"multi-file-collapse-1",
|
||||
"mx-auto",
|
||||
"mx-md-2",
|
||||
@@ -315,7 +315,6 @@
|
||||
"py-md-1",
|
||||
"ratio",
|
||||
"ratio-16x9",
|
||||
"ratio-21x9",
|
||||
"rounded",
|
||||
"rounded-2",
|
||||
"rounded-bottom",
|
||||
@@ -329,8 +328,8 @@
|
||||
"row-cols-sm-3",
|
||||
"row-cols-sm-4",
|
||||
"search",
|
||||
"section",
|
||||
"section-sm",
|
||||
"search-input",
|
||||
"search-suggestions",
|
||||
"shadow",
|
||||
"show",
|
||||
"slide",
|
||||
@@ -413,13 +412,14 @@
|
||||
"accordion-0-item-2",
|
||||
"alert",
|
||||
"badge",
|
||||
"body-docs-collapse-14",
|
||||
"body-docs-collapse-15",
|
||||
"body-file-collapse-1",
|
||||
"breadcrumb",
|
||||
"btn-webshare",
|
||||
"button",
|
||||
"button-group",
|
||||
"card",
|
||||
"card-group",
|
||||
"carousel",
|
||||
"carousel-0",
|
||||
"collapse",
|
||||
@@ -428,12 +428,13 @@
|
||||
"docs",
|
||||
"example",
|
||||
"file",
|
||||
"footer-docs-collapse-14",
|
||||
"footer-docs-collapse-15",
|
||||
"footer-file-collapse-1",
|
||||
"formula-katex",
|
||||
"icon",
|
||||
"image",
|
||||
"leaflet-map-0",
|
||||
"link",
|
||||
"map",
|
||||
"nav",
|
||||
"nav-0",
|
||||
@@ -447,9 +448,7 @@
|
||||
"navbar-0-collapse",
|
||||
"navbar-sample-collapse",
|
||||
"release",
|
||||
"search",
|
||||
"spinner",
|
||||
"suggestions",
|
||||
"timeline",
|
||||
"toast",
|
||||
"toast-container",
|
||||
|
@@ -149,14 +149,14 @@
|
||||
"py-2",
|
||||
"py-5",
|
||||
"py-md-1",
|
||||
"ratio",
|
||||
"ratio-16x9",
|
||||
"rounded",
|
||||
"row",
|
||||
"row-cols-1",
|
||||
"row-cols-sm-3",
|
||||
"row-cols-sm-4",
|
||||
"search",
|
||||
"search-input",
|
||||
"search-suggestions",
|
||||
"shadow",
|
||||
"svg-inline--fa",
|
||||
"switch-mode-collapsed",
|
||||
@@ -179,8 +179,6 @@
|
||||
"-theme",
|
||||
"-theme-collapsed",
|
||||
"navbar-0-collapse",
|
||||
"search",
|
||||
"suggestions",
|
||||
"toast-container",
|
||||
"toast-copied-code-message"
|
||||
]
|
||||
|
@@ -94,7 +94,7 @@
|
||||
|
||||
# 404 page
|
||||
- id: pageNotFound
|
||||
translation: "La page que vous recherchez n'existe pas ou une autre erreur s'est produite.Essayez de revenir à notre {{ . }}."
|
||||
translation: "La page que vous recherchez n'existe pas ou une autre erreur s'est produite. Essayez de revenir à notre {{ . }}."
|
||||
- id: pageNotFoundTitle
|
||||
translation: "Page non trouvée"
|
||||
- id: pageNotFoundHome
|
||||
@@ -112,4 +112,4 @@
|
||||
- id: show
|
||||
translation: "Afficher"
|
||||
- id: comments
|
||||
translation: "Commentaires"
|
||||
translation: "Commentaires"
|
||||
|
@@ -30,7 +30,8 @@
|
||||
"page" .
|
||||
"fixed" (string .Site.Params.navigation.fixed)
|
||||
"color" (.Site.Params.navigation.color)
|
||||
"style" (default "light" .Site.Params.navigation.style))
|
||||
"style" (default "light" .Site.Params.navigation.style)
|
||||
"size" (default "md" .Site.Params.navigation.size))
|
||||
-}}
|
||||
</div>
|
||||
{{ if .IsHome -}}
|
||||
|
@@ -83,7 +83,8 @@
|
||||
{{- partial "assets/image.html" (dict "url" $thumbnail "ratio" "21x9" "outerClass" "img-wrap" "innerClass" "rounded" "title" .Params.title "caption" $credits) -}}
|
||||
{{ end -}}
|
||||
{{ end }}
|
||||
{{ .Content }}
|
||||
|
||||
{{ partial "utilities/ProcessContent" (dict "page" .Page "raw" .RawContent )}}
|
||||
{{ end -}}
|
||||
|
||||
{{ define "partials/footer.html" -}}
|
||||
|
@@ -7,6 +7,7 @@
|
||||
The shortcode supports the following arguments:
|
||||
"page" Required context of the current page.
|
||||
"list" Required array of pages.
|
||||
"cards" Optional string of rendered cards.
|
||||
"max" Required maximum number of cards to display.
|
||||
"cols" Required number of columns for the grid, must be a value between 1 and 5.
|
||||
"title" Optional title of the card group.
|
||||
@@ -30,21 +31,61 @@
|
||||
-->
|
||||
|
||||
{{- $page := .page -}}
|
||||
{{- if ne (printf "%T" $page) "*hugolib.pageState" -}}
|
||||
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'page'" -}}
|
||||
|
||||
{{- if not (in (slice "*hugolib.pageState" "*hugolib.pageForShortcode") (printf "%T" $page)) -}}
|
||||
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'page': %T" $page -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $supportedTypes := slice "page.Pages" "resource.Resources" -}}
|
||||
{{ $list := .list }}
|
||||
{{- if not (in $supportedTypes (printf "%T" $list)) -}}
|
||||
{{ warnf "Type: %T" $list }}
|
||||
{{ $pages := .list }}
|
||||
{{- if and $pages (not (in $supportedTypes (printf "%T" $pages))) -}}
|
||||
{{ warnf "Type: %T" $pages }}
|
||||
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'list'" -}}
|
||||
{{- end -}}
|
||||
{{ $cards := .cards }}
|
||||
|
||||
{{- $paginate := false -}}
|
||||
{{- with .paginate -}}
|
||||
{{- if ne (printf "%T" .) "bool" -}}
|
||||
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'paginate'" -}}
|
||||
{{- end -}}
|
||||
{{- $paginate = . -}}
|
||||
{{- end -}}
|
||||
|
||||
{{ $paginator := "" }}
|
||||
{{ if $paginate }}
|
||||
{{ $paginator = $page.Paginate $pages }}
|
||||
{{ $pages = first $paginator.PageSize (after (mul (sub $paginator.PageNumber 1) $paginator.PageSize) $pages) }}
|
||||
{{ end }}
|
||||
{{ $list := slice }}
|
||||
{{ range $index, $element := $pages }}
|
||||
{{ $params := dict }}
|
||||
<!-- regular page -->
|
||||
{{- if $element.RelPermalink -}}
|
||||
{{- $params = merge $params (dict "path" $element.File.Path) -}}
|
||||
<!-- headless page -->
|
||||
{{- else -}}
|
||||
{{- $thumbnail := (or (and (reflect.IsMap $element.Params.Thumbnail) $element.Params.Thumbnail.url) $element.Params.Thumbnail) -}}
|
||||
{{- $params = merge $params (dict
|
||||
"title" $element.Title
|
||||
"href" $element.RelPermalink
|
||||
"description" (partial "utilities/GetDescription.html" $element)
|
||||
"thumbnail" $thumbnail
|
||||
"icon" $element.Params.icon
|
||||
) -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $list = $list | append $params }}
|
||||
{{ end }}
|
||||
|
||||
{{- $count := len $list -}}
|
||||
{{- $max := .max -}}
|
||||
{{- if ne (printf "%T" $max) "int" -}}
|
||||
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'max'" -}}
|
||||
{{- $max := $count -}}
|
||||
{{- with .max }}
|
||||
{{- if ne (printf "%T" .) "int" -}}
|
||||
{{- warnf "partial [assets/card-group.html] - Invalid value for param 'max': %s" . -}}
|
||||
{{- else -}}
|
||||
{{- $max = . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- $max = math.Min $max $count -}}
|
||||
|
||||
@@ -58,13 +99,6 @@
|
||||
{{- else if eq $cols 4 }}{{ $colGrid = "row-cols-1 row-cols-sm-2 row-cols-md-4" -}}
|
||||
{{- else if eq $cols 5 }}{{ $colGrid = "row-cols-1 row-cols-sm-3 row-cols-md-5" }}{{ end -}}
|
||||
|
||||
{{- $paginate := false -}}
|
||||
{{- with .paginate -}}
|
||||
{{- if ne (printf "%T" .) "bool" -}}
|
||||
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'paginate'" -}}
|
||||
{{- end -}}
|
||||
{{- $paginate = . -}}
|
||||
{{- end -}}
|
||||
{{- if not $paginate -}}
|
||||
{{- $list = first $max $list -}}
|
||||
{{- end -}}
|
||||
@@ -89,13 +123,7 @@
|
||||
|
||||
{{- if and (eq $cols 1) (eq $orientation "horizontal") }}{{ $orientation = "horizontal-sm" }}{{ end -}}
|
||||
|
||||
<div class="container-fluid p-4 px-xxl-0">
|
||||
{{ $paginator := "" }}
|
||||
{{ if $paginate }}
|
||||
{{ $paginator = $page.Paginate $list }}
|
||||
{{ $list = first $paginator.PageSize (after (mul (sub $paginator.PageNumber 1) $paginator.PageSize) $list) }}
|
||||
{{ end }}
|
||||
|
||||
<div class="container-fluid p-4 px-xxl-0 ">
|
||||
<div class="row {{ $colGrid }}">
|
||||
{{ range $index, $element := $list }}
|
||||
{{- $params := (dict
|
||||
@@ -106,19 +134,7 @@
|
||||
"footer" $footer
|
||||
"orientation" $orientation
|
||||
) -}}
|
||||
|
||||
{{- if $element.RelPermalink -}}
|
||||
{{- $params = merge $params (dict "path" $element.File.Path) -}}
|
||||
{{- else -}}
|
||||
{{- $thumbnail := (or (and (reflect.IsMap $element.Params.Thumbnail) $element.Params.Thumbnail.url) $element.Params.Thumbnail) -}}
|
||||
{{- $params = merge $params (dict
|
||||
"title" $element.Title
|
||||
"href" $element.RelPermalink
|
||||
"description" (partial "utilities/GetDescription.html" $element)
|
||||
"thumbnail" $thumbnail
|
||||
"icon" $element.Params.icon
|
||||
) -}}
|
||||
{{- end -}}
|
||||
{{- $params = merge $params $element }}
|
||||
|
||||
<div class="col pt-3 pb-3">
|
||||
{{- partial "assets/card.html" $params -}}
|
||||
@@ -129,6 +145,7 @@
|
||||
</div>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- print $cards | safeHTML }}
|
||||
</div>
|
||||
|
||||
{{ if $paginate }}
|
||||
|
@@ -37,7 +37,7 @@
|
||||
{{- else -}}
|
||||
<div>
|
||||
<p class="card-title fs-5 fw-bold">{{ $title }}</p>
|
||||
{{ with $description }}<p class="card-text mb-4 {{ if $color }}link-bg-{{ $color }}{{ else }}card-body-link{{ end }}">{{ . }}</p>{{ end -}}
|
||||
{{ with $description }}<p class="card-text mb-4">{{ . }}</p>{{ end -}}
|
||||
</div>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
@@ -2,22 +2,43 @@
|
||||
Render a local or remote image with responsive image sizing. Images are resized using default media breakpoints
|
||||
and are converted to webp format. The image is processed using the quality setting specified in the [imaging]
|
||||
section of the main config file (defaults to 75). A fallback image is provided for older browsers. The image is
|
||||
wrapped in a figure if a caption is provided, else the image is wrapped in a div with a ratio constraint. The
|
||||
partial supports the following arguments:
|
||||
"url": Required relative url of the image, e.g. "img/example.jpg"
|
||||
wrapped in a figure if a caption is provided, else the image is wrapped in a div with a ratio constraint.
|
||||
|
||||
If the url starts with 'http', the image is retrieved from an external location. Else, the url is matched with a
|
||||
page resource and site asset (in that order). The path of a remote image is rewritten to ensure processed files are
|
||||
stored in the final '/img' folder.
|
||||
|
||||
The partial supports the following bitmap image formats: "png", "jpeg", "gif", "tiff", "bmp", and "webp". Vector
|
||||
graphics of type "svg" are supported too, although these images do no support additional processing. This means
|
||||
the arguments "ratio" and "portrait" have no effect for vector images. Vector graphics support an optional anchor
|
||||
"#" in their url to denote a styling reference.
|
||||
|
||||
The partial supports the following arguments:
|
||||
"url": Required path or url of the image, e.g. "img/example.jpg"
|
||||
"mode": Optional flag indicating if the image should support color modes.
|
||||
"ratio": Optional ratio of the image, either "1x1", "4x3", "16x9", or "21x9". If set, the image is
|
||||
resized and cropped to match the ratio. Else the original aspect ratio of the image is kept.
|
||||
"ratio": Optional ratio of the image, either "1x1", "3x2", "4x3", "16x9", or "21x9". If set, the image is
|
||||
resized and cropped to match the ratio. Else the original aspect ratio of the image is kept. Not
|
||||
applicable to vector graphics.
|
||||
"portrait": Optional flag to adjust the ratio from landscape to portrait. The image itself is not rotated, only
|
||||
the crop area is adjusted. Not applicable to vector graphics.
|
||||
"outerClass": Optional class attribute of the outer div element, e.g. "img-wrap".
|
||||
"innerClass": Optional class attribute of the inner img element, e.g. "rounded".
|
||||
"title": Optional alternate text of the image.
|
||||
"caption": Optional figure caption.
|
||||
"page": Optional page context, used to match page resources.
|
||||
-->
|
||||
|
||||
{{- $validRatios := slice "1x1" "4x3" "16x9" "21x9" -}}
|
||||
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
|
||||
{{- $validRatios := slice "1x1" "3x2" "4x3" "16x9" "21x9" -}}
|
||||
{{- $ratio := .ratio -}}
|
||||
{{- if $ratio -}}
|
||||
{{ if not (in $validRatios $ratio) -}}
|
||||
{{- errorf "partial [assets/image.html] - Invalid value for param 'ratio'" -}}
|
||||
{{ end -}}
|
||||
{{- end -}}
|
||||
{{- $portrait := .portrait -}}
|
||||
{{- $url := .url -}}
|
||||
|
||||
{{- $mode := false -}}
|
||||
{{- with .mode -}}
|
||||
{{ $mode = . -}}
|
||||
@@ -30,12 +51,37 @@
|
||||
{{- errorf "partial [assets/image.html] - Invalid value for param 'mode'" -}}
|
||||
{{- end -}}
|
||||
{{- $modes := site.Params.main.modes | default (slice "light" "dark") -}}
|
||||
{{- $page := .page -}}
|
||||
|
||||
|
||||
{{- define "partials/image-portrait.html" -}}
|
||||
{{- $dimensions := slice }}
|
||||
{{- $dim := .dim -}}
|
||||
{{- $dimensions = $dimensions | append $dim -}}
|
||||
{{- $portraits := slice }}
|
||||
{{- range $d := $dimensions -}}
|
||||
{{- $p := split $d "x" }}
|
||||
{{ if ne (len $p) 2 }}
|
||||
{{- warnf "partial [assets/image.html] - Invalid dimension: %s" $d -}}
|
||||
{{- $portraits = $portraits | append $d -}}
|
||||
{{- else -}}
|
||||
{{- $portraits = $portraits | append (printf "%sx%s" (index $p 1) (index $p 0)) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- $ret := "" }}
|
||||
{{- if reflect.IsSlice $dim -}}
|
||||
{{ $ret = $portraits -}}
|
||||
{{- else if gt (len $portraits) 0 -}}
|
||||
{{- $ret = index $portraits 0 -}}
|
||||
{{- end -}}
|
||||
{{- return $ret -}}
|
||||
{{- end -}}
|
||||
|
||||
<!-- Generate a fallback image of type jpg -->
|
||||
{{- define "partials/image-default.html" -}}
|
||||
{{- $img := .img -}}
|
||||
{{- $ratio := .ratio -}}
|
||||
{{- $portrait := and .portrait .ratio -}}
|
||||
{{- $width := "1400" -}}
|
||||
{{- $dim := "" -}}
|
||||
{{- $fallback := "" -}}
|
||||
@@ -43,6 +89,8 @@
|
||||
{{- with $img -}}
|
||||
{{- if eq $ratio "4x3" -}}
|
||||
{{- $dim = "1400x1050" }}
|
||||
{{- else if eq $ratio "3x2" -}}
|
||||
{{- $dim = "1400x933" }}
|
||||
{{- else if eq $ratio "1x1" -}}
|
||||
{{- $dim = "1400x1400" }}
|
||||
{{- else if eq $ratio "16x9" -}}
|
||||
@@ -53,6 +101,10 @@
|
||||
{{- $dim = printf "%sx%d" $width (int (math.Round (mul (div (float $width) $img.Width) $img.Height))) -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if $portrait -}}
|
||||
{{- $dim = partial "partials/image-portrait.html" (dict "dim" $dim) -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if $ratio -}}
|
||||
{{- $fallback = ($img.Fill (printf "%s jpg" $dim)) -}}
|
||||
{{- else -}}
|
||||
@@ -72,6 +124,7 @@
|
||||
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
|
||||
{{- $img := .img -}}
|
||||
{{- $ratio := .ratio -}}
|
||||
{{- $portrait := and .portrait .ratio -}}
|
||||
{{- $imgset := "" -}}
|
||||
|
||||
{{- $widths := slice "576" "768" "992" "1200" "1400" -}}
|
||||
@@ -79,6 +132,8 @@
|
||||
{{- with $img -}}
|
||||
{{- if eq $ratio "4x3" -}}
|
||||
{{- $dims = slice "576x432" "768x576" "992x744" "1200x900" "1400x1050" -}}
|
||||
{{- else if eq $ratio "3x2" -}}
|
||||
{{- $dims = slice "576x384" "768x512" "992x661" "1200x800" "1400x933" -}}
|
||||
{{- else if eq $ratio "1x1" -}}
|
||||
{{- $dims = slice "576x576" "768x768" "992x992" "1200x1200" "1400x1400" -}}
|
||||
{{- else if eq $ratio "16x9" -}}
|
||||
@@ -91,6 +146,10 @@
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if $portrait -}}
|
||||
{{- $dims = partial "partials/image-portrait.html" (dict "dim" $dims) -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $scaled := "" -}}
|
||||
{{- range $index, $dim := $dims -}}
|
||||
{{- $clean := path.Ext $img.RelPermalink -}}
|
||||
@@ -116,28 +175,41 @@
|
||||
{{- define "partials/image-definition.html" -}}
|
||||
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
|
||||
{{- $ratio := .ratio -}}
|
||||
{{- $portrait := .portrait -}}
|
||||
{{- $url := .url -}}
|
||||
{{- $outerClass := .outerClass -}}
|
||||
{{- $innerClass := .innerClass -}}
|
||||
{{- $title := .title -}}
|
||||
{{- $caption := .caption -}}
|
||||
{{- $fallbackURL := "" -}}
|
||||
{{- $anchor := "" -}}
|
||||
{{- $imgset := "" -}}
|
||||
{{- $mode := .mode -}}
|
||||
{{- $modes := .modes -}}
|
||||
{{- $page := .page -}}
|
||||
{{- $isVector := false -}}
|
||||
|
||||
{{- $segments := split $url "#" -}}
|
||||
{{- if gt (len $segments) 2 -}}
|
||||
{{- errorf "Invalid path or url: %q" $url -}}
|
||||
{{- else if eq (len $segments) 2 }}
|
||||
{{- $url = index $segments 0 -}}
|
||||
{{- $anchor = index $segments 1 -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if hasSuffix $url "svg" -}}
|
||||
{{- $fallbackURL = $url -}}
|
||||
{{- $isVector = true -}}
|
||||
{{- else -}}
|
||||
{{- $img := partial "utilities/GetImage.html" (dict "url" $url) -}}
|
||||
{{- $img := partial "utilities/GetImage.html" (dict "url" $url "page" $page) -}}
|
||||
{{- if $img -}}
|
||||
{{- $fallback := partial "partials/image-default.html" (dict "img" $img "ratio" $ratio) -}}
|
||||
{{- $fallback := partial "partials/image-default.html" (dict "img" $img "ratio" $ratio "portrait" $portrait) -}}
|
||||
{{- if $absoluteURL -}}
|
||||
{{- $fallbackURL = $fallback.Permalink -}}
|
||||
{{- else -}}
|
||||
{{- $fallbackURL = $fallback.RelPermalink -}}
|
||||
{{- end -}}
|
||||
{{- $imgset = partial "partials/image-scaled.html " (dict "img" $img "ratio" $ratio) -}}
|
||||
{{- $imgset = partial "partials/image-scaled.html " (dict "img" $img "ratio" $ratio "portrait" $portrait) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
@@ -150,7 +222,8 @@
|
||||
{{- if $caption -}}
|
||||
<figure {{ with $outerClass }}class="{{ . }}"{{ end }}>
|
||||
{{ end }}
|
||||
<div class="{{ with $ratio }}ratio ratio-{{ . }}{{ end }}{{ if not $caption }} {{ $outerClass }}{{ end }}">
|
||||
{{- if not $isVector -}}
|
||||
<div class="{{ if not $caption }}{{ $outerClass }}{{ end }}">
|
||||
<img class="img-fluid {{ $innerClass }}"
|
||||
{{ with $imgset -}}
|
||||
srcset="{{ . }}"
|
||||
@@ -159,10 +232,17 @@
|
||||
src="{{ $fallbackURL }}"
|
||||
alt="{{ $title }}">
|
||||
</div>
|
||||
{{ else }}
|
||||
<div class="{{ if not $caption }}{{ $outerClass }}{{ end }}">
|
||||
<svg class="{{ $innerClass }}">
|
||||
<use href="{{ $fallbackURL }}{{ with $anchor }}#{{ . }}{{ end }}"></use>
|
||||
</svg>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{- if $caption -}}
|
||||
<figcaption class="figure-caption">{{ $caption | safeHTML }}</figcaption>
|
||||
</figure>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
<!-- Initiate the regular or color-mode image -->
|
||||
@@ -177,22 +257,26 @@
|
||||
{{- $image := printf "%s-%s%s" $base $suffix $ext -}}
|
||||
{{- partial "partials/image-definition.html" (dict
|
||||
"ratio" $ratio
|
||||
"portrait" $portrait
|
||||
"url" $image
|
||||
"outerClass" $outerClass
|
||||
"innerClass" $innerClass
|
||||
"title" $title
|
||||
"caption" $caption
|
||||
"mode" $suffix
|
||||
"modes" $modes)
|
||||
"modes" $modes
|
||||
"page" $page)
|
||||
-}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
{{- partial "partials/image-definition.html" (dict
|
||||
"ratio" $ratio
|
||||
"portrait" $portrait
|
||||
"url" $url
|
||||
"outerClass" $outerClass
|
||||
"innerClass" $innerClass
|
||||
"title" $title
|
||||
"caption" $caption)
|
||||
"caption" $caption
|
||||
"page" $page)
|
||||
-}}
|
||||
{{- end -}}
|
||||
|
@@ -4,7 +4,7 @@
|
||||
including a color mode switcher, version switcher, and collapse panel.
|
||||
"page" Required object reference to the current page.
|
||||
"menus" Optional name of the menu configuration, defaults to "main".
|
||||
"size" Optional size of the button, either "sm", "md" (default), or "lg".
|
||||
"size" Optional breakpoint of the navbar toggler, either "xs", "sm", "md" (default), "lg", or "xl".
|
||||
"fixed" Optional flag to indicate the navbar should stick to the top, defaults to false.
|
||||
"color" Optional background color of the navbar, either "primary", "secondary", "success",
|
||||
"danger", "warning", "info", "white", "black", "body", or "body-tertiary". The default color is
|
||||
@@ -174,7 +174,32 @@
|
||||
{{- $enableLanguage := or $page.IsTranslated site.IsMultiLingual -}}
|
||||
|
||||
{{- $logo := site.Params.navigation.logo -}}
|
||||
{{- with .logo }}{{ $logo = . }}{{ end -}}
|
||||
{{- $logoLight := "" -}}
|
||||
{{- $logoDark := "" -}}
|
||||
{{- with .logo }}
|
||||
{{ $logo = . }}
|
||||
{{- end -}}
|
||||
{{- if $enableDarkMode -}}
|
||||
{{ $ext := path.Ext $logo -}}
|
||||
{{- $logoLight = printf "%s-light%s" (strings.TrimSuffix $ext $logo) $ext -}}
|
||||
{{- $logoDark = printf "%s-dark%s" (strings.TrimSuffix $ext $logo) $ext -}}
|
||||
{{- $light := fileExists (path.Join "/static" $logoLight) -}}
|
||||
{{- $dark := fileExists (path.Join "/static" $logoDark) -}}
|
||||
{{- if and $light (not $dark) -}}
|
||||
{{- warnf "partial [assets/navbar.html] - Missing file: %s" $logoDark -}}
|
||||
{{- $logoLight = "" -}}
|
||||
{{- $logoDark = "" -}}
|
||||
{{- end -}}
|
||||
{{- if and (not $light) $dark -}}
|
||||
{{- warnf "partial [assets/navbar.html] - Missing file: %s" $logoLight -}}
|
||||
{{- $logoLight = "" -}}
|
||||
{{- $logoDark = "" -}}
|
||||
{{- end -}}
|
||||
{{- if not (or $light $dark) -}}
|
||||
{{- $logoLight = "" -}}
|
||||
{{- $logoDark = "" -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $title := site.Title -}}
|
||||
{{- if .title -}}
|
||||
@@ -214,7 +239,10 @@
|
||||
|
||||
<!-- Insert the brand logo or name -->
|
||||
<a class="navbar-brand mx-auto" href="{{ site.Home.RelPermalink }}">
|
||||
{{- if $logo -}}
|
||||
{{- if (and $logoLight $logoDark) -}}
|
||||
<img src="{{if $absoluteURL }}{{ absURL $logoLight }}{{ else }}{{ $logoLight }}{{ end }}" class="d-none-dark" alt="{{ $title }} logo" height="30">
|
||||
<img src="{{if $absoluteURL }}{{ absURL $logoDark }}{{ else }}{{ $logoDark }}{{ end }}" class="d-none-light" alt="{{ $title }} logo" height="30">
|
||||
{{- else if $logo -}}
|
||||
<img src="{{if $absoluteURL }}{{ absURL $logo }}{{ else }}{{ $logo }}{{ end }}" alt="{{ $title }} logo" height="30">
|
||||
{{- else -}}
|
||||
<span class="fw-bold">{{ $title }}</span>
|
||||
|
@@ -5,27 +5,29 @@
|
||||
{{ warnf "DEPRECATED: parameter `Params.home.socialCaption` has been deprecated in release v0.18"}}
|
||||
{{ end }}
|
||||
|
||||
{{- $tab := site.Params.main.externalLinks.tab -}}
|
||||
<div class="container-fluid">
|
||||
<div class="row row-cols-1 row-cols-sm-4 bg-primary p-3 bg-opacity-{{ .Site.Params.style.themeOpacity | default "25" | safeHTML }} align-items-center">
|
||||
<div class="col col-md-2 d-none d-md-block"></div>
|
||||
<div class="col col-sm-6 col-md-4">
|
||||
{{ if gt .Site.Menus.social 0 }}
|
||||
<div class="fs-3 fw-bold">{{ or .Site.Params.footer.socialTitle .Site.Params.social.title }}</div>
|
||||
<p>{{ or .Site.Params.footer.socialCaption .Site.Params.social.caption }}</p>
|
||||
{{ end }}
|
||||
{{ if gt .Site.Menus.social 0 }}
|
||||
{{- $tab := site.Params.main.externalLinks.tab -}}
|
||||
<div class="container-fluid">
|
||||
<div class="row row-cols-1 row-cols-sm-4 bg-primary p-3 bg-opacity-{{ .Site.Params.style.themeOpacity | default "25" | safeHTML }} align-items-center">
|
||||
<div class="col col-md-2 d-none d-md-block"></div>
|
||||
<div class="col col-sm-6 col-md-4">
|
||||
{{ if gt .Site.Menus.social 0 }}
|
||||
<div class="fs-3 fw-bold">{{ or .Site.Params.footer.socialTitle .Site.Params.social.title }}</div>
|
||||
<p>{{ or .Site.Params.footer.socialCaption .Site.Params.social.caption }}</p>
|
||||
{{ end }}
|
||||
</div>
|
||||
<div class="col text-sm-start text-center col-sm-6 col-md-4">
|
||||
{{ range .Site.Menus.social -}}
|
||||
<a href="{{ .URL }}" {{ if $tab }} target="_blank" rel="noopener noreferrer"{{ end }} aria-label="{{ .Name | safeHTML }}" class="text-decoration-none link-secondary d-inline p-2">
|
||||
{{ if hasPrefix .Pre "<i" }}
|
||||
{{ .Pre | safeHTML }}
|
||||
{{ else }}
|
||||
{{ partial "assets/icon.html" (dict "icon" (printf "%s fa-2x" .Pre) )}}
|
||||
{{ end }}
|
||||
</a>
|
||||
{{ end -}}
|
||||
</div>
|
||||
<div class="col col-md-2 d-none d-md-block"></div>
|
||||
</div>
|
||||
<div class="col text-sm-start text-center col-sm-6 col-md-4">
|
||||
{{ range .Site.Menus.social -}}
|
||||
<a href="{{ .URL }}" {{ if $tab }} target="_blank" rel="noopener noreferrer"{{ end }} aria-label="{{ .Name | safeHTML }}" class="text-decoration-none link-secondary d-inline p-2">
|
||||
{{ if hasPrefix .Pre "<i" }}
|
||||
{{ .Pre | safeHTML }}
|
||||
{{ else }}
|
||||
{{ partial "assets/icon.html" (dict "icon" (printf "%s fa-2x" .Pre) )}}
|
||||
{{ end }}
|
||||
</a>
|
||||
{{ end -}}
|
||||
</div>
|
||||
<div class="col col-md-2 d-none d-md-block"></div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
@@ -2,10 +2,14 @@
|
||||
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
|
||||
{{ if .Site.Params.favicon.logo -}}
|
||||
{{ $favicon := resources.Get .Site.Params.favicon.logo -}}
|
||||
{{ range $i := .Site.Params.favicon.sizes -}}
|
||||
{{ $image := $favicon.Resize (printf "%dx%d CatmullRom" $i $i) -}}
|
||||
<link rel="icon" type="image/png" sizes="{{$i}}x{{$i}}" href="{{ if $absoluteURL }}{{ $image.Permalink }}{{ else }}{{ $image.RelPermalink }}{{ end }}">
|
||||
{{ end -}}
|
||||
{{ $image := $favicon.Resize "180x CatmullRom" -}}
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="{{ if $absoluteURL }}{{ $image.Permalink }}{{ else }}{{ $image.RelPermalink }}{{ end }}">
|
||||
{{- if $favicon -}}
|
||||
{{ range $i := .Site.Params.favicon.sizes -}}
|
||||
{{ $image := $favicon.Resize (printf "%dx%d CatmullRom" $i $i) -}}
|
||||
<link rel="icon" type="image/png" sizes="{{$i}}x{{$i}}" href="{{ if $absoluteURL }}{{ $image.Permalink }}{{ else }}{{ $image.RelPermalink }}{{ end }}">
|
||||
{{ end -}}
|
||||
{{ $image := $favicon.Resize "180x CatmullRom" -}}
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="{{ if $absoluteURL }}{{ $image.Permalink }}{{ else }}{{ $image.RelPermalink }}{{ end }}">
|
||||
{{ else }}
|
||||
{{- errorf "partial [head/favicon.html] - Cannot find file: %s" .Site.Params.favicon.logo -}}
|
||||
{{ end }}
|
||||
{{ end -}}
|
22
layouts/partials/utilities/GetArg.html
Normal file
22
layouts/partials/utilities/GetArg.html
Normal file
@@ -0,0 +1,22 @@
|
||||
<!--
|
||||
Retrieve the value from a given argument within the shortcode context. If a parent is set and merge is false, the
|
||||
value of the parent's argument is retrieved when the current context is unavailable. If merge is true, the parent's
|
||||
value is merged with the value of the shortcode context, separated by a single space.
|
||||
-->
|
||||
|
||||
{{ $page := .page -}}
|
||||
{{ $arg := .arg -}}
|
||||
{{ $merge := .merge -}}
|
||||
{{ $val := $page.Get $arg }}
|
||||
|
||||
{{- with $page.Parent -}}
|
||||
{{ with .Get $arg }}
|
||||
{{ if $merge }}
|
||||
{{ $val = trim (printf "%s %s" . $val) " " }}
|
||||
{{ else if not $val }}
|
||||
{{ $val = . }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{- end -}}
|
||||
|
||||
{{- return $val -}}
|
@@ -1,18 +1,28 @@
|
||||
<!--
|
||||
Retrieve a local or remote resource compatible with Hugo's image processing. The path of a remote image is
|
||||
rewritten to ensure processed files are stored in the final '/img' folder. The partial returns nil if the
|
||||
resource cannot be found or is incompatibile. The partial supports the following arguments:
|
||||
"url": Required path or url of the image, e.g. "img/example.jpg" or "https://example.com/img.jpg"
|
||||
Retrieve a local or remote resource compatible with Hugo's image processing. If the url starts with 'http', the
|
||||
image is retrieved from an external location. Else, the url is matched with a page resource and site asset (in that
|
||||
order). The path of a remote image is rewritten to ensure processed files are stored in the final '/img' folder. The
|
||||
partial returns nil if the resource cannot be found or is incompatibile. The partial supports the following
|
||||
arguments:
|
||||
"url" Required path or url of the image, e.g. "img/example.jpg" or "https://example.com/img.jpg"
|
||||
"page" Optional page context, used to retrieve an image from page resources.
|
||||
-->
|
||||
|
||||
{{ $url := .url -}}
|
||||
{{ $page := .page -}}
|
||||
|
||||
{{ $supportedMediaTypes := slice "image/png" "image/jpeg" "image/gif" "image/tiff" "image/bmp" "image/webp" -}}
|
||||
{{ $img := "" }}
|
||||
{{ $remote := hasPrefix (lower $url) "http" }}
|
||||
{{ if $remote }}
|
||||
{{ $img = resources.GetRemote $url -}}
|
||||
{{ else }}
|
||||
{{ $img = resources.GetMatch $url -}}
|
||||
{{ if $page }}
|
||||
{{ $img = $page.Resources.Get $url -}}
|
||||
{{ end }}
|
||||
{{ if not $img }}
|
||||
{{ $img = resources.GetMatch $url }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ with $img -}}
|
||||
|
13
layouts/partials/utilities/ProcessContent.html
Normal file
13
layouts/partials/utilities/ProcessContent.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<!--
|
||||
Purges any HTML comments from raw content, if applicable. The partial supports the following arguments:
|
||||
"page" Required page context, used to render shortcodes properly.
|
||||
"raw" Raw page content, e.g. .Page.RawContent.
|
||||
-->
|
||||
|
||||
{{ $page := .page -}}
|
||||
{{ $raw := .raw -}}
|
||||
{{- if site.Params.debugging.purgeHTMLComments -}}
|
||||
{{- $raw = replaceRE "<!--(.|\n)*?-->" "" $raw -}}
|
||||
{{- end -}}
|
||||
{{ $content := $raw | $page.RenderString | safeHTML }}
|
||||
{{ return $content }}
|
@@ -9,24 +9,16 @@
|
||||
{{- $cue := .cue | default site.Params.main.externalLinks.cue -}}
|
||||
{{- $tab := .tab | default site.Params.main.externalLinks.tab -}}
|
||||
{{- $isExternal := ne (urls.Parse (absURL $destination)).Host (urls.Parse site.BaseURL).Host -}}
|
||||
|
||||
{{ $text := .text }}
|
||||
{{- if not $text -}}
|
||||
{{ if $isExternal }}
|
||||
{{ $text = (urls.Parse (absURL $destination)).Host }}
|
||||
{{ else }}
|
||||
{{ $target := site.GetPage $destination }}
|
||||
{{ if not $target }}
|
||||
{{- errorf "partial [utilities/link.html] - Cannot find page: %s" $destination -}}
|
||||
{{ else }}
|
||||
{{ $text = $target.Title }}
|
||||
{{ if not $case }}{{ $text = lower $text }}{{ end }}
|
||||
{{ $destination = $target.RelPermalink }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{- end -}}
|
||||
{{- $page := .page -}}
|
||||
{{- $anchor := "" -}}
|
||||
{{- $text := .text -}}
|
||||
{{- $class := .class -}}
|
||||
|
||||
{{- if $isExternal -}}
|
||||
{{- if not $text -}}
|
||||
{{- $text = (urls.Parse (absURL $destination)).Host -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if $tab -}}
|
||||
{{- $target = "_blank" -}}
|
||||
{{- $rel = "noopener noreferrer" -}}
|
||||
@@ -36,10 +28,45 @@
|
||||
{{ $suffix := partial "assets/icon.html" (dict "icon" "fas up-right-from-square fa-2xs") }}
|
||||
{{- $text = printf "%s %s" $text $suffix | safeHTML -}}
|
||||
{{- end -}}
|
||||
{{ else }}
|
||||
{{ $destination = relLangURL $destination }}
|
||||
{{- else -}}
|
||||
{{- if strings.Contains $destination "#" }}
|
||||
{{ $segments := split $destination "#" }}
|
||||
{{- if ne (len $segments) 2 }}
|
||||
{{- errorf "partial [utilities/link.html] - Malformed path, expected one anchor '#' only: %s" $destination -}}
|
||||
{{ else }}
|
||||
{{- $destination = index $segments 0 -}}
|
||||
{{- $anchor = index $segments 1 -}}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{- $destination = strings.TrimSuffix "/" $destination -}}
|
||||
{{- $ref := $page.GetPage $destination -}}
|
||||
|
||||
{{- if not $ref }}
|
||||
{{- $segments := split $destination "/" -}}
|
||||
{{- if and (hasPrefix $destination "/") (gt (len $segments) 1) -}}
|
||||
{{- $prefix := index $segments 1 -}}
|
||||
{{- $page := .Page -}}
|
||||
{{ with index (where site.Sites "Language.Lang" $prefix) 0 }}
|
||||
{{- $path := printf "/%s" (strings.TrimPrefix (printf "/%s/" $prefix) $destination) }}
|
||||
{{- $ref = .GetPage $path -}}
|
||||
{{ end }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if not $ref -}}
|
||||
{{- errorf "partial [utilities/link.html] - Cannot find page: %s" $destination -}}
|
||||
{{- else -}}
|
||||
{{- $destination = $ref.RelPermalink -}}
|
||||
{{- with $anchor }}{{ $destination = printf "%s#%s" (strings.TrimSuffix "/" $destination) . -}}{{ end -}}
|
||||
{{- if not $text -}}
|
||||
{{- if $anchor -}}
|
||||
{{- $text = $anchor -}}
|
||||
{{- else -}}
|
||||
{{- $text = $ref.LinkTitle -}}
|
||||
{{- end -}}
|
||||
{{ end -}}
|
||||
{{- if not $case }}{{ $text = lower $text }}{{ end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $class := .class -}}
|
||||
|
||||
<a {{ with $class }}class="{{ . }}" {{ end }}href="{{ $destination | safeURL }}"{{ with $target }} target="{{ . }}"{{ end }}{{ with $rel }} rel="{{ . }}"{{ end }}>{{ $text }}</a>
|
@@ -50,6 +50,6 @@
|
||||
</h2>
|
||||
{{- end -}}
|
||||
<div id="{{ $parent }}-item-{{ $id }}" class="accordion-collapse collapse{{ if $show }} show{{ end }}{{ with $class }} {{ . }}{{ end }}" aria-labelledby="{{ $parent }}-heading-{{ $id }}" data-bs-parent="#{{ $parent }}">
|
||||
<div class="accordion-body">{{ $body | markdownify | safeHTML }}</div>
|
||||
<div class="accordion-body">{{ $body | .Page.RenderString | safeHTML }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -26,7 +26,7 @@
|
||||
{{- $body := .Inner -}}
|
||||
{{- if $open -}}
|
||||
{{- $pattern := printf "data-bs-parent=\"#%s\"" $id -}}
|
||||
{{- $body = (replace .Inner $pattern "") | markdownify | safeHTML }}
|
||||
{{- $body = (replace .Inner $pattern "") | .Page.RenderString | safeHTML }}
|
||||
{{- end -}}
|
||||
|
||||
<div id="{{ $id }}" class="accordion mb-3{{ with $class }} {{ . }}{{ end }}">
|
||||
|
@@ -55,7 +55,7 @@
|
||||
<div class="d-flex alert alert-{{ $color }} {{ if $dismissible }}alert-dismissible fade show{{ end }}{{ with $class }} {{ . }}{{ end }}" role="alert">
|
||||
{{ with $icon }}<div class="pt-1 pe-2">{{ . }}</div>{{ end }}
|
||||
<div class="flex-grow-1 my-auto">
|
||||
{{ trim .Inner " \r\n" | markdownify | safeHTML -}}
|
||||
{{ trim .Inner " \r\n" | .Page.RenderString | safeHTML -}}
|
||||
{{ if $dismissible }}<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
|
50
layouts/shortcodes/card-group.html
Normal file
50
layouts/shortcodes/card-group.html
Normal file
@@ -0,0 +1,50 @@
|
||||
<!--
|
||||
Displays a grid of Bootstrap cards with 1 to 5 columns. The cards are rendered using a provided list of pages.
|
||||
Cards on the same row are aligned to each other. The grid renders pages up to a provided maximum amount. The
|
||||
remaining items are accessible via either a paginator or button to a list page (default behavior). Be aware a page
|
||||
can only contain one paginator at a time.
|
||||
|
||||
The shortcode supports the following arguments:
|
||||
"cols" Required number of columns for the grid, must be a value between 1 and 5.
|
||||
"title" Optional title of the card group.
|
||||
"separator" Optional flag to indicate a horizontal line should be added between items on small screens.
|
||||
"gutter" Gutter between columns in a group, either "0", "1", "2", "3" (default), "4", or "5".
|
||||
|
||||
In addition, the following arguments are passed to the individual cards.
|
||||
"class" Optional class attribute of the card element, e.g. “w-50”.
|
||||
"color": Optional theme color of the card, either "primary", "secondary", "success", "danger",
|
||||
"warning", "info", "light", "dark", or "body". By default, no color is specified.
|
||||
"padding": Optional padding of the content, either "0", "1", "2", "3" (default), "4", "5", or "auto".
|
||||
"header" Optional header components of the card, displayed in small caps. Supported values are "full"
|
||||
(default), "publication", "tags", and "none".
|
||||
"footer" Optional footer components of the card, displayed in small caps. Supported values are "full",
|
||||
"publication", "tags", and "none" (default).
|
||||
"orientation" Optional placecement of the thumbnail, either "stacked" (default), "horizontal", or "none".
|
||||
-->
|
||||
|
||||
{{- $cols := 3 -}}
|
||||
{{ with .Get "cols" }}{{ $cols = int . }}{{ end -}}
|
||||
{{- $title := .Get "title" -}}
|
||||
{{- $separator := .Get "separator" -}}
|
||||
{{- $class := .Get "class" -}}
|
||||
{{- $wrapper := .Get "wrapper" -}}
|
||||
{{- $color := .Get "color" -}}
|
||||
{{- $padding := .Get "padding" | default "3" -}}
|
||||
{{- $header := .Get "header" -}}
|
||||
{{- $footer := .Get "footer" -}}
|
||||
{{- $orientation := .Get "orientation" -}}
|
||||
|
||||
{{- partial "assets/card-group.html" (dict
|
||||
"page" .Page
|
||||
"cards" .Inner
|
||||
"cols" $cols
|
||||
"title" $title
|
||||
"separator" $separator
|
||||
"class" $class
|
||||
"color" $color
|
||||
"padding" $padding
|
||||
"header" $header
|
||||
"footer" $footer
|
||||
"orientation" $orientation
|
||||
)
|
||||
-}}
|
@@ -1,31 +1,37 @@
|
||||
<!--
|
||||
Displays a Bootstrap card that links to a page. The shortcode supports the following arguments:
|
||||
"path" Required path of the page.
|
||||
Displays a Bootstrap card that links to a page. Any inner text is used as description The shortcode supports the
|
||||
following arguments:
|
||||
"path" Optional path of the page.
|
||||
"class" Optional class attribute of the card element, e.g. “w-50”.
|
||||
"color": Optional theme color of the card, either "primary", "secondary", "success", "danger",
|
||||
"color" Optional theme color of the card, either "primary", "secondary", "success", "danger",
|
||||
"warning", "info", "light", "dark", "white", "black", "body", or "body-tertiary". By default, no
|
||||
color is specified.
|
||||
"padding": Optional padding of the content, either "0", "1", "2", "3", "4", "5", or "auto" (default).
|
||||
"padding" Optional padding of the content, either "0", "1", "2", "3", "4", "5", or "auto" (default).
|
||||
"gutter" Gutter between columns in a group, either "0", "1", "2", "3" (default), "4", or "5".
|
||||
"header" Optional header components of the card, displayed in small caps. Supported values are "full"
|
||||
(default), "publication", "tags", and "none".
|
||||
"footer" Optional footer components of the card, displayed in small caps. Supported values are "full",
|
||||
"publication", "tags", and "none" (default).
|
||||
"orientation" Optional placecement of the thumbnail, either "stacked" (default), "horizontal", or "none".
|
||||
"thumbnail" Optional thumbnail image url, displayed on top or the left of the card.
|
||||
"icon" Optional Font Awesome icon, displayed on top or the left of the card.
|
||||
-->
|
||||
|
||||
{{ $error := false }}
|
||||
|
||||
{{ $path := .Get "path" }}
|
||||
{{ $page := .Site.GetPage $path }}
|
||||
{{ if not $page }}
|
||||
{{ errorf "Invalid or missing value for param 'path': %s" .Position -}}
|
||||
{{ $error = true }}
|
||||
{{ $page := .Page }}
|
||||
{{ with $path }}
|
||||
{{ $page = $.Site.GetPage $path }}
|
||||
{{ if not $page }}
|
||||
{{ errorf "Invalid or missing value for param 'path': %s" .Position -}}
|
||||
{{ $error = true }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ $class := .Get "class" }}
|
||||
{{- $class := partial "utilities/GetArg" (dict "page" . "arg" "class" "merge" true) -}}
|
||||
|
||||
{{ $color := "" -}}
|
||||
{{ with .Get "color" }}{{ $color = . }}{{ end -}}
|
||||
{{- $color := partial "utilities/GetArg" (dict "page" . "arg" "color") -}}
|
||||
{{ if $color }}
|
||||
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" "body-tertiary" -}}
|
||||
{{ if not (in $supportedColors $color) -}}
|
||||
@@ -34,43 +40,64 @@
|
||||
{{ end -}}
|
||||
{{ end -}}
|
||||
|
||||
{{ $header := "full" }}
|
||||
{{ with .Get "header" }}{{ $header = . }}{{ end -}}
|
||||
{{- $header := partial "utilities/GetArg" (dict "page" . "arg" "header") | default "full" -}}
|
||||
{{ $supportedKeywords := slice "full" "publication" "tags" "none" -}}
|
||||
{{ if not (in $supportedKeywords $header) -}}
|
||||
{{ errorf "Invalid value for param 'header': %s" .Position -}}
|
||||
{{ end -}}
|
||||
|
||||
{{ $footer := "none" }}
|
||||
{{ with .Get "footer" }}{{ $footer = . }}{{ end -}}
|
||||
{{- $footer := partial "utilities/GetArg" (dict "page" . "arg" "footer") | default "none" -}}
|
||||
{{ if not (in $supportedKeywords $footer) -}}
|
||||
{{ errorf "Invalid value for param 'footer': %s" .Position -}}
|
||||
{{ end -}}
|
||||
|
||||
{{ $padding := "auto" }}
|
||||
{{ with .Get "padding" }}{{ $padding = . }}{{ end -}}
|
||||
{{- $padding := partial "utilities/GetArg" (dict "page" . "arg" "padding") | default "auto" -}}
|
||||
{{ $supportedPaddings := slice "0" "1" "2" "3" "4" "5" "auto" -}}
|
||||
{{ if not (in $supportedPaddings $padding) -}}
|
||||
{{ errorf "Invalid value for param 'padding': %s" .Position -}}
|
||||
{{ $error = true -}}
|
||||
{{ end -}}
|
||||
|
||||
{{ $orientation := "stacked" -}}
|
||||
{{ with .Get "orientation" }}{{ $orientation = . }}{{ end -}}
|
||||
{{- $gutter := partial "utilities/GetArg" (dict "page" . "arg" "gutter") | default "3" -}}
|
||||
{{ $supportedGutters:= slice "0" "1" "2" "3" "4" "5" -}}
|
||||
{{ if not (in $supportedGutters $gutter) -}}
|
||||
{{ errorf "Invalid value for param 'gutter': %s" .Position -}}
|
||||
{{ $error = true -}}
|
||||
{{ end -}}
|
||||
|
||||
{{- $orientation := partial "utilities/GetArg" (dict "page" . "arg" "orientation") | default "stacked" -}}
|
||||
{{ $supportedOrientations := slice "stacked" "horizontal" "none" -}}
|
||||
{{ if not (in $supportedOrientations $orientation) -}}
|
||||
{{ errorf "Invalid value for param 'orientation': %s" .Position -}}
|
||||
{{ $error = true -}}
|
||||
{{ end -}}
|
||||
|
||||
{{ $layout := "rich" -}}
|
||||
{{ with .Get "layout" }}{{ $layout = . }}{{ end -}}
|
||||
{{- $layout := partial "utilities/GetArg" (dict "page" . "arg" "layout") | default "rich" -}}
|
||||
{{ $supportedLayouts := slice "rich" "minimal" -}}
|
||||
{{ if not (in $supportedLayouts $layout) -}}
|
||||
{{ errorf "Invalid value for param 'layout': %s" .Position -}}
|
||||
{{ $error = true -}}
|
||||
{{ end -}}
|
||||
|
||||
{{ $description := .Inner }}
|
||||
{{ $title := .Get "title" }}
|
||||
{{ $icon := .Get "icon" }}
|
||||
{{ $thumbnail := .Get "thumbnail" }}
|
||||
|
||||
{{ if not $error -}}
|
||||
{{- partial "assets/card.html" (dict "path" $path "class" $class "color" $color "padding" $padding "header" $header "footer" $footer "orientation" $orientation) -}}
|
||||
<div class="g-{{ $gutter }}">
|
||||
{{- partial "assets/card.html" (dict
|
||||
"path" $path
|
||||
"title" $title
|
||||
"class" (printf "h-100 %s" $class)
|
||||
"color" $color
|
||||
"padding" $padding
|
||||
"header" $header
|
||||
"footer" $footer
|
||||
"orientation" $orientation
|
||||
"description" $description
|
||||
"icon" $icon
|
||||
"thumbnail" $thumbnail
|
||||
) -}}
|
||||
</div>
|
||||
{{ end -}}
|
@@ -2,8 +2,10 @@
|
||||
Displays a carousel of several responsive images (see the image shortcode for more details). Add inner <img>
|
||||
elements to define individual image slides. The shortcode supports the following arguments:
|
||||
"id": Optional id of the carousel, defaults to "carousel-" with a sequential number.
|
||||
"ratio": Optional ratio of the image, either "1x1", "4x3", "16x9", or "21x9". Other values are ignored.
|
||||
"ratio": Optional ratio of the images, either "1x1", "4x3", "16x9", or "21x9". Other values are ignored.
|
||||
Instead, the original aspect ratio of the image is preserved.
|
||||
"portrait": Optional flag to adjust the ratio from landscape to portrait. The images themselves are not rotated,
|
||||
only the crop area is adjusted.
|
||||
"class": Optional class attribute of the carousel element, e.g. “w-75”.
|
||||
-->
|
||||
|
||||
@@ -12,7 +14,6 @@
|
||||
{{ $id = . }}
|
||||
{{ end }}
|
||||
|
||||
{{ $ratio := .Get "ratio" -}}
|
||||
{{ $class := .Get "class" -}}
|
||||
{{ $images := .Inner -}}
|
||||
{{ $items := len (findRE "carousel-item" $images) -}}
|
||||
|
@@ -21,7 +21,7 @@
|
||||
|
||||
{{ $preprocess := slice "hugo" "markdown" }}
|
||||
{{- if in $preprocess $lang -}}
|
||||
{{- $content = (trim $content "\r\n") | markdownify }}
|
||||
{{- $content = (trim $content "\r\n") | .Page.RenderString }}
|
||||
{{ $lang = "markdown" }}
|
||||
{{- end -}}
|
||||
|
||||
|
@@ -4,8 +4,11 @@
|
||||
section of the main config file (defaults to 75). A fallback image is provided for older browsers. The partial
|
||||
supports the following arguments:
|
||||
"src": Required relative url of the image, e.g. "img/example.jpg"
|
||||
"ratio": Optional ratio of the image, either "1x1", "4x3", "16x9", or "21x9". Leave empty to keep the
|
||||
"ratio": Optional ratio of the image, either "1x1", "3x2", "4x3", "16x9", or "21x9". Leave empty to keep the
|
||||
original aspect ratio of the image.
|
||||
"portrait": Optional flag to adjust the ratio from landscape to portrait. The image itself is not rotated, only
|
||||
the crop area is adjusted.
|
||||
"wrapper": Optional class attributes of the wrapper element, e.g. "mx-auto".
|
||||
"class": Optional class attribute of the inner img element, e.g. "rounded".
|
||||
"title": Optional alternate text of the image.
|
||||
"caption": Optional figure caption.
|
||||
@@ -14,7 +17,7 @@
|
||||
|
||||
{{- if isset .Params "src" -}}
|
||||
{{ $url := .Get "src" -}}
|
||||
{{- $validRatios := slice "1x1" "4x3" "16x9" "21x9" -}}
|
||||
{{- $validRatios := slice "1x1" "3x2" "4x3" "16x9" "21x9" -}}
|
||||
{{ $ratio := .Get "ratio" -}}
|
||||
{{ if $ratio -}}
|
||||
{{ if not (in $validRatios $ratio) -}}
|
||||
@@ -23,6 +26,7 @@
|
||||
{{ end -}}
|
||||
|
||||
{{- $class := .Get "class" -}}
|
||||
{{- $wrapper := .Get "wrapper" -}}
|
||||
{{ $title := .Get "title" -}}
|
||||
{{ $caption := .Get "caption" -}}
|
||||
{{ $supportedFlags := slice "true" "false" -}}
|
||||
@@ -34,14 +38,25 @@
|
||||
{{ else -}}
|
||||
{{ errorf "Invalid value for param 'mode': %s" $modeParam -}}
|
||||
{{ end -}}
|
||||
{{ $portraitParam := "false" -}}
|
||||
{{ $portrait := false -}}
|
||||
{{ with .Get "portrait" }}{{ $portraitParam = . }}{{ end -}}
|
||||
{{ if in $supportedFlags $portraitParam -}}
|
||||
{{ if eq $portraitParam "true" }}{{ $portrait = true }}{{ else }}{{ $portrait = false }}{{ end -}}
|
||||
{{ else -}}
|
||||
{{ errorf "Invalid value for param 'portrait': %s" $portraitParam -}}
|
||||
{{ end -}}
|
||||
|
||||
{{- partial "assets/image.html" (dict
|
||||
"url" $url
|
||||
"ratio" $ratio
|
||||
"outerClass" $wrapper
|
||||
"innerClass" $class
|
||||
"title" $title
|
||||
"caption" $caption
|
||||
"mode" $mode)
|
||||
"mode" $mode
|
||||
"portrait" $portrait
|
||||
"page" .Page)
|
||||
-}}
|
||||
{{ else -}}
|
||||
{{ errorf "Missing value for param 'src': %s" .Position -}}
|
||||
|
@@ -2,8 +2,10 @@
|
||||
Renders a carousel item with a responsive image (see the image shortcode for more details). The shortcode
|
||||
supports the following arguments:
|
||||
"src": Required relative url of the image, e.g. "img/example.jpg"
|
||||
"ratio": Optional ratio of the image, either "1x1", "4x3", "16x9", or "21x9". Other values are ignored.
|
||||
Instead, the original aspect ratio of the image is preserved.
|
||||
"ratio": Optional ratio of the image, either "1x1", "3x2", "4x3", "16x9", or "21x9". Other values are
|
||||
ignored. Instead, the original aspect ratio of the image is preserved.
|
||||
"portrait": Optional flag to adjust the ratio from landscape to portrait. The image itself is not rotated, only
|
||||
the crop area is adjusted.
|
||||
"caption": Optional carousel slide caption.
|
||||
-->
|
||||
|
||||
@@ -15,10 +17,16 @@
|
||||
{{ else }}
|
||||
{{ with .Get "ratio" }}{{ $ratio = . }}{{ end -}}
|
||||
{{ end -}}
|
||||
{{- $portrait := false -}}
|
||||
{{ with .Parent -}}
|
||||
{{ with .Get "portrait" }}{{ $portrait = . }}{{ end -}}
|
||||
{{ else }}
|
||||
{{ with .Get "portrait" }}{{ $portrait = . }}{{ end -}}
|
||||
{{ end -}}
|
||||
|
||||
{{- if $src -}}
|
||||
<div class="carousel-item {{ if eq .Ordinal 0 }}active{{ end }}">
|
||||
{{ partial "assets/image.html" (dict "url" $src "ratio" $ratio "innerClass" "d-block w-100") }}
|
||||
{{ partial "assets/image.html" (dict "url" $src "ratio" $ratio "page" .Page "innerClass" "d-block w-100" "portrait" $portrait) }}
|
||||
<div class="carousel-caption gradient"></div>
|
||||
{{ with $caption }}
|
||||
<div class="carousel-caption d-none d-md-block">
|
||||
|
@@ -1,12 +1,14 @@
|
||||
<!--
|
||||
Generates a link for a given named link or url. The shortcode supports a single unnamed parameter, or various named
|
||||
parameters. The unnamed parameter is recognized as a named link if it does not contain any "/", otherwise it is
|
||||
treated as a url. Any inner text is rendered as the link title, otherwise it uses the host name (for external links)
|
||||
or page name (for internal links). The shortcode supports the following named arguments:
|
||||
"name" Optional name of the link maintained in the "links" section of the site's parameters. If omitted,
|
||||
the "url" argument should be provided instead.
|
||||
"url" Optional url of the link, including the scheme ("http" or "https"). If omitted, the "name" argument
|
||||
should be provided instead.
|
||||
parameters. The unnamed parameter is recognized as a url if it starts with "http", else it is treated as either a
|
||||
named link or internal reference (in that order). Any inner text is rendered as the link title, otherwise it uses
|
||||
the host name (for external links), link title (for internal links), or anchor name (for any local references
|
||||
containing a `#`). The shortcode supports the following named arguments:
|
||||
"href" Required reference to either an external link (if it starts with http), a named link (if it can be
|
||||
found in params.links), or internal reference. External and internal references may include an
|
||||
anchor "#".
|
||||
"name" Alias of href.
|
||||
"url" Alias of href.
|
||||
"cue" Optional flag to indicate if an external link should show a visual cue, defaults to setting
|
||||
"main.externalLinks.cue" in the site's parameters.
|
||||
"tab" Optional flag to indicate if an external link should open in a new tab, defaults to setting
|
||||
@@ -17,42 +19,92 @@
|
||||
-->
|
||||
|
||||
{{- $error := false -}}
|
||||
{{ $href := "" }}
|
||||
{{ $name := "" }}
|
||||
{{ $url := "" }}
|
||||
{{ $class := "" }}
|
||||
{{ $case := true }}
|
||||
{{ $cue := site.Params.main.externalLinks.cue }}
|
||||
{{ $tab := site.Params.main.externalLinks.tab }}
|
||||
{{ $text := trim .Inner " \r\n" | .Page.RenderString | safeHTML }}
|
||||
{{- $anchor := "" -}}
|
||||
|
||||
{{ if .IsNamedParams }}
|
||||
{{ $href = .Get "href" }}
|
||||
{{ $name = .Get "name" }}
|
||||
{{ $url = .Get "url" }}
|
||||
{{ $cue = .Get "cue" | default site.Params.main.externalLinks.cue }}
|
||||
{{ $tab = .Get "tab" | default site.Params.main.externalLinks.tab }}
|
||||
{{ $case = .Get "case" | default true }}
|
||||
{{ else if strings.Contains (.Get 0) "/" }}
|
||||
{{ $url = .Get 0 }}
|
||||
{{- $class := .Get "class" -}}
|
||||
{{ else }}
|
||||
{{ $name = .Get 0 }}
|
||||
{{ $href = .Get 0 }}
|
||||
{{ end }}
|
||||
|
||||
{{ if not (or $name $url) }}
|
||||
{{ errorf "Expected param 'name' or 'url': %s" .Position -}}
|
||||
{{- $href = or (or $href $name) $url -}}
|
||||
{{ if not $href }}
|
||||
{{ errorf "Expected param 'href': %s" .Position -}}
|
||||
{{ $error = true -}}
|
||||
{{ end }}
|
||||
|
||||
{{ if $name }}
|
||||
{{ $url = index site.Params.links $name }}
|
||||
{{ if not $url }}
|
||||
{{ errorf "Cannot find link '%s': %s" $name .Position -}}
|
||||
{{ $error = true -}}
|
||||
{{- if hasPrefix $href "http" -}}
|
||||
{{ $url = $href }}
|
||||
{{- else if not (strings.Contains $href "/") -}}
|
||||
{{ $url = index site.Params.links $href }}
|
||||
{{- end -}}
|
||||
|
||||
{{ if not $url }}
|
||||
{{- $href = strings.TrimPrefix "./" $href -}}
|
||||
{{- if strings.Contains $href "#" }}
|
||||
{{ $segments := split $href "#" }}
|
||||
{{- if ne (len $segments) 2 }}
|
||||
{{ errorf "Malformed path, expected one anchor '#' only: '%s' at %s" $href .Position -}}
|
||||
{{ else }}
|
||||
{{- $url = index $segments 0 -}}
|
||||
{{- $anchor = index $segments 1 -}}
|
||||
{{ if not $url }}
|
||||
{{- $url = strings.TrimSuffix "/" .Page.RelPermalink -}}
|
||||
{{- with .Page.Language }}{{ $url = strings.TrimPrefix (path.Join "/" .Lang) $url}}{{ end -}}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ else }}
|
||||
{{- $url = $href -}}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ $text := trim .Inner " \r\n" | markdownify | safeHTML }}
|
||||
{{- $isExternal := ne (urls.Parse (absURL $url)).Host (urls.Parse site.BaseURL).Host -}}
|
||||
{{- if not $isExternal -}}
|
||||
{{- $url = strings.TrimSuffix "/" $url -}}
|
||||
|
||||
{{- $class := .Get "class" -}}
|
||||
{{- $ref := "" -}}
|
||||
{{- if not $ref -}}
|
||||
{{- $ref = .Page.GetPage $url -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if not $error -}}
|
||||
{{ partial "utilities/link.html" (dict "destination" $url "text" $text "cue" $cue "tab" $tab "case" $case "class" $class) }}
|
||||
{{- if not $ref }}
|
||||
{{- $segments := split $url "/" -}}
|
||||
{{- if and (hasPrefix $url "/") (gt (len $segments) 1) -}}
|
||||
{{- $prefix := index $segments 1 -}}
|
||||
{{- $page := .Page -}}
|
||||
{{ with index (where site.Sites "Language.Lang" $prefix) 0 }}
|
||||
{{- $path := printf "/%s" (strings.TrimPrefix (printf "/%s/" $prefix) $url) }}
|
||||
{{- $ref = .GetPage $path -}}
|
||||
{{ end }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if not $ref -}}
|
||||
{{- errorf "Cannot find page: '%s' at %s" $href .Position -}}
|
||||
{{- $error = true -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{ with $anchor }}
|
||||
{{ $url = printf "%s#%s" $url .}}
|
||||
{{ end }}
|
||||
{{- if not $error -}}
|
||||
{{ partial "utilities/link.html" (dict "destination" $url "text" $text "cue" $cue "tab" $tab "case" $case "class" $class "page" .Page) }}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
|
||||
|
@@ -50,5 +50,5 @@
|
||||
<div class="tab-pane{{ if $show }} active {{ if $fade}}show{{ end }}{{ end }} {{ if $fade}}fade{{ end }}" id="{{ $parent }}-{{ $id }}"
|
||||
role="tabpanel" aria-labelledby="{{ $parent }}-btn-{{ $id }}" tabindex="0" data-header="{{ $header }}" {{ if $show }}data-show-id="{{ $id }}"{{ end }}
|
||||
data-has-content="{{ gt (len $body) 0 }}" {{ if $disabled }} data-disabled-id="{{ $id }}"{{ end }}>
|
||||
{{ $body | markdownify | safeHTML }}
|
||||
{{ $body | .Page.RenderString | safeHTML }}
|
||||
</div>
|
||||
|
@@ -8,7 +8,7 @@
|
||||
{{ $responsive = (slice "table-responsive") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $input := .Inner | markdownify }}
|
||||
{{- $input := .Inner | .Page.RenderString }}
|
||||
{{- $input = replace $input "style=\"text-align:left\"" "class=\"text-start\"" -}}
|
||||
{{- $input = replace $input "style=\"text-align:center\"" "class=\"text-center\"" -}}
|
||||
{{- $input = replace $input "style=\"text-align:right\"" "class=\"text-end\"" -}}
|
||||
|
@@ -79,7 +79,7 @@
|
||||
{{ $datestr := (partial "utilities/date.html" (dict "date" $date "format" "long")) -}}
|
||||
<p class="mb-0"><small class="text-body-secondary text-uppercase">{{ $datestr -}}</small></p>
|
||||
{{ end }}
|
||||
<p class="mt-3 mb-0">{{ $content | markdownify }}</p>
|
||||
<p class="mt-3 mb-0">{{ $content | .Page.RenderString }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -13,7 +13,7 @@
|
||||
{{ .Count }} {{ if gt .Count 1 }} {{ T "articles" }} {{ else }} {{ T "article" }} {{ end }}
|
||||
</div>
|
||||
<div class="col">
|
||||
<a href="{{ (path.Join .Page.RelPermalink) | relLangURL }}">{{ .Name | markdownify }}</a>
|
||||
<a href="{{ (path.Join .Page.RelPermalink) | relLangURL }}">{{ .Name | .Page.RenderString }}</a>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
@@ -34,7 +34,7 @@
|
||||
<p class="text-body-secondary mt-5">{{ $year }}</p>
|
||||
{{ $.Scratch.Set "lastYear" $year }}
|
||||
{{ end }}
|
||||
<a href="{{ (path.Join .Page.RelPermalink) | relLangURL }}">{{ if .Draft }}{{ T "draft" | upper }}: {{end}}{{ .Title | markdownify }}</a>
|
||||
<a href="{{ (path.Join .Page.RelPermalink) | relLangURL }}">{{ if .Draft }}{{ T "draft" | upper }}: {{end}}{{ .Title | .Page.RenderString }}</a>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
1058
package-lock.json
generated
1058
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
75
package.json
75
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@gethinode/hinode",
|
||||
"version": "0.18.2",
|
||||
"version": "0.18.6",
|
||||
"description": "Hinode is a clean documentation and blog theme for Hugo, an open-source static site generator",
|
||||
"keywords": [
|
||||
"hugo",
|
||||
@@ -17,42 +17,43 @@
|
||||
"registry": "https://registry.npmjs.org/"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "hugo server --bind=0.0.0.0 --disableFastRender --printI18nWarnings",
|
||||
"start:example": "hugo server --bind=0.0.0.0 --disableFastRender --printI18nWarnings -s exampleSite",
|
||||
"start:prod": "hugo server --bind=0.0.0.0 --disableFastRender --printI18nWarnings -e production",
|
||||
"prebuild": "npm run clean:public && npm run -s mod:install",
|
||||
"build": "hugo --gc --minify",
|
||||
"build:example": "npm run -s prebuild && hugo --gc --minify -s exampleSite",
|
||||
"build:debug": "hugo -e debug --debug",
|
||||
"build:preview": "npm run build -D -F",
|
||||
"clean:public": "rimraf public",
|
||||
"clean:install": "rimraf package-lock.json node_modules",
|
||||
"lint": "npm run -s lint:scripts && npm run -s lint:styles && npm run -s lint:markdown",
|
||||
"lint:scripts": "eslint assets/js",
|
||||
"lint:styles": "stylelint \"assets/scss/**/*.{css,sass,scss,sss,less}\"",
|
||||
"lint:markdown": "markdownlint-cli2 \"*.md\" \"content/**/*.md\" \"exampleSite/**/*.md\"",
|
||||
"lint:markdown-fix": "markdownlint-cli2-fix \"*.md\" \"content/**/*.md\" \"exampleSite/**/*.md\"",
|
||||
"mod:clean": "hugo mod clean",
|
||||
"mod:install": "hugo mod get ./... && npm run -s mod:vendor && npm run -s mod:tidy",
|
||||
"mod:update": "hugo mod get -u ./... && npm run -s mod:vendor && npm run -s mod:tidy",
|
||||
"mod:tidy": "hugo mod tidy",
|
||||
"mod:vendor": "rimraf _vendor && hugo mod vendor",
|
||||
"test": "npm run -s lint",
|
||||
"env": "hugo env",
|
||||
"precheck": "npm version",
|
||||
"check": "hugo version",
|
||||
"create:syntax": "npm-run-all update:syntax:**",
|
||||
"prestart": "npm run -s mod:vendor",
|
||||
"start": "hugo server --bind=0.0.0.0 --disableFastRender --printI18nWarnings",
|
||||
"start:example": "npm run -s prestart && hugo server --bind=0.0.0.0 --disableFastRender --printI18nWarnings -s exampleSite",
|
||||
"start:prod": "npm run -s prestart && hugo server --bind=0.0.0.0 --disableFastRender --printI18nWarnings -e production",
|
||||
"prebuild": "npm run clean:public && npm run -s mod:vendor",
|
||||
"build": "hugo --gc --minify",
|
||||
"build:cache": "npm run -s prebuild && hugo config | grep cachedir && hugo --gc --minify -e ci",
|
||||
"build:example": "npm run -s prebuild && hugo --gc --minify -s exampleSite",
|
||||
"build:example:ci": "npm run -s prebuild && hugo --gc --minify -s exampleSite -e ci",
|
||||
"build:debug": "hugo -e debug --debug",
|
||||
"build:preview": "npm run build -D -F",
|
||||
"clean:public": "rimraf public exampleSite/public",
|
||||
"clean:install": "rimraf package-lock.json node_modules",
|
||||
"lint": "npm-run-all lint:**",
|
||||
"lint:scripts": "eslint assets/js --no-error-on-unmatched-pattern",
|
||||
"lint:styles": "stylelint \"assets/scss/**/*.{css,sass,scss,sss,less}\" --allow-empty-input",
|
||||
"lint:markdown": "markdownlint-cli2 \"*.md\" \"content/**/*.md\" \"exampleSite/**/*.md\"",
|
||||
"mod:clean": "hugo mod clean",
|
||||
"mod:update": "rimraf _vendor && hugo mod get -u ./... && hugo mod get -u && npm run -s mod:vendor && npm run -s mod:tidy",
|
||||
"mod:tidy": "hugo mod tidy && hugo mod tidy -s exampleSite",
|
||||
"mod:vendor": "rimraf _vendor && hugo mod vendor",
|
||||
"test": "npm run -s lint",
|
||||
"env": "hugo env",
|
||||
"precheck": "npm version",
|
||||
"check": "hugo version",
|
||||
"create:syntax": "npm-run-all update:syntax:**",
|
||||
"update:syntax:light1": "hugo gen chromastyles --style=github > ./assets/scss/components/_syntax-light.scss",
|
||||
"update:syntax:light2": "replace-in-files --string=\"#0086b3\" --replacement=\"#006b8f\" ./assets/scss/components/_syntax-light.scss",
|
||||
"update:syntax:light3": "replace-in-files --string=\"#009999\" --replacement=\"#007a7a\" ./assets/scss/components/_syntax-light.scss",
|
||||
"update:syntax:light4": "replace-in-files --string=\"#999988\" --replacement=\"#6d6d5d\" ./assets/scss/components/_syntax-light.scss",
|
||||
"update:syntax:dark1": "hugo gen chromastyles --style=github-dark > ./assets/scss/components/_syntax-dark.scss",
|
||||
"update:syntax:dark2": "replace-in-files --string=\"#ffffcc\" --replacement=\"#373700\" ./assets/scss/components/_syntax-dark.scss",
|
||||
"update:syntax:dark3": "replace-in-files --string=\"#8b949e\" --replacement=\"#979fa8\" ./assets/scss/components/_syntax-dark.scss",
|
||||
"update:syntax:dark4": "replace-in-files --string=\".na { }\" --replacement=\".na { color: #00cccc }\" ./assets/scss/components/_syntax-dark.scss",
|
||||
"update:syntax:dark5": "replace-in-files --string=\".nb { }\" --replacement=\".nb { color: #00a2d8 }\" ./assets/scss/components/_syntax-dark.scss",
|
||||
"update:syntax:dark6": "replace-in-files --string=\"#6e7681\" --replacement=\"#999fa8\" ./assets/scss/components/_syntax-dark.scss",
|
||||
"upgrade": "npx npm-check-updates -u && npm run -s mod:update"
|
||||
"update:syntax:dark1": "hugo gen chromastyles --style=github-dark > ./assets/scss/components/_syntax-dark.scss",
|
||||
"update:syntax:dark2": "replace-in-files --string=\"#ffffcc\" --replacement=\"#373700\" ./assets/scss/components/_syntax-dark.scss",
|
||||
"update:syntax:dark3": "replace-in-files --string=\"#8b949e\" --replacement=\"#979fa8\" ./assets/scss/components/_syntax-dark.scss",
|
||||
"update:syntax:dark4": "replace-in-files --string=\".na { }\" --replacement=\".na { color: #00cccc }\" ./assets/scss/components/_syntax-dark.scss",
|
||||
"update:syntax:dark5": "replace-in-files --string=\".nb { }\" --replacement=\".nb { color: #00a2d8 }\" ./assets/scss/components/_syntax-dark.scss",
|
||||
"update:syntax:dark6": "replace-in-files --string=\"#6e7681\" --replacement=\"#999fa8\" ./assets/scss/components/_syntax-dark.scss",
|
||||
"upgrade": "npx npm-check-updates -u && npm run -s mod:update"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -71,18 +72,18 @@
|
||||
"cssnano-preset-advanced": "^6.0.1",
|
||||
"eslint": "^8.47.0",
|
||||
"eslint-config-standard": "^17.1.0",
|
||||
"eslint-plugin-import": "^2.28.0",
|
||||
"eslint-plugin-n": "^16.0.1",
|
||||
"eslint-plugin-import": "^2.28.1",
|
||||
"eslint-plugin-n": "^16.0.2",
|
||||
"eslint-plugin-promise": "^6.1.1",
|
||||
"hugo-bin": "^0.113.0",
|
||||
"markdownlint-cli2": "^0.8.1",
|
||||
"markdownlint-cli2": "^0.9.0",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"postcss-cli": "^10.1.0",
|
||||
"purgecss-whitelister": "^2.4.0",
|
||||
"replace-in-files-cli": "^2.2.0",
|
||||
"rimraf": "^5.0.1",
|
||||
"shx": "^0.3.4",
|
||||
"stylelint": "^15.10.2",
|
||||
"stylelint": "^15.10.3",
|
||||
"stylelint-config-standard-scss": "^10.0.0"
|
||||
},
|
||||
"hugo-bin": {
|
||||
|
Reference in New Issue
Block a user