Skip to content

Add feature/topic tags for cross-category snippet discoverability#157

Draft
brunoborges with Copilot wants to merge 2 commits into
mainfrom
copilot/improve-discoverability-feature-tags
Draft

Add feature/topic tags for cross-category snippet discoverability#157
brunoborges with Copilot wants to merge 2 commits into
mainfrom
copilot/improve-discoverability-feature-tags

Conversation

Copilot AI commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

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: tags field on all snippets

All 113 content YAML files now carry a tags array:

tags:
- records
- pattern-matching

Tag-to-display-name mapping lives in html-generators/tags.properties.

Generator: topic pages + tag pills

  • Generates site/topics/{tag}.html pages (43 total) — each lists all snippets sharing that tag across any category
  • Renders clickable tag pills on snippet detail pages linking to the corresponding topic page
  • Adds data-tags="records pattern-matching" to index card elements for future client-side filtering
  • Tags are included in data/snippets.json

Templates

  • templates/topic-page.html — new template for topic listing pages; reuses the same index-card component
  • templates/slug-template.html — adds {{tagPills}} block below the snippet summary
  • templates/index-card.html — adds data-tags attribute

CSS / JS

  • .tag-pill styled as rounded orange-tinted links; .topic-badge for topic page headers
  • Search overlay now matches against tags (fuzzyMatch extended), so searching "records" surfaces all tagged snippets
  • initFilters no longer leaves cards hidden on pages without filter dropdowns (topic pages)

Infra

  • site/topics/*.html added to .gitignore (generated, like all other HTML under site/)
  • deploy.yml triggers regeneration when tags.properties or categories.properties change

- 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
Copilot AI requested a review from brunoborges July 8, 2026 18:49
@brunoborges brunoborges requested a review from Copilot July 9, 2026 15:58

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-tags to cards, and include tags in search/filter logic.
  • Adds tags metadata 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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve discoverability with feature/topic tags, e.g. records

3 participants