Compare commits

...

48 Commits
v0.1 ... v0.5.0

Author SHA1 Message Date
Mark Dumay
9d1a5ad65a Merge pull request #42 from markdumay/develop
Add command prompt to features
2022-10-28 09:53:01 +02:00
mark
c44f35d629 Update dependencies 2022-10-28 09:51:40 +02:00
mark
1efbc967f9 Add command prompt to features 2022-10-28 09:49:06 +02:00
Mark Dumay
72b1cf7eaf Merge pull request #41 from markdumay/develop
Add command shortcode
2022-10-28 08:09:13 +02:00
mark
2094e69b4a Address linting errors 2022-10-28 08:07:49 +02:00
mark
628ba75262 Add command shortcode 2022-10-28 07:54:28 +02:00
Mark Dumay
04d749b2d5 Merge pull request #40 from markdumay/develop
Adjust clipboard button to match Bootstrap style
2022-10-21 05:41:08 +02:00
mark
408f434654 Adjust clipboard button to match Bootstrap style 2022-10-21 05:36:17 +02:00
Mark Dumay
c996f7b902 Merge pull request #39 from markdumay/develop
Update dependencies
2022-10-20 04:49:29 +02:00
mark
6d1af55263 Update dependencies 2022-10-20 04:45:43 +02:00
Mark Dumay
176d14fe8a Merge pull request #38 from markdumay/develop
Upgrade dependencies
2022-10-01 13:06:53 +02:00
Mark Dumay
294526883d Update lint.yml
Drop support for Node 12.x, add Node 18.x
2022-10-01 13:02:40 +02:00
mark
4b9bf2c254 Fix lint issue 2022-10-01 10:25:46 +02:00
mark
954154c2a5 Upgrade dependencies 2022-10-01 10:21:17 +02:00
Mark Dumay
c8f33170da Merge pull request #37 from markdumay/develop
Develop
2022-07-22 11:09:00 +02:00
mark
0aa9877169 Fix bootstrap v5.2.0 build issue 2022-07-22 11:06:23 +02:00
mark
f4c4ea28ed Update dependencies 2022-07-22 10:49:13 +02:00
mark
12d406ea38 Adjust figure caption rendering 2022-07-22 10:38:51 +02:00
Mark Dumay
2e1040b25b Merge pull request #36 from markdumay/develop
Update dependencies
2022-05-22 08:12:50 +02:00
mark
c019703a30 Fix eslint-plugin-node dependency 2022-05-22 08:09:10 +02:00
mark
81a3be47a7 Update dependencies 2022-05-22 07:56:50 +02:00
Mark Dumay
e2c5c92e9b Merge pull request #35 from markdumay/develop
Media
2022-04-18 07:47:23 +02:00
mark
791f318614 Bump version 2022-04-18 07:44:22 +02:00
mark
7be58d48dc Add theme data 2022-04-18 07:41:54 +02:00
Mark Dumay
70d9d054ce Merge pull request #34 from markdumay/develop
Layout
2022-04-18 05:26:13 +02:00
mark
7be7cb171c Bump version 2022-04-18 05:20:59 +02:00
mark
4889daf3e2 Adjust spacing 2022-04-18 05:20:18 +02:00
mark
db3fc14da4 Adjust spacing 2022-04-17 08:53:58 +02:00
mark
c535323ea0 Adjust navbar spacing 2022-04-17 08:43:12 +02:00
Mark Dumay
74156590c5 Merge pull request #33 from markdumay/develop
Fix css in production
2022-04-16 09:50:57 +02:00
mark
a2f91fac9b Fix css in production 2022-04-16 09:41:57 +02:00
Mark Dumay
ec682d687b Merge pull request #32 from markdumay/develop
Code highlighting
2022-04-16 08:54:02 +02:00
mark
4cf595d901 Fix indentation 2022-04-16 08:51:26 +02:00
mark
e5c7b3c5a4 Update title and description 2022-04-16 08:47:25 +02:00
mark
3024924f50 Bump version 2022-04-16 08:44:44 +02:00
mark
b5721351ea Enable code highlighting 2022-04-16 08:44:21 +02:00
Mark Dumay
7a45644625 Merge pull request #31 from markdumay/develop
Bump package version for release
2022-04-14 19:04:54 +02:00
mark
03ba42ca55 Bump package version for release 2022-04-14 19:02:06 +02:00
Mark Dumay
c9da39ee46 Merge pull request #30 from markdumay/develop
Develop
2022-04-14 08:56:14 +02:00
mark
a70cae1574 Add child theme 2022-04-14 08:47:46 +02:00
mark
dd5e55848d Bump Hugo version 2022-04-14 06:06:05 +02:00
mark
c52635f6d1 Remove obsolete translation 2022-04-14 06:05:44 +02:00
mark
0d8161e605 Add publish config 2022-04-13 14:36:22 +02:00
Mark Dumay
2192ec30b7 Update npm-publish.yml 2022-04-13 14:24:01 +02:00
Mark Dumay
7cfbf72847 Merge pull request #29 from markdumay/develop
Develop
2022-04-13 14:20:57 +02:00
mark
7fb5ccb5a5 Merge branch 'develop' of https://github.com/markdumay/hugo-theme-hinode into develop
Sync local branch
2022-04-13 14:05:19 +02:00
mark
d461180dce Add scope to package name 2022-04-13 13:53:00 +02:00
Mark Dumay
d5046426cc Create npm-publish.yml 2022-04-13 13:47:48 +02:00
30 changed files with 2581 additions and 1835 deletions

