diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 4b621a3..ab9eb05 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -10,6 +10,8 @@ on: - 'site/**' - 'html-generators/generateog.java' - 'html-generators/og/**' + - 'html-generators/tags.properties' + - 'html-generators/categories.properties' workflow_run: workflows: ['Build Generator JARs'] types: [completed] @@ -53,7 +55,7 @@ jobs: NEEDS_GENERATE=false - if echo "$CHANGED" | grep -qE '^(content/|translations/|templates/)'; then + if echo "$CHANGED" | grep -qE '^(content/|translations/|templates/|html-generators/tags\.properties|html-generators/categories\.properties)'; then NEEDS_GENERATE=true fi diff --git a/.gitignore b/.gitignore index dfafff6..f6e00d5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ site/security/*.html site/tooling/*.html site/enterprise/*.html +# Generated topic pages (built by html-generators/) +site/topics/*.html + # Generated aggregate file (built from individual JSON sources by html-generators/) site/data/snippets.json diff --git a/content/collections/collectors-teeing.yaml b/content/collections/collectors-teeing.yaml index f935795..1fdf649 100644 --- a/content/collections/collectors-teeing.yaml +++ b/content/collections/collectors-teeing.yaml @@ -46,6 +46,9 @@ related: - "collections/copying-collections-immutably" - "collections/unmodifiable-collectors" - "collections/stream-toarray-typed" +tags: +- streams +- collectors docs: - title: "Collectors.teeing()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/stream/Collectors.html#teeing(java.util.stream.Collector,java.util.stream.Collector,java.util.function.BiFunction)" diff --git a/content/collections/copying-collections-immutably.yaml b/content/collections/copying-collections-immutably.yaml index 851216f..3a6cd93 100644 --- a/content/collections/copying-collections-immutably.yaml +++ b/content/collections/copying-collections-immutably.yaml @@ -40,6 +40,8 @@ related: - "collections/immutable-set-creation" - "collections/map-entry-factory" - "collections/immutable-list-creation" +tags: +- collections docs: - title: "List.copyOf()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/List.html#copyOf(java.util.Collection)" diff --git a/content/collections/immutable-list-creation.yaml b/content/collections/immutable-list-creation.yaml index 0b33dca..9dec218 100644 --- a/content/collections/immutable-list-creation.yaml +++ b/content/collections/immutable-list-creation.yaml @@ -42,6 +42,8 @@ related: - "collections/immutable-map-creation" - "collections/immutable-set-creation" - "collections/sequenced-collections" +tags: +- collections docs: - title: "List.of()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/List.html#of()" diff --git a/content/collections/immutable-map-creation.yaml b/content/collections/immutable-map-creation.yaml index f58db19..1cf641b 100644 --- a/content/collections/immutable-map-creation.yaml +++ b/content/collections/immutable-map-creation.yaml @@ -40,6 +40,8 @@ related: - "collections/copying-collections-immutably" - "collections/sequenced-collections" - "streams/stream-tolist" +tags: +- collections docs: - title: "Map.of()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Map.html#of()" diff --git a/content/collections/immutable-set-creation.yaml b/content/collections/immutable-set-creation.yaml index 5cbc41f..a9f571b 100644 --- a/content/collections/immutable-set-creation.yaml +++ b/content/collections/immutable-set-creation.yaml @@ -41,6 +41,8 @@ related: - "collections/copying-collections-immutably" - "collections/collectors-teeing" - "streams/stream-tolist" +tags: +- collections docs: - title: "Set.of()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Set.html#of()" diff --git a/content/collections/map-entry-factory.yaml b/content/collections/map-entry-factory.yaml index cdf3ec7..bd5d9f0 100644 --- a/content/collections/map-entry-factory.yaml +++ b/content/collections/map-entry-factory.yaml @@ -38,6 +38,8 @@ related: - "collections/sequenced-collections" - "collections/immutable-map-creation" - "collections/immutable-list-creation" +tags: +- collections docs: - title: "Map.entry()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Map.html#entry(K,V)" diff --git a/content/collections/reverse-list-iteration.yaml b/content/collections/reverse-list-iteration.yaml index 4c850f1..5fa26cd 100644 --- a/content/collections/reverse-list-iteration.yaml +++ b/content/collections/reverse-list-iteration.yaml @@ -43,6 +43,8 @@ related: - "collections/sequenced-collections" - "collections/immutable-list-creation" - "streams/stream-tolist" +tags: +- collections docs: - title: "SequencedCollection (Java 21)" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/SequencedCollection.html" diff --git a/content/collections/sequenced-collections.yaml b/content/collections/sequenced-collections.yaml index 09d2169..317051e 100644 --- a/content/collections/sequenced-collections.yaml +++ b/content/collections/sequenced-collections.yaml @@ -42,6 +42,8 @@ related: - "collections/collectors-teeing" - "collections/immutable-set-creation" - "collections/immutable-map-creation" +tags: +- collections docs: - title: "Sequenced Collections (JEP 431)" href: "https://openjdk.org/jeps/431" diff --git a/content/collections/stream-toarray-typed.yaml b/content/collections/stream-toarray-typed.yaml index 7fb7897..2a1227f 100644 --- a/content/collections/stream-toarray-typed.yaml +++ b/content/collections/stream-toarray-typed.yaml @@ -46,6 +46,9 @@ related: - "collections/collectors-teeing" - "collections/map-entry-factory" - "collections/immutable-set-creation" +tags: +- streams +- collections docs: - title: "Stream.toArray()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/stream/Stream.html#toArray(java.util.function.IntFunction)" diff --git a/content/collections/unmodifiable-collectors.yaml b/content/collections/unmodifiable-collectors.yaml index 9818d01..44458d7 100644 --- a/content/collections/unmodifiable-collectors.yaml +++ b/content/collections/unmodifiable-collectors.yaml @@ -41,6 +41,9 @@ related: - "collections/immutable-map-creation" - "collections/immutable-set-creation" - "streams/stream-tolist" +tags: +- streams +- collections docs: - title: "Stream.toList()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/stream/Stream.html#toList()" diff --git a/content/concurrency/completablefuture-chaining.yaml b/content/concurrency/completablefuture-chaining.yaml index 5dbae6f..e201544 100644 --- a/content/concurrency/completablefuture-chaining.yaml +++ b/content/concurrency/completablefuture-chaining.yaml @@ -43,6 +43,9 @@ related: - "concurrency/stable-values" - "concurrency/scoped-values" - "concurrency/structured-concurrency" +tags: +- concurrency +- async docs: - title: "CompletableFuture" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/CompletableFuture.html" diff --git a/content/concurrency/concurrent-http-virtual.yaml b/content/concurrency/concurrent-http-virtual.yaml index 6d6d890..d36ef64 100644 --- a/content/concurrency/concurrent-http-virtual.yaml +++ b/content/concurrency/concurrent-http-virtual.yaml @@ -51,6 +51,9 @@ related: - "concurrency/structured-concurrency" - "concurrency/stable-values" - "concurrency/lock-free-lazy-init" +tags: +- virtual-threads +- concurrency docs: - title: "Virtual Threads (JEP 444)" href: "https://openjdk.org/jeps/444" diff --git a/content/concurrency/executor-try-with-resources.yaml b/content/concurrency/executor-try-with-resources.yaml index 9cda137..b331568 100644 --- a/content/concurrency/executor-try-with-resources.yaml +++ b/content/concurrency/executor-try-with-resources.yaml @@ -48,6 +48,9 @@ related: - "concurrency/completablefuture-chaining" - "concurrency/virtual-threads" - "concurrency/thread-sleep-duration" +tags: +- virtual-threads +- concurrency docs: - title: "ExecutorService" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/ExecutorService.html" diff --git a/content/concurrency/lock-free-lazy-init.yaml b/content/concurrency/lock-free-lazy-init.yaml index 904309d..ff73537 100644 --- a/content/concurrency/lock-free-lazy-init.yaml +++ b/content/concurrency/lock-free-lazy-init.yaml @@ -55,6 +55,8 @@ related: - "concurrency/virtual-threads" - "concurrency/structured-concurrency" - "concurrency/scoped-values" +tags: +- concurrency docs: - title: "StableValue (JEP 502)" href: "https://openjdk.org/jeps/502" diff --git a/content/concurrency/process-api.yaml b/content/concurrency/process-api.yaml index 4689b9e..d87e2d6 100644 --- a/content/concurrency/process-api.yaml +++ b/content/concurrency/process-api.yaml @@ -46,6 +46,8 @@ related: - "concurrency/scoped-values" - "concurrency/concurrent-http-virtual" - "concurrency/completablefuture-chaining" +tags: +- concurrency docs: - title: "ProcessHandle" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/ProcessHandle.html" diff --git a/content/concurrency/scoped-values.yaml b/content/concurrency/scoped-values.yaml index 2419c01..9dcbeb2 100644 --- a/content/concurrency/scoped-values.yaml +++ b/content/concurrency/scoped-values.yaml @@ -48,6 +48,9 @@ related: - "concurrency/virtual-threads" - "concurrency/structured-concurrency" - "concurrency/stable-values" +tags: +- concurrency +- virtual-threads docs: - title: "Scoped Values (JEP 487)" href: "https://openjdk.org/jeps/487" diff --git a/content/concurrency/stable-values.yaml b/content/concurrency/stable-values.yaml index 79f47e8..0e0f0ad 100644 --- a/content/concurrency/stable-values.yaml +++ b/content/concurrency/stable-values.yaml @@ -50,6 +50,8 @@ related: - "concurrency/virtual-threads" - "concurrency/structured-concurrency" - "concurrency/scoped-values" +tags: +- concurrency docs: - title: "Stable Values (JEP 502)" href: "https://openjdk.org/jeps/502" diff --git a/content/concurrency/structured-concurrency.yaml b/content/concurrency/structured-concurrency.yaml index c3bf2e9..e11d14e 100644 --- a/content/concurrency/structured-concurrency.yaml +++ b/content/concurrency/structured-concurrency.yaml @@ -48,6 +48,9 @@ related: - "concurrency/virtual-threads" - "concurrency/scoped-values" - "concurrency/stable-values" +tags: +- concurrency +- virtual-threads docs: - title: "Structured Concurrency (JEP 499)" href: "https://openjdk.org/jeps/499" diff --git a/content/concurrency/thread-sleep-duration.yaml b/content/concurrency/thread-sleep-duration.yaml index 6f4374a..61d3d86 100644 --- a/content/concurrency/thread-sleep-duration.yaml +++ b/content/concurrency/thread-sleep-duration.yaml @@ -45,6 +45,8 @@ related: - "concurrency/stable-values" - "concurrency/concurrent-http-virtual" - "concurrency/completablefuture-chaining" +tags: +- concurrency docs: - title: "Thread.sleep(Duration)" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Thread.html#sleep(java.time.Duration)" diff --git a/content/concurrency/virtual-threads.yaml b/content/concurrency/virtual-threads.yaml index 3e5e6ab..b5b34bf 100644 --- a/content/concurrency/virtual-threads.yaml +++ b/content/concurrency/virtual-threads.yaml @@ -42,6 +42,9 @@ related: - "concurrency/thread-sleep-duration" - "concurrency/scoped-values" - "concurrency/completablefuture-chaining" +tags: +- virtual-threads +- concurrency docs: - title: "Virtual Threads (JEP 444)" href: "https://openjdk.org/jeps/444" diff --git a/content/datetime/date-formatting.yaml b/content/datetime/date-formatting.yaml index 7986bc0..68291c1 100644 --- a/content/datetime/date-formatting.yaml +++ b/content/datetime/date-formatting.yaml @@ -45,6 +45,8 @@ related: - "datetime/instant-precision" - "datetime/java-time-basics" - "datetime/hex-format" +tags: +- datetime docs: - title: "DateTimeFormatter" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/time/format/DateTimeFormatter.html" diff --git a/content/datetime/duration-and-period.yaml b/content/datetime/duration-and-period.yaml index 4b6d1d0..6224fc2 100644 --- a/content/datetime/duration-and-period.yaml +++ b/content/datetime/duration-and-period.yaml @@ -46,6 +46,8 @@ related: - "datetime/java-time-basics" - "datetime/date-formatting" - "datetime/math-clamp" +tags: +- datetime docs: - title: "Duration" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/time/Duration.html" diff --git a/content/datetime/hex-format.yaml b/content/datetime/hex-format.yaml index c28b5e4..52fc2c9 100644 --- a/content/datetime/hex-format.yaml +++ b/content/datetime/hex-format.yaml @@ -46,6 +46,9 @@ related: - "datetime/date-formatting" - "datetime/instant-precision" - "datetime/duration-and-period" +tags: +- strings +- formatting docs: - title: "HexFormat" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/HexFormat.html" diff --git a/content/datetime/instant-precision.yaml b/content/datetime/instant-precision.yaml index ece73c4..ad59c0d 100644 --- a/content/datetime/instant-precision.yaml +++ b/content/datetime/instant-precision.yaml @@ -42,6 +42,8 @@ related: - "datetime/hex-format" - "datetime/java-time-basics" - "datetime/duration-and-period" +tags: +- datetime docs: - title: "Instant" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/time/Instant.html" diff --git a/content/datetime/java-time-basics.yaml b/content/datetime/java-time-basics.yaml index 0b11f4d..856d760 100644 --- a/content/datetime/java-time-basics.yaml +++ b/content/datetime/java-time-basics.yaml @@ -44,6 +44,8 @@ related: - "datetime/instant-precision" - "datetime/duration-and-period" - "datetime/date-formatting" +tags: +- datetime docs: - title: "LocalDate" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/time/LocalDate.html" diff --git a/content/datetime/math-clamp.yaml b/content/datetime/math-clamp.yaml index ac7c00f..1389f24 100644 --- a/content/datetime/math-clamp.yaml +++ b/content/datetime/math-clamp.yaml @@ -41,6 +41,8 @@ related: - "datetime/instant-precision" - "datetime/hex-format" - "datetime/duration-and-period" +tags: +- math docs: - title: "Math.clamp()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Math.html#clamp(long,int,int)" diff --git a/content/enterprise/ejb-timer-vs-jakarta-scheduler.yaml b/content/enterprise/ejb-timer-vs-jakarta-scheduler.yaml index 04c2cbb..ad843f1 100644 --- a/content/enterprise/ejb-timer-vs-jakarta-scheduler.yaml +++ b/content/enterprise/ejb-timer-vs-jakarta-scheduler.yaml @@ -74,6 +74,9 @@ related: - "enterprise/ejb-vs-cdi" - "concurrency/virtual-threads" - "concurrency/executor-try-with-resources" +tags: +- enterprise +- jakarta docs: - title: "Jakarta Concurrency Specification" href: "https://jakarta.ee/specifications/concurrency/" diff --git a/content/enterprise/ejb-vs-cdi.yaml b/content/enterprise/ejb-vs-cdi.yaml index 7c1d9c0..2ed1bfb 100644 --- a/content/enterprise/ejb-vs-cdi.yaml +++ b/content/enterprise/ejb-vs-cdi.yaml @@ -59,6 +59,9 @@ related: - "enterprise/servlet-vs-jaxrs" - "enterprise/jdbc-vs-jpa" - "language/records-for-data-classes" +tags: +- enterprise +- jakarta docs: - title: "Jakarta CDI Specification" href: "https://jakarta.ee/specifications/cdi/" diff --git a/content/enterprise/jdbc-resultset-vs-jpa-criteria.yaml b/content/enterprise/jdbc-resultset-vs-jpa-criteria.yaml index 75e5932..f29bc5c 100644 --- a/content/enterprise/jdbc-resultset-vs-jpa-criteria.yaml +++ b/content/enterprise/jdbc-resultset-vs-jpa-criteria.yaml @@ -70,6 +70,10 @@ related: - "enterprise/jdbc-vs-jpa" - "enterprise/jpa-vs-jakarta-data" - "enterprise/manual-transaction-vs-declarative" +tags: +- enterprise +- persistence +- jpa docs: - title: "Jakarta Persistence Specification" href: "https://jakarta.ee/specifications/persistence/" diff --git a/content/enterprise/jdbc-vs-jooq.yaml b/content/enterprise/jdbc-vs-jooq.yaml index 361deb6..e5fb45e 100644 --- a/content/enterprise/jdbc-vs-jooq.yaml +++ b/content/enterprise/jdbc-vs-jooq.yaml @@ -66,6 +66,9 @@ related: - "enterprise/jdbc-vs-jpa" - "enterprise/jdbc-resultset-vs-jpa-criteria" - "enterprise/manual-transaction-vs-declarative" +tags: +- enterprise +- persistence docs: - title: "jOOQ — Getting Started" href: "https://www.jooq.org/doc/latest/manual/getting-started/" diff --git a/content/enterprise/jdbc-vs-jpa.yaml b/content/enterprise/jdbc-vs-jpa.yaml index b863877..efc1066 100644 --- a/content/enterprise/jdbc-vs-jpa.yaml +++ b/content/enterprise/jdbc-vs-jpa.yaml @@ -63,6 +63,10 @@ related: - "enterprise/servlet-vs-jaxrs" - "enterprise/ejb-vs-cdi" - "io/try-with-resources-effectively-final" +tags: +- enterprise +- persistence +- jpa docs: - title: "Jakarta Persistence Specification" href: "https://jakarta.ee/specifications/persistence/" diff --git a/content/enterprise/jndi-lookup-vs-cdi-injection.yaml b/content/enterprise/jndi-lookup-vs-cdi-injection.yaml index f56c047..4258d71 100644 --- a/content/enterprise/jndi-lookup-vs-cdi-injection.yaml +++ b/content/enterprise/jndi-lookup-vs-cdi-injection.yaml @@ -68,6 +68,9 @@ related: - "enterprise/ejb-vs-cdi" - "enterprise/jdbc-vs-jpa" - "enterprise/singleton-ejb-vs-cdi-application-scoped" +tags: +- enterprise +- jakarta docs: - title: "Jakarta CDI Specification" href: "https://jakarta.ee/specifications/cdi/" diff --git a/content/enterprise/jpa-vs-jakarta-data.yaml b/content/enterprise/jpa-vs-jakarta-data.yaml index ee02af9..16ae01c 100644 --- a/content/enterprise/jpa-vs-jakarta-data.yaml +++ b/content/enterprise/jpa-vs-jakarta-data.yaml @@ -62,6 +62,10 @@ related: - "enterprise/jdbc-vs-jpa" - "enterprise/ejb-vs-cdi" - "enterprise/servlet-vs-jaxrs" +tags: +- enterprise +- persistence +- jpa docs: - title: "Jakarta Data 1.0 Specification" href: "https://jakarta.ee/specifications/data/1.0/" diff --git a/content/enterprise/jsf-managed-bean-vs-cdi-named.yaml b/content/enterprise/jsf-managed-bean-vs-cdi-named.yaml index dcfe63c..0b61ce2 100644 --- a/content/enterprise/jsf-managed-bean-vs-cdi-named.yaml +++ b/content/enterprise/jsf-managed-bean-vs-cdi-named.yaml @@ -68,6 +68,9 @@ related: - "enterprise/ejb-vs-cdi" - "enterprise/jndi-lookup-vs-cdi-injection" - "enterprise/servlet-vs-jaxrs" +tags: +- enterprise +- jakarta docs: - title: "Jakarta Faces Specification" href: "https://jakarta.ee/specifications/faces/" diff --git a/content/enterprise/manual-transaction-vs-declarative.yaml b/content/enterprise/manual-transaction-vs-declarative.yaml index b9a9cb5..2bc52a0 100644 --- a/content/enterprise/manual-transaction-vs-declarative.yaml +++ b/content/enterprise/manual-transaction-vs-declarative.yaml @@ -70,6 +70,9 @@ related: - "enterprise/ejb-vs-cdi" - "enterprise/jdbc-vs-jpa" - "enterprise/jpa-vs-jakarta-data" +tags: +- enterprise +- persistence docs: - title: "Jakarta Transactions Specification" href: "https://jakarta.ee/specifications/transactions/" diff --git a/content/enterprise/mdb-vs-reactive-messaging.yaml b/content/enterprise/mdb-vs-reactive-messaging.yaml index 6faedbd..63f8264 100644 --- a/content/enterprise/mdb-vs-reactive-messaging.yaml +++ b/content/enterprise/mdb-vs-reactive-messaging.yaml @@ -64,6 +64,9 @@ related: - "enterprise/ejb-vs-cdi" - "concurrency/structured-concurrency" - "concurrency/virtual-threads" +tags: +- enterprise +- reactive docs: - title: "MicroProfile Reactive Messaging Specification" href: "https://download.eclipse.org/microprofile/microprofile-reactive-messaging-3.0/microprofile-reactive-messaging-spec-3.0.html" diff --git a/content/enterprise/servlet-vs-jaxrs.yaml b/content/enterprise/servlet-vs-jaxrs.yaml index ac34ea2..a0e0f12 100644 --- a/content/enterprise/servlet-vs-jaxrs.yaml +++ b/content/enterprise/servlet-vs-jaxrs.yaml @@ -58,6 +58,9 @@ related: - "enterprise/ejb-vs-cdi" - "enterprise/jdbc-vs-jpa" - "io/http-client" +tags: +- enterprise +- rest docs: - title: "Jakarta RESTful Web Services Specification" href: "https://jakarta.ee/specifications/restful-ws/" diff --git a/content/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml b/content/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml index c23dca1..2a419bd 100644 --- a/content/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml +++ b/content/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml @@ -78,6 +78,9 @@ related: - "enterprise/ejb-vs-cdi" - "enterprise/jndi-lookup-vs-cdi-injection" - "concurrency/lock-free-lazy-init" +tags: +- enterprise +- jakarta docs: - title: "Jakarta CDI Specification" href: "https://jakarta.ee/specifications/cdi/" diff --git a/content/enterprise/soap-vs-jakarta-rest.yaml b/content/enterprise/soap-vs-jakarta-rest.yaml index fda9a22..f52d92a 100644 --- a/content/enterprise/soap-vs-jakarta-rest.yaml +++ b/content/enterprise/soap-vs-jakarta-rest.yaml @@ -63,6 +63,9 @@ related: - "enterprise/servlet-vs-jaxrs" - "io/http-client" - "enterprise/ejb-vs-cdi" +tags: +- enterprise +- rest docs: - title: "Jakarta RESTful Web Services Specification" href: "https://jakarta.ee/specifications/restful-ws/" diff --git a/content/enterprise/spring-api-versioning.yaml b/content/enterprise/spring-api-versioning.yaml index 871dba1..9430581 100644 --- a/content/enterprise/spring-api-versioning.yaml +++ b/content/enterprise/spring-api-versioning.yaml @@ -87,6 +87,10 @@ related: - "enterprise/soap-vs-jakarta-rest" - "enterprise/servlet-vs-jaxrs" - "enterprise/ejb-vs-cdi" +tags: +- enterprise +- spring +- rest docs: - title: "Spring Framework 7.0 — API Versioning" href: "https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-requestmapping.html#mvc-ann-requestmapping-version" diff --git a/content/enterprise/spring-null-safety-jspecify.yaml b/content/enterprise/spring-null-safety-jspecify.yaml index 7b7ea5e..1486d6e 100644 --- a/content/enterprise/spring-null-safety-jspecify.yaml +++ b/content/enterprise/spring-null-safety-jspecify.yaml @@ -82,6 +82,9 @@ related: - "errors/helpful-npe" - "errors/optional-orelsethrow" - "errors/require-nonnull-else" +tags: +- null-safety +- spring docs: - title: "Spring Framework 7 — Null Safety" href: "https://docs.spring.io/spring-framework/reference/core/null-safety.html" diff --git a/content/enterprise/spring-xml-config-vs-annotations.yaml b/content/enterprise/spring-xml-config-vs-annotations.yaml index 045825a..1ebedd6 100644 --- a/content/enterprise/spring-xml-config-vs-annotations.yaml +++ b/content/enterprise/spring-xml-config-vs-annotations.yaml @@ -85,6 +85,9 @@ related: - "enterprise/ejb-vs-cdi" - "enterprise/jndi-lookup-vs-cdi-injection" - "enterprise/manual-transaction-vs-declarative" +tags: +- enterprise +- spring docs: - title: "Spring Framework — Annotation-based Container Configuration" href: "https://docs.spring.io/spring-framework/reference/core/beans/annotation-config.html" diff --git a/content/errors/helpful-npe.yaml b/content/errors/helpful-npe.yaml index a4b57d3..c2cde02 100644 --- a/content/errors/helpful-npe.yaml +++ b/content/errors/helpful-npe.yaml @@ -43,6 +43,8 @@ related: - "errors/null-in-switch" - "errors/multi-catch" - "errors/require-nonnull-else" +tags: +- null-safety docs: - title: "Helpful NullPointerExceptions (JEP 358)" href: "https://openjdk.org/jeps/358" diff --git a/content/errors/multi-catch.yaml b/content/errors/multi-catch.yaml index 17b4833..270d2fd 100644 --- a/content/errors/multi-catch.yaml +++ b/content/errors/multi-catch.yaml @@ -49,6 +49,8 @@ related: - "errors/null-in-switch" - "errors/helpful-npe" - "errors/require-nonnull-else" +tags: +- exceptions docs: - title: "Catching and Handling Exceptions (dev.java)" href: "https://dev.java/learn/exceptions/catching-handling/" diff --git a/content/errors/null-in-switch.yaml b/content/errors/null-in-switch.yaml index 041ec43..a7553d4 100644 --- a/content/errors/null-in-switch.yaml +++ b/content/errors/null-in-switch.yaml @@ -49,6 +49,9 @@ related: - "errors/helpful-npe" - "errors/record-based-errors" - "errors/multi-catch" +tags: +- switch +- null-safety docs: - title: "Pattern Matching for switch (JEP 441)" href: "https://openjdk.org/jeps/441" diff --git a/content/errors/optional-chaining.yaml b/content/errors/optional-chaining.yaml index e425dfb..1c02140 100644 --- a/content/errors/optional-chaining.yaml +++ b/content/errors/optional-chaining.yaml @@ -46,6 +46,9 @@ related: - "errors/helpful-npe" - "errors/multi-catch" - "errors/require-nonnull-else" +tags: +- optional +- null-safety docs: - title: "Optional" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Optional.html" diff --git a/content/errors/optional-orelsethrow.yaml b/content/errors/optional-orelsethrow.yaml index ceb495f..d25bc19 100644 --- a/content/errors/optional-orelsethrow.yaml +++ b/content/errors/optional-orelsethrow.yaml @@ -44,6 +44,9 @@ related: - "errors/optional-chaining" - "streams/optional-or" - "errors/require-nonnull-else" +tags: +- optional +- null-safety docs: - title: "Optional.orElseThrow()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Optional.html#orElseThrow()" diff --git a/content/errors/record-based-errors.yaml b/content/errors/record-based-errors.yaml index 5aa29db..9d903af 100644 --- a/content/errors/record-based-errors.yaml +++ b/content/errors/record-based-errors.yaml @@ -50,6 +50,10 @@ related: - "errors/helpful-npe" - "errors/require-nonnull-else" - "errors/multi-catch" +tags: +- records +- exceptions +- sealed-classes docs: - title: "Records (JEP 395)" href: "https://openjdk.org/jeps/395" diff --git a/content/errors/require-nonnull-else.yaml b/content/errors/require-nonnull-else.yaml index 65c5181..45ed93f 100644 --- a/content/errors/require-nonnull-else.yaml +++ b/content/errors/require-nonnull-else.yaml @@ -42,6 +42,9 @@ related: - "errors/helpful-npe" - "errors/record-based-errors" - "errors/optional-chaining" +tags: +- null-safety +- optional docs: - title: "Objects.requireNonNullElse()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Objects.html#requireNonNullElse(T,T)" diff --git a/content/io/deserialization-filters.yaml b/content/io/deserialization-filters.yaml index 008be37..394054b 100644 --- a/content/io/deserialization-filters.yaml +++ b/content/io/deserialization-filters.yaml @@ -46,6 +46,9 @@ related: - "io/inputstream-transferto" - "io/http-client" - "io/path-of" +tags: +- security +- serialization docs: - title: "ObjectInputFilter" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/io/ObjectInputFilter.html" diff --git a/content/io/file-memory-mapping.yaml b/content/io/file-memory-mapping.yaml index 3056764..62b0a11 100644 --- a/content/io/file-memory-mapping.yaml +++ b/content/io/file-memory-mapping.yaml @@ -58,6 +58,8 @@ related: - "io/http-client" - "io/reading-files" - "io/writing-files" +tags: +- io docs: - title: "MemorySegment (Java 22)" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/foreign/MemorySegment.html" diff --git a/content/io/files-mismatch.yaml b/content/io/files-mismatch.yaml index 651055f..e14430e 100644 --- a/content/io/files-mismatch.yaml +++ b/content/io/files-mismatch.yaml @@ -42,6 +42,8 @@ related: - "io/inputstream-transferto" - "io/deserialization-filters" - "io/writing-files" +tags: +- io docs: - title: "Files.mismatch()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/file/Files.html#mismatch(java.nio.file.Path,java.nio.file.Path)" diff --git a/content/io/http-client.yaml b/content/io/http-client.yaml index 897524f..3feb682 100644 --- a/content/io/http-client.yaml +++ b/content/io/http-client.yaml @@ -48,6 +48,8 @@ related: - "io/reading-files" - "io/inputstream-transferto" - "io/try-with-resources-effectively-final" +tags: +- http docs: - title: "HttpClient (JEP 321)" href: "https://openjdk.org/jeps/321" diff --git a/content/io/inputstream-transferto.yaml b/content/io/inputstream-transferto.yaml index 6e844ea..638ca7c 100644 --- a/content/io/inputstream-transferto.yaml +++ b/content/io/inputstream-transferto.yaml @@ -39,6 +39,8 @@ related: - "io/writing-files" - "io/deserialization-filters" - "io/try-with-resources-effectively-final" +tags: +- io docs: - title: "InputStream.transferTo()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/io/InputStream.html#transferTo(java.io.OutputStream)" diff --git a/content/io/io-class-console-io.yaml b/content/io/io-class-console-io.yaml index ee54a8f..863bb39 100644 --- a/content/io/io-class-console-io.yaml +++ b/content/io/io-class-console-io.yaml @@ -49,6 +49,8 @@ related: - "language/compact-source-files" - "language/module-import-declarations" - "io/reading-files" +tags: +- io docs: - title: "Simple Source Files (JEP 495)" href: "https://openjdk.org/jeps/495" diff --git a/content/io/path-of.yaml b/content/io/path-of.yaml index bf7c1cc..25ac05e 100644 --- a/content/io/path-of.yaml +++ b/content/io/path-of.yaml @@ -38,6 +38,8 @@ related: - "io/inputstream-transferto" - "io/reading-files" - "io/try-with-resources-effectively-final" +tags: +- io docs: - title: "Path.of()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/file/Path.html#of(java.lang.String,java.lang.String...)" diff --git a/content/io/reading-files.yaml b/content/io/reading-files.yaml index 85dc79d..30693aa 100644 --- a/content/io/reading-files.yaml +++ b/content/io/reading-files.yaml @@ -45,6 +45,8 @@ related: - "io/try-with-resources-effectively-final" - "io/writing-files" - "io/files-mismatch" +tags: +- io docs: - title: "Files.readString()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/file/Files.html#readString(java.nio.file.Path)" diff --git a/content/io/try-with-resources-effectively-final.yaml b/content/io/try-with-resources-effectively-final.yaml index 68d68ce..a646e84 100644 --- a/content/io/try-with-resources-effectively-final.yaml +++ b/content/io/try-with-resources-effectively-final.yaml @@ -44,6 +44,9 @@ related: - "io/path-of" - "io/reading-files" - "io/http-client" +tags: +- io +- exceptions docs: - title: "Catching and Handling Exceptions (dev.java)" href: "https://dev.java/learn/exceptions/catching-handling/" diff --git a/content/io/writing-files.yaml b/content/io/writing-files.yaml index 5d6d9e5..7f73374 100644 --- a/content/io/writing-files.yaml +++ b/content/io/writing-files.yaml @@ -43,6 +43,8 @@ related: - "io/reading-files" - "io/http-client" - "io/path-of" +tags: +- io docs: - title: "Files.writeString()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/file/Files.html#writeString(java.nio.file.Path,java.lang.CharSequence,java.nio.file.OpenOption...)" diff --git a/content/language/call-c-from-java.yaml b/content/language/call-c-from-java.yaml index de12286..b467ec1 100644 --- a/content/language/call-c-from-java.yaml +++ b/content/language/call-c-from-java.yaml @@ -75,6 +75,9 @@ related: - "io/file-memory-mapping" - "language/compact-source-files" - "language/unnamed-variables" +tags: +- foreign-function-api +- native docs: - title: "JEP 454: Foreign Function & Memory API" href: "https://openjdk.org/jeps/454" diff --git a/content/language/compact-canonical-constructor.yaml b/content/language/compact-canonical-constructor.yaml index 85a25e1..c5546f7 100644 --- a/content/language/compact-canonical-constructor.yaml +++ b/content/language/compact-canonical-constructor.yaml @@ -53,6 +53,8 @@ related: - "language/records-for-data-classes" - "language/flexible-constructor-bodies" - "errors/record-based-errors" +tags: +- records docs: - title: "Record (Java 21)" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Record.html" diff --git a/content/language/compact-source-files.yaml b/content/language/compact-source-files.yaml index e593aae..89dc45d 100644 --- a/content/language/compact-source-files.yaml +++ b/content/language/compact-source-files.yaml @@ -44,6 +44,8 @@ related: - "language/type-inference-with-var" - "language/text-blocks-for-multiline-strings" - "language/switch-expressions" +tags: +- tooling docs: - title: "Simple Source Files and Instance Main Methods (JEP 495)" href: "https://openjdk.org/jeps/495" diff --git a/content/language/default-interface-methods.yaml b/content/language/default-interface-methods.yaml index e5b4b56..57a9a69 100644 --- a/content/language/default-interface-methods.yaml +++ b/content/language/default-interface-methods.yaml @@ -61,6 +61,9 @@ related: - "language/private-interface-methods" - "language/pattern-matching-instanceof" - "language/sealed-classes" +tags: +- interfaces +- functional docs: - title: "Evolving Interfaces (dev.java)" href: "https://dev.java/learn/interfaces/examples/" diff --git a/content/language/diamond-operator.yaml b/content/language/diamond-operator.yaml index 511634d..f985bfe 100644 --- a/content/language/diamond-operator.yaml +++ b/content/language/diamond-operator.yaml @@ -48,6 +48,8 @@ related: - "language/type-inference-with-var" - "language/text-blocks-for-multiline-strings" - "language/switch-expressions" +tags: +- generics docs: - title: "Diamond with Anonymous Classes (JEP 213)" href: "https://openjdk.org/jeps/213" diff --git a/content/language/exhaustive-switch.yaml b/content/language/exhaustive-switch.yaml index 62a1e76..0454a6d 100644 --- a/content/language/exhaustive-switch.yaml +++ b/content/language/exhaustive-switch.yaml @@ -52,6 +52,10 @@ related: - "language/sealed-classes" - "language/pattern-matching-instanceof" - "language/type-inference-with-var" +tags: +- switch +- sealed-classes +- pattern-matching docs: - title: "Pattern Matching for switch (JEP 441)" href: "https://openjdk.org/jeps/441" diff --git a/content/language/flexible-constructor-bodies.yaml b/content/language/flexible-constructor-bodies.yaml index f149209..dfd4522 100644 --- a/content/language/flexible-constructor-bodies.yaml +++ b/content/language/flexible-constructor-bodies.yaml @@ -49,6 +49,8 @@ related: - "language/type-inference-with-var" - "language/text-blocks-for-multiline-strings" - "language/switch-expressions" +tags: +- constructors docs: - title: "Flexible Constructor Bodies (JEP 492)" href: "https://openjdk.org/jeps/492" diff --git a/content/language/guarded-patterns.yaml b/content/language/guarded-patterns.yaml index b9e613c..81e5fa6 100644 --- a/content/language/guarded-patterns.yaml +++ b/content/language/guarded-patterns.yaml @@ -52,6 +52,10 @@ related: - "language/record-patterns" - "language/type-inference-with-var" - "language/compact-source-files" +tags: +- pattern-matching +- switch +- records docs: - title: "Pattern Matching for switch (JEP 441)" href: "https://openjdk.org/jeps/441" diff --git a/content/language/markdown-javadoc-comments.yaml b/content/language/markdown-javadoc-comments.yaml index df6503f..017acf9 100644 --- a/content/language/markdown-javadoc-comments.yaml +++ b/content/language/markdown-javadoc-comments.yaml @@ -59,6 +59,8 @@ related: - "language/text-blocks-for-multiline-strings" - "language/records-for-data-classes" - "language/type-inference-with-var" +tags: +- documentation docs: - title: "Markdown Documentation Comments (JEP 467)" href: "https://openjdk.org/jeps/467" diff --git a/content/language/module-import-declarations.yaml b/content/language/module-import-declarations.yaml index 196ca37..8e1b32d 100644 --- a/content/language/module-import-declarations.yaml +++ b/content/language/module-import-declarations.yaml @@ -44,6 +44,8 @@ related: - "language/type-inference-with-var" - "language/text-blocks-for-multiline-strings" - "language/switch-expressions" +tags: +- modules docs: - title: "Module Import Declarations (JEP 494)" href: "https://openjdk.org/jeps/494" diff --git a/content/language/pattern-matching-instanceof.yaml b/content/language/pattern-matching-instanceof.yaml index 34291c3..ad7bc6f 100644 --- a/content/language/pattern-matching-instanceof.yaml +++ b/content/language/pattern-matching-instanceof.yaml @@ -43,6 +43,8 @@ related: - "language/compact-source-files" - "language/type-inference-with-var" - "language/text-blocks-for-multiline-strings" +tags: +- pattern-matching docs: - title: "Pattern Matching for instanceof (JEP 394)" href: "https://openjdk.org/jeps/394" diff --git a/content/language/pattern-matching-switch.yaml b/content/language/pattern-matching-switch.yaml index af1d4f8..749562c 100644 --- a/content/language/pattern-matching-switch.yaml +++ b/content/language/pattern-matching-switch.yaml @@ -51,6 +51,9 @@ related: - "language/pattern-matching-instanceof" - "language/unnamed-variables" - "language/records-for-data-classes" +tags: +- pattern-matching +- switch docs: - title: "Pattern Matching for switch (JEP 441)" href: "https://openjdk.org/jeps/441" diff --git a/content/language/primitive-types-in-patterns.yaml b/content/language/primitive-types-in-patterns.yaml index c0d41e7..2136c4e 100644 --- a/content/language/primitive-types-in-patterns.yaml +++ b/content/language/primitive-types-in-patterns.yaml @@ -51,6 +51,9 @@ related: - "language/type-inference-with-var" - "language/text-blocks-for-multiline-strings" - "language/switch-expressions" +tags: +- pattern-matching +- switch docs: - title: "Primitive Types in Patterns (JEP 488)" href: "https://openjdk.org/jeps/488" diff --git a/content/language/private-interface-methods.yaml b/content/language/private-interface-methods.yaml index 2730682..1414834 100644 --- a/content/language/private-interface-methods.yaml +++ b/content/language/private-interface-methods.yaml @@ -55,6 +55,8 @@ related: - "language/compact-source-files" - "language/flexible-constructor-bodies" - "language/type-inference-with-var" +tags: +- interfaces docs: - title: "Private Interface Methods" href: "https://openjdk.org/jeps/213" diff --git a/content/language/record-patterns.yaml b/content/language/record-patterns.yaml index 55a5e1b..f546e36 100644 --- a/content/language/record-patterns.yaml +++ b/content/language/record-patterns.yaml @@ -43,6 +43,9 @@ related: - "language/diamond-operator" - "language/records-for-data-classes" - "language/unnamed-variables" +tags: +- records +- pattern-matching docs: - title: "Record Patterns (JEP 440)" href: "https://openjdk.org/jeps/440" diff --git a/content/language/records-for-data-classes.yaml b/content/language/records-for-data-classes.yaml index bcc1bc0..1ac2d7d 100644 --- a/content/language/records-for-data-classes.yaml +++ b/content/language/records-for-data-classes.yaml @@ -41,6 +41,8 @@ related: - "language/flexible-constructor-bodies" - "language/private-interface-methods" - "language/pattern-matching-switch" +tags: +- records docs: - title: "Records (JEP 395)" href: "https://openjdk.org/jeps/395" diff --git a/content/language/sealed-classes.yaml b/content/language/sealed-classes.yaml index a37516b..cebaadd 100644 --- a/content/language/sealed-classes.yaml +++ b/content/language/sealed-classes.yaml @@ -45,6 +45,8 @@ related: - "language/switch-expressions" - "language/module-import-declarations" - "language/pattern-matching-switch" +tags: +- sealed-classes docs: - title: "Sealed Classes (JEP 409)" href: "https://openjdk.org/jeps/409" diff --git a/content/language/static-members-in-inner-classes.yaml b/content/language/static-members-in-inner-classes.yaml index 4096218..0b4499f 100644 --- a/content/language/static-members-in-inner-classes.yaml +++ b/content/language/static-members-in-inner-classes.yaml @@ -62,6 +62,8 @@ related: - "language/records-for-data-classes" - "language/sealed-classes" - "language/private-interface-methods" +tags: +- inner-classes docs: - title: "JEP 395: Records" href: "https://openjdk.org/jeps/395" diff --git a/content/language/static-methods-in-interfaces.yaml b/content/language/static-methods-in-interfaces.yaml index d13a7a6..b08b5e7 100644 --- a/content/language/static-methods-in-interfaces.yaml +++ b/content/language/static-methods-in-interfaces.yaml @@ -58,6 +58,8 @@ related: - "language/default-interface-methods" - "language/private-interface-methods" - "collections/immutable-list-creation" +tags: +- interfaces docs: - title: "Evolving Interfaces (dev.java)" href: "https://dev.java/learn/interfaces/examples/" diff --git a/content/language/switch-expressions.yaml b/content/language/switch-expressions.yaml index 5e099c4..7efceb9 100644 --- a/content/language/switch-expressions.yaml +++ b/content/language/switch-expressions.yaml @@ -50,6 +50,8 @@ related: - "language/compact-source-files" - "language/sealed-classes" - "language/record-patterns" +tags: +- switch docs: - title: "Switch Expressions (JEP 361)" href: "https://openjdk.org/jeps/361" diff --git a/content/language/text-blocks-for-multiline-strings.yaml b/content/language/text-blocks-for-multiline-strings.yaml index dd358c0..3cc63ce 100644 --- a/content/language/text-blocks-for-multiline-strings.yaml +++ b/content/language/text-blocks-for-multiline-strings.yaml @@ -44,6 +44,8 @@ related: - "language/switch-expressions" - "language/pattern-matching-instanceof" - "language/exhaustive-switch" +tags: +- text-blocks docs: - title: "Text Blocks (JEP 378)" href: "https://openjdk.org/jeps/378" diff --git a/content/language/type-inference-with-var.yaml b/content/language/type-inference-with-var.yaml index 4eba7d4..c1cd018 100644 --- a/content/language/type-inference-with-var.yaml +++ b/content/language/type-inference-with-var.yaml @@ -44,6 +44,8 @@ related: - "language/sealed-classes" - "language/pattern-matching-instanceof" - "language/exhaustive-switch" +tags: +- var docs: - title: "Local Variable Type Inference (JEP 286)" href: "https://openjdk.org/jeps/286" diff --git a/content/language/unnamed-variables.yaml b/content/language/unnamed-variables.yaml index 0f1471b..00ab17b 100644 --- a/content/language/unnamed-variables.yaml +++ b/content/language/unnamed-variables.yaml @@ -49,6 +49,8 @@ related: - "language/type-inference-with-var" - "language/text-blocks-for-multiline-strings" - "language/switch-expressions" +tags: +- pattern-matching docs: - title: "Unnamed Variables & Patterns (JEP 456)" href: "https://openjdk.org/jeps/456" diff --git a/content/security/key-derivation-functions.yaml b/content/security/key-derivation-functions.yaml index 494b24c..2229fb8 100644 --- a/content/security/key-derivation-functions.yaml +++ b/content/security/key-derivation-functions.yaml @@ -51,6 +51,9 @@ related: - "security/pem-encoding" - "security/strong-random" - "security/tls-default" +tags: +- security +- cryptography docs: - title: "Key Derivation Functions (JEP 478)" href: "https://openjdk.org/jeps/478" diff --git a/content/security/pem-encoding.yaml b/content/security/pem-encoding.yaml index 91cd78b..6dacf5b 100644 --- a/content/security/pem-encoding.yaml +++ b/content/security/pem-encoding.yaml @@ -45,6 +45,9 @@ related: - "security/key-derivation-functions" - "security/strong-random" - "security/tls-default" +tags: +- security +- cryptography docs: - title: "PEM Encodings of Certificates (JEP 470)" href: "https://openjdk.org/jeps/470" diff --git a/content/security/random-generator.yaml b/content/security/random-generator.yaml index ef9493d..eeec161 100644 --- a/content/security/random-generator.yaml +++ b/content/security/random-generator.yaml @@ -50,6 +50,8 @@ related: - "security/strong-random" - "security/key-derivation-functions" - "concurrency/virtual-threads" +tags: +- security docs: - title: "RandomGenerator" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/random/RandomGenerator.html" diff --git a/content/security/strong-random.yaml b/content/security/strong-random.yaml index de92970..2151eb5 100644 --- a/content/security/strong-random.yaml +++ b/content/security/strong-random.yaml @@ -45,6 +45,9 @@ related: - "security/pem-encoding" - "security/key-derivation-functions" - "security/tls-default" +tags: +- security +- cryptography docs: - title: "SecureRandom" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/security/SecureRandom.html" diff --git a/content/security/tls-default.yaml b/content/security/tls-default.yaml index c0ed9f8..6e9cd41 100644 --- a/content/security/tls-default.yaml +++ b/content/security/tls-default.yaml @@ -45,6 +45,8 @@ related: - "security/pem-encoding" - "security/key-derivation-functions" - "security/strong-random" +tags: +- security docs: - title: "SSLContext" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/javax/net/ssl/SSLContext.html" diff --git a/content/streams/collectors-flatmapping.yaml b/content/streams/collectors-flatmapping.yaml index a9fa0bc..57600ed 100644 --- a/content/streams/collectors-flatmapping.yaml +++ b/content/streams/collectors-flatmapping.yaml @@ -46,6 +46,9 @@ related: - "streams/optional-ifpresentorelse" - "streams/stream-of-nullable" - "streams/stream-iterate-predicate" +tags: +- streams +- collectors docs: - title: "Collectors.flatMapping()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/stream/Collectors.html#flatMapping(java.util.function.Function,java.util.stream.Collector)" diff --git a/content/streams/optional-ifpresentorelse.yaml b/content/streams/optional-ifpresentorelse.yaml index ec6b127..c95f2fd 100644 --- a/content/streams/optional-ifpresentorelse.yaml +++ b/content/streams/optional-ifpresentorelse.yaml @@ -43,6 +43,8 @@ related: - "streams/stream-tolist" - "streams/stream-gatherers" - "streams/collectors-flatmapping" +tags: +- optional docs: - title: "Optional.ifPresentOrElse()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Optional.html#ifPresentOrElse(java.util.function.Consumer,java.lang.Runnable)" diff --git a/content/streams/optional-or.yaml b/content/streams/optional-or.yaml index 248bb22..e588bdd 100644 --- a/content/streams/optional-or.yaml +++ b/content/streams/optional-or.yaml @@ -44,6 +44,8 @@ related: - "streams/stream-iterate-predicate" - "streams/stream-gatherers" - "streams/stream-of-nullable" +tags: +- optional docs: - title: "Optional.or()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Optional.html#or(java.util.function.Supplier)" diff --git a/content/streams/predicate-not.yaml b/content/streams/predicate-not.yaml index f5a0e82..8fce45e 100644 --- a/content/streams/predicate-not.yaml +++ b/content/streams/predicate-not.yaml @@ -42,6 +42,9 @@ related: - "streams/stream-tolist" - "strings/string-isblank" - "streams/stream-takewhile-dropwhile" +tags: +- functional +- streams docs: - title: "Predicate.not()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/function/Predicate.html#not(java.util.function.Predicate)" diff --git a/content/streams/stream-gatherers.yaml b/content/streams/stream-gatherers.yaml index 7858463..a51880e 100644 --- a/content/streams/stream-gatherers.yaml +++ b/content/streams/stream-gatherers.yaml @@ -45,6 +45,8 @@ related: - "streams/stream-of-nullable" - "streams/stream-iterate-predicate" - "streams/stream-takewhile-dropwhile" +tags: +- streams docs: - title: "Stream Gatherers (JEP 485)" href: "https://openjdk.org/jeps/485" diff --git a/content/streams/stream-iterate-predicate.yaml b/content/streams/stream-iterate-predicate.yaml index a17deaf..56f6aed 100644 --- a/content/streams/stream-iterate-predicate.yaml +++ b/content/streams/stream-iterate-predicate.yaml @@ -44,6 +44,8 @@ related: - "streams/virtual-thread-executor" - "streams/optional-or" - "streams/optional-ifpresentorelse" +tags: +- streams docs: - title: "Stream.iterate()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/stream/Stream.html#iterate(T,java.util.function.Predicate,java.util.function.UnaryOperator)" diff --git a/content/streams/stream-mapmulti.yaml b/content/streams/stream-mapmulti.yaml index 60cd378..6abae11 100644 --- a/content/streams/stream-mapmulti.yaml +++ b/content/streams/stream-mapmulti.yaml @@ -47,6 +47,8 @@ related: - "streams/stream-iterate-predicate" - "streams/stream-of-nullable" - "streams/stream-gatherers" +tags: +- streams docs: - title: "Stream.mapMulti()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/stream/Stream.html#mapMulti(java.util.function.BiConsumer)" diff --git a/content/streams/stream-of-nullable.yaml b/content/streams/stream-of-nullable.yaml index 8db0a86..e5fd72c 100644 --- a/content/streams/stream-of-nullable.yaml +++ b/content/streams/stream-of-nullable.yaml @@ -38,6 +38,9 @@ related: - "streams/stream-takewhile-dropwhile" - "streams/stream-iterate-predicate" - "streams/stream-gatherers" +tags: +- streams +- optional docs: - title: "Stream.ofNullable()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/stream/Stream.html#ofNullable(T)" diff --git a/content/streams/stream-takewhile-dropwhile.yaml b/content/streams/stream-takewhile-dropwhile.yaml index 78ba1f1..d68f98a 100644 --- a/content/streams/stream-takewhile-dropwhile.yaml +++ b/content/streams/stream-takewhile-dropwhile.yaml @@ -44,6 +44,8 @@ related: - "streams/stream-tolist" - "streams/stream-mapmulti" - "streams/optional-or" +tags: +- streams docs: - title: "Stream.takeWhile()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/stream/Stream.html#takeWhile(java.util.function.Predicate)" diff --git a/content/streams/stream-tolist.yaml b/content/streams/stream-tolist.yaml index 5536c3a..619b0cd 100644 --- a/content/streams/stream-tolist.yaml +++ b/content/streams/stream-tolist.yaml @@ -39,6 +39,9 @@ related: - "collections/unmodifiable-collectors" - "streams/stream-gatherers" - "streams/stream-iterate-predicate" +tags: +- streams +- collections docs: - title: "Stream.toList()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/stream/Stream.html#toList()" diff --git a/content/streams/virtual-thread-executor.yaml b/content/streams/virtual-thread-executor.yaml index cf544fb..ef76403 100644 --- a/content/streams/virtual-thread-executor.yaml +++ b/content/streams/virtual-thread-executor.yaml @@ -49,6 +49,9 @@ related: - "streams/stream-gatherers" - "streams/stream-iterate-predicate" - "streams/optional-ifpresentorelse" +tags: +- virtual-threads +- concurrency docs: - title: "Executors.newVirtualThreadPerTaskExecutor()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/Executors.html#newVirtualThreadPerTaskExecutor()" diff --git a/content/strings/string-chars-stream.yaml b/content/strings/string-chars-stream.yaml index 40a007b..e377833 100644 --- a/content/strings/string-chars-stream.yaml +++ b/content/strings/string-chars-stream.yaml @@ -43,6 +43,9 @@ related: - "strings/string-repeat" - "strings/string-isblank" - "strings/string-formatted" +tags: +- strings +- streams docs: - title: "String.chars()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html#chars()" diff --git a/content/strings/string-formatted.yaml b/content/strings/string-formatted.yaml index 6a89f8e..b06598e 100644 --- a/content/strings/string-formatted.yaml +++ b/content/strings/string-formatted.yaml @@ -40,6 +40,8 @@ related: - "strings/string-lines" - "strings/string-strip" - "strings/string-indent-transform" +tags: +- strings docs: - title: "String.formatted()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html#formatted(java.lang.Object...)" diff --git a/content/strings/string-indent-transform.yaml b/content/strings/string-indent-transform.yaml index de38a0e..85f8c51 100644 --- a/content/strings/string-indent-transform.yaml +++ b/content/strings/string-indent-transform.yaml @@ -45,6 +45,8 @@ related: - "strings/string-isblank" - "strings/string-strip" - "strings/string-lines" +tags: +- strings docs: - title: "String.indent()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html#indent(int)" diff --git a/content/strings/string-isblank.yaml b/content/strings/string-isblank.yaml index 7969721..a92430b 100644 --- a/content/strings/string-isblank.yaml +++ b/content/strings/string-isblank.yaml @@ -38,6 +38,8 @@ related: - "strings/string-formatted" - "strings/string-strip" - "strings/string-indent-transform" +tags: +- strings docs: - title: "String.isBlank()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html#isBlank()" diff --git a/content/strings/string-lines.yaml b/content/strings/string-lines.yaml index cc08d71..d3f8352 100644 --- a/content/strings/string-lines.yaml +++ b/content/strings/string-lines.yaml @@ -41,6 +41,8 @@ related: - "strings/string-isblank" - "strings/string-strip" - "strings/string-indent-transform" +tags: +- strings docs: - title: "String.lines()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html#lines()" diff --git a/content/strings/string-repeat.yaml b/content/strings/string-repeat.yaml index fba18cf..8faefdb 100644 --- a/content/strings/string-repeat.yaml +++ b/content/strings/string-repeat.yaml @@ -41,6 +41,8 @@ related: - "strings/string-isblank" - "strings/string-formatted" - "strings/string-chars-stream" +tags: +- strings docs: - title: "String.repeat()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html#repeat(int)" diff --git a/content/strings/string-strip.yaml b/content/strings/string-strip.yaml index 452a963..a52917e 100644 --- a/content/strings/string-strip.yaml +++ b/content/strings/string-strip.yaml @@ -41,6 +41,8 @@ related: - "strings/string-formatted" - "strings/string-indent-transform" - "strings/string-chars-stream" +tags: +- strings docs: - title: "String.strip()" href: "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html#strip()" diff --git a/content/template.json b/content/template.json index 8a7da6d..7067e85 100644 --- a/content/template.json +++ b/content/template.json @@ -41,6 +41,10 @@ "category/related-slug-2", "category/related-slug-3" ], + "tags": [ + "tag1", + "tag2" + ], "docs": [ { "title": "Javadoc or Guide Title", diff --git a/content/tooling/aot-class-preloading.yaml b/content/tooling/aot-class-preloading.yaml index 7a76277..85fd2ed 100644 --- a/content/tooling/aot-class-preloading.yaml +++ b/content/tooling/aot-class-preloading.yaml @@ -47,6 +47,8 @@ related: - "tooling/jshell-prototyping" - "tooling/single-file-execution" - "tooling/multi-file-source" +tags: +- performance docs: - title: "Ahead-of-Time Command-Line Ergonomics (JEP 514)" href: "https://openjdk.org/jeps/514" diff --git a/content/tooling/built-in-http-server.yaml b/content/tooling/built-in-http-server.yaml index 310b1ca..5f7b915 100644 --- a/content/tooling/built-in-http-server.yaml +++ b/content/tooling/built-in-http-server.yaml @@ -57,6 +57,9 @@ related: - "io/http-client" - "tooling/single-file-execution" - "tooling/jshell-prototyping" +tags: +- tooling +- http docs: - title: "Simple Web Server (JEP 408)" href: "https://openjdk.org/jeps/408" diff --git a/content/tooling/compact-object-headers.yaml b/content/tooling/compact-object-headers.yaml index 1e2e700..869a519 100644 --- a/content/tooling/compact-object-headers.yaml +++ b/content/tooling/compact-object-headers.yaml @@ -43,6 +43,8 @@ related: - "tooling/jshell-prototyping" - "tooling/single-file-execution" - "tooling/multi-file-source" +tags: +- performance docs: - title: "Compact Object Headers (JEP 519)" href: "https://openjdk.org/jeps/519" diff --git a/content/tooling/jfr-profiling.yaml b/content/tooling/jfr-profiling.yaml index 1e362cf..bdf9c31 100644 --- a/content/tooling/jfr-profiling.yaml +++ b/content/tooling/jfr-profiling.yaml @@ -45,6 +45,9 @@ related: - "tooling/multi-file-source" - "tooling/jshell-prototyping" - "tooling/single-file-execution" +tags: +- tooling +- performance docs: - title: "JDK Flight Recorder" href: "https://docs.oracle.com/en/java/javase/25/docs/specs/man/jfr.html" diff --git a/content/tooling/jshell-prototyping.yaml b/content/tooling/jshell-prototyping.yaml index b5ebf6a..25c3625 100644 --- a/content/tooling/jshell-prototyping.yaml +++ b/content/tooling/jshell-prototyping.yaml @@ -43,6 +43,8 @@ related: - "tooling/aot-class-preloading" - "tooling/compact-object-headers" - "tooling/multi-file-source" +tags: +- tooling docs: - title: "JShell Tool" href: "https://docs.oracle.com/en/java/javase/25/jshell/introduction-jshell.html" diff --git a/content/tooling/junit6-with-jspecify.yaml b/content/tooling/junit6-with-jspecify.yaml index 66aaa72..91638dc 100644 --- a/content/tooling/junit6-with-jspecify.yaml +++ b/content/tooling/junit6-with-jspecify.yaml @@ -93,6 +93,9 @@ related: - "enterprise/spring-null-safety-jspecify" - "errors/helpful-npe" - "errors/require-nonnull-else" +tags: +- testing +- null-safety docs: - title: "JUnit 6 Assertions API" href: "https://docs.junit.org/current/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html" diff --git a/content/tooling/multi-file-source.yaml b/content/tooling/multi-file-source.yaml index 73960d5..82184a3 100644 --- a/content/tooling/multi-file-source.yaml +++ b/content/tooling/multi-file-source.yaml @@ -42,6 +42,8 @@ related: - "tooling/compact-object-headers" - "tooling/aot-class-preloading" - "tooling/jshell-prototyping" +tags: +- tooling docs: - title: "Launch Multi-File Source-Code Programs (JEP 458)" href: "https://openjdk.org/jeps/458" diff --git a/content/tooling/single-file-execution.yaml b/content/tooling/single-file-execution.yaml index c88a83c..1635ac2 100644 --- a/content/tooling/single-file-execution.yaml +++ b/content/tooling/single-file-execution.yaml @@ -41,6 +41,8 @@ related: - "tooling/multi-file-source" - "tooling/compact-object-headers" - "tooling/jfr-profiling" +tags: +- tooling docs: - title: "Launch Single-File Source-Code Programs (JEP 330)" href: "https://openjdk.org/jeps/330" diff --git a/html-generators/generate.java b/html-generators/generate.java index 9d372a8..1bb872b 100644 --- a/html-generators/generate.java +++ b/html-generators/generate.java @@ -28,8 +28,10 @@ static final String CATEGORIES_FILE = "html-generators/categories.properties"; static final String LOCALES_FILE = "html-generators/locales.properties"; +static final String TAGS_FILE = "html-generators/tags.properties"; static final SequencedMap CATEGORY_DISPLAY = loadCategoryDisplay(); static final SequencedMap LOCALES = loadLocales(); +static final Map TAG_DISPLAY = loadTagDisplay(); static SequencedMap loadCategoryDisplay() { try { @@ -61,6 +63,21 @@ static SequencedMap loadLocales() { } } +static Map loadTagDisplay() { + try { + var map = new LinkedHashMap(); + for (var line : Files.readAllLines(Path.of(TAGS_FILE))) { + line = line.strip(); + if (line.isEmpty() || line.startsWith("#")) continue; + var idx = line.indexOf('='); + if (idx > 0) map.put(line.substring(0, idx).strip(), line.substring(idx + 1).strip()); + } + return map; + } catch (IOException e) { + throw new UncheckedIOException(e); + } +} + /** Flatten nested JSON into dot-separated keys: {"a":{"b":"c"}} → {"a.b":"c"} */ static Map flattenJson(JsonNode node, String prefix) { var map = new LinkedHashMap(); @@ -159,10 +176,18 @@ List related() { rel.forEach(n -> paths.add(n.asText())); return paths; } + + List tags() { + var t = node.get("tags"); + if (t == null || !t.isArray()) return List.of(); + var tagList = new ArrayList(); + t.forEach(n -> tagList.add(n.asText())); + return tagList; + } } record Templates(String page, String whyCard, String relatedCard, String socialShare, - String index, String indexCard, String docLink) { + String index, String indexCard, String docLink, String topicPage) { static Templates load() throws IOException { return new Templates( Files.readString(Path.of("templates/slug-template.html")), @@ -171,7 +196,8 @@ static Templates load() throws IOException { Files.readString(Path.of("templates/social-share.html")), Files.readString(Path.of("templates/index.html")), Files.readString(Path.of("templates/index-card.html")), - Files.readString(Path.of("templates/doc-link.html"))); + Files.readString(Path.of("templates/doc-link.html")), + Files.readString(Path.of("templates/topic-page.html"))); } } @@ -281,6 +307,11 @@ void buildLocale(String locale, Templates templates, SequencedMap loadAllSnippets() throws IOException { @@ -361,11 +392,13 @@ String renderIndexCard(String tpl, Snippet s, String locale, Map var cardHref = locale.equals("en") ? "/%s/%s.html".formatted(s.category(), s.slug()) : "/%s/%s/%s.html".formatted(locale, s.category(), s.slug()); + var tagsValue = String.join(" ", s.tags()); return replaceTokens(tpl, Map.ofEntries( Map.entry("category", s.category()), Map.entry("slug", s.slug()), Map.entry("catDisplay", s.catDisplay()), Map.entry("title", escape(s.title())), Map.entry("oldCode", escape(s.oldCode())), Map.entry("modernCode", escape(s.modernCode())), Map.entry("jdkVersion", s.jdkVersion()), Map.entry("cardHref", cardHref), + Map.entry("tags", tagsValue), Map.entry("cards.old", strings.getOrDefault("cards.old", "Old")), Map.entry("cards.modern", strings.getOrDefault("cards.modern", "Modern")), Map.entry("cards.hoverHint", strings.getOrDefault("cards.hoverHint", "hover to see modern →")), @@ -443,6 +476,81 @@ String renderSocialShare(String tpl, String category, String slug, String title, "share.label", strings.getOrDefault("share.label", "Share"))); } +/** Render tag pill links for the snippet detail page. Returns empty string if no tags. */ +String renderTagPills(Snippet s, String locale) { + var tags = s.tags(); + if (tags.isEmpty()) return ""; + var sb = new StringBuilder(); + sb.append("
\n"); + for (var tag : tags) { + var display = TAG_DISPLAY.getOrDefault(tag, tag); + // Topic pages are English-only (canonical); use absolute path + sb.append(" %s\n" + .formatted(tag, escape(display))); + } + sb.append("
"); + return sb.toString(); +} + +void generateTopicPages(Templates templates, SequencedMap allSnippets, + Map strings, String locale, String homeUrl, + String i18nScript) throws IOException { + // Build map: tag → list of snippets + var tagSnippets = new LinkedHashMap>(); + for (var snippet : allSnippets.values()) { + for (var tag : snippet.tags()) { + tagSnippets.computeIfAbsent(tag, k -> new ArrayList<>()).add(snippet); + } + } + + var topicsDir = Path.of(SITE_DIR, "topics"); + Files.createDirectories(topicsDir); + + for (var entry : tagSnippets.entrySet()) { + var tag = entry.getKey(); + var snippetsForTag = entry.getValue(); + var tagDisplay = TAG_DISPLAY.getOrDefault(tag, tag); + + // Render cards for snippets in this topic + var topicCards = snippetsForTag.stream() + .map(s -> renderIndexCard(templates.indexCard(), s, locale, strings)) + .collect(Collectors.joining("\n")); + + var canonicalUrl = "%s/topics/%s.html".formatted(BASE_URL, tag); + var topicTitle = strings.getOrDefault("topics.title", "{{tagDisplay}} — java.evolved") + .replace("{{tagDisplay}}", tagDisplay); + var topicDescription = strings.getOrDefault("topics.description", + "All Java patterns related to {{tagDisplay}} — java.evolved") + .replace("{{tagDisplay}}", tagDisplay); + var topicHeading = strings.getOrDefault("topics.heading", "Topic: {{tagDisplay}}") + .replace("{{tagDisplay}}", tagDisplay); + var topicSnippetCount = strings.getOrDefault("topics.snippetCount", "{{count}} patterns") + .replace("{{count}}", String.valueOf(snippetsForTag.size())); + + var tokens = new LinkedHashMap(); + tokens.putAll(strings); + tokens.put("locale", locale); + tokens.put("htmlDir", locale.equals("ar") ? "rtl" : "ltr"); + tokens.put("ogLocale", locale.replace("-", "_")); + tokens.put("homeUrl", homeUrl); + tokens.put("canonicalUrl", canonicalUrl); + tokens.put("tagDisplay", escape(tagDisplay)); + tokens.put("topicTitle", escape(topicTitle)); + tokens.put("topicDescription", escape(topicDescription)); + tokens.put("topics.heading", topicHeading); + tokens.put("topics.breadcrumb", strings.getOrDefault("topics.breadcrumb", "Topics")); + tokens.put("topics.backToAll", strings.getOrDefault("topics.backToAll", "← All patterns")); + tokens.put("topicSnippetCount", topicSnippetCount); + tokens.put("topicCards", topicCards); + tokens.put("topicBasePrefix", "../../"); + tokens.put("i18nScript", i18nScript); + + var html = replaceTokens(templates.topicPage(), tokens); + Files.writeString(topicsDir.resolve(tag + ".html"), html); + } + IO.println("Generated %d topic pages".formatted(tagSnippets.size())); +} + static final String GITHUB_ISSUES_URL = "https://github.com/javaevolved/javaevolved.github.io/issues/new"; Map buildContributeUrls(Snippet s, String locale, String localeName) { @@ -498,7 +606,8 @@ String generateHtml(Templates tpl, Snippet s, Map all, Map fuzzyMatch(query, s.title) || fuzzyMatch(query, s.category) || - fuzzyMatch(query, s.summary) + fuzzyMatch(query, s.summary) || + (Array.isArray(s.tags) && s.tags.some(t => fuzzyMatch(query, t))) ); } @@ -338,6 +339,9 @@ catDropdownCtrl.setActive('all'); activeCategory = null; applyFilters(); + } else { + // No filter dropdowns (e.g. topic pages) — show all cards + applyFilters(); } }; diff --git a/site/styles.css b/site/styles.css index b1c6571..3ae8b42 100644 --- a/site/styles.css +++ b/site/styles.css @@ -1816,3 +1816,46 @@ footer a:hover { text-align: left; unicode-bidi: embed; } + +/* ============================ + Tag Pills (topic tags on detail pages) + ============================ */ +.tag-pills { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin-top: 12px; +} + +.tag-pill { + display: inline-flex; + align-items: center; + font-size: 0.72rem; + font-weight: 500; + padding: 3px 10px; + border-radius: 20px; + border: 1px solid rgba(251, 146, 60, 0.3); + color: var(--accent); + background: rgba(251, 146, 60, 0.08); + text-decoration: none; + transition: background 0.15s, border-color 0.15s, color 0.15s; +} + +.tag-pill:hover { + background: rgba(251, 146, 60, 0.18); + border-color: var(--accent); + color: var(--accent); +} + +.tag-pill::before { + content: '#'; + opacity: 0.6; + margin-right: 2px; +} + +/* Topic badge on topic pages */ +.badge.topic-badge { + color: var(--accent); + background: rgba(251, 146, 60, 0.1); + border-color: rgba(251, 146, 60, 0.25); +} diff --git a/templates/index-card.html b/templates/index-card.html index 9501c2c..a72125c 100644 --- a/templates/index-card.html +++ b/templates/index-card.html @@ -1,4 +1,4 @@ - +
{{catDisplay}}
diff --git a/templates/slug-template.html b/templates/slug-template.html index ffed9bc..77f26e9 100644 --- a/templates/slug-template.html +++ b/templates/slug-template.html @@ -150,6 +150,7 @@

{{title}}

{{summary}}

+{{tagPills}}
diff --git a/templates/topic-page.html b/templates/topic-page.html new file mode 100644 index 0000000..d17a7cd --- /dev/null +++ b/templates/topic-page.html @@ -0,0 +1,108 @@ + + + + + + + + + {{topicTitle}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ 🏷 {{tagDisplay}} + {{topicSnippetCount}} +
+

{{topics.heading}}

+

{{topicDescription}}

+
+ + +
+ + + +{{i18nScript}} + + + diff --git a/translations/strings/en.yaml b/translations/strings/en.yaml index 86f445d..19b3761 100644 --- a/translations/strings/en.yaml +++ b/translations/strings/en.yaml @@ -30,6 +30,14 @@ sections: proof: Proof proofLink: View proof source relatedPatterns: Related patterns + tags: Topics +topics: + title: "{{tagDisplay}} — java.evolved" + description: "All Java patterns related to {{tagDisplay}} — java.evolved" + heading: "Topic: {{tagDisplay}}" + breadcrumb: Topics + backToAll: ← All patterns + snippetCount: "{{count}} patterns" filters: show: 'Show:' all: All