-
Notifications
You must be signed in to change notification settings - Fork 136
/
Copy pathnews.html
19 lines (19 loc) · 28.3 KB
/
news.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description" content="j2html - Fast and fluent Java HTML builder. Build type-safe HTML 5 with Java 8 expression!"><title>News about j2html - Java HTML builder</title><link rel="icon" href="/img/favicon.svg"><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato&family=Patua+One&display=swap"><style>/** * okaidia theme for JavaScript,CSS and HTML * Loosely based on Monokai textmate theme by http://www.monokai.nl/ * @author ocodia */code[class*="language-"],pre[class*="language-"]{color:#f8f8f2;direction:ltr;font-family:consolas,monaco,'Andale Mono',monospace;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;text-align:left;text-shadow:0 1px rgba(0,0,0,0.3);white-space:pre;word-break:normal;word-spacing:normal}pre[class*="language-"]{border-radius:0.3em;margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#272822}:not(pre)>code[class*="language-"]{border-radius:.3em;padding:.1em}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#708090}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.property,.token.tag,.token.constant,.token.symbol,.token.deleted{color:#f92672}.token.boolean,.token.number{color:#ae81ff}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#a6e22e}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.function{color:#e6db74}.token.keyword{color:#66d9ef}.token.regex,.token.important{color:#fd971f}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}</style><style>*{box-sizing:border-box}html,body{margin:0}html{background:#fafafa;font-family:arial,sans-serif;min-height:100%;overflow-y:scroll;position:relative}body{height:100%;margin-bottom:50px}h1,h2,h3,nav a{font-family:'Patua One',cursive;font-weight:400}h1,h2,h3,h4{margin-bottom:0.2em;margin-top:1.5em}h1+p,h2+p,h3+p{margin-top:0}h2,h3{color:rgba(0,0,0,0.7)}pre+p{margin-top:2em}#news h2:not(:first-of-type){margin-top:2em}a{color:#1272bf;text-decoration:none}p,li{color:rgba(0,0,0,0.7);font-family:"lato",arial,sans-serif;font-size:17px;line-height:1.5}li{margin:5px 0}dt{font-family:monospace;font-size:14px;font-weight:700;margin-top:10px}dd{font-size:13px;margin:0}.width-limit{margin:0 auto;max-width:940px;padding:0 20px}#github-stars{height:30px;position:absolute;right:27px;top:10px;width:100px}#logo{font-size:20px;font-style:italic}#logo img{display:block;height:50px}.top-header{background:#fff}.top-header nav{align-items:center;display:flex;justify-content:space-between;padding:20px}.top-header ul{list-style:none;margin:0;padding:0}.top-header li{display:inline-block;margin:0 10px}.top-header ul li a{display:inline-block;font-size:22px;padding:8px}.banner{background:#1272bf;border-bottom:3px solid #0d4d80;border-top:3px solid #0d4d80;color:#fff;height:100px;line-height:100px;margin:0;padding:0 25px}.banner h1{font-size:40px;text-shadow:4px 4px 0 rgba(0,0,0,0.3)}p code,li code{background:rgba(30,177,204,0.1);border:1px solid rgba(26,142,167,0.49);border-radius:3px;font-family:monospace;font-size:85%;padding:1px 3px}footer{background:#f5f5f5;border-top:1px solid #ddd;bottom:0;font-size:13px;height:40px;left:0;line-height:40px;overflow:hidden;padding:0 20px;position:absolute;text-align:center;width:100%}.lols{color:#777;font-size:9px;margin:0;text-align:center}#table-example{background:#fff;border:1px solid #ddd;border-radius:5px;border-spacing:5px 20px;font-weight:700;text-align:center;width:100%}@media screen and (max-width: 1024px){#fork-me{display:none}.top-header{border-bottom:1px solid #ccc}}@media screen and (max-width: 768px){.banner{display:none}.top-header nav ul li{margin:0 5px}.top-header nav ul li a{font-size:16px}#logo{font-size:0}}@media screen and (max-width: 460px){#logo{display:none}.top-header nav ul li{margin:0 2px}.top-header nav ul li a{font-size:14px}}.code-compare ul{background:#272822;border-bottom:1px solid #464644;border-radius:5px 5px 0 0;height:28px;list-style:none;margin:0;padding:0}.code-compare ul li{color:#999;cursor:pointer;display:inline-block;font-size:13px;height:28px;line-height:28px;margin:0;padding:0 10px}.code-compare ul li+li{border-left:1px solid #464644}.code-compare pre{border-radius:0 0 5px 5px;display:none;margin-top:0}.code-compare.with .with-switch,.code-compare.nowith .nowith-switch{color:#eee}.code-compare.with .with-pre,.code-compare.nowith .nowith-pre{display:block}pre{background:#272822;border-radius:5px;padding:15px!important}pre::-webkit-scrollbar{height:5px;width:5px}pre::-webkit-scrollbar-thumb{background:#777;border-radius:5px}pre::-webkit-scrollbar-thumb:hover{background:#999}pre::-webkit-scrollbar-track{background:#333;border-radius:5px}pre::-webkit-scrollbar-button{height:8px;width:8px}#javalin-suggestion{background:#fff;border:2px solid #009ebe;bottom:30px;box-shadow:4px 4px 0 0 rgba(0,0,0,.2);display:none;font-size:17px;line-height:2;max-width:calc(100% - 60px);padding:20px 40px 20px 20px;position:fixed;right:30px;z-index:1}#javalin-suggestion .close{cursor:pointer;position:absolute;right:15px;top:11px}#javalin-suggestion a{font-weight:700}</style></head><body><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-W4XBCK"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-W4XBCK');</script>
<a id="fork-me" href="https://github.com/tipsy/j2html" target="_blank">
<img style="position:fixed;top:0;right:0;border:0;z-index:99999" src="data:image/png;base64,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" alt="Fork me on GitHub">
</a>
<header class="top-header"><nav class="width-limit"><a id="logo" href="/"><span><img src="/img/logo.svg" alt="j2html logo"></span></a><ul><li><a href="/">Home</a></li><li><a href="/download.html">Download</a></li><li><a href="/examples.html">Examples</a></li><li><a href="/news.html">News</a></li></ul></nav></header><header class="banner"><h1 class="width-limit">News and releases</h1></header><main class="width-limit"><section id="news"><article><h2 id="j2html-1.6.0-released">j2html 1.6.0 adds support for web components and newer HTML elements. (Jun 2022)</h2><p>j2html 1.6.0 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C1.6.0%7Cjar" target="_blank">Maven Central</a>.</p><p>Changes:</p><ul><li>Added <code>TagCreator::data</code> to provide machine-readable translations.</li><li>Added <code>TagCreator::picture</code> to provide alternative versions of an image for different display/device scenarios.</li><li>Added <code>TagCreator::slot</code> to provide placeholders for web components.</li><li>Added <code>TagCreator::template</code> to provide templating of content fragments for web components.</li><li>Added global attributes used for web components.</li></ul></article><article><h2 id="j2html-1.5.0-released">j2html 1.5.0 enhances factory methods and class types, overhauls HTML rendering, introduces support for Java modules and fixes several bugs (Jun 2021)</h2><p>j2html 1.5.0 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C1.5.0%7Cjar" target="_blank">Maven Central</a>.</p><p><a href="download.html#upgrade">This version contains breaking changes. Please view the upgrade guide.</a></p><p>Changes:</p><ul><li>Added <code>Automatic-Module-Name</code> to manifest to support JDK 9+</li><li>Added <code>TagCreator::each(DomContent...)</code></li><li>Added <code>TagCreator::each(Collection, BiFunction)</code></li><li>Added <code>HtmlBuilder</code> interface, with implementations for <code>FlatHtml</code> and <code>IndentedHtml</code></li><li>Added <code>Config.defaults()</code> for customizable configuration instances and <code>Config.global()</code> for (backwards-compatible) static global configuration</li><li>Deprecated old rendering methods. Libraries that use custom Tag implementations should switch to using <code>HtmlBuilder</code></li><li>Fixed the use of <code>rawHtml()</code> when constructing the Tag tree</li><li>Fixed text escaping for <code>style()</code> and <code>script()</code></li><li>Fixed formatting of children for <code>textarea()</code> and <code>pre()</code></li><li>Fixed appending an unnecessary delimiter to the end of text with <code>join()</code></li><li>Thanks to <a href="https://github.com/obecker">Oliver Becker</a> for many code improvements</li></ul></article><article><h2 id="j2html-1.4.0-released">j2html 1.4.0 adds a couple of convenient methods (Jan 2019)</h2><p>j2html 1.4.0 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C1.4.0%7Cjar" target="_blank">Maven Central</a>.</p><p>Changes:</p><ul><li>Added <code>TagCreator::each(Map, BiFunction)</code></li><li>Added <code>Stream<DomContent></code> variants of <code>each</code> and <code>with</code></li></ul></article><article><h2 id="j2html-1.3.0-released">j2html 1.3.0 has a couple of features and fixes (May 2018)</h2><p>j2html 1.3.0 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C1.3.0%7Cjar" target="_blank">Maven Central</a>.</p><p>Changes:</p><ul><li>Added support for <code>Map</code> in <code>each()</code></li><li>Added osgi metadata</li><li>Added support for <code>Optional</code> in <code>iff()</code></li><li>Fixed bugs in <code>renderFormatted()</code></li></ul></article><article><h2 id="j2html-1.2.2-released">j2html 1.2.2 has performance improvements (Dec 2017)</h2><p>j2html 1.2.2 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C1.2.2%7Cjar" target="_blank">Maven Central</a>.</p><p>Changes:</p><ul><li>There have been some massive performance improvements. Big thanks to <a href="https://github.com/kicktipp">kicktipp</a>.</li></ul></article><article><h2 id="j2html-1.2.1-released">j2html 1.2.1 fixes some bugs (Nov 2017)</h2><p>j2html 1.2.1 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C1.2.1%7Cjar" target="_blank">Maven Central</a>.</p><p>Changes:</p><ul><li>Fix <em>"bad closing tag (<!DOCTYPE html/>) when closeEmptyTags is true"</em> bug</li><li>Fix <em>"can't load static resources from jar"</em> bug</li><li>Fix <em>"CSSMin stripping last character of CSS rule if rule doesn't end in semi-colon"</em> bug</li></ul></article><article><h2 id="j2html-1.2.0-released">j2html 1.2.0 already? (Sep 2017)</h2><p>j2html 1.2.0 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C1.2.0%7Cjar" target="_blank">Maven Central</a>.</p><p>Changes:</p><ul><li>Added option to render formatted HTML, ex <code>body(...).renderFormatted()</code></li><li>Added option to configure HTML-formatting-indent via <code>Config.indenter = (int, string) -> {...}</code></li><li>Added option to configure CSS-minification via <code>Config.cssMinifier = string -> {...}</code></li><li>Added option to configure JS-minification via <code>Config.jsMinifier = string -> {...}</code></li><li>Added option to close empty tags via <code>Config.closeEmptyTags = true</code></li><li><code>attr()</code> can now take take any object, not just strings</li></ul></article><article><h2 id="j2html-1.1.0-released">j2html 1.1.0 is out! (Aug 2017)</h2><p>j2html 1.1.0 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C1.1.0%7Cjar" target="_blank">Maven Central</a>.</p><p>Changes:</p><ul><li>Added a option to customize TextEscaper via <code>Config.textEscaper = text -> {}</code></li></ul></article><article><h2 id="j2html-1.0.0-released">j2html 1.0.0 is here! (May 2017)</h2><p>j2html 1.0.0 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C1.0.0%7Cjar" target="_blank">Maven Central</a>.</p><p>Changes:</p><ul><li>v1 is officially done. We will be doing <a href="http://semver.org/" target="_blank">semantic versioning</a> from now on.</li><li>All tag methods ( <code>div()</code>, <code>p()</code> etc ) can now accept an arbitrary number of <code>DomContent</code> as arguments, eliminating the need for <code>with()</code> in most cases.</li><li>Added a shorthand-attribute overloads to all TagCreator methods: <br> <code>div(attrs("#id.class")</code> becomes <code><div id="id" class="class"></div></code></li><li>Added a <code>join()</code> method to more easily join sentences with inline HTML, like: <br> <code>join("Added a", code("join()"), "method to more ea...</code></li><li>Added a <code>document()</code> method that takes a <code>html()</code> tag and renders a HTML declaration followed by the html content</li><li>Added support for Java 7 and Java 6. Some functionality (each/filter) will not work on these versions, but everything else should.</li></ul></article><article><h2 id="j2html-0.99-released">j2html 0.99 released! (Apr 2017)</h2><p>j2html 0.99 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C0.99%7Cjar" target="_blank">Maven Central</a>.</p><p>Changes:</p><ul><li>Added generic <code>iff()</code> / <code>iffElse()</code> methods for performing if's in method calls.</li><li>Added <code>withClasses()</code> to add multiple classes to element. Works well with <code>iff()</code>.</li><li>HTML-escaping is now a lot faster (and a lot faster than StringUtils)</li><li>Static files can now be fetched from anywhere, not just classpath</li></ul></article><article><h2 id="j2html-0.88-released">j2html 0.88 released! (Jan 2017)</h2><p>j2html 0.88 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C0.88%7Cjar" target="_blank">Maven Central</a>.</p><p>Changes:</p><ul><li>Closure and StringUtils dependencies removed in favor of custom implementations. Most users seem interested in a very lightweight library.</li><li><code>unsafeHtml()</code></li><li> is now </li><li><code>rawHtml()</code></li><li>Added </li><li><code>.equals()</code></li><li> to Tag-class. Two Tags are equal if they render the same HTML</li></ul></article><h2 id="j2html-0.7-released">j2html 0.7 released!</h2><p>j2html 0.7 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C0.7%7Cjar" target="_blank">Maven Central</a>.</p><p>Changes:</p><ul><li>New file-api (avilable from TagCreator class):<dl><dt>fileAsString(String path)</dt><dd>returns a file's content as a String (useful for including static HTML such as Google Analytics code)</dd><dt>fileAsEscapedString(String path)</dt><dd>returns fileAsString(path) escaped (useful for including the code-examples on this website)</dd><dt>styleWithInlineFile(String path)</dt><dd>returns <style>fileAsString(path)</style></dd><dt>styleWithInlineFile_min(String path)</dt><dd>returns <style>fileAsString(path)</style>, minimized using CSSMin</dd><dt>scriptWithInlineFile(String path)</dt><dd>returns <script>fileAsString(path)</script></dd><dt>scriptWithInlineFile_min(String path)</dt><dd>returns <script>fileAsString(path)</script>, minimized using Google Closure</dd></dl></li><li>Java 7 support (j2html previously only worked with Java 8)</li><li>Use apache stringutils for escaping</li></ul><h2 id="j2html-on-maven">j2html 0.5.0 is on Maven! (Late May 2015)</h2><p>j2html 0.5.0 is available for download on <a href="http://search.maven.org/#artifactdetails%7Ccom.j2html%7Cj2html%7C0.5.0%7Cjar" target="_blank">Maven Central</a>.</p><p>We've finished the herculean task of releasing on Maven Central.</p></section></main><div id="javalin-suggestion"><span class="close">✖</span> Want a simple and modern web framework? <br> Try our other project: <a href="https://javalin.io?from=j2html">https://javalin.io</a></div><footer>This page was created using <a href="https://github.com/tipsy/j2html" target="_blank">j2html</a> and <a href="https://javalin.io/" target="_blank">Javalin</a>. Webpage source on <a href="https://github.com/j2html/j2html-webpage" target="_blank">Github</a>. <br> <p class="lols">A static page generator or a template engine would be better suited than a HTML builder for creating this page, but we had to do it.</p></footer><script>/* http://prismjs.com/download.html?themes=prism-okaidia&languages=markup+css+clike+javascript+java */
self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{};var Prism=function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={util:{encode:function(e){return e instanceof n?new n(e.type,t.util.encode(e.content),e.alias):"Array"===t.util.type(e)?e.map(t.util.encode):e.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},clone:function(e){var n=t.util.type(e);switch(n){case"Object":var a={};for(var r in e)e.hasOwnProperty(r)&&(a[r]=t.util.clone(e[r]));return a;case"Array":return e.map(function(e){return t.util.clone(e)})}return e}},languages:{extend:function(e,n){var a=t.util.clone(t.languages[e]);for(var r in n)a[r]=n[r];return a},insertBefore:function(e,n,a,r){r=r||t.languages;var i=r[e];if(2==arguments.length){a=arguments[1];for(var l in a)a.hasOwnProperty(l)&&(i[l]=a[l]);return i}var s={};for(var o in i)if(i.hasOwnProperty(o)){if(o==n)for(var l in a)a.hasOwnProperty(l)&&(s[l]=a[l]);s[o]=i[o]}return t.languages.DFS(t.languages,function(t,n){n===r[e]&&t!=e&&(this[t]=s)}),r[e]=s},DFS:function(e,n,a){for(var r in e)e.hasOwnProperty(r)&&(n.call(e,r,e[r],a||r),"Object"===t.util.type(e[r])?t.languages.DFS(e[r],n):"Array"===t.util.type(e[r])&&t.languages.DFS(e[r],n,r))}},highlightAll:function(e,n){for(var a,r=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'),i=0;a=r[i++];)t.highlightElement(a,e===!0,n)},highlightElement:function(a,r,i){for(var l,s,o=a;o&&!e.test(o.className);)o=o.parentNode;if(o&&(l=(o.className.match(e)||[,""])[1],s=t.languages[l]),s){a.className=a.className.replace(e,"").replace(/\s+/g," ")+" language-"+l,o=a.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,"").replace(/\s+/g," ")+" language-"+l);var u=a.textContent;if(u){u=u.replace(/^(?:\r?\n|\r)/,"");var g={element:a,language:l,grammar:s,code:u};if(t.hooks.run("before-highlight",g),r&&self.Worker){var c=new Worker(t.filename);c.onmessage=function(e){g.highlightedCode=n.stringify(JSON.parse(e.data),l),t.hooks.run("before-insert",g),g.element.innerHTML=g.highlightedCode,i&&i.call(g.element),t.hooks.run("after-highlight",g)},c.postMessage(JSON.stringify({language:g.language,code:g.code}))}else g.highlightedCode=t.highlight(g.code,g.grammar,g.language),t.hooks.run("before-insert",g),g.element.innerHTML=g.highlightedCode,i&&i.call(a),t.hooks.run("after-highlight",g)}}},highlight:function(e,a,r){var i=t.tokenize(e,a);return n.stringify(t.util.encode(i),r)},tokenize:function(e,n){var a=t.Token,r=[e],i=n.rest;if(i){for(var l in i)n[l]=i[l];delete n.rest}e:for(var l in n)if(n.hasOwnProperty(l)&&n[l]){var s=n[l];s="Array"===t.util.type(s)?s:[s];for(var o=0;o<s.length;++o){var u=s[o],g=u.inside,c=!!u.lookbehind,f=0,h=u.alias;u=u.pattern||u;for(var p=0;p<r.length;p++){var d=r[p];if(r.length>e.length)break e;if(!(d instanceof a)){u.lastIndex=0;var m=u.exec(d);if(m){c&&(f=m[1].length);var y=m.index-1+f,m=m[0].slice(f),v=m.length,k=y+v,b=d.slice(0,y+1),w=d.slice(k+1),N=[p,1];b&&N.push(b);var O=new a(l,g?t.tokenize(m,g):m,h);N.push(O),w&&N.push(w),Array.prototype.splice.apply(r,N)}}}}}return r},hooks:{all:{},add:function(e,n){var a=t.hooks.all;a[e]=a[e]||[],a[e].push(n)},run:function(e,n){var a=t.hooks.all[e];if(a&&a.length)for(var r,i=0;r=a[i++];)r(n)}}},n=t.Token=function(e,t,n){this.type=e,this.content=t,this.alias=n};if(n.stringify=function(e,a,r){if("string"==typeof e)return e;if("Array"===t.util.type(e))return e.map(function(t){return n.stringify(t,a,e)}).join("");var i={type:e.type,content:n.stringify(e.content,a,r),tag:"span",classes:["token",e.type],attributes:{},language:a,parent:r};if("comment"==i.type&&(i.attributes.spellcheck="true"),e.alias){var l="Array"===t.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(i.classes,l)}t.hooks.run("wrap",i);var s="";for(var o in i.attributes)s+=o+'="'+(i.attributes[o]||"")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'" '+s+">"+i.content+"</"+i.tag+">"},!self.document)return self.addEventListener?(self.addEventListener("message",function(e){var n=JSON.parse(e.data),a=n.language,r=n.code;self.postMessage(JSON.stringify(t.util.encode(t.tokenize(r,t.languages[a])))),self.close()},!1),self.Prism):self.Prism;var a=document.getElementsByTagName("script");return a=a[a.length-1],a&&(t.filename=a.src,document.addEventListener&&!a.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)),self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism);;
Prism.languages.markup={comment:/<!--[\w\W]*?-->/,prolog:/<\?.+?\?>/,doctype:/<!DOCTYPE.+?>/,cdata:/<!\[CDATA\[[\w\W]*?]]>/i,tag:{pattern:/<\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|[^\s'">=]+))?\s*)*\/?>/i,inside:{tag:{pattern:/^<\/?[\w:-]+/i,inside:{punctuation:/^<\/?/,namespace:/^[\w-]+?:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/=|>|"/}},punctuation:/\/?>/,"attr-name":{pattern:/[\w:-]+/,inside:{namespace:/^[\w-]+?:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.hooks.add("wrap",function(t){"entity"===t.type&&(t.attributes.title=t.content.replace(/&/,"&"))});;
Prism.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{punctuation:/[;:]/}},url:/url\((?:(["'])(\\\n|\\?.)*?\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*(?=\s*\{)/,string:/("|')(\\\n|\\?.)*?\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,punctuation:/[\{\};:]/,"function":/[-a-z0-9]+(?=\()/i},Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/<style[\w\W]*?>[\w\W]*?<\/style>/i,inside:{tag:{pattern:/<style[\w\W]*?>|<\/style>/i,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.css},alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag));;
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:/("|')(\\\n|\\?.)*?\1/,"class-name":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":{pattern:/[a-z0-9_]+\(/i,inside:{punctuation:/\(/}},number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/,operator:/[-+]{1,2}|!|<=?|>=?|={1,3}|&{1,2}|\|?\||\?|\*|\/|~|\^|%/,ignore:/&(lt|gt|amp);/i,punctuation:/[{}[\];(),.:]/};;
Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|function|get|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|-?Infinity)\b/,"function":/(?!\d)[a-z0-9_$]+(?=\()/i}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/<script[\w\W]*?>[\w\W]*?<\/script>/i,inside:{tag:{pattern:/<script[\w\W]*?>|<\/script>/i,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript},alias:"language-javascript"}});;
Prism.languages.java=Prism.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+[e]?[\d]*[df]\b|\b\d*\.?\d+\b/i,operator:{pattern:/(^|[^\.])(?:\+=|\+\+?|-=|--?|!=?|<{1,2}=?|>{1,3}=?|==?|&=|&&?|\|=|\|\|?|\?|\*=?|\/=?|%=?|\^=?|:|~)/m,lookbehind:!0}});;
</script><script>document.addEventListener("click",function(e){var classList=e.target.classList;var codeCompare=e.target.parentElement.parentElement;if(classList.contains("nowith-switch")){codeCompare.classList.add("nowith");codeCompare.classList.remove("with");}
if(classList.contains("with-switch")){codeCompare.classList.add("with");codeCompare.classList.remove("nowith");}});</script><script>(function(){var javalinSuggestion=document.querySelector("#javalin-suggestion");if(localStorage.getItem("javalin-suggestion-dismissed")!=="true"){javalinSuggestion.style.display="block";javalinSuggestion.querySelector(".close").addEventListener("click",function(){javalinSuggestion.style.display="none";localStorage.setItem("javalin-suggestion-dismissed","true");});}})();</script></body></html>