gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[www] 02/05: newssystem, part 2.


From: gnunet
Subject: [www] 02/05: newssystem, part 2.
Date: Mon, 04 Nov 2019 00:02:07 +0100

This is an automated email from the git hooks/post-receive script.

ng0 pushed a commit to branch master
in repository www.

commit 23e81011af399df3619830ba95f52f719f31a670
Author: ng0 <address@hidden>
AuthorDate: Sun Nov 3 22:15:30 2019 +0000

    newssystem, part 2.
---
 GNUmakefile                       |   5 +
 Makefile                          |  17 +-
 common/footer.j2.inc              |  26 ++-
 common/header.j2.inc              |  10 +-
 common/navigation.j2.inc          |  34 ++--
 common/news.j2                    |   2 +
 locale/de/LC_MESSAGES/messages.po | 117 ++++++------
 locale/en/LC_MESSAGES/messages.po |  76 ++++----
 locale/es/LC_MESSAGES/messages.po |  81 +++++----
 locale/fr/LC_MESSAGES/messages.po |  78 ++++----
 locale/it/LC_MESSAGES/messages.po |  78 ++++----
 news/2017-10.html.j2              |   2 +-
 news/2018-06.html.j2              |   3 +-
 news/2018-07.html.j2              |   2 +-
 news/2018-08.html.j2              |   2 +-
 news/2019-0.11.0.html.j2          |   2 +-
 news/2019-0.11.1.html.j2          |   4 +-
 news/2019-0.11.2.html.j2          |   2 +-
 news/2019-0.11.3.html.j2          |   4 +-
 news/2019-0.11.4.html.j2          |   2 +-
 news/2019-0.11.5.html.j2          |   2 +-
 news/2019-0.11.6.html.j2          |   2 +-
 news/2019-0.11.7.html.j2          |   2 +-
 news/2019-0.11.8.html.j2          |   4 +-
 news/2019-02.html.j2              |   2 +-
 news/2019-06-DSTJ.html.j2         |   2 +-
 news/2019-06.html.j2              |   2 +-
 news/2019-07-GHM_Aug_2019.html.j2 |   2 +-
 news/2019-10-GNSSpec1.html.j2     |   4 +-
 news/2019-10-ICANNPanel.html.j2   |   2 +-
 news/index.html.j2                |  39 ++--
 rssg                              | 191 ++++++++++++++++++++
 template.py                       | 369 ++++++++++++++++++++++++++++++--------
 template/index.html.j2            |  14 +-
 34 files changed, 801 insertions(+), 383 deletions(-)

diff --git a/GNUmakefile b/GNUmakefile
index 4ee63f8..bdb7659 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -49,6 +49,11 @@ all: css locale template
        cd rendered/node ; $(ln) -fs about.html 397
        $(cp) static/moved_about.html rendered/about.html
        cd rendered ; $(ln) -fs about.html philosophy
+       $(sh) rssg rendered/en/news/index.html 'GNUnet News' > 
rendered/en/rss.xml
+       $(sh) rssg rendered/de/news/index.html 'GNUnet News' > 
rendered/de/rss.xml
+       $(sh) rssg rendered/es/news/index.html 'GNUnet News' > 
rendered/es/rss.xml
+       $(sh) rssg rendered/fr/news/index.html 'GNUnet News' > 
rendered/fr/rss.xml
+       $(sh) rssg rendered/it/news/index.html 'GNUnet News' > 
rendered/it/rss.xml
 
 # Extract translateable strings from jinja2 templates.
 # Because of the local i18nfix extractor module we need
diff --git a/Makefile b/Makefile
index d24a286..5b18e9c 100644
--- a/Makefile
+++ b/Makefile
@@ -29,11 +29,11 @@ all: css locale template
        ($(cp) rendered/static/stage.robots.txt rendered/${_lang})
        ($(cp) rss.xml rendered/${_lang})
 .endfor
-.for _lang in ${_LOCALELIST}
-       (cd rendered/${_lang}; $(ln) -fs ../dist dist)
-       (cd rendered/${_lang}; $(ln) -fs ../dist/css css)
-       (cd rendered/${_lang}; $(ln) -fs ../static static)
-.endfor
+#.for _lang in ${_LOCALELIST}
+#      (cd rendered/${_lang}; $(ln) -fs ../dist dist)
+#      (cd rendered/${_lang}; $(ln) -fs ../dist/css css)
+#      (cd rendered/${_lang}; $(ln) -fs ../static static)
+#.endfor
        ($(cp) rendered/static/robots.txt rendered/dist/robots.txt)
        ($(cp) favicon.ico rendered/)
        $(sh) make_sitemap.sh
@@ -50,9 +50,10 @@ all: css locale template
        (cd rendered/node ; $(ln) -fs about.html 397)
        ($(cp) static/moved_about.html rendered/about.html)
        (cd rendered ; $(ln) -fs about.html philosophy)