View File

@@ -14,7 +14,7 @@ jobs:
strategy:
matrix:
node-version: [12.x, 14.x, 16.x]
node-version: [14.x, 16.x, 18.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:

35
.github/workflows/npm-publish.yml vendored Normal file
View File

@@ -0,0 +1,35 @@
# 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
on:
workflow_dispatch:
branches: [ main ]
release:
types: [created]
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
publish-npm:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
registry-url: https://registry.npmjs.org/
- run: npm ci
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{secrets.npm_token}}

View File

@@ -1,4 +1,5 @@
assets/scss/common/_variables.scss
assets/scss/components/_syntax.scss
assets/scss/vendor
assets/scss/app.scss
node_modules

View File

@@ -55,6 +55,7 @@ Additional features include:
- Social links
- Blog pagination
- Code highlighting
- Command prompt
- Color customization
- i18n support
@@ -72,10 +73,7 @@ Start a new Hinode project in three steps:
### 1. Create a new site
<!-- Hinode is available as a child theme, and a starter theme:
- Use the Hinode child theme, if you do **not** plan to customize a lot, and/or need future Hinode updates.
- Use the Hinode starter theme, if you plan to customize a lot, and/or do **not** need future Hinode updates.
Hinode is available as a [child theme][repository_child], and a [main theme][repository]. The child theme uses [npm][npm] to link to the latest available version of the Hinode theme. As such, it is less applicable if you plan to customize a lot. Vice versa, the main theme allows for heavy customization, but is not synchronized with the latest available Hinode theme automatically.
Not quite sure? Use the Hinode child theme.
@@ -85,7 +83,7 @@ Not quite sure? Use the Hinode child theme.
git clone https://github.com/markdumay/hugo-theme-hinode-child.git my-hinode-site && cd my-hinode-site
```
#### Hinode starter theme -->
#### Hinode main theme
```bash
git clone https://github.com/markdumay/hugo-theme-hinode.git my-hinode-site && cd my-hinode-site
@@ -107,11 +105,11 @@ npm run start
The main site configuration is available in `./config/_default`. Some remarks:
- Menu items - `menus/menus.en.toml` contains language-specific items for the navigation bar and social media links for the home page's footer.
- Content - Ensure the `mainSections` in `config.toml` is synchronized with the `content` folder, default values are `["blog", "projects"]`.
- Theme color - Update `themeColor` and `themeOpacity` within the `[style]` section of `params.toml` to update the site's primary color and opacity. You can use the [WCAG Color Contrast Checker][contrast_checker] to validate the contrast ratio of your color to improve accessibility.
- Comments - Comments are powered by [utterances][utterances], a lightweight comments widget built on GitHub issues. Update the `repo` of the `[comments]` section of `params.toml`.
- Security headings - The local development server uses the header configuration as provided by `server.toml`. Similar settings are provided in the `netlify.toml` file provided in the repository's root when deploying to [Netlify][netlify].
- **Menu items** - `menus/menus.en.toml` contains language-specific items for the navigation bar and social media links for the home page's footer.
- **Content** - Ensure the `mainSections` in `config.toml` is synchronized with the `content` folder, default values are `["blog", "projects"]`.
- **Theme color** - Update `themeColor` and `themeOpacity` within the `[style]` section of `params.toml` to update the site's primary color and opacity. You can use the [WCAG Color Contrast Checker][contrast_checker] to validate the contrast ratio of your color to improve accessibility.
- **Comments** - Comments are powered by [utterances][utterances], a lightweight comments widget built on GitHub issues. Update the `repo` of the `[comments]` section of `params.toml`.
- **Security headings** - The local development server uses the header configuration as provided by `server.toml`. Similar settings are defined in the `netlify.toml` file provided in the repository's root when deploying to [Netlify][netlify].
## Contributing
@@ -137,7 +135,7 @@ The Hinode theme is inspired by the following themes:
## License
The `hugo-theme-hinode` codebase is released under the [MIT license][license]. The documentation (including the "README") is licensed under the Creative Commons ([CC BY-NC 4.0)][cc-by-nc-4.0] license.
The `hugo-theme-hinode` and `hugo-theme-hinode-child` codebase is released under the [MIT license][license]. The documentation (including the "README") is licensed under the Creative Commons ([CC BY-NC 4.0)][cc-by-nc-4.0] license.
<!-- MARKDOWN PUBLIC LINKS -->
[blist]: https://github.com/apvarun/blist-hugo-theme
@@ -158,8 +156,9 @@ The `hugo-theme-hinode` codebase is released under the [MIT license][license]. T
<!-- MARKDOWN MAINTAINED LINKS -->
<!-- TODO: add blog link
[blog]: https://markdumay.com
-->
[blog]: https://github.com/markdumay
-->
[demo]: https://hinode-demo.markdumay.org/
[license]: https://github.com/markdumay/hugo-theme-hinode/blob/main/LICENSE
[repository]: https://github.com/markdumay/hugo-theme-hinode.git
[repository_child]: https://github.com/markdumay/hugo-theme-hinode-child.git

