deploy: fido-node/org@ac7df70e9b
This commit is contained in:
parent
0c70e52abb
commit
2ccb411702
26
index.html
26
index.html
@ -1,11 +1,11 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content="Personal page with a blog about my adventures in a world of tech things"/><meta name="og:description" content="Personal page with a blog about my adventures in a world of tech things"/><meta name="twitter:description" content="Personal page with a blog about my adventures in a world of tech things"/><meta name="og:image" content="https://fidonode.me/resources/images/index.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/index.org.png"/><meta name="og:title" content="Alex Mikhailov"/><meta name="twitter:title" content="Alex Mikhailov"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><title>Alex Mikhailov</title></head><body class="line-numbers"><main class="container"><header class="header"><nav><ul><li><strong>Alex Mikhailov</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header>
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content="Personal page with a blog about my adventures in a world of tech things"/><meta name="og:description" content="Personal page with a blog about my adventures in a world of tech things"/><meta name="twitter:description" content="Personal page with a blog about my adventures in a world of tech things"/><meta name="og:image" content="https://fidonode.me/resources/images/index.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/index.org.png"/><meta name="og:title" content="Alex Mikhailov"/><meta name="twitter:title" content="Alex Mikhailov"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><title>Alex Mikhailov</title></head><body><main class="container"><header class="header"><nav><ul><li><strong>Alex Mikhailov</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header>
|
||||
<div class="figure">
|
||||
<p><img src="./resources/images/index/avatar.jpg" alt="avatar.jpg" />
|
||||
</p>
|
||||
</div>
|
||||
<div id="outline-container-org144269e" class="outline-2">
|
||||
<h2 id="org144269e"> </h2>
|
||||
<div class="outline-text-2" id="text-org144269e">
|
||||
<div id="outline-container-orgf286f24" class="outline-2">
|
||||
<h2 id="orgf286f24"> </h2>
|
||||
<div class="outline-text-2" id="text-orgf286f24">
|
||||
<p>
|
||||
Full stack engineer
|
||||
FP-curious | λ-affected
|
||||
@ -13,9 +13,9 @@ Wanna be rustacean 🦀 and/or secops guy 🔒
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org431195a" class="outline-2">
|
||||
<h2 id="org431195a">Experience</h2>
|
||||
<div class="outline-text-2" id="text-org431195a">
|
||||
<div id="outline-container-orgecca66c" class="outline-2">
|
||||
<h2 id="orgecca66c">Experience</h2>
|
||||
<div class="outline-text-2" id="text-orgecca66c">
|
||||
<ul class="org-ul">
|
||||
<li>Current position <a href="https://www.samsungfood.com/">@SamsungFood</a>.
|
||||
Internal tools engineer for data platform ➡ Internal tools engineer for developers.</li>
|
||||
@ -24,9 +24,9 @@ Fullstack engineer.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org50b7c40" class="outline-2">
|
||||
<h2 id="org50b7c40">Technologies</h2>
|
||||
<div class="outline-text-2" id="text-org50b7c40">
|
||||
<div id="outline-container-org87aa0da" class="outline-2">
|
||||
<h2 id="org87aa0da">Technologies</h2>
|
||||
<div class="outline-text-2" id="text-org87aa0da">
|
||||
<p>
|
||||
Work with:
|
||||
</p>
|
||||
@ -43,9 +43,9 @@ Work with:
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org969fd35" class="outline-2">
|
||||
<h2 id="org969fd35">Contacts</h2>
|
||||
<div class="outline-text-2" id="text-org969fd35">
|
||||
<div id="outline-container-org3bb9bea" class="outline-2">
|
||||
<h2 id="org3bb9bea">Contacts</h2>
|
||||
<div class="outline-text-2" id="text-org3bb9bea">
|
||||
<p>
|
||||
Contact me via:
|
||||
</p>
|
||||
|
@ -1,7 +1,7 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content="Index page for my blog"/><meta name="og:description" content="Index page for my blog"/><meta name="twitter:description" content="Index page for my blog"/><meta name="og:image" content="https://fidonode.me/resources/images/posts.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/posts.org.png"/><meta name="og:title" content="Alex Mikhailov - Blog"/><meta name="twitter:title" content="Alex Mikhailov - Blog"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><title>Alex Mikhailov - Blog</title></head><body class="line-numbers"><main class="container"><header class="header"><nav><ul><li><strong>Alex Mikhailov - Blog</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header>
|
||||
<div id="outline-container-org2e2fc1e" class="outline-2">
|
||||
<h2 id="org2e2fc1e">Posts</h2>
|
||||
<div class="outline-text-2" id="text-org2e2fc1e">
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content="Index page for my blog"/><meta name="og:description" content="Index page for my blog"/><meta name="twitter:description" content="Index page for my blog"/><meta name="og:image" content="https://fidonode.me/resources/images/posts.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/posts.org.png"/><meta name="og:title" content="Alex Mikhailov - Blog"/><meta name="twitter:title" content="Alex Mikhailov - Blog"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><title>Alex Mikhailov - Blog</title></head><body><main class="container"><header class="header"><nav><ul><li><strong>Alex Mikhailov - Blog</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header>
|
||||
<div id="outline-container-orgca1f0da" class="outline-2">
|
||||
<h2 id="orgca1f0da">Posts</h2>
|
||||
<div class="outline-text-2" id="text-orgca1f0da">
|
||||
<ul class="org-ul">
|
||||
<li><a href="./posts/keeb.html">Keyboard journey</a></li>
|
||||
<li><a href="./posts/about_blog.html">Org to HTML and back</a></li>
|
||||
|
@ -1,45 +1,45 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content="Blog post about publishing my blog with Org Mode"/><meta name="og:description" content="Blog post about publishing my blog with Org Mode"/><meta name="twitter:description" content="Blog post about publishing my blog with Org Mode"/><meta name="og:image" content="https://fidonode.me/resources/images/posts/about_blog.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/posts/about_blog.org.png"/><meta name="og:title" content="Org to HTML and back"/><meta name="twitter:title" content="Org to HTML and back"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><nil><link id="prism-theme" rel="stylesheet" type="text/css"/><link rel="stylesheet" type="text/css" href="/resources/css/quirks.css"/><script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script><script src="/resources/js/theme-selector.js"></script></nil><title>Org to HTML and back</title></head><body class="line-numbers"><main class="container"><header class="header"><nav><ul><li><strong>Org to HTML and back</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header><div id="table-of-contents">
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content="Blog post about publishing my blog with Org Mode"/><meta name="og:description" content="Blog post about publishing my blog with Org Mode"/><meta name="twitter:description" content="Blog post about publishing my blog with Org Mode"/><meta name="og:image" content="https://fidonode.me/resources/images/posts/about_blog.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/posts/about_blog.org.png"/><meta name="og:title" content="Org to HTML and back"/><meta name="twitter:title" content="Org to HTML and back"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><nil><link id="highlight-theme" rel="stylesheet" type="text/css"/><script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script><script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/languages/bash.min.js"></script><script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/languages/lisp.min.js"></script><script src="/resources/js/theme-selector.js"></script></nil><title>Org to HTML and back</title></head><body><main class="container"><header class="header"><nav><ul><li><strong>Org to HTML and back</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header><div id="table-of-contents">
|
||||
<h2>Table of Contents</h2>
|
||||
<div id="text-table-of-contents">
|
||||
<ul>
|
||||
<li><a href="#org07afe54">Disclaimer</a></li>
|
||||
<li><a href="#orgf5defe4">What is Org?</a></li>
|
||||
<li><a href="#orgedbf20c">Why Org Mode?</a></li>
|
||||
<li><a href="#org067eac6">Render Org to blog or whatever</a>
|
||||
<li><a href="#orge2d9a8f">Disclaimer</a></li>
|
||||
<li><a href="#orgfa64efa">What is Org?</a></li>
|
||||
<li><a href="#org833356c">Why Org Mode?</a></li>
|
||||
<li><a href="#org5fe0620">Render Org to blog or whatever</a>
|
||||
<ul>
|
||||
<li><a href="#org7f2a19b">Render HTML</a></li>
|
||||
<li><a href="#org3f09f36">Static files</a></li>
|
||||
<li><a href="#org05c1ace">Whole build script</a></li>
|
||||
<li><a href="#orga0df592">Render HTML</a></li>
|
||||
<li><a href="#org97d3eeb">Static files</a></li>
|
||||
<li><a href="#org8c17fc5">Whole build script</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#org5acbc1f">Publish through GitHub Action</a>
|
||||
<li><a href="#org2ced1ef">Publish through GitHub Action</a>
|
||||
<ul>
|
||||
<li><a href="#orgda0f16a">Install Emacs</a></li>
|
||||
<li><a href="#org06c37f4">Just bring everything</a></li>
|
||||
<li><a href="#org25c0c72">BTW I use GNU Emacs</a></li>
|
||||
<li><a href="#org04285d2">Install Emacs</a></li>
|
||||
<li><a href="#org2d0af99">Just bring everything</a></li>
|
||||
<li><a href="#org2ad5512">BTW I use GNU Emacs</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#org34f8164">What is next</a>
|
||||
<li><a href="#org9df4250">What is next</a>
|
||||
<ul>
|
||||
<li><a href="#org8a54bc5">RSS Feed</a></li>
|
||||
<li><a href="#org990c540">Open Graph</a></li>
|
||||
<li><a href="#orgfe9581e">Code highlighting</a></li>
|
||||
<li><a href="#org7e8fa0b">RSS Feed</a></li>
|
||||
<li><a href="#org22534a3">Open Graph</a></li>
|
||||
<li><a href="#orgebf2b85">Code highlighting</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org07afe54" class="outline-2">
|
||||
<h2 id="org07afe54">Disclaimer</h2>
|
||||
<div class="outline-text-2" id="text-org07afe54">
|
||||
<div id="outline-container-orge2d9a8f" class="outline-2">
|
||||
<h2 id="orge2d9a8f">Disclaimer</h2>
|
||||
<div class="outline-text-2" id="text-orge2d9a8f">
|
||||
<p>
|
||||
I'm neither proficient in Org Mode (further on "Org"), nor a good front-end engineer. I think that a simple solution is better than no solution. If you see a mistake, you can contact me via <a href="mailto:iam@fidonode.me">iam@fidonode.me</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-orgf5defe4" class="outline-2">
|
||||
<h2 id="orgf5defe4">What is Org?</h2>
|
||||
<div class="outline-text-2" id="text-orgf5defe4">
|
||||
<div id="outline-container-orgfa64efa" class="outline-2">
|
||||
<h2 id="orgfa64efa">What is Org?</h2>
|
||||
<div class="outline-text-2" id="text-orgfa64efa">
|
||||
<blockquote>
|
||||
<p>
|
||||
Your life in plain text
|
||||
@ -55,9 +55,9 @@ Everything you can do in Org is to write a text. With a special markup, of cours
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-orgedbf20c" class="outline-2">
|
||||
<h2 id="orgedbf20c">Why Org Mode?</h2>
|
||||
<div class="outline-text-2" id="text-orgedbf20c">
|
||||
<div id="outline-container-org833356c" class="outline-2">
|
||||
<h2 id="org833356c">Why Org Mode?</h2>
|
||||
<div class="outline-text-2" id="text-org833356c">
|
||||
<ol class="org-ol">
|
||||
<li>Plain text.
|
||||
Plain text as a data source offers significant versatility. You can read and understand what happens in org files without needing Emacs.</li>
|
||||
@ -69,21 +69,21 @@ I do not have a habit of collecting and keeping information. I believe that disc
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org067eac6" class="outline-2">
|
||||
<h2 id="org067eac6">Render Org to blog or whatever</h2>
|
||||
<div class="outline-text-2" id="text-org067eac6">
|
||||
<div id="outline-container-org5fe0620" class="outline-2">
|
||||
<h2 id="org5fe0620">Render Org to blog or whatever</h2>
|
||||
<div class="outline-text-2" id="text-org5fe0620">
|
||||
<p>
|
||||
Org already has a way to render files into HTML, allowing you to create simple HTML files with minimal styling. I'm not interesting in styling from org, so I decide to use <a href="https://picocss.com">picocss</a> framework.
|
||||
</p>
|
||||
</div>
|
||||
<div id="outline-container-org7f2a19b" class="outline-3">
|
||||
<h3 id="org7f2a19b">Render HTML</h3>
|
||||
<div class="outline-text-3" id="text-org7f2a19b">
|
||||
<div id="outline-container-orga0df592" class="outline-3">
|
||||
<h3 id="orga0df592">Render HTML</h3>
|
||||
<div class="outline-text-3" id="text-orga0df592">
|
||||
<p>
|
||||
I want to change some templates here and there. I've found <code>esxml</code> package. It is a decent DSL for writing XML/HTML.
|
||||
Here is how page header and footer look in this DSL.
|
||||
</p>
|
||||
<pre><code class="language-elisp">(defun my/header (info)
|
||||
<pre><code class="language-lisp">(defun my/header (info)
|
||||
`(header (@ (class "header"))
|
||||
(nav
|
||||
(ul
|
||||
@ -114,7 +114,7 @@ Here is how page header and footer look in this DSL.
|
||||
Looks neat for me. At least I don't need to mess with string concatenation.
|
||||
Whole template wiring looks like that. Not much, but it works and easy to maintain.
|
||||
</p>
|
||||
<pre><code class="language-elisp">(defun my/template (contents info)
|
||||
<pre><code class="language-lisp">(defun my/template (contents info)
|
||||
(concat
|
||||
"&lt;!DOCTYPE html&gt;"
|
||||
(sxml-to-xml
|
||||
@ -147,7 +147,7 @@ Whole template wiring looks like that. Not much, but it works and easy to mainta
|
||||
Ok, now we need some additional steps to wire these templating function.
|
||||
</p>
|
||||
|
||||
<pre><code class="language-elisp">;; Derive new backend with our custom tepmplating function
|
||||
<pre><code class="language-lisp">;; Derive new backend with our custom tepmplating function
|
||||
;; We derive it from regular HTML backend
|
||||
|
||||
(org-export-define-derived-backend 'my-html 'html
|
||||
@ -164,7 +164,7 @@ Ok, now we need some additional steps to wire these templating function.
|
||||
So everything is almost done. Time to use our custom publishing function in projects list.
|
||||
</p>
|
||||
|
||||
<pre><code class="language-elisp">(setq org-publish-project-alist
|
||||
<pre><code class="language-lisp">(setq org-publish-project-alist
|
||||
(list
|
||||
(list "blog"
|
||||
:recursive t
|
||||
@ -183,9 +183,9 @@ So everything is almost done. Time to use our custom publishing function in proj
|
||||
</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org3f09f36" class="outline-3">
|
||||
<h3 id="org3f09f36">Static files</h3>
|
||||
<div class="outline-text-3" id="text-org3f09f36">
|
||||
<div id="outline-container-org97d3eeb" class="outline-3">
|
||||
<h3 id="org97d3eeb">Static files</h3>
|
||||
<div class="outline-text-3" id="text-org97d3eeb">
|
||||
<p>
|
||||
Yep, you may want to publish some photos with your blog or any other static files.
|
||||
</p>
|
||||
@ -205,13 +205,13 @@ Looks self explanatory.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org05c1ace" class="outline-3">
|
||||
<h3 id="org05c1ace">Whole build script</h3>
|
||||
<div class="outline-text-3" id="text-org05c1ace">
|
||||
<div id="outline-container-org8c17fc5" class="outline-3">
|
||||
<h3 id="org8c17fc5">Whole build script</h3>
|
||||
<div class="outline-text-3" id="text-org8c17fc5">
|
||||
<p>
|
||||
Here is the whole elisp script which I use to publish my blog. It have some additional quirks to work with <code class="src src-sh">doomscript ./build-site.el</code>.
|
||||
</p>
|
||||
<pre><code class="language-elisp">;; Load the publishing system
|
||||
<pre><code class="language-lisp">;; Load the publishing system
|
||||
;; Configure environment
|
||||
;;
|
||||
(setq debug-on-error t)
|
||||
@ -365,9 +365,9 @@ Here is the whole elisp script which I use to publish my blog. It have some addi
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org5acbc1f" class="outline-2">
|
||||
<h2 id="org5acbc1f">Publish through GitHub Action</h2>
|
||||
<div class="outline-text-2" id="text-org5acbc1f">
|
||||
<div id="outline-container-org2ced1ef" class="outline-2">
|
||||
<h2 id="org2ced1ef">Publish through GitHub Action</h2>
|
||||
<div class="outline-text-2" id="text-org2ced1ef">
|
||||
<p>
|
||||
With all previous preparations, this step sounds simple like: <code class="src src-sh">emacs -Q --script ./build-site.el</code>
|
||||
I've chosen a pretty standard way to publish static sites through GitHub Pages. Since I keep my Org files in a private repo, I need some additional steps to address it. I use the <code>peaceiris/actions-gh-pages@v3</code> action to publish from my Org repo to the Pages repo.
|
||||
@ -375,9 +375,9 @@ However, since I use <code>Doom Emacs</code> as my configuration framework, we n
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-orgda0f16a" class="outline-3">
|
||||
<h3 id="orgda0f16a">Install Emacs</h3>
|
||||
<div class="outline-text-3" id="text-orgda0f16a">
|
||||
<div id="outline-container-org04285d2" class="outline-3">
|
||||
<h3 id="org04285d2">Install Emacs</h3>
|
||||
<div class="outline-text-3" id="text-org04285d2">
|
||||
<p>
|
||||
If you want to run <code>Emacs Lisp</code>, you need the whole Emacs, at least without GUI. In a GitHub Action, you can simply run:
|
||||
</p>
|
||||
@ -388,9 +388,9 @@ This way has a downside - you will install Emacs on each action run since the sy
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org06c37f4" class="outline-3">
|
||||
<h3 id="org06c37f4">Just bring everything</h3>
|
||||
<div class="outline-text-3" id="text-org06c37f4">
|
||||
<div id="outline-container-org2d0af99" class="outline-3">
|
||||
<h3 id="org2d0af99">Just bring everything</h3>
|
||||
<div class="outline-text-3" id="text-org2d0af99">
|
||||
<p>
|
||||
I need to take extra steps since I use Doom Emacs and have my configs in Org. You may also need to install dependencies for your configuration.
|
||||
</p>
|
||||
@ -426,9 +426,9 @@ Of course, I use a caching step to make the whole process faster:
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org25c0c72" class="outline-3">
|
||||
<h3 id="org25c0c72">BTW I use GNU Emacs</h3>
|
||||
<div class="outline-text-3" id="text-org25c0c72">
|
||||
<div id="outline-container-org2ad5512" class="outline-3">
|
||||
<h3 id="org2ad5512">BTW I use GNU Emacs</h3>
|
||||
<div class="outline-text-3" id="text-org2ad5512">
|
||||
<p>
|
||||
Here's the whole publishing workflow.
|
||||
</p>
|
||||
@ -507,27 +507,27 @@ jobs:
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org34f8164" class="outline-2">
|
||||
<h2 id="org34f8164">What is next</h2>
|
||||
<div class="outline-text-2" id="text-org34f8164">
|
||||
<div id="outline-container-org9df4250" class="outline-2">
|
||||
<h2 id="org9df4250">What is next</h2>
|
||||
<div class="outline-text-2" id="text-org9df4250">
|
||||
<p>
|
||||
I have a plans to make posts about next features:
|
||||
</p>
|
||||
</div>
|
||||
<div id="outline-container-org8a54bc5" class="outline-3">
|
||||
<h3 id="org8a54bc5"><a href="./add_rss_to_blog.html">RSS Feed</a></h3>
|
||||
<div id="outline-container-org7e8fa0b" class="outline-3">
|
||||
<h3 id="org7e8fa0b"><a href="./add_rss_to_blog.html">RSS Feed</a></h3>
|
||||
</div>
|
||||
<div id="outline-container-org990c540" class="outline-3">
|
||||
<h3 id="org990c540">Open Graph</h3>
|
||||
<div class="outline-text-3" id="text-org990c540">
|
||||
<div id="outline-container-org22534a3" class="outline-3">
|
||||
<h3 id="org22534a3">Open Graph</h3>
|
||||
<div class="outline-text-3" id="text-org22534a3">
|
||||
<p>
|
||||
Already implemented. Need to document process.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-orgfe9581e" class="outline-3">
|
||||
<h3 id="orgfe9581e">Code highlighting</h3>
|
||||
<div class="outline-text-3" id="text-orgfe9581e">
|
||||
<div id="outline-container-orgebf2b85" class="outline-3">
|
||||
<h3 id="orgebf2b85">Code highlighting</h3>
|
||||
<div class="outline-text-3" id="text-orgebf2b85">
|
||||
<p>
|
||||
Only rudimentary highlight. Want something fancier.
|
||||
</p>
|
||||
|
@ -1,36 +1,36 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content="Let's add RSS feed to blog"/><meta name="og:description" content="Let's add RSS feed to blog"/><meta name="twitter:description" content="Let's add RSS feed to blog"/><meta name="og:image" content="https://fidonode.me/resources/images/posts/add_rss_to_blog.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/posts/add_rss_to_blog.org.png"/><meta name="og:title" content="Org blog with RSS"/><meta name="twitter:title" content="Org blog with RSS"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><nil><link id="prism-theme" rel="stylesheet" type="text/css"/><link rel="stylesheet" type="text/css" href="/resources/css/quirks.css"/><script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script><script src="/resources/js/theme-selector.js"></script></nil><title>Org blog with RSS</title></head><body class="line-numbers"><main class="container"><header class="header"><nav><ul><li><strong>Org blog with RSS</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header><div id="table-of-contents">
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content="Let's add RSS feed to blog"/><meta name="og:description" content="Let's add RSS feed to blog"/><meta name="twitter:description" content="Let's add RSS feed to blog"/><meta name="og:image" content="https://fidonode.me/resources/images/posts/add_rss_to_blog.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/posts/add_rss_to_blog.org.png"/><meta name="og:title" content="Org blog with RSS"/><meta name="twitter:title" content="Org blog with RSS"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><nil><link id="highlight-theme" rel="stylesheet" type="text/css"/><script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script><script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/languages/bash.min.js"></script><script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/languages/lisp.min.js"></script><script src="/resources/js/theme-selector.js"></script></nil><title>Org blog with RSS</title></head><body><main class="container"><header class="header"><nav><ul><li><strong>Org blog with RSS</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header><div id="table-of-contents">
|
||||
<h2>Table of Contents</h2>
|
||||
<div id="text-table-of-contents">
|
||||
<ul>
|
||||
<li><a href="#org641f63b">Why do you even need RSS?</a></li>
|
||||
<li><a href="#orgf51875a">Add RSS feed</a>
|
||||
<li><a href="#org4c7e0be">Why do you even need RSS?</a></li>
|
||||
<li><a href="#org3e8cdc0">Add RSS feed</a>
|
||||
<ul>
|
||||
<li><a href="#orga8128cd">Use sitemap backend in the build</a></li>
|
||||
<li><a href="#orgc28c171">Publishing and formatting functions</a></li>
|
||||
<li><a href="#org21ecd36">Use sitemap backend in the build</a></li>
|
||||
<li><a href="#org67bb290">Publishing and formatting functions</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org641f63b" class="outline-2">
|
||||
<h2 id="org641f63b">Why do you even need RSS?</h2>
|
||||
<div class="outline-text-2" id="text-org641f63b">
|
||||
<div id="outline-container-org4c7e0be" class="outline-2">
|
||||
<h2 id="org4c7e0be">Why do you even need RSS?</h2>
|
||||
<div class="outline-text-2" id="text-org4c7e0be">
|
||||
<p>
|
||||
RSS might seem like an outdated, marginal thing. But it still has at least one benefit—you can use an RSS feed as a sitemap for search engines. Plus, it's pretty geeky.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-orgf51875a" class="outline-2">
|
||||
<h2 id="orgf51875a">Add RSS feed</h2>
|
||||
<div class="outline-text-2" id="text-orgf51875a">
|
||||
<div id="outline-container-org3e8cdc0" class="outline-2">
|
||||
<h2 id="org3e8cdc0">Add RSS feed</h2>
|
||||
<div class="outline-text-2" id="text-org3e8cdc0">
|
||||
<p>
|
||||
So, what's happening here? Let's start by integrating our templating functions into the build.
|
||||
</p>
|
||||
</div>
|
||||
<div id="outline-container-orga8128cd" class="outline-3">
|
||||
<h3 id="orga8128cd">Use sitemap backend in the build</h3>
|
||||
<div class="outline-text-3" id="text-orga8128cd">
|
||||
<pre><code class="language-elisp">(setq org-publish-project-alist
|
||||
<div id="outline-container-org21ecd36" class="outline-3">
|
||||
<h3 id="org21ecd36">Use sitemap backend in the build</h3>
|
||||
<div class="outline-text-3" id="text-org21ecd36">
|
||||
<pre><code class="language-lisp">(setq org-publish-project-alist
|
||||
(list
|
||||
(list "blog-rss"
|
||||
:author "Alex M"
|
||||
@ -59,18 +59,18 @@ How does it work? As you can see, we use the default sitemap generator from Org
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-orgc28c171" class="outline-3">
|
||||
<h3 id="orgc28c171">Publishing and formatting functions</h3>
|
||||
<div class="outline-text-3" id="text-orgc28c171">
|
||||
<div id="outline-container-org67bb290" class="outline-3">
|
||||
<h3 id="org67bb290">Publishing and formatting functions</h3>
|
||||
<div class="outline-text-3" id="text-org67bb290">
|
||||
<p>
|
||||
We need a mandatory dependency because we don't want to mess with forming correct XML by ourselves.
|
||||
</p>
|
||||
<pre><code class="language-elisp">(require 'ox-rss)
|
||||
<pre><code class="language-lisp">(require 'ox-rss)
|
||||
</code></pre>
|
||||
<p>
|
||||
Here's the core of the process. We need to prepare entries before feeding them to the <code>org-rss-publish-to-rss</code> function. Since we're doing it our own way, we need to start by creating a bullet with a link to the post, and then add <code>RSS_PERMALINK</code>, <code>RSS_TITLE</code>, and <code>PUBDATE</code>. I also add the first two lines of the blog post instead of a description. This is the native way to do a preview in the RSS world.
|
||||
</p>
|
||||
<pre><code class="language-elisp">(defun my/format-rss-feed-entry (entry style project)
|
||||
<pre><code class="language-lisp">(defun my/format-rss-feed-entry (entry style project)
|
||||
"Format ENTRY for the RSS feed.
|
||||
ENTRY is a file name. STYLE is either 'list' or 'tree'.
|
||||
PROJECT is the current project."
|
||||
@ -105,7 +105,7 @@ PROJECT is the current project."
|
||||
<p>
|
||||
This function creates the content of the intermediate org file. Mostly a rudimentary title, and then we ask Org to unwind the list of collected files with the <code>my/format-rss-feed-entry</code> function.
|
||||
</p>
|
||||
<pre><code class="language-elisp">(defun my/format-rss-feed (title list)
|
||||
<pre><code class="language-lisp">(defun my/format-rss-feed (title list)
|
||||
"Generate RSS feed, as a string.
|
||||
TITLE is the title of the RSS feed. LIST is an internal
|
||||
representation for the files to include, as returned by
|
||||
@ -117,7 +117,7 @@ representation for the files to include, as returned by
|
||||
<p>
|
||||
This function replaces the default publishing function to filter everything except the intermediate file before publishing.
|
||||
</p>
|
||||
<pre><code class="language-elisp">(defun my/publish-to-rss (plist filename pub-dir)
|
||||
<pre><code class="language-lisp">(defun my/publish-to-rss (plist filename pub-dir)
|
||||
"Publish RSS with PLIST, only when FILENAME is 'rss.org'.
|
||||
PUB-DIR is when the output will be placed."
|
||||
(if (equal "rss.org" (file-name-nondirectory filename))
|
||||
|
423
posts/improve_code_blocks.html
Normal file
423
posts/improve_code_blocks.html
Normal file
@ -0,0 +1,423 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content="Use prime.js for code syntax highlighting"/><meta name="og:description" content="Use prime.js for code syntax highlighting"/><meta name="twitter:description" content="Use prime.js for code syntax highlighting"/><meta name="og:image" content="https://fidonode.me/resources/images/posts/improve_code_blocks.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/posts/improve_code_blocks.org.png"/><meta name="og:title" content="Improve code blocks"/><meta name="twitter:title" content="Improve code blocks"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><nil><link id="highlight-theme" rel="stylesheet" type="text/css"/><script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script><script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/languages/bash.min.js"></script><script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/languages/lisp.min.js"></script><script src="/resources/js/theme-selector.js"></script></nil><title>Improve code blocks</title></head><body><main class="container"><header class="header"><nav><ul><li><strong>Improve code blocks</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header><div id="table-of-contents">
|
||||
<h2>Table of Contents</h2>
|
||||
<div id="text-table-of-contents">
|
||||
<ul>
|
||||
<li><a href="#org506f58f">What is the problem with default highlighting?</a></li>
|
||||
<li><a href="#orgbf2207a">Prism.js</a>
|
||||
<ul>
|
||||
<li><a href="#orgb19a9c7">Change code block template</a></li>
|
||||
<li><a href="#orge91c35a">Plug Prism.js</a></li>
|
||||
<li><a href="#orgbaa05e2">Respect prefers-color-scheme</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#org8ecf679">Whole config</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org506f58f" class="outline-2">
|
||||
<h2 id="org506f58f">What is the problem with default highlighting?</h2>
|
||||
</div>
|
||||
<div id="outline-container-orgbf2207a" class="outline-2">
|
||||
<h2 id="orgbf2207a">Prism.js</h2>
|
||||
<div class="outline-text-2" id="text-orgbf2207a">
|
||||
</div>
|
||||
<div id="outline-container-orgb19a9c7" class="outline-3">
|
||||
<h3 id="orgb19a9c7">Change code block template</h3>
|
||||
<div class="outline-text-3" id="text-orgb19a9c7">
|
||||
<pre><code class="language-lisp">(defun my/src-block (src-block contents info)
|
||||
"Translate SRC-BLOCK element into HTML.
|
||||
CONTENTS is nil. INFO is a plist holding contextual information."
|
||||
(let* (
|
||||
(language (format "language-%s" (org-element-property :language src-block)))
|
||||
(code (org-element-property :value src-block)))
|
||||
(esxml-to-xml
|
||||
`(pre ()
|
||||
(code ((class . ,language))
|
||||
,(org-html-encode-plain-text code)
|
||||
))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(org-export-define-derived-backend 'my-html 'html
|
||||
:translate-alist '(
|
||||
(template . my/template)
|
||||
(src-block . my/src-block)
|
||||
))
|
||||
|
||||
</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-orge91c35a" class="outline-3">
|
||||
<h3 id="orge91c35a">Plug Prism.js</h3>
|
||||
<div class="outline-text-3" id="text-orge91c35a">
|
||||
<pre><code class="language-lisp">(defun my/org-has-src-blocks-p (info)
|
||||
"Return t if the Org document represented by INFO has source code blocks."
|
||||
(org-element-map (plist-get info :parse-tree) 'src-block
|
||||
(lambda (src-block) t)
|
||||
nil t))
|
||||
|
||||
(defun my/template (contents info)
|
||||
|
||||
(let* ((title-str (org-export-data (plist-get info :title) info))
|
||||
...
|
||||
(has-src-blocks (my/org-has-src-blocks-p info)))
|
||||
...
|
||||
|
||||
(script ((defer . "true") (src . "https://umami.dokutsu.xyz/script.js") (data-website-id . "d52d9af1-0c7d-4531-84c6-0b9c2850011f")) ())
|
||||
,(when has-src-blocks
|
||||
`(nil ()
|
||||
(link ((id . "prism-theme") (rel . "stylesheet") (type . "text/css")))
|
||||
(link ((rel . "stylesheet") (type . "text/css") (href . "/resources/css/quirks.css")))
|
||||
(script ((src . "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js")) ())
|
||||
(script ((src . "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js")) ())
|
||||
(script ((src . "/resources/js/theme-selector.js")) ())
|
||||
))
|
||||
(title () ,title-str)
|
||||
|
||||
</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-orgbaa05e2" class="outline-3">
|
||||
<h3 id="orgbaa05e2">Respect prefers-color-scheme</h3>
|
||||
<div class="outline-text-3" id="text-orgbaa05e2">
|
||||
<pre><code class="language-javascript">function setPrismTheme() {
|
||||
const prismThemeLink = document.getElementById("prism-theme");
|
||||
const darkTheme =
|
||||
"https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css";
|
||||
const lightTheme =
|
||||
"https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-solarizedlight.min.css";
|
||||
if (
|
||||
window.matchMedia &amp;&amp;
|
||||
window.matchMedia("(prefers-color-scheme: dark)").matches
|
||||
) {
|
||||
prismThemeLink.href = darkTheme;
|
||||
} else {
|
||||
prismThemeLink.href = lightTheme;
|
||||
}
|
||||
}
|
||||
|
||||
// Initial theme set
|
||||
setPrismTheme();
|
||||
|
||||
// Listen for changes in the preferred color scheme
|
||||
window
|
||||
.matchMedia("(prefers-color-scheme: dark)")
|
||||
.addEventListener("change", setPrismTheme);
|
||||
</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org8ecf679" class="outline-2">
|
||||
<h2 id="org8ecf679">Whole config</h2>
|
||||
<div class="outline-text-2" id="text-org8ecf679">
|
||||
<p>
|
||||
In between posts I've switched from <code>sxml</code> to <code>esxml</code> so here is the current config.
|
||||
</p>
|
||||
<pre><code class="language-lisp">;; Load the publishing system
|
||||
;; Configure environment
|
||||
;;
|
||||
(setq debug-on-error t)
|
||||
|
||||
(let ((default-directory (concat "~/.config/emacs/.local/straight/build-" emacs-version "/")))
|
||||
(normal-top-level-add-subdirs-to-load-path))
|
||||
|
||||
(add-to-list 'custom-theme-load-path
|
||||
(concat "~/.config/emacs/.local/straight/build-" emacs-version "/doom-themes"))
|
||||
(add-to-list 'custom-theme-load-path (concat "~/.config/emacs/.local/straight/build-" emacs-version "/base16-theme"))
|
||||
(add-to-list 'custom-theme-load-path (concat "~/.config/emacs/.local/straight/build-" emacs-version "/moe-theme"))
|
||||
|
||||
|
||||
(require 'xml)
|
||||
(require 'dom)
|
||||
(require 'ox-publish)
|
||||
(require 'ox-rss)
|
||||
(require 'org)
|
||||
(require 'esxml)
|
||||
;; (require 'esxml-html)
|
||||
|
||||
;;
|
||||
;;Variables
|
||||
;;
|
||||
(setq
|
||||
my/url "https://fidonode.me"
|
||||
my/web-export-path "./public"
|
||||
my/blog-src-path "./home/05 Blog"
|
||||
my/lang-substitution-map '(("elisp" . "lisp"))
|
||||
org-html-validation-link nil ;; Don't show validation link
|
||||
org-html-htmlize-output-type nil
|
||||
org-src-fontify-natively t)
|
||||
|
||||
;;
|
||||
;;Templates
|
||||
;;
|
||||
(defun my/footer (info)
|
||||
`(footer ((class . "footer"))
|
||||
(hr () )
|
||||
(small ()
|
||||
(p () "Alex Mikhailov")
|
||||
(p () "Built with: "
|
||||
(a ((href . "https://www.gnu.org/software/emacs/")) "GNU Emacs") " "
|
||||
(a ((href . "https://orgmode.org/")) "Org Mode") " "
|
||||
(a ((href . "https://picocss.com/")) "picocss")
|
||||
)
|
||||
)
|
||||
))
|
||||
|
||||
(defun my/header (info)
|
||||
(let ((title-str (org-export-data (plist-get info :title) info)))
|
||||
`(header ((class . "header"))
|
||||
(nav ()
|
||||
(ul ()
|
||||
(li ()
|
||||
(strong () ,title-str)))
|
||||
(ul ()
|
||||
(li () (a ((href . "/index.html")) "About"))
|
||||
(li () (a ((href . "/posts.html")) "Blog"))
|
||||
(li () (a ((href . "/rss.xml")) "RSS"))
|
||||
)
|
||||
))
|
||||
)
|
||||
)
|
||||
|
||||
(defun my/src-block (src-block contents info)
|
||||
"Translate SRC-BLOCK element into HTML.
|
||||
CONTENTS is nil. INFO is a plist holding contextual information."
|
||||
(let* (
|
||||
(language (format "language-%s" (org-element-property :language src-block)))
|
||||
(code (org-element-property :value src-block)))
|
||||
(esxml-to-xml
|
||||
`(pre ()
|
||||
(code ((class . ,language))
|
||||
,(org-html-encode-plain-text code)
|
||||
))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
(defun my/template (contents info)
|
||||
|
||||
(let* ((title-str (org-export-data (plist-get info :title) info))
|
||||
(description-str (org-export-data (plist-get info :description) info))
|
||||
(file-path-str (org-export-data (plist-get info :input-file) info))
|
||||
(base-directory-str (org-export-data (plist-get info :base-directory) info))
|
||||
(file-name-str (file-relative-name file-path-str (format "%s/%s" script-directory base-directory-str)))
|
||||
(img-link-str (format "%s/resources/images/%s.png" my/url file-name-str))
|
||||
(has-src-blocks (my/org-has-src-blocks-p info)))
|
||||
|
||||
(set-text-properties 0 (length title-str) nil title-str)
|
||||
(set-text-properties 0 (length description-str) nil description-str)
|
||||
(set-text-properties 0 (length img-link-str) nil img-link-str)
|
||||
|
||||
(concat
|
||||
"&lt;!DOCTYPE html&gt;"
|
||||
(esxml-to-xml
|
||||
`(html ((lang . "en"))
|
||||
(head ()
|
||||
(meta ((charset . "utf-8")))
|
||||
(meta ((author . "Alex Mikhailov")))
|
||||
(meta ((name . "viewport")
|
||||
(content . "width=device-width, initial-scale=1, shrink-to-fit=no")))
|
||||
(meta ((name . "color-scheme") (content . "light dark")))
|
||||
(meta ((http-equiv . "content-language") (content . "en-us")))
|
||||
;; OG block
|
||||
;; "Personal page with a blog about my technical adventures"
|
||||
(meta ((name . "description") (content . ,description-str)))
|
||||
(meta ((name . "og:description") (content . ,description-str)))
|
||||
(meta ((name . "twitter:description") (content . ,description-str)))
|
||||
|
||||
(meta ((name . "og:image") (content . ,img-link-str)))
|
||||
(meta ((name . "twitter:image") (content . ,img-link-str)))
|
||||
|
||||
(meta ((name . "og:title") (content . ,title-str)))
|
||||
(meta ((name . "twitter:title") (content . ,title-str)))
|
||||
|
||||
(meta ((name . "twitter:card") (content . "summary_large_image")))
|
||||
|
||||
(link ((rel . "icon") (type . "image/x-icon") (href . "/resources/favicon.ico")))
|
||||
(link ((rel . "stylesheet") (type . "text/css") (href . "/resources/css/pico.sand.min.css")))
|
||||
(script ((defer . "true") (src . "https://umami.dokutsu.xyz/script.js") (data-website-id . "d52d9af1-0c7d-4531-84c6-0b9c2850011f")) ())
|
||||
,(when has-src-blocks
|
||||
`(nil ()
|
||||
(link ((id . "prism-theme") (rel . "stylesheet") (type . "text/css")))
|
||||
(link ((rel . "stylesheet") (type . "text/css") (href . "/resources/css/quirks.css")))
|
||||
(script ((src . "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js")) ())
|
||||
(script ((src . "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js")) ())
|
||||
(script ((src . "/resources/js/theme-selector.js")) ())
|
||||
)
|
||||
)
|
||||
(title () ,title-str)
|
||||
)
|
||||
(body ((class . "line-numbers"))
|
||||
(main ((class . "container"))
|
||||
,(my/header info)
|
||||
(raw-string ,contents)
|
||||
,(my/footer info)
|
||||
)
|
||||
))
|
||||
))
|
||||
))
|
||||
|
||||
|
||||
(org-export-define-derived-backend 'my-html 'html
|
||||
:translate-alist '(
|
||||
(template . my/template)
|
||||
(src-block . my/src-block)
|
||||
))
|
||||
|
||||
(defun my/publish-to-html (plist filename pub-dir)
|
||||
"Publish an Org file to HTML using the custom backend."
|
||||
(org-publish-org-to 'my-html filename ".html" plist pub-dir))
|
||||
;;
|
||||
;;Sitemap/RSS
|
||||
;;
|
||||
(defun my/format-rss-feed-entry (entry style project)
|
||||
"Format ENTRY for the RSS feed.
|
||||
ENTRY is a file name. STYLE is either 'list' or 'tree'.
|
||||
PROJECT is the current project."
|
||||
(cond ((not (directory-name-p entry))
|
||||
(let* ((file (org-publish--expand-file-name entry project))
|
||||
(title (org-publish-find-title entry project))
|
||||
(date (format-time-string "%Y-%m-%d" (org-publish-find-date entry project)))
|
||||
(link (concat (file-name-sans-extension entry) ".html")))
|
||||
(with-temp-buffer
|
||||
(org-mode)
|
||||
(insert (format "* [[file:%s][%s]]\n" file title))
|
||||
(org-set-property "RSS_PERMALINK" link)
|
||||
(org-set-property "RSS_TITLE" title)
|
||||
(org-set-property "PUBDATE" date)
|
||||
(let ((first-two-lines (with-temp-buffer
|
||||
(insert-file-contents file)
|
||||
(buffer-substring-no-properties
|
||||
(point-min)
|
||||
(progn (forward-line 2) (point))))))
|
||||
(if (string-suffix-p "\n" first-two-lines)
|
||||
(setq first-two-lines (substring first-two-lines 0 -1)))
|
||||
(insert first-two-lines))
|
||||
(goto-char (point-max))
|
||||
(insert "...")
|
||||
(buffer-string))))
|
||||
((eq style 'tree)
|
||||
;; Return only last subdir.
|
||||
(file-name-nondirectory (directory-file-name entry)))
|
||||
(t entry)))
|
||||
|
||||
(defun my/format-rss-feed (title list)
|
||||
"Generate RSS feed, as a string.
|
||||
TITLE is the title of the RSS feed. LIST is an internal
|
||||
representation for the files to include, as returned by
|
||||
`org-list-to-lisp'. PROJECT is the current project."
|
||||
(concat "#+TITLE: " title "\n"
|
||||
"#+STARTUP: showall \n\n"
|
||||
(org-list-to-subtree list 1 '(:icount "" :istart ""))))
|
||||
|
||||
(defun my/publish-to-rss (plist filename pub-dir)
|
||||
"Publish RSS with PLIST, only when FILENAME is 'rss.org'.
|
||||
PUB-DIR is when the output will be placed."
|
||||
(if (equal "rss.org" (file-name-nondirectory filename))
|
||||
(org-rss-publish-to-rss plist filename pub-dir)))
|
||||
|
||||
;;
|
||||
;;Helpers
|
||||
;;
|
||||
(defun my/format-date-subtitle (file project)
|
||||
"Format the date found in FILE of PROJECT."
|
||||
(format-time-string "posted on %Y-%m-%d" (org-publish-find-date file project)))
|
||||
|
||||
(defun my/pt (var)
|
||||
"Print the value and type of VAR."
|
||||
(message "Value: %S, Type: %s" var (type-of var)))
|
||||
|
||||
(defun plist-keys (plist)
|
||||
"Return a list of keys in the property list PLIST."
|
||||
(let (keys)
|
||||
(while plist
|
||||
(setq keys (cons (car plist) keys))
|
||||
(setq plist (cddr plist)))
|
||||
(nreverse keys)))
|
||||
|
||||
(defvar script-directory
|
||||
(file-name-directory (or load-file-name buffer-file-name))
|
||||
"The directory where the current script is located.")
|
||||
|
||||
(defun my/org-has-src-blocks-p (info)
|
||||
"Return t if the Org document represented by INFO has source code blocks."
|
||||
(org-element-map (plist-get info :parse-tree) 'src-block
|
||||
(lambda (src-block) t)
|
||||
nil t))
|
||||
|
||||
(defun my/replace-substrings (input-string)
|
||||
"Replace substrings in INPUT-STRING according to SUBSTITUTION-MAP."
|
||||
(let ((output-string input-string))
|
||||
(dolist (pair my/lang-substitution-map)
|
||||
(let ((old (regexp-quote (car pair)))
|
||||
(new (cdr pair)))
|
||||
(setq output-string (replace-regexp-in-string old new output-string))))
|
||||
output-string))
|
||||
|
||||
;;
|
||||
;;Clear folder with results
|
||||
;;
|
||||
(when (file-directory-p my/web-export-path)
|
||||
(delete-directory my/web-export-path t))
|
||||
(mkdir my/web-export-path)
|
||||
|
||||
|
||||
;;
|
||||
;;Main blog configuration
|
||||
;;
|
||||
(setq org-publish-project-alist
|
||||
(list
|
||||
(list "static"
|
||||
:base-directory my/blog-src-path
|
||||
:base-extension "css\\|js\\|png\\|jpg\\|jpeg\\|gif\\|pdf\\|ico\\|txt"
|
||||
:publishing-directory my/web-export-path
|
||||
:recursive t
|
||||
:publishing-function 'org-publish-attachment
|
||||
)
|
||||
(list "blog"
|
||||
:recursive t
|
||||
:base-directory my/blog-src-path
|
||||
:publishing-directory my/web-export-path
|
||||
:publishing-function 'my/publish-to-html
|
||||
:html-html5-fancy t
|
||||
:htmlized-source t
|
||||
:with-author nil
|
||||
:with-creator t
|
||||
:with-toc t
|
||||
:section-numbers nil
|
||||
:time-stamp-file nil
|
||||
)
|
||||
(list "blog-rss"
|
||||
:author "Alex M"
|
||||
:email "iam@fidonode.me"
|
||||
:base-directory my/blog-src-path
|
||||
:base-extension "org"
|
||||
:recursive t
|
||||
:exclude (regexp-opt '("rss.org" "index.org" "404.org" "posts.org"))
|
||||
:publishing-function 'my/publish-to-rss
|
||||
:publishing-directory my/web-export-path
|
||||
:rss-extension "xml"
|
||||
:html-link-home my/url
|
||||
:html-link-use-abs-url t
|
||||
:html-link-org-files-as-html t
|
||||
:auto-sitemap t
|
||||
:sitemap-filename "rss.org"
|
||||
:sitemap-title "rss"
|
||||
:sitemap-style 'list
|
||||
:sitemap-sort-files 'anti-chronologically
|
||||
:sitemap-function 'my/format-rss-feed
|
||||
:sitemap-format-entry 'my/format-rss-feed-entry)
|
||||
))
|
||||
|
||||
|
||||
;; Generate the site output
|
||||
(org-publish-all t)
|
||||
|
||||
(message "Build complete!")
|
||||
</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="footer"><hr/><small><p>Alex Mikhailov</p><p>Built with: <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a> <a href="https://orgmode.org/">Org Mode</a> <a href="https://picocss.com/">picocss</a></p></small></footer></main></body></html>
|
120
posts/keeb.html
120
posts/keeb.html
@ -1,52 +1,52 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content="Blog post about my keyboards"/><meta name="og:description" content="Blog post about my keyboards"/><meta name="twitter:description" content="Blog post about my keyboards"/><meta name="og:image" content="https://fidonode.me/resources/images/posts/keeb.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/posts/keeb.org.png"/><meta name="og:title" content="My keyboard journey"/><meta name="twitter:title" content="My keyboard journey"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><nil><link id="prism-theme" rel="stylesheet" type="text/css"/><link rel="stylesheet" type="text/css" href="/resources/css/quirks.css"/><script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script><script src="/resources/js/theme-selector.js"></script></nil><title>My keyboard journey</title></head><body class="line-numbers"><main class="container"><header class="header"><nav><ul><li><strong>My keyboard journey</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header><div id="table-of-contents">
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content="Blog post about my keyboards"/><meta name="og:description" content="Blog post about my keyboards"/><meta name="twitter:description" content="Blog post about my keyboards"/><meta name="og:image" content="https://fidonode.me/resources/images/posts/keeb.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/posts/keeb.org.png"/><meta name="og:title" content="My keyboard journey"/><meta name="twitter:title" content="My keyboard journey"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><nil><link id="highlight-theme" rel="stylesheet" type="text/css"/><script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script><script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/languages/bash.min.js"></script><script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/languages/lisp.min.js"></script><script src="/resources/js/theme-selector.js"></script></nil><title>My keyboard journey</title></head><body><main class="container"><header class="header"><nav><ul><li><strong>My keyboard journey</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header><div id="table-of-contents">
|
||||
<h2>Table of Contents</h2>
|
||||
<div id="text-table-of-contents">
|
||||
<ul>
|
||||
<li><a href="#org2c41a4d">My end-game (at least I hope) keyboard</a>
|
||||
<li><a href="#org363efa0">My end-game (at least I hope) keyboard</a>
|
||||
<ul>
|
||||
<li><a href="#org9590381">Keebs path</a>
|
||||
<li><a href="#orga2e3fd5">Keebs path</a>
|
||||
<ul>
|
||||
<li><a href="#orgbe413a6">Dactyl manuform</a></li>
|
||||
<li><a href="#org0c65466">Moonlander</a></li>
|
||||
<li><a href="#org133c171">Custom Corne</a></li>
|
||||
<li><a href="#org60aa35e">Dactyl manuform again</a></li>
|
||||
<li><a href="#org259f8e1">Dactyl manuform</a></li>
|
||||
<li><a href="#orga9435a6">Moonlander</a></li>
|
||||
<li><a href="#org9ad3f10">Custom Corne</a></li>
|
||||
<li><a href="#orgd5e5379">Dactyl manuform again</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#org236ad6f">Hardware</a>
|
||||
<li><a href="#org8ca9de5">Hardware</a>
|
||||
<ul>
|
||||
<li><a href="#org233248f">Body</a></li>
|
||||
<li><a href="#org3d3b451">Switches and caps</a></li>
|
||||
<li><a href="#orgda06c6f">Controllers</a></li>
|
||||
<li><a href="#orgb9c0198">Amoeba things</a></li>
|
||||
<li><a href="#org5ca837a">Body</a></li>
|
||||
<li><a href="#org50e00b1">Switches and caps</a></li>
|
||||
<li><a href="#orgd06a670">Controllers</a></li>
|
||||
<li><a href="#orgd52b819">Amoeba things</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#orgc45235f">Software</a>
|
||||
<li><a href="#org6464402">Software</a>
|
||||
<ul>
|
||||
<li><a href="#org207f6c0">Plain default - QMK</a></li>
|
||||
<li><a href="#orgdc190aa">Make own layout</a></li>
|
||||
<li><a href="#org50cce65">Plain default - QMK</a></li>
|
||||
<li><a href="#orgc590b38">Make own layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#org96d97a1">Whats next?</a></li>
|
||||
<li><a href="#org797c5e5">Whats next?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org2c41a4d" class="outline-2">
|
||||
<h2 id="org2c41a4d">My end-game (at least I hope) keyboard</h2>
|
||||
<div class="outline-text-2" id="text-org2c41a4d">
|
||||
<div id="outline-container-org363efa0" class="outline-2">
|
||||
<h2 id="org363efa0">My end-game (at least I hope) keyboard</h2>
|
||||
<div class="outline-text-2" id="text-org363efa0">
|
||||
</div>
|
||||
<div id="outline-container-org9590381" class="outline-3">
|
||||
<h3 id="org9590381">Keebs path</h3>
|
||||
<div class="outline-text-3" id="text-org9590381">
|
||||
<div id="outline-container-orga2e3fd5" class="outline-3">
|
||||
<h3 id="orga2e3fd5">Keebs path</h3>
|
||||
<div class="outline-text-3" id="text-orga2e3fd5">
|
||||
<p>
|
||||
Sometimes I think about the long journey I've made with keebs. In childhood, I had decent membrane keyboards, most of which had an ergonomic profile like the MS. Not sure if it somehow affected my taste because I started my career with the simplest, cheapest board and typed countless lines of code on such keebs. Then I heard about clickity-clack mechanical keyboards and decided to try one. It was a simple Chinese keeb with a thick metal body, double-shot caps, and Cherry Brown switches. A decent thing to annoy everyone around you. I think this purchase marked my dive into mech keebs
|
||||
I'm not a geeky aficionado who thinks you can fix everything with a new keyboard, but I built a couple of them. I hope I've finally built the last one for quite some time.
|
||||
</p>
|
||||
</div>
|
||||
<div id="outline-container-orgbe413a6" class="outline-4">
|
||||
<h4 id="orgbe413a6">Dactyl manuform</h4>
|
||||
<div class="outline-text-4" id="text-orgbe413a6">
|
||||
<div id="outline-container-org259f8e1" class="outline-4">
|
||||
<h4 id="org259f8e1">Dactyl manuform</h4>
|
||||
<div class="outline-text-4" id="text-org259f8e1">
|
||||
<p>
|
||||
Almost all of the time, I struggle with my maximalism. So I decided to build the ultimate mechanical ergonomic split keyboard and chose the Dactyl Manuform. Sounds like a crazy idea. Zero experience with QMK, zero experience with hand-wired keyboards, and zero experience in 3D printing.
|
||||
The last problem was the easiest one; I just asked my friend to print the bodies from PETG polymer, and Bob's your uncle. I got two pieces of rough-layered plastic with all the support structures. God, it was a nightmare to clean these prints from supports and small artifacts, but I was happy.
|
||||
@ -92,9 +92,9 @@ To be honest, this keeb was ugly, and I decided that I wanted a beautiful factor
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org0c65466" class="outline-4">
|
||||
<h4 id="org0c65466">Moonlander</h4>
|
||||
<div class="outline-text-4" id="text-org0c65466">
|
||||
<div id="outline-container-orga9435a6" class="outline-4">
|
||||
<h4 id="orga9435a6">Moonlander</h4>
|
||||
<div class="outline-text-4" id="text-orga9435a6">
|
||||
<p>
|
||||
Nothing special. Ordered, paid, got it, tried it. Everything worked. Looked good. Happy year of typing. Bored. Annoyed. Too big and chunky. No concave. Quality not the best. Started planning the next one.
|
||||
</p>
|
||||
@ -107,9 +107,9 @@ Nothing special. Ordered, paid, got it, tried it. Everything worked. Looked good
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org133c171" class="outline-4">
|
||||
<h4 id="org133c171">Custom Corne</h4>
|
||||
<div class="outline-text-4" id="text-org133c171">
|
||||
<div id="outline-container-org9ad3f10" class="outline-4">
|
||||
<h4 id="org9ad3f10">Custom Corne</h4>
|
||||
<div class="outline-text-4" id="text-org9ad3f10">
|
||||
<p>
|
||||
This journey started with discovering the Jian keyboard. It is a niche keeb from the Ru community focused on full support of the whole Russian layout. It was originally created by KGOH. I missed the group buy and decided that I could easily patch a Corne board with two additional keys to mimic the Jian.
|
||||
Interesting journey. I learned how to use KiCad, and how to export gerbers.
|
||||
@ -158,9 +158,9 @@ Daily driver for ~6 months. Then the world changed, and I decided to leave my ho
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org60aa35e" class="outline-4">
|
||||
<h4 id="org60aa35e">Dactyl manuform again</h4>
|
||||
<div class="outline-text-4" id="text-org60aa35e">
|
||||
<div id="outline-container-orgd5e5379" class="outline-4">
|
||||
<h4 id="orgd5e5379">Dactyl manuform again</h4>
|
||||
<div class="outline-text-4" id="text-orgd5e5379">
|
||||
<p>
|
||||
Two years late I've settled down in new country and decide that I want to bring back my dactyl manuform experience.
|
||||
</p>
|
||||
@ -174,13 +174,13 @@ Two years late I've settled down in new country and decide that I want to bring
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org236ad6f" class="outline-3">
|
||||
<h3 id="org236ad6f">Hardware</h3>
|
||||
<div class="outline-text-3" id="text-org236ad6f">
|
||||
<div id="outline-container-org8ca9de5" class="outline-3">
|
||||
<h3 id="org8ca9de5">Hardware</h3>
|
||||
<div class="outline-text-3" id="text-org8ca9de5">
|
||||
</div>
|
||||
<div id="outline-container-org233248f" class="outline-4">
|
||||
<h4 id="org233248f">Body</h4>
|
||||
<div class="outline-text-4" id="text-org233248f">
|
||||
<div id="outline-container-org5ca837a" class="outline-4">
|
||||
<h4 id="org5ca837a">Body</h4>
|
||||
<div class="outline-text-4" id="text-org5ca837a">
|
||||
<p>
|
||||
I've choose to use a <a href="https://ryanis.cool/dactyl/#manuform">Ryan's generator</a> and generate body on top of Corne preset with all keys in last row and disabled stagger for the last two columns. <a href="https://ryanis.cool/dactyl/#manuform:CiUIBhAEGgp0aHJlZS1taW5pIgRmdWxsKgNib3gyBm5vcm1pZTgAGgoIARIEbm9uZRgAIhdVAACAQBgAIABdAADgQGUAAEBAQABIADL5AZUDAAAgQJ0DAACAP4ADAIgDAA0AAAAAFQAAAAAdMzMzQCUAANDALQAAUME1AADAQD0AAAAARQAAAABNAADAQFUAAEDAXQAA4EBlMzNhwm0zMy3CdQAAvMF45wKAAc0YiAHIJJUBMzMXwp0BMzNdwqUBZmbKwagBnwuwAZkXuAH8JcUBAABQws0BAADQwdUBAABAwdgBnATgAfMX6AGQHPUBAADowf0BAAAkwoUCAABQwYgCmwSQAvMXmALgIaUCAAAMwq0CAABwwbUCAAAAwLgChAfAApUQyAKEB9UCAABAwd0CAACAweUCAABAQOgChAfwApUQ+AKEBw==">Generator preset</a>
|
||||
The body was printed by JLC3DP (JLCPCB printing department). I've choose <a href="https://jlc3dp.com/help/article/502-Precimid-1172-Pro">SLS from nylon</a>. Print has minor artifacts; I expected better quality.
|
||||
@ -216,9 +216,9 @@ Overall, I'm happy with results. I also printed bottom plates and <a href="https
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org3d3b451" class="outline-4">
|
||||
<h4 id="org3d3b451">Switches and caps</h4>
|
||||
<div class="outline-text-4" id="text-org3d3b451">
|
||||
<div id="outline-container-org50e00b1" class="outline-4">
|
||||
<h4 id="org50e00b1">Switches and caps</h4>
|
||||
<div class="outline-text-4" id="text-org50e00b1">
|
||||
<p>
|
||||
I've chosen Kailh BOX Navy switches. I really like the clickity-clack sound. They have a dedicated clickbar to produce this sound, and the box profile helps with moving down perpendicularly.
|
||||
</p>
|
||||
@ -234,9 +234,9 @@ The caps are inherited from the Moonlander. They are thick, double-shot caps wit
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-orgda06c6f" class="outline-4">
|
||||
<h4 id="orgda06c6f">Controllers</h4>
|
||||
<div class="outline-text-4" id="text-orgda06c6f">
|
||||
<div id="outline-container-orgd06a670" class="outline-4">
|
||||
<h4 id="orgd06a670">Controllers</h4>
|
||||
<div class="outline-text-4" id="text-orgd06a670">
|
||||
<p>
|
||||
I used a bootleg Pro Micro called Tenstar Robot, based on the ATmega32u4. It's perfectly supported by QMK, pin-to-pin and size-compatible with the Pro Micro.
|
||||
</p>
|
||||
@ -249,9 +249,9 @@ I used a bootleg Pro Micro called Tenstar Robot, based on the ATmega32u4. It's p
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-orgb9c0198" class="outline-4">
|
||||
<h4 id="orgb9c0198">Amoeba things</h4>
|
||||
<div class="outline-text-4" id="text-orgb9c0198">
|
||||
<div id="outline-container-orgd52b819" class="outline-4">
|
||||
<h4 id="orgd52b819">Amoeba things</h4>
|
||||
<div class="outline-text-4" id="text-orgd52b819">
|
||||
<p>
|
||||
During this build, I decided that I did not want to make a big mess of wires and chose Amoeba single-switch PCBs.
|
||||
</p>
|
||||
@ -281,13 +281,13 @@ They are nice, have diodes on board, and simplify wiring. However, they have the
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-orgc45235f" class="outline-3">
|
||||
<h3 id="orgc45235f">Software</h3>
|
||||
<div class="outline-text-3" id="text-orgc45235f">
|
||||
<div id="outline-container-org6464402" class="outline-3">
|
||||
<h3 id="org6464402">Software</h3>
|
||||
<div class="outline-text-3" id="text-org6464402">
|
||||
</div>
|
||||
<div id="outline-container-org207f6c0" class="outline-4">
|
||||
<h4 id="org207f6c0">Plain default - QMK</h4>
|
||||
<div class="outline-text-4" id="text-org207f6c0">
|
||||
<div id="outline-container-org50cce65" class="outline-4">
|
||||
<h4 id="org50cce65">Plain default - QMK</h4>
|
||||
<div class="outline-text-4" id="text-org50cce65">
|
||||
<p>
|
||||
Prerequiremets:
|
||||
<a href="https://docs.qmk.fm/cli">QMK CLI</a>
|
||||
@ -309,9 +309,9 @@ You may want to create a separate keyboard entry in QMK.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-orgdc190aa" class="outline-4">
|
||||
<h4 id="orgdc190aa">Make own layout</h4>
|
||||
<div class="outline-text-4" id="text-orgdc190aa">
|
||||
<div id="outline-container-orgc590b38" class="outline-4">
|
||||
<h4 id="orgc590b38">Make own layout</h4>
|
||||
<div class="outline-text-4" id="text-orgc590b38">
|
||||
<p>
|
||||
I'll try to go through setting of my personal layout. It is based on <a href="http://www.keyboard-layout-editor.com/#/gists/4b6c2af67148f58ddd6c6b2976c4370f">Jian layout</a>.
|
||||
</p>
|
||||
@ -468,8 +468,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org96d97a1" class="outline-3">
|
||||
<h3 id="org96d97a1">Whats next?</h3>
|
||||
<div id="outline-container-org797c5e5" class="outline-3">
|
||||
<h3 id="org797c5e5">Whats next?</h3>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="footer"><hr/><small><p>Alex Mikhailov</p><p>Built with: <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a> <a href="https://orgmode.org/">Org Mode</a> <a href="https://picocss.com/">picocss</a></p></small></footer></main></body></html>
|
||||
|
@ -1,24 +1,26 @@
|
||||
hljs.highlightAll(); // Initialize highlight.js
|
||||
|
||||
// Function to set the theme based on the preferred color scheme
|
||||
function setPrismTheme() {
|
||||
const prismThemeLink = document.getElementById("prism-theme");
|
||||
function setHighlightTheme() {
|
||||
const highlightThemeLink = document.getElementById("highlight-theme");
|
||||
const darkTheme =
|
||||
"https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css";
|
||||
"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/base16/solarized-dark.min.css";
|
||||
const lightTheme =
|
||||
"https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-solarizedlight.min.css";
|
||||
"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/base16/solarized-light.min.css";
|
||||
if (
|
||||
window.matchMedia &&
|
||||
window.matchMedia("(prefers-color-scheme: dark)").matches
|
||||
) {
|
||||
prismThemeLink.href = darkTheme;
|
||||
highlightThemeLink.href = darkTheme;
|
||||
} else {
|
||||
prismThemeLink.href = lightTheme;
|
||||
highlightThemeLink.href = lightTheme;
|
||||
}
|
||||
}
|
||||
|
||||
// Initial theme set
|
||||
setPrismTheme();
|
||||
setHighlightTheme();
|
||||
|
||||
// Listen for changes in the preferred color scheme
|
||||
window
|
||||
.matchMedia("(prefers-color-scheme: dark)")
|
||||
.addEventListener("change", setPrismTheme);
|
||||
.addEventListener("change", setHighlightTheme);
|
||||
|
32
rss.html
32
rss.html
@ -1,27 +1,33 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content=""/><meta name="og:description" content=""/><meta name="twitter:description" content=""/><meta name="og:image" content="https://fidonode.me/resources/images/rss.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/rss.org.png"/><meta name="og:title" content="rss"/><meta name="twitter:title" content="rss"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><title>rss</title></head><body class="line-numbers"><main class="container"><header class="header"><nav><ul><li><strong>rss</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header><div id="table-of-contents">
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta author="Alex Mikhailov"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="color-scheme" content="light dark"/><meta http-equiv="content-language" content="en-us"/><meta name="description" content=""/><meta name="og:description" content=""/><meta name="twitter:description" content=""/><meta name="og:image" content="https://fidonode.me/resources/images/rss.org.png"/><meta name="twitter:image" content="https://fidonode.me/resources/images/rss.org.png"/><meta name="og:title" content="rss"/><meta name="twitter:title" content="rss"/><meta name="twitter:card" content="summary_large_image"/><link rel="icon" type="image/x-icon" href="/resources/favicon.ico"/><link rel="stylesheet" type="text/css" href="/resources/css/pico.sand.min.css"/><script defer="true" src="https://umami.dokutsu.xyz/script.js" data-website-id="d52d9af1-0c7d-4531-84c6-0b9c2850011f"></script><title>rss</title></head><body><main class="container"><header class="header"><nav><ul><li><strong>rss</strong></li></ul><ul><li><a href="/index.html">About</a></li><li><a href="/posts.html">Blog</a></li><li><a href="/rss.xml">RSS</a></li></ul></nav></header><div id="table-of-contents">
|
||||
<h2>Table of Contents</h2>
|
||||
<div id="text-table-of-contents">
|
||||
<ul>
|
||||
<li><a href="#org6bb06be">Org blog with RSS</a></li>
|
||||
<li><a href="#orgff1b4bd">Org to HTML and back</a></li>
|
||||
<li><a href="#org6f3b242">My keyboard journey</a></li>
|
||||
<li><a href="#org99e7f65">Improve code blocks</a></li>
|
||||
<li><a href="#orgb2026ff">Org blog with RSS</a></li>
|
||||
<li><a href="#org198dc21">Org to HTML and back</a></li>
|
||||
<li><a href="#orgd12072a">My keyboard journey</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org6bb06be" class="outline-2">
|
||||
<h2 id="org6bb06be"><a href="file:///home/fido-node/org/home/05 Blog/posts/add_rss_to_blog.html">Org blog with RSS</a></h2>
|
||||
<div class="outline-text-2" id="text-org6bb06be">
|
||||
<div id="outline-container-org99e7f65" class="outline-2">
|
||||
<h2 id="org99e7f65"><a href="file:///home/fido-node/org/home/05 Blog/posts/improve_code_blocks.html">Improve code blocks</a></h2>
|
||||
<div class="outline-text-2" id="text-org99e7f65">
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-orgff1b4bd" class="outline-2">
|
||||
<h2 id="orgff1b4bd"><a href="file:///home/fido-node/org/home/05 Blog/posts/about_blog.html">Org to HTML and back</a></h2>
|
||||
<div class="outline-text-2" id="text-orgff1b4bd">
|
||||
<div id="outline-container-orgb2026ff" class="outline-2">
|
||||
<h2 id="orgb2026ff"><a href="file:///home/fido-node/org/home/05 Blog/posts/add_rss_to_blog.html">Org blog with RSS</a></h2>
|
||||
<div class="outline-text-2" id="text-orgb2026ff">
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-org6f3b242" class="outline-2">
|
||||
<h2 id="org6f3b242"><a href="file:///home/fido-node/org/home/05 Blog/posts/keeb.html">My keyboard journey</a></h2>
|
||||
<div class="outline-text-2" id="text-org6f3b242">
|
||||
<div id="outline-container-org198dc21" class="outline-2">
|
||||
<h2 id="org198dc21"><a href="file:///home/fido-node/org/home/05 Blog/posts/about_blog.html">Org to HTML and back</a></h2>
|
||||
<div class="outline-text-2" id="text-org198dc21">
|
||||
</div>
|
||||
</div>
|
||||
<div id="outline-container-orgd12072a" class="outline-2">
|
||||
<h2 id="orgd12072a"><a href="file:///home/fido-node/org/home/05 Blog/posts/keeb.html">My keyboard journey</a></h2>
|
||||
<div class="outline-text-2" id="text-orgd12072a">
|
||||
</div>
|
||||
</div>
|
||||
<footer class="footer"><hr/><small><p>Alex Mikhailov</p><p>Built with: <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a> <a href="https://orgmode.org/">Org Mode</a> <a href="https://picocss.com/">picocss</a></p></small></footer></main></body></html>
|
||||
|
13
rss.xml
13
rss.xml
@ -14,8 +14,8 @@
|
||||
<link>https://fidonode.me</link>
|
||||
<description><![CDATA[]]></description>
|
||||
<language>en</language>
|
||||
<pubDate>Tue, 25 Jun 2024 12:07:59 +0000</pubDate>
|
||||
<lastBuildDate>Tue, 25 Jun 2024 12:07:59 +0000</lastBuildDate>
|
||||
<pubDate>Wed, 26 Jun 2024 04:55:56 +0000</pubDate>
|
||||
<lastBuildDate>Wed, 26 Jun 2024 04:55:56 +0000</lastBuildDate>
|
||||
<generator>Emacs 27.1 Org-mode 9.3</generator>
|
||||
<webMaster>iam@fidonode.me (Alex M)</webMaster>
|
||||
<image>
|
||||
@ -25,6 +25,15 @@
|
||||
</image>
|
||||
|
||||
|
||||
<item>
|
||||
<title>Improve code blocks</title>
|
||||
<link>https://fidonode.me/posts/improve_code_blocks.html</link>
|
||||
<author>iam@fidonode.me (Alex M)</author>
|
||||
<guid isPermaLink="false">https://fidonode.me/posts/improve_code_blocks.html</guid>
|
||||
<pubDate>Tue, 25 Jun 2024 00:00:00 +0000</pubDate>
|
||||
|
||||
<description><![CDATA[]]></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Org blog with RSS</title>
|
||||
<link>https://fidonode.me/posts/add_rss_to_blog.html</link>
|
||||
|
Loading…
Reference in New Issue
Block a user