-#.for _lang in ${_LOCALELIST}
-#      $(sh) rssg rendered/${_lang}/news/index.html 'title' > 
rendered/${_lang}/rss.xml
-#.endfor
+.for _lang in ${_LOCALELIST}
+       ($(sh) rssg rendered/${_lang}/news/index.html 'GNUnet News' > 
rendered/${_lang}/rss.xml)
+       (cd rendered/${_lang}/news ; $(ln) -fs ../rss.xml rss.xml)
+.endfor
 
 # Extract translateable strings from jinja2 templates.
 locale/messages.pot: template/*.j2 common/*.j2 common/*.j2.inc
diff --git a/common/footer.j2.inc b/common/footer.j2.inc
index 1226d02..6d4614b 100644
--- a/common/footer.j2.inc
+++ b/common/footer.j2.inc
@@ -4,22 +4,20 @@
       <div class="row">
         <div class="col-12 col-sm-4">
           <ul class="footer-list">
-            <li><p><a href="contact.html">{{ _("Contact") }}</a></p></li>
-            <li><p><a href="ev.html">{{ _("GNUnet e.V.") }}</a></p></li>
-            <li><p><a href="about.html">{{ _("About GNUnet") }}</a></p></li>
+            <li><a href="{{ url_localized('contact.html') }}">{{ _("Contact") 
}}</a></li>
+            <li><a href="{{ url_localized('ev.html') }}">{{ _("GNUnet e.V.") 
}}</a></li>
+            <li><a href="{{ url_localized('about.html') }}">{{ _("About 
GNUnet") }}</a></li>
           </ul>
         </div>
         <div class="col-12 col-sm-4">
           <ul class="footer-list">
-            <li><p><a href="https://bugs.gnunet.org/";>{{ _("Bug Tracker") 
}}</a></p></li>
-            <!-- <li><p><a href="https://irc.gnunet.org/gnunet";>{{ _("IRC 
archive") }}</a></p></li> -->
+            <li><a href="https://bugs.gnunet.org/";>{{ _("Bug Tracker") 
}}</a></li>
           </ul>
         </div>
         <div class="col-12 col-sm-4">
           <ul class="footer-list">
-            <li><p><a href="copyright.html">{{ _("Copyright Assignment") 
}}</a></p></li>
-            <!-- <li><p><a href="https://gitlab.gnunet.org/";>{{ _("Continuous 
Integration") }}</a></p></li> -->
-            <li><p><a href="https://bib.gnunet.org/";>{{ _("Bibliography") 
}}</a></p></li>
+            <li><a href="{{ url_localized('copyright.html') }}">{{ 
_("Copyright Assignment") }}</a></li>
+            <li><a href="https://bib.gnunet.org/";>{{ _("Bibliography") 
}}</a></li>
           </ul>
         </div>
       </div>
@@ -27,13 +25,11 @@
   </div>
   <div class="container text-center">
     <p>
-    {% trans %}
-      Copyright &copy; <a href="ev.html">GNUnet e.V.</a> 2001 &mdash; 2019.
-      <!-- This just takes up space no one is interested in: -->
-    <!-- This page was created using <a href='https://www.gnu.org/'>Free 
Software</a> only.<br> -->
-    <a href='https://git.gnunet.org/www.git'>Source code of this site.</a>
-    <a href='contact.html'>Report issues with this website</a>.
-    {% endtrans %}
+      Copyright &copy;
+      <a href="{{ url_localized('ev.html') }}">GNUnet e.V.</a>
+      2001 &mdash; 2019.
+      <a href="https://git.gnunet.org/www.git";>{{ _("Source code of this 
site.") }}</a>
+      <a href="{{ url_localized('contact.html') }}">{{ _("Report issues with 
this website.") }}</a>
     </p>
   </div>
 </footer>
diff --git a/common/header.j2.inc b/common/header.j2.inc
index 86e331e..eac5ace 100644
--- a/common/header.j2.inc
+++ b/common/header.j2.inc
@@ -36,13 +36,13 @@
     <!--    <link rel="icon" href="../../favicon.ico"> -->
 
     <!-- Bootstrap core CSS -->
-    <link href="{{ url('dist/css/bootstrap.min.css') }}" rel="stylesheet">
+    <link href="{{ url_dist('css/bootstrap.min.css') }}" rel="stylesheet">
     <!-- Custom styles for this template -->
-    <link href="{{ url('static/styles.css') }}" rel="stylesheet">
+    <link href="{{ url_static('styles.css') }}" rel="stylesheet">
 
-    <script src="{{ url('dist/js/jquery-1.11.1.min.js') }}"></script>
-    <script src="{{ url('dist/js/bootstrap.min.js') }}"></script>
-    <link href="{{ url('static/navbar.css') }}" rel="stylesheet">
+    <script src="{{ url_dist('js/jquery-1.11.1.min.js') }}"></script>
+    <script src="{{ url_dist('js/bootstrap.min.js') }}"></script>
+    <link href="{{ url_static('navbar.css') }}" rel="stylesheet">
 
     <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media 
queries -->
     <!--[if lt IE 9]>
diff --git a/common/navigation.j2.inc b/common/navigation.j2.inc
index 535a1a8..1f50234 100644
--- a/common/navigation.j2.inc
+++ b/common/navigation.j2.inc
@@ -17,7 +17,7 @@
 </noscript>
 <nav class="navbar sticky-top navbar-expand-md bg-near-black">
   <a class="navbar-brand" href="index.html">
-      <img src="{{ url('static/images/gnunet-logo-dark-only-text.png') }}" 
alt="GNUnet" height="25px" />
+      <img src="{{ url_static('images/gnunet-logo-dark-only-text.png') }}" 
alt="GNUnet" height="25px" />
   </a>
 
   <!-- menu button -->
@@ -35,22 +35,18 @@
   <!-- navbar -->
   <div class="collapse navbar-collapse bg-near-black" id="navbarMain">
     <ul class="navbar-nav mr-auto nav">
-      <li class="nav-link">
-       <a href="about.html">{{ _("About") }}</a></li>
-      </li>
-      <li class="nav-link">
-       <a href="index.html#news">{{ _("News") }}</a>
-      </li>
+      <li class="nav-link"><a href="{{ url_localized('about.html') }}">{{ 
_("About") }}</a></li>
+      <li class="nav-link"><a href="{{ url_localized('index.html#news') }}">{{ 
_("News") }}</a></li>
       <li class="nav-item dropdown">
         <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown"
            role="button" aria-haspopup="true" aria-expanded="false">
            {{ _("Community") }}
         </a>
         <ul class="dropdown-menu" aria-labelledby="navbarMain">
-          <li><a class="dropdown-item" href="engage.html">{{ _("Engage") }} 
</a></li>
-          <li><a class="dropdown-item" href="gsoc.html">{{ _("GSoC Projects") 
}}</a></li>
-          <li><a class="dropdown-item" href="ev.html">{{ _("GNUnet e.V.") 
}}</a></li>
-          <li><a class="dropdown-item" href="copyright.html">{{ _("Copyright 
for Contributors") }} </a></li>
+          <li><a class="dropdown-item" href="{{ url_localized('engage.html') 
}}">{{ _("Engage") }} </a></li>
+          <li><a class="dropdown-item" href="{{ url_localized('gsoc.html') 
}}">{{ _("GSoC Projects") }}</a></li>
+          <li><a class="dropdown-item" href="{{ url_localized('ev.html') 
}}">{{ _("GNUnet e.V.") }}</a></li>
+          <li><a class="dropdown-item" href="{{ 
url_localized('copyright.html') }}">{{ _("Copyright for Contributors") }} 
</a></li>
          <!-- li><a class="dropdown-item" 
href="https://old.gnunet.org/bot/log/gnunet";>{{ _("IRC Archive") }}</a></li -->
         </ul>
       </li>
@@ -61,7 +57,7 @@
            {{ _("Development") }}
         </a>
         <ul class="dropdown-menu" aria-labelledby="navbarMain">
-          <li><a class="dropdown-item" href="architecture.html">{{ _("System 
Architecture") }}</a></li>
+          <li><a class="dropdown-item" href="{{ 
url_localized('architecture.html') }}">{{ _("System Architecture") }}</a></li>
           <li><a class="dropdown-item" href="https://bugs.gnunet.org"; 
target="_blank">{{ _("Bug Tracker") }}</a></li>
           <li><a class="dropdown-item" href="https://git.gnunet.org"; 
target="_blank">{{ _("Source Code") }}</a></li>
           <li><a class="dropdown-item" target="_blank" 
href="https://docs.gnunet.org/doxygen/";>{{ _("Source Code Documentation") 
}}</a></li>
@@ -70,7 +66,7 @@
           <li><a class="dropdown-item" href="https://gitlab.gnunet.org/"; 
target="_blank">{{ _("Continuous Integration") }}</a></li>
           -->
           <li><a class="dropdown-item" target="_blank" 
href="https://docs.gnunet.org/tutorial/gnunet-tutorial.html";>{{ _("Development 
Tutorial") }}</a></li>
-         <li><a class="dropdown-item" href="gnurl.html">libgnurl</a></li>
+         <li><a class="dropdown-item" href="{{ url_localized('gnurl.html') 
}}">libgnurl</a></li>
         </ul>
       </li>
       <li class="nav-item dropdown">
@@ -83,13 +79,13 @@
           {{ _("Documentation") }}
        </a>
        <ul class="dropdown-menu" aria-labelledby="navbarMain">
-         <li><a class="dropdown-item" href="install.html">{{ _("Install") 
}}</a></li>
-         <li><a class="dropdown-item" href="use.html">{{ _("Use") }}</a></li>
-         <li><a class="dropdown-item" href="video.html">{{ _("Videos") 
}}</a></li>
-          <li><a class="dropdown-item" href="glossary.html">{{ _("Glossary") 
}}</a></li>
+         <li><a class="dropdown-item" href="{{ url_localized('install.html') 
}}">{{ _("Install") }}</a></li>
+         <li><a class="dropdown-item" href="{{ url_localized('use.html') 
}}">{{ _("Use") }}</a></li>
+         <li><a class="dropdown-item" href="{{ url_localized('video.html') 
}}">{{ _("Videos") }}</a></li>
+          <li><a class="dropdown-item" href="{{ url_localized('glossary.html') 
}}">{{ _("Glossary") }}</a></li>
          <li><a class="dropdown-item" target="_blank" 
href="https://docs.gnunet.org/handbook/gnunet.html";>{{ _("Handbook") }}</a></li>
-    <li><a class="dropdown-item" target="_blank" 
href="https://rest.gnunet.org/";>{{ _("REST API") }}</a></li>
-          <li><a class="dropdown-item" href="faq.html">{{ _("FAQ") }}</a></li>
+          <li><a class="dropdown-item" target="_blank" 
href="https://rest.gnunet.org/";>{{ _("REST API") }}</a></li>
+          <li><a class="dropdown-item" href="{{ url_localized('faq.html') 
}}">{{ _("FAQ") }}</a></li>
           <li><a class="dropdown-item" href="https://bib.gnunet.org/date.html"; 
target="_blank">{{ _("Bibliography") }}</a></li>
        </ul>
       </li>
diff --git a/common/news.j2 b/common/news.j2
index 7b0ed60..cdc124b 100644
--- a/common/news.j2
+++ b/common/news.j2
@@ -16,9 +16,11 @@
           </div>
         </div>
         <div class="container">
+          <!--BEGIN-->
           <article>
             {% block body_content %}{% endblock %}
           </article>
+          <!--END-->
         </div>
     </div>
     {% include "common/footer.j2.inc" %}
diff --git a/locale/de/LC_MESSAGES/messages.po 
b/locale/de/LC_MESSAGES/messages.po
index 309dae2..414718c 100644
--- a/locale/de/LC_MESSAGES/messages.po
+++ b/locale/de/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2019-11-02 21:35+0000\n"
+"POT-Creation-Date: 2019-11-03 22:02+0000\n"
 "PO-Revision-Date: 2018-02-24 17:42\n"
 "Last-Translator: Torsten Grothoff <address@hidden>\n"
 "Language-Team: German <address@hidden>\n"
@@ -29,7 +29,7 @@ msgstr "GNU's Architektur für sichere p2p Netzwerke"
 msgid "Contact"
 msgstr "Kontakt"
 
-#: common/footer.j2.inc:8 common/navigation.j2.inc:52
+#: common/footer.j2.inc:8 common/navigation.j2.inc:48
 msgid "GNUnet e.V."
 msgstr "GNUnet e.V."
 
@@ -37,130 +37,113 @@ msgstr "GNUnet e.V."
 msgid "About GNUnet"
 msgstr "Über GNUnet"
 
-#: common/footer.j2.inc:14 common/navigation.j2.inc:65
+#: common/footer.j2.inc:14 common/navigation.j2.inc:61
 msgid "Bug Tracker"
 msgstr "Fehlerdatenbank"
 
-#: common/footer.j2.inc:15
-#, fuzzy
-#| msgid "IRC Archive"
-msgid "IRC archive"
-msgstr "IRC Archive"
-
-#: common/footer.j2.inc:20 template/copyright.html.j2:6
+#: common/footer.j2.inc:19 template/copyright.html.j2:6
 msgid "Copyright Assignment"
 msgstr "Copyright Übertragung"
 
-#: common/footer.j2.inc:21 common/navigation.j2.inc:70
-msgid "Continuous Integration"
-msgstr "Kontinuierliche Integration"
-
-#: common/footer.j2.inc:22 common/navigation.j2.inc:93
+#: common/footer.j2.inc:20 common/navigation.j2.inc:89
 #: template/developers.html.j2:24
 msgid "Bibliography"
 msgstr "Bibliografie"
 
-#: common/footer.j2.inc:30
-#, fuzzy
-#| msgid ""
-#| "Copyright &copy; <a href=\"ev.html\">GNUnet e.V.</a> 2015, 2016, 2017, "
-#| "2018, 2019<br> This page was created using <a href='https://www.gnu.";
-#| "org/'>Free Software</a> only.<br> Report issues with this website to <a "
-#| "href='contact.html'>us</a>."
-msgid ""
-"Copyright &copy; <a href=\"ev.html\">GNUnet e.V.</a> 2001 &mdash; 2019. <!-- "
-"This just takes up space no one is interested in: --> <!-- This page was "
-"created using <a href='https://www.gnu.org/'>Free Software</a> only.<br> --> "
-"<a href='https://git.gnunet.org/www.git'>Source code of this site.</a> <a "
-"href='contact.html'>Report issues with this website</a>."
-msgstr ""
-"Copyright &copy; <a href=\"ev.html\">GNUnet e.V.</a> 2015, 2016, 2017, 2018, "
-"2019<br> Diese Seite wurde nur mit <a href='https://www.gnu.org/'>Freier "
-"Software</a> erstellt.<br> Probleme bitte <a href='contact.html'>hier</a> "
-"melden."
-
-#: common/navigation.j2.inc:39 template/index.html.j2:52
+#: common/footer.j2.inc:31
+msgid "Source code of this site."
+msgstr ""
+
+#: common/footer.j2.inc:32
+msgid "Report issues with this website."
+msgstr ""
+
+#: common/navigation.j2.inc:38 template/index.html.j2:52
 msgid "About"
 msgstr "Über GNUnet"
 
-#: common/navigation.j2.inc:42 template/index.html.j2:377
+#: common/navigation.j2.inc:39 template/index.html.j2:377
 msgid "News"
 msgstr "Neues"
 
-#: common/navigation.j2.inc:47
+#: common/navigation.j2.inc:43
 msgid "Community"
 msgstr "Community"
 
-#: common/navigation.j2.inc:50 template/index.html.j2:64
+#: common/navigation.j2.inc:46 template/index.html.j2:64
 msgid "Engage"
 msgstr "Mach mit!"
 
-#: common/navigation.j2.inc:51
+#: common/navigation.j2.inc:47
 msgid "GSoC Projects"
 msgstr "GSoC Projekte"
 
-#: common/navigation.j2.inc:53
+#: common/navigation.j2.inc:49
 msgid "Copyright for Contributors"
 msgstr "Copyright für Mitwirkende"
 
-#: common/navigation.j2.inc:54
+#: common/navigation.j2.inc:50
 msgid "IRC Archive"
 msgstr "IRC Archiv"
 
-#: common/navigation.j2.inc:61
+#: common/navigation.j2.inc:57
 msgid "Development"
 msgstr "Entwicklung"
 
-#: common/navigation.j2.inc:64
+#: common/navigation.j2.inc:60
 msgid "System Architecture"
 msgstr "Systemarchitektur"
 
-#: common/navigation.j2.inc:66 template/gnurl.html.j2:147
+#: common/navigation.j2.inc:62 template/gnurl.html.j2:147
 msgid "Source Code"
 msgstr "Quellkode"
 
-#: common/navigation.j2.inc:67
+#: common/navigation.j2.inc:63
 #, fuzzy
 #| msgid "Documentation"
 msgid "Source Code Documentation"
 msgstr "Dokumentation"
 
-#: common/navigation.j2.inc:72
+#: common/navigation.j2.inc:66
+msgid "Continuous Integration"
+msgstr "Kontinuierliche Integration"
+
+#: common/navigation.j2.inc:68
 #, fuzzy
 #| msgid "Development"
 msgid "Development Tutorial"
 msgstr "Entwicklung"
 
-#: common/navigation.j2.inc:83
+#: common/navigation.j2.inc:79
 msgid "Documentation"
 msgstr "Dokumentation"
 
-#: common/navigation.j2.inc:86 template/index.html.j2:58
+#: common/navigation.j2.inc:82 template/index.html.j2:58
 #: template/install.html.j2:6
 msgid "Install"
 msgstr "Installieren"
 
-#: common/navigation.j2.inc:87
+#: common/navigation.j2.inc:83
 msgid "Use"
 msgstr "Nutzen"
 
-#: common/navigation.j2.inc:88
+#: common/navigation.j2.inc:84
 msgid "Videos"
 msgstr "Videos"
 
-#: common/navigation.j2.inc:89 template/glossary.html.j2:6
+#: common/navigation.j2.inc:85 template/glossary.html.j2:6
 msgid "Glossary"
 msgstr "Glossar"
 
-#: common/navigation.j2.inc:90
+#: common/navigation.j2.inc:86
 msgid "Handbook"
 msgstr "Handbuch"
 
-#: common/navigation.j2.inc:91
+#: common/navigation.j2.inc:87
 msgid "REST API"
 msgstr "REST API"
 
-#: common/navigation.j2.inc:92
+#: common/navigation.j2.inc:88
 msgid "FAQ"
 msgstr "FAQ"
 
@@ -1658,7 +1641,8 @@ msgid ""
 "html\">install GNUnet</a>, <a href=\"https://gnunet.org/en/use.html\";>use "
 "it</a> and <a href=\"https://gnunet.org/en/engage.html\";>contribute</a>. "
 "<br> Be aware that this project is still in an early alpha stage when it "
-"comes to software &#8211; its not an easy task to rewrite the whole Internet!"
+"comes to software &#8211; it is not an easy task to rewrite the whole "
+"Internet!"
 msgstr ""
 
 #: template/index.html.j2:250
@@ -2022,6 +2006,29 @@ msgstr ""
 msgid "2010"
 msgstr ""
 
+#, fuzzy
+#~| msgid "IRC Archive"
+#~ msgid "IRC archive"
+#~ msgstr "IRC Archive"
+
+#, fuzzy
+#~| msgid ""
+#~| "Copyright &copy; <a href=\"ev.html\">GNUnet e.V.</a> 2015, 2016, 2017, "
+#~| "2018, 2019<br> This page was created using <a href='https://www.gnu.";
+#~| "org/'>Free Software</a> only.<br> Report issues with this website to <a "
+#~| "href='contact.html'>us</a>."
+#~ msgid ""
+#~ "Copyright &copy; <a href=\"ev.html\">GNUnet e.V.</a> 2001 &mdash; 2019. "
+#~ "<!-- This just takes up space no one is interested in: --> <!-- This page "
+#~ "was created using <a href='https://www.gnu.org/'>Free Software</a> only."
+#~ "<br> --> <a href='https://git.gnunet.org/www.git'>Source code of this "
+#~ "site.</a> <a href='contact.html'>Report issues with this website</a>."
+#~ msgstr ""
+#~ "Copyright &copy; <a href=\"ev.html\">GNUnet e.V.</a> 2015, 2016, 2017, "
+#~ "2018, 2019<br> Diese Seite wurde nur mit <a href='https://www.gnu.";
+#~ "org/'>Freier Software</a> erstellt.<br> Probleme bitte <a href='contact."
+#~ "html'>hier</a> melden."
+
 #~ msgid "Developer Team"
 #~ msgstr "Entwickelerteam"
 
diff --git a/locale/en/LC_MESSAGES/messages.po 
b/locale/en/LC_MESSAGES/messages.po
index f8f51d3..ab6e601 100644
--- a/locale/en/LC_MESSAGES/messages.po
+++ b/locale/en/LC_MESSAGES/messages.po
@@ -10,7 +10,7 @@ msgstr ""
 msgid "Contact"
 msgstr ""
 
-#: common/footer.j2.inc:8 common/navigation.j2.inc:52
+#: common/footer.j2.inc:8 common/navigation.j2.inc:48
 msgid "GNUnet e.V."
 msgstr ""
 
@@ -18,114 +18,109 @@ msgstr ""
 msgid "About GNUnet"
 msgstr ""
 
-#: common/footer.j2.inc:14 common/navigation.j2.inc:65
+#: common/footer.j2.inc:14 common/navigation.j2.inc:61
 msgid "Bug Tracker"
 msgstr ""
 
-#: common/footer.j2.inc:15
-msgid "IRC archive"
-msgstr ""
-
-#: common/footer.j2.inc:20 template/copyright.html.j2:6
+#: common/footer.j2.inc:19 template/copyright.html.j2:6
 msgid "Copyright Assignment"
 msgstr ""
 
-#: common/footer.j2.inc:21 common/navigation.j2.inc:70
-msgid "Continuous Integration"
-msgstr ""
-
-#: common/footer.j2.inc:22 common/navigation.j2.inc:93
+#: common/footer.j2.inc:20 common/navigation.j2.inc:89
 #: template/developers.html.j2:24
 msgid "Bibliography"
 msgstr ""
 
-#: common/footer.j2.inc:30
-msgid ""
-"Copyright &copy; <a href=\"ev.html\">GNUnet e.V.</a> 2001 &mdash; 2019. <!-- "
-"This just takes up space no one is interested in: --> <!-- This page was "
-"created using <a href='https://www.gnu.org/'>Free Software</a> only.<br> --> "
-"<a href='https://git.gnunet.org/www.git'>Source code of this site.</a> <a "
-"href='contact.html'>Report issues with this website</a>."
+#: common/footer.j2.inc:31
+msgid "Source code of this site."
+msgstr ""
+
+#: common/footer.j2.inc:32
+msgid "Report issues with this website."
 msgstr ""
 
-#: common/navigation.j2.inc:39 template/index.html.j2:52
+#: common/navigation.j2.inc:38 template/index.html.j2:52
 msgid "About"
 msgstr ""
 
-#: common/navigation.j2.inc:42 template/index.html.j2:377
+#: common/navigation.j2.inc:39 template/index.html.j2:377
 msgid "News"
 msgstr ""
 
-#: common/navigation.j2.inc:47
+#: common/navigation.j2.inc:43
 msgid "Community"
 msgstr ""
 
-#: common/navigation.j2.inc:50 template/index.html.j2:64
+#: common/navigation.j2.inc:46 template/index.html.j2:64
 msgid "Engage"
 msgstr ""
 
-#: common/navigation.j2.inc:51
+#: common/navigation.j2.inc:47
 msgid "GSoC Projects"
 msgstr ""
 
-#: common/navigation.j2.inc:53
+#: common/navigation.j2.inc:49
 msgid "Copyright for Contributors"
 msgstr ""
 
-#: common/navigation.j2.inc:54
+#: common/navigation.j2.inc:50
 msgid "IRC Archive"
 msgstr ""
 
-#: common/navigation.j2.inc:61
+#: common/navigation.j2.inc:57
 msgid "Development"
 msgstr ""
 
-#: common/navigation.j2.inc:64
+#: common/navigation.j2.inc:60
 msgid "System Architecture"
 msgstr ""
 
-#: common/navigation.j2.inc:66 template/gnurl.html.j2:147
+#: common/navigation.j2.inc:62 template/gnurl.html.j2:147
 msgid "Source Code"
 msgstr ""
 
-#: common/navigation.j2.inc:67
+#: common/navigation.j2.inc:63
 msgid "Source Code Documentation"
 msgstr ""
 
-#: common/navigation.j2.inc:72
+#: common/navigation.j2.inc:66
+msgid "Continuous Integration"
+msgstr ""
+
+#: common/navigation.j2.inc:68
 msgid "Development Tutorial"
 msgstr ""
 
-#: common/navigation.j2.inc:83
+#: common/navigation.j2.inc:79
 msgid "Documentation"
 msgstr ""
 
-#: common/navigation.j2.inc:86 template/index.html.j2:58
+#: common/navigation.j2.inc:82 template/index.html.j2:58
 #: template/install.html.j2:6
 msgid "Install"
 msgstr ""
 
-#: common/navigation.j2.inc:87
+#: common/navigation.j2.inc:83
 msgid "Use"
 msgstr ""
 
-#: common/navigation.j2.inc:88
+#: common/navigation.j2.inc:84
 msgid "Videos"
 msgstr ""
 
-#: common/navigation.j2.inc:89 template/glossary.html.j2:6
+#: common/navigation.j2.inc:85 template/glossary.html.j2:6
 msgid "Glossary"
 msgstr ""
 
-#: common/navigation.j2.inc:90
+#: common/navigation.j2.inc:86
 msgid "Handbook"
 msgstr ""
 
-#: common/navigation.j2.inc:91
+#: common/navigation.j2.inc:87
 msgid "REST API"
 msgstr ""
 
-#: common/navigation.j2.inc:92
+#: common/navigation.j2.inc:88
 msgid "FAQ"
 msgstr ""
 
@@ -1595,7 +1590,8 @@ msgid ""
 "html\">install GNUnet</a>, <a href=\"https://gnunet.org/en/use.html\";>use "
 "it</a> and <a href=\"https://gnunet.org/en/engage.html\";>contribute</a>. "
 "<br> Be aware that this project is still in an early alpha stage when it "
-"comes to software &#8211; its not an easy task to rewrite the whole Internet!"
+"comes to software &#8211; it is not an easy task to rewrite the whole "
+"Internet!"
 msgstr ""
 
 #: template/index.html.j2:250
diff --git a/locale/es/LC_MESSAGES/messages.po 
b/locale/es/LC_MESSAGES/messages.po
index 13cfa63..670607a 100644
--- a/locale/es/LC_MESSAGES/messages.po
+++ b/locale/es/LC_MESSAGES/messages.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2019-11-02 21:35+0000\n"
+"POT-Creation-Date: 2019-11-03 22:02+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <address@hidden>\n"
@@ -30,7 +30,7 @@ msgstr ""
 msgid "Contact"
 msgstr "Contacto"
 
-#: common/footer.j2.inc:8 common/navigation.j2.inc:52
+#: common/footer.j2.inc:8 common/navigation.j2.inc:48
 msgid "GNUnet e.V."
 msgstr "GNUnet a. r."
 
@@ -38,118 +38,113 @@ msgstr "GNUnet a. r."
 msgid "About GNUnet"
 msgstr "Sobre GNUnet"
 
-#: common/footer.j2.inc:14 common/navigation.j2.inc:65
+#: common/footer.j2.inc:14 common/navigation.j2.inc:61
 msgid "Bug Tracker"
 msgstr "Herramienta de seguimiento de errores"
 
-#: common/footer.j2.inc:15
-msgid "IRC archive"
-msgstr "Archivo IRC"
-
-#: common/footer.j2.inc:20 template/copyright.html.j2:6
+#: common/footer.j2.inc:19 template/copyright.html.j2:6
 msgid "Copyright Assignment"
 msgstr "Transmisión de derechos de autor"
 
-#: common/footer.j2.inc:21 common/navigation.j2.inc:70
-msgid "Continuous Integration"
-msgstr "Integración continua"
-
-#: common/footer.j2.inc:22 common/navigation.j2.inc:93
+#: common/footer.j2.inc:20 common/navigation.j2.inc:89
 #: template/developers.html.j2:24
 msgid "Bibliography"
 msgstr "Bibliografía"
 
-#: common/footer.j2.inc:30
-msgid ""
-"Copyright &copy; <a href=\"ev.html\">GNUnet e.V.</a> 2001 &mdash; 2019. <!-- "
-"This just takes up space no one is interested in: --> <!-- This page was "
-"created using <a href='https://www.gnu.org/'>Free Software</a> only.<br> --> "
-"<a href='https://git.gnunet.org/www.git'>Source code of this site.</a> <a "
-"href='contact.html'>Report issues with this website</a>."
+#: common/footer.j2.inc:31
+msgid "Source code of this site."
 msgstr ""
 
-#: common/navigation.j2.inc:39 template/index.html.j2:52
+#: common/footer.j2.inc:32
+msgid "Report issues with this website."
+msgstr ""
+
+#: common/navigation.j2.inc:38 template/index.html.j2:52
 msgid "About"
 msgstr "Sobre"
 
-#: common/navigation.j2.inc:42 template/index.html.j2:377
+#: common/navigation.j2.inc:39 template/index.html.j2:377
 msgid "News"
 msgstr "Nuevo"
 
-#: common/navigation.j2.inc:47
+#: common/navigation.j2.inc:43
 msgid "Community"
 msgstr "Comunidad"
 
-#: common/navigation.j2.inc:50 template/index.html.j2:64
+#: common/navigation.j2.inc:46 template/index.html.j2:64
 msgid "Engage"
 msgstr "Participa"
 
-#: common/navigation.j2.inc:51
+#: common/navigation.j2.inc:47
 msgid "GSoC Projects"
 msgstr "Projectos de GSoC"
 
-#: common/navigation.j2.inc:53
+#: common/navigation.j2.inc:49
 msgid "Copyright for Contributors"
 msgstr "Derecho de autor para contributores"
 
-#: common/navigation.j2.inc:54
+#: common/navigation.j2.inc:50
 msgid "IRC Archive"
 msgstr "Archivo de IRC"
 
-#: common/navigation.j2.inc:61
+#: common/navigation.j2.inc:57
 msgid "Development"
 msgstr "Desarrollo"
 
-#: common/navigation.j2.inc:64
+#: common/navigation.j2.inc:60
 msgid "System Architecture"
 msgstr "Architectura del sistema"
 
-#: common/navigation.j2.inc:66 template/gnurl.html.j2:147
+#: common/navigation.j2.inc:62 template/gnurl.html.j2:147
 msgid "Source Code"
 msgstr "Códico fuente"
 
-#: common/navigation.j2.inc:67
+#: common/navigation.j2.inc:63
 #, fuzzy
 #| msgid "Documentation"
 msgid "Source Code Documentation"
 msgstr "Documentación"
 
-#: common/navigation.j2.inc:72
+#: common/navigation.j2.inc:66
+msgid "Continuous Integration"
+msgstr "Integración continua"
+
+#: common/navigation.j2.inc:68
 #, fuzzy
 #| msgid "Development"
 msgid "Development Tutorial"
 msgstr "Desarrollo"
 
-#: common/navigation.j2.inc:83
+#: common/navigation.j2.inc:79
 msgid "Documentation"
 msgstr "Documentación"
 
-#: common/navigation.j2.inc:86 template/index.html.j2:58
+#: common/navigation.j2.inc:82 template/index.html.j2:58
 #: template/install.html.j2:6
 msgid "Install"
 msgstr "Instala"
 
-#: common/navigation.j2.inc:87
+#: common/navigation.j2.inc:83
 msgid "Use"
 msgstr "Usa"
 
-#: common/navigation.j2.inc:88
+#: common/navigation.j2.inc:84
 msgid "Videos"
 msgstr "Videos"
 
-#: common/navigation.j2.inc:89 template/glossary.html.j2:6
+#: common/navigation.j2.inc:85 template/glossary.html.j2:6
 msgid "Glossary"
 msgstr "Glosario"
 
-#: common/navigation.j2.inc:90
+#: common/navigation.j2.inc:86
 msgid "Handbook"
 msgstr "Manual"
 
-#: common/navigation.j2.inc:91
+#: common/navigation.j2.inc:87
 msgid "REST API"
 msgstr "REST API"
 
-#: common/navigation.j2.inc:92
+#: common/navigation.j2.inc:88
 msgid "FAQ"
 msgstr "FAQ"
 
@@ -1627,7 +1622,8 @@ msgid ""
 "html\">install GNUnet</a>, <a href=\"https://gnunet.org/en/use.html\";>use "
 "it</a> and <a href=\"https://gnunet.org/en/engage.html\";>contribute</a>. "
 "<br> Be aware that this project is still in an early alpha stage when it "
-"comes to software &#8211; its not an easy task to rewrite the whole Internet!"
+"comes to software &#8211; it is not an easy task to rewrite the whole "
+"Internet!"
 msgstr ""
 
 #: template/index.html.j2:250
@@ -1987,6 +1983,9 @@ msgstr ""
 msgid "2010"
 msgstr ""
 
+#~ msgid "IRC archive"
+#~ msgstr "Archivo IRC"
+
 #~ msgid "Developer Team"
 #~ msgstr "Equipo de desarrollo"
 
diff --git a/locale/fr/LC_MESSAGES/messages.po 
b/locale/fr/LC_MESSAGES/messages.po
index e2f42be..c0678d1 100644
--- a/locale/fr/LC_MESSAGES/messages.po
+++ b/locale/fr/LC_MESSAGES/messages.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2019-11-02 21:35+0000\n"
+"POT-Creation-Date: 2019-11-03 22:02+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <address@hidden>\n"
@@ -30,7 +30,7 @@ msgstr ""
 msgid "Contact"
 msgstr ""
 
-#: common/footer.j2.inc:8 common/navigation.j2.inc:52
+#: common/footer.j2.inc:8 common/navigation.j2.inc:48
 msgid "GNUnet e.V."
 msgstr ""
 
@@ -38,114 +38,109 @@ msgstr ""
 msgid "About GNUnet"
 msgstr ""
 
-#: common/footer.j2.inc:14 common/navigation.j2.inc:65
+#: common/footer.j2.inc:14 common/navigation.j2.inc:61
 msgid "Bug Tracker"
 msgstr ""
 
-#: common/footer.j2.inc:15
-msgid "IRC archive"
-msgstr ""
-
-#: common/footer.j2.inc:20 template/copyright.html.j2:6
+#: common/footer.j2.inc:19 template/copyright.html.j2:6
 msgid "Copyright Assignment"
 msgstr ""
 
-#: common/footer.j2.inc:21 common/navigation.j2.inc:70
-msgid "Continuous Integration"
-msgstr ""
-
-#: common/footer.j2.inc:22 common/navigation.j2.inc:93
+#: common/footer.j2.inc:20 common/navigation.j2.inc:89
 #: template/developers.html.j2:24
 msgid "Bibliography"
 msgstr ""
 
-#: common/footer.j2.inc:30
-msgid ""
-"Copyright &copy; <a href=\"ev.html\">GNUnet e.V.</a> 2001 &mdash; 2019. <!-- "
-"This just takes up space no one is interested in: --> <!-- This page was "
-"created using <a href='https://www.gnu.org/'>Free Software</a> only.<br> --> "
-"<a href='https://git.gnunet.org/www.git'>Source code of this site.</a> <a "
-"href='contact.html'>Report issues with this website</a>."
+#: common/footer.j2.inc:31
+msgid "Source code of this site."
+msgstr ""
+
+#: common/footer.j2.inc:32
+msgid "Report issues with this website."
 msgstr ""
 
-#: common/navigation.j2.inc:39 template/index.html.j2:52
+#: common/navigation.j2.inc:38 template/index.html.j2:52
 msgid "About"
 msgstr ""
 
-#: common/navigation.j2.inc:42 template/index.html.j2:377
+#: common/navigation.j2.inc:39 template/index.html.j2:377
 msgid "News"
 msgstr ""
 
-#: common/navigation.j2.inc:47
+#: common/navigation.j2.inc:43
 msgid "Community"
 msgstr ""
 
-#: common/navigation.j2.inc:50 template/index.html.j2:64
+#: common/navigation.j2.inc:46 template/index.html.j2:64
 msgid "Engage"
 msgstr ""
 
-#: common/navigation.j2.inc:51
+#: common/navigation.j2.inc:47
 msgid "GSoC Projects"
 msgstr ""
 
-#: common/navigation.j2.inc:53
+#: common/navigation.j2.inc:49
 msgid "Copyright for Contributors"
 msgstr ""
 
-#: common/navigation.j2.inc:54
+#: common/navigation.j2.inc:50
 msgid "IRC Archive"
 msgstr ""
 
-#: common/navigation.j2.inc:61
+#: common/navigation.j2.inc:57
 msgid "Development"
 msgstr ""
 
-#: common/navigation.j2.inc:64
+#: common/navigation.j2.inc:60
 msgid "System Architecture"
 msgstr ""
 
-#: common/navigation.j2.inc:66 template/gnurl.html.j2:147
+#: common/navigation.j2.inc:62 template/gnurl.html.j2:147
 msgid "Source Code"
 msgstr ""
 
-#: common/navigation.j2.inc:67
+#: common/navigation.j2.inc:63
 msgid "Source Code Documentation"
 msgstr ""
 
-#: common/navigation.j2.inc:72
+#: common/navigation.j2.inc:66
+msgid "Continuous Integration"
+msgstr ""
+
+#: common/navigation.j2.inc:68
 msgid "Development Tutorial"
 msgstr ""
 
-#: common/navigation.j2.inc:83
+#: common/navigation.j2.inc:79
 msgid "Documentation"
 msgstr ""
 
-#: common/navigation.j2.inc:86 template/index.html.j2:58
+#: common/navigation.j2.inc:82 template/index.html.j2:58
 #: template/install.html.j2:6
 msgid "Install"
 msgstr ""
 
-#: common/navigation.j2.inc:87
+#: common/navigation.j2.inc:83
 msgid "Use"
 msgstr ""
 
-#: common/navigation.j2.inc:88
+#: common/navigation.j2.inc:84
 msgid "Videos"
 msgstr ""
 
-#: common/navigation.j2.inc:89 template/glossary.html.j2:6
+#: common/navigation.j2.inc:85 template/glossary.html.j2:6
 msgid "Glossary"
 msgstr ""
 
-#: common/navigation.j2.inc:90
+#: common/navigation.j2.inc:86
 msgid "Handbook"
 msgstr ""
 
-#: common/navigation.j2.inc:91
+#: common/navigation.j2.inc:87
 msgid "REST API"
 msgstr ""
 
-#: common/navigation.j2.inc:92
+#: common/navigation.j2.inc:88
 msgid "FAQ"
 msgstr ""
 
@@ -1615,7 +1610,8 @@ msgid ""
 "html\">install GNUnet</a>, <a href=\"https://gnunet.org/en/use.html\";>use "
 "it</a> and <a href=\"https://gnunet.org/en/engage.html\";>contribute</a>. "
 "<br> Be aware that this project is still in an early alpha stage when it "
-"comes to software &#8211; its not an easy task to rewrite the whole Internet!"
+"comes to software &#8211; it is not an easy task to rewrite the whole "
+"Internet!"
 msgstr ""
 
 #: template/index.html.j2:250
diff --git a/locale/it/LC_MESSAGES/messages.po 
b/locale/it/LC_MESSAGES/messages.po
index 1be0ac9..2599cbf 100644
--- a/locale/it/LC_MESSAGES/messages.po
+++ b/locale/it/LC_MESSAGES/messages.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2019-11-02 21:35+0000\n"
+"POT-Creation-Date: 2019-11-03 22:02+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <address@hidden>\n"
@@ -30,7 +30,7 @@ msgstr ""
 msgid "Contact"
 msgstr ""
 
-#: common/footer.j2.inc:8 common/navigation.j2.inc:52
+#: common/footer.j2.inc:8 common/navigation.j2.inc:48
 msgid "GNUnet e.V."
 msgstr ""
 
@@ -38,114 +38,109 @@ msgstr ""
 msgid "About GNUnet"
 msgstr ""
 
-#: common/footer.j2.inc:14 common/navigation.j2.inc:65
+#: common/footer.j2.inc:14 common/navigation.j2.inc:61
 msgid "Bug Tracker"
 msgstr ""
 
-#: common/footer.j2.inc:15
-msgid "IRC archive"
-msgstr ""
-
-#: common/footer.j2.inc:20 template/copyright.html.j2:6
+#: common/footer.j2.inc:19 template/copyright.html.j2:6
 msgid "Copyright Assignment"
 msgstr ""
 
-#: common/footer.j2.inc:21 common/navigation.j2.inc:70
-msgid "Continuous Integration"
-msgstr ""
-
-#: common/footer.j2.inc:22 common/navigation.j2.inc:93
+#: common/footer.j2.inc:20 common/navigation.j2.inc:89
 #: template/developers.html.j2:24
 msgid "Bibliography"
 msgstr ""
 
-#: common/footer.j2.inc:30
-msgid ""
-"Copyright &copy; <a href=\"ev.html\">GNUnet e.V.</a> 2001 &mdash; 2019. <!-- "
-"This just takes up space no one is interested in: --> <!-- This page was "
-"created using <a href='https://www.gnu.org/'>Free Software</a> only.<br> --> "
-"<a href='https://git.gnunet.org/www.git'>Source code of this site.</a> <a "
-"href='contact.html'>Report issues with this website</a>."
+#: common/footer.j2.inc:31
+msgid "Source code of this site."
+msgstr ""
+
+#: common/footer.j2.inc:32
+msgid "Report issues with this website."
 msgstr ""
 
-#: common/navigation.j2.inc:39 template/index.html.j2:52
+#: common/navigation.j2.inc:38 template/index.html.j2:52
 msgid "About"
 msgstr ""
 
-#: common/navigation.j2.inc:42 template/index.html.j2:377
+#: common/navigation.j2.inc:39 template/index.html.j2:377
 msgid "News"
 msgstr ""
 
-#: common/navigation.j2.inc:47
+#: common/navigation.j2.inc:43
 msgid "Community"
 msgstr ""
 
-#: common/navigation.j2.inc:50 template/index.html.j2:64
+#: common/navigation.j2.inc:46 template/index.html.j2:64
 msgid "Engage"
 msgstr ""
 
-#: common/navigation.j2.inc:51
+#: common/navigation.j2.inc:47
 msgid "GSoC Projects"
 msgstr ""
 
-#: common/navigation.j2.inc:53
+#: common/navigation.j2.inc:49
 msgid "Copyright for Contributors"
 msgstr ""
 
-#: common/navigation.j2.inc:54
+#: common/navigation.j2.inc:50
 msgid "IRC Archive"
 msgstr ""
 
-#: common/navigation.j2.inc:61
+#: common/navigation.j2.inc:57
 msgid "Development"
 msgstr ""
 
-#: common/navigation.j2.inc:64
+#: common/navigation.j2.inc:60
 msgid "System Architecture"
 msgstr ""
 
-#: common/navigation.j2.inc:66 template/gnurl.html.j2:147
+#: common/navigation.j2.inc:62 template/gnurl.html.j2:147
 msgid "Source Code"
 msgstr ""
 
-#: common/navigation.j2.inc:67
+#: common/navigation.j2.inc:63
 msgid "Source Code Documentation"
 msgstr ""
 
-#: common/navigation.j2.inc:72
+#: common/navigation.j2.inc:66
+msgid "Continuous Integration"
+msgstr ""
+
+#: common/navigation.j2.inc:68
 msgid "Development Tutorial"
 msgstr ""
 
-#: common/navigation.j2.inc:83
+#: common/navigation.j2.inc:79
 msgid "Documentation"
 msgstr ""
 
-#: common/navigation.j2.inc:86 template/index.html.j2:58
+#: common/navigation.j2.inc:82 template/index.html.j2:58
 #: template/install.html.j2:6
 msgid "Install"
 msgstr ""
 
-#: common/navigation.j2.inc:87
+#: common/navigation.j2.inc:83
 msgid "Use"
 msgstr ""
 
-#: common/navigation.j2.inc:88
+#: common/navigation.j2.inc:84
 msgid "Videos"
 msgstr ""
 
-#: common/navigation.j2.inc:89 template/glossary.html.j2:6
+#: common/navigation.j2.inc:85 template/glossary.html.j2:6
 msgid "Glossary"
 msgstr ""
 
-#: common/navigation.j2.inc:90
+#: common/navigation.j2.inc:86
 msgid "Handbook"
 msgstr ""
 
-#: common/navigation.j2.inc:91
+#: common/navigation.j2.inc:87
 msgid "REST API"
 msgstr ""
 
-#: common/navigation.j2.inc:92
+#: common/navigation.j2.inc:88
 msgid "FAQ"
 msgstr ""
 
@@ -1615,7 +1610,8 @@ msgid ""
 "html\">install GNUnet</a>, <a href=\"https://gnunet.org/en/use.html\";>use "
 "it</a> and <a href=\"https://gnunet.org/en/engage.html\";>contribute</a>. "
 "<br> Be aware that this project is still in an early alpha stage when it "
-"comes to software &#8211; its not an easy task to rewrite the whole Internet!"
+"comes to software &#8211; it is not an easy task to rewrite the whole "
+"Internet!"
 msgstr ""
 
 #: template/index.html.j2:250
diff --git a/news/2017-10.html.j2 b/news/2017-10.html.j2
index 2cbdc86..104f42f 100644
--- a/news/2017-10.html.j2
+++ b/news/2017-10.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3>2017-10: Launching the new gnunet.org</h3>
+  <h1>2017-10-01: Launching the new gnunet.org</h1>
 <p>
   Welcome to the redesign of gnunet.org, our website about GNUnet.
 </p>
diff --git a/news/2018-06.html.j2 b/news/2018-06.html.j2
index 385df38..35ba036 100644
--- a/news/2018-06.html.j2
+++ b/news/2018-06.html.j2
@@ -1,6 +1,7 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3><a name="gnunet-0.11.0pre66-release">GNUnet 0.11.0pre66</a></h3>
+  <!-- 06/06/2018 -->
+  <h1><a name="gnunet-0.11.0pre66-release">GNUnet 0.11.0pre66</a></h1>
 <p>
   Wed, 06/06/2018 - 07:20 - Christian Grothoff<br>
 </p>
diff --git a/news/2018-07.html.j2 b/news/2018-07.html.j2
index aec38c1..9013d98 100644
--- a/news/2018-07.html.j2
+++ b/news/2018-07.html.j2
@@ -1,7 +1,7 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
   <a name="gnunet-hacker-meeting-2018-2"></a>
-  <h3>Second GNUnet Hacker Meeting 2018 at <a href="https://decentrale.ch/";>La 
D&#233;centrale</a>, Switzerland</h3>
+  <h1>Second GNUnet Hacker Meeting 2018 at <a href="https://decentrale.ch/";>La 
D&#233;centrale</a>, Switzerland</h1>
 
   <p>
     The GNUnet hackers met for the second time this year. The primary goal was 
to squash bugs to bring out a new release. Aside from this we worked hard on 
improving the documentation and to launch this new website.
diff --git a/news/2018-08.html.j2 b/news/2018-08.html.j2
index 64c7755..ea76183 100644
--- a/news/2018-08.html.j2
+++ b/news/2018-08.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3>2018-08: GSoC 2018 - GNUnet Web-based User Interface</h3>
+  <h1>2018-08: GSoC 2018 - GNUnet Web-based User Interface</h1>
 <p>
   Tue, 08/14/2018 - 07:55 - Phil Buschmann 
 </p>
diff --git a/news/2019-0.11.0.html.j2 b/news/2019-0.11.0.html.j2
index 4720737..7f4d9e4 100644
--- a/news/2019-0.11.0.html.j2
+++ b/news/2019-0.11.0.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3><a name="gnunet-0.11.0-release">2019-02: GNUnet 0.11.0 released</a></h3>
+  <h1><a name="gnunet-0.11.0-release">2019-02: GNUnet 0.11.0 released</a></h1>
   <p>
     We are pleased to announce the release of GNUnet 0.11.0.
   </p>
diff --git a/news/2019-0.11.1.html.j2 b/news/2019-0.11.1.html.j2
index 38ff1ed..b4b72c2 100644
--- a/news/2019-0.11.1.html.j2
+++ b/news/2019-0.11.1.html.j2
@@ -1,8 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3>
-    <a name="gnunet-0.11.1-release">2019-04-03: GNUnet 0.11.1 released</a>
-  </h3>
+  <h1><a name="gnunet-0.11.1-release">2019-04-03: GNUnet 0.11.1 
released</a></h1>
 <p>
   We are pleased to announce the release of GNUnet 0.11.1.
 </p>
diff --git a/news/2019-0.11.2.html.j2 b/news/2019-0.11.2.html.j2
index 92e5c30..20e249c 100644
--- a/news/2019-0.11.2.html.j2
+++ b/news/2019-0.11.2.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3><a name="gnunet-0.11.2-release">2019-04-04: GNUnet 0.11.2 
released</a></h3>
+  <h1><a name="gnunet-0.11.2-release">2019-04-04: GNUnet 0.11.2 
released</a></h1>
 <p>
   We are pleased to announce the release of GNUnet 0.11.2.
 </p>
diff --git a/news/2019-0.11.3.html.j2 b/news/2019-0.11.3.html.j2
index e13350c..62fd5e8 100644
--- a/news/2019-0.11.3.html.j2
+++ b/news/2019-0.11.3.html.j2
@@ -1,8 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3>
-    <a name="gnunet-0.11.3-release">2019-04-07: GNUnet 0.11.3 released</a>
-  </h3>
+  <h1><a name="gnunet-0.11.3-release">2019-04-07: GNUnet 0.11.3 
released</a></h1>
 <p>
   We are pleased to announce the release of GNUnet 0.11.3.
 </p>
diff --git a/news/2019-0.11.4.html.j2 b/news/2019-0.11.4.html.j2
index 6b30c73..3960e60 100644
--- a/news/2019-0.11.4.html.j2
+++ b/news/2019-0.11.4.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3><a name="gnunet-0.11.4-release">2019-05-12: GNUnet 0.11.4 
released</a></h3>
+  <h1><a name="gnunet-0.11.4-release">2019-05-12: GNUnet 0.11.4 
released</a></h1>
 <p>
   We are pleased to announce the release of GNUnet 0.11.4.
 </p>
diff --git a/news/2019-0.11.5.html.j2 b/news/2019-0.11.5.html.j2
index 6599878..d41f372 100644
--- a/news/2019-0.11.5.html.j2
+++ b/news/2019-0.11.5.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3><a name="gnunet-0.11.5-release">2019-06-05: GNUnet 0.11.5 
released</a></h3>
+  <h1><a name="gnunet-0.11.5-release">2019-06-05: GNUnet 0.11.5 
released</a></h1>
 <p>
   We are pleased to announce the release of GNUnet 0.11.5.
 </p>
diff --git a/news/2019-0.11.6.html.j2 b/news/2019-0.11.6.html.j2
index 6de335f..c00cd31 100644
--- a/news/2019-0.11.6.html.j2
+++ b/news/2019-0.11.6.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3><a name="gnunet-0.11.6-release">2019-07-24: GNUnet 0.11.6 
released</a></h3>
+  <h1><a name="gnunet-0.11.6-release">2019-07-24: GNUnet 0.11.6 
released</a></h1>
 <p>
   We are pleased to announce the release of GNUnet 0.11.6.
 </p>
diff --git a/news/2019-0.11.7.html.j2 b/news/2019-0.11.7.html.j2
index 85ccb33..308ff42 100644
--- a/news/2019-0.11.7.html.j2
+++ b/news/2019-0.11.7.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3><a name="gnunet-0.11.7-release">2019-10-27: GNUnet 0.11.7 
released</a></h3>
+  <h1><a name="gnunet-0.11.7-release">2019-10-27: GNUnet 0.11.7 
released</a></h1>
 <p>
   We are pleased to announce the release of GNUnet 0.11.7.
 </p>
diff --git a/news/2019-0.11.8.html.j2 b/news/2019-0.11.8.html.j2
index 60c54ea..370fa09 100644
--- a/news/2019-0.11.8.html.j2
+++ b/news/2019-0.11.8.html.j2
@@ -1,8 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3>
-    <a name="gnunet-0.11.8-release">2019-10-30: GNUnet 0.11.8 released</a>
-  </h3>
+  <h1><a name="gnunet-0.11.8-release" title="0.11.8">2019-10-30: GNUnet 0.11.8 
released</a></h1>
 <p>
   We are pleased to announce the release of GNUnet 0.11.8.
 </p>
diff --git a/news/2019-02.html.j2 b/news/2019-02.html.j2
index 8c85c54..33fede7 100644
--- a/news/2019-02.html.j2
+++ b/news/2019-02.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3><a NAME="gsoc2019"></a><a href="gsoc.html">2019-02: Topics for GSoC 
2019</a></h3>
+  <h1><a NAME="gsoc2019"></a><a href="{{ url_localized('gsoc.html') 
}}">2019-02: Topics for GSoC 2019</a></h1>
 <p>
   GNUnet is participating in the Google Summer of Code again through GNU. If 
you are interested in any of these projects, reach out to us!</p>
 <section>
diff --git a/news/2019-06-DSTJ.html.j2 b/news/2019-06-DSTJ.html.j2
index a8f8f0b..b88ab74 100644
--- a/news/2019-06-DSTJ.html.j2
+++ b/news/2019-06-DSTJ.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3><a name="DSTJ">2019-06-28: Peer DSTJ is dead, long live peer 
Y924</a></h3>
+  <h1><a name="DSTJ">2019-06-28: Peer DSTJ is dead, long live peer 
Y924</a></h1>
 <p>
   After some issues with our infrastructure we needed to replace our 
bootstrapping peer. To avoid problems when connecting to GNUnet the operator of 
a peer needs to update its node by removing the peer ID 
<tt>DSTJBRRKZ8TBW3FGK6B0M5QXWT9WYNZ45H5MCV4HY7ST64Q8T9F0</tt> from the system. 
Here are two strategies to find copies of the respective file:
 </p>
diff --git a/news/2019-06.html.j2 b/news/2019-06.html.j2
index b031034..1e549cb 100644
--- a/news/2019-06.html.j2
+++ b/news/2019-06.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3>2019-06-28: GNUnet Hacker Meeting 2019 at <a 
href="https://decentrale.ch";>La D&#233;centrale, Switzerland</a></h3>
+  <h1>2019-06-28: GNUnet Hacker Meeting 2019 at <a 
href="https://decentrale.ch";>La D&#233;centrale, Switzerland</a></h1>
   <p>
     The members of the GNUnet community met again in the wonderful 
souroundings of St. Imier to hack on GNUnet. New people joined our sessions 
until late at night. From bug squashing to digging our own dog food, from 
workshops to theoretical discussions of new services and usecases. And of 
course, pizza was in the game. 
   </p>
diff --git a/news/2019-07-GHM_Aug_2019.html.j2 
b/news/2019-07-GHM_Aug_2019.html.j2
index ff3536f..d9c72fc 100644
--- a/news/2019-07-GHM_Aug_2019.html.j2
+++ b/news/2019-07-GHM_Aug_2019.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3>2019-07-17: GNUnet Hacker Meeting in August 2019 at <a 
href="https://";>Wernsdort (near Berlin)</a></h3>
+  <h1>2019-07-17: GNUnet Hacker Meeting in August 2019 at <a 
href="https://";>Wernsdort (near Berlin)</a></h1>
   <p>
     In August 2019, some of us met in Wernsdorf for focused work on GNUnet.
   </p>
diff --git a/news/2019-10-GNSSpec1.html.j2 b/news/2019-10-GNSSpec1.html.j2
index cdf34f9..5b79546 100644
--- a/news/2019-10-GNSSpec1.html.j2
+++ b/news/2019-10-GNSSpec1.html.j2
@@ -1,8 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3>
-    <a name="gnunet-lsd001-p1">2019-10-04: GNS Technical Specification 
Milestone 1/4</a>
-  </h3>
+  <h1><a name="gnunet-lsd001-p1">2019-10-04: GNS Technical Specification 
Milestone 1/4</a></h1>
 <p>
   We are happy to announce the completion of the first milestone for the GNS 
Specification. The objective is to provide a detailed and comprehensive guide 
for implementors of the GNU Name System. The initial milestone consists of 
documenting the cryptographic principles of GNS data structures. This includes 
the specification of the GNS record wire and serialization formats as well as 
internationalization.<br>
   <i>NOTE: The currently specified protocol is planned to be implemented for 
GNUnet 0.12. The current GNS implementation (0.11) exhibits minor but 
compatibility breaking deviations from this specification.</i> The draft 
specification <b>LSD001</b> can be found at:
diff --git a/news/2019-10-ICANNPanel.html.j2 b/news/2019-10-ICANNPanel.html.j2
index 8ff5c56..41205f9 100644
--- a/news/2019-10-ICANNPanel.html.j2
+++ b/news/2019-10-ICANNPanel.html.j2
@@ -1,6 +1,6 @@
 {% extends "common/news.j2" %}
 {% block body_content %}
-  <h3><a name="gnunet-icann-gns">2019-10-20: GNUnet project invited to 
ICANN66</a></h3>
+  <h1><a name="gnunet-icann-gns">2019-10-20: GNUnet project invited to 
ICANN66</a></h1>
 <p>
   We are delighted to announce that ICANN has invited the GNUnet project to 
speak at the <a href="https://meetings.icann.org/en/montreal66";>next ICANN 
Annual General Meeting</a>. We have been invited to join a panel discussion on 
<i>Emerging Internet Identifier Technologies</i> in order to share our ideas 
and work on the <i>GNU Name System (GNS)</i>. ICANN generously offered to cover 
travel and accomodation.
 </p>
diff --git a/news/index.html.j2 b/news/index.html.j2
index 582866f..df34051 100644
--- a/news/index.html.j2
+++ b/news/index.html.j2
@@ -8,24 +8,33 @@
   <div class="container">
     <article>
       <section>
+        <p>
+          News posts published by GNUnet about changes related to
+          GNUnet, releases, and events.
+        </p>
         <!-- TODO: This list should be generated -->
         <ul>
-          <li><a href="2019-0.11.8.html" title="0.11.8">0.11.8</a></li>
-          <li><a href="2019-0.11.7.html" title="0.11.7">0.11.7</a></li>
-          <li><a href="2019-10-ICANNPanel.html" title="ICANN Panel">ICANN 
Panel</a></li>
-          <li><a href="2019-10-GNSSpec1.html" title="GNS Spec 1">GNS Spec 
1</a></li>
-          <li><a href="2019-0.11.6.html" title="0.11.6">0.11.6</a></li>
-          <li><a href="2019-07-GHM_Aug_2019.html" title="GNUnet Hacker 
Meeting">GNUnet Hacker Meeting 2019</a></li>
-          <li><a href="2019-06-DSTJ.html" title="DSTJ">DSTJ</a></li>
-          <li><a href="2019-06.html" title="2019-06">2019-06</a></li>
-          <li><a href="2019-0.11.5.html" title="0.11.5">0.11.5</a></li>
-          <li><a href="2019-0.11.4.html" title="0.11.4">0.11.4</a></li>
-          <li><a href="2019-0.11.3.html" title="0.11.3">0.11.3</a></li>
-          <li><a href="2019-0.11.2.html" title="0.11.2">0.11.2</a></li>
-          <li><a href="2019-0.11.1.html" title="0.11.1">0.11.1</a></li>
-          <li><a href="2019-0.11.0.html" title="0.11.0">0.11.0</a></li>
-          <li><a href="2019-02.html" title="2019-02">2019-02</a></li>
+          {% for item in newsdata %}
+            <li><a href='{{ item["page"] }}' title='{{ item["date"]}}'>{{ 
item["title"] }}</a></li>
+          {% endfor %}
         </ul>
+        <!--
+          <li><a href="2019-0.11.8.html" title="2019-10-30">GNUnet 
0.11.8</a></li>
+        <li><a href="2019-0.11.7.html" title="2019-10-27">GNUnet 
0.11.7</a></li>
+        <li><a href="2019-10-ICANNPanel.html" title="2019-10-20">ICANN 
Panel</a></li>
+        <li><a href="2019-10-GNSSpec1.html" title="2019-10-04">GNS Spec 
1</a></li>
+        <li><a href="2019-0.11.6.html" title="2019-07-24">GNUnet 
0.11.6</a></li>
+        <li><a href="2019-07-GHM_Aug_2019.html" title="2019-07-17">GNUnet 
Hacker Meeting 2019</a></li>
+        <li><a href="2019-06-DSTJ.html" title="2019-06-28">DSTJ</a></li>
+        <li><a href="2019-06.html" title="2019-06-01">2019-06</a></li>
+        <li><a href="2019-0.11.5.html" title="2019-06-05">GNUnet 
0.11.5</a></li>
+        <li><a href="2019-0.11.4.html" title="2019-05-12">GNUnet 
0.11.4</a></li>
+        <li><a href="2019-0.11.3.html" title="2019-04-07">GNUnet 
0.11.3</a></li>
+        <li><a href="2019-0.11.2.html" title="2019-04-04">GNUnet 
0.11.2</a></li>
+        <li><a href="2019-0.11.1.html" title="2019-04-03">GNUnet 
0.11.1</a></li>
+        <li><a href="2019-0.11.0.html" title="2019-02-28">GNUnet 
0.11.0</a></li>
+        <li><a href="2019-02.html" title="2019-02-01">2019-02</a></li>
+        -->
       </section>
     </article>
   </div>
diff --git a/rssg b/rssg
new file mode 100755
index 0000000..4435ce6
--- /dev/null
+++ b/rssg
@@ -0,0 +1,191 @@
+#!/bin/sh
+#
+# https://www.romanzolotarev.com/bin/rssg
+# Copyright 2018 Roman Zolotarev <address@hidden>
+# Copyright 2019 ng0 <address@hidden>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+set -e
+
+
+main () {
+       test -n "$1" || usage
+       test -n "$2" || usage
+       test -f "$1" || no_file "$1"
+
+
+       index_file=$(readlink -f "$1")
+       test -z "${index_file##*html}" && html=$(cat "$index_file")
+       test -z "${index_file##*md}" && html=$(md_to_html "$index_file")
+       test -n "$html" || usage
+
+       base="${index_file%/*}"
+       base_url="$(echo "$html" | get_url | sed 's#\(.*\)/[^/]*#\1#')"
+
+       url=$(          echo "$html" | get_url)
+
+       title="$2"
+
+       description=$(  echo "$html" | get_description |
+                       remove_tags |
+                       remove_nbsp )
+
+       items=$(        echo "$html" | get_items)
+
+       rss=$(          echo "$items" |
+                       render_items "$base" "$base_url" |
+                       render_feed "$url" "$title" "$description")
+
+       >&2 echo "[rssg] ${index_file##$(pwd)/} $(echo "$rss" | grep -c 
'<item>') items"
+       echo "$rss"
+}
+
+
+usage() {
+       echo "usage: ${0##*/} index.{html,md} title > rss.xml" >&2
+       exit 1
+}
+
+
+no_file() {
+       echo "${0##*/}: $1: No such file" >&2
+       exit 2
+}
+
+
+md_to_html() {
+       test -x "$(which lowdown)" || exit 3
+       lowdown \
+       -D html-skiphtml \
+       -D smarty \
+       -d metadata \
+       -d autolink "$1"
+}
+
+
+get_title() {
+       awk 'tolower($0)~/^<h1/{gsub(/<[^>]*>/,"",$0);print;exit}'
+}
+
+
+get_url() {
+       grep -i '<a .*rss.xml"' | head -1 |
+       sed 's#.*href="\(.*\)".*#\1#'
+}
+
+
+get_items() {
+       grep -i 'href=".*" title="' |
+       sed 's#.*href="\(.*\)" title="\(.*\)">\(.*\)</a>.*#\1 \2 \3#'
+}
+
+
+get_description() {
+       start='sub("^.*<"s"*"t"("s"[^>]*)?>","")'
+       stop='sub("</"s"*"t""s"*>.*","")&&x=1'
+       awk -v 's=[[:space:]]' -v 't=[Pp]' "$start,$stop;x{exit}"
+}
+
+remove_tags() {
+       sed 's#<[^>]*>##g;s#</[^>]*>##g'
+}
+
+
+remove_nbsp() {
+       sed 's#\&nbsp;# #g'
+}
+
+
+rel_to_abs_urls() {
+       site_url="$1"
+       base_url="$2"
+
+       abs='s#(src|href)="/([^"]*)"#\1="'"$site_url"/'\2"#g'
+       rel='s#(src|href)="([^:/"]*)"#\1="'"$base_url"/'\2"#g'
+       sed -E "$abs;$rel"
+}
+
+
+date_rfc_822() {
+       date -j '+%a, %d %b %Y %H:%M:%S %z' \
+       "$(echo "$1"| tr -cd '[:digit:]')0000"
+}
+
+
+render_items() {
+       while read -r i
+       do render_item "$1" "$2" "$i"
+       done
+}
+
+
+render_item() {
+       base="$1"
+       base_url="$2"
+       item="$3"
+
+       site_url="$(echo "$base_url"| sed 's#\(.*//.*\)/.*#\1#')"
+
+       date=$(echo "$item"|awk '{print$2}')
+
+       url=$(echo "$item"|awk '{print$1}')
+
+       f="$base/$url"
+       test -f "$f" && html=$(cat "$f")
+       test -f "${f%\.html}.md" && html=$(md_to_html "${f%\.html}.md")
+
+       description=$(
+               echo "$html" |
+               rel_to_abs_urls "$site_url" "$base_url" |
+               remove_nbsp | awk '/<!--BEGIN-->/,/<!--END-->/'
+       )
+       title=$(echo "$description" | get_title)
+       guid="$base_url/$(echo "$url" | sed 's#^/##')"
+
+       echo '
+<item>
+<guid>'"$guid"'</guid>
+<link>'"$guid"'</link>
+<pubDate>'"$(date_rfc_822 "$date")"'</pubDate>
+<title>'"$title"'</title>
+<description><![CDATA[
+
+'"$description"'
+
+]]></description>
+</item>'
+}
+
+
+render_feed() {
+       url="$1"
+       title=$(echo "$2" | remove_nbsp)
+       description="$3"
+
+       base_url="$(echo "$url" | cut -d '/' -f1-3)"
+
+       echo '<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom";>
+<channel>
+<atom:link href="'"$url"'" rel="self" type="application/rss+xml" />
+<title>'"$title"'</title>
+<description>'"$description"'</description>
+<link>'"$base_url"'/</link>
+<lastBuildDate>'"$(date_rfc_822 date)"'</lastBuildDate>
+'"$(cat)"'
+</channel></rss>'
+}
+
+
+main "$@"
diff --git a/template.py b/template.py
index 94dac8c..a5b3119 100755
--- a/template.py
+++ b/template.py
@@ -19,7 +19,7 @@
 #
 # We import unicode_literals until people have understood how unicode
 # with bytes and strings changed in python2->python3.
