From 34d32c12ed5de2c5e1a5d4ea66f8d993e05beb6b Mon Sep 17 00:00:00 2001 From: Yaosanqi137 <99163721+Yaosanqi137@users.noreply.github.com> Date: Mon, 1 Dec 2025 20:51:15 +0800 Subject: [PATCH] Update update_members.py --- scripts/update_members.py | 98 ++++++++++++++++++++++++++++----------- 1 file changed, 70 insertions(+), 28 deletions(-) diff --git a/scripts/update_members.py b/scripts/update_members.py index ae4bf4f..09d28e7 100644 --- a/scripts/update_members.py +++ b/scripts/update_members.py @@ -1,23 +1,24 @@ import os import requests import re +import math # 配置部分 -ORG_NAME = os.environ['ORG_NAME'] # 从环境变量获取组织名 +ORG_NAME = os.environ['ORG_NAME'] TOKEN = os.environ['GH_TOKEN'] -README_PATH = "/profile/README.md" # 你的 README 路径,根据实际情况调整 +README_PATH = "profile/README.md" +COLUMNS = 5 # 你想要一行显示几个成员?这里设为 5 def get_members(): url = f"https://api.github.com/orgs/{ORG_NAME}/members" headers = { - "Authorization": f"token {TOKEN}", + "Authorization": f"Bearer {TOKEN}", # Fine-grained token 使用 Bearer 也行,token 也可以 "Accept": "application/vnd.github.v3+json" } members = [] page = 1 while True: - # 获取所有分页的成员 response = requests.get(f"{url}?per_page=100&page={page}", headers=headers) if response.status_code != 200: print(f"Error fetching members: {response.text}") @@ -32,37 +33,75 @@ def get_members(): return members -def generate_html(members): - # 生成类似 contributors-readme-action 的圆形头像表格/列表 - html = '
\n' - - for member in members: - login = member['login'] - avatar = member['avatar_url'] - profile = member['html_url'] - - # 样式:圆形头像,宽度 50px,带链接 - html += f''' - - {login} - ''' - - html += '\n
' - return html +def generate_markdown_table(members): + if not members: + return "No members found." -def update_readme(html_content): + # 1. 初始化表格头 + # 表头留空即可,或者你可以写 "Avatar" 之类的,这里为了美观留空 + # 语法: | | | | | | + header = "|" + " |" * COLUMNS + "\n" + + # 2. 分割线 (居中对齐 :---:) + # 语法: | :---: | :---: | ... + separator = "|" + " :---: |" * COLUMNS + "\n" + + body = "" + + # 3. 遍历成员,按每行 COLUMNS 个进行切片 + total_members = len(members) + # 计算需要多少行 + num_rows = math.ceil(total_members / COLUMNS) + + for row_idx in range(num_rows): + row_str = "|" + + # 获取当前行的成员切片 + start = row_idx * COLUMNS + end = start + COLUMNS + row_members = members[start:end] + + for member in row_members: + login = member['login'] + avatar = member['avatar_url'] + profile = member['html_url'] + + # 核心单元格内容构造 + #
用于换行, 默认就是方形的,不加 border-radius 即可 + # width="100px" 控制大小,防止图片太大撑爆表格 + cell_content = ( + f'' + f'{login}' + f'
' + f'{login}' + ) + + row_str += f" {cell_content} |" + + # 如果最后一行不满 COLUMNS 个,需要补齐空的单元格,否则 Markdown 表格会乱 + missing_cells = COLUMNS - len(row_members) + if missing_cells > 0: + row_str += " |" * missing_cells + + row_str += "\n" + body += row_str + + return header + separator + body + +def update_readme(content): if not os.path.exists(README_PATH): print(f"README not found at {README_PATH}") return with open(README_PATH, 'r', encoding='utf-8') as f: - content = f.read() + old_content = f.read() - # 使用正则替换标记之间的内容 + # 正则替换 和 END 之间的内容 pattern = r'()(.*?)()' - replacement = f'\\1\n{html_content}\n\\3' + # 注意:Markdown 表格前后最好留空行,确保渲染正常 + replacement = f'\\1\n\n{content}\n\n\\3' - new_content = re.sub(pattern, replacement, content, flags=re.DOTALL) + new_content = re.sub(pattern, replacement, old_content, flags=re.DOTALL) with open(README_PATH, 'w', encoding='utf-8') as f: f.write(new_content) @@ -72,6 +111,9 @@ if __name__ == "__main__": members = get_members() print(f"Found {len(members)} members.") - html = generate_html(members) - update_readme(html) + # 按名字排序(可选) + members.sort(key=lambda x: x['login'].lower()) + + table_content = generate_markdown_table(members) + update_readme(table_content) print("README updated successfully.")