Initial Upload
This commit is contained in:
commit
c81d065c89
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
public/**
|
||||
.vscode/**
|
0
.hugo_build.lock
Normal file
0
.hugo_build.lock
Normal file
39
README.md
Normal file
39
README.md
Normal 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
6
archetypes/default.md
Normal file
@ -0,0 +1,6 @@
|
||||
+++
|
||||
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
|
||||
date = {{ .Date }}
|
||||
draft = true
|
||||
tags: []
|
||||
+++
|
BIN
assets/chroma.css
Normal file
BIN
assets/chroma.css
Normal file
Binary file not shown.
51
assets/copycode.js
Normal file
51
assets/copycode.js
Normal 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
104
assets/copycodebtn.css
Normal 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
136
assets/search.js
Normal 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
9
content/_index.md
Normal 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
24
content/about.md
Normal 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 **world’s 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
0
content/cv/_index.md
Normal file
7
content/posts/_index.md
Normal file
7
content/posts/_index.md
Normal 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
38
content/posts/post-1.md
Normal 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
10
content/posts/post-2.md
Normal 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.
|
BIN
content/posts/post-3/bryce-canyon.jpg
Normal file
BIN
content/posts/post-3/bryce-canyon.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
12
content/posts/post-3/index.md
Normal file
12
content/posts/post-3/index.md
Normal 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.
|
||||
|
||||

|
||||
|
||||
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
138
hugo.toml
Normal 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 = '’'
|
||||
disable = false
|
||||
ellipsis = '…'
|
||||
emDash = '—'
|
||||
enDash = '–'
|
||||
leftAngleQuote = '«'
|
||||
leftDoubleQuote = '“'
|
||||
leftSingleQuote = '‘'
|
||||
rightAngleQuote = '»'
|
||||
rightDoubleQuote = '”'
|
||||
rightSingleQuote = '’'
|
||||
[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"]
|
4
layouts/_default/_markup/render-codeblock-mermaid.html
Normal file
4
layouts/_default/_markup/render-codeblock-mermaid.html
Normal file
@ -0,0 +1,4 @@
|
||||
<div class="mermaid">
|
||||
{{- .Inner | safeHTML }}
|
||||
</div>
|
||||
{{ .Page.Store.Set "hasMermaid" true }}
|
5
layouts/_default/_markup/render-link.html
Normal file
5
layouts/_default/_markup/render-link.html
Normal 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>
|
43
layouts/_default/baseof.html
Normal file
43
layouts/_default/baseof.html
Normal 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>
|
7
layouts/_default/home.html
Normal file
7
layouts/_default/home.html
Normal file
@ -0,0 +1,7 @@
|
||||
{{ define "main" }}
|
||||
{{ .Content }}
|
||||
{{ range site.RegularPages }}
|
||||
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
|
||||
{{ .Summary }}
|
||||
{{ end }}
|
||||
{{ end }}
|
21
layouts/_default/list.html
Normal file
21
layouts/_default/list.html
Normal 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 -}}
|
10
layouts/_default/single.html
Normal file
10
layouts/_default/single.html
Normal 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 }}
|
10
layouts/_default/terms.html
Normal file
10
layouts/_default/terms.html
Normal 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
19
layouts/index.json.json
Normal 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 -}}
|
6
layouts/partials/bootstrap-js.html
Normal file
6
layouts/partials/bootstrap-js.html
Normal 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 }}
|
31
layouts/partials/cloudtag.html
Normal file
31
layouts/partials/cloudtag.html
Normal 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 }}
|
18
layouts/partials/cookie-consent.html
Normal file
18
layouts/partials/cookie-consent.html
Normal 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 }}
|
42
layouts/partials/footer.html
Normal file
42
layouts/partials/footer.html
Normal 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" . }}
|
10
layouts/partials/google-analytics-async.html
Normal file
10
layouts/partials/google-analytics-async.html
Normal 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 }}
|
13
layouts/partials/google-analytics.html
Normal file
13
layouts/partials/google-analytics.html
Normal 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 }}
|
45
layouts/partials/head.html
Normal file
45
layouts/partials/head.html
Normal 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
79
layouts/partials/nav.html
Normal 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
195
layouts/partials/style.html
Normal 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>
|
4
layouts/partials/tags.html
Normal file
4
layouts/partials/tags.html
Normal 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 }}
|
21
layouts/partials/terms.html
Normal file
21
layouts/partials/terms.html
Normal 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
111
layouts/section/cv.html
Normal 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
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
BIN
static/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
BIN
static/img/avatar.jpeg
Normal file
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
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
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
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
19
theme.toml
Normal 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/'
|
Loading…
x
Reference in New Issue
Block a user