-from __future__ import unicode_literals
+# from __future__ import unicode_literals
 import os
 import os.path
 import sys
@@ -29,6 +29,8 @@ import glob
 import codecs
 import jinja2
 import i18nfix
+from pathlib import Path
+import hashlib
 
 # TODO: Turn repetition into a class.
 
@@ -51,93 +53,312 @@ langs_full = {
     "de": "Deutsch"
 }
 
-for in_file in glob.glob("template/*.j2"):
-    name, ext = re.match(r"(.*)\.([^.]+)$", in_file.rstrip(".j2")).groups()
-    tmpl = env.get_template(in_file)
+# A construction has:
+# symlinks (dict)
+# staticfiles (dict)
+# robot.txt files (list)
+# locales (list)
+# shells out to siteindex (todo: python siteindex)
+# generation_directories: the one we are building right now
+#                         the one we will be replacing
+#                         other directories get trashed upon successful build
 
-    def self_localized(other_locale):
-        """
-        Return URL for the current page in another locale.
-        """
-        return "../" + other_locale + "/" + in_file.replace('template/',
-                                                            '').rstrip(".j2")
+symlinks = {
+    "frontpage.html": "frontpage",
+    "gsoc.html": "gsoc",
+    "about.html": "philosophy",
+    "gns.html": "gns",
+    "node/about.html": "397"
+}
 
