[pull] master from vinta:master#138
Merged
pull[bot] merged 40 commits intods-ebooks:masterfrom May 3, 2026
Merged
Conversation
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Avoids a slug collision between the group "Miscellaneous" and the category of the same name once both share the /categories/ URL namespace introduced in the upcoming filter-URL refactor. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Categories and groups will share the /categories/ URL namespace. Fail the build with a clear error message if a future README change introduces a collision. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Use the precomputed sub["url"] to identify which subcategories belong to a category. Avoids parsing the "Cat > Sub" value string, which would silently misfire if a category name ever contained " > ". Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
… parent Mirrors the .category-subtitle a underline style for visual cohesion in the hero, and locks in the gating behavior with a negative assertion so a regression that drops the page_kind guard would be caught. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Membership-only assertions wouldn't catch phantom URLs added by future build changes. Tighten back to an exact-list assertion now that we know the fixture's exact output, and assert lastmod count tracks loc count. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds filter_urls dict (categories, groups, subcategories) in build.py, passes filter_urls_json to the template, and injects a JSON script block before the results section in index.html. Covered by a new test that verifies all three URL types are present and correctly resolved. Co-Authored-By: Claude <noreply@anthropic.com>
`| safe` bypasses Jinja autoescape. If a category name ever contained "</script>", the literal substring would close the script block early, leaking JSON content into the DOM and creating an XSS vector. Replace "</" with "<\\/" (still valid JSON) and pass ensure_ascii=False so non-ASCII names render readably. Also add a group_path() helper to parallel category_path()/subcategory_path() and reuse category_urls when seeding filter_urls. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tag clicks on / pushState a category/group/subcategory path; on static pages they fully navigate. Search and sort stay in querystring. Built-in source tag has no data-url and stays as an in-page filter. The isIndexDocument flag is captured at load time so toggling on the index keeps working after pushState changes location.pathname. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The category template rendered a tag for `category.name` plus a tag for `entry.groups[0]`, which duplicated the group name on group pages where those values are identical (e.g. /categories/python-language/ showing "Python Language" twice). It also never rendered `entry.categories`, so group pages omitted each project's actual category. Mirror the index template's tag rendering on category, group, and subcategory pages, and mark whichever tag matches the current page URL as active. Pass `category_urls` and `current_path` to each render call so the template can match by URL.
The "All projects" link in the category-page topbar pointed to /#library-index so the browser would scroll to the library section on arrival. The hash stayed in the URL, which looked like an internal anchor state rather than a clean homepage URL. On homepage load, if the hash is #library-index, scroll to the section explicitly and use history.replaceState to drop the hash from the URL. The scrollIntoView call covers the case where the script runs before the browser's native anchor scroll, since replaceState removes the hash the browser would have used.
The results-intro grid (1fr + 28rem note column) squeezed the heading on category pages with long names, e.g. "Python Projects in Environment Management" wrapped onto two lines. Scope a single-column override to .category-results so the heading takes the full row and the note drops below right-aligned. Index page layout is untouched since its heading is short.
Switch justify-self from end to start so the "Sorted by GitHub stars..." note sits flush left under the heading instead of right-aligned.
Removes inline .category-row-desc from the name cell and renders entry.description inside .expand-content instead, matching the index page pattern. Drops the now-unused CSS rules for .category-row-desc and the overridden .category-table .expand-content padding. Co-Authored-By: Claude <noreply@anthropic.com>
Add search input, filter chips, no-results block, and back-to-top button to category/group/subcategory pages. Pass filter_urls_json to all page types so tag-chip navigation works site-wide. Fix JS so filter-clear and no-results-clear redirect to / on non-index pages instead of trying to filter a non-existent local table. Remove the now-redundant .category-results CSS overrides. Co-Authored-By: Claude <noreply@anthropic.com>
Register Built-in as a navigable filter path alongside regular category and group slugs, emit the page during build, add it to the sitemap, and wire the Built-in tag buttons in index.html and category.html to navigate there via data-url. Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Adds a dedicated sponsorship page at /sponsorship/ built from the Jinja2 template, with hero stats, tier cards, and CSS. Updates the index.html sponsor sidebar link to point to /sponsorship/ instead of the GitHub SPONSORSHIP.md. Adds the URL to the sitemap and test fixtures. Also renames .impeccable.md to DESIGN.md. Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
…th filter_urls map - Extract render_category() helper to deduplicate the three category/group/builtin rendering blocks in build.py - Replace synthetic dict literals with synthetic_category() helper - Rewrite subcategory rendering to avoid O(n²) loop using precomputed dicts - Pass filter_urls (not just JSON) to templates so Jinja can look up group URLs directly instead of applying the slugify filter at render time - Remove slugify from env.filters (no longer used in templates) - Replace isIndexPage() wrapper with isIndexDocument constant in main.js - Fix: call applyFilters() on page load when activeFilter is set - Remove dead else branch in tag click handler (category pages with no URL) - Switch .hero-category-links from CSS columns to CSS grid for more even layout - Remove max-width cap on .category-subtitle Co-Authored-By: Claude <noreply@anthropic.com>
Remove the 'All projects' nav link and total_entries hero stat from the sponsorship page. Rename 'View the repository' CTA to 'View on GitHub'. Co-Authored-By: Claude <noreply@anthropic.com>
Drops tests that either duplicate coverage already provided by adjacent cases (single-word slugify, trailing-slash checks) or hard-code first- category names and specific description strings that break whenever the README content shifts. Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Static category pages and path-based filter URLs
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
See Commits and Changes for more details.
Created by
pull[bot] (v2.0.0-alpha.4)
Can you help keep this open source service alive? 💖 Please sponsor : )