diff --git a/site/assets/almanac.css b/site/assets/almanac.css index 92674a94..11adb2a2 100644 --- a/site/assets/almanac.css +++ b/site/assets/almanac.css @@ -574,4 +574,28 @@ div.sandbox-console { padding: 4px; overflow-y: scroll; height:150px; -} \ No newline at end of file +} + +td:has(> .jep-release) { + background-color: lightgreen; +} + +.sticky-table { + width: 800px; + height: 800px; + overflow: scroll; + margin-bottom: 10px; +} + +.sticky-table table td:first-child { + position: sticky; + left: 0; + background-color: #ddd; +} + +.sticky-table thead tr:nth-child(1) th { + background-color: #eee; + position: sticky; + top: 0; + z-index: 10; +} diff --git a/site/content/features/_index.md b/site/content/features/_index.md index 3b1b6792..4fc9fdee 100644 --- a/site/content/features/_index.md +++ b/site/content/features/_index.md @@ -6,6 +6,10 @@ For the following JDK features we have in-depth descriptions here at the Java Ve {{< features >}} +## Features Grid + +{{< featuresgrid >}} + ## All Features Overview of all new features (excluding previews) of all Java releases: diff --git a/site/data/jdk/versions/1.1.json b/site/data/jdk/versions/1.1.json index bc491f2e..e455af9c 100644 --- a/site/data/jdk/versions/1.1.json +++ b/site/data/jdk/versions/1.1.json @@ -15,32 +15,38 @@ { "title": "Inner Classes", "category": "lang", - "refs": [] + "refs": [], + "predecessors": [] }, { "title": "JIT (on Windows only by JavaSoft)", "category": "jvm", - "refs": [] + "refs": [], + "predecessors": [] }, { "title": "Java Beans", "category": "api", - "refs": [] + "refs": [], + "predecessors": [] }, { "title": "JDBC", "category": "api", - "refs": [] + "refs": [], + "predecessors": [] }, { "title": "RMI", "category": "api", - "refs": [] + "refs": [], + "predecessors": [] }, { "title": "Reflection", "category": "api", - "refs": [] + "refs": [], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/1.2.json b/site/data/jdk/versions/1.2.json index 1dfabd7d..2de0cb88 100644 --- a/site/data/jdk/versions/1.2.json +++ b/site/data/jdk/versions/1.2.json @@ -17,22 +17,26 @@ { "title": "Sun JIT", "category": "jvm", - "refs": [] + "refs": [], + "predecessors": [] }, { "title": "Keyword strictfp", "category": "lang", - "refs": [] + "refs": [], + "predecessors": [] }, { "title": "Swing", "category": "api", - "refs": [] + "refs": [], + "predecessors": [] }, { "title": "Collections", "category": "api", - "refs": [] + "refs": [], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/1.3.json b/site/data/jdk/versions/1.3.json index 811a7c2c..238e967a 100644 --- a/site/data/jdk/versions/1.3.json +++ b/site/data/jdk/versions/1.3.json @@ -16,17 +16,20 @@ { "title": "HotSpot", "category": "jvm", - "refs": [] + "refs": [], + "predecessors": [] }, { "title": "JNDI", "category": "api", - "refs": [] + "refs": [], + "predecessors": [] }, { "title": "Sound", "category": "api", - "refs": [] + "refs": [], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/1.4.json b/site/data/jdk/versions/1.4.json index 31a89b4b..f6c1666a 100644 --- a/site/data/jdk/versions/1.4.json +++ b/site/data/jdk/versions/1.4.json @@ -21,7 +21,8 @@ "type": "JSR", "identifier": "41" } - ] + ], + "predecessors": [] }, { "title": "Regular Expressions", @@ -31,7 +32,8 @@ "type": "JSR", "identifier": "51" } - ] + ], + "predecessors": [] }, { "title": "Non-blocking IO", @@ -41,7 +43,8 @@ "type": "JSR", "identifier": "51" } - ] + ], + "predecessors": [] }, { "title": "Logging", @@ -51,7 +54,8 @@ "type": "JSR", "identifier": "47" } - ] + ], + "predecessors": [] }, { "title": "Preferences", @@ -61,7 +65,8 @@ "type": "JSR", "identifier": "10" } - ] + ], + "predecessors": [] }, { "title": "XML APIs", @@ -71,7 +76,8 @@ "type": "JSR", "identifier": "5" } - ] + ], + "predecessors": [] }, { "title": "XSLT", @@ -81,7 +87,8 @@ "type": "JSR", "identifier": "63" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/10.json b/site/data/jdk/versions/10.json index 67a3b50c..46d03d89 100644 --- a/site/data/jdk/versions/10.json +++ b/site/data/jdk/versions/10.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "317" } - ] + ], + "predecessors": [] }, { "title": "GC Interface", @@ -38,7 +39,8 @@ "type": "JEP", "identifier": "304" } - ] + ], + "predecessors": [] }, { "title": "Parallel Full GC for G1", @@ -48,7 +50,8 @@ "type": "JEP", "identifier": "307" } - ] + ], + "predecessors": [] }, { "title": "Thread-Local Handshakes", @@ -58,7 +61,8 @@ "type": "JEP", "identifier": "312" } - ] + ], + "predecessors": [] }, { "title": "Alternative Memory Devices", @@ -68,7 +72,8 @@ "type": "JEP", "identifier": "316" } - ] + ], + "predecessors": [] }, { "title": "Keyword var", @@ -82,7 +87,8 @@ "type": "AlmanacFeature", "identifier": "var" } - ] + ], + "predecessors": [] }, { "title": "Additional Unicode Language-Tag Extensions", @@ -92,7 +98,8 @@ "type": "JEP", "identifier": "314" } - ] + ], + "predecessors": [] }, { "title": "javah Removed", @@ -102,7 +109,8 @@ "type": "JEP", "identifier": "313" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/11.json b/site/data/jdk/versions/11.json index b0609f43..8b0260a4 100644 --- a/site/data/jdk/versions/11.json +++ b/site/data/jdk/versions/11.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "309" } - ] + ], + "predecessors": [] }, { "title": "Epsilon GC", @@ -38,6 +39,12 @@ "type": "JEP", "identifier": "318" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "304" + } ] }, { @@ -48,7 +55,8 @@ "type": "JEP", "identifier": "333" } - ] + ], + "predecessors": [] }, { "title": "Nest-Based Access Control", @@ -58,7 +66,8 @@ "type": "JEP", "identifier": "181" } - ] + ], + "predecessors": [] }, { "title": "Low-Overhead Heap Profiling", @@ -68,7 +77,8 @@ "type": "JEP", "identifier": "331" } - ] + ], + "predecessors": [] }, { "title": "Improve Aarch64 Intrinsics", @@ -78,7 +88,8 @@ "type": "JEP", "identifier": "315" } - ] + ], + "predecessors": [] }, { "title": "Local Variable Syntax for Lambda Parameters", @@ -88,6 +99,12 @@ "type": "JEP", "identifier": "323" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "286" + } ] }, { @@ -98,6 +115,12 @@ "type": "JEP", "identifier": "321" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "110" + } ] }, { @@ -108,7 +131,8 @@ "type": "JEP", "identifier": "320" } - ] + ], + "predecessors": [] }, { "title": "Unicode 10 Support", @@ -118,7 +142,8 @@ "type": "JEP", "identifier": "327" } - ] + ], + "predecessors": [] }, { "title": "Nashorn JavaScript Engine deprecated", @@ -128,7 +153,8 @@ "type": "JEP", "identifier": "335" } - ] + ], + "predecessors": [] }, { "title": "New Cryptographic Algorithms", @@ -142,7 +168,8 @@ "type": "JEP", "identifier": "329" } - ] + ], + "predecessors": [] }, { "title": "TLS 1.3", @@ -152,7 +179,8 @@ "type": "JEP", "identifier": "332" } - ] + ], + "predecessors": [] }, { "title": "Single Source File Launch", @@ -162,7 +190,8 @@ "type": "JEP", "identifier": "330" } - ] + ], + "predecessors": [] }, { "title": "Flight Recorder", @@ -172,7 +201,8 @@ "type": "JEP", "identifier": "328" } - ] + ], + "predecessors": [] }, { "title": "Pack200 deprecated", @@ -182,7 +212,8 @@ "type": "JEP", "identifier": "336" } - ] + ], + "predecessors": [] }, { "title": "No more frames in JavaDoc", @@ -192,7 +223,8 @@ "type": "JDKIssue", "identifier": "8196202" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/12.json b/site/data/jdk/versions/12.json index 0a0c5110..ba56fec4 100644 --- a/site/data/jdk/versions/12.json +++ b/site/data/jdk/versions/12.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "189" } - ] + ], + "predecessors": [] }, { "title": "Switch Expressions", @@ -44,7 +45,8 @@ "type": "AlmanacFeature", "identifier": "switch" } - ] + ], + "predecessors": [] }, { "title": "JVM Constants", @@ -54,7 +56,8 @@ "type": "JEP", "identifier": "334" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/13.json b/site/data/jdk/versions/13.json index 146a2001..5c0059b0 100644 --- a/site/data/jdk/versions/13.json +++ b/site/data/jdk/versions/13.json @@ -28,6 +28,12 @@ "type": "JEP", "identifier": "350" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "310" + } ] }, { @@ -38,7 +44,8 @@ "type": "JEP", "identifier": "351" } - ] + ], + "predecessors": [] }, { "title": "Switch Expressions", @@ -54,6 +61,12 @@ "type": "AlmanacFeature", "identifier": "switch" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "325" + } ] }, { @@ -70,6 +83,12 @@ "type": "AlmanacFeature", "identifier": "textblocks" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "326" + } ] }, { @@ -80,7 +99,8 @@ "type": "JEP", "identifier": "353" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/14.json b/site/data/jdk/versions/14.json index 15d98021..cf41587a 100644 --- a/site/data/jdk/versions/14.json +++ b/site/data/jdk/versions/14.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "345" } - ] + ], + "predecessors": [] }, { "title": "JFR Event Streaming", @@ -38,7 +39,8 @@ "type": "JEP", "identifier": "349" } - ] + ], + "predecessors": [] }, { "title": "Helpful NullPointerExceptions", @@ -48,7 +50,8 @@ "type": "JEP", "identifier": "358" } - ] + ], + "predecessors": [] }, { "title": "Deprecate the Solaris and SPARC Ports", @@ -58,7 +61,8 @@ "type": "JEP", "identifier": "362" } - ] + ], + "predecessors": [] }, { "title": "Remove the Concurrent Mark Sweep (CMS) Garbage Collector", @@ -68,6 +72,12 @@ "type": "JEP", "identifier": "363" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "291" + } ] }, { @@ -78,7 +88,8 @@ "type": "JEP", "identifier": "364" } - ] + ], + "predecessors": [] }, { "title": "ZGC on Windows", @@ -88,7 +99,8 @@ "type": "JEP", "identifier": "365" } - ] + ], + "predecessors": [] }, { "title": "Deprecate the ParallelScavenge + SerialOld GC Combination", @@ -98,7 +110,8 @@ "type": "JEP", "identifier": "366" } - ] + ], + "predecessors": [] }, { "title": "Switch Expressions", @@ -112,6 +125,12 @@ "type": "AlmanacFeature", "identifier": "switch" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "354" + } ] }, { @@ -128,7 +147,8 @@ "type": "AlmanacFeature", "identifier": "records" } - ] + ], + "predecessors": [] }, { "title": "Text Blocks", @@ -144,6 +164,12 @@ "type": "AlmanacFeature", "identifier": "textblocks" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "355" + } ] }, { @@ -156,7 +182,8 @@ "type": "JEP", "identifier": "305" } - ] + ], + "predecessors": [] }, { "title": "Non-Volatile Mapped Byte Buffers", @@ -166,7 +193,8 @@ "type": "JEP", "identifier": "352" } - ] + ], + "predecessors": [] }, { "title": "Remove the Pack200 APIs", @@ -176,6 +204,12 @@ "type": "JEP", "identifier": "367" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "336" + } ] }, { @@ -188,7 +222,8 @@ "type": "JEP", "identifier": "370" } - ] + ], + "predecessors": [] }, { "title": "Remove the Pack200 Tools", @@ -198,6 +233,12 @@ "type": "JEP", "identifier": "367" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "336" + } ] }, { @@ -210,7 +251,8 @@ "type": "JEP", "identifier": "343" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/15.json b/site/data/jdk/versions/15.json index 044908b3..2e42db52 100644 --- a/site/data/jdk/versions/15.json +++ b/site/data/jdk/versions/15.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "374" } - ] + ], + "predecessors": [] }, { "title": "ZGC", @@ -38,6 +39,25 @@ "type": "JEP", "identifier": "377" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "365" + }, + { + "type": "JEP", + "identifier": "364" + }, + { + "type": "JEP", + "identifier": "351" + }, + { + "type": "JEP", + "identifier": "333", + "version": "11" + } ] }, { @@ -48,7 +68,8 @@ "type": "JEP", "identifier": "379" } - ] + ], + "predecessors": [] }, { "title": "Remove the Solaris and SPARC Ports", @@ -58,6 +79,12 @@ "type": "JEP", "identifier": "381" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "362" + } ] }, { @@ -74,7 +101,8 @@ "type": "AlmanacFeature", "identifier": "sealedtypes" } - ] + ], + "predecessors": [] }, { "title": "Pattern Matching for instanceof", @@ -86,6 +114,12 @@ "type": "JEP", "identifier": "375" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "305" + } ] }, { @@ -100,6 +134,12 @@ "type": "AlmanacFeature", "identifier": "textblocks" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "368" + } ] }, { @@ -116,6 +156,12 @@ "type": "AlmanacFeature", "identifier": "records" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "359" + } ] }, { @@ -128,7 +174,8 @@ "type": "JEP", "identifier": "384" } - ] + ], + "predecessors": [] }, { "title": "Edwards-Curve Digital Signature Algorithm (EdDSA)", @@ -138,7 +185,8 @@ "type": "JEP", "identifier": "339" } - ] + ], + "predecessors": [] }, { "title": "Hidden Classes", @@ -148,7 +196,8 @@ "type": "JEP", "identifier": "371" } - ] + ], + "predecessors": [] }, { "title": "Remove the Nashorn JavaScript Engine", @@ -158,6 +207,12 @@ "type": "JEP", "identifier": "372" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "335" + } ] }, { @@ -170,6 +225,12 @@ "type": "JEP", "identifier": "383" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "370" + } ] }, { @@ -180,7 +241,8 @@ "type": "JEP", "identifier": "385" } - ] + ], + "predecessors": [] }, { "title": "Reimplement the Legacy DatagramSocket API", @@ -190,7 +252,8 @@ "type": "JEP", "identifier": "373" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/16.json b/site/data/jdk/versions/16.json index 5fe7926e..812df81b 100644 --- a/site/data/jdk/versions/16.json +++ b/site/data/jdk/versions/16.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "376" } - ] + ], + "predecessors": [] }, { "title": "Alpine Linux Port", @@ -38,7 +39,8 @@ "type": "JEP", "identifier": "386" } - ] + ], + "predecessors": [] }, { "title": "Windows/AArch64 Port", @@ -48,7 +50,8 @@ "type": "JEP", "identifier": "388" } - ] + ], + "predecessors": [] }, { "title": "Strongly Encapsulate JDK Internals by Default", @@ -58,6 +61,16 @@ "type": "JEP", "identifier": "396" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "260" + }, + { + "type": "JEP", + "identifier": "261" + } ] }, { @@ -70,7 +83,8 @@ "type": "JEP", "identifier": "338" } - ] + ], + "predecessors": [] }, { "title": "Unix-Domain Socket Channels", @@ -80,7 +94,8 @@ "type": "JEP", "identifier": "380" } - ] + ], + "predecessors": [] }, { "title": "Foreign Linker API", @@ -92,7 +107,8 @@ "type": "JEP", "identifier": "389" } - ] + ], + "predecessors": [] }, { "title": "Foreign-Memory Access API", @@ -104,6 +120,12 @@ "type": "JEP", "identifier": "393" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "383" + } ] }, { @@ -114,7 +136,8 @@ "type": "JEP", "identifier": "390" } - ] + ], + "predecessors": [] }, { "title": "Pattern Matching for instanceof", @@ -128,6 +151,12 @@ "type": "AlmanacFeature", "identifier": "instanceof-patterns" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "375" + } ] }, { @@ -142,6 +171,12 @@ "type": "AlmanacFeature", "identifier": "records" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "384" + } ] }, { @@ -152,7 +187,8 @@ "type": "JEP", "identifier": "395" } - ] + ], + "predecessors": [] }, { "title": "Sealed Classes", @@ -168,6 +204,12 @@ "type": "AlmanacFeature", "identifier": "sealedtypes" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "360" + } ] }, { @@ -178,6 +220,12 @@ "type": "JEP", "identifier": "392" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "343" + } ] }, { @@ -188,7 +236,8 @@ "type": "JEP", "identifier": "347" } - ] + ], + "predecessors": [] }, { "title": "Migrate to Git/GitHub", @@ -202,7 +251,8 @@ "type": "JEP", "identifier": "369" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/17.json b/site/data/jdk/versions/17.json index d033fd26..f1b55631 100644 --- a/site/data/jdk/versions/17.json +++ b/site/data/jdk/versions/17.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "306" } - ] + ], + "predecessors": [] }, { "title": "New macOS Rendering Pipeline", @@ -38,7 +39,8 @@ "type": "JEP", "identifier": "382" } - ] + ], + "predecessors": [] }, { "title": "macOS/AArch64 Port", @@ -48,7 +50,8 @@ "type": "JEP", "identifier": "391" } - ] + ], + "predecessors": [] }, { "title": "Enhanced Pseudo-Random Number Generators", @@ -58,7 +61,8 @@ "type": "JEP", "identifier": "356" } - ] + ], + "predecessors": [] }, { "title": "Deprecate the Applet API for Removal", @@ -68,6 +72,12 @@ "type": "JEP", "identifier": "398" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "289" + } ] }, { @@ -78,6 +88,12 @@ "type": "JEP", "identifier": "403" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "396" + } ] }, { @@ -94,7 +110,8 @@ "type": "AlmanacFeature", "identifier": "typepatterns" } - ] + ], + "predecessors": [] }, { "title": "Remove RMI Activation", @@ -104,6 +121,12 @@ "type": "JEP", "identifier": "407" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "385" + } ] }, { @@ -118,6 +141,12 @@ "type": "AlmanacFeature", "identifier": "sealedtypes" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "397" + } ] }, { @@ -128,7 +157,8 @@ "type": "JEP", "identifier": "410" } - ] + ], + "predecessors": [] }, { "title": "Deprecate the Security Manager for Removal", @@ -138,7 +168,8 @@ "type": "JEP", "identifier": "411" } - ] + ], + "predecessors": [] }, { "title": "Foreign Function \u0026 Memory API", @@ -150,6 +181,12 @@ "type": "JEP", "identifier": "412" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "393" + } ] }, { @@ -162,7 +199,13 @@ "type": "JEP", "identifier": "414" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "338" + } ] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/18.json b/site/data/jdk/versions/18.json index 6614b413..dc3d5e36 100644 --- a/site/data/jdk/versions/18.json +++ b/site/data/jdk/versions/18.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "400" } - ] + ], + "predecessors": [] }, { "title": "Simple Web Server", @@ -38,7 +39,8 @@ "type": "JEP", "identifier": "408" } - ] + ], + "predecessors": [] }, { "title": "Code Snippets in Java API Documentation", @@ -48,7 +50,8 @@ "type": "JEP", "identifier": "413" } - ] + ], + "predecessors": [] }, { "title": "Pattern Matching for switch", @@ -64,6 +67,12 @@ "type": "AlmanacFeature", "identifier": "typepatterns" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "406" + } ] }, { @@ -74,7 +83,8 @@ "type": "JEP", "identifier": "416" } - ] + ], + "predecessors": [] }, { "title": "Vector API", @@ -86,6 +96,12 @@ "type": "JEP", "identifier": "417" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "414" + } ] }, { @@ -96,7 +112,8 @@ "type": "JEP", "identifier": "418" } - ] + ], + "predecessors": [] }, { "title": "Foreign Function \u0026 Memory API", @@ -108,6 +125,12 @@ "type": "JEP", "identifier": "419" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "412" + } ] }, { @@ -118,7 +141,8 @@ "type": "JEP", "identifier": "421" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/19.json b/site/data/jdk/versions/19.json index b5194cea..c38e08c1 100644 --- a/site/data/jdk/versions/19.json +++ b/site/data/jdk/versions/19.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "422" } - ] + ], + "predecessors": [] }, { "title": "Record Patterns", @@ -44,7 +45,8 @@ "type": "AlmanacFeature", "identifier": "recordpatterns" } - ] + ], + "predecessors": [] }, { "title": "Pattern Matching for switch", @@ -60,6 +62,12 @@ "type": "AlmanacFeature", "identifier": "typepatterns" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "420" + } ] }, { @@ -72,6 +80,12 @@ "type": "JEP", "identifier": "424" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "419" + } ] }, { @@ -88,7 +102,8 @@ "type": "AlmanacFeature", "identifier": "virtual-threads" } - ] + ], + "predecessors": [] }, { "title": "Vector API", @@ -100,6 +115,12 @@ "type": "JEP", "identifier": "426" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "417" + } ] }, { @@ -112,7 +133,8 @@ "type": "JEP", "identifier": "428" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/20.json b/site/data/jdk/versions/20.json index 2ec8ab00..e8954e3e 100644 --- a/site/data/jdk/versions/20.json +++ b/site/data/jdk/versions/20.json @@ -34,6 +34,12 @@ "type": "AlmanacFeature", "identifier": "recordpatterns" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "405" + } ] }, { @@ -50,6 +56,12 @@ "type": "AlmanacFeature", "identifier": "typepatterns" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "427" + } ] }, { @@ -62,7 +74,8 @@ "type": "JEP", "identifier": "429" } - ] + ], + "predecessors": [] }, { "title": "Foreign Function \u0026 Memory API", @@ -74,6 +87,12 @@ "type": "JEP", "identifier": "434" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "424" + } ] }, { @@ -90,6 +109,12 @@ "type": "AlmanacFeature", "identifier": "virtual-threads" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "425" + } ] }, { @@ -102,7 +127,8 @@ "type": "JEP", "identifier": "437" } - ] + ], + "predecessors": [] }, { "title": "Vector API", @@ -114,7 +140,13 @@ "type": "JEP", "identifier": "438" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "426" + } ] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/21.json b/site/data/jdk/versions/21.json index 41678c16..1a12fc3c 100644 --- a/site/data/jdk/versions/21.json +++ b/site/data/jdk/versions/21.json @@ -28,6 +28,12 @@ "type": "JEP", "identifier": "439" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "377" + } ] }, { @@ -38,7 +44,8 @@ "type": "JEP", "identifier": "449" } - ] + ], + "predecessors": [] }, { "title": "Prepare to Disallow the Dynamic Loading of Agents", @@ -48,7 +55,8 @@ "type": "JEP", "identifier": "451" } - ] + ], + "predecessors": [] }, { "title": "String Templates", @@ -64,7 +72,8 @@ "type": "AlmanacFeature", "identifier": "stringtemplates" } - ] + ], + "predecessors": [] }, { "title": "Record Patterns", @@ -78,6 +87,12 @@ "type": "AlmanacFeature", "identifier": "recordpatterns" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "432" + } ] }, { @@ -92,6 +107,12 @@ "type": "AlmanacFeature", "identifier": "typepatterns" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "433" + } ] }, { @@ -104,7 +125,8 @@ "type": "JEP", "identifier": "443" } - ] + ], + "predecessors": [] }, { "title": "Unnamed Classes and Instance Main Methods", @@ -120,7 +142,8 @@ "type": "AlmanacFeature", "identifier": "jep445" } - ] + ], + "predecessors": [] }, { "title": "Sequenced Collections", @@ -130,7 +153,8 @@ "type": "JEP", "identifier": "431" } - ] + ], + "predecessors": [] }, { "title": "Foreign Function \u0026 Memory API", @@ -142,6 +166,12 @@ "type": "JEP", "identifier": "442" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "434" + } ] }, { @@ -156,6 +186,12 @@ "type": "AlmanacFeature", "identifier": "virtual-threads" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "436" + } ] }, { @@ -168,6 +204,12 @@ "type": "JEP", "identifier": "446" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "429" + } ] }, { @@ -180,6 +222,12 @@ "type": "JEP", "identifier": "448" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "438" + } ] }, { @@ -190,7 +238,8 @@ "type": "JEP", "identifier": "452" } - ] + ], + "predecessors": [] }, { "title": "Structured Concurrency", @@ -202,7 +251,13 @@ "type": "JEP", "identifier": "453" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "437" + } ] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/22.json b/site/data/jdk/versions/22.json index be83d43e..73bf6744 100644 --- a/site/data/jdk/versions/22.json +++ b/site/data/jdk/versions/22.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "423" } - ] + ], + "predecessors": [] }, { "title": "Statements before super(...)", @@ -40,7 +41,8 @@ "type": "JEP", "identifier": "447" } - ] + ], + "predecessors": [] }, { "title": "Unnamed Variables \u0026 Patterns", @@ -50,6 +52,12 @@ "type": "JEP", "identifier": "456" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "443" + } ] }, { @@ -66,6 +74,12 @@ "type": "AlmanacFeature", "identifier": "stringtemplates" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "430" + } ] }, { @@ -82,6 +96,12 @@ "type": "AlmanacFeature", "identifier": "jep445" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "445" + } ] }, { @@ -92,6 +112,12 @@ "type": "JEP", "identifier": "454" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "442" + } ] }, { @@ -104,7 +130,8 @@ "type": "JEP", "identifier": "457" } - ] + ], + "predecessors": [] }, { "title": "Stream Gatherers", @@ -120,7 +147,8 @@ "type": "AlmanacFeature", "identifier": "gatherers" } - ] + ], + "predecessors": [] }, { "title": "Structured Concurrency", @@ -132,7 +160,8 @@ "type": "JEP", "identifier": "462" } - ] + ], + "predecessors": [] }, { "title": "Launch Multi-File Source-Code Programs", @@ -142,7 +171,13 @@ "type": "JEP", "identifier": "458" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "330" + } ] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/23.json b/site/data/jdk/versions/23.json index d2640c47..2edc3742 100644 --- a/site/data/jdk/versions/23.json +++ b/site/data/jdk/versions/23.json @@ -29,7 +29,8 @@ "type": "JEP", "identifier": "455" } - ] + ], + "predecessors": [] }, { "title": "Module Import Declarations", @@ -41,7 +42,8 @@ "type": "JEP", "identifier": "476" } - ] + ], + "predecessors": [] }, { "title": "Implicitly Declared Classes and Instance Main Methods", @@ -53,6 +55,12 @@ "type": "JEP", "identifier": "477" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "463" + } ] }, { @@ -65,6 +73,12 @@ "type": "JEP", "identifier": "482" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "447" + } ] }, { @@ -77,6 +91,12 @@ "type": "JEP", "identifier": "466" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "457" + } ] }, { @@ -87,7 +107,8 @@ "type": "JEP", "identifier": "471" } - ] + ], + "predecessors": [] }, { "title": "Stream Gatherers", @@ -103,6 +124,12 @@ "type": "AlmanacFeature", "identifier": "gatherers" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "461" + } ] }, { @@ -115,6 +142,12 @@ "type": "JEP", "identifier": "480" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "462" + } ] }, { @@ -127,6 +160,12 @@ "type": "JEP", "identifier": "481" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "464" + } ] }, { @@ -137,6 +176,12 @@ "type": "JEP", "identifier": "474" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "439" + } ] }, { @@ -147,8 +192,9 @@ "type": "JEP", "identifier": "467" } - ] + ], + "predecessors": [] } ], "latestversion": "23.0.1" -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/24.json b/site/data/jdk/versions/24.json index 008b9ebc..4bbc6a84 100644 --- a/site/data/jdk/versions/24.json +++ b/site/data/jdk/versions/24.json @@ -25,7 +25,8 @@ "type": "JEP", "identifier": "475" } - ] + ], + "predecessors": [] }, { "title": "Remove the Windows 32-bit x86 Port", @@ -35,6 +36,12 @@ "type": "JEP", "identifier": "479" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "449" + } ] }, { @@ -45,7 +52,8 @@ "type": "JEP", "identifier": "483" } - ] + ], + "predecessors": [] }, { "title": "ZGC: Remove the Non-Generational Mode", @@ -55,6 +63,16 @@ "type": "JEP", "identifier": "490" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "439" + }, + { + "type": "JEP", + "identifier": "474" + } ] }, { @@ -65,7 +83,8 @@ "type": "JEP", "identifier": "491" } - ] + ], + "predecessors": [] }, { "title": "Deprecate the 32-bit x86 Port for Removal", @@ -75,7 +94,8 @@ "type": "JEP", "identifier": "501" } - ] + ], + "predecessors": [] }, { "title": "Prepare to Restrict the Use of JNI", @@ -85,6 +105,12 @@ "type": "JEP", "identifier": "472" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "454" + } ] }, { @@ -97,7 +123,8 @@ "type": "JEP", "identifier": "478" } - ] + ], + "predecessors": [] }, { "title": "Class-File API", @@ -107,6 +134,16 @@ "type": "JEP", "identifier": "484" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "466" + }, + { + "type": "JEP", + "identifier": "457" + } ] }, { @@ -117,6 +154,12 @@ "type": "JEP", "identifier": "485" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "473" + } ] }, { @@ -127,6 +170,12 @@ "type": "JEP", "identifier": "486" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "411" + } ] }, { @@ -139,6 +188,12 @@ "type": "JEP", "identifier": "487" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "481" + } ] }, { @@ -151,6 +206,12 @@ "type": "JEP", "identifier": "488" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "455" + } ] }, { @@ -163,6 +224,12 @@ "type": "JEP", "identifier": "489" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "469" + } ] }, { @@ -173,7 +240,8 @@ "type": "JEP", "identifier": "496" } - ] + ], + "predecessors": [] }, { "title": "Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm", @@ -183,7 +251,8 @@ "type": "JEP", "identifier": "497" } - ] + ], + "predecessors": [] }, { "title": "Warn upon Use of Memory-Access Methods in sun.misc.Unsafe", @@ -193,6 +262,12 @@ "type": "JEP", "identifier": "498" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "471" + } ] }, { @@ -205,6 +280,12 @@ "type": "JEP", "identifier": "499" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "480" + } ] }, { @@ -217,6 +298,12 @@ "type": "JEP", "identifier": "492" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "482" + } ] }, { @@ -229,6 +316,12 @@ "type": "JEP", "identifier": "494" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "476" + } ] }, { @@ -241,6 +334,12 @@ "type": "JEP", "identifier": "495" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "477" + } ] }, { @@ -251,7 +350,8 @@ "type": "JEP", "identifier": "493" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/5.json b/site/data/jdk/versions/5.json index 281bb3f4..5791bcbd 100644 --- a/site/data/jdk/versions/5.json +++ b/site/data/jdk/versions/5.json @@ -24,7 +24,8 @@ "type": "JSR", "identifier": "14" } - ] + ], + "predecessors": [] }, { "title": "Annotations", @@ -34,7 +35,8 @@ "type": "JSR", "identifier": "175" } - ] + ], + "predecessors": [] }, { "title": "Autoboxing", @@ -44,7 +46,8 @@ "type": "JSR", "identifier": "201" } - ] + ], + "predecessors": [] }, { "title": "Enums", @@ -54,7 +57,8 @@ "type": "JSR", "identifier": "201" } - ] + ], + "predecessors": [] }, { "title": "For-each Loops", @@ -64,7 +68,8 @@ "type": "JSR", "identifier": "201" } - ] + ], + "predecessors": [] }, { "title": "Static Imports", @@ -74,7 +79,8 @@ "type": "JSR", "identifier": "201" } - ] + ], + "predecessors": [] }, { "title": "Var Args", @@ -84,7 +90,8 @@ "type": "JSR", "identifier": "201" } - ] + ], + "predecessors": [] }, { "title": "Concurrency Utilities (java.util.concurrent)", @@ -94,7 +101,8 @@ "type": "JSR", "identifier": "166" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/6.json b/site/data/jdk/versions/6.json index 860ee71a..73db13c4 100644 --- a/site/data/jdk/versions/6.json +++ b/site/data/jdk/versions/6.json @@ -24,7 +24,8 @@ "type": "JSR", "identifier": "105" } - ] + ], + "predecessors": [] }, { "title": "Streaming API for XML 1.0 (javax.xml.stream)", @@ -34,7 +35,8 @@ "type": "JSR", "identifier": "173" } - ] + ], + "predecessors": [] }, { "title": "Web Services Metadata (javax.jws)", @@ -44,7 +46,8 @@ "type": "JSR", "identifier": "181" } - ] + ], + "predecessors": [] }, { "title": "Java API for XML Processing 1.3 (javax.xml.*)", @@ -54,7 +57,8 @@ "type": "JSR", "identifier": "206" } - ] + ], + "predecessors": [] }, { "title": "JAXB 2.0 (javax.xml.bind)", @@ -64,7 +68,8 @@ "type": "JSR", "identifier": "222" } - ] + ], + "predecessors": [] }, { "title": "Scripting for the Java Platform (javax.script)", @@ -74,7 +79,8 @@ "type": "JSR", "identifier": "223" } - ] + ], + "predecessors": [] }, { "title": "XML-Based Web Services 2.0 (javax.xml.ws)", @@ -84,7 +90,8 @@ "type": "JSR", "identifier": "224" } - ] + ], + "predecessors": [] }, { "title": "Common Annotations (javax.annotations)", @@ -94,7 +101,8 @@ "type": "JSR", "identifier": "250" } - ] + ], + "predecessors": [] }, { "title": "Smart Card I/O (javax.smartcardio)", @@ -104,7 +112,8 @@ "type": "JSR", "identifier": "268" } - ] + ], + "predecessors": [] }, { "title": "Pluggable Annotation Processing (javax.lang.model)", @@ -114,7 +123,8 @@ "type": "JSR", "identifier": "269" } - ] + ], + "predecessors": [] }, { "title": "Java Activation Framework (javax.annotation)", @@ -124,7 +134,8 @@ "type": "JDKIssue", "identifier": "6254474" } - ] + ], + "predecessors": [] }, { "title": "javac supports java.lang.SuppressWarnings annotation", @@ -134,7 +145,8 @@ "type": "JDKIssue", "identifier": "4986256" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/7.json b/site/data/jdk/versions/7.json index 12f0a214..5d00c366 100644 --- a/site/data/jdk/versions/7.json +++ b/site/data/jdk/versions/7.json @@ -29,7 +29,8 @@ "type": "JSR", "identifier": "292" } - ] + ], + "predecessors": [] }, { "title": "Switch on String", @@ -39,7 +40,8 @@ "type": "JSR", "identifier": "334" } - ] + ], + "predecessors": [] }, { "title": "Try-with", @@ -49,7 +51,8 @@ "type": "JSR", "identifier": "334" } - ] + ], + "predecessors": [] }, { "title": "Diamond Operator", @@ -59,7 +62,8 @@ "type": "JSR", "identifier": "334" } - ] + ], + "predecessors": [] }, { "title": "Binary Integer Literals", @@ -69,7 +73,8 @@ "type": "JSR", "identifier": "334" } - ] + ], + "predecessors": [] }, { "title": "Underscores in numeric literals", @@ -79,7 +84,8 @@ "type": "JSR", "identifier": "334" } - ] + ], + "predecessors": [] }, { "title": "Multi Catch", @@ -89,7 +95,8 @@ "type": "JSR", "identifier": "334" } - ] + ], + "predecessors": [] }, { "title": "Method Handles", @@ -99,7 +106,8 @@ "type": "JSR", "identifier": "292" } - ] + ], + "predecessors": [] }, { "title": "NIO.2 (java.nio.file)", @@ -109,7 +117,8 @@ "type": "JSR", "identifier": "203" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/8.json b/site/data/jdk/versions/8.json index 907e308d..377c7a17 100644 --- a/site/data/jdk/versions/8.json +++ b/site/data/jdk/versions/8.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "122" } - ] + ], + "predecessors": [] }, { "title": "Lambda Expressions", @@ -38,7 +39,8 @@ "type": "JSR", "identifier": "335" } - ] + ], + "predecessors": [] }, { "title": "Default Methods in Interfaces", @@ -48,7 +50,8 @@ "type": "JSR", "identifier": "335" } - ] + ], + "predecessors": [] }, { "title": "Effectively Final Variables", @@ -58,7 +61,8 @@ "type": "JSR", "identifier": "335" } - ] + ], + "predecessors": [] }, { "title": "Type Use Annotations", @@ -68,7 +72,8 @@ "type": "JEP", "identifier": "104" } - ] + ], + "predecessors": [] }, { "title": "Repeating Annotations", @@ -78,7 +83,8 @@ "type": "JEP", "identifier": "120" } - ] + ], + "predecessors": [] }, { "title": "Streams (java.util.stream)", @@ -88,7 +94,8 @@ "type": "JEP", "identifier": "107" } - ] + ], + "predecessors": [] }, { "title": "Lambda APIs (java.util.function)", @@ -98,7 +105,8 @@ "type": "JEP", "identifier": "109" } - ] + ], + "predecessors": [] }, { "title": "Date Time (java.time)", @@ -112,7 +120,8 @@ "type": "JEP", "identifier": "150" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/data/jdk/versions/9.json b/site/data/jdk/versions/9.json index dce44eca..7e48ebe8 100644 --- a/site/data/jdk/versions/9.json +++ b/site/data/jdk/versions/9.json @@ -28,7 +28,8 @@ "type": "JEP", "identifier": "261" } - ] + ], + "predecessors": [] }, { "title": "Private Methods in Interfaces", @@ -38,7 +39,8 @@ "type": "JEP", "identifier": "213" } - ] + ], + "predecessors": [] }, { "title": "HTTP/2 Client", @@ -50,7 +52,8 @@ "type": "JEP", "identifier": "110" } - ] + ], + "predecessors": [] }, { "title": "Var Handles", @@ -60,7 +63,8 @@ "type": "JEP", "identifier": "193" } - ] + ], + "predecessors": [] }, { "title": "UTF-8 Property Resource Bundles", @@ -70,7 +74,8 @@ "type": "JEP", "identifier": "226" } - ] + ], + "predecessors": [] }, { "title": "Compact Strings", @@ -80,6 +85,12 @@ "type": "JEP", "identifier": "254" } + ], + "predecessors": [ + { + "type": "JEP", + "identifier": "192" + } ] }, { @@ -90,7 +101,8 @@ "type": "JEP", "identifier": "266" } - ] + ], + "predecessors": [] }, { "title": "Enhanced Deprecation", @@ -100,7 +112,8 @@ "type": "JEP", "identifier": "277" } - ] + ], + "predecessors": [] }, { "title": "Object.finalize() deprecated", @@ -110,7 +123,8 @@ "type": "JDKIssue", "identifier": "8165641" } - ] + ], + "predecessors": [] }, { "title": "jshell", @@ -120,7 +134,8 @@ "type": "JEP", "identifier": "222" } - ] + ], + "predecessors": [] }, { "title": "Multi-Release JAR Files", @@ -130,7 +145,8 @@ "type": "JEP", "identifier": "238" } - ] + ], + "predecessors": [] }, { "title": "Compile for Older Platform Versions", @@ -140,7 +156,8 @@ "type": "JEP", "identifier": "247" } - ] + ], + "predecessors": [] }, { "title": "jlink", @@ -150,7 +167,8 @@ "type": "JEP", "identifier": "282" } - ] + ], + "predecessors": [] }, { "title": "Indify String Concatenation", @@ -160,7 +178,8 @@ "type": "JEP", "identifier": "280" } - ] + ], + "predecessors": [] } ] -} \ No newline at end of file +} diff --git a/site/layouts/shortcodes/featuresgrid.html b/site/layouts/shortcodes/featuresgrid.html new file mode 100644 index 00000000..2bab5f2e --- /dev/null +++ b/site/layouts/shortcodes/featuresgrid.html @@ -0,0 +1,50 @@ +{{- $featureVersions := dict }} +{{- range $.Site.Data.jdk.versions }} + {{ $version := .version }} + {{- range .features }} + {{- range .refs }} + {{- $featureVersions = merge $featureVersions (dict (slice .type .identifier) $version ) }} + {{- end }} + {{- end }} +{{- end }} + +
| Feature | + {{- range $jdk := sort $.Site.Data.jdk.versions "ga" "asc" }} +{{ $jdk.version }} | + {{- end }} +
|---|---|
| {{ $feature.title }} | + {{ $highlight := false }} + {{- range $jdkHeader := sort $.Site.Data.jdk.versions "ga" "asc" }} ++ {{- range $predecessor := $feature.predecessors }} + {{ if eq $jdkHeader.version (index $featureVersions (slice $predecessor.type $predecessor.identifier )) }} + {{ partial "featureref" $predecessor }} + {{ end -}}{{ end -}} + {{ with $feature.refs }}{{ range $idx, $item := . -}} + {{ if and (eq $jdk.version $jdkHeader.version) (eq $item.type "JEP") }} + {{ $highlight = true }} + {{ partial "featureref" $item }} + {{ end -}} + {{ if $highlight }} + + {{- end }}{{- end }}{{- end }} + | + {{- end }} +