Initial Upload

This commit is contained in:
Trekathlon 2024-09-01 16:27:23 +02:00
commit c81d065c89
44 changed files with 3456 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
public/**
.vscode/**

0
.hugo_build.lock Normal file
View File

39
README.md Normal file
View File

@ -0,0 +1,39 @@
# Theme Name
## Features
### Search
Lightweight search functionality based on index file.
### Mermaid
Support for Mermaid schemas.
### Photos
Support photos albums based on Folders.
### Syntax Hightlighting
Required configuration to copy paste code :
[markup.highlight]
lineNos=true
lineNumbersInTable=true
noClasses = false
### Curriculum Vitae
Copy /layouts/section/cv.html to you local /layouts/section folder and edited the content.
Save your own picture under /static/img/avatar.jpeg
## Installation
## Configuration
### Favicons
Get Icons from [Flaticon](https://www.flaticon.com/).
Generate Favicons with [Freepik](https://www.freepik.com/).
Uncompress the icons in your /static folder.
## References
* [Bootstrap 5.2.3](https://getbootstrap.com/docs/5.2/getting-started/download/)
* [JQuery](https://jquery.com/download/)
* [Mermaid](https://cdn.jsdelivr.net/npm/mermaid@11.0.2/dist/)

6
archetypes/default.md Normal file
View File

@ -0,0 +1,6 @@
+++
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
date = {{ .Date }}
draft = true
tags: []
+++

BIN
assets/chroma.css Normal file

Binary file not shown.

51
assets/copycode.js Normal file
View File

@ -0,0 +1,51 @@
function createCopyButton(highlightDiv) {
const button = document.createElement("button");
button.className = "btn-copy";
button.type = "button";
button.innerText = "Copy";
button.addEventListener("click", () => copyCodeToClipboard(button, highlightDiv));
highlightDiv.insertBefore(button, highlightDiv.firstChild);
const wrapper = document.createElement("div");
wrapper.className = "highlight-wrapper";
highlightDiv.parentNode.insertBefore(wrapper, highlightDiv);
wrapper.appendChild(highlightDiv);
}
document.querySelectorAll(".highlight").forEach((highlightDiv) => createCopyButton(highlightDiv));
async function copyCodeToClipboard(button, highlightDiv) {
const codeToCopy = highlightDiv.querySelector(":last-child > .chroma > code").innerText.replace(/\n+\s*\n+/g, "\n");
try {
var result = await navigator.permissions.query({ name: "clipboard-write" });
if (result.state == "granted" || result.state == "prompt") {
await navigator.clipboard.writeText(codeToCopy);
} else {
copyCodeBlockExecCommand(codeToCopy, highlightDiv);
}
} catch (_) {
copyCodeBlockExecCommand(codeToCopy, highlightDiv);
} finally {
button.blur();
button.innerText = "Copied!";
setTimeout(function () {
button.innerText = "Copy";
}, 2000); }
}
function copyCodeBlockExecCommand(codeToCopy, highlightDiv) {
const textArea = document.createElement("textArea");
textArea.contentEditable = "true";
textArea.readOnly = "false";
textArea.className = "copyable-text-area";
textArea.value = codeToCopy;
highlightDiv.insertBefore(textArea, highlightDiv.firstChild);
const range = document.createRange();
range.selectNodeContents(textArea);
const sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
textArea.setSelectionRange(0, 999999);
document.execCommand("copy");
highlightDiv.removeChild(textArea);
}

104
assets/copycodebtn.css Normal file
View File

@ -0,0 +1,104 @@
.highlight-wrapper {
display: block;
}
/* Start: Turn off individual column border, margin, and padding when line numbers are showing */
.highlight-wrapper .lntd pre {
padding: 0;
}
.chroma .lntd pre {
border: 0px solid #ccc;
}
.chroma .lntd:first-child {
padding: 7px 7px 7px 10px;
margin: 0;
}
.chroma .lntd:last-child {
padding: 7px 10px 7px 7px;
margin: 0;
}
/* End: Turn off individual column border, margin, and padding when line numbers are showing */
.highlight {
position: relative;
z-index: 0;
padding: 0;
margin:40px 0 10px 0;
border-radius: 4px;
}
.highlight > .chroma {
position: static;
z-index: 1;
border-top-left-radius: 0px;
border-top-right-radius: 0px;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
padding: 10px;
}
.btn-copy {
position: absolute;
z-index: 2;
right: 0;
top: -29px;
font-size: 13px;
font-weight: 700;
line-height: 14px;
letter-spacing: 0.5px;
width: 65px;
color: #ffffff;
background-color: #000000;
border: 1.25px solid #232326;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border-bottom-right-radius: 0px;
border-bottom-left-radius: 0px;
white-space: nowrap;
padding: 6px 6px 7px 6px;
margin: 0 0 0 1px;
cursor: pointer;
opacity: 0.6;
}
.btn-copy:hover,
.btn-copy:focus,
.btn-copy:active,
.btn-copy:active:hover {
color: #222225;
background-color: #b3b3b3;
opacity: 0.8;
}
.copyable-text-area {
position: absolute;
height: 0;
z-index: -1;
opacity: .01;
}
.chroma [data-lang]:before {
position: absolute;
z-index: 0;
top: -29px;
left: 0;
content: attr(data-lang);
font-size: 13px;
font-weight: 700;
color: white;
background-color: black;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
padding: 6px 6px 7px 6px;
line-height: 14px;
opacity: 0.6;
position: absolute;
letter-spacing: 0.5px;
border: 1.25px solid #232326;
margin: 0 0 0 1px;
}

