Compare commits

..

No commits in common. '053b5784aa0a5a3f799c0636fffed68c53012263' and '8ff37227804f06bfb1d36d158efe77d0bcdf7708' have entirely different histories.

  1. BIN
      assets/img/portfolio/adventofcode/screenshot.png
  2. BIN
      assets/img/portfolio/google-foobar/screenshot.png
  3. BIN
      assets/img/portfolio/minecraft-client/cover.png
  4. BIN
      assets/img/portfolio/unengine/screenshot.png
  5. BIN
      assets/img/posts/first-lego-league/cover.jpg
  6. BIN
      assets/img/posts/first-lego-league/nationals-invitation.jpg
  7. BIN
      assets/img/posts/first-lego-league/robot.jpg
  8. 1
      config/_default/hugo.toml
  9. 23
      content/portfolio/adventofcode.md
  10. 26
      content/portfolio/google-foobar.md
  11. 9
      content/portfolio/learn-to-program.md
  12. 21
      content/portfolio/mailserver-setup.md
  13. 32
      content/portfolio/minecraft-client.md
  14. 7
      content/portfolio/superbot.md
  15. 11
      content/portfolio/toy-neural-network-py.md
  16. 32
      content/portfolio/unengine.md
  17. 10
      content/portfolio/watch-together.md
  18. 7
      content/portfolio/youtube-music-desktop-player.md
  19. 77
      content/posts/first-lego-league.md
  20. 7
      themes/maik-blog/assets/scss/_main.scss
  21. 43
      themes/maik-blog/assets/scss/_portfolio.scss
  22. 17
      themes/maik-blog/assets/scss/_portfolios.scss
  23. 7
      themes/maik-blog/assets/scss/_post.scss
  24. 7
      themes/maik-blog/i18n/en.toml
  25. 215
      themes/maik-blog/layouts/_default/single.html
  26. 20
      themes/maik-blog/layouts/portfolio/list.html
  27. 81
      themes/maik-blog/layouts/portfolio/single.html
  28. 178
      themes/maik-blog/layouts/posts/single.html
  29. 178
      themes/maik-blog/layouts/writeups/single.html

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 572 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 630 KiB

@ -43,7 +43,6 @@ enableEmoji = true
dateformShort = "Jan 2" dateformShort = "Jan 2"
dateformNum = "2006-01-02" dateformNum = "2006-01-02"
dateformNumTime = "2006-01-02 15:04 -0700" dateformNumTime = "2006-01-02 15:04 -0700"
dateformMonth = "Jan, 2006"
# Metadata mostly used in document's head # Metadata mostly used in document's head
description = "Hey there, my name is Maik de Kruif, I create websites, bots and other kinds of software. At the moment, I'm still studying computer science at Avans University of Applied Sciences. I am also a big fan of open-source software, which is why you'll find many of my projects on Github. And last but not least, I love playing around with cyber-security related stuff." description = "Hey there, my name is Maik de Kruif, I create websites, bots and other kinds of software. At the moment, I'm still studying computer science at Avans University of Applied Sciences. I am also a big fan of open-source software, which is why you'll find many of my projects on Github. And last but not least, I love playing around with cyber-security related stuff."

