compute the menu recursively; put it between title and content
authorRalf Jung <post@ralfj.de>
Tue, 6 Oct 2015 21:02:38 +0000 (23:02 +0200)
committerRalf Jung <post@ralfj.de>
Tue, 6 Oct 2015 21:02:38 +0000 (23:02 +0200)
_config.yml
_includes/menu-level.html [new file with mode: 0644]
_includes/menu.html [deleted file]
_layouts/default.html
projects/index.md [new file with mode: 0644]
style.css

index f091138..55fc117 100644 (file)
@@ -2,11 +2,19 @@
 title: ralfj.de
 url: "https://www.ralfj.de"
 
-struct:
+structure:
   - url: "/"
     title: "ralfj.de"
-  - url: "/blog"
-    title: "test"
+    structure:
+      - url: "projects/"
+        title: "Projects"
+        structure:
+          - url: "lilass/"
+            title: LiLaSS
+          - url: "schsh/"
+            title: schsh
+      - url: "cs/"
+        title: "Research"
 
 defaults:
   - scope:
diff --git a/_includes/menu-level.html b/_includes/menu-level.html
new file mode 100644 (file)
index 0000000..ae29931
--- /dev/null
@@ -0,0 +1,12 @@
+<ul>{% for item in include.menu %}<!--
+    {% comment %} We compute the full URL of this item, and truncate canonicalurl so that length so we can test whether it starts with it {% endcomment %}
+    {% assign cururl = item.url | prepend: include.base %}
+    {% assign isparent_search = canonicalurl | truncate: cururl.size, '' %}
+    {% capture class %}{% if cururl == canonicalurl %}current{% elsif include.above != true %}child{% elsif isparent_search == cururl %}parent{% else %}sibling{% endif %}{% endcapture %}
+    {% comment %} Now we can output the item and it substructure {% endcomment %}
+    --><li class="{{ class }}"><a href="{{ item.url | prepend: include.base }}">{{ item.title }}</a></li><!--
+    {% if item.structure and (class == "current" or class == "parent") %}
+        {% if cururl == canonicalurl %}{% assign above = false %}{% else %}{% assign above = true %}{% endif %}
+        -->{% include menu-level.html menu=item.structure base=cururl above=above %}<!--
+    {% endif %}
+-->{% endfor %}</ul>
diff --git a/_includes/menu.html b/_includes/menu.html
deleted file mode 100644 (file)
index 86eae4f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<div id="navi"><ul>
-    <li class="current"><a href="/">ralfj.de</a></li>
-    {% for item in site.struct %}
-        {{ item.url }}{{ item.title }}
-    {% endfor %}
-</ul></div>
index e19cd91..7db3ba6 100644 (file)
@@ -9,20 +9,24 @@
     {% if page.excerpt %}<meta name="description" content="{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}">{% endif %}
 
     <link rel="stylesheet" href="/style.css">
-    <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.url }}">
+    {% capture canonicalurl %}{{ page.url | replace:'index.html','' }}{% endcapture %}
+    <link rel="canonical" href="{{ canonicalurl | prepend: site.url }}">
     {% if page.rss or page.layout == 'post' %}<link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.url }}" />{% endif %}
   </head>
 
 
   <body><div id="frame">
+  
+    <div id="title">
+      <h1>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</h1>
+    </div>
 
-    {% include menu.html %}
+    <div id="navi">
+        {% include menu-level.html menu=site.structure base="" above=true %}
+    </div>
 
-    <div id="page">
-        <h1>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</h1>
-        <div id="content">
-            {{ content }}
-        </div>
+    <div id="content">
+        {{ content }}
     </div>
 
   </div></body>