-    def url_localized(filename):
-        return "../" + locale + "/" + filename
+# Mostly from static/ to rendered/
+staticfiles = {
+    "favicon.ico": "favicon.ico",
+    "moved.html": "frontpage.html",
+    "robots.txt": ["static", "dist", list(langs_full)],
+    "moved_gsoc.html": "gsoc.html",
+    "moved_about.html": "about.html",
+    "moved_gns.html": "gns.html"
+}
 
-    def svg_localized(filename):
-        lf = filename + "." + locale + ".svg"
-        if locale == "en" or not os.path.isfile(lf):
-            return "../" + filename + ".svg"
+
+def localized(filename, locale, *args):
+    if len(args) == 0:
+        return "../" + locale + "/" + filename
+    ext = kwargs.get('ext', None)
+    if ext is not None:
+        lf = filename + "." + locale + "." + ext
+        lp = Path(lf)
+        if locale == "en" or not lp.is_file():
+            return "../" + filename + "." + ext
         else:
             return "../" + lf
 
-    def url(x):
-        # TODO: look at the app root environment variable
-        # TODO: check if file exists
-        return "../" + x
 
-    for l in glob.glob("locale/*/"):
-        locale = os.path.basename(l[:-1])
+def fileop(infile, outfile, action):
+    """
+    infile: inputfile, Path object
+    outfile: outputfile, Path object
+    action: action if any, String
+    """
+    i = Path(infile)
+    o = Path(outfile)
+    outdir = Path("rendered")
+    if i.is_file() is not False:
+        if action == "copy":
+            # Write content of i to o.
+            o.write_text(i.read_text())
+        if action == "link":
+            o.symlink_to(i)
 