136
assets/search.js Normal file
View File

@ -0,0 +1,136 @@
(function () {
const SEARCH_ID = 'search';
const ENABLE_SEARCH_ID = 'enable_search';
const REGEX_MODE_ID = 'regex_mode';
const COUNT_ID = 'count';
const LIST_ID = 'listOfUrl';
let list = null;
let filteredList = null;
const logPerformance = (work, startTime, endTime) => {
const duration = (endTime - startTime).toFixed(2);
console.log(`${work} took ${duration} ms`);
};
const getSearchEl = () => document.getElementById(SEARCH_ID);
const getEnableSearchEl = () => document.getElementById(ENABLE_SEARCH_ID);
const getRegexModeEl = () => document.getElementById(REGEX_MODE_ID);
const getCountEl = () => document.getElementById(COUNT_ID);
const getListEl = () => document.getElementById(LIST_ID);
const disableSearchEl = placeholder => {
getSearchEl().disabled = true;
getSearchEl().placeholder = placeholder;
};
const enableSearchEl = () => {
getSearchEl().disabled = false;
getSearchEl().placeholder =
'Case-insensitive search by title, content, or publish date';
};
const disableRegexModeEl = () => {
getRegexModeEl().disabled = true;
};
const enableRegexModeEl = () => {
getRegexModeEl().disabled = false;
};
const fetchJsonIndex = () => {
const startTime = performance.now();
disableSearchEl('Loading ...');
const url = `${window.location.origin}/index.json`;
fetch(url)
.then(response => response.json())
.then(data => {
list = data.post;
filteredList = data.post;
enableSearchEl();
logPerformance('fetchJsonIndex', startTime, performance.now());
})
.catch(error =>
console.error(`Failed to fetch JSON index: ${error.message}`)
);
};
const filterList = regexMode => {
console.log("filterList");
const regexQuery = new RegExp(getSearchEl().value, 'i');
const query = getSearchEl().value.toUpperCase();
filteredList = list.filter(item => {
const title = item.Title.toUpperCase();
const content = item.PlainContent.toUpperCase();
if (regexMode) {
return (
regexQuery.test(title) ||
regexQuery.test(content)
);
} else {
return (
title.includes(query) ||
content.includes(query)
);
}
});
};
const renderCount = () => {
const count = `Count: ${filteredList.length}`;
getCountEl().textContent = count;
};
const renderList = () => {
const newList = document.createElement('ul');
newList.id = LIST_ID;
newList.className = "list-group";
filteredList.forEach(item => {
const li = document.createElement('li');
const titleLink = document.createElement('a');
titleLink.href = item.RelPermalink;
titleLink.textContent = item.Title;
li.className ="list-group-item";
li.appendChild(titleLink);
newList.appendChild(li);
});
const oldList = getListEl();
oldList.replaceWith(newList);
};
const handleSearchEvent = () => {
const startTime = performance.now();
const regexMode = getRegexModeEl().checked;
filterList(regexMode);
renderCount();
renderList();
logPerformance('handleSearchEvent', startTime, performance.now());
};
const handleEnableSearchEvent = () => {
if (getEnableSearchEl().checked) {
fetchJsonIndex();
enableRegexModeEl();
} else {
disableSearchEl('Disabled ...');
disableRegexModeEl();
}
};
const addEventListeners = () => {
getEnableSearchEl().addEventListener('change', handleEnableSearchEvent);
getSearchEl().addEventListener('keydown', handleSearchEvent );
getRegexModeEl().addEventListener('change', handleSearchEvent);
handleEnableSearchEvent();
};
const main = () => {
if (getSearchEl()) {
addEventListeners();
}
};
main();
})();

9
content/_index.md Normal file
View File

@ -0,0 +1,9 @@
+++
title = 'Home'
date = 2023-01-01T08:00:00-07:00
draft = false
+++
Laborum voluptate pariatur ex culpa magna nostrud est incididunt fugiat
pariatur do dolor ipsum enim. Consequat tempor do dolor eu. Non id id anim anim
excepteur excepteur pariatur nostrud qui irure ullamco.

24
content/about.md Normal file
View File

