[tor-commits] [metrics-web/master] Apply new design to news page.

karsten at torproject.org karsten at torproject.org
Mon Jan 9 17:03:42 UTC 2017


commit ddf4786e3887a3ef24a0df043de6e3ebf4e69935
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Tue Dec 20 22:47:50 2016 +0100

    Apply new design to news page.
---
 website/etc/news.json                              |  8 +--
 .../src/org/torproject/metrics/web/AnyServlet.java | 26 +++++++
 .../org/torproject/metrics/web/IndexServlet.java   | 16 +----
 .../org/torproject/metrics/web/NewsServlet.java    | 30 ++++----
 website/web/WEB-INF/news.jsp                       | 81 +++++++---------------
 5 files changed, 76 insertions(+), 85 deletions(-)

diff --git a/website/etc/news.json b/website/etc/news.json
index f9df721..8661afe 100644
--- a/website/etc/news.json
+++ b/website/etc/news.json
@@ -203,7 +203,7 @@
     "protocols": [
       "obfs3"
     ],
-    "description": "Default obfs3 bridges \"Unnamed\" and \"Unnamed\" (fingerprint <a href=\"https://atlas.torproject.org/#details/AF9F66B7B04F8FF6F32D455F05135250A16543C9\">AF9F66B7B04F8FF6F32D455F05135250A16543C9</a>) upgrade and begin reporting statistics to the new bridge authority Bifroest.",
+    "description": "Default obfs3 bridges \"Unnamed\" and \"Unnamed\" (fingerprint <a href=\"https://atlas.torproject.org/#details/AF9F66B7B04F8FF6F32D455F05135250A16543C9\" target=\"_blank\">AF9F66B7B04F8FF6F32D455F05135250A16543C9</a>) upgrade and begin reporting statistics to the new bridge authority Bifroest.",
     "links": []
   },
   {
@@ -305,7 +305,7 @@
     "protocols": [
       "obfs4"
     ],
-    "description": "Default obfs4 bridges ndnop3 and ndnop5 turn on timing obfuscation (`iat-mode`).",
+    "description": "Default obfs4 bridges ndnop3 and ndnop5 turn on timing obfuscation (<code>iat-mode</code>).",
     "links": [
       "<a href=\"https://lists.torproject.org/pipermail/tor-project/2016-November/000780.html\">mailing list post</a>",
       "<a href=\"https://bugs.torproject.org/20837\">ticket</a>"
@@ -316,7 +316,7 @@
     "protocols": [
       "obfs4"
     ],
-    "description": "Default obfs4 bridge <a href=\"https://atlas.torproject.org/#details/D9C805C955CB124D188C0D44F271E9BE57DE2109\">Lisbeth</a> turns on timing obfuscation (`iat-mode=1`).",
+    "description": "Default obfs4 bridge <a href=\"https://atlas.torproject.org/#details/D9C805C955CB124D188C0D44F271E9BE57DE2109\" target=\"_blank\">Lisbeth</a> turns on timing obfuscation (<code>iat-mode=1</code>).",
     "links": [
       "<a href=\"https://bugs.torproject.org/20837\">ticket</a>"
     ]
@@ -327,7 +327,7 @@
     "protocols": [
       "obfs3"
     ],
-    "description": "Outage of default obfs3 bridges \"Unnamed\" and \"Unnamed\" (fingerprint <a href=\"https://atlas.torproject.org/#details/AF9F66B7B04F8FF6F32D455F05135250A16543C9\">AF9F66B7B04F8FF6F32D455F05135250A16543C9</a>). (Start date not known for sure, though it must have been after 2016-09-23; discussed in non-archived tor-team email.)",
+    "description": "Outage of default obfs3 bridges \"Unnamed\" and \"Unnamed\" (fingerprint <a href=\"https://atlas.torproject.org/#details/AF9F66B7B04F8FF6F32D455F05135250A16543C9\" target=\"_blank\">AF9F66B7B04F8FF6F32D455F05135250A16543C9</a>). (Start date not known for sure, though it must have been after 2016-09-23; discussed in non-archived tor-team email.)",
     "links": []
   },
   {
diff --git a/website/src/org/torproject/metrics/web/AnyServlet.java b/website/src/org/torproject/metrics/web/AnyServlet.java
new file mode 100644
index 0000000..696a3be
--- /dev/null
+++ b/website/src/org/torproject/metrics/web/AnyServlet.java
@@ -0,0 +1,26 @@
+package org.torproject.metrics.web;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+
+public abstract class AnyServlet extends HttpServlet {
+
+  private static final long serialVersionUID = -3670417319698456329L;
+
+  protected List<String[]> categories;
+
+  @Override
+  public void init() throws ServletException {
+    List<String[]> categories = new ArrayList<String[]>();
+    for (Category category :
+        ContentProvider.getInstance().getCategoriesList()) {
+      categories.add(new String[] {
+          category.getMetrics().isEmpty() ? "" : category.getMetrics().get(0),
+          category.getHeader(), category.getSummary(), category.getIcon() });
+    }
+    this.categories = categories;
+  }
+}
diff --git a/website/src/org/torproject/metrics/web/IndexServlet.java b/website/src/org/torproject/metrics/web/IndexServlet.java
index f3bb218..7bb6b9e 100644
--- a/website/src/org/torproject/metrics/web/IndexServlet.java
+++ b/website/src/org/torproject/metrics/web/IndexServlet.java
@@ -4,30 +4,18 @@
 package org.torproject.metrics.web;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-public class IndexServlet extends HttpServlet {
+public class IndexServlet extends AnyServlet {
 
   private static final long serialVersionUID = -5156539049907533057L;
 
-  protected List<String[]> categories;
-
   @Override
   public void init() throws ServletException {
-    List<String[]> categories = new ArrayList<String[]>();
-    for (Category category :
-        ContentProvider.getInstance().getCategoriesList()) {
-      categories.add(new String[] {
-          category.getMetrics().isEmpty() ? "" : category.getMetrics().get(0),
-          category.getHeader(), category.getSummary(), category.getIcon() });
-    }
-    this.categories = categories;
+    super.init();
   }
 
   @Override
diff --git a/website/src/org/torproject/metrics/web/NewsServlet.java b/website/src/org/torproject/metrics/web/NewsServlet.java
index 2cf4291..41d1b15 100644
--- a/website/src/org/torproject/metrics/web/NewsServlet.java
+++ b/website/src/org/torproject/metrics/web/NewsServlet.java
@@ -19,11 +19,10 @@ import java.util.TimeZone;
 import java.util.TreeMap;
 
 import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-public class NewsServlet extends HttpServlet {
+public class NewsServlet extends AnyServlet {
 
   private static final long serialVersionUID = -7696996243187241242L;
 
@@ -33,6 +32,7 @@ public class NewsServlet extends HttpServlet {
 
   @Override
   public void init() throws ServletException {
+    super.init();
     List<News> sortedNews = new ArrayList<News>();
     for (News news : ContentProvider.getInstance().getNewsList()) {
       if (news.getStart() != null) {
@@ -88,9 +88,9 @@ public class NewsServlet extends HttpServlet {
     }
     for (News news : this.sortedNews) {
       StringBuilder sb = new StringBuilder();
-      sb.append("<p>" + news.getStart());
+      sb.append("<h3 class=\"media-heading\">" + news.getStart());
       if (news.getEnd() != null) {
-        sb.append("–" + news.getEnd());
+        sb.append(" to " + news.getEnd());
       }
       if (news.getPlace() != null) {
         if (this.countries.containsKey(news.getPlace())) {
@@ -122,18 +122,22 @@ public class NewsServlet extends HttpServlet {
         sb.append(" <span class=\"label label-default\">"
             + "Unknown</span>");
       }
-      sb.append("<br>");
-      sb.append(news.getDescription());
-      sb.append("<br>");
+      sb.append("</h3><p>" + news.getDescription() + "</p>");
       if (news.getLinks() != null && news.getLinks().length > 0) {
         int written = 0;
-        sb.append(" (");
+        sb.append("<p class=\"links\">");
         for (String link : news.getLinks()) {
-          sb.append((written++ > 0 ? " " : "") + link);
+          if (written++ > 0) {
+            sb.append(" ");
+          }
+          if (link.startsWith("https://metrics.torproject.org/")) {
+            sb.append(link);
+          } else {
+            sb.append(link.replaceFirst(">", " target=\"_blank\">"));
+          }
         }
-        sb.append(")");
+        sb.append("</p>");
       }
-      sb.append("</p>");
       String[] formattedNews = new String[] { sb.toString() };
       for (Map.Entry<String, String[]> category : cutOffDates.entrySet()) {
         if (news.getStart().compareTo(category.getKey()) >= 0) {
@@ -150,7 +154,9 @@ public class NewsServlet extends HttpServlet {
       }
     }
 
-    /* Pass news by category to the JSP and let it do the rest of the work. */
+    /* Pass navigation categories and the news to the JSP and let it do the rest
+     * of the work. */
+    request.setAttribute("categories", this.categories);
     request.setAttribute("news", newsByCategory);
     request.getRequestDispatcher("WEB-INF/news.jsp").forward(request,
         response);
diff --git a/website/web/WEB-INF/news.jsp b/website/web/WEB-INF/news.jsp
index 4ff1bcd..61c4e24 100644
--- a/website/web/WEB-INF/news.jsp
+++ b/website/web/WEB-INF/news.jsp
@@ -1,62 +1,33 @@
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <title>Tor Metrics</title>
-  <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
-  <link href="css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
-  <link href="css/bootstrap.min.css" type="text/css" rel="stylesheet">
-  <link href="images/favicon.ico" type="image/x-icon" rel="shortcut icon">
-</head>
-<body>
-  <div class="center">
-    <div class="main-column">
-        <h2><a href="/"><img src="images/metrics-logo.png" width="153" height="200" alt="Metrics logo"><img src="images/metrics-wordmark.png" width="384" height="50" alt="Metrics wordmark"></a></h2>
-        <br>
-
-<p>"Tor metrics are the ammunition that lets Tor and other security
-advocates argue for a more private and secure Internet from a position
-of data, rather than just dogma or perspective."
-<i>- Bruce Schneier (June 1, 2016)</i></p>
-
-        <!-- Navigation start -->
-        <a href="index.html">Metrics</a> |
-        <a href="about.html">About</a> |
-        News |
-        <a href="tools.html">Tools</a> |
-        <a href="research.html">Research</a>
-        <br>
-        <br>
-        <!-- Navigation end -->
-
-<h1>News</h1>
-<br>
-
-<p>We collect reports of events and aggregate them here for your convenience.
-The process is usually pretty informal.
-Someone tells us of an event, reports it to us, and we aggregate them here.
-If you know of any event that may have caused a measurement anomaly, help us add
-it to this list.</p>
+<jsp:include page="top.jsp">
+  <jsp:param name="pageTitle" value="News – Tor Metrics"/>
+  <jsp:param name="navActive" value="News"/>
+</jsp:include>
+
+    <div class="container">
+      <ul class="breadcrumb">
+        <li><a href="index.html">Home</a></li>
+        <li class="active">News</li>
+      </ul>
+    </div>
 
-<c:forEach var="category" items="${news}">
-<a href="#${category.key[1]}">${category.key[0]}</a> |
-</c:forEach>
-<br>
+    <div class="container">
+      <h1>News</h1>
+      <p>We collect reports of events and aggregate them here for your convenience.  The process is usually pretty informal.  Someone tells us of an event, reports it to us, and we aggregate them here.  If you know of any event that may have caused a measurement anomaly, help us add it to this list.</p>
+    </div>
+    <div class="container">
 
-<c:forEach var="category" items="${news}">
-<a name="${category.key[1]}"></a>
-<h2>${category.key[0]}</h2>
-<c:forEach var="entry" items="${category.value}">
-<p>${entry[0]}</p>
-</c:forEach>
-</c:forEach>
+    <c:forEach var="category" items="${news}" varStatus="status">
+      <c:if test="${not status.first}"><hr></c:if>
+      <a name="#${category.key[1]}" id="anchor-${category.key[1]}"></a>
+      <h2>${category.key[0]}</h2>
+      <c:forEach var="entry" items="${category.value}">
+      <p>${entry[0]}</p>
+      </c:forEach>
+    </c:forEach>
 
     </div>
-  </div>
-  <div class="bottom" id="bottom">
-    <%@ include file="footer.jsp"%>
-  </div>
-</body>
-</html>
+
+<jsp:include page="bottom.jsp"/>
 





More information about the tor-commits mailing list