Add feature/topic tags for cross-category snippet discoverability#157
Draft
brunoborges with Copilot wants to merge 2 commits into
Draft
Add feature/topic tags for cross-category snippet discoverability#157brunoborges with Copilot wants to merge 2 commits into
brunoborges with Copilot wants to merge 2 commits into
Conversation
- Add tags field to all 113 content YAML files with appropriate Java feature tags
(records, sealed-classes, pattern-matching, switch, virtual-threads, streams,
optional, collections, null-safety, text-blocks, var, concurrency, and more)
- Update content/template.json with tags field example
- Add html-generators/tags.properties mapping tag slugs to display names
- Add templates/topic-page.html template for topic listing pages
- Update templates/slug-template.html to render tag pills ({{tagPills}} token)
- Update templates/index-card.html to include data-tags attribute for filtering
- Update html-generators/generate.java to:
- Parse tags from Snippet content
- Include tags in snippets.json
- Add data-tags attribute to index cards
- Render tag pill links on snippet detail pages
- Generate 43 topic pages at site/topics/{tag}.html
- Update site/styles.css with tag-pill and topic-badge styles
- Update site/app.js to show cards on topic pages and search by tags
- Update translations/strings/en.yaml with sections.tags and topics.* keys
- Update .gitignore to exclude site/topics/*.html (generated files)
- Update .github/workflows/deploy.yml to regenerate on tags.properties/categories.properties changes
Co-authored-by: brunoborges <129743+brunoborges@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Add feature/topic tags for better discoverability
Add feature/topic tags for cross-category snippet discoverability
Jul 8, 2026
Contributor
There was a problem hiding this comment.
Pull request overview
Adds a cross-category “topic tags” layer to the static-site generator so related snippets can be discovered and browsed across categories (via tag pills on detail pages, topic listing pages, and tag-aware search/filter metadata).
Changes:
- Introduces tag slug→display-name mapping and generator support for tags, tag pills, and English-only topic pages under
site/topics/. - Updates templates/CSS/JS to render and style tag UI, add
data-tagsto cards, and include tags in search/filter logic. - Adds
tagsmetadata to snippet content/schema and updates deploy triggers/ignores for generated topic pages.
Show a summary per file
| File | Description |
|---|---|
| translations/strings/en.yaml | Adds new UI strings for topic/tag labeling and topic pages. |
| templates/topic-page.html | New template for tag topic listing pages. |
| templates/slug-template.html | Injects {{tagPills}} on snippet detail pages. |
| templates/index-card.html | Adds data-tags attribute to index cards for tag-aware filtering. |
| site/styles.css | Adds styling for tag pills and topic badges. |
| site/app.js | Extends search to match tags; ensures cards aren’t left hidden on pages without filter dropdowns. |
| html-generators/tags.properties | Adds tag slug→display name registry used for UI labels. |
| html-generators/generate.java | Loads tag registry, reads tags from snippet content, generates topic pages, emits tag pills and data-tags. |
| content/tooling/single-file-execution.yaml | Adds tags metadata to snippet content. |
| content/tooling/multi-file-source.yaml | Adds tags metadata to snippet content. |
| content/tooling/junit6-with-jspecify.yaml | Adds tags metadata to snippet content. |
| content/tooling/jshell-prototyping.yaml | Adds tags metadata to snippet content. |
| content/tooling/jfr-profiling.yaml | Adds tags metadata to snippet content. |
| content/tooling/compact-object-headers.yaml | Adds tags metadata to snippet content. |
| content/tooling/built-in-http-server.yaml | Adds tags metadata to snippet content. |
| content/tooling/aot-class-preloading.yaml | Adds tags metadata to snippet content. |
| content/template.json | Updates content template schema to include tags. |
| content/strings/string-strip.yaml | Adds tags metadata to snippet content. |
| content/strings/string-repeat.yaml | Adds tags metadata to snippet content. |
| content/strings/string-lines.yaml | Adds tags metadata to snippet content. |
| content/strings/string-isblank.yaml | Adds tags metadata to snippet content. |
| content/strings/string-indent-transform.yaml | Adds tags metadata to snippet content. |
| content/strings/string-formatted.yaml | Adds tags metadata to snippet content. |
| content/strings/string-chars-stream.yaml | Adds tags metadata to snippet content. |
| content/streams/virtual-thread-executor.yaml | Adds tags metadata to snippet content. |
| content/streams/stream-tolist.yaml | Adds tags metadata to snippet content. |
| content/streams/stream-takewhile-dropwhile.yaml | Adds tags metadata to snippet content. |
| content/streams/stream-of-nullable.yaml | Adds tags metadata to snippet content. |
| content/streams/stream-mapmulti.yaml | Adds tags metadata to snippet content. |
| content/streams/stream-iterate-predicate.yaml | Adds tags metadata to snippet content. |
| content/streams/stream-gatherers.yaml | Adds tags metadata to snippet content. |
| content/streams/predicate-not.yaml | Adds tags metadata to snippet content. |
| content/streams/optional-or.yaml | Adds tags metadata to snippet content. |
| content/streams/optional-ifpresentorelse.yaml | Adds tags metadata to snippet content. |
| content/streams/collectors-flatmapping.yaml | Adds tags metadata to snippet content. |
| content/security/tls-default.yaml | Adds tags metadata to snippet content. |
| content/security/strong-random.yaml | Adds tags metadata to snippet content. |
| content/security/random-generator.yaml | Adds tags metadata to snippet content. |
| content/security/pem-encoding.yaml | Adds tags metadata to snippet content. |
| content/security/key-derivation-functions.yaml | Adds tags metadata to snippet content. |
| content/language/unnamed-variables.yaml | Adds tags metadata to snippet content. |
| content/language/type-inference-with-var.yaml | Adds tags metadata to snippet content. |
| content/language/text-blocks-for-multiline-strings.yaml | Adds tags metadata to snippet content. |
| content/language/switch-expressions.yaml | Adds tags metadata to snippet content. |
| content/language/static-methods-in-interfaces.yaml | Adds tags metadata to snippet content. |
| content/language/static-members-in-inner-classes.yaml | Adds tags metadata to snippet content. |
| content/language/sealed-classes.yaml | Adds tags metadata to snippet content. |
| content/language/records-for-data-classes.yaml | Adds tags metadata to snippet content. |
| content/language/record-patterns.yaml | Adds tags metadata to snippet content. |
| content/language/private-interface-methods.yaml | Adds tags metadata to snippet content. |
| content/language/primitive-types-in-patterns.yaml | Adds tags metadata to snippet content. |
| content/language/pattern-matching-switch.yaml | Adds tags metadata to snippet content. |
| content/language/pattern-matching-instanceof.yaml | Adds tags metadata to snippet content. |
| content/language/module-import-declarations.yaml | Adds tags metadata to snippet content. |
| content/language/markdown-javadoc-comments.yaml | Adds tags metadata to snippet content. |
| content/language/guarded-patterns.yaml | Adds tags metadata to snippet content. |
| content/language/flexible-constructor-bodies.yaml | Adds tags metadata to snippet content. |
| content/language/exhaustive-switch.yaml | Adds tags metadata to snippet content. |
| content/language/diamond-operator.yaml | Adds tags metadata to snippet content. |
| content/language/default-interface-methods.yaml | Adds tags metadata to snippet content. |
| content/language/compact-source-files.yaml | Adds tags metadata to snippet content. |
| content/language/compact-canonical-constructor.yaml | Adds tags metadata to snippet content. |
| content/language/call-c-from-java.yaml | Adds tags metadata to snippet content. |
| content/io/writing-files.yaml | Adds tags metadata to snippet content. |
| content/io/try-with-resources-effectively-final.yaml | Adds tags metadata to snippet content. |
| content/io/reading-files.yaml | Adds tags metadata to snippet content. |
| content/io/path-of.yaml | Adds tags metadata to snippet content. |
| content/io/io-class-console-io.yaml | Adds tags metadata to snippet content. |
| content/io/inputstream-transferto.yaml | Adds tags metadata to snippet content. |
| content/io/http-client.yaml | Adds tags metadata to snippet content. |
| content/io/files-mismatch.yaml | Adds tags metadata to snippet content. |
| content/io/file-memory-mapping.yaml | Adds tags metadata to snippet content. |
| content/io/deserialization-filters.yaml | Adds tags metadata to snippet content. |
| content/errors/require-nonnull-else.yaml | Adds tags metadata to snippet content. |
| content/errors/record-based-errors.yaml | Adds tags metadata to snippet content. |
| content/errors/optional-orelsethrow.yaml | Adds tags metadata to snippet content. |
| content/errors/optional-chaining.yaml | Adds tags metadata to snippet content. |
| content/errors/null-in-switch.yaml | Adds tags metadata to snippet content. |
| content/errors/multi-catch.yaml | Adds tags metadata to snippet content. |
| content/errors/helpful-npe.yaml | Adds tags metadata to snippet content. |
| content/enterprise/spring-xml-config-vs-annotations.yaml | Adds tags metadata to snippet content. |
| content/enterprise/spring-null-safety-jspecify.yaml | Adds tags metadata to snippet content. |
| content/enterprise/spring-api-versioning.yaml | Adds tags metadata to snippet content. |
| content/enterprise/soap-vs-jakarta-rest.yaml | Adds tags metadata to snippet content. |
| content/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml | Adds tags metadata to snippet content. |
| content/enterprise/servlet-vs-jaxrs.yaml | Adds tags metadata to snippet content. |
| content/enterprise/mdb-vs-reactive-messaging.yaml | Adds tags metadata to snippet content. |
| content/enterprise/manual-transaction-vs-declarative.yaml | Adds tags metadata to snippet content. |
| content/enterprise/jsf-managed-bean-vs-cdi-named.yaml | Adds tags metadata to snippet content. |
| content/enterprise/jpa-vs-jakarta-data.yaml | Adds tags metadata to snippet content. |
| content/enterprise/jndi-lookup-vs-cdi-injection.yaml | Adds tags metadata to snippet content. |
| content/enterprise/jdbc-vs-jpa.yaml | Adds tags metadata to snippet content. |
| content/enterprise/jdbc-vs-jooq.yaml | Adds tags metadata to snippet content. |
| content/enterprise/jdbc-resultset-vs-jpa-criteria.yaml | Adds tags metadata to snippet content. |
| content/enterprise/ejb-vs-cdi.yaml | Adds tags metadata to snippet content. |
| content/enterprise/ejb-timer-vs-jakarta-scheduler.yaml | Adds tags metadata to snippet content. |
| content/datetime/math-clamp.yaml | Adds tags metadata to snippet content. |
| content/datetime/java-time-basics.yaml | Adds tags metadata to snippet content. |
| content/datetime/instant-precision.yaml | Adds tags metadata to snippet content. |
| content/datetime/hex-format.yaml | Adds tags metadata to snippet content. |
| content/datetime/duration-and-period.yaml | Adds tags metadata to snippet content. |
| content/datetime/date-formatting.yaml | Adds tags metadata to snippet content. |
| content/concurrency/virtual-threads.yaml | Adds tags metadata to snippet content. |
| content/concurrency/thread-sleep-duration.yaml | Adds tags metadata to snippet content. |
| content/concurrency/structured-concurrency.yaml | Adds tags metadata to snippet content. |
| content/concurrency/stable-values.yaml | Adds tags metadata to snippet content. |
| content/concurrency/scoped-values.yaml | Adds tags metadata to snippet content. |
| content/concurrency/process-api.yaml | Adds tags metadata to snippet content. |
| content/concurrency/lock-free-lazy-init.yaml | Adds tags metadata to snippet content. |
| content/concurrency/executor-try-with-resources.yaml | Adds tags metadata to snippet content. |
| content/concurrency/concurrent-http-virtual.yaml | Adds tags metadata to snippet content. |
| content/concurrency/completablefuture-chaining.yaml | Adds tags metadata to snippet content. |
| content/collections/unmodifiable-collectors.yaml | Adds tags metadata to snippet content. |
| content/collections/stream-toarray-typed.yaml | Adds tags metadata to snippet content. |
| content/collections/sequenced-collections.yaml | Adds tags metadata to snippet content. |
| content/collections/reverse-list-iteration.yaml | Adds tags metadata to snippet content. |
| content/collections/map-entry-factory.yaml | Adds tags metadata to snippet content. |
| content/collections/immutable-set-creation.yaml | Adds tags metadata to snippet content. |
| content/collections/immutable-map-creation.yaml | Adds tags metadata to snippet content. |
| content/collections/immutable-list-creation.yaml | Adds tags metadata to snippet content. |
| content/collections/copying-collections-immutably.yaml | Adds tags metadata to snippet content. |
| content/collections/collectors-teeing.yaml | Adds tags metadata to snippet content. |
| .gitignore | Ignores generated topic pages under site/topics/. |
| .github/workflows/deploy.yml | Regenerates site when tag/category registries change. |
Review details
- Files reviewed: 123/124 changed files
- Comments generated: 2
- Review effort level: Low
| 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()); |
Comment on lines
+180
to
+186
| List<String> tags() { | ||
| var t = node.get("tags"); | ||
| if (t == null || !t.isArray()) return List.of(); | ||
| var tagList = new ArrayList<String>(); | ||
| t.forEach(n -> tagList.add(n.asText())); | ||
| return tagList; | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Java features like Records span multiple categories (Language, Errors, Enterprise), making end-to-end feature exploration require manual searching. This adds a secondary organization layer via tags that groups related snippets regardless of category.
Content:
tagsfield on all snippetsAll 113 content YAML files now carry a
tagsarray:Tag-to-display-name mapping lives in
html-generators/tags.properties.Generator: topic pages + tag pills
site/topics/{tag}.htmlpages (43 total) — each lists all snippets sharing that tag across any categorydata-tags="records pattern-matching"to index card elements for future client-side filteringdata/snippets.jsonTemplates
templates/topic-page.html— new template for topic listing pages; reuses the same index-card componenttemplates/slug-template.html— adds{{tagPills}}block below the snippet summarytemplates/index-card.html— addsdata-tagsattributeCSS / JS
.tag-pillstyled as rounded orange-tinted links;.topic-badgefor topic page headersfuzzyMatchextended), so searching "records" surfaces all tagged snippetsinitFiltersno longer leaves cards hidden on pages without filter dropdowns (topic pages)Infra
site/topics/*.htmladded to.gitignore(generated, like all other HTML undersite/)deploy.ymltriggers regeneration whentags.propertiesorcategories.propertieschange