@ -1,23 +0,0 @@
+++
author = "Maik de Kruif"
title = "Advent of Code"
start_date = 2020-10-15
end_date = 2099-05-04
company_name = "Personal"
company_url = "https://maik.dev"
cover = "img/portfolio/adventofcode/screenshot.png"
description = "Advent of Code is an annual programming event that presents daily coding puzzles. I actively participate in the events, solving the challenges and improving my coding skills."
source_code = "https://github.com/maikka39/Advent-of-Code"
skills = [
"Problem-solving",
"Programming efficiency",
"Time management",
]
+++
[Advent of Code](https://adventofcode.com/) is a popular annual programming event that presents a series of coding puzzles, one for each day of December until Christmas. Each puzzle involves solving a problem using a programming language of your choice, with (generally) increasing difficulty as the event progresses.
I actively participate in Advent of Code, relishing the daily challenges and the opportunity to sharpen my coding skills. The puzzles covered a wide range of topics, from string manipulation and data structures to algorithms and game theory.
By consistently solving the puzzles, I hone my problem-solving abilities, improve my understanding of different programming paradigms, and discover new and innovative approaches to coding challenges.

@ -1,26 +0,0 @@
+++
author = "Maik de Kruif"
title = "Google Foobar"
start_date = 2020-10-15
end_date = 2021-05-04
company_name = "Personal"
company_url = "https://maik.dev"
cover = "img/portfolio/google-foobar/screenshot.png"
description = "Google Foobar is a mysterious coding challenge platform launched by Google. I successfully solved all the challenges presented by the platform, showcasing my coding abilities and problem-solving skills."
source_code = "https://github.com/maikka39/Google-Foobar"
skills = [
"Problem-solving",
"Algorithm design",
"Time management",
]
+++
Google Foobar is a mysterious coding challenge platform launched by Google. It's designed to identify exceptional engineering talent through a series of progressively difficult coding problems. The platform's unique approach involves inviting users to solve challenges directly via the Google Search page, adding an element of intrigue and surprise.
I was fortunate enough to receive an invitation to Google Foobar. The initial challenge was a simple warm-up, but subsequent levels escalated in complexity, requiring me to delve into various algorithms and data structures.
Throughout my journey, I faced a diverse range of problems, from graph traversal and dynamic programming to string manipulation and number theory. Each challenge presented a unique opportunity to test my problem-solving skills and explore new coding techniques.
With dedication and perseverance, I managed to successfully solve all the challenges presented by Google Foobar. It was a rewarding experience that allowed me to showcase my coding abilities and learn new maths concepts.
~~If you're a passionate coder looking for a stimulating challenge, Google Foobar is definitely worth exploring. It's a great way to test your skills, learn new concepts, and potentially open doors to exciting opportunities.~~ Unfortunately, Google shut down the platform, and the challenges are no longer available. You can still try them by taking a look at the challenge texts in my GitHub repo, by clicking the link at the top of this post.

@ -7,12 +7,13 @@ company_name = "Personal"
company_url = "https://maik.dev" company_url = "https://maik.dev"
cover = "img/portfolio/learn-to-program/screenshot.png" cover = "img/portfolio/learn-to-program/screenshot.png"
description = "This website was created for a school assignment. It was created with HTML and CSS only and no frameworks were used." description = "This website was created for a school assignment. It was created with HTML and CSS only and no frameworks were used."
source_code = "https://github.com/maikka39/Learn-to-Program"
live_demo = "https://maikka39.github.io/Learn-to-Program/"
skills = [ skills = [
"Pure HTML and CSS", "Pure HTML and CSS",
"Web design",
] ]
+++ +++
This website was created for a school assignment. It was created with HTML and CSS only and no frameworks were used. Not even JS was allowed (so I had to get creative with animations). This website was created for a school assignment. It was created with HTML and CSS only and no frameworks were used.
[Github](https://github.com/maikka39/Learn-to-Program)
[Live](https://maikka39.github.io/Learn-to-Program/)

@ -1,21 +0,0 @@
+++
author = "Maik de Kruif"
title = "MailServerSetup"
start_date = 2021-04-22
end_date = 2021-06-24
company_name = "Personal"
company_url = "https://maik.dev"
description = "A script that automates the grueling process of installing and setting up an email server. It perfectly reproduces my successful steps to ensure the same setup time and time again, now with many improvements."
source_code = "https://github.com/maikka39/MailServerSetup"
skills = [
"Mailing protocol",
"SPF, DKIM, DMARC",
"Bash scripting",
]
+++
A script that automates the grueling process of installing and setting up an email server. It perfectly reproduces my successful steps to ensure the same setup time and time again, now with many improvements.
MailServerSetup ensures a consistent and efficient deployment. It leverages Postfix, Dovecot, and SpamAssassin, providing an all-round email solution.
Simply specify your desired domain, and the script will handle the setup, including generating the necessary SPF, DMARC, and DKIM records and providing them to you.

@ -1,32 +0,0 @@
+++
author = "Maik de Kruif"
title = "MinecraftClient"
start_date = 2022-08-30
end_date = 2022-12-29
company_name = "Personal"
company_url = "https://maik.dev"
cover = "img/portfolio/minecraft-client/cover.png"
description = "A Minecraft client that was designed to overcome a series of challenges presented by a YouTuber named LiveOverflow. The client was built using Kotlin and Fabric, and it featured creative solutions to bypass the server's defenses."
source_code = "https://github.com/maikka39/MinecraftClient"
skills = [
"Java code injection",
"Reverse engineering",
"Java & Gradle",
]
+++
A Minecraft client that was designed to overcome a series of challenges presented by a YouTuber named LiveOverflow. The client was built using Kotlin and Fabric, and it featured creative solutions to bypass the server's defenses.
LiveOverflow set up a secret Minecraft server with a twist: finding it was the first challenge. After some clever detective work, including exploiting a slip-up in one of LiveOverflow's videos, I gained access.
The real fun began with the server's challenges. One required the client to move the player in a way that mimicked a bot, not a human. This meant overcoming the limitations of how computers represent numbers to ensure the server wouldn't detect "human-like" rounding errors.
Another challenge involved reaching a protected chest. The initial solution involved some trickery, but the server was patched. To adapt, the client needed to exploit a loophole in how the server tracked player movement. By manipulating the game's internal state and sending carefully crafted packets, the client achieved imperceptible movements, bypassing the server's defenses.
Reverse engineering the server's code was crucial in finding these exploits. By understanding the server's logic and implementation, I could identify vulnerabilities and devise strategies to exploit them. This process required a deep dive into the Minecraft server's source code and a keen eye for potential weaknesses.
The code for this client was written in Kotlin and injected into the Minecraft client using Fabric. This approach allowed for flexibility and customization, perfectly suited for tackling the server's unique challenges.
This project was a fascinating exploration of Minecraft's inner workings and the creativity required to overcome seemingly impossible challenges. As new challenges emerge, this client was ready to evolve and conquer them!
See also [my post about the experience]({{% ref "posts/liveoverflow-minecraft-server.md" %}}) for a more in-depth explanation.

@ -6,7 +6,6 @@ end_date = 2021-04-24
company_name = "Personal" company_name = "Personal"
company_url = "https://maik.dev" company_url = "https://maik.dev"
description = "A Discord bot I wrote for my own server so that I could manage the server better and listen to music in voice channels." description = "A Discord bot I wrote for my own server so that I could manage the server better and listen to music in voice channels."
source_code = "https://github.com/maikka39/SuperBot"
skills = [ skills = [
"Python", "Python",
"Asynchronous programming", "Asynchronous programming",
@ -16,6 +15,8 @@ skills = [
An amazing Discord bot with lots of functionalities! An amazing Discord bot with lots of functionalities!
SuperBot is a Discord bot I wrote for my own server so that I could manage the server better and listen to music together in voice channels. A Discord bot I wrote for my own server so that I could manage the server better and listen to music in voice channels.
I developed SuperBot using Python. Through this project, I gained experience in Discord bot development, including API interactions, event handling, and user interface design. Additionally, I learned valuable lessons in error handling, optimization, and scalability. SuperBot is the solution to your crowded and chaotic Discord server!
[Github](https://github.com/maikka39/SuperBot)

@ -2,11 +2,10 @@
author = "Maik de Kruif" author = "Maik de Kruif"
title = "Toy-Neural-Network-Py" title = "Toy-Neural-Network-Py"
start_date = 2019-03-02 start_date = 2019-03-02
end_date = 2021-06-07 end_date = 2019-04-16
company_name = "Personal" company_name = "Personal"
company_url = "https://maik.dev" company_url = "https://maik.dev"
description = "Neural Network Python library for experimenting with Machine Learning." description = "Neural Network Python library for experimenting with Machine Learning"
source_code = "https://github.com/maikka39/Toy-Neural-Network-Py"
skills = [ skills = [
"Machine Learning", "Machine Learning",
"Neural Networks", "Neural Networks",
@ -15,8 +14,6 @@ skills = [
] ]
+++ +++
Neural Network Python library for experimenting with Machine Learning. Neural Network Python library for experimenting with Machine Learning
Based on the amazing work done by [Daniel Shiffman](https://github.com/shiffman) at [TheCodingTrain](https://thecodingtrain.com/), I built my own Neural Network library in Python. I used [Chapter 10: Neural Networks](https://natureofcode.com/neural-networks/) of his Nature of Code book as a reference. [Github](https://github.com/maikka39/Toy-Neural-Network-Py)
Building this library was a very valuable learning experience. It’s helped me grasp the underlying principles of these models, from basic neuron structures to more complex algorithms like backpropagation.

@ -1,32 +0,0 @@
+++
author = "Maik de Kruif"
title = "UnEngine"
start_date = 2022-11-09
end_date = 2022-12-22
company_name = "Personal"
company_url = "https://maik.dev"
cover = "img/portfolio/unengine/screenshot.png"
description = "Together with three other students, I built a game engine from the ground up using C++. To put our engine to the test, we also developed a fun racing game."
skills = [
"Low level programming",
"Game engine architecture",
"Event-driven programming",
"Networking",
"Teamwork",
]
[source_code]
engine = "https://github.com/Systems-Programming-in-C-Minor/engine"
game = "https://github.com/Systems-Programming-in-C-Minor/game"
server = "https://github.com/Systems-Programming-in-C-Minor/server"
+++
Together with three other students, I built a game engine from the ground up using C++. To put our engine to the test, we also developed a fun racing game.
The racing game offered a variety of features: AI-controlled opponents that challenged players, controller support for a more immersive experience, local multiplayer for split-screen fun, and online multiplayer capabilities using a game server.
To add variety and replayability, we included multiple maps and game modes. Players could race on different tracks, each with its own unique challenges, obstacles and sound effects.
Our game engine was crafted using C++ and SDL2, and provided the foundation for our racing game. We adopted an event-driven architecture, allowing our engine to efficiently handle various inputs and events. To create a realistic experience, we implemented physics calculations for collisions, speed, and traction.
To enhance the audio experience, we developed a sound engine that allowed us to incorporate a variety of sound effects into our game. To optimize performance and memory usage, we implemented texture pooling, which efficiently manages and reuses textures. Finally, to enable multiplayer functionality, we integrated networking capabilities into our engine, allowing players to connect and compete with each other online.

@ -15,16 +15,10 @@ skills = [
"Real time synchronization", "Real time synchronization",
"REST API", "REST API",
] ]
[source_code]
frontend = "https://github.com/maikka39/WatchTogether"
backend = "https://github.com/maikka39/WatchTogether-Server"
+++ +++
WatchTogether is an online service that lets you watch a video together with your friends without being in the same room! WatchTogether is an online service that lets you watch a video together with your friends without being in the same room!
WatchTogether is an online service that synchronizes video playback across users' web browsers, allowing friends to enjoy videos together virtually. This project challenged me to build both the front-end and back-end. I utilized React to create a user-friendly interface and Node.js with Socket.IO in the back-end to handle the real-time communication and video synchronization. [Github](https://github.com/maikka39/WatchTogether)
However, I quickly realized that synchronizing anything between clients on terrible network connections is a real challenge. This project pushed me to find solutions to ensure a smooth viewing experience, even on potato internet connections.
WatchTogether not only provided a fun solution for remote movie nights, but also deepened my knowledge of front-end frameworks like React and back-end technologies like Node.js and Socket.IO. [Github (backend)](https://github.com/maikka39/WatchTogether-Server)

@ -7,7 +7,6 @@ company_name = "Personal"
company_url = "https://maik.dev" company_url = "https://maik.dev"
cover = "img/portfolio/youtube-music-desktop-player/screenshot.png" cover = "img/portfolio/youtube-music-desktop-player/screenshot.png"
description = "YouTube Music Desktop Player converts YouTube Music to a standalone desktop app. Because of this, you will never have to go through all your tabs to control your music." description = "YouTube Music Desktop Player converts YouTube Music to a standalone desktop app. Because of this, you will never have to go through all your tabs to control your music."
source_code = "https://github.com/maikka39/Youtube-Music-Desktop-Player"
skills = [ skills = [
"Desktop Application Development", "Desktop Application Development",
"Electron", "Electron",
@ -18,8 +17,6 @@ skills = [
YouTube Music Desktop Player converts YouTube Music to a standalone desktop app. Because of this, you will never have to go through all your tabs to control your music. YouTube Music Desktop Player converts YouTube Music to a standalone desktop app. Because of this, you will never have to go through all your tabs to control your music.
Before Google released their official YouTube Music desktop app, I created my own using Electron. I used script injection to add custom features like buttons, media key control, Discord rich presence, and custom styling. Additionally, I implemented [MPRIS](https://specifications.freedesktop.org/mpris-spec/latest/) support for integration with desktop environments. _This software has no affiliation this Google, YouTube Music is a trademark of Google LCC._
This project was a valuable learning experience, as it allowed me to explore the capabilities of Electron and deepen my understanding of web technologies and desktop app development. It also gave me the opportunity to solve real-world problems and create a tool that enhanced the YouTube Music experience. [Github](https://github.com/maikka39/Youtube-Music-Desktop-Player)
_This software has no affiliation this Google, YouTube Music is a trademark of Google LLC._

@ -1,77 +0,0 @@
+++
author = "Maik de Kruif"
title = "FIRST LEGO League"
date = 2020-01-01T08:00:00+02:00
description = "Together with the other members of Brainbuddies, I participated twice in the FIRST LEGO League competition. We reached the Benelux finals and received prizes for both our Robot and Core Values presentations."
cover = "img/posts/first-lego-league/cover.jpg"
tags = [
"personal",
]
categories = [
"personal",
"misc",
]
+++
Together with the other members of Brainbuddies, I participated twice in the FIRST LEGO League competition. We reached the Benelux finals and received prizes for both our Robot and Core Values presentations.
[FIRST LEGO League (FLL)](https://en.wikipedia.org/wiki/FIRST_Lego_League_Challenge) is an international competition for elementary and middle school students. Each year in August FIRST LEGO League introduces a scientific and real-world challenge for teams to focus and research on. The robotics part of the competition involves designing and programming LEGO Mindstorms robots to complete tasks. The students also work out a solution to a problem related to the theme (changes every year) and then meet for regional, national and international tournaments to compete, share their knowledge, compare ideas, and display their robots.
## The beginning
The story starts in 2014. Being 12 years old at the time, the amount of things you need to manage as a team can be overwhelming.
The FLL challenge consists of three parts; research a real-world problem, design a solution, and create a LEGO robot to complete missions related to the theme. At the finals, the teams also present their research project and robot design to judges, demonstrating their creativity, problem-solving skills, and teamwork.
Our team consisted of six people, one of which being [Raymon](https://raymon.dev/). Since we each had different strenths, we each were in charge of own subject. My primary focus was on developing the robot.
## Robot design and programming
When I started, I had hardly any knowledge of LEGO Mindstorms, let alone how to program one. I had played around a bit with [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)) at the time, which is what got me interested in programming, but never developed something tangible.
As a team we went to work on an old track from a previous edition first. This way, we could increase our knowledge of LEGO Mindstorms, and how its programming works. In the beginning it was quite a challenge. As it turns out, physics is a real thing, and telling the robot to go straight doesn't mean it actually will:smiling_face_with_tear:. In the end we were able to solve most of the challenges from this previous edition.
Since we were young and had plenty of other things to distract us, we took our time, and worked on the robot on and off for a few years. As we were perfecting the previous track, the new theme was announced: Hydrodynamics. The track that came with it was on a completely different level. It took us quite some time to adapt.
{{< figure class="small" src="/img/posts/first-lego-league/robot.jpg" title="Our robot around 2016" >}}
## Regionals
It's now November 24th 2017, regional finals time!
There were many teams present. Each and every one of them prepared themselves and now the competition can truly begin. All the teams were putting the finishing touches on their robot, and it was fun to see the creative solutions the other teams came up with.
### The Robot Competition
In the first round we got 80 points, which gave us first place for the first round. After that we remained high, but the Facimus team overtook us in the second round. In the third round we were unfortunately again overtaken, this time by the Robodirck team. We eventually came third in the robot section.
### The Project Presentation
When we walked into the jury room, and put the project on the table, you could already see that the jury was impressed. The presentation itself went well, and they thought it was a nice project.
### The Core Values presentation
The core values presentation went fantastically, we were able to tell a lot about our team, how we worked and how we experienced it. The jury gave us full points, they really liked our team and presentation.
### The Robot presentation
Finally we showed our robot. We explained how we came up with the robot, how we first we had an internal competition within the team to experiment, and later had brought back the best aspects of all robots in one new robot. This presentation was also well received.
### The award ceremony
Finally the most exciting moment came, the award ceremony. We were not called forward for the 'smaller' prizes for the separate components, which we thought was a bit strange having received very good feedback from the juries. But in the end we turned out to have won the main prize!!! This meant that we could go straight to the Benelux finals. A moment never to forget.
{{< figure class="small" src="/img/posts/first-lego-league/nationals-invitation.jpg" title="Invitation to the Benelux finals" >}}
_Note: Benelux is an intergovernmental union of Belgium, the Netherlands, and Luxembourg._
## The Benelux finals
The moment we won the regional finals, we could breathe again. The pressure from the regionals came of, but was partly replaced by the upcoming finals. Luckily there was quite a bit of time between the events, and we needed it. We decided to mainly work on improving our robot. We gained a lot of experience from the regional finals, and our most important lesson was that changing the robot for the different challenges took far too long. The runs on the table are time limited, and we were losing half our time changing the extensions. Extensions were the LEGO constructions that we were adding to the robot to perform certain tasks. We had to think of a different design and create it quickly.
Unfortunately, we couldn't win this one:cry:. The competition was simply too fierce.
## Looking back
Looking back at this all, I learned a lot. Working with a team on a complex project at that age, was an experience that helped me throughout my early career. To all kids between age 9 and 15 I would say to try and participate in an event like this if they have the chance. I certainly would do it again.

@ -421,10 +421,3 @@ table {
} }
} }
} }
.feather {
display: inline-block;
vertical-align: -0.125em;
width: 1em;
height: 1em;
}

@ -13,6 +13,12 @@
max-width: 600px; max-width: 600px;
} }
&-start-date {
&:after {
content: "";
}
}
&-title { &-title {
font-size: 2.625rem; font-size: 2.625rem;
margin: 0 0 20px; margin: 0 0 20px;
@ -26,11 +32,6 @@
} }
} }
&-timespan {
margin-top: -20px;
font-size: 0.9em;
}
&-tags { &-tags {
display: block; display: block;
margin-bottom: 20px; margin-bottom: 20px;
@ -46,31 +47,6 @@
margin-top: 30px; margin-top: 30px;
} }
&-links {
font-size: 0.8em;
margin-top: -8px;
opacity: 0.7;
a {
text-decoration: none;
}
> * {
margin-right: 8px;
}
// display: flex;
// flex-direction: row;
// align-items: center;
// font-size: 0.9em;
// gap: 10px;
// > * {
// margin: 0;
// }
}
&-cover { &-cover {
border-radius: 8px; border-radius: 8px;
margin: 40px -50px; margin: 40px -50px;
@ -113,6 +89,13 @@
content: "#"; content: "#";
} }
} }
.feather {
display: inline-block;
vertical-align: -0.125em;
width: 1em;
height: 1em;
}
} }
.flag { .flag {

@ -68,20 +68,23 @@
&-title { &-title {
font-size: 1rem; font-size: 1rem;
margin: 5px 0 2px 0; margin: 5px 0 5px 0;
} }
&-company { &-company {
font-size: 0.9rem; font-size: 1rem;
margin: 5px 0 5px 0; margin: 5px 0 5px 0;
} }
&-meta { &-year {
font-size: 0.8em; padding-top: 6px;
} margin-right: 1.8em;
font-size: 1.6em;
@include dimmed;
&-content { @media #{$media-size-tablet} {
margin-top: 12px; margin: -6px 0 4px;
}
} }
&-item { &-item {

@ -105,6 +105,13 @@
content: "#"; content: "#";
} }
} }
.feather {
display: inline-block;
vertical-align: -0.125em;
width: 1em;
height: 1em;
}
} }
.flag { .flag {

@ -38,10 +38,3 @@ other = "{{ .Count }} Words"
[post] [post]
pageViews = "Views" pageViews = "Views"
unknownViews = "Unknown" unknownViews = "Unknown"
present = "Present"
[portfolio]
skillsDeveloped = "Skills developed"
viewSource = "View source"
viewSourceKind = "View {{ . }} source"
liveDemo = "Live demo"

@ -1,175 +1,66 @@
{{ define "main" }} {{ define "main" }}
<main class="post"> <main class="post">
<div class="post-info"> <div class="post-info">
<p> {{ if .IsTranslated }}
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" {{ i18n "postAvailable" }}
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" {{ range .Translations }}
class="feather feather-clock"> <a href="{{ .Permalink }}"><span
<circle cx="12" cy="12" r="10"></circle> class="flag flag-icon flag-icon-{{ index $.Site.Data.langFlags (.Lang) }} flag-icon-squared"></span></a>
<polyline points="12 6 12 12 16 14"></polyline> {{ end}}
</svg> {{ end }}
{{ i18n "readingTime" .Page.ReadingTime }}
{{- if .IsTranslated }} | {{ i18n "postAvailable" }}
{{- range .Translations }}
<a href="{{ .Permalink }}"><span
class="flag flag-icon flag-icon-{{ index $.Site.Data.langFlags (.Lang) }} flag-icon-squared"></span></a>
{{- end}}
{{- end }}
</p>
</div>
<article>
<h1 class="post-title">
<a href="{{ .Permalink }}">{{ .Title | markdownify }}</a>
</h1>
{{- with .Params.Subtitle }}
<p class="post-subtitle">{{ . | markdownify }}</p>
{{- end }}
{{- if .Params.Cover }}
{{- partial "image.html" (dict "path" .Params.Cover "alt" (.Title | plainify) "class" "post-cover") }}
{{- end }}
{{- if .Params.toc }}
<hr />
<aside id="toc">
<div class="toc-title">{{ i18n "tableOfContents" }}</div>
{{ .TableOfContents }}
</aside>
<hr />
{{- end }}
<div class="post-content">
{{ .Content }}
</div> </div>
</article>
<hr />
<div class="post-info">
{{- with .Params.tags }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-tag meta-icon">
<path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path>
<line x1="7" y1="7" x2="7" y2="7"></line>
</svg>
{{- range . -}} <article>
<span class="tag"><a href="{{ "tags/" | absLangURL }}{{ . | urlize }}/">{{.}}</a></span> <h2 class="post-title"><a href="{{ .Permalink }}">{{ .Title | markdownify }}</a></h2>
{{- end }}
</p>
{{- end }}
<p> {{- if .Params.toc }}
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" <hr />
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" <aside id="toc">
class="feather feather-file-text"> <div class="toc-title">{{ i18n "tableOfContents" }}</div>
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path> {{ .TableOfContents }}
<polyline points="14 2 14 8 20 8"></polyline> </aside>
<line x1="16" y1="13" x2="8" y2="13"></line> <hr />
<line x1="16" y1="17" x2="8" y2="17"></line> {{- end }}
<polyline points="10 9 9 9 8 9"></polyline>
</svg>
{{ i18n "wordCount" .Page.WordCount }}
</p>
{{- if and (default true .Params.showPageViews) (default true .Site.Params.showPageViews) }} {{- with .Params.Cover }}
{{- if .Site.Params.goatCounter }} {{- partial "image.html" (dict "path" . "alt" "" "class" "post-cover") }}
<p> {{- end }}
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-activity">
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
<circle cx="12" cy="12" r="3"></circle>
</svg>
{{- partial "page_views.html" . -}}
</p>
{{- end }}
{{- end }}
<p> <div class="post-content">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" {{ .Content }}
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" </div>
class="feather feather-calendar"> </article>
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect>
<line x1="16" y1="2" x2="16" y2="6"></line>
<line x1="8" y1="2" x2="8" y2="6"></line>
<line x1="3" y1="10" x2="21" y2="10"></line>
</svg>
{{- $dateFormat := default "2006-01-02 15:04 -0700" .Site.Params.dateformNumTime }}
{{ dateFormat $dateFormat .Date.Local }}
</p>
{{- if .GitInfo }} <hr />
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-git-commit">
<circle cx="12" cy="12" r="4"></circle>
<line x1="1.05" y1="12" x2="7" y2="12"></line>
<line x1="17.01" y1="12" x2="22.96" y2="12"></line>
</svg>
<a href="{{ .Site.Params.gitUrl -}}{{ .GitInfo.Hash }}" target="_blank"
rel="noopener">{{ .GitInfo.AbbreviatedHash }}</a>
{{- " @ " -}}
{{- if .Site.Params.dateformNum -}}
{{ dateFormat .Site.Params.dateformNum .GitInfo.AuthorDate.Local }}
{{- else -}}
{{ dateFormat "2006-01-02" .GitInfo.AuthorDate.Local }}
{{- end }}
</p>
{{- end }}
</div>
{{- if .Site.Params.EnableSharingButtons }}
<hr />
<div class="sharing-buttons">
{{ partial "sharing-buttons.html" . }}
</div>
{{- end }}
{{- if and (not $.Site.Params.DisableReadOtherPosts) (or .NextInSection .PrevInSection) }}
<div class="pagination">
<div class="pagination__title">
<span class="pagination__title-h">{{ .Site.Params.ReadOtherPosts }}</span>
<hr />
</div>
<div class="pagination__buttons">
{{- if .NextInSection }}
<span class="button previous">
<a href="{{ .NextInSection.Permalink }}">
<span class="button__icon"></span>
<span class="button__text">{{ .NextInSection.Title }}</span>
</a>
</span>
{{- end }}
{{- if .PrevInSection }} <div class="post-info">
<span class="button next"> {{- with .Params.tags }}
<a href="{{ .PrevInSection.Permalink }}"> <p>
<span class="button__text">{{ .PrevInSection.Title }}</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
<span class="button__icon"></span> stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
</a> class="feather feather-tag meta-icon">
</span> <path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path>
{{- end }} <line x1="7" y1="7" x2="7" y2="7"></line>
</svg>
{{- range . -}}
<span class="tag"><a href="{{ "tags/" | absLangURL }}{{ . | urlize }}">{{.}}</a></span>
{{- end }}
</p>
{{- end }}
{{- if .GitInfo }}
<p><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-git-commit">
<circle cx="12" cy="12" r="4"></circle>
<line x1="1.05" y1="12" x2="7" y2="12"></line>
<line x1="17.01" y1="12" x2="22.96" y2="12"></line>
</svg><a href="{{ .Site.Params.gitUrl -}}{{ .GitInfo.Hash }}" target="_blank"
rel="noopener">{{ .GitInfo.AbbreviatedHash }}</a> @
{{ if .Site.Params.dateformNum }}{{ dateFormat .Site.Params.dateformNum .GitInfo.AuthorDate.Local }}{{ else }}{{ dateFormat "2006-01-02" .GitInfo.AuthorDate.Local }}{{ end }}
</p>
{{- end }}
</div> </div>
</div>
{{- end }}
{{- if .Site.Config.Services.Disqus.Shortname }}
{{- if not (eq .Params.Comments "false") }}
<div id="comments">
{{ template "_internal/disqus.html" . }}
</div>
{{- end }}
{{- end }}
</main> </main>
{{ end }} {{ end }}

@ -18,15 +18,21 @@
<div class="portfolio-meta"> <div class="portfolio-meta">
{{- if .Params.start_date }} {{- if .Params.start_date }}
<span class="portfolio-start-date"> <span class="portfolio-start-date">
{{- $dateFormat := default "Jan, 2006" .Site.Params.dateformMonth }} {{- if eq (printf "%T" .Params.start_date) "time.Time"}}
{{ dateFormat $dateFormat .Params.start_date }} {{ .Params.start_date.Format ($.Site.Params.DateFormatList | default "2006-01-02") }}
{{- else }}
{{ .Params.start_date }}
{{- end }}
</span> </span>
<span class="portfolio-end-date"> <span class="portfolio-end-date">
{{- if and .Params.end_date (lt .Params.end_date now) }} {{- if eq (printf "%T" .Params.end_date) "time.Time"}}
{{ dateFormat $dateFormat .Params.end_date }} {{- if lt .Params.end_date now }}
{{ .Params.end_date.Format ($.Site.Params.DateFormatList | default "2006-01-02") }}
{{- else }}
Present
{{- end }}
{{- else }} {{- else }}
{{ i18n "post.present" }} {{ .Params.end_date }}
{{- end }} {{- end }}
</span> </span>
{{- end }} {{- end }}
@ -54,7 +60,7 @@
{{- end }} {{- end }}
</div> </div>
{{- with .Params.skills }} {{- with .Params.skills }}
<h3 class="portfolio-skills-title">{{ i18n "portfolio.skillsDeveloped"}}:</h3> <h3 class="portfolio-skills-title">Skills used:</h3>
<ul class="portfolio-skills"> <ul class="portfolio-skills">
{{- range . }} {{- range . }}
<li class="portfolio-skill">{{ . }}</li> <li class="portfolio-skill">{{ . }}</li>

@ -25,81 +25,26 @@
<a href="{{ .Permalink }}">{{ .Title | markdownify }}</a> <a href="{{ .Permalink }}">{{ .Title | markdownify }}</a>
</h1> </h1>
<p class="portfolio-timespan">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-calendar">
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect>
<line x1="16" y1="2" x2="16" y2="6"></line>
<line x1="8" y1="2" x2="8" y2="6"></line>
<line x1="3" y1="10" x2="21" y2="10"></line>
</svg>
{{- if .Params.start_date }}
{{- $dateFormat := default "Jan, 2006" .Site.Params.dateformMonth }}
{{ dateFormat $dateFormat .Params.start_date }} — {{ if and .Params.end_date (lt .Params.end_date now) }}{{ dateFormat $dateFormat .Params.end_date }}{{ else }}{{ i18n "post.present" }}{{ end }}
{{- end }}
</p>
<div class="portfolio-links">
{{- if .Params.source_code }}
{{- if hasPrefix (printf "%T" .Params.source_code) "map" }}
{{- range $name, $url := .Params.source_code }}
<span>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-code">
<polyline points="16 18 22 12 16 6"></polyline>
<polyline points="8 6 2 12 8 18"></polyline>
</svg>
<a href="{{ $url }}">{{ i18n "portfolio.viewSourceKind" $name}}</a>
</span>
{{- end }}
{{- else }}
<span>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-code">
<polyline points="16 18 22 12 16 6"></polyline>
<polyline points="8 6 2 12 8 18"></polyline>
</svg>
<a href="{{ .Params.source_code }}">{{ i18n "portfolio.viewSource"}}</a>
</span>
{{- end }}
{{- end }}
{{- if .Params.live_demo }}
<span>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-monitor">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"></rect>
<line x1="8" y1="21" x2="16" y2="21"></line>
<line x1="12" y1="17" x2="12" y2="21"></line>
</svg>
<a href="{{ .Params.live_demo }}">{{ i18n "portfolio.liveDemo"}}</a>
</span>
{{- end }}
</div>
{{- if .Params.Cover }}
{{- partial "image.html" (dict "path" .Params.Cover "alt" (.Title | plainify) "class" "portfolio-cover") }}
{{- end }}
{{- if .Params.toc }} {{- if .Params.toc }}
<hr /> <hr />
<aside id="toc"> <aside id="toc">
<h2>{{ i18n "tableOfContents" }}</h2> <div class="toc-title">{{ i18n "tableOfContents" }}</div>
{{ .TableOfContents }} {{ .TableOfContents }}
</aside> </aside>
<hr /> <hr />
{{- end }} {{- end }}
{{- if .Params.Cover }}
{{- partial "image.html" (dict "path" .Params.Cover "alt" (.Title | plainify) "class" "portfolio-cover") }}
{{- end }}
<div class="portfolio-content"> <div class="portfolio-content">
{{ .Content }} {{ .Content }}
</div> </div>
<div> <div>
{{- with .Params.skills }} {{- with .Params.skills }}
<h2 class="portfolio-skills-title">{{ i18n "portfolio.skillsDeveloped"}}:</h2> <h2 class="portfolio-skills-title">Skills used:</h2>
<ul class="portfolio-skills"> <ul class="portfolio-skills">
{{- range . }} {{- range . }}
<li class="portfolio-skill">{{ . }}</li> <li class="portfolio-skill">{{ . }}</li>
@ -140,20 +85,6 @@
{{ i18n "wordCount" .Page.WordCount }} {{ i18n "wordCount" .Page.WordCount }}
</p> </p>
{{- if and (default true .Params.showPageViews) (default true .Site.Params.showPageViews) }}
{{- if .Site.Params.goatCounter }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-activity">
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
<circle cx="12" cy="12" r="3"></circle>
</svg>
{{- partial "page_views.html" . -}}
</p>
{{- end }}
{{- end }}
{{- if .GitInfo }} {{- if .GitInfo }}
<p> <p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"

@ -0,0 +1,178 @@
{{ define "main" }}
<main class="post">
<div class="post-info">
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-clock">
<circle cx="12" cy="12" r="10"></circle>
<polyline points="12 6 12 12 16 14"></polyline>
</svg>
{{ i18n "readingTime" .Page.ReadingTime }}
{{- if .IsTranslated }} | {{ i18n "postAvailable" }}
{{- range .Translations }}
<a href="{{ .Permalink }}"><span
class="flag flag-icon flag-icon-{{ index $.Site.Data.langFlags (.Lang) }} flag-icon-squared"></span></a>
{{- end}}
{{- end }}
</p>
</div>
<article>
<h1 class="post-title">
<a href="{{ .Permalink }}">{{ .Title | markdownify }}</a>
</h1>
{{- with .Params.Subtitle }}
<p class="post-subtitle">{{ . | markdownify }}</p>
{{- end }}
{{- if .Params.toc }}
<hr />
<aside id="toc">
<div class="toc-title">{{ i18n "tableOfContents" }}</div>
{{ .TableOfContents }}
</aside>
<hr />
{{- end }}
{{- if .Params.Cover }}
{{- partial "image.html" (dict "path" .Params.Cover "alt" (.Title | plainify) "class" "post-cover") }}
{{- end }}
<div class="post-content">
{{ .Content }}
</div>
</article>
<hr />
<div class="post-info">
{{- with .Params.tags }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-tag meta-icon">
<path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path>
<line x1="7" y1="7" x2="7" y2="7"></line>
</svg>
{{- range . -}}
<span class="tag"><a href="{{ "tags/" | absLangURL }}{{ . | urlize }}/">{{.}}</a></span>
{{- end }}
</p>
{{- end }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-file-text">
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
<polyline points="14 2 14 8 20 8"></polyline>
<line x1="16" y1="13" x2="8" y2="13"></line>
<line x1="16" y1="17" x2="8" y2="17"></line>
<polyline points="10 9 9 9 8 9"></polyline>
</svg>
{{ i18n "wordCount" .Page.WordCount }}
</p>
{{- if and (default true .Params.showPageViews) (default true .Site.Params.showPageViews) }}
{{- if .Site.Params.goatCounter }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-activity">
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
<circle cx="12" cy="12" r="3"></circle>
</svg>
{{- partial "page_views.html" . -}}
</p>
{{- end }}
{{- end }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-calendar">
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect>
<line x1="16" y1="2" x2="16" y2="6"></line>
<line x1="8" y1="2" x2="8" y2="6"></line>
<line x1="3" y1="10" x2="21" y2="10"></line>
</svg>
{{- if .Site.Params.dateformNumTime }}
{{ dateFormat .Site.Params.dateformNumTime .Date.Local }}
{{- else }}
{{ dateFormat "2006-01-02 15:04 -0700" .Date.Local }}
{{- end }}
</p>
{{- if .GitInfo }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-git-commit">
<circle cx="12" cy="12" r="4"></circle>
<line x1="1.05" y1="12" x2="7" y2="12"></line>
<line x1="17.01" y1="12" x2="22.96" y2="12"></line>
</svg>
<a href="{{ .Site.Params.gitUrl -}}{{ .GitInfo.Hash }}" target="_blank"
rel="noopener">{{ .GitInfo.AbbreviatedHash }}</a>
{{- " @ " -}}
{{- if .Site.Params.dateformNum -}}
{{ dateFormat .Site.Params.dateformNum .GitInfo.AuthorDate.Local }}
{{- else -}}
{{ dateFormat "2006-01-02" .GitInfo.AuthorDate.Local }}
{{- end }}
</p>
{{- end }}
</div>
{{- if .Site.Params.EnableSharingButtons }}
<hr />
<div class="sharing-buttons">
{{ partial "sharing-buttons.html" . }}
</div>
{{- end }}
{{- if and (not $.Site.Params.DisableReadOtherPosts) (or .NextInSection .PrevInSection) }}
<div class="pagination">
<div class="pagination__title">
<span class="pagination__title-h">{{ .Site.Params.ReadOtherPosts }}</span>
<hr />
</div>
<div class="pagination__buttons">
{{- if .NextInSection }}
<span class="button previous">
<a href="{{ .NextInSection.Permalink }}">
<span class="button__icon"></span>
<span class="button__text">{{ .NextInSection.Title }}</span>
</a>
</span>
{{- end }}
{{- if .PrevInSection }}
<span class="button next">
<a href="{{ .PrevInSection.Permalink }}">
<span class="button__text">{{ .PrevInSection.Title }}</span>
<span class="button__icon"></span>
</a>
</span>
{{- end }}
</div>
</div>
{{- end }}
{{- if .Site.Config.Services.Disqus.Shortname }}
{{- if not (eq .Params.Comments "false") }}
<div id="comments">
{{ template "_internal/disqus.html" . }}
</div>
{{- end }}
{{- end }}
</main>
{{ end }}

@ -0,0 +1,178 @@
{{ define "main" }}
<main class="post">
<div class="post-info">
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-clock">
<circle cx="12" cy="12" r="10"></circle>
<polyline points="12 6 12 12 16 14"></polyline>
</svg>
{{ i18n "readingTime" .Page.ReadingTime }}
{{- if .IsTranslated }} | {{ i18n "postAvailable" }}
{{- range .Translations }}
<a href="{{ .Permalink }}"><span
class="flag flag-icon flag-icon-{{ index $.Site.Data.langFlags (.Lang) }} flag-icon-squared"></span></a>
{{- end}}
{{- end }}
</p>
</div>
<article>
<h1 class="post-title">
<a href="{{ .Permalink }}">{{ .Title | markdownify }}</a>
</h1>
{{- with .Params.Subtitle }}
<p class="post-subtitle">{{ . | markdownify }}</p>
{{- end }}
{{- if .Params.toc }}
<hr />
<aside id="toc">
<div class="toc-title">{{ i18n "tableOfContents" }}</div>
{{ .TableOfContents }}
</aside>
<hr />
{{- end }}
{{- if .Params.Cover }}
{{- partial "image.html" (dict "path" .Params.Cover "alt" (.Title | plainify) "class" "post-cover") }}
{{- end }}
<div class="post-content">
{{ .Content }}
</div>
</article>
<hr />
<div class="post-info">
{{- with .Params.tags }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-tag meta-icon">
<path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path>
<line x1="7" y1="7" x2="7" y2="7"></line>
</svg>
{{- range . -}}
<span class="tag"><a href="{{ "tags/" | absLangURL }}{{ . | urlize }}/">{{.}}</a></span>
{{- end }}
</p>
{{- end }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-file-text">
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
<polyline points="14 2 14 8 20 8"></polyline>
<line x1="16" y1="13" x2="8" y2="13"></line>
<line x1="16" y1="17" x2="8" y2="17"></line>
<polyline points="10 9 9 9 8 9"></polyline>
</svg>
{{ i18n "wordCount" .Page.WordCount }}
</p>
{{- if and (default true .Params.showPageViews) (default true .Site.Params.showPageViews) }}
{{- if .Site.Params.goatCounter }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-activity">
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
<circle cx="12" cy="12" r="3"></circle>
</svg>
{{- partial "page_views.html" . -}}
</p>
{{- end }}
{{- end }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-calendar">
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect>
<line x1="16" y1="2" x2="16" y2="6"></line>
<line x1="8" y1="2" x2="8" y2="6"></line>
<line x1="3" y1="10" x2="21" y2="10"></line>
</svg>
{{- if .Site.Params.dateformNumTime }}
{{ dateFormat .Site.Params.dateformNumTime .Date.Local }}
{{- else }}
{{ dateFormat "2006-01-02 15:04 -0700" .Date.Local }}
{{- end }}
</p>
{{- if .GitInfo }}
<p>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-git-commit">
<circle cx="12" cy="12" r="4"></circle>
<line x1="1.05" y1="12" x2="7" y2="12"></line>
<line x1="17.01" y1="12" x2="22.96" y2="12"></line>
</svg>
<a href="{{ .Site.Params.gitUrl -}}{{ .GitInfo.Hash }}" target="_blank"
rel="noopener">{{ .GitInfo.AbbreviatedHash }}</a>
{{- " @ " -}}
{{- if .Site.Params.dateformNum -}}
{{ dateFormat .Site.Params.dateformNum .GitInfo.AuthorDate.Local }}
{{- else -}}
{{ dateFormat "2006-01-02" .GitInfo.AuthorDate.Local }}
{{- end }}
</p>
{{- end }}
</div>
{{- if .Site.Params.EnableSharingButtons }}
<hr />
<div class="sharing-buttons">
{{ partial "sharing-buttons.html" . }}
</div>
{{- end }}
{{- if and (not $.Site.Params.DisableReadOtherPosts) (or .NextInSection .PrevInSection) }}
<div class="pagination">
<div class="pagination__title">
<span class="pagination__title-h">{{ .Site.Params.ReadOtherPosts }}</span>
<hr />
</div>
<div class="pagination__buttons">
{{- if .NextInSection }}
<span class="button previous">
<a href="{{ .NextInSection.Permalink }}">
<span class="button__icon"></span>
<span class="button__text">{{ .NextInSection.Title }}</span>
</a>
</span>
{{- end }}
{{- if .PrevInSection }}
<span class="button next">
<a href="{{ .PrevInSection.Permalink }}">
<span class="button__text">{{ .PrevInSection.Title }}</span>
<span class="button__icon"></span>
</a>
</span>
{{- end }}
</div>
</div>
{{- end }}
{{- if .Site.Config.Services.Disqus.Shortname }}
{{- if not (eq .Params.Comments "false") }}
<div id="comments">
{{ template "_internal/disqus.html" . }}
</div>
{{- end }}
{{- end }}
</main>
{{ end }}
Loading…
Cancel
Save