diff options
39 files changed, 733 insertions, 200 deletions
| @@ -7,3 +7,6 @@ watch: | |||
| 7 | 7 | ||
| 8 | server: | 8 | server: |
| 9 | jbmafp -s | 9 | jbmafp -s |
| 10 | |||
| 11 | fetch-projects: | ||
| 12 | cd tools && python projects.py | ||
diff --git a/content/notes/2025-02-26-male-and-female-body-proportion-reference-images.md b/content/notes/2025-02-26-male-and-female-body-proportion-reference-images.md index e48ad8f..580e6ce 100644 --- a/content/notes/2025-02-26-male-and-female-body-proportion-reference-images.md +++ b/content/notes/2025-02-26-male-and-female-body-proportion-reference-images.md | |||
| @@ -7,7 +7,7 @@ draft: false | |||
| 7 | tags: [3d] | 7 | tags: [3d] |
| 8 | --- | 8 | --- |
| 9 | 9 | ||
| 10 |  | 10 |  |
| 11 | 11 | ||
| 12 |  | 12 |  |
| 13 | 13 | ||
diff --git a/content/notes/2025-03-17-vim-ale-linters.md b/content/notes/2025-03-17-vim-ale-linters.md index e30250c..bd4910d 100644 --- a/content/notes/2025-03-17-vim-ale-linters.md +++ b/content/notes/2025-03-17-vim-ale-linters.md | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | --- | 1 | --- |
| 2 | title: Vim ALE Linters | 2 | title: Currated list of Vim ALE linters |
| 3 | url: vim-ale-linters.html | 3 | url: vim-ale-linters.html |
| 4 | date: 2025-03-17T16:13:13+02:00 | 4 | date: 2025-03-17T16:13:13+02:00 |
| 5 | type: note | 5 | type: note |
| @@ -7,14 +7,16 @@ draft: false | |||
| 7 | tags: [] | 7 | tags: [] |
| 8 | --- | 8 | --- |
| 9 | 9 | ||
| 10 | Reading material: | 10 | ## Reading material |
| 11 | 11 | ||
| 12 | - [Asynchronous Lint Engine](https://github.com/dense-analysis/ale/blob/master/doc/ale.txt) | 12 | - [Asynchronous Lint Engine](https://github.com/dense-analysis/ale/blob/master/doc/ale.txt) |
| 13 | - [Let's have a pint of (vim) ale!](https://dmerej.info/blog/post/lets-have-a-pint-of-vim-ale/) | 13 | - [Let's have a pint of (vim) ale!](https://dmerej.info/blog/post/lets-have-a-pint-of-vim-ale/) |
| 14 | 14 | ||
| 15 | Linters: | 15 | ## Linters |
| 16 | 16 | ||
| 17 | - C: `sudo dnf install clang clang-tidy clang-tools-extra clangd clang-analyzer` | 17 | | Language | Install command | |
| 18 | - Go: `go install golang.org/x/tools/gopls@latest` | 18 | |------------|-----------------------------------------------------------------------------| |
| 19 | - Python: `pipx install pyright` | 19 | | C | `sudo dnf install clang clang-tidy clang-tools-extra clangd clang-analyzer` | |
| 20 | - JavaScript: `sudo npm i -g @biomejs/biome` | 20 | | Go | `go install golang.org/x/tools/gopls@latest` | |
| 21 | | Python | `pipx install pyright` | | ||
| 22 | | JavaScript | `sudo npm i -g @biomejs/biome` | | ||
diff --git a/content/pages/curriculum-vitae.md b/content/pages/curriculum-vitae.md index aae0c7d..44f6650 100644 --- a/content/pages/curriculum-vitae.md +++ b/content/pages/curriculum-vitae.md | |||
| @@ -8,13 +8,15 @@ draft: false | |||
| 8 | 8 | ||
| 9 | **Mitja Felicijan** | 9 | **Mitja Felicijan** |
| 10 | 10 | ||
| 11 | Email me at *[mitja.felicijan@gmail.com](mailto:mitja.felicijan@gmail.com?subject=Website+CV+Contact)* | ||
| 12 | |||
| 13 | ## Technical experience | 11 | ## Technical experience |
| 14 | 12 | ||
| 15 | - **Key languages:** C, Golang, Lua, Python, Bash. | 13 | - **Key languages:** C, Golang, Lua, Python, Bash. |
| 16 | - **Platforms:** GNU/Linux, macOS. | 14 | - **Platforms:** GNU/Linux, macOS. |
| 17 | - **Interests:** Zigbee, KNX, Modbus, Machine to Machine, Embedded systems, Operating systems, Distributed systems, IOT, RDBMS, Algorithms, Database engine design, SQL, NoSQL, NewSQL, Big data analytics, Machine learning, Prediction algorithms, Realtime analytics, Systems automation, Natural language processing, Bioinformatics, Game development. | 15 | - **Interests:** Zigbee, KNX, Modbus, Machine to Machine, Embedded systems, |
| 16 | Operating systems, Distributed systems, IOT, RDBMS, Algorithms, Database | ||
| 17 | engine design, SQL, NoSQL, NewSQL, Big data analytics, Machine learning, | ||
| 18 | Prediction algorithms, Realtime analytics, Systems automation, Natural | ||
| 19 | language processing, Bioinformatics, Game development. | ||
| 18 | 20 | ||
| 19 | ## Major projects | 21 | ## Major projects |
| 20 | 22 | ||
| @@ -33,14 +35,17 @@ Email me at *[mitja.felicijan@gmail.com](mailto:mitja.felicijan@gmail.com?subjec | |||
| 33 | - Smart cabins with hardware sensor management (2013) | 35 | - Smart cabins with hardware sensor management (2013) |
| 34 | - Contextual advertising server (2015) | 36 | - Contextual advertising server (2015) |
| 35 | - Network accessible database engine for caching and in-memory storage (2016) | 37 | - Network accessible database engine for caching and in-memory storage (2016) |
| 36 | - Tick database engine specifically designed for storing and processing large amount of sensor data with high write throughput (2016) | 38 | - Tick database engine specifically designed for storing and processing large |
| 39 | amount of sensor data with high write throughput (2016) | ||
| 37 | - Wireless industrial lighting management system - hardware and software (2016) | 40 | - Wireless industrial lighting management system - hardware and software (2016) |
| 38 | - Minimal configuration reverse proxy (2017) | 41 | - Minimal configuration reverse proxy (2017) |
| 39 | - Industrial IOT platform for deployment on on-premise (2018) | 42 | - Industrial IOT platform for deployment on on-premise (2018) |
| 40 | - Custom Platform as a service based on Docker Swarm (2018) | 43 | - Custom Platform as a service based on Docker Swarm (2018) |
| 41 | - Toolkit for encoding binary data into DNA sequence (2019) | 44 | - Toolkit for encoding binary data into DNA sequence (2019) |
| 42 | - Minimal configuration reverse proxy with load balancing and rate limiting (2019) | 45 | - Minimal configuration reverse proxy with load balancing and rate limiting |
| 43 | - E-ink conference room occupancy display, hardware and software solution (2019) | 46 | (2019) |
| 47 | - E-ink conference room occupancy display, hardware and software solution | ||
| 48 | (2019) | ||
| 44 | - Caching module for Apache web server (2022) | 49 | - Caching module for Apache web server (2022) |
| 45 | - Task runner for the command line (2022) | 50 | - Task runner for the command line (2022) |
| 46 | - World of Warcraft Tweaks and Enhancements Addon (2023) | 51 | - World of Warcraft Tweaks and Enhancements Addon (2023) |
| @@ -53,12 +58,16 @@ Email me at *[mitja.felicijan@gmail.com](mailto:mitja.felicijan@gmail.com?subjec | |||
| 53 | - Co-Founder of UTS (2009 – 2015) | 58 | - Co-Founder of UTS (2009 – 2015) |
| 54 | - Senior Software Engineer at TSmedia (2015 - 2017) | 59 | - Senior Software Engineer at TSmedia (2015 - 2017) |
| 55 | - Senior Software Engineer at Renderspace (2017 - 2019) | 60 | - Senior Software Engineer at Renderspace (2017 - 2019) |
| 56 | - Senior Software Engineer at Digg (2019 - Present) | 61 | - Senior Software Engineer at Digg (2019 - 2025) |
| 57 | 62 | ||
| 58 | ## Awards | 63 | ## Awards |
| 59 | 64 | ||
| 60 | - Regional Award for Innovation by Chamber of Commerce and Industry of Slovenia for project Intelligent system management and regulation of Street Lighting, 2010 | 65 | - Regional Award for Innovation by Chamber of Commerce and Industry of Slovenia |
| 61 | - National Award for Innovation by Chamber of Commerce and Industry of Slovenia for project Intelligent system management and regulation of Street Lighting, 2010 | 66 | for project Intelligent system management and regulation of Street Lighting, |
| 67 | 2010 | ||
| 68 | - National Award for Innovation by Chamber of Commerce and Industry of Slovenia | ||
| 69 | for project Intelligent system management and regulation of Street Lighting, | ||
| 70 | 2010 | ||
| 62 | 71 | ||
| 63 | ## Key responsibilities | 72 | ## Key responsibilities |
| 64 | 73 | ||
| @@ -69,4 +78,5 @@ Email me at *[mitja.felicijan@gmail.com](mailto:mitja.felicijan@gmail.com?subjec | |||
| 69 | - Writing and maintaining user and technical documents. | 78 | - Writing and maintaining user and technical documents. |
| 70 | - Development and maintenance of the project. | 79 | - Development and maintenance of the project. |
| 71 | - Code revision, testing and output. | 80 | - Code revision, testing and output. |
| 72 | - Work on the enhancement suggested by the customers and fixes the bugs reported. | 81 | - Work on the enhancement suggested by the customers and fixes the bugs |
| 82 | reported. | ||
diff --git a/content/pages/projects.md b/content/pages/projects.md index a3feea7..9184f0c 100644 --- a/content/pages/projects.md +++ b/content/pages/projects.md | |||
| @@ -1,77 +1,356 @@ | |||
| 1 | --- | 1 | --- |
| 2 | title: Projects | 2 | title: Personal projects |
| 3 | date: 2024-10-21T12:00:00+02:00 | 3 | date: 2024-10-21T12:00:00+02:00 |
| 4 | url: projects.html | 4 | url: projects.html |
| 5 | type: page | 5 | type: page |
| 6 | draft: false | 6 | draft: false |
| 7 | --- | 7 | --- |
| 8 | 8 | ||
| 9 | - [BLP Texture Converter](#blp-texture-converter) | 9 | <div class='project-list'> |
| 10 | - [Simple Snapshot Manager](#simple-snapshot-manager) | ||
| 11 | - [QOL Extensions for GNU Make](#qol-extensions-for-gnu-make) | ||
| 12 | - [Just build me a fucking page](#just-build-me-a-fucking-page) | ||
| 13 | - [Clutch, nested X11 dwm sessions](#clutch-nested-x11-dwm-sessions) | ||
| 14 | 10 | ||
| 15 | While most of my projects are hosted on | 11 | - [abtts](#abtts) |
| 16 | [GitHub](https://github.com/mitjafelicijan), I wanted a centralized location to | 12 | - [blpconvert](#blpconvert) |
| 17 | store them independently of GitHub and provide different versions in a bit | 13 | - [ClassicEnhanced](#classicenhanced) |
| 18 | cleaner way. | 14 | - [clutch](#clutch) |
| 15 | - [jbmafp](#jbmafp) | ||
| 16 | - [lazycommit](#lazycommit) | ||
| 17 | - [makext](#makext) | ||
| 18 | - [mprogress](#mprogress) | ||
| 19 | - [newsbarge](#newsbarge) | ||
| 20 | - [oberon](#oberon) | ||
| 21 | - [p9tree](#p9tree) | ||
| 22 | - [rssperado](#rssperado) | ||
| 23 | - [sm](#sm) | ||
| 24 | - [sparklines](#sparklines) | ||
| 25 | - [ttdaw](#ttdaw) | ||
| 26 | - [TurtleTweaks](#turtletweaks) | ||
| 19 | 27 | ||
| 20 | ## BLP Texture Converter | ||
| 21 | 28 | ||
| 22 | This tool converts BLP texture files used in many games such as World of | 29 | </div> |
| 23 | Warcraft into PNG files. With support for DXT1, DXT3 and DXT5 compression. | ||
| 24 | [GitHub repository](https://github.com/mitjafelicijan/blpconvert). | ||
| 25 | 30 | ||
| 26 | - Version 1.1 / 2025-02-05 ([blpconvert-v1.1.tar](/snapshots/blpconvert-v1.1.tar)) | 31 | ## abtts |
| 27 | - Added support for custom output formats (png, bmp, jpg, tga). | 32 | Convert text like ebooks into audiobooks with UnrealSpeech. |
| 28 | - Version 1.0 / 2025-02-04 ([blpconvert-v1.0.tar](/snapshots/blpconvert-v1.0.tar)) | ||
| 29 | - First release. | ||
| 30 | 33 | ||
| 31 | ## Simple Snapshot Manager | ||
| 32 | 34 | ||
| 33 | Simple snapshot utility that uses TAR to compress current directory into a | 35 | <div class='project-release'> |
| 34 | `.tar` file while ignoring some of the directories. I use this tool to prepare | ||
| 35 | releases for this page. | ||
| 36 | [GitHub repository](https://github.com/mitjafelicijan/sm). | ||
| 37 | 36 | ||
| 38 | - Version 0.1 / 2024-10-21 ([sm-v0.1.tar](/snapshots/sm-v0.1.tar)) | 37 | |Released|Description|Download| |
| 39 | - First release. | 38 | |--------|-----------|--------| |
| 40 | - Able to tag and create tar snapshots. | 39 | |2023-07-05|Added introduction audio option| [abtts-v0.3.tar.gz](/projects/abtts-v0.3.tar.gz) | |
| 40 | |2023-07-03|Moved to OGG as default format| [abtts-v0.2.tar.gz](/projects/abtts-v0.2.tar.gz) | | ||
| 41 | |2023-07-03|First release| [abtts-v0.1.tar.gz](/projects/abtts-v0.1.tar.gz) | | ||
| 41 | 42 | ||
| 42 | ## QOL Extensions for GNU Make | ||
| 43 | 43 | ||
| 44 | Makext is a collection of useful extensions for Makefiles, aimed at simplifying | 44 | </div> |
| 45 | and enhancing the functionality of Make-based projects. These extensions | ||
| 46 | provide additional features and convenience functions to improve the overall | ||
| 47 | usage of GNU Make as a task runner. | ||
| 48 | [GitHub repository](https://github.com/mitjafelicijan/makext). | ||
| 49 | 45 | ||
| 50 | - Version 0.1 / 2024-05-15 ([makext-v0.1.tar](/snapshots/makext-v0.1.tar)) | 46 | <div class='github-link'> |
| 51 | - First release. | ||
| 52 | 47 | ||
| 53 | ## Clutch, nested X11 dwm sessions | 48 | [mitjafelicijan/abtts](https://github.com/mitjafelicijan/abtts) |
| 54 | 49 | ||
| 55 | Clutch allows you to run nested dwm session inside your existing X or Wayland | 50 | </div> |
| 56 | session. This comes in handy when you already have a desktop environment | ||
| 57 | running (like Gnome) but you want to have a tiling window manager as well. | ||
| 58 | [GitHub repository](https://github.com/mitjafelicijan/clutch). | ||
| 59 | 51 | ||
| 60 | - Version 0.1 / 2024-07-19 ([clutch-v0.1.tar](/snapshots/clutch-v0.1.tar)) | 52 | ## blpconvert |
| 61 | - First release. | 53 | This tool converts BLP texture files used in many games such as World of Warcraft into PNG files. With support for DXT1, DXT3 and DXT5 compression. |
| 62 | 54 | ||
| 63 | ## Just build me a fucking page | ||
| 64 | 55 | ||
| 65 | A simple static site generator that is semi compatible with | 56 | <div class='project-release'> |
| 66 | [Hugo](https://gohugo.io/) and aims to be a simpler version of it, getting out | ||
| 67 | of your way when it comes to taxonomies. [GitHub | ||
| 68 | repository](https://github.com/mitjafelicijan/jbmafp). | ||
| 69 | 57 | ||
| 70 | - Version 0.3 / 2024-06-22 ([jbmafp-v0.3.tar](/snapshots/jbmafp-v0.3.tar)) | 58 | |Released|Description|Download| |
| 71 | - Added better ergonomics for filtering. | 59 | |--------|-----------|--------| |
| 72 | - Added filter `filterbytype`. | 60 | |2025-02-04|First version| [blpconvert-v1.0.tar.gz](/projects/blpconvert-v1.0.tar.gz) | |
| 73 | - Version 0.2 / 2024-06-18 ([jbmafp-v0.2.tar](/snapshots/jbmafp-v0.2.tar)) | 61 | |
| 74 | - Added filters `first`, `last`, `random`. | 62 | |
| 75 | - Version 0.1 / 2024-03-10 ([jbmafp-v0.1.tar](/snapshots/jbmafp-v0.1.tar)) | 63 | </div> |
| 76 | - First release. | 64 | |
| 65 | <div class='github-link'> | ||
| 66 | |||
| 67 | [mitjafelicijan/blpconvert](https://github.com/mitjafelicijan/blpconvert) | ||
| 68 | |||
| 69 | </div> | ||
| 70 | |||
| 71 | ## ClassicEnhanced | ||
| 72 | Quality of life improvements and general enhancements for WoW Classic Client. | ||
| 73 | |||
| 74 | |||
| 75 | <div class='project-release'> | ||
| 76 | |||
| 77 | |Released|Description|Download| | ||
| 78 | |--------|-----------|--------| | ||
| 79 | |2024-04-13|Fixed Druid initial state of mana bar| [ClassicEnhanced-v1.0.1.tar.gz](/projects/ClassicEnhanced-v1.0.1.tar.gz) | | ||
| 80 | |2024-04-13|First release| [ClassicEnhanced-v1.0.0.tar.gz](/projects/ClassicEnhanced-v1.0.0.tar.gz) | | ||
| 81 | |||
| 82 | |||
| 83 | </div> | ||
| 84 | |||
| 85 | <div class='github-link'> | ||
| 86 | |||
| 87 | [mitjafelicijan/ClassicEnhanced](https://github.com/mitjafelicijan/ClassicEnhanced) | ||
| 88 | |||
| 89 | </div> | ||
| 90 | |||
| 91 | ## clutch | ||
| 92 | Clutch allows you to run nested dwm session inside your existing X or Wayland session. This comes in handy when you already have a desktop environment running (like Gnome) but you want to have a tiling window manager as well. | ||
| 93 | |||
| 94 | |||
| 95 | <div class='project-release'> | ||
| 96 | |||
| 97 | |Released|Description|Download| | ||
| 98 | |--------|-----------|--------| | ||
| 99 | |2024-06-19|First release| [clutch-v1.0.tar.gz](/projects/clutch-v1.0.tar.gz) | | ||
| 100 | |||
| 101 | |||
| 102 | </div> | ||
| 103 | |||
| 104 | <div class='github-link'> | ||
| 105 | |||
| 106 | [mitjafelicijan/clutch](https://github.com/mitjafelicijan/clutch) | ||
| 107 | |||
| 108 | </div> | ||
| 109 | |||
| 110 | ## jbmafp | ||
| 111 | A simple static site generator that is semi compatible with Hugo and aims to be a simpler version of it, getting out of your way when it comes to taxonomies. | ||
| 112 | |||
| 113 | |||
| 114 | <div class='project-release'> | ||
| 115 | |||
| 116 | |Released|Description|Download| | ||
| 117 | |--------|-----------|--------| | ||
| 118 | |2024-06-21|Added better filtering| [jbmafp-v0.3.tar.gz](/projects/jbmafp-v0.3.tar.gz) | | ||
| 119 | |2024-06-18|Added filters first, last, random| [jbmafp-v0.2.tar.gz](/projects/jbmafp-v0.2.tar.gz) | | ||
| 120 | |2024-03-10|First release| [jbmafp-v0.1.tar.gz](/projects/jbmafp-v0.1.tar.gz) | | ||
| 121 | |||
| 122 | |||
| 123 | </div> | ||
| 124 | |||
| 125 | <div class='github-link'> | ||
| 126 | |||
| 127 | [mitjafelicijan/jbmafp](https://github.com/mitjafelicijan/jbmafp) | ||
| 128 | |||
| 129 | </div> | ||
| 130 | |||
| 131 | ## lazycommit | ||
| 132 | Git commit messages for lazy people that use AI in the backend. | ||
| 133 | |||
| 134 | |||
| 135 | <div class='project-release'> | ||
| 136 | |||
| 137 | |Released|Description|Download| | ||
| 138 | |--------|-----------|--------| | ||
| 139 | |2025-03-17|First release| [lazycommit-v1.0.tar.gz](/projects/lazycommit-v1.0.tar.gz) | | ||
| 140 | |||
| 141 | |||
| 142 | </div> | ||
| 143 | |||
| 144 | <div class='github-link'> | ||
| 145 | |||
| 146 | [mitjafelicijan/lazycommit](https://github.com/mitjafelicijan/lazycommit) | ||
| 147 | |||
| 148 | </div> | ||
| 149 | |||
| 150 | ## makext | ||
| 151 | Makext is a collection of useful extensions for Makefiles, aimed at simplifying and enhancing the functionality of Make-based projects. These extensions provide additional features and convenience functions to improve the overall usage of GNU Make as a task runner. | ||
| 152 | |||
| 153 | |||
| 154 | <div class='project-release'> | ||
| 155 | |||
| 156 | |Released|Description|Download| | ||
| 157 | |--------|-----------|--------| | ||
| 158 | |2024-05-15|First release| [makext-v1.0.tar.gz](/projects/makext-v1.0.tar.gz) | | ||
| 159 | |||
| 160 | |||
| 161 | </div> | ||
| 162 | |||
| 163 | <div class='github-link'> | ||
| 164 | |||
| 165 | [mitjafelicijan/makext](https://github.com/mitjafelicijan/makext) | ||
| 166 | |||
| 167 | </div> | ||
| 168 | |||
| 169 | ## mprogress | ||
| 170 | Displays progress bar in terminal. It can be used as a standalone program so you can put it in /usr/bin. The name is stupid like that because of the potential name conflicts. | ||
| 171 | |||
| 172 | |||
| 173 | <div class='project-release'> | ||
| 174 | |||
| 175 | |Released|Description|Download| | ||
| 176 | |--------|-----------|--------| | ||
| 177 | |2022-12-31|First release| [mprogress-v1.0.tar.gz](/projects/mprogress-v1.0.tar.gz) | | ||
| 178 | |||
| 179 | |||
| 180 | </div> | ||
| 181 | |||
| 182 | <div class='github-link'> | ||
| 183 | |||
| 184 | [mitjafelicijan/mprogress](https://github.com/mitjafelicijan/mprogress) | ||
| 185 | |||
| 186 | </div> | ||
| 187 | |||
| 188 | ## newsbarge | ||
| 189 | Converts RSS feeds into HTML | ||
| 190 | |||
| 191 | |||
| 192 | <div class='project-release'> | ||
| 193 | |||
| 194 | |Released|Description|Download| | ||
| 195 | |--------|-----------|--------| | ||
| 196 | |2025-03-01|First release| [newsbarge-v0.1.tar.gz](/projects/newsbarge-v0.1.tar.gz) | | ||
| 197 | |||
| 198 | |||
| 199 | </div> | ||
| 200 | |||
| 201 | <div class='github-link'> | ||
| 202 | |||
| 203 | [mitjafelicijan/newsbarge](https://github.com/mitjafelicijan/newsbarge) | ||
| 204 | |||
| 205 | </div> | ||
| 206 | |||
| 207 | ## oberon | ||
| 208 | This is a tiny project boilerplate for OpenResty and Lua website that includes basic router, memcached, Redis and MySQL with accompanying examples how to use all this. | ||
| 209 | |||
| 210 | |||
| 211 | <div class='project-release'> | ||
| 212 | |||
| 213 | |Released|Description|Download| | ||
| 214 | |--------|-----------|--------| | ||
| 215 | |2025-03-29|First release| [oberon-v1.0.tar.gz](/projects/oberon-v1.0.tar.gz) | | ||
| 216 | |||
| 217 | |||
| 218 | </div> | ||
| 219 | |||
| 220 | <div class='github-link'> | ||
| 221 | |||
| 222 | [mitjafelicijan/oberon](https://github.com/mitjafelicijan/oberon) | ||
| 223 | |||
| 224 | </div> | ||
| 225 | |||
| 226 | ## p9tree | ||
| 227 | tree is written with Plan9 Operating System in mind so it may not work with other systems. | ||
| 228 | |||
| 229 | |||
| 230 | <div class='project-release'> | ||
| 231 | |||
| 232 | |Released|Description|Download| | ||
| 233 | |--------|-----------|--------| | ||
| 234 | |2023-11-11|First release| [p9tree-v1.0.tar.gz](/projects/p9tree-v1.0.tar.gz) | | ||
| 235 | |||
| 236 | |||
| 237 | </div> | ||
| 238 | |||
| 239 | <div class='github-link'> | ||
| 240 | |||
| 241 | [mitjafelicijan/p9tree](https://github.com/mitjafelicijan/p9tree) | ||
| 242 | |||
| 243 | </div> | ||
| 244 | |||
| 245 | ## rssperado | ||
| 246 | The RSS parser is a command-line utility that simplifies the process of parsing RSS feeds, enriching the extracted data, exporting it to JSON files, enabling content classification, and providing English translation. | ||
| 247 | |||
| 248 | |||
| 249 | <div class='project-release'> | ||
| 250 | |||
| 251 | |Released|Description|Download| | ||
| 252 | |--------|-----------|--------| | ||
| 253 | |2023-06-07|First release| [rssperado-v1.0.tar.gz](/projects/rssperado-v1.0.tar.gz) | | ||
| 254 | |||
| 255 | |||
| 256 | </div> | ||
| 257 | |||
| 258 | <div class='github-link'> | ||
| 259 | |||
| 260 | [mitjafelicijan/rssperado](https://github.com/mitjafelicijan/rssperado) | ||
| 261 | |||
| 262 | </div> | ||
| 263 | |||
| 264 | ## sm | ||
| 265 | Simple snapshot utility that uses TAR to compress current directory into a .tar file while ignoring some of the directories. | ||
| 266 | |||
| 267 | |||
| 268 | <div class='project-release'> | ||
| 269 | |||
| 270 | |Released|Description|Download| | ||
| 271 | |--------|-----------|--------| | ||
| 272 | |2024-10-21|First release| [sm-v1.0.tar.gz](/projects/sm-v1.0.tar.gz) | | ||
| 273 | |||
| 274 | |||
| 275 | </div> | ||
| 276 | |||
| 277 | <div class='github-link'> | ||
| 278 | |||
| 279 | [mitjafelicijan/sm](https://github.com/mitjafelicijan/sm) | ||
| 280 | |||
| 281 | </div> | ||
| 282 | |||
| 283 | ## sparklines | ||
| 284 | Self-contained tiny SVG sparkline chart library written in vanilla JS with zero dependencies. | ||
| 285 | |||
| 286 | |||
| 287 | <div class='project-release'> | ||
| 288 | |||
| 289 | |Released|Description|Download| | ||
| 290 | |--------|-----------|--------| | ||
| 291 | |2023-12-09|First release| [sparklines-v1.0.tar.gz](/projects/sparklines-v1.0.tar.gz) | | ||
| 292 | |||
| 293 | |||
| 294 | </div> | ||
| 295 | |||
| 296 | <div class='github-link'> | ||
| 297 | |||
| 298 | [mitjafelicijan/sparklines](https://github.com/mitjafelicijan/sparklines) | ||
| 299 | |||
| 300 | </div> | ||
| 301 | |||
| 302 | ## ttdaw | ||
| 303 | ttdaw is a tiny terminal based digital audio workstation made for fun, experimentation and learning more about audio, MIDI and terminal applications in general. | ||
| 304 | |||
| 305 | |||
| 306 | <div class='project-release'> | ||
| 307 | |||
| 308 | |Released|Description|Download| | ||
| 309 | |--------|-----------|--------| | ||
| 310 | |2024-12-22|First release| [ttdaw-v0.1.tar.gz](/projects/ttdaw-v0.1.tar.gz) | | ||
| 311 | |||
| 312 | |||
| 313 | </div> | ||
| 314 | |||
| 315 | <div class='github-link'> | ||
| 316 | |||
| 317 | [mitjafelicijan/ttdaw](https://github.com/mitjafelicijan/ttdaw) | ||
| 318 | |||
| 319 | </div> | ||
| 320 | |||
| 321 | ## TurtleTweaks | ||
| 322 | World of Warcraft 1.12 Tweaks and Enhancements Addon | ||
| 323 | |||
| 324 | |||
| 325 | <div class='project-release'> | ||
| 326 | |||
| 327 | |Released|Description|Download| | ||
| 328 | |--------|-----------|--------| | ||
| 329 | |2023-05-14|Added cooldown timers to actionbars| [TurtleTweaks-v0.7.tar.gz](/projects/TurtleTweaks-v0.7.tar.gz) | | ||
| 330 | |2023-05-12|Rested bar now has a proper progress bar| [TurtleTweaks-v0.6.tar.gz](/projects/TurtleTweaks-v0.6.tar.gz) | | ||
| 331 | |2023-05-09|Removed debug messages| [TurtleTweaks-v0.5.1.tar.gz](/projects/TurtleTweaks-v0.5.1.tar.gz) | | ||
| 332 | |2023-05-09|Added option to open world map in a window| [TurtleTweaks-v0.5.tar.gz](/projects/TurtleTweaks-v0.5.tar.gz) | | ||
| 333 | |2023-05-09|Added nameplate scaling option| [TurtleTweaks-v0.4.tar.gz](/projects/TurtleTweaks-v0.4.tar.gz) | | ||
| 334 | |2023-05-08|Fixed progress bar to reflect the value in rested bar| [TurtleTweaks-v0.3.tar.gz](/projects/TurtleTweaks-v0.3.tar.gz) | | ||
| 335 | |2023-05-08|Added align grid slashcommand| [TurtleTweaks-v0.2.tar.gz](/projects/TurtleTweaks-v0.2.tar.gz) | | ||
| 336 | |2023-05-08|First release| [TurtleTweaks-v0.1.tar.gz](/projects/TurtleTweaks-v0.1.tar.gz) | | ||
| 337 | |||
| 338 | |||
| 339 | </div> | ||
| 340 | |||
| 341 | <div class='github-link'> | ||
| 342 | |||
| 343 | [mitjafelicijan/TurtleTweaks](https://github.com/mitjafelicijan/TurtleTweaks) | ||
| 344 | |||
| 345 | </div> | ||
| 346 | |||
| 347 | |||
| 348 | |||
| 349 | <style> | ||
| 350 | .project-release table tr td:last-child { text-align: right; } | ||
| 351 | .project-release table tr th:last-child { text-align: right; } | ||
| 352 | .project-list ul { column-count: 3; column-gap: 3em; } | ||
| 353 | .github-link p { display: flex; align-items: center; gap: 0.3em; } | ||
| 354 | .github-link p img { border: 0; padding: 0; height: 15px; } | ||
| 355 | </style> | ||
| 77 | 356 | ||
diff --git a/static/assets/general/github.svg b/static/assets/general/github.svg new file mode 100644 index 0000000..1c815d3 --- /dev/null +++ b/static/assets/general/github.svg | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | <?xml version="1.0" encoding="iso-8859-1"?> | ||
| 2 | <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> | ||
| 3 | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | ||
| 4 | <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | ||
| 5 | width="438.549px" height="438.549px" viewBox="0 0 438.549 438.549" style="enable-background:new 0 0 438.549 438.549;" | ||
| 6 | xml:space="preserve"> | ||
| 7 | <g> | ||
| 8 | <path fill="#222" d="M409.132,114.573c-19.608-33.596-46.205-60.194-79.798-79.8C295.736,15.166,259.057,5.365,219.271,5.365 | ||
| 9 | c-39.781,0-76.472,9.804-110.063,29.408c-33.596,19.605-60.192,46.204-79.8,79.8C9.803,148.168,0,184.854,0,224.63 | ||
| 10 | c0,47.78,13.94,90.745,41.827,128.906c27.884,38.164,63.906,64.572,108.063,79.227c5.14,0.954,8.945,0.283,11.419-1.996 | ||
| 11 | c2.475-2.282,3.711-5.14,3.711-8.562c0-0.571-0.049-5.708-0.144-15.417c-0.098-9.709-0.144-18.179-0.144-25.406l-6.567,1.136 | ||
| 12 | c-4.187,0.767-9.469,1.092-15.846,1c-6.374-0.089-12.991-0.757-19.842-1.999c-6.854-1.231-13.229-4.086-19.13-8.559 | ||
| 13 | c-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559 | ||
| 14 | c-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-0.951-2.568-2.098-3.711-3.429c-1.142-1.331-1.997-2.663-2.568-3.997 | ||
| 15 | c-0.572-1.335-0.098-2.43,1.427-3.289c1.525-0.859,4.281-1.276,8.28-1.276l5.708,0.853c3.807,0.763,8.516,3.042,14.133,6.851 | ||
| 16 | c5.614,3.806,10.229,8.754,13.846,14.842c4.38,7.806,9.657,13.754,15.846,17.847c6.184,4.093,12.419,6.136,18.699,6.136 | ||
| 17 | c6.28,0,11.704-0.476,16.274-1.423c4.565-0.952,8.848-2.383,12.847-4.285c1.713-12.758,6.377-22.559,13.988-29.41 | ||
| 18 | c-10.848-1.14-20.601-2.857-29.264-5.14c-8.658-2.286-17.605-5.996-26.835-11.14c-9.235-5.137-16.896-11.516-22.985-19.126 | ||
| 19 | c-6.09-7.614-11.088-17.61-14.987-29.979c-3.901-12.374-5.852-26.648-5.852-42.826c0-23.035,7.52-42.637,22.557-58.817 | ||
| 20 | c-7.044-17.318-6.379-36.732,1.997-58.24c5.52-1.715,13.706-0.428,24.554,3.853c10.85,4.283,18.794,7.952,23.84,10.994 | ||
| 21 | c5.046,3.041,9.089,5.618,12.135,7.708c17.705-4.947,35.976-7.421,54.818-7.421s37.117,2.474,54.823,7.421l10.849-6.849 | ||
| 22 | c7.419-4.57,16.18-8.758,26.262-12.565c10.088-3.805,17.802-4.853,23.134-3.138c8.562,21.509,9.325,40.922,2.279,58.24 | ||
| 23 | c15.036,16.18,22.559,35.787,22.559,58.817c0,16.178-1.958,30.497-5.853,42.966c-3.9,12.471-8.941,22.457-15.125,29.979 | ||
| 24 | c-6.191,7.521-13.901,13.85-23.131,18.986c-9.232,5.14-18.182,8.85-26.84,11.136c-8.662,2.286-18.415,4.004-29.263,5.146 | ||
| 25 | c9.894,8.562,14.842,22.077,14.842,40.539v60.237c0,3.422,1.19,6.279,3.572,8.562c2.379,2.279,6.136,2.95,11.276,1.995 | ||
| 26 | c44.163-14.653,80.185-41.062,108.068-79.226c27.88-38.161,41.825-81.126,41.825-128.906 | ||
| 27 | C438.536,184.851,428.728,148.168,409.132,114.573z"/> | ||
| 28 | </g> | ||
| 29 | </svg> | ||
diff --git a/static/projects/ClassicEnhanced-v1.0.0.tar.gz b/static/projects/ClassicEnhanced-v1.0.0.tar.gz new file mode 100644 index 0000000..bb7e1ff --- /dev/null +++ b/static/projects/ClassicEnhanced-v1.0.0.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/ClassicEnhanced-v1.0.1.tar.gz b/static/projects/ClassicEnhanced-v1.0.1.tar.gz new file mode 100644 index 0000000..56194d5 --- /dev/null +++ b/static/projects/ClassicEnhanced-v1.0.1.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/TurtleTweaks-v0.1.tar.gz b/static/projects/TurtleTweaks-v0.1.tar.gz new file mode 100644 index 0000000..e90ec84 --- /dev/null +++ b/static/projects/TurtleTweaks-v0.1.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/TurtleTweaks-v0.2.tar.gz b/static/projects/TurtleTweaks-v0.2.tar.gz new file mode 100644 index 0000000..3c816a3 --- /dev/null +++ b/static/projects/TurtleTweaks-v0.2.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/TurtleTweaks-v0.3.tar.gz b/static/projects/TurtleTweaks-v0.3.tar.gz new file mode 100644 index 0000000..842a643 --- /dev/null +++ b/static/projects/TurtleTweaks-v0.3.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/TurtleTweaks-v0.4.tar.gz b/static/projects/TurtleTweaks-v0.4.tar.gz new file mode 100644 index 0000000..35f5fc4 --- /dev/null +++ b/static/projects/TurtleTweaks-v0.4.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/TurtleTweaks-v0.5.1.tar.gz b/static/projects/TurtleTweaks-v0.5.1.tar.gz new file mode 100644 index 0000000..dac61f3 --- /dev/null +++ b/static/projects/TurtleTweaks-v0.5.1.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/TurtleTweaks-v0.5.tar.gz b/static/projects/TurtleTweaks-v0.5.tar.gz new file mode 100644 index 0000000..865749d --- /dev/null +++ b/static/projects/TurtleTweaks-v0.5.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/TurtleTweaks-v0.6.tar.gz b/static/projects/TurtleTweaks-v0.6.tar.gz new file mode 100644 index 0000000..9e8b331 --- /dev/null +++ b/static/projects/TurtleTweaks-v0.6.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/TurtleTweaks-v0.7.tar.gz b/static/projects/TurtleTweaks-v0.7.tar.gz new file mode 100644 index 0000000..b2d6cd5 --- /dev/null +++ b/static/projects/TurtleTweaks-v0.7.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/abtts-v0.1.tar.gz b/static/projects/abtts-v0.1.tar.gz new file mode 100644 index 0000000..6b7c004 --- /dev/null +++ b/static/projects/abtts-v0.1.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/abtts-v0.2.tar.gz b/static/projects/abtts-v0.2.tar.gz new file mode 100644 index 0000000..cf90236 --- /dev/null +++ b/static/projects/abtts-v0.2.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/abtts-v0.3.tar.gz b/static/projects/abtts-v0.3.tar.gz new file mode 100644 index 0000000..28786ba --- /dev/null +++ b/static/projects/abtts-v0.3.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/blpconvert-v1.0.tar.gz b/static/projects/blpconvert-v1.0.tar.gz new file mode 100644 index 0000000..aeb05ab --- /dev/null +++ b/static/projects/blpconvert-v1.0.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/clutch-v1.0.tar.gz b/static/projects/clutch-v1.0.tar.gz new file mode 100644 index 0000000..5d56f25 --- /dev/null +++ b/static/projects/clutch-v1.0.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/jbmafp-v0.1.tar.gz b/static/projects/jbmafp-v0.1.tar.gz new file mode 100644 index 0000000..f3ecb82 --- /dev/null +++ b/static/projects/jbmafp-v0.1.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/jbmafp-v0.2.tar.gz b/static/projects/jbmafp-v0.2.tar.gz new file mode 100644 index 0000000..781cced --- /dev/null +++ b/static/projects/jbmafp-v0.2.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/jbmafp-v0.3.tar.gz b/static/projects/jbmafp-v0.3.tar.gz new file mode 100644 index 0000000..3659331 --- /dev/null +++ b/static/projects/jbmafp-v0.3.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/lazycommit-v1.0.tar.gz b/static/projects/lazycommit-v1.0.tar.gz new file mode 100644 index 0000000..6457e34 --- /dev/null +++ b/static/projects/lazycommit-v1.0.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/makext-v1.0.tar.gz b/static/projects/makext-v1.0.tar.gz new file mode 100644 index 0000000..9aa55cf --- /dev/null +++ b/static/projects/makext-v1.0.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/mprogress-v1.0.tar.gz b/static/projects/mprogress-v1.0.tar.gz new file mode 100644 index 0000000..40977aa --- /dev/null +++ b/static/projects/mprogress-v1.0.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/newsbarge-v0.1.tar.gz b/static/projects/newsbarge-v0.1.tar.gz new file mode 100644 index 0000000..3efc692 --- /dev/null +++ b/static/projects/newsbarge-v0.1.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/oberon-v1.0.tar.gz b/static/projects/oberon-v1.0.tar.gz new file mode 100644 index 0000000..31d0c85 --- /dev/null +++ b/static/projects/oberon-v1.0.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/p9tree-v1.0.tar.gz b/static/projects/p9tree-v1.0.tar.gz new file mode 100644 index 0000000..7a2153f --- /dev/null +++ b/static/projects/p9tree-v1.0.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/rssperado-v1.0.tar.gz b/static/projects/rssperado-v1.0.tar.gz new file mode 100644 index 0000000..a635b93 --- /dev/null +++ b/static/projects/rssperado-v1.0.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/sm-v1.0.tar.gz b/static/projects/sm-v1.0.tar.gz new file mode 100644 index 0000000..fa8f578 --- /dev/null +++ b/static/projects/sm-v1.0.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/sparklines-v1.0.tar.gz b/static/projects/sparklines-v1.0.tar.gz new file mode 100644 index 0000000..aab984d --- /dev/null +++ b/static/projects/sparklines-v1.0.tar.gz | |||
| Binary files differ | |||
diff --git a/static/projects/ttdaw-v0.1.tar.gz b/static/projects/ttdaw-v0.1.tar.gz new file mode 100644 index 0000000..4689518 --- /dev/null +++ b/static/projects/ttdaw-v0.1.tar.gz | |||
| Binary files differ | |||
diff --git a/templates/base.html b/templates/base.html index 4fe5df3..956241a 100644 --- a/templates/base.html +++ b/templates/base.html | |||
| @@ -11,7 +11,60 @@ | |||
| 11 | <link href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL69vf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv76+/8LBwQkAAAAAAAAAAAAAAAC+vb3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+9vf/Bv78JAAAAAAAAAAAAAAAAu7q6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7ubr/vr29CAAAAAAAAAAAy8nJAZ6foP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnqGj/6GipAoAAAAAHLjU/xcXHf/BwsL/I8XY/yPK3v8XGiD/IbjL/yPF2f8XGiD/Fxkf/yLF2f8gnK3/Fxog/62ztv8fwNf/FRcd/x271v8mz93/GRsi/xkXHf8p097/GiIp/xobIv8p0t3/KdPe/xocIv8fYmr/KNPe/xoZH/8aHCL/J87c/xy81/8VFxz/IsPZ/8zS0/8XGiD/Ir/R/yPH2/8XGiD/Fxkf/yPH2/8dd4T/GBog/yPJ3f8jyNr/uru9/xcUGv8cudb/EhITDKi5vRKlvMP/RUpOERwcHRAdOj4QHTk8EBwdHRAdNTgQHTo/EBwcHRAcHB0QSGduEKW4vf+koqQfHzg+EBqz0ewSFRv7EyMr/xq51vsTERb7ExUb+xq41fsau9j7ExUb+xiPp/sZudb7ExUb+xMVG/sZuNX/GKvI/BIUGfMdvdn/IrfL/xcaIP8n1eb/J9Dh/xkcIf8ZGR7/J8/f/xxCSv8ZGyH/J9Dg/ybQ4P8ZHCL/FSQs/yPK3/8UExj/GE1b/ybS5P8ZGB7/Ghwj/ynW5P8p2Ob/Ghwi/yWrtv8p1eH/Ghwi/xocIv8p1uT/J8XT/xkcIv8m1un/Hb7d/xUYH/8hzOr/HtHu/xcaIf8XGB//I8vi/xgxOv8XGSD/I8rg/yPK4P8XGiD/GUFL/yPP6f8SERj/Fhkh/x3A4f8AAAAAJ2f9/ydr//8mZPH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlYu38J2v//ydo/f8AAAAAAAAAAAd8/fkFqf//Iob8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMY39awWr//8FfP3/AAAAAAAAAAAFm/7/SfD//wR+/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOB/f9B7v//BaX+/wAAAAAAAAAAQ878SAyZ/v9n1v4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu9v8DDJb+/z3N/XgAAAAA3/sAAN/7AADf+wAA3/sAAAAAAAAAAAAAAAAAAN/7AAAAAAAAAAAAAAAAAAAAAAAAj/EAAI/5AACP8QAA3/sAAA==" rel="icon" type="image/x-icon" /> | 11 | <link href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL69vf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv76+/8LBwQkAAAAAAAAAAAAAAAC+vb3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+9vf/Bv78JAAAAAAAAAAAAAAAAu7q6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7ubr/vr29CAAAAAAAAAAAy8nJAZ6foP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnqGj/6GipAoAAAAAHLjU/xcXHf/BwsL/I8XY/yPK3v8XGiD/IbjL/yPF2f8XGiD/Fxkf/yLF2f8gnK3/Fxog/62ztv8fwNf/FRcd/x271v8mz93/GRsi/xkXHf8p097/GiIp/xobIv8p0t3/KdPe/xocIv8fYmr/KNPe/xoZH/8aHCL/J87c/xy81/8VFxz/IsPZ/8zS0/8XGiD/Ir/R/yPH2/8XGiD/Fxkf/yPH2/8dd4T/GBog/yPJ3f8jyNr/uru9/xcUGv8cudb/EhITDKi5vRKlvMP/RUpOERwcHRAdOj4QHTk8EBwdHRAdNTgQHTo/EBwcHRAcHB0QSGduEKW4vf+koqQfHzg+EBqz0ewSFRv7EyMr/xq51vsTERb7ExUb+xq41fsau9j7ExUb+xiPp/sZudb7ExUb+xMVG/sZuNX/GKvI/BIUGfMdvdn/IrfL/xcaIP8n1eb/J9Dh/xkcIf8ZGR7/J8/f/xxCSv8ZGyH/J9Dg/ybQ4P8ZHCL/FSQs/yPK3/8UExj/GE1b/ybS5P8ZGB7/Ghwj/ynW5P8p2Ob/Ghwi/yWrtv8p1eH/Ghwi/xocIv8p1uT/J8XT/xkcIv8m1un/Hb7d/xUYH/8hzOr/HtHu/xcaIf8XGB//I8vi/xgxOv8XGSD/I8rg/yPK4P8XGiD/GUFL/yPP6f8SERj/Fhkh/x3A4f8AAAAAJ2f9/ydr//8mZPH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlYu38J2v//ydo/f8AAAAAAAAAAAd8/fkFqf//Iob8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMY39awWr//8FfP3/AAAAAAAAAAAFm/7/SfD//wR+/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOB/f9B7v//BaX+/wAAAAAAAAAAQ878SAyZ/v9n1v4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu9v8DDJb+/z3N/XgAAAAA3/sAAN/7AADf+wAA3/sAAAAAAAAAAAAAAAAAAN/7AAAAAAAAAAAAAAAAAAAAAAAAj/EAAI/5AACP8QAA3/sAAA==" rel="icon" type="image/x-icon" /> |
| 12 | 12 | ||
| 13 | <style> | 13 | <style> |
| 14 | html { scroll-padding: 2rem; font-family: sans-serif; } | 14 | :root { |
| 15 | --first-child-width: 150px; | ||
| 16 | --primary-color: gainsboro; | ||
| 17 | --secondary-color: #555; | ||
| 18 | --tertiary-color: #eee; | ||
| 19 | --code-color: #f9f9f9; | ||
| 20 | --border-width: 1px; | ||
| 21 | --header-border-width: 2px; | ||
| 22 | } | ||
| 23 | |||
| 24 | * { box-sizing: border-box; } | ||
| 25 | |||
| 26 | html { scroll-padding-top: 1.5em; } | ||
| 27 | body { font-family: sans-serif; padding: 0 1em; line-height: 160%; display: flex; flex-direction: column; gap: 4em; } | ||
| 28 | table { width: 100%; border: var(--border-width) solid var(--primary-color); border-collapse: collapse; } | ||
| 29 | table thead { background: var(--primary-color); border: var(--border-width) solid var(--secondary-color); } | ||
| 30 | table td, table th { text-align: left; padding: 0.3em 0.5em; } | ||
| 31 | table tbody tr { border-bottom: var(--border-width) solid var(--primary-color); vertical-align: middle; } | ||
| 32 | table tr td:first-child { width: var(--first-child-width); } | ||
| 33 | table td.tags { display: flex; gap: 0.5em; justify-content: flex-end; align-items: center; } | ||
| 34 | table td.tags mark { padding: 0 0.4em; background: var(--primary-color); font-size: small; } | ||
| 35 | |||
| 36 | a { color: blue; text-decoration: none; } | ||
| 37 | a:hover { text-decoration: underline; } | ||
| 38 | |||
| 39 | header { border-bottom: var(--header-border-width) solid var(--secondary-color); padding: 0.5em 0; display: flex; } | ||
| 40 | header nav:first-child { display: flex; width: var(--first-child-width); } | ||
| 41 | header nav:last-child { display: flex; gap: 1.5em; } | ||
| 42 | header nav:last-child a { color: black; } | ||
| 43 | |||
| 44 | footer { color: gray; } | ||
| 45 | footer a { color: gray; text-decoration: underline; } | ||
| 46 | |||
| 47 | main { max-width: 840px; display: flex; gap: 2em; flex-direction: column; } | ||
| 48 | h1, h2, h3, h4 { font-size: initial; } | ||
| 49 | article h2, article h3, article h4 { margin-block-start: 2.5em; } | ||
| 50 | article h1 { font-size: 130%; line-height: 110%; } | ||
| 51 | |||
| 52 | img, video, audio { max-width: 100%; } | ||
| 53 | figure { display: flex; justify-content: center; margin: 2.5em 0; } | ||
| 54 | img, video { border: var(--border-width) solid var(--primary-color); padding: 0.5em; } | ||
| 55 | img.no-border, video.no-border { border: 0; padding: 0; } | ||
| 56 | |||
| 57 | pre { background: var(--code-color)!important; border: var(--border-width) solid var(--primary-color); text-wrap: wrap; padding: 1.0em; line-height: 170%; } | ||
| 58 | code { background: var(--code-color); padding: 0 0.2em; } | ||
| 59 | pre code { padding: 0; } | ||
| 60 | |||
| 61 | .capitalize { text-transform: capitalize; } | ||
| 62 | |||
| 63 | /* Hotfixes for strange behaviour. */ | ||
| 64 | article iframe { margin: 0!important; } | ||
| 65 | pre code span { display: initial !important; } | ||
| 66 | |||
| 67 | /*html { scroll-padding: 2rem; font-family: sans-serif; } | ||
| 15 | body { display: grid; gap: 2em; grid-template-columns: 16em auto; max-width: 1200px; line-height: 130%; } | 68 | body { display: grid; gap: 2em; grid-template-columns: 16em auto; max-width: 1200px; line-height: 130%; } |
| 16 | h1, h2, h3, h4, h5, h6 { line-height: 120%; } | 69 | h1, h2, h3, h4, h5, h6 { line-height: 120%; } |
| 17 | a { color: blue; text-decoration: none; } | 70 | a { color: blue; text-decoration: none; } |
| @@ -33,66 +86,35 @@ | |||
| 33 | .flow-three-column > ul { column-count: 1; } | 86 | .flow-three-column > ul { column-count: 1; } |
| 34 | .hide-on-mobile { display: none; } | 87 | .hide-on-mobile { display: none; } |
| 35 | } | 88 | } |
| 36 | /* Fixes embeds going to center. */ | ||
| 37 | article iframe { margin: 0!important; } | 89 | article iframe { margin: 0!important; } |
| 38 | /* Fix desktop and mobile code when font sizes are all over the place. */ | 90 | pre code span { display: initial !important; }*/ |
| 39 | pre code span { display: initial !important; } | ||
| 40 | </style> | 91 | </style> |
| 41 | <script defer src="https://app.tinyanalytics.io/pixel/isfRNEahfHiS2Ttp"></script> | 92 | <script defer src="https://app.tinyanalytics.io/pixel/isfRNEahfHiS2Ttp"></script> |
| 42 | </head> | 93 | </head> |
| 43 | 94 | ||
| 44 | <body> | 95 | <body> |
| 45 | <aside> | 96 | <header> |
| 46 | <div><img src="/assets/general/animation.gif"></div> | 97 | <nav> |
| 47 | <p>You do not learn by relaxing. You learn by violently assaulting your problem until it surrenders its mysteries to you.</p> | 98 | <span><strong>Navigation</strong></span> |
| 48 | <div> | 99 | </nav> |
| 49 | <strong>About</strong> | 100 | <nav> |
| 50 | <ul> | 101 | <span><a href="/">Home</a></span> |
| 51 | <li><a href="/">Home</a></li> | 102 | <span><a href="/projects.html">Projects</a></span> |
| 52 | <li><a href="/projects.html">Recent Projects</a></li> | 103 | <span><a href="https://github.com/mitjafelicijan/probe" target="_blank">Probe</a></span> |
| 53 | <li><a href="https://github.com/mitjafelicijan" target="_blank">Code on GitHub</a></li> | 104 | <span><a href="https://github.com/mitjafelicijan" target="_blank">Code</a></span> |
| 54 | <li><a href="https://github.com/mitjafelicijan/probe" target="_blank">Probe repository</a></li> | 105 | <span><a href="https://github.com/mitjafelicijan/dotfiles" target="_blank">Dotfiles</a></span> |
| 55 | <li class="hide-on-mobile"><a href="https://github.com/mitjafelicijan/dotfiles" target="_blank">My dotfiles</a></li> | 106 | <span><a href="/curriculum-vitae.html">CV</a></span> |
| 56 | <li><a href="/bookmarks.html">Bookmarks</a></li> | 107 | <span><a href="/feed.xml">RSS</a></span> |
| 57 | <li><a href="/curriculum-vitae.html">Curriculum Vitae</a></li> | 108 | </nav> |
| 58 | <li class="hide-on-mobile"><a href="/feed.xml">RSS Feed</a></li> | 109 | </header> |
| 59 | </ul> | ||
| 60 | </div> | ||
| 61 | |||
| 62 | <div class="hide-on-mobile"> | ||
| 63 | <strong>Tools & Fun Stuff</strong> | ||
| 64 | <ul> | ||
| 65 | <li><a href="https://github.com/mitjafelicijan/oberon" target="_blank">OpenResty Template</a></li> | ||
| 66 | <li><a href="https://github.com/mitjafelicijan/newsbarge" target="_blank">Newsbarge RSS rader</a></li> | ||
| 67 | <li><a href="https://mitjafelicijan.github.io/gguf-list/" target="_blank">GGUF model list</a></li> | ||
| 68 | <li><a href="https://github.com/mitjafelicijan/godot-experiments" target="_blank">Godot experiments</a></li> | ||
| 69 | <li><a href="https://github.com/mitjafelicijan/blpconvert" target="_blank">BLP converter</a></li> | ||
| 70 | <li><a href="https://mitjafelicijan.github.io/symbols/" target="_blank">Symbol explorer</a></li> | ||
| 71 | <li><a href="https://mitjafelicijan.github.io/hextorgba/" target="_blank">HEX to RGBA</a></li> | ||
| 72 | <li><a href="https://mitjafelicijan.github.io/binary-visualization/" target="_blank">Binary visualizations</a></li> | ||
| 73 | <li><a href="https://mitjafelicijan.github.io/mapsofdoom/" target="_blank">Maps of Doom</a></li> | ||
| 74 | <li><a href="/assets/general/mitja-felicijan-hairytales.pdf" target="_blank">Hairy Tales</a></li> | ||
| 75 | </ul> | ||
| 76 | </div> | ||
| 77 | </aside> | ||
| 78 | |||
| 79 | <main> | 110 | <main> |
| 80 | <div> | 111 | {{ block "content" . }}{{ end }} |
| 81 | {{ block "content" . }}{{ end }} | ||
| 82 | </div> | ||
| 83 | |||
| 84 | <footer> | ||
| 85 | <hr> | ||
| 86 | <p><big><strong>Want to comment or have something to add?</strong></big></p> | ||
| 87 | <p>You can write me an email at <a href="mailto:mitja.felicijan@gmail.com">mitja.felicijan@gmail.com</a> or catch up with me <a href="https://telegram.me/mitjafelicijan" target="_blank">on Telegram</a>.</p> | ||
| 88 | <hr> | ||
| 89 | <p><small>This page's is also available as <a href="/feed.xml" target="_blank">RSS feed</a>. Page was built with <a href="https://github.com/mitjafelicijan/jbmafp" target="_blank">jbmafp</a>.</small></p> | ||
| 90 | </footer> | ||
| 91 | </main> | 112 | </main> |
| 92 | 113 | ||
| 93 | <script> | 114 | <footer> |
| 94 | document.querySelectorAll("table").forEach(t => t.setAttribute("border", 1)); | 115 | <p>You can write me an email at <a href="mailto:mitja.felicijan@gmail.com">mitja.felicijan@gmail.com</a> or catch up with me <a href="https://telegram.me/mitjafelicijan" target="_blank">on Telegram</a>.</p> |
| 95 | </script> | 116 | <p>This page's is also available as <a href="/feed.xml" target="_blank">RSS feed</a>. Page was built with <a href="https://github.com/mitjafelicijan/jbmafp" target="_blank">jbmafp</a>.</p> |
| 117 | </footer> | ||
| 96 | </body> | 118 | </body> |
| 97 | </html> | 119 | </html> |
| 98 | 120 | ||
diff --git a/templates/index.html b/templates/index.html index ec29351..ce656ff 100644 --- a/templates/index.html +++ b/templates/index.html | |||
| @@ -1,45 +1,67 @@ | |||
| 1 | {{ template "base.html" . }} | 1 | {{ template "base.html" . }} |
| 2 | 2 | ||
| 3 | {{ define "content" }} | 3 | {{ define "content" }} |
| 4 | <div> | ||
| 5 | <h2>Visualizations and exploration of binary files</h2> | ||
| 6 | <a href="https://mitjafelicijan.github.io/binary-visualization/" target="_blank"> | ||
| 7 | <img src="/assets/general/trigraphs.gif"> | ||
| 8 | </a> | ||
| 9 | </div> | ||
| 10 | 4 | ||
| 11 | <section class="flow-two-column"> | 5 | <section> |
| 12 | <h1>Notes, post and other stuff</h1> | 6 | <h2>Notes</h2> |
| 13 | <ul itemscope itemtype="https://schema.org/SiteNavigationElement" role="list"> | 7 | <table> |
| 14 | {{ range .Pages }} | 8 | <thead> |
| 15 | {{ if and (not .Draft) (or (eq .Type "note") (eq .Type "post")) }} | 9 | <tr> |
| 16 | <li> | 10 | <th>Date</th> |
| 17 | {{ if .Meta.tags }} | 11 | <th>Title</th> |
| 18 | <div class="tags"> | 12 | <th></th> |
| 19 | {{ range .Meta.tags }}<mark>{{ . }}</mark>{{ end }} | 13 | </tr> |
| 20 | </div> | 14 | </thead> |
| 15 | <tbody> | ||
| 16 | {{ range .Pages }} | ||
| 17 | {{ if and (not .Draft) (eq .Type "note") }} | ||
| 18 | <tr> | ||
| 19 | <td><time datetime="{{ .Created.Format "2006-01-02" }}">{{ .Created.Format "2006-01-02" }}</time></td> | ||
| 20 | <td><a href="{{ .RelPermalink }}">{{ .Title }}</a></td> | ||
| 21 | <td class="tags"> | ||
| 22 | {{ if .Meta.tags }} | ||
| 23 | {{ range .Meta.tags }}<mark>{{ . }}</mark>{{ end }} | ||
| 24 | {{ end }} | ||
| 25 | </td> | ||
| 26 | </tr> | ||
| 21 | {{ end }} | 27 | {{ end }} |
| 22 | <a href="{{ .RelPermalink }}">{{ .Title }}</a> | ||
| 23 | </li> | ||
| 24 | {{ end }} | 28 | {{ end }} |
| 25 | {{ end }} | 29 | </tbody> |
| 26 | </ul> | 30 | </table> |
| 27 | </section> | 31 | </section> |
| 28 | 32 | ||
| 29 | <div> | 33 | <section> |
| 30 | <h2>Small side projects I work/worked on</h2> | 34 | <h2>Posts</h2> |
| 31 | <ul itemscope itemtype="https://schema.org/SiteNavigationElement" role="list" aria-label="Side projects"> | 35 | <table> |
| 32 | <meta itemprop="name" content="Side projects"> | 36 | <thead> |
| 33 | <li role="listitem"><a href="https://github.com/mitjafelicijan/makext" target="_blank">makext</a> — QOL Extensions for GNU Make</li> | 37 | <tr> |
| 34 | <li role="listitem"><a href="https://github.com/mitjafelicijan/binary-visualization" target="_blank">binary-visualization</a> — Visualizations and exploration of binary files</li> | 38 | <th>Date</th> |
| 35 | <li role="listitem"><a href="https://github.com/mitjafelicijan/p9tree" target="_blank">p9tree</a> — Tree utility for 9front/Plan9 operating systems</li> | 39 | <th>Title</th> |
| 36 | <li role="listitem"><a href="https://github.com/mitjafelicijan/i3blocks" target="_blank">i3blocks</a> — Minimal i3blocks indicators</li> | 40 | <th></th> |
| 37 | <li role="listitem"><a href="https://github.com/mitjafelicijan/cord.h" target="_blank">cord.h</a> — Small C library for handling strings</li> | 41 | </tr> |
| 38 | <li role="listitem"><a href="https://github.com/mitjafelicijan/mprogress" target="_blank">mprogress</a> — Tiny utility that displays progress bar in terminal</li> | 42 | </thead> |
| 39 | <li role="listitem"><a href="https://github.com/mitjafelicijan/qli" target="_blank">qli</a> — Quantum Lorem Ipsum generator for command line</li> | 43 | <tbody> |
| 40 | <li role="listitem"><a href="https://github.com/mitjafelicijan/journalctl-proxy" target="_blank">journalctl-proxy</a> — Exposes your systemd logs to web via web interface</li> | 44 | {{ range .Pages }} |
| 41 | <li role="listitem"><a href="https://github.com/mitjafelicijan/redis-marshal" target="_blank">redis-marshal</a> — Lightweight Redis UI tool</li> | 45 | {{ if and (not .Draft) (eq .Type "post") }} |
| 42 | <li role="listitem"><a href="https://github.com/mitjafelicijan/dna-encoding" target="_blank">dna-encoding</a> — Tools for encoding files to DNA sequences</li> | 46 | <tr> |
| 43 | </ul> | 47 | <td><time datetime="{{ .Created.Format "2006-01-02" }}">{{ .Created.Format "2006-01-02" }}</time></td> |
| 44 | </div> | 48 | <td><a href="{{ .RelPermalink }}">{{ .Title }}</a></td> |
| 49 | <td class="tags"> | ||
| 50 | {{ if .Meta.tags }} | ||
| 51 | {{ range .Meta.tags }}<mark>{{ . }}</mark>{{ end }} | ||
| 52 | {{ end }} | ||
| 53 | </td> | ||
| 54 | </tr> | ||
| 55 | {{ end }} | ||
| 56 | {{ end }} | ||
| 57 | </tbody> | ||
| 58 | </table> | ||
| 59 | </section> | ||
| 60 | |||
| 61 | <section> | ||
| 62 | <h2>Visualizations and exploration of binary files</h2> | ||
| 63 | <a href="https://mitjafelicijan.github.io/binary-visualization/" target="_blank"> | ||
| 64 | <img src="/assets/general/trigraphs.gif" class="no-border"> | ||
| 65 | </a> | ||
| 66 | </section> | ||
| 45 | {{ end }} | 67 | {{ end }} |
diff --git a/templates/note.html b/templates/note.html index 62ac5f0..939fdfa 100644 --- a/templates/note.html +++ b/templates/note.html | |||
| @@ -4,33 +4,42 @@ | |||
| 4 | {{ define "description" }}{{ .Page.Summary }}{{ end }} | 4 | {{ define "description" }}{{ .Page.Summary }}{{ end }} |
| 5 | 5 | ||
| 6 | {{ define "content" }} | 6 | {{ define "content" }} |
| 7 | |||
| 7 | <article> | 8 | <article> |
| 8 | <hgroup> | 9 | <hgroup> |
| 9 | <h1>{{ .Page.Title }}</h1> | 10 | <h1>{{ .Page.Title }}</h1> |
| 10 | <p><cap>{{ .Page.Type }}</cap>, {{ .Page.Created.Format "Jan 2, 2006" }}, on <a href="{{ .Config.BaseURL }}">{{ .Config.Title }}'s blog</a></p> | 11 | <p><span class="capitalize">{{ .Page.Type }}</span>, {{ .Page.Created.Format "Jan 2, 2006" }}, on <a href="{{ .Config.BaseURL }}">{{ .Config.Title }}'s blog</a></p> |
| 11 | </hgroup> | 12 | </hgroup> |
| 12 | <div>{{ .Page.HTML }}</div> | 13 | {{ .Page.HTML }} |
| 13 | </article> | 14 | </article> |
| 14 | 15 | ||
| 15 | <div> | 16 | <section> |
| 16 | <br><hr> | 17 | <h2>Other notes</h2> |
| 17 | <p><big><strong>Other notes</strong></big></p> | 18 | <table> |
| 18 | <ul itemscope itemtype="https://schema.org/SiteNavigationElement" role="list" aria-label="Other notes"> | 19 | <thead> |
| 19 | <meta itemprop="name" content="Other notes"> | 20 | <tr> |
| 20 | {{ range .Pages | filterbytype "note" | random 15 }} | 21 | <th>Date</th> |
| 21 | {{ if not .Draft }} | 22 | <th>Title</th> |
| 22 | <li> | 23 | <th></th> |
| 23 | {{ if .Meta.tags }} | 24 | </tr> |
| 24 | <div class="tags"> | 25 | </thead> |
| 25 | {{ range .Meta.tags }}<mark>{{ . }}</mark>{{ end }} | 26 | <tbody> |
| 26 | </div> | 27 | {{ range .Pages | filterbytype "note" | random 15 }} |
| 27 | {{ end }} | 28 | {{ if not .Draft }} |
| 28 | <a href="{{ .RelPermalink }}">{{ .Title }}</a> | 29 | <tr> |
| 29 | </li> | 30 | <td><time datetime="{{ .Created.Format "2006-01-02" }}">{{ .Created.Format "2006-01-02" }}</time></td> |
| 31 | <td><a href="{{ .RelPermalink }}">{{ .Title }}</a></td> | ||
| 32 | <td class="tags"> | ||
| 33 | {{ if .Meta.tags }} | ||
| 34 | {{ range .Meta.tags }}<mark>{{ . }}</mark>{{ end }} | ||
| 35 | {{ end }} | ||
| 36 | </td> | ||
| 37 | </tr> | ||
| 38 | {{ end }} | ||
| 30 | {{ end }} | 39 | {{ end }} |
| 31 | {{ end }} | 40 | </tbody> |
| 32 | </ul> | 41 | </table> |
| 33 | </div> | 42 | </section> |
| 34 | 43 | ||
| 35 | {{ if .Page.Meta.mathjax }} | 44 | {{ if .Page.Meta.mathjax }} |
| 36 | <script src="https://cdn.jsdelivr.net/npm/mathjax@3.0.1/es5/tex-mml-chtml.js" async></script> | 45 | <script src="https://cdn.jsdelivr.net/npm/mathjax@3.0.1/es5/tex-mml-chtml.js" async></script> |
diff --git a/templates/post.html b/templates/post.html index 4458e8f..297b18f 100644 --- a/templates/post.html +++ b/templates/post.html | |||
| @@ -4,35 +4,45 @@ | |||
| 4 | {{ define "description" }}{{ .Page.Summary }}{{ end }} | 4 | {{ define "description" }}{{ .Page.Summary }}{{ end }} |
| 5 | 5 | ||
| 6 | {{ define "content" }} | 6 | {{ define "content" }} |
| 7 | |||
| 7 | <article> | 8 | <article> |
| 8 | <hgroup> | 9 | <hgroup> |
| 9 | <h1>{{ .Page.Title }}</h1> | 10 | <h1>{{ .Page.Title }}</h1> |
| 10 | <p><cap>{{ .Page.Type }}</cap>, {{ .Page.Created.Format "Jan 2, 2006" }}, on <a href="{{ .Config.BaseURL }}">{{ .Config.Title }}'s blog</a></p> | 11 | <p><span class="capitalize">{{ .Page.Type }}</span>, {{ .Page.Created.Format "Jan 2, 2006" }}, on <a href="{{ .Config.BaseURL }}">{{ .Config.Title }}'s blog</a></p> |
| 11 | </hgroup> | 12 | </hgroup> |
| 12 | <div>{{ .Page.HTML }}</div> | 13 | {{ .Page.HTML }} |
| 13 | </article> | 14 | </article> |
| 14 | 15 | ||
| 15 | <div> | 16 | <section> |
| 16 | <br><hr> | 17 | <h2>Other posts</h2> |
| 17 | <p><big><strong>Other posts</strong></big></p> | 18 | <table> |
| 18 | <ul itemscope itemtype="https://schema.org/SiteNavigationElement" role="list" aria-label="Other posts"> | 19 | <thead> |
| 19 | <meta itemprop="name" content="Other post"> | 20 | <tr> |
| 20 | {{ range .Pages | filterbytype "post" | random 15 }} | 21 | <th>Date</th> |
| 21 | {{ if not .Draft }} | 22 | <th>Title</th> |
| 22 | <li> | 23 | <th></th> |
| 23 | {{ if .Meta.tags }} | 24 | </tr> |
| 24 | <div class="tags"> | 25 | </thead> |
| 25 | {{ range .Meta.tags }}<mark>{{ . }}</mark>{{ end }} | 26 | <tbody> |
| 26 | </div> | 27 | {{ range .Pages | filterbytype "post" | random 15 }} |
| 27 | {{ end }} | 28 | {{ if not .Draft }} |
| 28 | <a href="{{ .RelPermalink }}">{{ .Title }}</a> | 29 | <tr> |
| 29 | </li> | 30 | <td><time datetime="{{ .Created.Format "2006-01-02" }}">{{ .Created.Format "2006-01-02" }}</time></td> |
| 31 | <td><a href="{{ .RelPermalink }}">{{ .Title }}</a></td> | ||
| 32 | <td class="tags"> | ||
| 33 | {{ if .Meta.tags }} | ||
| 34 | {{ range .Meta.tags }}<mark>{{ . }}</mark>{{ end }} | ||
| 35 | {{ end }} | ||
| 36 | </td> | ||
| 37 | </tr> | ||
| 38 | {{ end }} | ||
| 30 | {{ end }} | 39 | {{ end }} |
| 31 | {{ end }} | 40 | </tbody> |
| 32 | </ul> | 41 | </table> |
| 33 | </div> | 42 | </section> |
| 34 | 43 | ||
| 35 | {{ if .Page.Meta.mathjax }} | 44 | {{ if .Page.Meta.mathjax }} |
| 36 | <script src="https://cdn.jsdelivr.net/npm/mathjax@3.0.1/es5/tex-mml-chtml.js" async></script> | 45 | <script src="https://cdn.jsdelivr.net/npm/mathjax@3.0.1/es5/tex-mml-chtml.js" async></script> |
| 37 | {{ end }} | 46 | {{ end }} |
| 47 | |||
| 38 | {{ end }} | 48 | {{ end }} |
diff --git a/tools/projects.py b/tools/projects.py new file mode 100644 index 0000000..2805bf2 --- /dev/null +++ b/tools/projects.py | |||
| @@ -0,0 +1,147 @@ | |||
| 1 | """Fetches my public repositories and downloads tagged versions.""" | ||
| 2 | from datetime import datetime | ||
| 3 | import sys | ||
| 4 | import json | ||
| 5 | import requests | ||
| 6 | |||
| 7 | USERNAME = "mitjafelicijan" | ||
| 8 | CACHE_BUSTER = int(datetime.now().timestamp()) | ||
| 9 | DOUBLE_NL = "\n\n" | ||
| 10 | |||
| 11 | headers = { | ||
| 12 | "Accept": "application/vnd.github.v3+json" | ||
| 13 | } | ||
| 14 | |||
| 15 | |||
| 16 | def generate_markdown_file(include_repositories): | ||
| 17 | file = open("../content/pages/projects.md", "w") | ||
| 18 | |||
| 19 | file.write("---\n") | ||
| 20 | file.write("title: Personal projects\n") | ||
| 21 | file.write("date: 2024-10-21T12:00:00+02:00\n") | ||
| 22 | file.write("url: projects.html\n") | ||
| 23 | file.write("type: page\n") | ||
| 24 | file.write("draft: false\n") | ||
| 25 | file.write("---") | ||
| 26 | file.write(DOUBLE_NL) | ||
| 27 | |||
| 28 | file.write("<div class='project-list'>") | ||
| 29 | file.write(DOUBLE_NL) | ||
| 30 | |||
| 31 | for repo in include_repositories: | ||
| 32 | file.write(f"- [{repo['name']}](#{repo['name'].lower()}) \n") | ||
| 33 | |||
| 34 | file.write(DOUBLE_NL) | ||
| 35 | file.write("</div>") | ||
| 36 | file.write(DOUBLE_NL) | ||
| 37 | |||
| 38 | for repo in include_repositories: | ||
| 39 | print(f"> {repo['name']}") | ||
| 40 | |||
| 41 | file.write(f"## {repo['name']}\n") | ||
| 42 | file.write(f"{repo['description']}\n") | ||
| 43 | |||
| 44 | file.write(DOUBLE_NL) | ||
| 45 | file.write("<div class='project-release'>") | ||
| 46 | file.write(DOUBLE_NL) | ||
| 47 | file.write("|Released|Description|Download|\n") | ||
| 48 | file.write("|--------|-----------|--------|\n") | ||
| 49 | |||
| 50 | for release in repo['releases']: | ||
| 51 | print(f" - {release['name']} - {release['created_at']}") | ||
| 52 | dt = datetime.strptime(release["created_at"], "%Y-%m-%dT%H:%M:%SZ") | ||
| 53 | file.write(f"|{dt.strftime('%Y-%m-%d')}|{release['name']}| [{release['filename']}](/projects/{release['filename']}) |\n") | ||
| 54 | |||
| 55 | file.write(DOUBLE_NL) | ||
| 56 | file.write("</div>") | ||
| 57 | file.write(DOUBLE_NL) | ||
| 58 | |||
| 59 | file.write("<div class='github-link'>") | ||
| 60 | file.write(DOUBLE_NL) | ||
| 61 | file.write("") | ||
| 62 | file.write(f"[{USERNAME}/{repo['name']}](https://github.com/{USERNAME}/{repo['name']})") | ||
| 63 | file.write(DOUBLE_NL) | ||
| 64 | file.write("</div>") | ||
| 65 | file.write(DOUBLE_NL) | ||
| 66 | |||
| 67 | file.write(DOUBLE_NL) | ||
| 68 | file.write("<style>\n") | ||
| 69 | file.write(".project-release table tr td:last-child { text-align: right; }\n") | ||
| 70 | file.write(".project-release table tr th:last-child { text-align: right; }\n") | ||
| 71 | file.write(".project-list ul { column-count: 3; column-gap: 3em; }\n") | ||
| 72 | file.write(".github-link p { display: flex; align-items: center; gap: 0.3em; }\n") | ||
| 73 | file.write(".github-link p img { border: 0; padding: 0; height: 15px; }\n") | ||
| 74 | file.write("</style>") | ||
| 75 | file.write(DOUBLE_NL) | ||
| 76 | |||
| 77 | file.close() | ||
| 78 | |||
| 79 | |||
| 80 | |||
| 81 | def download_tarball(url, filepath): | ||
| 82 | with requests.get(url, stream=True, timeout=30) as response: | ||
| 83 | response.raise_for_status() | ||
| 84 | |||
| 85 | with open(filepath, "wb") as file: | ||
| 86 | for chunk in response.iter_content(chunk_size=8192): | ||
| 87 | file.write(chunk) | ||
| 88 | |||
| 89 | |||
| 90 | def assert_rate_limit(response): | ||
| 91 | rate_limit_limit = int(response.headers.get("x-ratelimit-limit")) | ||
| 92 | rate_limit_remaining = int(response.headers.get("x-ratelimit-remaining")) | ||
| 93 | rate_limit_reset = int(response.headers.get("x-ratelimit-reset")) | ||
| 94 | print(f"Rate limit: {rate_limit_remaining}/{rate_limit_limit}") | ||
| 95 | print(f"Reset time: {datetime.fromtimestamp(rate_limit_reset)}") | ||
| 96 | |||
| 97 | if rate_limit_remaining == 0: | ||
| 98 | sys.exit(1) | ||
| 99 | |||
| 100 | |||
| 101 | def fetch_github_data(): | ||
| 102 | include_repositories = [] | ||
| 103 | print(headers) | ||
| 104 | response = requests.get(f"https://api.github.com/users/{USERNAME}/repos?ts={CACHE_BUSTER}&per_page=100", | ||
| 105 | headers=headers, | ||
| 106 | timeout=10) | ||
| 107 | |||
| 108 | assert_rate_limit(response) | ||
| 109 | |||
| 110 | if response.status_code == 200: | ||
| 111 | repos = response.json() | ||
| 112 | for repo in repos: | ||
| 113 | if "include" in repo["topics"]: | ||
| 114 | include_repositories.append(repo) | ||
| 115 | else: | ||
| 116 | print(f"Failed to retrieve repositories: {response.status_code}") | ||
| 117 | sys.exit(1) | ||
| 118 | |||
| 119 | for repo in include_repositories: | ||
| 120 | print(f"Name: {repo['name']}, URL: {repo['html_url']}") | ||
| 121 | |||
| 122 | response = requests.get(f"https://api.github.com/repos/{USERNAME}/{repo['name']}/releases?ts={CACHE_BUSTER}", | ||
| 123 | headers=headers, | ||
| 124 | timeout=10) | ||
| 125 | |||
| 126 | assert_rate_limit(response) | ||
| 127 | |||
| 128 | if response.status_code == 200: | ||
| 129 | repo["releases"] = response.json() | ||
| 130 | for release in repo["releases"]: | ||
| 131 | release["filename"] = f"{repo['name']}-{release['tag_name']}.tar.gz" | ||
| 132 | print(f" > {release['tag_name']}, {release['name']}, {release['filename']}") | ||
| 133 | download_tarball(release["tarball_url"], f"../static/projects/{release['filename']}") | ||
| 134 | |||
| 135 | return include_repositories | ||
| 136 | |||
| 137 | |||
| 138 | # include_repositories = fetch_github_data() | ||
| 139 | |||
| 140 | # with open("out.json", "w") as json_file: | ||
| 141 | # json.dump(include_repositories, json_file, indent=4) | ||
| 142 | |||
| 143 | # generate_markdown_file(include_repositories) | ||
| 144 | |||
| 145 | with open("out.json", "r") as fp: | ||
| 146 | include_repositories = json.load(fp) | ||
| 147 | generate_markdown_file(include_repositories) | ||