-        tr = gettext.translation("messages",
-                                 localedir="locale",
-                                 languages=[locale])
 
-        tr.gettext = i18nfix.wrap_gettext(tr.gettext)
+def write_name(filename, infile, locale, replacer):
+    return "./rendered/" + locale + "/" + infile.replace(replacer,
+                                                         '').rstrip(".j2")
 
-        env.install_gettext_translations(tr, newstyle=True)
 
-        content = tmpl.render(lang=locale,
-                              lang_full=langs_full[locale],
-                              url=url,
-                              self_localized=self_localized,
-                              url_localized=url_localized,
-                              svg_localized=svg_localized,
-                              filename=name + "." + ext)
-        out_name = "./rendered/" + locale + "/" + in_file.replace(
-            'template/', '').rstrip(".j2")
-        os.makedirs("./rendered/" + locale, exist_ok=True)
-        with codecs.open(out_name, "w", encoding='utf-8') as f:
-            f.write(content)
+def sha256sum(_):
+    sha256 = hashlib.sha256()
+    with io.open(_, mode="rb") as fd:
+        content = fd.read()
+        sha256.update(content)
+    return sha256.hexdigest()
 
 
-for in_file in glob.glob("news/*.j2"):
-    name, ext = re.match(r"(.*)\.([^.]+)$", in_file.rstrip(".j2")).groups()
-    tmpl = env.get_template(in_file)
+def walksum(_):
+    sha256 = hashlib.sha256()
+    x = Path(_)
+    if not x.exists():
+        return -1
+    try:
+        for root, directories, files in os.walk(_):
+            for names in sorted(files):
+                filepath = os.path.join(root, names)
+                try:
+                    fl = open(filepath, 'rb')
+                except:
+                    fl.close()
+                    continue
+                while 1:
+                    buf = fl.read(4096)
+                    if not buf:
+                        break
+                    sha256.update(hashlib.sha256(buf).hexdigest())
+                fl.close()
+    except:
+        import traceback
+        traceback.print_exc()
+        return -2
+    return sha256.hexdigest()
 
