File size: 3,947 Bytes
750ddf0
 
 
 
 
 
 
76fa02e
ca00147
e5832e1
750ddf0
 
 
0ed8739
 
 
 
 
 
 
 
750ddf0
 
ca00147
 
 
 
 
72f5d21
 
 
ca00147
72f5d21
ca00147
72f5d21
ca00147
72f5d21
ca00147
0ed8739
 
 
 
ca00147
 
 
 
 
 
 
 
 
0ed8739
 
ca00147
 
 
 
e5832e1
f279af7
e5832e1
 
 
 
 
 
f279af7
 
 
 
0ed8739
 
e5832e1
0ed8739
3b22c2d
76fa02e
 
0ed8739
 
76fa02e
 
 
 
 
 
 
 
0ed8739
 
 
 
76fa02e
 
750ddf0
ca00147
750ddf0
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from __future__ import annotations

import pandas as pd


class PaperList:
    def __init__(self):
        self.table = pd.read_csv('papers.csv')
        self._preprcess_table()

        self.table_header = '''
            <tr>
                <td width="50%">Paper</td>
                <td width="22%">Authors</td>
                <td width="4%">pdf</td>
                <td width="4%">Supp</td>
                <td width="4%">arXiv</td>
                <td width="4%">GitHub</td>
                <td width="4%">HF Spaces</td>
                <td width="4%">HF Models</td>
                <td width="4%">HF Datasets</td>
            </tr>'''

    def _preprcess_table(self) -> None:
        self.table['title_lowercase'] = self.table.title.str.lower()

        rows = []
        for row in self.table.itertuples():
            paper = f'<a href="{row.url}" target="_blank">{row.title}</a>'
            pdf = f'<a href="{row.pdf}" target="_blank">pdf</a>'
            supp = f'<a href="{row.supp}" target="_blank">supp</a>' if isinstance(
                row.supp, str) else ''
            arxiv = f'<a href="{row.arxiv}" target="_blank">arXiv</a>' if isinstance(
                row.arxiv, str) else ''
            github = f'<a href="{row.github}" target="_blank">GitHub</a>' if isinstance(
                row.github, str) else ''
            hf_space = f'<a href="{row.hf_space}" target="_blank">Space</a>' if isinstance(
                row.hf_space, str) else ''
            hf_model = f'<a href="{row.hf_model}" target="_blank">Model</a>' if isinstance(
                row.hf_model, str) else ''
            hf_dataset = f'<a href="{row.hf_dataset}" target="_blank">Dataset</a>' if isinstance(
                row.hf_dataset, str) else ''
            row = f'''
                <tr>
                    <td>{paper}</td>
                    <td>{row.authors}</td>
                    <td>{pdf}</td>
                    <td>{supp}</td>
                    <td>{arxiv}</td>
                    <td>{github}</td>
                    <td>{hf_space}</td>
                    <td>{hf_model}</td>
                    <td>{hf_dataset}</td>
                </tr>'''
            rows.append(row)
        self.table['html_table_content'] = rows

    def render(self, search_query: str, case_sensitive: bool,
               filter_names: list[str]) -> tuple[int, str]:
        df = self.table
        if search_query:
            if case_sensitive:
                df = df[df.title.str.contains(search_query)]
            else:
                df = df[df.title_lowercase.str.contains(search_query.lower())]
        has_supp = 'Supp' in filter_names
        has_arxiv = 'arXiv' in filter_names
        has_github = 'GitHub' in filter_names
        has_hf_space = 'HF Space' in filter_names
        has_hf_model = 'HF Model' in filter_names
        has_hf_dataset = 'HF Dataset' in filter_names
        df = self.filter_table(df, has_supp, has_arxiv, has_github,
                               has_hf_space, has_hf_model, has_hf_dataset)
        return len(df), self.to_html(df)

    def filter_table(self, df: pd.DataFrame, has_supp: bool, has_arxiv: bool,
                     has_github: bool, has_hf_space: bool, has_hf_model: bool,
                     has_hf_dataset: bool) -> pd.DataFrame:
        if has_supp:
            df = df[~df.supp.isna()]
        if has_arxiv:
            df = df[~df.arxiv.isna()]
        if has_github:
            df = df[~df.github.isna()]
        if has_hf_space:
            df = df[~df.hf_space.isna()]
        if has_hf_model:
            df = df[~df.hf_model.isna()]
        if has_hf_dataset:
            df = df[~df.hf_dataset.isna()]
        return df

    def to_html(self, df: pd.DataFrame) -> str:
        table_rows = df.html_table_content
        table_data = ''.join(table_rows)
        html = f'''<table>
            {self.table_header}
            {table_data}
        </table>'''
        return html