BIN
assets/img/notepad.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

View File

@@ -155,3 +155,42 @@ Source:
}
}
}());
/*
Source:
- https://simplernerd.com/hugo-add-copy-to-clipboard-button/
*/
const svgCopy =
'<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="16" height="16" fill="currentColor" class="bi bi-clipboard" viewBox="0 0 16 16"><path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z"/><path d="M9.5 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3z"/></svg>';
const svgCheck =
'<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true"><path fill-rule="evenodd" fill="rgb(63, 185, 80)" d="M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z"></path></svg>';
const addCopyButtons = (clipboard) => {
// 1. Look for pre > code elements in the DOM
document.querySelectorAll("pre > code").forEach((codeBlock) => {
// 2. Create a button that will trigger a copy operation
const button = document.createElement("button");
button.className = "clipboard-button";
button.type = "button";
button.innerHTML = svgCopy;
button.addEventListener("click", () => {
clipboard.writeText(codeBlock.innerText).then(
() => {
button.blur();
button.innerHTML = svgCheck;
setTimeout(() => (button.innerHTML = svgCopy), 2000);
},
(error) => (button.innerHTML = "Error")
);
});
// 3. Append the button directly before the pre tag
const pre = codeBlock.parentNode;
pre.parentNode.insertBefore(button, pre);
});
};
if (navigator && navigator.clipboard) {
addCopyButtons(navigator.clipboard);
}

View File

@@ -9,6 +9,7 @@ $themeColor: {{ site.Params.style.themeColor | default "#007bff" }};
// Import Bootstrap configuration
@import "bootstrap/scss/variables";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";
@@ -60,10 +61,13 @@ $themeColor: {{ site.Params.style.themeColor | default "#007bff" }};
@import "components/blockquote.scss";
@import "components/buttons.scss";
@import "components/card.scss";
@import "components/clipboard.scss";
@import "components/command.scss";
@import "components/comments.scss";
@import "components/navbar.scss";
@import "components/img.scss";
@import "components/search.scss";
@import "components/syntax.scss";
@import "components/vimeo.scss";
@import "common/styles.scss";
@import "layouts/reboot.scss";

View File

@@ -1,5 +1,6 @@
// Bootstrap variables overrides for theme
$primary: $themeColor;
$enable-negative-margins: true;
// Font awesome variables overrides for theme
$fa-font-path: "../fonts";

View File

@@ -0,0 +1,41 @@
// Adapted from https://simplernerd.com/hugo-add-copy-to-clipboard-button/
.clipboard-button {
position: absolute;
right: 0;
padding: 2px 7px 5px;
margin: 5px;
color: $secondary;
background-color: transparent;
border-style: none;
font-size: 0.8em;
z-index: 1;
opacity: 0;
transition: 0.1s;
}
.clipboard-button > svg {
fill: $secondary;
}
.clipboard-button:hover {
cursor: pointer;
color: $primary;
}
.clipboard-button:hover > svg {
fill: $primary;
}
.clipboard-button:focus {
outline: 0;
}
.highlight {
position: relative;
}
.highlight:hover > .clipboard-button {
opacity: 1;
transition: 0.2s;
}

View File

