akhaliq HF staff commited on
Commit
e67fd82
·
verified ·
1 Parent(s): a474d56

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +56 -29
app.py CHANGED
@@ -17,7 +17,7 @@ class PaperManager:
17
  response.raise_for_status()
18
  data = response.json()
19
 
20
- # Sort papers primarily by 'publishedAt' descending, then by 'upvotes' descending
21
  self.papers = sorted(
22
  data,
23
  key=lambda x: (
@@ -26,10 +26,10 @@ class PaperManager:
26
  ),
27
  x.get('paper', {}).get('upvotes', 0)
28
  ),
29
- reverse=True # Ensures descending order
30
  )
31
 
32
- self.total_pages = (len(self.papers) + self.papers_per_page - 1) // self.papers_per_page
33
  self.current_page = 1
34
  return True
35
  except requests.RequestException as e:
@@ -43,21 +43,21 @@ class PaperManager:
43
  title = paper.get('title', 'No title')
44
  paper_id = paper.get('paper', {}).get('id', '')
45
  url = f"https://huggingface.co/papers/{paper_id}"
46
- authors = ', '.join([author.get('name', '') for author in paper.get('paper', {}).get('authors', [])])
47
  upvotes = paper.get('paper', {}).get('upvotes', 0)
48
  comments = paper.get('numComments', 0)
49
  published_time = datetime.fromisoformat(
50
  paper.get('publishedAt', datetime.now(timezone.utc).isoformat()).replace('Z', '+00:00')
51
  )
52
- time_ago_days = (datetime.now(timezone.utc) - published_time).days
 
53
  time_ago = f"{time_ago_days} days ago" if time_ago_days > 0 else "today"
54
 
55
- # Return HTML similar to Hacker News
56
  return f"""
57
  <tr class="athing">
58
  <td align="right" valign="top" class="title"><span class="rank">{rank}.</span></td>
59
  <td valign="top" class="votelinks">
60
- <center><a href="#"><div class="votearrow"></div></a></center>
61
  </td>
62
  <td class="title">
63
  <a href="{url}" class="storylink" target="_blank">{title}</a>
@@ -90,9 +90,12 @@ class PaperManager:
90
  def next_page(self):
91
  if self.current_page < self.total_pages:
92
  self.current_page += 1
93
- return self.render_papers()
94
- else:
95
- return self.render_papers() + "<center class='more'><span>No more papers.</span></center>"
 
 
 
96
 
97
  paper_manager = PaperManager()
98
 
@@ -102,6 +105,12 @@ def initialize_app():
102
  else:
103
  return "<div class='no-papers'>Failed to fetch papers. Please try again later.</div>"
104
 
 
 
 
 
 
 
105
  css = """
