diff --git a/.github/workflows/contributors/generate_main_readme.py b/.github/workflows/contributors/generate_main_readme.py index 78166a1f9..ba20e1e61 100644 --- a/.github/workflows/contributors/generate_main_readme.py +++ b/.github/workflows/contributors/generate_main_readme.py @@ -15,40 +15,58 @@ import re import sys from pathlib import Path -# Contribution type to emoji mapping +# Fun emoji mapping for contribution types (synced with generate_readme_tables.py) +# Custom icons chosen to be more distinctive and student-friendly CONTRIBUTION_EMOJIS = { - "bug": "π", - "code": "π»", - "design": "π¨", - "doc": "π", - "ideas": "π‘", - "review": "π", - "test": "π§ͺ", - "tool": "π§", - "tutorial": "β ", - "maintenance": "π§", - "infra": "π", - "question": "π¬", - "translation": "π", - "content": "π", - "example": "π‘", - "security": "π", - "financial": "π΅", - "fundingFinding": "π", - "eventOrganizing": "π", - "talk": "π’", - "video": "πΉ", - "audio": "π", - "data": "π£", - "platform": "π¦", - "projectManagement": "π", - "mentoring": "π§βπ«", - "plugin": "π", - "userTesting": "π", - "a11y": "βΏοΈ", - "business": "πΌ", - "research": "π¬", - "promotion": "π£", + "a11y": "βΏοΈ", # Accessibility Champion + "audio": "π§", # Audio Wizard + "blog": "βοΈ", # Blog Writer + "bug": "πͺ²", # Bug Hunter + "business": "πΌ", # Business Strategist + "code": "π§βπ»", # Code Contributor + "content": "π", # Content Creator + "data": "ποΈ", # Data Wrangler + "design": "π¨", # Design Artist + "doc": "βοΈ", # Documentation Hero + "eventOrganizing": "πͺ", # Event Organizer + "example": "π‘", # Example Creator + "financial": "π°", # Financial Supporter + "fundingFinding": "π", # Funding Finder + "ideas": "π§ ", # Idea Generator + "infra": "ποΈ", # Infrastructure Builder + "maintenance": "π©", # Maintenance Master + "mentoring": "π§βπ«", # Mentor + "platform": "π¦", # Platform Support + "plugin": "π", # Plugin Developer + "projectManagement": "π", # Project Manager + "promotion": "π£", # Promoter + "question": "π¬", # Q&A Helper + "research": "π¬", # Researcher + "review": "π", # Code Reviewer + "security": "π‘οΈ", # Security Guardian + "talk": "π€", # Speaker + "test": "π§ͺ", # Test Engineer + "tool": "π οΈ", # Tool Builder + "translation": "π", # Translator + "tutorial": "π", # Tutorial Author + "userTesting": "π§βπ»", # User Tester + "video": "π¬", # Video Creator +} + +# Legend for common contribution types (shown in README) +CONTRIBUTION_LEGEND = { + "bug": ("πͺ²", "Bug Hunter"), + "code": ("π§βπ»", "Code Contributor"), + "doc": ("βοΈ", "Documentation Hero"), + "design": ("π¨", "Design Artist"), + "ideas": ("π§ ", "Idea Generator"), + "review": ("π", "Code Reviewer"), + "test": ("π§ͺ", "Test Engineer"), + "tool": ("π οΈ", "Tool Builder"), + "infra": ("ποΈ", "Infrastructure Builder"), + "maintenance": ("π©", "Maintenance Master"), + "research": ("π¬", "Researcher"), + "tutorial": ("π", "Tutorial Author"), } @@ -82,10 +100,17 @@ def generate_contributor_table(contributors: list, show_badges: bool = True) -> if not contributors: return "
Coming soon!
" + # Sort by contribution count (most contributions first) + sorted_contributors = sorted( + contributors, + key=lambda c: len(c.get("contributions", [])), + reverse=True + ) + rows = [] row_cells = [] - for i, contributor in enumerate(contributors): + for i, contributor in enumerate(sorted_contributors): row_cells.append(generate_contributor_cell(contributor, show_badges)) # 7 contributors per row @@ -104,6 +129,12 @@ def generate_contributor_table(contributors: list, show_badges: bool = True) -> ''' +def generate_legend() -> str: + """Generate a compact legend for contribution types.""" + items = [f"{emoji} {title}" for emoji, title in CONTRIBUTION_LEGEND.values()] + return " Β· ".join(items) + + def generate_sectioned_contributors(repo_root: Path) -> str: """Generate the full sectioned contributor section showing ALL contributors.""" # Load all configs @@ -129,9 +160,14 @@ def generate_sectioned_contributors(repo_root: Path) -> str: kits_table = generate_contributor_table(kits_contributors) labs_table = generate_contributor_table(labs_contributors) + # Generate legend + legend = generate_legend() + return f'''## Contributors -Thanks goes to these wonderful people who have contributed to making this resource better for everyone ([emoji key](https://allcontributors.org/docs/en/emoji-key)): +Thanks goes to these wonderful people who have contributed to making this resource better for everyone! + +**Legend:** {legend} ### π Textbook Contributors ({book_count}) diff --git a/.github/workflows/contributors/generate_readme_tables.py b/.github/workflows/contributors/generate_readme_tables.py index 5b07d4fba..6ffceb8e9 100755 --- a/.github/workflows/contributors/generate_readme_tables.py +++ b/.github/workflows/contributors/generate_readme_tables.py @@ -21,42 +21,42 @@ PROJECTS = { "tinytorch": "tinytorch/", } -# Emoji mapping for contribution types -# See: https://allcontributors.org/docs/en/emoji-key +# Fun emoji mapping for contribution types +# Custom icons chosen to be more distinctive and student-friendly EMOJI_KEY = { - "a11y": "βΏοΈ", - "audio": "π", - "blog": "π", - "bug": "π", - "business": "πΌ", - "code": "π»", - "content": "π", - "data": "π£", - "design": "π¨", - "doc": "π", - "eventOrganizing": "π", - "example": "π‘", - "financial": "π΅", - "fundingFinding": "π", - "ideas": "π€", - "infra": "π", - "maintenance": "π§", - "mentoring": "π§βπ«", - "platform": "π¦", - "plugin": "π", - "projectManagement": "π", - "promotion": "π£", - "question": "π¬", - "research": "π¬", - "review": "π", - "security": "π‘οΈ", - "talk": "π’", - "test": "β οΈ", - "tool": "π§", - "translation": "π", - "tutorial": "β ", - "userTesting": "π", - "video": "πΉ", + "a11y": "βΏοΈ", # Accessibility Champion + "audio": "π§", # Audio Wizard + "blog": "βοΈ", # Blog Writer + "bug": "πͺ²", # Bug Hunter + "business": "πΌ", # Business Strategist + "code": "π§βπ»", # Code Contributor + "content": "π", # Content Creator + "data": "ποΈ", # Data Wrangler + "design": "π¨", # Design Artist + "doc": "βοΈ", # Documentation Hero + "eventOrganizing": "πͺ", # Event Organizer + "example": "π‘", # Example Creator + "financial": "π°", # Financial Supporter + "fundingFinding": "π", # Funding Finder + "ideas": "π§ ", # Idea Generator + "infra": "ποΈ", # Infrastructure Builder + "maintenance": "π©", # Maintenance Master + "mentoring": "π§βπ«", # Mentor + "platform": "π¦", # Platform Support + "plugin": "π", # Plugin Developer + "projectManagement": "π", # Project Manager + "promotion": "π£", # Promoter + "question": "π¬", # Q&A Helper + "research": "π¬", # Researcher + "review": "π", # Code Reviewer + "security": "π‘οΈ", # Security Guardian + "talk": "π€", # Speaker + "test": "π§ͺ", # Test Engineer + "tool": "π οΈ", # Tool Builder + "translation": "π", # Translator + "tutorial": "π", # Tutorial Author + "userTesting": "π§βπ»", # User Tester + "video": "π¬", # Video Creator } @@ -145,12 +145,19 @@ def process_project(project_name: str, project_path: str, update: bool = False) contributors = rc_data.get('contributors', []) per_line = rc_data.get('contributorsPerLine', 7) image_size = rc_data.get('imageSize', 80) - + if not contributors: print(f"{project_name}: No contributors to display") return - - table_html = generate_table(contributors, per_line, image_size) + + # Sort contributors by number of contributions (descending) + sorted_contributors = sorted( + contributors, + key=lambda c: len(c.get('contributions', [])), + reverse=True + ) + + table_html = generate_table(sorted_contributors, per_line, image_size) print(f"\n=== {project_name} ({len(contributors)} contributors) ===") diff --git a/README.md b/README.md index 07e779a30..0a6cde64b 100644 --- a/README.md +++ b/README.md @@ -287,7 +287,9 @@ The textbook content (chapters, figures, explanations) is educational material t ## Contributors -Thanks goes to these wonderful people who have contributed to making this resource better for everyone ([emoji key](https://allcontributors.org/docs/en/emoji-key)): +Thanks goes to these wonderful people who have contributed to making this resource better for everyone! + +**Legend:** πͺ² Bug Hunter Β· π§βπ» Code Contributor Β· βοΈ Documentation Hero Β· π¨ Design Artist Β· π§ Idea Generator Β· π Code Reviewer Β· π§ͺ Test Engineer Β· π οΈ Tool Builder Β· ποΈ Infrastructure Builder Β· π© Maintenance Master Β· π¬ Researcher Β· π Tutorial Author ### π Textbook Contributors (102) @@ -297,136 +299,136 @@ Thanks goes to these wonderful people who have contributed to making this resourAmir Alasady π |
- Vijay Janapa Reddi π π» π¨ π π‘ π π§ͺ π§ |
- kai π π» π¨ π π§ͺ |
- Dang Truong π π» π π§ͺ |
- Didier Durand π π» π |
- Karthik Dani π π» |
- jettythek π» |
+ Vijay Janapa Reddi πͺ² π§βπ» π¨ βοΈ π§ π π§ͺ π οΈ |
+ kai πͺ² π§βπ» π¨ βοΈ π§ͺ |
+ Dang Truong πͺ² π§βπ» βοΈ π§ͺ |
+ Didier Durand πͺ² π§βπ» βοΈ |
+ Karthik Dani πͺ² π§βπ» |
+ Avik De πͺ² π§ͺ |
+ Amir Alasady πͺ² |
Avik De π π§ͺ |
- Takosaga π |
+ jettythek π§βπ» |
+ Takosaga πͺ² |
Marcelo Rovai π π» π¨ β |
- Vijay Janapa Reddi π π» π¨ π π§ͺ π§ |
+ Vijay Janapa Reddi πͺ² π§βπ» π¨ βοΈ π§ͺ π οΈ |
+ Marcelo Rovai βοΈ π§βπ» π¨ π |
Vijay Janapa Reddi π» π¨ π |
+ Vijay Janapa Reddi π§βπ» π¨ βοΈ |
Marcelo Rovai π π» π¨ β |
- Vijay Janapa Reddi π π» π¨ π π§ͺ π§ |
+ Vijay Janapa Reddi πͺ² π§βπ» π¨ βοΈ π§ͺ π οΈ |
+ Marcelo Rovai βοΈ π§βπ» π¨ π |
Vijay Janapa Reddi π» π¨ π |
+ Vijay Janapa Reddi π§βπ» π¨ βοΈ |
Amir Alasady π |
- Vijay Janapa Reddi π π» π¨ π π‘ π π§ͺ π§ |
- kai π π» π¨ π π§ͺ |
- Dang Truong π π» π π§ͺ |
- Didier Durand π π» π |
- Karthik Dani π π» |
- jettythek π» |
+ Vijay Janapa Reddi πͺ² π§βπ» π¨ βοΈ π§ π π§ͺ π οΈ |
+ kai πͺ² π§βπ» π¨ βοΈ π§ͺ |
+ Dang Truong πͺ² π§βπ» βοΈ π§ͺ |
+ Didier Durand πͺ² π§βπ» βοΈ |
+ Karthik Dani πͺ² π§βπ» |
+ Avik De πͺ² π§ͺ |
+ Amir Alasady πͺ² |
Avik De π π§ͺ |
- Takosaga π |
+ jettythek π§βπ» |
+ Takosaga πͺ² |