File size: 3,886 Bytes
750ddf0
 
 
 
 
 
 
854c1c5
ca00147
e5832e1
854c1c5
750ddf0
78c5723
0ed8739
 
 
 
 
 
 
 
854c1c5
750ddf0
ca00147
854c1c5
ca00147
 
 
72f5d21
 
854c1c5
 
 
 
 
 
 
 
 
ca00147
 
 
 
 
 
 
 
0ed8739
 
854c1c5
ca00147
854c1c5
ca00147
854c1c5
e5832e1
 
 
 
 
 
854c1c5
 
 
 
 
 
 
0d10e90
76fa02e
0d10e90
854c1c5
 
 
 
 
 
 
 
 
76fa02e
 
 
 
 
 
 
 
0ed8739
 
 
 
76fa02e
 
0d10e90
 
854c1c5
 
0d10e90
 
750ddf0
854c1c5
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</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