Gracefully handle wrapped ParsingTimeoutException

Parboiled wraps the Pegdown generated ParsingTimeoutException
with its own runtime exception type. Catch this and rethrow the
timeout for less verbose logging.

Change-Id: I3df293fac65c374bc37b076e4f0195936640c937
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesMarkdown.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesMarkdown.java
index 9683472..4a7df37 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesMarkdown.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/GitilesMarkdown.java
@@ -14,10 +14,12 @@
 
 package com.google.gitiles.doc;
 
+import com.google.common.base.Throwables;
 import com.google.gitiles.GitilesView;
 
 import org.parboiled.Rule;
 import org.parboiled.common.Factory;
+import org.parboiled.errors.ParserRuntimeException;
 import org.parboiled.support.StringBuilderVar;
 import org.parboiled.support.Var;
 import org.pegdown.Parser;
@@ -52,7 +54,12 @@
     }
 
     try {
-      return newParser().parseMarkdown(md.toCharArray());
+      try {
+        return newParser().parseMarkdown(md.toCharArray());
+      } catch (ParserRuntimeException e) {
+        Throwables.propagateIfInstanceOf(e.getCause(), ParsingTimeoutException.class);
+        throw e;
+      }
     } catch (ParsingTimeoutException e) {
       log.error("timeout rendering {}/{} at {}",
           view.getRepositoryName(),