mirror of
https://github.com/vinta/awesome-python.git
synced 2026-03-24 01:24:43 +08:00
Entries appearing in more than one category were previously emitted as separate rows. They are now deduplicated in build.py by URL, collecting all category and group names into lists. The template encodes those lists as pipe-delimited data attributes (data-cats, data-groups) and renders a tag button per category. The JS filter is updated to split on '||' and check for membership, so clicking any category tag correctly shows the merged row. Co-Authored-By: Claude <noreply@anthropic.com>
170 lines
5.0 KiB
HTML
170 lines
5.0 KiB
HTML
{% extends "base.html" %} {% block content %}
|
|
<header class="hero">
|
|
<div class="hero-main">
|
|
<div>
|
|
<h1>Awesome Python</h1>
|
|
<p class="hero-sub">
|
|
{{ subtitle }}<br />Maintained by
|
|
<a href="https://github.com/vinta" target="_blank" rel="noopener"
|
|
>@vinta</a
|
|
>
|
|
and
|
|
<a
|
|
href="https://github.com/JinyangWang27"
|
|
target="_blank"
|
|
rel="noopener"
|
|
>@JinyangWang27</a
|
|
>.
|
|
</p>
|
|
<a
|
|
href="https://github.com/vinta/awesome-python"
|
|
class="hero-gh"
|
|
target="_blank"
|
|
rel="noopener"
|
|
>awesome-python on GitHub →</a
|
|
>
|
|
</div>
|
|
<a
|
|
href="https://github.com/vinta/awesome-python/blob/master/CONTRIBUTING.md"
|
|
class="hero-submit"
|
|
target="_blank"
|
|
rel="noopener"
|
|
>Submit a Project</a
|
|
>
|
|
</div>
|
|
</header>
|
|
|
|
<h2 class="sr-only">Search and filter</h2>
|
|
<div class="controls">
|
|
<div class="search-wrap">
|
|
<svg
|
|
class="search-icon"
|
|
width="16"
|
|
height="16"
|
|
viewBox="0 0 24 24"
|
|
fill="none"
|
|
stroke="currentColor"
|
|
stroke-width="2.5"
|
|
stroke-linecap="round"
|
|
stroke-linejoin="round"
|
|
>
|
|
<circle cx="11" cy="11" r="8" />
|
|
<line x1="21" y1="21" x2="16.65" y2="16.65" />
|
|
</svg>
|
|
<input
|
|
type="search"
|
|
class="search"
|
|
placeholder="Search {{ entries | length }} libraries across {{ total_categories }} categories..."
|
|
aria-label="Search libraries"
|
|
/>
|
|
</div>
|
|
<div class="filter-bar" hidden>
|
|
<span>Showing <strong class="filter-value"></strong></span>
|
|
<button class="filter-clear" aria-label="Clear filter">
|
|
× Clear
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<h2 class="sr-only">Results</h2>
|
|
<div class="table-wrap" tabindex="0" role="region" aria-label="Libraries table">
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th class="col-num"><span class="sr-only">#</span></th>
|
|
<th class="col-name" data-sort="name">Project Name</th>
|
|
<th class="col-stars" data-sort="stars">GitHub Stars</th>
|
|
<th class="col-commit" data-sort="commit-time">Last Commit</th>
|
|
<th class="col-cat">Category</th>
|
|
<th class="col-arrow"><span class="sr-only">Details</span></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for entry in entries %}
|
|
<tr
|
|
class="row"
|
|
role="button"
|
|
data-cats="{{ entry.categories | join('||') }}"
|
|
data-groups="{{ entry.groups | join('||') }}"
|
|
tabindex="0"
|
|
aria-expanded="false"
|
|
aria-controls="expand-{{ loop.index }}"
|
|
>
|
|
<td class="col-num">{{ loop.index }}</td>
|
|
<td class="col-name">
|
|
<a href="{{ entry.url }}" target="_blank" rel="noopener"
|
|
>{{ entry.name }}</a
|
|
>
|
|
</td>
|
|
<td class="col-stars">
|
|
{% if entry.stars is not none %}{{ "{:,}".format(entry.stars) }}{%
|
|
else %}—{% endif %}
|
|
</td>
|
|
<td
|
|
class="col-commit"
|
|
{%
|
|
if
|
|
entry.last_commit_at
|
|
%}data-commit="{{ entry.last_commit_at }}"
|
|
{%
|
|
endif
|
|
%}
|
|
>
|
|
{% if entry.last_commit_at %}<time
|
|
datetime="{{ entry.last_commit_at }}"
|
|
>{{ entry.last_commit_at[:10] }}</time
|
|
>{% else %}—{% endif %}
|
|
</td>
|
|
<td class="col-cat">
|
|
{% for cat in entry.categories %}
|
|
<button class="tag" data-type="cat" data-value="{{ cat }}">
|
|
{{ cat }}
|
|
</button>
|
|
{% endfor %}
|
|
<button class="tag tag-group" data-type="group" data-value="{{ entry.groups[0] }}">
|
|
{{ entry.groups[0] }}
|
|
</button>
|
|
</td>
|
|
<td class="col-arrow"><span class="arrow">→</span></td>
|
|
</tr>
|
|
<tr class="expand-row" id="expand-{{ loop.index }}">
|
|
<td></td>
|
|
<td colspan="4">
|
|
<div class="expand-content">
|
|
{% if entry.description %}
|
|
<div class="expand-desc">{{ entry.description | safe }}</div>
|
|
{% endif %} {% if entry.also_see %}
|
|
<div class="expand-also-see">
|
|
Also see: {% for see in entry.also_see %}<a
|
|
href="{{ see.url }}"
|
|
target="_blank"
|
|
rel="noopener"
|
|
>{{ see.name }}</a
|
|
>{% if not loop.last %}, {% endif %}{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
<div class="expand-meta">
|
|
{% if entry.owner %}<a
|
|
href="https://github.com/{{ entry.owner }}"
|
|
target="_blank"
|
|
rel="noopener"
|
|
>{{ entry.owner }}</a
|
|
><span class="expand-sep">/</span>{% endif %}<a
|
|
href="{{ entry.url }}"
|
|
target="_blank"
|
|
rel="noopener"
|
|
>{{ entry.url | replace("https://", "") }}</a
|
|
>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
<td></td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="no-results" hidden>No libraries match your search.</div>
|
|
{% endblock %}
|