106
  body {
107
  background-color: white;
@@ -177,8 +186,14 @@ table {
177
  text-decoration: none;
178
  }
179
 
180
- .more {
181
- padding: 10px;
 
 
 
 
 
 
182
  }
183
 
184
  .no-papers {
@@ -207,7 +222,7 @@ demo = gr.Blocks(css=css)
207
 
208
  with demo:
209
  with gr.Column(elem_classes=["container"]):
210
- # Header
211
  gr.HTML("""
212
  <table border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ff6600">
213
  <tr>
@@ -216,28 +231,40 @@ with demo:
216
  <b class="hnname"><a href="#" style="color: black; text-decoration: none;">Daily Papers</a></b>
217
  </span>
218
  </td>
 
 
 
219
  </tr>
220
  </table>
221
  """)
222
  # Paper list
223
  paper_list = gr.HTML()
224
- # Footer with 'More' link and embedded JavaScript
225
- more_button = gr.HTML("""
226
- <center class='more'>
227
- <a href="#" id="more-button">More</a>
228
- </center>
229
- <script>
230
- document.getElementById('more-button').addEventListener('click', function(e) {
231
- e.preventDefault();
232
- document.getElementById('hidden-next-button').click();
233
- });
234
- </script>
235
- """)
236
-
237
  demo.load(initialize_app, outputs=[paper_list])
238
 
239
- # Hidden button to trigger next page
240
- hidden_next_button = gr.Button(visible=False, elem_id='hidden-next-button')
241
- hidden_next_button.click(paper_manager.next_page, outputs=[paper_list])
 
 
 
 
 
 
 
 
 
 
 
 
 
242
 
243
  demo.launch()
 
17
  response.raise_for_status()
18
  data = response.json()
19
 
20
+ # Sort papers by 'publishedAt' descending, then by 'upvotes' descending
21
  self.papers = sorted(
22
  data,
23
  key=lambda x: (
 
26
  ),
27
  x.get('paper', {}).get('upvotes', 0)
28
  ),
29
+ reverse=True
30
  )
31
 
32
+ self.total_pages = max((len(self.papers) + self.papers_per_page - 1) // self.papers_per_page, 1)
33
  self.current_page = 1
34
  return True
35
  except requests.RequestException as e:
 
43
  title = paper.get('title', 'No title')
44
  paper_id = paper.get('paper', {}).get('id', '')
45
  url = f"https://huggingface.co/papers/{paper_id}"
46
+ authors = ', '.join([author.get('name', '') for author in paper.get('paper', {}).get('authors', [])]) or 'Unknown'
47
  upvotes = paper.get('paper', {}).get('upvotes', 0)
48
  comments = paper.get('numComments', 0)
49
  published_time = datetime.fromisoformat(
50
  paper.get('publishedAt', datetime.now(timezone.utc).isoformat()).replace('Z', '+00:00')
51
  )
52
+ time_diff = datetime.now(timezone.utc) - published_time
53
+ time_ago_days = time_diff.days
54
  time_ago = f"{time_ago_days} days ago" if time_ago_days > 0 else "today"
55
 
 
56
  return f"""
57
  <tr class="athing">
58
  <td align="right" valign="top" class="title"><span class="rank">{rank}.</span></td>
59
  <td valign="top" class="votelinks">
60
+ <center><div class="votearrow"></div></center>
61
  </td>
62
  <td class="title">
63
  <a href="{url}" class="storylink" target="_blank">{title}</a>
 
90
  def next_page(self):
91
  if self.current_page < self.total_pages:
92
  self.current_page += 1
93
+ return self.render_papers()
94
+
95
+ def prev_page(self):
96
+ if self.current_page > 1:
97
+ self.current_page -= 1
98
+ return self.render_papers()
99
 
100
  paper_manager = PaperManager()
101
 
 
105
  else:
106
  return "<div class='no-papers'>Failed to fetch papers. Please try again later.</div>"
107
 
108
+ def refresh_papers():
109
+ if paper_manager.fetch_papers():
110
+ return paper_manager.render_papers()
111
+ else:
112
+ return "<div class='no-papers'>Failed to refresh papers. Please try again later.</div>"
113
+
114
  css = """
115
  body {
116
  background-color: white;
 
186
  text-decoration: none;
187
  }
188
 
189
+ .more-link button {
190
+ background: none;
191
+ border: none;
192
+ color: #0000ff;
193
+ text-decoration: underline;
194
+ cursor: pointer;
195
+ font-size: 10pt;
196
+ padding: 0;
197
  }
198
 
199
  .no-papers {
 
222
 
223
  with demo:
224
  with gr.Column(elem_classes=["container"]):
225
+ # Header with Refresh Button
226
  gr.HTML("""
227
  <table border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ff6600">
228
  <tr>
 
231
  <b class="hnname"><a href="#" style="color: black; text-decoration: none;">Daily Papers</a></b>
232
  </span>
233
  </td>
234
+ <td align="right" style="padding: 8px;">
235
+ <button id="refresh-button">Refresh</button>
236
+ </td>
237
  </tr>
238
  </table>
239
  """)
240
  # Paper list
241
  paper_list = gr.HTML()
242
+ # Navigation Buttons
243
+ with gr.Row():
244
+ prev_button = gr.Button("Prev")
245
+ next_button = gr.Button("Next")
246
+ # "More" Button Styled as Link
247
+ with gr.Row():
248
+ more_button = gr.Button("More", elem_classes="more-link")
249
+
250
+ # Load papers on app start
 
 
 
 
251
  demo.load(initialize_app, outputs=[paper_list])
252
 
253
+ # Button clicks
254
+ prev_button.click(paper_manager.prev_page, outputs=[paper_list])
255
+ next_button.click(paper_manager.next_page, outputs=[paper_list])
256
+ more_button.click(paper_manager.next_page, outputs=[paper_list])
257
+ # Bind the refresh button
258
+ refresh_button = gr.Button(visible=False, elem_id="refresh-hidden")
259
+ refresh_button.click(refresh_papers, outputs=[paper_list])
260
+
261
+ # JavaScript to bind the click event to the refresh button
262
+ demo.load(None, _js="""
263
+ function() {
264
+ document.getElementById('refresh-button').addEventListener('click', function() {
265
+ document.querySelector('button#refresh-hidden').click();
266
+ });
267
+ }
268
+ """)
269
 
270
  demo.launch()