@@ -0,0 +1,43 @@
/* Adapted from PrismJS 1.29.0
https://prismjs.com/download.html#themes=prism&plugins=command-line */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
.command-line-prompt {
border-right: 1px solid #999;
display: block;
float: left;
font-size: 100%;
letter-spacing: -1px;
margin-right: 1em;
pointer-events: none;
text-align: right;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.command-line-prompt > span::before {
opacity: 0.7;
content: " ";
display: block;
padding-right: 0.8em;
}
.command-line-prompt > span[data-prompt]::before {
content: attr(data-prompt);
}
.command-line-prompt > span[data-continuation-prompt]::before {
content: attr(data-continuation-prompt);
}
.command-line span.token.output {
/* Make shell output lines a bit lighter to distinguish them from shell commands */
opacity: 0.7;
}

View File

@@ -0,0 +1,85 @@
/* Background */ .bg { color: #272822; background-color: #fafafa }
/* PreWrapper */ .chroma { color: #272822; background-color: #fafafa; }
/* Other */ .chroma .x { }
/* Error */ .chroma .err { color: #960050; background-color: #1e0010 }
/* CodeLine */ .chroma .cl { }
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
/* LineHighlight */ .chroma .hl { background-color: #ffffcc }
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* Line */ .chroma .line { display: flex; }
/* Keyword */ .chroma .k { color: #00a8c8 }
/* KeywordConstant */ .chroma .kc { color: #00a8c8 }
/* KeywordDeclaration */ .chroma .kd { color: #00a8c8 }
/* KeywordNamespace */ .chroma .kn { color: #f92672 }
/* KeywordPseudo */ .chroma .kp { color: #00a8c8 }
/* KeywordReserved */ .chroma .kr { color: #00a8c8 }
/* KeywordType */ .chroma .kt { color: #00a8c8 }
/* Name */ .chroma .n { color: #111111 }
/* NameAttribute */ .chroma .na { color: #75af00 }
/* NameBuiltin */ .chroma .nb { color: #111111 }
/* NameBuiltinPseudo */ .chroma .bp { color: #111111 }
/* NameClass */ .chroma .nc { color: #75af00 }
/* NameConstant */ .chroma .no { color: #00a8c8 }
/* NameDecorator */ .chroma .nd { color: #75af00 }
/* NameEntity */ .chroma .ni { color: #111111 }
/* NameException */ .chroma .ne { color: #75af00 }
/* NameFunction */ .chroma .nf { color: #75af00 }
/* NameFunctionMagic */ .chroma .fm { color: #111111 }
/* NameLabel */ .chroma .nl { color: #111111 }
/* NameNamespace */ .chroma .nn { color: #111111 }
/* NameOther */ .chroma .nx { color: #75af00 }
/* NameProperty */ .chroma .py { color: #111111 }
/* NameTag */ .chroma .nt { color: #f92672 }
/* NameVariable */ .chroma .nv { color: #111111 }
/* NameVariableClass */ .chroma .vc { color: #111111 }
/* NameVariableGlobal */ .chroma .vg { color: #111111 }
/* NameVariableInstance */ .chroma .vi { color: #111111 }
/* NameVariableMagic */ .chroma .vm { color: #111111 }
/* Literal */ .chroma .l { color: #ae81ff }
/* LiteralDate */ .chroma .ld { color: #d88200 }
/* LiteralString */ .chroma .s { color: #d88200 }
/* LiteralStringAffix */ .chroma .sa { color: #d88200 }
/* LiteralStringBacktick */ .chroma .sb { color: #d88200 }
/* LiteralStringChar */ .chroma .sc { color: #d88200 }
/* LiteralStringDelimiter */ .chroma .dl { color: #d88200 }
/* LiteralStringDoc */ .chroma .sd { color: #d88200 }
/* LiteralStringDouble */ .chroma .s2 { color: #d88200 }
/* LiteralStringEscape */ .chroma .se { color: #8045ff }
/* LiteralStringHeredoc */ .chroma .sh { color: #d88200 }
/* LiteralStringInterpol */ .chroma .si { color: #d88200 }
/* LiteralStringOther */ .chroma .sx { color: #d88200 }
/* LiteralStringRegex */ .chroma .sr { color: #d88200 }
/* LiteralStringSingle */ .chroma .s1 { color: #d88200 }
/* LiteralStringSymbol */ .chroma .ss { color: #d88200 }
/* LiteralNumber */ .chroma .m { color: #ae81ff }
/* LiteralNumberBin */ .chroma .mb { color: #ae81ff }
/* LiteralNumberFloat */ .chroma .mf { color: #ae81ff }
/* LiteralNumberHex */ .chroma .mh { color: #ae81ff }
/* LiteralNumberInteger */ .chroma .mi { color: #ae81ff }
/* LiteralNumberIntegerLong */ .chroma .il { color: #ae81ff }
/* LiteralNumberOct */ .chroma .mo { color: #ae81ff }
/* Operator */ .chroma .o { color: #f92672 }
/* OperatorWord */ .chroma .ow { color: #f92672 }
/* Punctuation */ .chroma .p { color: #111111 }
/* Comment */ .chroma .c { color: #75715e }
/* CommentHashbang */ .chroma .ch { color: #75715e }
/* CommentMultiline */ .chroma .cm { color: #75715e }
/* CommentSingle */ .chroma .c1 { color: #75715e }
/* CommentSpecial */ .chroma .cs { color: #75715e }
/* CommentPreproc */ .chroma .cp { color: #75715e }
/* CommentPreprocFile */ .chroma .cpf { color: #75715e }
/* Generic */ .chroma .g { }
/* GenericDeleted */ .chroma .gd { }
/* GenericEmph */ .chroma .ge { font-style: italic }
/* GenericError */ .chroma .gr { }
/* GenericHeading */ .chroma .gh { }
/* GenericInserted */ .chroma .gi { }
/* GenericOutput */ .chroma .go { }
/* GenericPrompt */ .chroma .gp { }
/* GenericStrong */ .chroma .gs { font-weight: bold }
/* GenericSubheading */ .chroma .gu { }
/* GenericTraceback */ .chroma .gt { }
/* GenericUnderline */ .chroma .gl { }
/* TextWhitespace */ .chroma .w { }

View File

@@ -1,17 +1,17 @@
defaultMarkdownHandler = "goldmark"
[highlight]
anchorLineNos = false
codeFences = true
guessSyntax = true
hl_Lines = ""
lineAnchors = ""
lineNoStart = 1
lineNos = true
lineNumbersInTable = false
noClasses = false
# style = "monokai" # This parameter affects nothing, see https://github.com/razonyang/hugo-theme-bootstrap#syntax-highlighting.
tabWidth = 2
anchorLineNos = false
codeFences = true
guessSyntax = true
hl_Lines = ""
lineAnchors = ""
lineNoStart = 1
lineNos = false
lineNumbersInTable = false
noClasses = false
# style = "monokailight" ## Update the 'create:syntax' command in package.json to modify the style
tabWidth = 2
[goldmark]
[goldmark.extensions]

View File

@@ -10,38 +10,38 @@ module.exports = {
'./layouts/**/*.html',
'./content/**/*.md',
],
safelist: {
standard: [
/lazyloaded/,
/table/,
/thead/,
/tbody/,
/tr/,
/th/,
/td/,
/h5/,
/alert-link/,
/container-xxl/,
/container-fluid/,
/^bg-opacity-\d+/,
/svg.*/,
/fa.*/,
/ratio.*/,
/suggestion.*/,
],
...whitelister([
safelist: [
/lazyloaded/,
/table/,
/thead/,
/tbody/,
/tr/,
/th/,
/td/,
/h5/,
/alert-link/,
/container-xxl/,
/container-fluid/,
/^bg-opacity-\d+/,
/svg.*/,
/fa.*/,
/ratio.*/,
/suggestion.*/,
...whitelister([
'./assets/scss/components/_blockquote.scss',
'./assets/scss/components/_buttons.scss',
'./assets/scss/components/_card.scss',
'./assets/scss/components/_clipboard.scss',
'./assets/scss/components/_img.scss',
'./assets/scss/components/_navbar.scss',
'./assets/scss/components/_search.scss',
'./assets/scss/components/_syntax.scss',
'./assets/scss/layouts/_reboot.scss',
'./assets/scss/layouts/type.scss',
'./node_modules/bootstrap/scss/_dropdown.scss',
'./node_modules/bootstrap/scss/_utilities.scss',
]),
},
],
}),
],
}
}

View File

@@ -0,0 +1,183 @@
---
author: "Mark Dumay"
title: "Code Highlighting"
date: 2022-04-16
description: "Examples on how to enable code highlighting"
tags: ["code"]
thumbnail: img/notepad.jpg
credits: Photo by <a href="https://unsplash.com/@frederickjmedina">Frederick Medina</a> on <a href="https://unsplash.com/photos/PdfRE-xB--s">Unsplash</a>
---
## Code Fencing
Use code fencing to highlight the syntax of a specific language.
```json
{
"version": "0.2.0",
"themes": [],
"projects": [],
"configuration": {}
}
```
```html
<div class="highlight">
<pre>
<code>some code...</code>
</pre>
</div>
```
## Highlight Partial
Use the `highlight` partial to customize the layout of a specific code block.
{{< highlight go "linenos=table,hl_lines=8 15-17,linenostart=199" >}}
// GetTitleFunc returns a func that can be used to transform a string to
// title case.
//
// The supported styles are
//
// - "Go" (strings.Title)
// - "AP" (see https://www.apstylebook.com/)
// - "Chicago" (see https://www.chicagomanualofstyle.org/home.html)
//
// If an unknown or empty style is provided, AP style is what you get.
func GetTitleFunc(style string) func(s string) string {
switch strings.ToLower(style) {
case "go":
return strings.Title
case "chicago":
return transform.NewTitleConverter(transform.ChicagoStyle)
default:
return transform.NewTitleConverter(transform.APStyle)
}
}
{{< / highlight >}}
## Command Prompt Shortcode
The `command` shortcode generates terminal output for either `bash`, `powershell`, or `sql` shell languages.
### Bash (default shell)
Use the `command` shortcode to generate a block with a default bash command prompt.
```html
{{%/* command */%}}
export MY_VAR=123
{{%/* /command */%}}
```
The result looks like this:
{{% command %}}
export MY_VAR=123
{{% /command %}}
Specify `user` and `host` to add the user context to the prompt. In addition, use `(out)` to specify an output line and use `\` to denote a line continuation.
```html
{{%/* command user="user" host="localhost" */%}}
export MY_VAR=123
echo "hello"
(out)hello
echo one \
two \
three
(out)one two three
echo "goodbye"
(out)goodbye
{{%/* /command */%}}
```
The result looks like this:
{{% command user="user" host="localhost" %}}
export MY_VAR=123
echo "hello"
(out)hello
echo one \
two \
three
(out)one two three
echo "goodbye"
(out)goodbye
{{% /command %}}
### PowerShell
Set the `shell` argument to `powershell` to generate a PowerShell terminal. Override the `prompt` to add a directory if needed. Use the backtick `` ` `` symbol to denote a line continuation.
```html
{{%/* command prompt="PS C:\Users\User>" shell="powershell" */%}}
Write-Host `
'Hello' `
'from' `
'PowerShell!'
(out)Hello from PowerShell!
Write-Host 'Goodbye from PowerShell!'
(out)Goodbye from PowerShell!
{{%/* /command */%}}
```
The result looks like this:
{{% command prompt="PS C:\Users\User>" shell="powershell" %}}
Write-Host `
'Hello' `
'from' `
'PowerShell!'
(out)Hello from PowerShell!
Write-Host 'Goodbye from PowerShell!'
(out)Goodbye from PowerShell!
{{% /command %}}
### SQL
Set the `shell` argument to `sql` to generate a SQL terminal. Use the `(con)` suffix to denote a line continuation.
```html
{{%/* command prompt="mysql>" shell="sql" */%}}
set @my_var = 'foo';
set @my_other_var = 'bar';
CREATE TABLE people ((con)
first_name VARCHAR(30) NOT NULL,(con)
last_name VARCHAR(30) NOT NULL(con)
);
(out)Query OK, 0 rows affected (0.09 sec)
insert into people(con)
values ('John', 'Doe');
(out)Query OK, 1 row affected (0.02 sec)
select *(con)
from people(con)
order by last_name;
(out)+------------+-----------+
(out)| first_name | last_name |
(out)+------------+-----------+
(out)| John | Doe |
(out)+------------+-----------+
(out)1 row in set (0.00 sec)
{{%/* /command */%}}
```
The result looks like this:
{{% command prompt="mysql>" shell="sql" %}}
set @my_var = 'foo';
set @my_other_var = 'bar';
CREATE TABLE people ((con)
first_name VARCHAR(30) NOT NULL,(con)
last_name VARCHAR(30) NOT NULL(con)
);
(out)Query OK, 0 rows affected (0.09 sec)
insert into people(con)
values ('John', 'Doe');
(out)Query OK, 1 row affected (0.02 sec)
select *(con)
from people(con)
order by last_name;
(out)+------------+-----------+
(out)| first_name | last_name |
(out)+------------+-----------+
(out)| John | Doe |
(out)+------------+-----------+
(out)1 row in set (0.00 sec)
{{% /command %}}

BIN
images/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 KiB

BIN
images/tn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

View File

@@ -1,7 +1,7 @@
{{ define "main" -}}
<div class="p-5">
<div class="p-4">
<h1>{{ .Title }}</h1>
<div class="container-fluid">
<div class="container-fluid p-0">
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 g-4">
{{ $max := sub (len .Pages) 1 -}}
{{ range $index, $element := (.Paginate .RegularPagesRecursive).Pages -}}

View File

@@ -3,7 +3,7 @@
{{ $datestr := (partial "utilities/date.html" (dict "date" .Date "language" $.Page.Language "format" "long")) -}}
<div class="container-fluid">
<div class="row row-cols-1 row-cols-sm-3 align-items-center p-5">
<div class="row row-cols-1 row-cols-sm-3 align-items-center p-3">
<div class="col col-md-2 d-none d-md-block"></div>
<div class="col col-sm-12 col-md-8">
{{ range .Params.tags -}}
@@ -18,7 +18,7 @@
{{ else -}}
&nbsp;&bull;&nbsp;
{{ end -}}
{{ i18n "readingTime"}}{{ .ReadingTime }}&nbsp;{{ i18n "minutesShort" }} {{ i18n "read" }}
{{ .ReadingTime }}&nbsp;{{ i18n "minutesShort" }} {{ i18n "read" }}
&nbsp;&bull;
{{ .WordCount }}&nbsp;{{ i18n "words" }}
</small>
@@ -27,7 +27,7 @@
</div>
{{ if .Params.thumbnail -}}
<div class="row row-cols-1 row-cols-sm-3 align-items-center p-5">
<div class="row row-cols-1 row-cols-sm-3 align-items-center p-3">
<div class="col col-md-2 d-none d-md-block"></div>
<div class="col col-sm-12 col-md-8">
{{- partial "image.html" (dict "url" .Params.thumbnail "ratio" "21x9" "outerClass" "img-wrap" "innerClass" "rounded" "title" .Params.title "caption" .Params.credits) -}}
@@ -36,7 +36,7 @@
</div>
{{ end -}}
<div class="row row-cols-1 row-cols-sm-2 p-5">
<div class="row row-cols-1 row-cols-sm-2 p-3">
<div class="col col-md-2 d-none d-md-block"></div>
<div class="col col-sm-12 col-md-8">
{{ .Content }}
@@ -69,7 +69,7 @@
{{- if and .Site.Params.comments.enabled .Params.showComments | default true -}}
<div class="container-fluid">
<div class="row row-cols-1 row-cols-sm-2 p-5">
<div class="row row-cols-1 row-cols-sm-2 p-3">
<div class="col col-md-2 d-none d-md-block"></div>
<div class="col col-sm-12 col-md-8">
<hr>

View File

@@ -3,14 +3,14 @@
{{ range $section, $taxonomy := .Site.Sections -}}
{{ if eq $section 0 -}}
<div class="p-5">
<div class="p-4">
<h1>Recent posts</h1>
<div class="container-fluid">
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 g-4">
<div class="container-fluid p-0">
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-3">
{{ $items := first 3 ($taxonomy.Pages.ByDate.Reverse) -}}
{{ $max := sub (len $items) 1 -}}
{{ range $index, $element := $items -}}
<div class="col">
<div class="col gx-4">
{{- partial "assets/blog-card.html" $element -}}
</div>
{{ if (lt $index $max) -}}
@@ -27,13 +27,13 @@
{{ end -}}
</div>
{{ else -}}
<div class="p-5">
<div class="p-4">
<h1>{{ $taxonomy.Title }}</h1>
<div class="container-fluid">
<div class="row row-cols-1 g-4">
{{ $items := first 3 ($taxonomy.Pages) -}}
{{ range $index, $element := $items -}}
<div class="col">
<div class="col p-0">
{{- partial "assets/project-card.html" $element -}}
</div>
{{ end -}}

View File

@@ -4,11 +4,11 @@
{{- partial "image.html" (dict "url" .Params.thumbnail "ratio" "16x9" "outerClass" "card-img-wrap" "innerClass" "card-img-top" "title" .Params.title) -}}
</a>
{{ end }}
<div class="card-body d-flex flex-column">
<div class="card-body d-flex flex-column p-0">
<p class="card-text">
<small class="text-muted text-uppercase">
{{- partial "utilities/date.html" (dict "date" .Date "language" $.Page.Language "format" "long") -}}
&bull; {{ i18n "readingTime"}}{{ .ReadingTime }}&nbsp;{{ i18n "minutesShort" }} {{ i18n "read" }}
&bull; {{ .ReadingTime }}&nbsp;{{ i18n "minutesShort" }} {{ i18n "read" }}
{{ if isset .Params "tags" -}}
{{ range first 1 .Params.tags -}}
&bull; <a href="{{ $.Site.BaseURL }}tags/{{ . | urlize }}" class="text-decoration-none text-primary" aria-label="Tag: {{ . }}">{{ . }}</a>

View File

@@ -1,14 +1,14 @@
<nav class="navbar navbar-expand-sm bg-white navbar-light ps-4 pe-4">
<nav class="navbar navbar-expand-sm bg-white navbar-light m-3">
<div class="container-fluid">
<a class="navbar-brand" href="{{ .Site.Home.RelPermalink }}">
{{ if .Site.Params.main.logo -}}
<img src="{{ .Site.Params.main.logo }}" alt="{{ .Site.Title }} logo" height="30">
{{ else -}}
<span class="fw-bold ">{{ .Site.Title }}</span>
<span class="fw-bold">{{ .Site.Title }}</span>
{{ end -}}
</a>
<button class="navbar-toggler collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
<button class="navbar-toggler collapsed me-n3" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="toggler-icon top-bar"></span>
<span class="toggler-icon middle-bar"></span>

View File

@@ -12,7 +12,7 @@
{{ $indexTemplate := resources.Get "js/index.js" -}}
{{ $jsIndex := $indexTemplate | resources.ExecuteAsTemplate "index.js" . }}
{{ $js := (slice $jsIndex) | resources.Concat "js/main.js" }}
{{ $js := (slice $jsIndex) | resources.Concat "js/main.js" }}
{{ if not hugo.IsProduction }}
<script src="{{ $js.RelPermalink }}"></script>

View File

@@ -1,9 +1,9 @@
<div class="container-fluid">
<div class="row row-cols-1 row-cols-sm-4 bg-primary p-5 bg-opacity-{{ .Site.Params.style.themeOpacity | default "25" | safeHTML }} align-items-center">
<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">
<div class="fs-3 fw-bold">{{ .Site.Params.socialTitle }}</div>
{{ .Site.Params.socialCaption }}
<p>{{ .Site.Params.socialCaption }}</p>
</div>
<div class="col text-sm-start text-center col-sm-6 col-md-4">
{{ range .Site.Menus.social -}}

View File

@@ -1,5 +1,5 @@
<div class="container-fluid">
<div class="row row-cols-1 row-cols-sm-4 bg-primary p-5 bg-opacity-{{ .Site.Params.style.themeOpacity | default "25" | safeHTML }} align-items-center">
<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">
<p class="fs-1 fw-bold">{{ .Site.Params.introTitle }}</p>

View File

@@ -0,0 +1,70 @@
{{ $host := .Get "host" }}
{{ $user := .Get "user" }}
{{ $prompt := .Get "prompt" }}
{{ $filter := "(out)" }}
{{ $input := trim .Inner "\n" }}
{{ $shell := lower (.Get "shell") }}
{{ $continuationPrompt := ">" }}
{{ $continuationStr := "\\" }}
{{ if eq $shell "powershell" }}
{{ if not $prompt }}{{ $prompt = "PS>" }}{{ end }}
{{ $continuationPrompt = ">>" }}
{{ $continuationStr = "`" }}
{{ else if eq $shell "sql" }}
{{ if not $prompt }}{{ $prompt = "sql>" }}{{ end }}
{{ $continuationPrompt = "->" }}
{{ $continuationStr = "(con)" }}
{{ else }}
{{ $shell = "bash" }}
{{ if not $prompt }}{{ $prompt = "$" }}{{ end }}
{{ if (and ($host) ($user)) }}
{{ $prompt = printf "[%s@%s] %s" $user $host $prompt}}
{{ end }}
{{ end }}
{{ $lines := split $input "\n" }}
{{ $prefix := ""}}
{{ $prevLine := "" }}
{{ $refined := "" }}
{{ range $line := $lines }}
{{ if hasPrefix $line $filter }}
{{ $prefix = printf "%s<span></span>" $prefix }}
{{ if eq $shell "sql" }}
{{ $line = printf "--%s" (strings.TrimPrefix $filter $line) }}
{{ else }}
{{ $line = printf "#%s" (strings.TrimPrefix $filter $line) }}
{{ end }}
{{ else if (strings.HasSuffix $prevLine $continuationStr) }}
{{ $prefix = printf "%s<span data-prompt=\"%s\"></span>" $prefix $continuationPrompt }}
{{ else }}
{{ $prefix = printf "%s<span data-prompt=\"%s\"></span>" $prefix $prompt }}
{{ end }}
{{ $prevLine = $line }}
{{ if (and (eq $shell "sql") (strings.HasSuffix $line $continuationStr)) }}
{{ $line = strings.TrimSuffix $continuationStr $line }}
{{ end }}
{{ $refined = printf "%s\n%s" $refined $line }}
{{ end }}
{{ $refined := trim $refined "\n" }}
{{ $output := (transform.Highlight $refined $shell | safeHTML) }}
{{ $insert := printf "<span class=\"command-line-prompt\">%s</span><span class=\"line\">" $prefix }}
{{ $output := (replace $output ("<span class=\"line\">" | safeHTML) $insert 1 | safeHTML) }}
{{ if eq $shell "sql"}}
{{ $output = (replace $output "<span class=\"c1\">--" "<span class=\"c1\">" | safeHTML) }}
{{ else }}
{{ $output = (replace $output "<span class=\"c1\">#" "<span class=\"c1\">" | safeHTML) }}
{{ $output = (replace $output "<span class=\"c\">#" "<span class=\"c\">" | safeHTML) }}
{{ end }}
{{ $output }}

View File

@@ -13,7 +13,7 @@
/><!-- Closing img tag -->
{{- if .Get "link" }}</a>{{ end -}}
{{- if or (or (.Get "title") (.Get "caption")) (.Get "attr") -}}
<figcaption>
<figcaption class="figure-caption">
{{ with (.Get "title") -}}
<h4>{{ . }}</h4>
{{- end -}}

View File

@@ -1,6 +1,6 @@
{{ define "main" }}
<div class="container-fluid">
<div class="row row-cols-1 row-cols-sm-3 align-items-center p-5">
<div class="row row-cols-1 row-cols-sm-3 align-items-center p-3">
<div class="col col-md-2 d-none d-md-block"></div>
<div class="col col-sm-12 col-md-8">
<h1>{{ .Name | humanize }}</h1>

3732
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,18 @@
{
"name": "hugo-theme-hinode",
"version": "0.1.0",
"name": "@markdumay/hugo-theme-hinode",
"version": "0.5.0",
"description": "Hinode is a clean blog theme for Hugo, an open-source static site generator",
"main": "index.js",
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org/"
},
"scripts": {
"init": "shx rm -rf .git && git init -b main",
"create": "exec-bin node_modules/.bin/hugo/hugo new",
"prestart": "npm run clean",
"start": "exec-bin node_modules/.bin/hugo/hugo server --bind=0.0.0.0 --disableFastRender",
"prod": "exec-bin node_modules/.bin/hugo/hugo server --bind=0.0.0.0 --disableFastRender -e production",
"prebuild": "npm run clean",
"build": "exec-bin node_modules/.bin/hugo/hugo --gc --minify",
"build:preview": "npm run build -D -F",
@@ -24,7 +29,9 @@
"precheck": "npm version",
"check": "exec-bin node_modules/.bin/hugo/hugo version",
"copy:fonts": "shx cp ./node_modules/@fortawesome/fontawesome-free/webfonts/* ./static/fonts/",
"create:syntax": "exec-bin node_modules/.bin/hugo/hugo gen chromastyles --style=monokailight > ./assets/scss/components/_syntax.scss",
"postinstall": "hugo-installer --version otherDependencies.hugo --extended --destination node_modules/.bin/hugo",
"upgrade": "npx npm-check-updates -u",
"version": "auto-changelog -p && git add CHANGELOG.md"
},
"repository": {
@@ -38,26 +45,26 @@
},
"homepage": "https://github.com/markdumay/hugo-theme-hinode#readme",
"devDependencies": {
"@fortawesome/fontawesome-free": "^6.0.0",
"@fullhuman/postcss-purgecss": "^4.1.3",
"autoprefixer": "^10.4.2",
"bootstrap": "^5.1.3",
"eslint": "^7.32.0",
"eslint-config-standard": "^16.0.3",
"@fortawesome/fontawesome-free": "^6.2.0",
"@fullhuman/postcss-purgecss": "^5.0.0",
"autoprefixer": "^10.4.13",
"bootstrap": "^5.2.2",
"eslint": "^8.26.0",
"eslint-config-standard": "^17.0.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.2.0",
"eslint-plugin-n": "^15.3.0",
"eslint-plugin-promise": "^6.1.1",
"exec-bin": "^1.0.0",
"flexsearch": "^0.7.21",
"hugo-installer": "^3.1.0",
"markdownlint-cli2": "^0.4.0",
"postcss-cli": "^9.1.0",
"flexsearch": "^0.7.31",
"hugo-installer": "^4.0.1",
"markdownlint-cli2": "^0.5.1",
"postcss-cli": "^10.0.0",
"purgecss-whitelister": "^2.4.0",
"shx": "^0.3.4",
"stylelint": "^14.6.1",
"stylelint-config-standard-scss": "^3.0.0"
"stylelint": "^14.14.0",
"stylelint-config-standard-scss": "^6.0.0"
},
"otherDependencies": {
"hugo": "0.92.2"
"hugo": "0.104.3"
}
}

View File

@@ -1,7 +1,7 @@
name = "Hinode"
license = "MIT"
licenselink = "https://github.com/markdumay/hugo-theme-hinode/blob/main/LICENSE"
description = "Hinode is a clean blog theme for Hugo, an open-source static site generator."
description = "A clean blog theme for your Hugo site based on Bootstrap 5."
homepage = "https://github.com/markdumay/hugo-theme-hinode"
demosite = "https://hinode-demo.markdumay.org/"
tags = ["blog", "minimal", "modern", "customizable", "search", "bootstrap"]