-    def self_localized(other_locale):
-        """
-        Return URL for the current page in another locale.
-        """
-        return "../" + other_locale + "/" + in_file.replace('news/',
-                                                            '').rstrip(".j2")
 
-    def url_localized(filename):
-        return "../" + locale + "/" + filename
-
-    def svg_localized(filename):
-        lf = filename + "." + locale + ".svg"
-        if locale == "en" or not os.path.isfile(lf):
-            return "../" + filename + ".svg"
+def rm_rf(directory):
+    directory = Path(directory)
+    for child in directory.glob('*'):
+        if child.is_file():
+            child.unlink()
         else:
-            return "../" + lf
+            rm_rf(child)
+    directory.rmdir()
+
+
+# This generates and switches sites generations, preventing
+# in-place modification of the website.
+# * save old generation directory name
+# * jinja2 creates content in "rendered" (happened before calling this 
function)
+# * calculate sum of "rendered"
+# * move "rendered" to out/$sum
+# * remove symlink "html_dir"
+# * symlink out/$sum to "html_dir"
+# * delete old generation directory
+def generation_dir(htmldir):
+    oldgen = Path(htmldir).resolve()
+    # precondition: jinja2 has created the files in "rendered".
+    newgen = Path("rendered")
+    newgen_sum = walksum(newgen)
+    outdir = Path("out")
+    outdir.mkdir(parents=True, exist_ok=True)
+    newgen_target = Path("out") / newgen_sum
+    newgen.rename(newgen_target)
+    html = Path(htmldir)
+    html.unlink()
+    fileop(newgen, html, "link")
+    rm_rf(oldgen)
+
+
+def copy_static (locale, indict):
+    for key, value in indict.items():
+        print(locale + "/" + key + " ...to... " + locale + "/" + value)
+#    fileop(in, out, "copy")
+
+# At this moment in time, constructing this list dynamically would be
+# too much pointless code. In fact all of what we use in jinja is
+# no real use of jinja yet and furthermore we would be better off
+# just using static html + css + some awk and other base tools.
+newsposts = [
+    {'page': '2019-0.11.8.html', 'date': '2019-10-30', 'title': 'GNUnet 
0.11.8'},
+    {'page': '2019-0.11.7.html', 'date': '2019-10-27', 'title': 'GNUnet 
0.11.7'},
+    {'page': '2019-10-ICANNPanel.html', 'date': '2019-10-20', 'title': 'ICANN 
Panel'},
+    {'page': '2019-10-GNSSpec1.html', 'date': '2019-10-04', 'title': 'GNS Spec 
1'},
+    {'page': '2019-0.11.6.html', 'date': '2019-07-24', 'title': 'GNUnet 
0.11.6'},
+    {'page': '2019-07-GHM_Aug_2019.html', 'date': '2019-07-17', 'title': 
'GNUnet Hacker Meeting 2019'},
+    {'page': '2019-06-DSTJ.html', 'date': '2019-06-28', 'title': 'DSTJ'},
+    {'page': '2019-0.11.5.html', 'date': '2019-06-05', 'title': 'GNUnet 
0.11.5'},
+    {'page': '2019-06.html', 'date': '2019-06-01', 'title': '2019-06'},
+    {'page': '2019-0.11.4.html', 'date': '2019-05-12', 'title': 'GNUnet 
0.11.4'},
+    {'page': '2019-0.11.3.html', 'date': '2019-04-07', 'title': 'GNUnet 
0.11.3'},
+    {'page': '2019-0.11.2.html', 'date': '2019-04-04', 'title': 'GNUnet 
0.11.2'},
+    {'page': '2019-0.11.1.html', 'date': '2019-04-03', 'title': 'GNUnet 
0.11.1'},
+    {'page': '2019-0.11.0.html', 'date': '2019-02-28', 'title': 'GNUnet 
0.11.0'},
+    {'page': '2019-02.html', 'date': '2019-02-01', 'title': 'Google Summer of 
Code 2019'},
+]
+
+
+def generate_site(root):
+    for in_file in glob.glob(root + "/*.j2"):
+        name, ext = re.match(r"(.*)\.([^.]+)$", in_file.rstrip(".j2")).groups()
+        tmpl = env.get_template(in_file)
+
+        def self_localized(other_locale):
+            """
+            Return URL for the current page in another locale.
+            """
+            return "../" + other_locale + "/" + in_file.replace(
+                root + '/', '').rstrip(".j2")
+
+        def url_localized(filename):
+            if root == "news":
+                return "../../" + locale + "/" + filename
+            else:
+                return "../" + locale + "/" + filename
+
+        def url_static (filename):
+            if root == "news":
+                return "../../static/" + filename
+            else:
+                return "../static/" + filename
+
+        def url_dist (filename):
+            if root == "news":
+                return "../../dist/" + filename
+            else:
+                return "../dist/" + filename
+
+        def svg_localized(filename):
+            lf = filename + "." + locale + ".svg"
+            if locale == "en" or not os.path.isfile(lf):
+                return "../" + filename + ".svg"
+            else:
+                return "../" + lf
+
+        def url(x):
+            # TODO: look at the app root environment variable
+            # TODO: check if file exists
+            #if root == "news":
+            #    return "../" + "../" + x
+            #else:
+            #    return "../" + x
+            return "../" + x
+
+
+        for l in glob.glob("locale/*/"):
+            locale = os.path.basename(l[:-1])
+
+            tr = gettext.translation("messages",
+                                     localedir="locale",
+                                     languages=[locale])
+
+            tr.gettext = i18nfix.wrap_gettext(tr.gettext)
+
+            env.install_gettext_translations(tr, newstyle=True)
+
+            content = tmpl.render(lang=locale,
+                                  lang_full=langs_full[locale],
+                                  url=url,
+                                  newsdata=newsposts,
+                                  self_localized=self_localized,
+                                  url_localized=url_localized,
+                                  url_static=url_static,
+                                  url_dist=url_dist,
+                                  svg_localized=svg_localized,
+                                  filename=name + "." + ext)
+
+            if root == "news":
+                out_name = "./rendered/" + locale + "/" + root + "/" + 
in_file.replace(
+                    root + '/', '').rstrip(".j2")
+            else:
+                out_name = "./rendered/" + locale + "/" + in_file.replace(
+                    root + '/', '').rstrip(".j2")
+
+            outdir = Path("rendered")
+
+            if root == "news":
+                langdir = outdir / locale / root
+            else:
+                langdir = outdir / locale
+
+            langdir.mkdir(parents=True, exist_ok=True)
+            # os.makedirs("./rendered/" + locale, exist_ok=True)
+            with codecs.open(out_name, "w", encoding='utf-8') as f:
+                f.write(content)
+
+
+def main():
+    # rm_rf("rendered")
+    print("generating template")
+    generate_site("template")
+    print("generating news")
+    generate_site("news")
+#    for l in glob.glob("locale/*/"):
+#        locale = os.path.basename(l[:-1])
+#        copy_static (locale, staticfiles)
+    # generate_rss
+    #print("running generation")
+    #generation_dir
+
+
+if __name__ == "__main__":
+    main()
+
+# for in_file in glob.glob("news/*.j2"):
+#     name, ext = re.match(r"(.*)\.([^.]+)$", in_file.rstrip(".j2")).groups()
+#     tmpl = env.get_template(in_file)
+
+#     def self_localized(other_locale):
+#         """
+#         Return URL for the current page in another locale.
+#         """
+#         return "../" + other_locale + "/" + in_file.replace('news/',
+#                                                             '').rstrip(".j2")
+
+#     def url_localized(filename):
+#         return "../" + locale + "/" + filename
+
+#     def svg_localized(filename):
+#         lf = filename + "." + locale + ".svg"
+#         if locale == "en" or not os.path.isfile(lf):
+#             return "../" + filename + ".svg"
+#         else:
+#             return "../" + lf
+
+#     def url(x):
+#         # TODO: look at the app root environment variable
+#         # TODO: check if file exists
+#         return "../" + x
 
-    def url(x):
-        # TODO: look at the app root environment variable
-        # TODO: check if file exists
-        return "../" + x
-
-    for f in glob.glob("locale/*/"):
-        locale = os.path.basename(f[:-1])
-        content = tmpl.render(lang=locale,
-                              lang_full=langs_full[locale],
-                              url=url,
-                              self_localized=self_localized,
-                              url_localized=url_localized,
-                              svg_localized=svg_localized,
-                              filename=name + "." + ext)
-        out_name = "./rendered/" + locale + "/news/" + 
in_file.replace('news/', '').rstrip(".j2")
-        os.makedirs("./rendered/" + locale + "/news/", exist_ok=True)
-        with codecs.open(out_name, "w", encoding='utf-8') as f:
-            f.write(content)
+#     for f in glob.glob("locale/*/"):
+#         locale = os.path.basename(f[:-1])
+#         content = tmpl.render(lang=locale,
+#                               lang_full=langs_full[locale],
+#                               url=url,
+#                               self_localized=self_localized,
+#                               url_localized=url_localized,
+#                               svg_localized=svg_localized,
+#                               filename=name + "." + ext)
+#         out_name = "./rendered/" + locale + "/news/" + 
in_file.replace('news/', '').rstrip(".j2")
+#         outdir = Path("rendered")
+#         langdir = outdir / locale / "news"
+#         langdir.mkdir(parents=True, exist_ok=True)
+#         # os.makedirs("./rendered/" + locale + "/news/", exist_ok=True)
+#         with codecs.open(out_name, "w", encoding='utf-8') as f:
+#             f.write(content)
diff --git a/template/index.html.j2 b/template/index.html.j2
index 945435d..8db599a 100644
--- a/template/index.html.j2
+++ b/template/index.html.j2
@@ -232,7 +232,7 @@
        <a href="https://gnunet.org/en/use.html";>use it</a> and 
        <a href="https://gnunet.org/en/engage.html";>contribute</a>. <br>
        Be aware that this project is still in an early alpha stage when it 
comes 
-       to software &#8211; its not an easy task to rewrite the whole Internet!
+       to software &#8211; it is not an easy task to rewrite the whole 
Internet!
           {% endtrans %}
         </p>
         </section>
@@ -379,7 +379,17 @@
   </div>
   <div class="row">
     <div class="col-lg-12">
-      Read our recent news postings <a href="news/index.html">here</a>.
+      <p>
+        Recent Posts:
+      </p>
+      <ul>
+        {% for item in newsdata[:4] %}
+          <li><a href='news/{{ item["page"] }}' title='{{ item["date"]}}'>{{ 
item["title"] }}</a></li>
+        {% endfor %}
+      </ul>
+    </div>
+    <div class="col-lg-12">
+      Read more of our recent news postings <a href="news/index.html">here</a>.
     </div>
   </div>
 </div> <!-- /container -->

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]