File size: 3,987 Bytes
750ddf0
 
 
 
 
 
 
76fa02e
ca00147
e5832e1
750ddf0
 
fee55b3
0ed8739
 
 
 
 
 
 
 
750ddf0
 
ca00147
 
 
 
 
72f5d21
 
 
ca00147
72f5d21
ca00147
72f5d21
ca00147
72f5d21
ca00147
0ed8739
 
 
 
ca00147
 
 
 
 
 
 
 
 
0ed8739
 
ca00147
 
 
 
e5832e1
f279af7
e5832e1
 
 
 
 
 
f279af7
 
 
 
0ed8739
 
e5832e1
0ed8739
0d10e90
76fa02e
0d10e90
 
0ed8739
 
76fa02e
 
 
 
 
 
 
 
0ed8739
 
 
 
76fa02e
 
0d10e90
 
 
 
 
 
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
102
103
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 Title</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, self.table_header)

    @staticmethod
    def filter_table(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

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