@ -0,0 +1,24 @@
---
title: "About"
date: "2024-09-01"
---
## Hugo
This template is created to be used with Hugo, a static site generator.
Hugo is the **worlds fastest framework for building websites**. It is written in Go.
Learn more and contribute on [GitHub](https://github.com/gohugoio).
Official WebSite : [GoHugo.io](https://gohugo.io/).
---
This template is issued from my own blog : [Fha-Notes](https://fhanotes.netlify.app)
After a few year using Hugo, enriching my blog with functionalities that I kept copying all over the place, I decided to create my own template.
## The beginning
I started long ago in a WordPress VM hosted in azure, until I received some bills :)
Then I have created my blog on [GeeksWithBlogs](http://web.archive.org/web/20101119083715/http://geekswithblogs.net/MoonWalker/Default.aspx) but the website stopped hosting content.
Good Old Times! Nostalgia when you hit us !
_Favicon made by [Freepik](https://www.freepik.com/), from [Flaticon](https://www.flaticon.com/), licensed by [CC 3.0](http://creativecommons.org/licenses/by/3.0/)._

0
content/cv/_index.md Normal file
View File

7
content/posts/_index.md Normal file
View File

@ -0,0 +1,7 @@
+++
title = 'Posts'
date = 2023-01-01T08:30:00-07:00
draft = false
+++
Tempor est exercitation ad qui pariatur quis adipisicing aliquip nisi ea consequat ipsum occaecat. Nostrud consequat ullamco laboris fugiat esse esse adipisicing velit laborum ipsum incididunt ut enim. Dolor pariatur nulla quis fugiat dolore excepteur. Aliquip ad quis aliqua enim do consequat.

38
content/posts/post-1.md Normal file
View File

@ -0,0 +1,38 @@
+++
title = 'Post 1'
date = 2023-01-15T09:00:00-07:00
draft = false
tags = ['red']
+++
Tempor proident minim aliquip reprehenderit dolor et ad anim Lorem duis sint eiusmod. Labore ut ea duis dolor. Incididunt consectetur proident qui occaecat incididunt do nisi Lorem. Tempor do laborum elit laboris excepteur eiusmod do. Eiusmod nisi excepteur ut amet pariatur adipisicing Lorem.
Occaecat nulla excepteur dolore excepteur duis eiusmod ullamco officia anim in voluptate ea occaecat officia. Cillum sint esse velit ea officia minim fugiat. Elit ea esse id aliquip pariatur cupidatat id duis minim incididunt ea ea. Anim ut duis sunt nisi. Culpa cillum sit voluptate voluptate eiusmod dolor. Enim nisi Lorem ipsum irure est excepteur voluptate eu in enim nisi. Nostrud ipsum Lorem anim sint labore consequat do.
```csharp
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
for (double d = 0; d < 6.0; d += 0.5)
{
Console.WriteLine("The cosine of {0} = {1}", d, Math.Cos(d));
Console.WriteLine("Calculated cosine of {0} = {1}", d, cos(d));
Console.WriteLine();
}
Console.ReadKey();
}
static double cos(double x)
{
double p = x * x;
double q = p * p;
return 1.0 - p / 2 + q / 24 - p * q / 720 + q * q / 40320
- p * q * q / 3628800;
}
}
}
```

10
content/posts/post-2.md Normal file
View File

@ -0,0 +1,10 @@
+++
title = 'Post 2'
date = 2023-02-15T10:00:00-07:00
draft = false
tags = ['red','green']
+++
Anim eiusmod irure incididunt sint cupidatat. Incididunt irure irure irure nisi ipsum do ut quis fugiat consectetur proident cupidatat incididunt cillum. Dolore voluptate occaecat qui mollit laborum ullamco et. Ipsum laboris officia anim laboris culpa eiusmod ex magna ex cupidatat anim ipsum aute. Mollit aliquip occaecat qui sunt velit ut cupidatat reprehenderit enim sunt laborum. Velit veniam in officia nulla adipisicing ut duis officia.
Exercitation voluptate irure in irure tempor mollit Lorem nostrud ad officia. Velit id fugiat occaecat do tempor. Sit officia Lorem aliquip eu deserunt consectetur. Aute proident deserunt in nulla aliquip dolore ipsum Lorem ut cupidatat consectetur sit sint laborum. Esse cupidatat sit sint sunt tempor exercitation deserunt. Labore dolor duis laborum est do nisi ut veniam dolor et nostrud nostrud.

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,12 @@
+++
title = 'Post 3'
date = 2023-03-15T11:00:00-07:00
draft = false
tags = ['red','green','blue']
+++
Occaecat aliqua consequat laborum ut ex aute aliqua culpa quis irure esse magna dolore quis. Proident fugiat labore eu laboris officia Lorem enim. Ipsum occaecat cillum ut tempor id sint aliqua incididunt nisi incididunt reprehenderit. Voluptate ad minim sint est aute aliquip esse occaecat tempor officia qui sunt. Aute ex ipsum id ut in est velit est laborum incididunt. Aliqua qui id do esse sunt eiusmod id deserunt eu nostrud aute sit ipsum. Deserunt esse cillum Lorem non magna adipisicing mollit amet consequat.
![Bryce Canyon National Park](bryce-canyon.jpg)
Sit excepteur do velit veniam mollit in nostrud laboris incididunt ea. Amet eu cillum ut reprehenderit culpa aliquip labore laborum amet sit sit duis. Laborum id proident nostrud dolore laborum reprehenderit quis mollit nulla amet veniam officia id id. Aliquip in deserunt qui magna duis qui pariatur officia sunt deserunt.

138
hugo.toml Normal file
View File

@ -0,0 +1,138 @@
baseURL = 'https://example.org/'
languageCode = 'en-us'
title = 'My New Hugo Site'
enableEmoji = true
[permalinks]
post = "/:filename/"
[params]
description = "FHA's Tech-Notes to not forget what took me ages to troubleshoot !"
includeBootstrapJs = true
search = true
search_minify = true
contentBackgroundColor = "#fff"
contentTextColor = "#212529"
contentLinkColor = "#5e807fff"
contentLinkHoverColor = "#5e807fff"
navbarBackgroundColor = "#2a2d34ff"
navbarForegroundColor = "#5e807fff"
navbarLinkColor = "rgba(236, 200, 175, 0.75)"
navbarLinkHoverColor = "rgba(206, 121, 107, 1)"
wrapperMaxWidth = "1280px"
customDateFormat = "Jan 2, 2006"
customCodeStyle = true
customBlockquoteStyle = true
showPostSummary = false
[menu]
[[menu.nav]]
name = 'Home'
pageRef = '/'
weight = 10
[[menu.nav]]
name = 'Posts'
pageRef = '/posts'
weight = 20
[[menu.nav]]
name = 'Tags'
pageRef = '/tags'
weight = 30
[[menu.nav]]
name = 'About'
pageRef = '/about'
weight = 100
[[menu.nav]]
identifier = "pAbout"
name = "About"
url = "/about"
parent = "About"
weight = 10
[[menu.nav]]
identifier = "pCv"
name = "CV"
url = "/cv"
parent = "About"
weight = 20
[module]
[module.hugoVersion]
extended = false
min = "0.116.0"
[markup]
[markup.goldmark]
duplicateResourceFiles = false
[markup.goldmark.extensions]
definitionList = true
footnote = true
linkify = true
linkifyProtocol = 'https'
strikethrough = true
table = true
taskList = true
[markup.goldmark.extensions.cjk]
eastAsianLineBreaks = false
eastAsianLineBreaksStyle = 'simple'
enable = false
escapedSpace = false
[markup.goldmark.extensions.extras]
[markup.goldmark.extensions.extras.delete]
enable = false
[markup.goldmark.extensions.extras.insert]
enable = false
[markup.goldmark.extensions.extras.mark]
enable = false
[markup.goldmark.extensions.extras.subscript]
enable = false
[markup.goldmark.extensions.extras.superscript]
enable = false
[markup.goldmark.extensions.passthrough]
enable = false
[markup.goldmark.extensions.passthrough.delimiters]
block = []
inline = []
[markup.goldmark.extensions.typographer]
apostrophe = '&rsquo;'
disable = false
ellipsis = '&hellip;'
emDash = '&mdash;'
enDash = '&ndash;'
leftAngleQuote = '&laquo;'
leftDoubleQuote = '&ldquo;'
leftSingleQuote = '&lsquo;'
rightAngleQuote = '&raquo;'
rightDoubleQuote = '&rdquo;'
rightSingleQuote = '&rsquo;'
[markup.goldmark.parser]
autoHeadingID = true
autoHeadingIDType = 'github'
wrapStandAloneImageWithinParagraph = true
[markup.goldmark.parser.attribute]
block = false
title = true
[markup.goldmark.renderHooks]
[markup.goldmark.renderHooks.image]
enableDefault = false
[markup.goldmark.renderHooks.link]
enableDefault = false
[markup.goldmark.renderer]
hardWraps = false
unsafe = false
xhtml = false
[markup.highlight]
anchorLineNos = false
codeFences = true
guessSyntax = false
lineAnchors = ' '
lineNoStart = 1
lineNos=true
lineNumbersInTable=true
noClasses = false
noHl = false
style = 'monokai'
tabWidth = 4
[outputs]
home = ["HTML", "RSS", "JSON"]

View File

@ -0,0 +1,4 @@
<div class="mermaid">
{{- .Inner | safeHTML }}
</div>
{{ .Page.Store.Set "hasMermaid" true }}

View File

@ -0,0 +1,5 @@
<a href="{{ .Destination | safeURL }}"
{{ with .Title}} title="{{ . }}" {{ end }}
{{ if strings.HasPrefix .Destination "http" }} target="_blank" rel="noopener noreferrer" {{ end }}>
{{ .Text | safeHTML }}
</a>

View File

@ -0,0 +1,43 @@
<!DOCTYPE html>
<html lang="en">
{{ partial "head.html" . }}
<div class="container-xxl">
<body class="mb-5">
{{ partial "nav.html" . }}
<div class="container">
{{ if or
(eq .Page.Section "cv" )
}}
<div class="row mt-3">
{{ block "main" . }}{{ end }}
</div>
{{ else }}
<div class="container mt-2">
<div class="row">
<div class="col-lg-9 mt-5">
<article>
{{ block "main" . }}{{ end }}
</article>
</div>
<div class="col-lg-3 ">
<div class="row mt-5">
{{ partial "cloudtag.html" . }}
</div>
</div>
</div>
{{ end }}
</div>
</div>
{{ partial "footer.html" . }}
{{ if .Page.Store.Get "hasMermaid" }}
<script src="/js/mermaid.min.js"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
{{ end }}
{{ partial "cookie-consent.html" . }}
</body>
</html>

View File

@ -0,0 +1,7 @@
{{ define "main" }}
{{ .Content }}
{{ range site.RegularPages }}
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
{{ .Summary }}
{{ end }}
{{ end }}

View File

@ -0,0 +1,21 @@
{{- define "main" -}}
<h1>{{ .Title }}</h1>
{{ $pages := .Pages }}
{{ range $pages.ByPublishDate.Reverse }}
<p>
<a href="{{ .Permalink }}">{{ .Title | markdownify }}</a>
{{ $customDateFormat := "January 2, 2006" }}
{{ with .Site.Params.customDateFormat }}{{ $customDateFormat = . }}{{ end }}
<br>
<small class="text-secondary">{{ .PublishDate.Format $customDateFormat }}</small>
{{ partialCached "tags" . }}
{{ if eq .Site.Params.showPostSummary true }}
<br>
{{ .Summary }}
{{ end }}
</p>
{{ end }}
{{- end -}}

View File

@ -0,0 +1,10 @@
{{ define "main" }}
<h1>{{ .Title }}</h1>
{{ $dateMachine := .Date | time.Format "2006-01-02T15:04:05-07:00" }}
{{ $dateHuman := .Date | time.Format ":date_long" }}
<h4><time datetime="{{ $dateMachine }}">{{ $dateHuman }}</time></h4>
{{ .Content }}
{{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
{{ end }}

View File

@ -0,0 +1,10 @@
{{- define "main" -}}
<h1>{{ .Title }}</h1>
<div class="d-flex flex-wrap flex-row">
{{ range .Data.Terms.Alphabetical }}
<div class="w-25 m-1"><a href="{{ .Page.RelPermalink }}"><code>{{ .Page.Title }}</code></a> {{ .Count }}</div>
{{ end }}
</div>
{{- end -}}

19
layouts/index.json.json Normal file
View File

@ -0,0 +1,19 @@
{{- $post := slice -}}
{{- range where site.RegularPages.ByDate.Reverse "Section" "==" "posts" -}}
{{- $item := dict
"Title" .Title
"PlainContent" .Plain
"RelPermalink" .RelPermalink
-}}
{{- $post = $post | append $item -}}
{{- end -}}
{{- $object := dict "post" $post -}}
{{- if (eq site.Params.search_minify true) -}}
{{- $object | jsonify -}}
{{- else -}}
{{- $jsonifyOptions := dict "indent" " " -}}
{{- $object | jsonify $jsonifyOptions -}}
{{- end -}}

View File

@ -0,0 +1,6 @@
{{ if eq .Site.Params.includeBootstrapJs true}}
{{ $jqueryJs := "js/jquery-3.7.1.min.js" -}}
<script src="{{ $jqueryJs | absURL }}"></script>
{{ $bootstrapJs := "js/bootstrap.bundle.min.js" -}}
<script src="{{ $bootstrapJs | absURL }}"></script>
{{ end }}

View File

@ -0,0 +1,31 @@
{{ if not (eq (len $.Site.Taxonomies.tags) 0) }}
{{ $fontUnit := "rem" }}
{{ $largestFontSize := 2.0 }}
{{ $largestFontSize := 2.5 }}
{{ $smallestFontSize := 0.8 }}
{{ $fontSpread := sub $largestFontSize $smallestFontSize }}
{{ $max := add (len (index $.Site.Taxonomies.tags.ByCount 0).Pages) 1 }}
{{ $min := len (index $.Site.Taxonomies.tags.ByCount.Reverse 0).Pages }}
{{ $spread := sub $max $min }}
{{ $fontStep := div $fontSpread $spread }}
<div id="tag-cloud col" class="card" style="margin:0;padding:0;">
<div class="card-header card-titl text-bg-secondary mb-3">
<h3>Tags</h3>
</div>
<div class="card-body card-text" style="margin:0;padding:0.4em;text-align: center;">
{{ range $name, $taxonomy := $.Site.Taxonomies.tags }}
{{ $currentTagCount := len $taxonomy.Pages }}
{{ $currentFontSize := (add $smallestFontSize (mul (sub $currentTagCount $min) $fontStep) ) }}
{{ $count := len $taxonomy.Pages }}
{{ $weigth := div (sub (math.Log $count) (math.Log $min)) (sub (math.Log $max) (math.Log $min)) }}
{{ $currentFontSize := (add $smallestFontSize (mul (sub $largestFontSize $smallestFontSize) $weigth) ) }}
<!--Current font size: {{$currentFontSize}}-->
<a href="{{ "tags/" | relLangURL }}{{ $name | urlize }}"
style="font-size:{{$currentFontSize}}{{$fontUnit}}">{{ $name }}</a>
{{ end }}
</div>
</div>
{{ end }}

View File

@ -0,0 +1,18 @@
{{ if eq .Site.Params.cookieConsent true }}
<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.css" />
<script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js"></script>
<script>
window.addEventListener("load", function(){
window.cookieconsent.initialise({
"palette": {
"popup": {
"background": "#216942",
"text": "#b2d192"
},
"button": {
"background": "#afed71"
}
}
})});
</script>
{{ end }}

View File

@ -0,0 +1,42 @@
<div class="container-xxl">
<footer>
<nav class="navbar fixed-bottom navbar-expand-lg bg-dark mt-auto py-3">
<div class="text-muted container-xl">Last Update : {{ dateFormat "2006-01-02 15:04 MST" now.Local }}</div>
</nav>
</footer>
</div>
{{ partialCached "bootstrap-js.html" . }}
{{ if (findRE "<code" .Content 1) }} {{ $jsCopy :=resources.Get "copycode.js" | minify }}
<script src="{{ $jsCopy.RelPermalink }}"></script>
{{ end }}
{{ if site.Params.search }}
{{ $searchJs := resources.Get "search.js"
| resources.ExecuteAsTemplate "search.js" .
| fingerprint
}}
<script src="{{ $searchJs.RelPermalink }}"></script>
<script>
$(document).ready(function () {
// Show the Modal on load
$("#searchBtn").click(function () {
$("#searchModal").modal("show");
});
// Hide the Modal
$("#hideBtn").click(function () {
$("#searchModal").modal("hide");
});
// Show the Modal on pressing enter
$("#search").keypress(function (event) {
var keycode = (event.keyCode ? event.keyCode : event.which);
if (keycode == '13') {
$("#searchBtn").click();
event.preventDefault();
}
});
});
</script>
{{ end }}
{{ partial "google-analytics-async.html" . }}

View File

@ -0,0 +1,10 @@
{{ if not hugo.IsServer }}
{{ with .Site.Params.googleAnalytics }}
<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', '{{ . }}', 'auto');
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
{{ end }}
{{ end }}

View File

@ -0,0 +1,13 @@
{{ if not hugo.IsServer }}
{{ with .Site.Params.googleAnalytics }}
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', '{{ . }}', 'auto');
ga('send', 'pageview');
</script>
{{ end }}
{{ end }}

View File

@ -0,0 +1,45 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
{{ hugo.Generator }}
{{ with .Site.Params.description }}
<meta name="description" content="{{ . }}">
{{ end }}
{{ $appleTouchIcon := "apple-touch-icon.png" }}
<link rel="apple-touch-icon" sizes="180x180" href="{{ $appleTouchIcon | absURL }}">
{{ $favicon32x32 := "favicon-32x32.png" }}
<link rel="icon" type="image/png" sizes="32x32" href="{{ $favicon32x32 | absURL }}">
{{ $favicon16x16 := "favicon-16x16.png" }}
<link rel="icon" type="image/png" sizes="16x16" href="{{ $favicon16x16 | absURL }}">
{{ $siteWebmanifest := "site.webmanifest" }}
<link rel="manifest" href="{{ $siteWebmanifest | absURL }}">
{{ $safariPinnedTab := "safari-pinned-tab.svg" }}
<link rel="mask-icon" href="{{ $safariPinnedTab | absURL }}" color="{{ .Site.Params.faviconSafariPinnedTabColor }}">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css">
<meta name="msapplication-TileColor" content="{{ .Site.Params.faviconMsApplicationTileColor }}">
<meta name="theme-color" content="{{ .Site.Params.faviconThemeColor }}">
{{ if (findRE "<code" .Content 1) }}
{{ $syntax := resources.Get "chroma.css" | minify }}
<link href="{{ $syntax.RelPermalink }}" rel="stylesheet">
{{ $copyCss := resources.Get "copycodebtn.css" | minify }}
<link href="{{ $copyCss.RelPermalink }}" rel="stylesheet">
{{ end }}
{{ $bootstrapCss := "css/bootstrap.min.css" }}
<link rel="stylesheet" href="{{ $bootstrapCss | absURL }}" />
{{ partial "style.html" . }}
</head>

79
layouts/partials/nav.html Normal file
View File

@ -0,0 +1,79 @@
<nav class="navbar fixed-top navbar-expand-lg bg-dark mt-auto py-3">
<div class="container" style="color: #5e807fff">
<a class="navbar-brand" style="color: #5e807fff" href="/">{{ .Site.Title}}</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarTogglerDemo03"
aria-controls="navbarTogglerDemo03" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarTogglerDemo03">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
{{- $currentNode := . }}
{{- range .Site.Menus.nav }}
{{- if .Name }}
{{- if .HasChildren }}
<li class="nav_item dropdown">
<a class="nav-link dropdown-toggle" style="color: #5e807fff" href="#" id="dropdown08" data-bs-toggle="dropdown" aria-expanded="false">{{ .Name }}</a>
<ul class="dropdown-menu" aria-labelledby="dropdown08">
{{ range .Children }}
<li><a class="dropdown-item {{ if or ($currentNode.IsMenuCurrent "nav" .) ($currentNode.HasMenuCurrent "nav" .)}} active{{ end }}" aria-current="page" href="{{ .URL }}" {{ if ( and ( strings.HasPrefix .URL "http") ( strings.Contains .URL "globe")) }} target="_blank" rel="noopener noreferrer" {{ end }}>{{ .Name }}</a></li>
{{- end }}
</ul>
</li>
{{- else }}
<li class="nav-item">
<a class="nav-link {{ if or ($currentNode.IsMenuCurrent "nav" .) ($currentNode.HasMenuCurrent "nav" .)}} active{{ end }}" aria-current="page" style="color: #5e807fff" href="{{ .URL }}">{{ .Name }}</a>
</li>
{{- end }}
{{- end }}
{{- end }}
</ul>
</div>
<div class="bd-search" id="docsearch" data-bd-docs-version="5.2" style="margin-left: auto;">
<form class="d-flex" role="search">
<input id="search" class="form-control me-2" type="text" placeholder="press '/' to search"
aria-label="Search" >
<button id="searchBtn" class="btn btn-outline-secondary" type="button" data-bs-toggle="modal"
style="margin-left: 1em;" data-bs-target="#searchModal">Search</button>
<div class="form-check d-none">
<input class="form-check-input" type="checkbox" value="" id="enable_search" checked>
<label class="form-check-label" for="enable_search">Search</label>
</div>
<div class="form-check d-none">
<input class="form-check-input" type="checkbox" value="" id="regex_mode" >
<label class="form-check-label" for="regex_mode">Regex</label>
</div>
</form>
</div>
</nav>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark px-3 py-1 d-flex flex-row mt-0">
<ol class="breadcrumb m-0 text-secondary">
{{- range .Ancestors.Reverse }}
<li class="breadcrumb-item"><a class="text-decoration-none text-secondary" href="{{ .RelPermalink }}">{{ .Title }}</a> >> </li>
<span class="" aria-hidden="true"> </span>
{{- end }}
<li class="breadcrumb-item active "><a class="text-decoration-none text-secondary" href="{{ .RelPermalink }}">{{ .Title }}</a></li>
</ol></div>
</nav>
<!-- Modal -->
<div class="modal fade" id="searchModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1"
aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="staticBackdropLabel">Search Result</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p id="count">
results :
</p>
<ul id="listOfUrl" class="list-group" />
</div>
<div class="modal-footer">
<button id="hideBtn" type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>

195
layouts/partials/style.html Normal file
View File

@ -0,0 +1,195 @@
<style>
body {
min-width: 300px;
min-height: 100%;
display: flex;
flex-direction: column;
}
.custom-navbar,
.custom-footer {
margin-bottom: 1em;
height: 60px;
flex-shrink: 0;
}
.custom-navbar a {
display: inline-block;
padding: 18px 0;
margin-right: 1em;
font-weight: bold;
}
.custom-navbar a:hover,
.custom-navbar a:focus {
text-decoration: none;
}
@media print {
.custom-navbar {
display: none;
}
}
table {width: 80%;}
tr {
padding-left: 5px;
padding-right: 5px;}
tr:nth-child(even){background-color: #f2f2f2;}
th {
padding-top: 12px;
padding-bottom: 12px;
padding-left: 5px;
padding-right: 5px;
text-align: middle;
background-color: #6c757d;
color: white;
}
article {
padding-bottom: 1em;
}
img {
max-width: 100%;
}
{{ with .Site.Params.contentBackgroundColor }}
body {
background-color: {{ . | safeCSS }};
}
{{ else }}
body {
background-color: #fff;
}
{{ end }}
{{ with .Site.Params.contentTextColor }}
body {
color: {{ . | safeCSS }};
}
{{ else }}
body {
color: #212529;
}
{{ end }}
{{ with .Site.Params.contentLinkColor }}
a {
color: {{ . | safeCSS }};
}
{{ else }}
a {
color: #007bff;
}
{{ end }}
{{ with .Site.Params.contentLinkHoverColor }}
a:hover,
a:focus {
color: {{ . | safeCSS }};
}
{{ else }}
a:hover,
a:focus {
color: #0056b3;
}
{{ end }}
{{ with .Site.Params.navbarBackgroundColor }}
.navbar,
.footer {
background-color: {{ . | safeCSS }};
}
{{ else }}
.navbar,
.footer {
background-color: #212529;
}
{{ end }}
{{ with .Site.Params.navbarForegroundColor }}
:root {
--bs-navbar-color: {{ . | safeCSS }};
}
{{ else }}
:root {
--bs-navbar-color: #5e807fff;
}
{{ end }}
{{ with .Site.Params.navbarLinkColor }}
.custom-navbar a {
color: {{ . | safeCSS }};
}
{{ else }}
.custom-navbar a {
color: rgba(255,255,255,.75);
}
{{ end }}
{{ with .Site.Params.navbarLinkHoverColor }}
.custom-navbar a:hover,
.custom-navbar a:focus {
color: {{ . | safeCSS }};
}
{{ else }}
.custom-navbar a:hover,
.custom-navbar a:focus {
color: rgba(255,255,255,1);
}
{{ end }}
{{ with .Site.Params.wrapperMaxWidth }}
.container {
max-width: {{ . | safeCSS }};
}
{{ else }}
.container {
max-width: 800px;
}
{{ end }}
{{ if eq .Site.Params.customCodeStyle true }}
pre {
display: block;
padding: 9.5px;
word-break: break-all;
word-wrap: break-word;
background-color: #f5f5f5;
border: 1px solid #ccc;
border-radius: 4px;
}
pre code {
padding: 0;
font-size: inherit;
color: inherit;
white-space: pre-wrap;
background-color: transparent;
border: none;
border-radius: 0;
}
code {
padding: 2px 4px;
color: inherit;
background-color: #f5f5f5;
border: 1px solid #ccc;
border-radius: 4px;
font-size: .9em;
}
{{ end }}
{{ if eq .Site.Params.customBlockquoteStyle true }}
blockquote,
.blockquote {
padding: 10px 20px;
margin: 0 0 20px;
font-size: 1em;
border-left: 5px solid #6c757d;
}
{{ end }}
</style>

View File

@ -0,0 +1,4 @@
{{ range .Params.tags }}
{{ $href := print (absURL "tags/") (urlize .) }}
<small><code><a href="{{ $href }}" class="text-decoration-none">{{ . }}</a></code></small>
{{ end }}

View File

@ -0,0 +1,21 @@
{{- /*
For a given taxonomy, renders a list of terms assigned to the page.
@context {page} page The current page.
@context {string} taxonomy The taxonomy.
@example: {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
*/}}
{{- $page := .page }}
{{- $taxonomy := .taxonomy }}
{{- with $page.GetTerms $taxonomy }}
{{- $label := (index . 0).Parent.LinkTitle }}
<div>
<div>{{ $label }}:</div>
{{- range . }}
<small><code><a href="{{ .RelPermalink }}" class="text-decoration-none">{{ .LinkTitle }}</a></code></small>
{{- end }}
</div>
{{- end }}

111
layouts/section/cv.html Normal file
View File

@ -0,0 +1,111 @@
{{- define "main" -}}
<div class=" d-flex flex-column col-lg-4 min-vh-100" style="box-shadow: 0 4px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); background-color: #4472C4;color: white;">
<img class="portait my-5 mx-auto " style="border-radius: 50%; max-width: 200px; display: block;box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 4px 4px rgba(0,0,0,0.24); border:6px solid white;" alt="Portrait" src="/img/avatar.jpeg" />
<a class="text-decoration-none text-white" href="https://www.linkedin.com/in/xxx/"><i class="bi bi-linkedin"></i> John Doe</a>
<p></p>
<h3>About me</h3>
<p>Donec et eros nunc. Etiam laoreet facilisis lacus, et dictum neque malesuada sit amet. Vestibulum vitae viverra lacus. Etiam risus dolor, placerat quis enim eget, dictum placerat nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi eu lacinia mauris. Pellentesque faucibus vestibulum turpis quis pellentesque.</p>
<p>Suspendisse varius quis sapien sed tincidunt. Cras tempor metus eget tellus varius rutrum. Phasellus et sodales tellus.</p>
<p>Aenean sem risus, tincidunt vitae dapibus quis, iaculis et est.</p>
<br>
<h3>Competences</h3>
<ul>
<li>Microsoft Biztalk</li>
<li>.Net, C#, WCF</li>
<li>Microsoft SQL</li>
<li>SAP Cloud Integration</li>
<li>XML, XSLT, XPath, XQuery</li>
<li>Git, Jira</li>
</ul>
<br>
<h3>Languages</h3>
<ul>
<li>French, mother tongue</li>
<li>English, Professional</li>
</ul>
<br>
<h3>Center of Interest</h3>
<ul>
<li>Friends</li>
<li>Travel</li>
<li>Rugby</li>
<li>Aviation and Planes</li>
<li>Spatial Discoveries</li>
</ul>
</div>
<div class="col-lg-8 mx-0 px-0 ">
<div class="pt-5 pb-3 px-5" style = "background-color: #e6e6e4;">
<h2 class="text-black">John <span class="text-uppercase" style="color:#4472C4">Doe</span></h2>
<p>My Title / Profession</p>
<ul class="list-unstyled">
<li><i class="bi bi-envelope"></i> <a href="mailto:john.doe@somegmail.com">john.doe@somegmail.com</a></li>
<li><i class="bi bi-telephone"></i> +1 23 456 7890</li>
<li><i class="bi bi-pin-map-fill"></i> some address</li>
</ul>
</div>
<div class="d-flex flex-column container px-5 py-4 shadow-sm min-vh-100">
<h3>Professional Experiences</h3>
<p>
<strong>Since Month Year : Company (Country)</strong>
<br>
Position / title
</p>
<ul class="experience-list">
<li>Responsabilities</li>
<li>Activity 1</li>
<li>Activity 2</li>
<li>Activity 3</li>
<li>Activity 4</li>
<li>Activity 5</li>
<li>Technologies : Tech1. Tech2, Tech3</li>
</ul>
<p>
<strong>Month Year <i class="bi bi-arrow-right"></i> Month Year : Company (Country)</strong>
<br>
Position / Title
</p>
<ul class="experience-list">
<li>Responsabilities</li>
<li>Activity 1</li>
<li>Activity 2</li>
<li>Activity 3</li>
<li>Activity 4</li>
<li>Activity 5</li>
<li>Technologies : Tech1. Tech2, Tech3</li>
</ul>
<p>
<strong>Month Year <i class="bi bi-arrow-right"></i> Month Year : Company (Country)</strong>
<br>
Position / Title
</p>
<ul class="experience-list">
<li>Responsabilities</li>
<li>Activity 1</li>
<li>Activity 2</li>
<li>Activity 3</li>
<li>Activity 4</li>
<li>Activity 5</li>
<li>Technologies : Tech1. Tech2, Tech3</li>
</ul>
<h3>Studies and formations</h3>
<p>
<strong>Year <i class="bi bi-arrow-right"></i> Year</strong>
<br>
<em>Graduation, Diploma ...</em>, University, City, Country
</p>
<p>
<strong>Year <i class="bi bi-arrow-right"></i> Year</strong>
<br>
<em>Graduation, Diploma ...</em>, University, City, Country
</p>
</div>
</div>
{{- end -}}

7
static/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

BIN
static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
static/img/avatar.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

7
static/js/bootstrap.bundle.min.js vendored Normal file

File diff suppressed because one or more lines are too long

2
static/js/jquery-3.7.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

2151
static/js/mermaid.min.js vendored Normal file

File diff suppressed because one or more lines are too long

19
theme.toml Normal file
View File

@ -0,0 +1,19 @@
name = 'Fha Theme'
license = 'MIT'
licenselink = 'https://github.com/owner/repo/LICENSE'
description = 'A simple theme used for blogging, portfolio and documenting. Based on Bootstrap. '
# The home page of the theme, where the source can be found
homepage = 'https://fhanotes.fhahome.dev/hugo-theme'
# If you have a running demo of the theme
demosite = 'https://owner.github.io/repo'
# Taxonomy terms
tags = ['blog', 'portfolio', 'search']
features = ['Mermaid', 'Search', 'Bootstrap', 'CV', 'Portfolio', 'Photo']
# If the theme has a single author
[author]
name = 'Hautecoeur Frédéric'
homepage = 'https://fhanotes.fhahome.dev/'