This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-fsclassloader.git

commit 37279f528f6b804dcaba9a24a480f55cfc3ad1db
Author: Dan Klco <[email protected]>
AuthorDate: Wed Jun 10 15:19:57 2015 +0000

    Working on SLING-4792 : Adding an OSGi Console for viewing the 
FSClassloader files
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1684695 
13f79535-47bb-0310-9956-ffa450edef68
---
 pom.xml                                            |  22 ++
 .../impl/FSClassLoaderWebConsole.java              | 395 +++++++++++++++++++++
 src/main/resources/res/ui/prettify.css             |   1 +
 src/main/resources/res/ui/prettify.js              |  30 ++
 4 files changed, 448 insertions(+)

diff --git a/pom.xml b/pom.xml
index 6f6630a..13c6efc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -99,5 +99,27 @@
             <version>1.3.0</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.5</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>1.4</version>
+            <scope>provided</scope>
+        </dependency>
+               <dependency>
+                       <groupId>org.apache.felix</groupId>
+                       <artifactId>org.apache.felix.webconsole</artifactId>
+                       <version>3.0.0</version>
+                       <scope>provided</scope>
+               </dependency>
     </dependencies>
 </project>
diff --git 
a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderWebConsole.java
 
b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderWebConsole.java
new file mode 100644
index 0000000..4e36614
--- /dev/null
+++ 
b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderWebConsole.java
@@ -0,0 +1,395 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.commons.fsclassloader.impl;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.net.MalformedURLException;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Properties;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.felix.webconsole.AbstractWebConsolePlugin;
+import org.osgi.service.component.ComponentContext;
+
+/**
+ * Web Console for the FileSystem Class Loader. Allows users to download Java
+ * and Class files.
+ */
+@Component
+@Service
+@Properties({
+               @Property(name = "service.description", value = "JSP Script 
Handler"),
+               @Property(name = "service.vendor", value = "The Apache Software 
Foundation"),
+               @Property(name = "felix.webconsole.label", value = 
FSClassLoaderWebConsole.APP_ROOT),
+               @Property(name = "felix.webconsole.title", value = "File System 
Class Loader"),
+               @Property(name = "felix.webconsole.css", value = { 
FSClassLoaderWebConsole.RES_LOC
+                               + "/prettify.css" }),
+               @Property(name = "felix.webconsole.category", value = "Sling") 
})
+public class FSClassLoaderWebConsole extends AbstractWebConsolePlugin {
+
+       static final String APP_ROOT = "fsclassloader";
+
+       static final String RES_LOC = APP_ROOT + "/res/ui";
+
+       /**
+        * Represents a set of class, java and deps files for a script.
+        */
+       private static class ScriptFiles {
+
+               /**
+                * Gets the script associated with the file.
+                * 
+                * @param file
+                *            the file to find the associate script
+                * @return the associated script
+                */
+               public static String getScript(File file) {
+                       String relative = file.getAbsolutePath().substring(
+                                       root.getAbsolutePath().length());
+                       String script = remove(relative, "/org/apache/jsp");
+                       script = remove(script, ".class");
+                       script = remove(script, ".java");
+                       script = remove(script, ".deps");
+                       if (File.separatorChar == '\\') {
+                               script = script.replace(File.separatorChar, 
'/');
+                       }
+                       return StringUtils.substringBeforeLast(script, "_") + 
"."
+                                       + 
StringUtils.substringAfterLast(script, "_");
+               }
+
+               private static String remove(String orig, String rem) {
+                       return orig.replace(rem, "");
+               }
+
+               private final String classFile;
+               private final String depsFile;
+
+               private final String javaFile;
+
+               private final String script;
+
+               public ScriptFiles(File file) {
+                       script = getScript(file);
+
+                       String relative = file.getAbsolutePath().substring(
+                                       root.getAbsolutePath().length());
+
+                       relative = remove(relative, ".class");
+                       relative = remove(relative, ".deps");
+                       relative = remove(relative, ".java");
+                       classFile = relative + ".class";
+                       depsFile = relative + ".deps";
+                       javaFile = relative + ".java";
+               }
+
+               public String getClassFile() {
+                       return classFile;
+               }
+
+               public String getDepsFile() {
+                       return depsFile;
+               }
+
+               public String getJavaFile() {
+                       return javaFile;
+               }
+
+               public String getScript() {
+                       return script;
+               }
+
+       }
+
+       /**
+        * The root under which the class files are under
+        */
+       private static File root;
+
+       /**
+        * The serialization UID
+        */
+       private static final long serialVersionUID = -5728679635644481848L;
+
+       /**
+        * The servlet configuration
+        */
+       private ServletConfig config;
+
+       /**
+        * Activate this component. Create the root directory.
+        * 
+        * @param componentContext
+        * @throws MalformedURLException
+        */
+       @Activate
+       protected void activate(final ComponentContext componentContext)
+                       throws MalformedURLException {
+               // get the file root
+               root = new 
File(componentContext.getBundleContext().getDataFile(""),
+                               "classes");
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see javax.servlet.Servlet#destroy()
+        */
+       public void destroy() {
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest,
+        * javax.servlet.ServletResponse)
+        */
+       protected void doGet(HttpServletRequest request,
+                       HttpServletResponse response) throws ServletException, 
IOException {
+               String file = request.getParameter("download");
+               File toDownload = new File(root + file);
+               if (!StringUtils.isEmpty(file)) {
+                       if (isValid(toDownload)) {
+                               InputStream is = null;
+                               try {
+                                       is = new FileInputStream(toDownload);
+                                       
response.setHeader("Content-disposition",
+                                                       "attachment; filename=" 
+ toDownload.getName());
+                                       IOUtils.copy(is, 
response.getOutputStream());
+                               } finally {
+                                       IOUtils.closeQuietly(is);
+                                       
IOUtils.closeQuietly(response.getOutputStream());
+                               }
+                       } else {
+                               response.sendError(404, "File " + file + " not 
found");
+                       }
+               } else if (request.getRequestURI().endsWith(RES_LOC + 
"/prettify.css")) {
+                       response.setContentType("text/css");
+                       IOUtils.copy(
+                                       
getClass().getClassLoader().getResourceAsStream(
+                                                       
"/res/ui/prettify.css"), response.getOutputStream());
+               } else if (request.getRequestURI().endsWith(RES_LOC + 
"/prettify.js")) {
+                       response.setContentType("application/javascript");
+                       IOUtils.copy(
+                                       
getClass().getClassLoader().getResourceAsStream(
+                                                       "/res/ui/prettify.js"), 
response.getOutputStream());
+               } else {
+                       super.doGet(request, response);
+               }
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getLabel()
+        */
+       @Override
+       public String getLabel() {
+               return "fsclassloader";
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see javax.servlet.Servlet#getServletConfig()
+        */
+       public ServletConfig getServletConfig() {
+               return this.config;
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see javax.servlet.Servlet#getServletInfo()
+        */
+       public String getServletInfo() {
+               return "";
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getTitle()
+        */
+       @Override
+       public String getTitle() {
+               return "File System Class Loader";
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig)
+        */
+       public void init(ServletConfig config) throws ServletException {
+               this.config = config;
+       }
+
+       /**
+        * Checks whether the specified file is a file and is underneath the 
root
+        * directory.
+        * 
+        * @param file
+        *            the file to check
+        * @return false if not a file or not under the root directory, true
+        *         otherwise
+        * @throws IOException
+        */
+       private boolean isValid(File file) throws IOException {
+               if (file.isFile()) {
+                       File parent = file.getCanonicalFile().getAbsoluteFile()
+                                       .getParentFile();
+                       while (parent != null) {
+                               if 
(parent.getAbsolutePath().equals(root.getAbsolutePath())) {
+                                       return true;
+                               }
+                               parent = parent.getParentFile();
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Reads all of the files under the current file.
+        * 
+        * @param file
+        *            the root file
+        * @param scripts
+        *            the map of scripts
+        * @throws IOException
+        *             an exception occurs reading the files
+        */
+       private void readFiles(File file, Map<String, ScriptFiles> scripts)
+                       throws IOException {
+               if (file.isDirectory()) {
+                       for (File f : file.listFiles()) {
+                               readFiles(f, scripts);
+                       }
+               } else {
+                       String script = ScriptFiles.getScript(file);
+                       if (!scripts.containsKey(script)
+                                       && file.getName().endsWith(".java")) {
+                               scripts.put(script, new ScriptFiles(file));
+                       }
+               }
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see
+        * 
org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(javax
+        * .servlet.http.HttpServletRequest, 
javax.servlet.http.HttpServletResponse)
+        */
+       @Override
+       protected void renderContent(HttpServletRequest request,
+                       HttpServletResponse response) throws ServletException, 
IOException {
+               Map<String, ScriptFiles> scripts = new LinkedHashMap<String, 
ScriptFiles>();
+               readFiles(root, scripts);
+
+               Writer w = response.getWriter();
+
+               w.write("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + 
RES_LOC
+                               + "/prettify.css\"></link>");
+               w.write("<script type=\"text/javascript\" src=\"" + RES_LOC
+                               + "/prettify.js\"></script>");
+               w.write("<script>$(document).ready(prettyPrint);</script>");
+               w.write("<style>.prettyprint ol.linenums > li { 
list-style-type: decimal; }</style>");
+               String file = request.getParameter("view");
+               File toView = new File(root + file);
+               if (!StringUtils.isEmpty(file)) {
+                       if (isValid(toView)) {
+
+                               w.write("<p class=\"statline 
ui-state-highlight\">Viewing Script: "
+                                               + root + file + 
"</p><br/><br/>");
+                               
+                               ScriptFiles scriptFiles = new 
ScriptFiles(toView);
+
+                               w.write("<table class=\"nicetable 
ui-widget\">");
+                               w.write("<tr class=\"header 
ui-widget-header\">");
+                               w.write("<th>Script</th>");
+                               w.write("<th>Class</th>");
+                               w.write("<th>Deps</th>");
+                               w.write("<th>Java</th>");
+                               w.write("</tr>");
+                               w.write("<tr class=\"ui-state-default\">");
+                               w.write("<td>" + scriptFiles.getScript() + 
"</td>");
+                               w.write("<td>[<a href=\"?download="
+                                               + scriptFiles.getClassFile()
+                                               + "\" 
target=\"_blank\">download</a>]</td>");
+                               w.write("<td>[<a href=\"?download="
+                                               + scriptFiles.getDepsFile()
+                                               + "\" 
target=\"_blank\">download</a>]</td>");
+                               w.write("<td>[<a href=\"?download="
+                                               + scriptFiles.getJavaFile()
+                                               + "\" 
target=\"_blank\">download</a>]</td>");
+                               w.write("</tr>");
+                               w.write("</table><br/><br/>");
+                               InputStream is = null;
+                               try {
+                                       is = new FileInputStream(toView);
+                                       String contents = IOUtils.toString(is);
+                                       w.write("<pre class=\"prettyprint 
linenums\"><code>");
+                                       StringEscapeUtils.escapeHtml(w, 
contents);
+                                       w.write("</pre></code>");
+                               } finally {
+                                       IOUtils.closeQuietly(is);
+                               }
+                       } else {
+                               response.sendError(404, "File " + file + " not 
found");
+                       }
+               } else {
+
+                       w.write("<p class=\"statline ui-state-highlight\">File 
System ClassLoader Root: "
+                                       + root + "</p>");
+
+                       w.write("<table class=\"nicetable ui-widget\">");
+                       w.write("<tr class=\"header ui-widget-header\">");
+                       w.write("<th>View</th>");
+                       w.write("<th>Script</th>");
+                       w.write("</tr>");
+                       int i = 0;
+                       for (ScriptFiles scriptFiles : scripts.values()) {
+                               w.write("<tr class=\"" + (i % 2 == 0 ? "even" : 
"odd")
+                                               + " ui-state-default\">");
+                               w.write("<td>[<a href=\"?view=" + 
scriptFiles.getJavaFile()
+                                               + "\">view</a>]</td>");
+                               w.write("<td>" + scriptFiles.getScript() + 
"</td>");
+                               w.write("</tr>");
+                               i++;
+                       }
+                       w.write("</table>");
+               }
+       }
+}
diff --git a/src/main/resources/res/ui/prettify.css 
b/src/main/resources/res/ui/prettify.css
new file mode 100644
index 0000000..d44b3a2
--- /dev/null
+++ b/src/main/resources/res/ui/prettify.css
@@ -0,0 +1 @@
+.pln{color:#000}@media 
screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media
 
print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding
 [...]
\ No newline at end of file
diff --git a/src/main/resources/res/ui/prettify.js 
b/src/main/resources/res/ui/prettify.js
new file mode 100644
index 0000000..7b99049
--- /dev/null
+++ b/src/main/resources/res/ui/prettify.js
@@ -0,0 +1,30 @@
+!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return 
b;var 
a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function
 
g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return
 e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var 
b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/
 [...]
+b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var 
h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var 
h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return
 
e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b
 [...]
+h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return 
c.join("")}function s(e){for(var 
a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var
 
l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1)
 [...]
+(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return
 a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var 
i=a[k];if(i.ignoreCase)j=!0;else 
if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var
 r={b:8,t:9, [...]
+f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw 
Error(""+i);n.push("(?:"+s(i)+")")}return 
RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var 
c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else
 
if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r
 ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m [...]
+a)}var 
b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function
 H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var 
d=void 0,g=a.firstChild;g;g=g.nextSibling)var 
b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 
0:d}function C(a,d){function g(a){for(var 
j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var 
z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.c [...]
+if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof
 t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var 
l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else
 k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var 
g=a.concat(d),j=[],k={},c=0,i=g.le [...]
+g[c],n=r[3];if(n)for(var 
e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var
 x=d.length;return g}function v(a){var 
d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|
 [...]
+q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var
 
b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.
 [...]
+/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var
 
s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+
 [...]
+s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^
 | 
$/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q,"
 
\r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["p
 [...]
+q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var 
c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else
 for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var 
d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function
 s(a){function b [...]
+c?a.cloneNode(!1):a,e=a.parentNode;if(e){var 
e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var 
i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return 
d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var 
a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var 
x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var
 c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var  
[...]
+r.className="linenums";for(var 
d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function
 p(a,d){for(var g=d.length;--g>=0;){var 
b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language 
handler %s",b):F[b]=a}}function 
I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return
 F[a]}function K(a){var d=a.h;try{var g=T(a.c [...]
+a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var 
s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var
 
n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var
 
p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var
 f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var 
l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType! [...]
+t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var 
L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var 
v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var
 
D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inl
 [...]
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,pack
 [...]
+O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,wi
 [...]
+Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map
 [...]
+V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?
 [...]
+/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q,"
 
\t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["p
 [...]
+["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimString
 [...]
+["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl",
 [...]
+hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc",
 [...]
+p(C([],[["str",/^[\S\s]+/]]),["regex"]);var 
Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var
 
b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j
 [...]
+return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function 
g(){for(var 
b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var
 d=p[i],j=h,k=d;k=k.previousSibling;){var 
m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f.
 [...]
+o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" 
prettyprinted";m=j.lang;if(!m){var 
m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else
 var 
o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J
 [...]
+{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof 
a&&a()}for(var 
b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var
 j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var 
b=q,c=Date;c.now||(c={now:function(){return+new Date}});var 
i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code
 [...]
+h={};g()}};typeof 
define==="function"&&define.amd&&define("google-code-prettify",[],function(){return
 Y})})();}()

-- 
To stop receiving notification emails like this one, please contact
"[email protected]" <[email protected]>.

Reply via email to