import gradio as gr from datetime import datetime, timedelta from fetch_paper import fetch_papers, fetch_papers_with_daterange from sorter import sort_by_upvotes def format_author(author): """格式化作者信息""" if not author: return "" hidden_status = "(隐藏)" if author.hidden else "" if author.name: return f"{author.name}{hidden_status}" return f"匿名作者{hidden_status}" def format_paper_info(article): """生成论文展示的 HTML 内容""" if not article.paper: return "论文信息缺失" info = [] # 标题部分 info.append(f"
论文 ID:{article.paper.id or '未知'}
") info.append(f"发布时间:{article.paper.publishedAt.strftime('%Y-%m-%d %H:%M') if article.paper.publishedAt else '未知'}
") # 作者信息 authors = "、".join([format_author(a) for a in article.paper.authors]) if article.paper.authors else "作者信息暂缺" info.append(f"作者:{authors}
") # 摘要 if article.paper.summary: summary = article.paper.summary.replace('{{', '{').replace('}}', '}').replace('\n', ' ') info.append(f"{summary}
") # 讨论信息 info.append(f"点赞数:{article.paper.upvotes or 0}") info.append(f"评论数:{article.numComments or 0}
") if article.paper.discussionId: info.append(f"进入讨论") # 提交者信息 if article.submittedBy: submitter = article.submittedBy info.append(f"提交者: ")
info.append(
f"{submitter.fullname}(@{submitter.name}) ")
info.append(f"粉丝数:{submitter.followerCount or 0}
标题 | 👍点赞 | 💬评论 | 📅日期 |
---|---|---|---|
{title} | {upvotes} | {comments} | {date} |
⚠️ 查询失败,请检查日期格式(YYYY-MM-DD)
", "⚠️ 查询失败,请检查日期格式(YYYY-MM-DD)
" def show_detail(paper_id, papers): """显示论文详情""" if not papers: return "请先进行查询" return build_html(papers) # CSS 样式(可放入单独文件) custom_css = """ .paper-table { width: 100%; border-collapse: collapse; } .paper-table td { padding: 12px; border-bottom: 1px solid #ddd; } .paper-table th { font-weight: bold; background: #f9f9f920; } .paper-table tr:hover { background: #f9f9f920; } .paper-title { color: #1a73e8; cursor: pointer; text-decoration: none !important; } .paper-title:hover { text-decoration: underline !important; } .paper-table td:nth-child(2), .paper-table td:nth-child(3), .paper-table td:nth-child(4) { text-align: center; } .paper-table th:nth-child(2), .paper-table th:nth-child(3), .paper-table th:nth-child(4) { text-align: center; } .detail-area { margin-top: 20px; padding: 20px; border: 1px solid #ddd; border-radius: 5px; } """ custom_js = """ function showDetail(paperId) { // 隐藏 smartflow-paper-paperId 的所有兄弟节点 var siblings = document.querySelectorAll(`div[id^='smartflow-paper-']:not(#smartflow-paper-${paperId.replace('.', '-')})`); siblings.forEach(sibling => sibling.style.display = 'none'); // 显示当前节点 var paper = document.getElementById(`smartflow-paper-${paperId.replace('.', '-')}`); if (paper) { paper.style.display = 'block'; } } """ def create_interface(): """创建新的界面布局""" with gr.Blocks(title="Hugging Face Daily Paper", css=custom_css, head=f"") as app: # 主界面 gr.Markdown("# 📚 Hugging Face Daily Paper") # 查询控制区 with gr.Row(): start_date = gr.Textbox(label="起始日期", placeholder="YYYY-MM-DD", value=datetime.now().strftime("%Y-%m-%d")) end_date = gr.Textbox(label="结束日期", placeholder="YYYY-MM-DD", value=datetime.now().strftime("%Y-%m-%d")) query_btn = gr.Button("🔍 查询", variant="primary") # 结果显示区 with gr.Column(visible=True): results_html = gr.HTML(label="查询结果") # 论文详情区 with gr.Column(visible=True, elem_classes="detail-area"): gr.Markdown("## 论文详情") detail_html = gr.HTML(elem_id="detail-html") # 事件处理 query_btn.click( fn=query_papers, inputs=[start_date, end_date], outputs=[results_html, detail_html] ) return app if __name__ == "__main__": gr.close_all() app = create_interface() app.launch( # server_name="localhost", # server_port=7860, # share=True )