diff --git a/projects/index.md b/projects/index.md
new file mode 100644 (file)
index 0000000..7467d3c
--- /dev/null
@@ -0,0 +1,26 @@
+---
+ttle: Projects
+---
+
+This page lists some of the tools I wrote, mostly for my own purposes:
+To solve some issue I was having, or to facilitate my daily computer usage.
+The tools were usually not written with general reusability in mind.
+But maybe you are having just the same problem as I did, in which case I hope they can be helpful.
+
+* `LiLaSS <lilass/>`_: A simple xrandr-based application to configure laptop screens on Linux. If you are using a
+  Laptop, frequently work both with and without an external screen, and you are not happy with
+  the configuration options your desktop provides, this may be for you.
+* `dyn-nsupdate <dyn-nsupdate/>`_: A tool to dynamically and securely update DNS zones via CGI.
+  This provides self-hosted DynDNS services.
+* `zonemaker <zonemaker/>`_: A small script to generate DNS zone files from Python.
+* `schsh <schsh/>`_: A collection of scripts and configuration files which can be used to grant
+  someone secure (SSH-based) access to a machine, without giving them a shell or read access
+  to the entire file system.
+* `Rust-101 <rust-101/>`_: A small tutorial for the `Rust language <http://www.rust-lang.org>`_.
+* `git-mirror <git-mirror/>`_: This can keep multiple git repositories of the same project in sync automatically.
+
+For some more of my projects, check out the `public git repositories`_ hosted on my server and the
+`Debian packages`_ I am maintaining as DM.
+
+.. _public git repositories: https://www.ralfj.de/git/
+.. _Debian packages: http://qa.debian.org/developer.php?login=post%40ralfj.de
index be1c63c..d13bd3a 100644 (file)
--- a/style.css
+++ b/style.css
@@ -39,22 +39,32 @@ body {
     margin: 0 auto;
     max-width: calc(50em + 2*11em); /* content width plus 2*navi width */
 }
-#page {
+
+/* The inner box */
+#title, #content {
     border: solid #121212 1px;
     background-color: #252525;
     margin: 0 11.0em; /* navi width */
-    border-radius: 10px;
     padding: 0;
 }
-#page h1 {
+#title {
+    border-bottom: none;
+    border-radius: 10px 10px 0px 0px;
+}
+#title h1 {
     border-bottom: solid #08f 2px;
     text-align: center;
     padding: 0 0.7em;
+    margin-bottom: 0;
 }
 #content {
+    border-top: none;
+    border-radius: 0px 0px 10px 10px;
     display: block;
-    margin: 0.7em;
+    padding: 0.7em;
+    padding-top: 1px; /* If we use 0 here, things get ugly. What?!? */
 }
+
 /* Navigation menu */
 #navi {
     /* No border, no padding, so all the width computations become easy. */
@@ -63,7 +73,6 @@ body {
     width: 11.0em; /* navi width */
     padding: 0;
     margin: 0;
-    margin-top:2.7em;
 }
 #navi ul {
     margin: 0px;
@@ -76,7 +85,7 @@ body {
 }
 #navi li {
     /* Border around the links */
-    margin-top:0.1em;
+    margin-bottom:0.1em;
     background-color: #252525;
     border-left: solid #36ff00 2px;
     border-right: solid #36ff00 2px;
@@ -103,33 +112,33 @@ body {
 #navi li:hover a {
     color: #DDD;
 }
+
 /* Small screens */
 @media screen and (max-width:60em) {
-    #frame, #page, #navi {
+    #frame, #title, #content, #navi {
         margin: 0;
         width: auto;
         max-width: none;
         clear: both;
     }
-    #page {
-        /* the navi will be added above this */
-        border-top-left-radius: 0;
-        border-top-right-radius: 0;
-    }
     #navi {
         /* Place navi above the title */
         float: none;
-        border-top-left-radius: 10px;
-        border-top-right-radius: 10px;
-        border-bottom: solid #36ff00 2px;
+        border: solid #121212 1px;
+        border-bottom: none;
         background-color: #252525;
-        padding: 0.7em;
+        padding: 0;
     }
     #navi ul, #navi ul ul, #navi li, #navi li a {
         margin: 0;
         padding: 0;
         display: inline;
     }
+    #navi > ul {
+        padding: 0.3em;
+        display: block;
+        border-bottom: solid #36ff00 2px;
+    }
     /* Display only parent and children, and deocare them appropriately */
     #navi li {
         display:inline-block;
@@ -154,15 +163,17 @@ body {
         text-decoration: underline;
     }
 }
+
 /* Printing */
 @media print {
-    #frame, #page {
+    #frame, #title, #content {
         margin: 0;
+        padding: 0;
         width: auto;
         max-width: none;
         border: none;
     }
-    #page h1 {
+    #title h1 {
         border: none;
     }
     #navi {