Skip to content

Commit af323ca

Browse files
committed
feat: finalize papers
1 parent 8589108 commit af323ca

File tree

3 files changed

+173
-98
lines changed

3 files changed

+173
-98
lines changed

public/bibliography.bib

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,45 @@ @article{minkowski-2024
136136
publisher = {ACM},
137137
address = {New York, NY, USA}
138138
}
139+
140+
@phdthesis{ni-thesis-2024,
141+
title = {Authoring Conceptual Diagrams by Codifying Visual Representations},
142+
author = {Ni, Wode},
143+
school = {Carnegie Mellon University},
144+
year = 2024,
145+
month = {October}
146+
}
147+
@inproceedings{diagrams-2024,
148+
author = {Ni, Wode and Estep, Sam and Harriman, Hwei-Shin and Minar\v{c}\'{i}k, Ji\v{r}i and Sunshine, Joshua},
149+
title = {Codifying Visual Representations},
150+
series = {DIAGRAMS'24},
151+
year = {2024},
152+
isbn = {978-3-031-71290-6},
153+
publisher = {Springer-Verlag},
154+
address = {Berlin, Heidelberg},
155+
url = {https://doi.org/10.1007/978-3-031-71291-3_37},
156+
doi = {10.1007/978-3-031-71291-3_37},
157+
booktitle = {Diagrammatic Representation and Inference: 14th International Conference, Diagrams 2024, M\"{u}nster, Germany, September 27 – October 1, 2024, Proceedings},
158+
pages = {454–457},
159+
numpages = {4},
160+
keywords = {Diagram Authoring Tools, Automatic Diagram Layout, Natural Diagramming Interface},
161+
location = {M\"{u}nster, Germany}
162+
}
163+
@inproceedings{rose-2024,
164+
author = {Estep, Sam and Ni, Wode and Rothkopf, Raven and Sunshine, Joshua},
165+
title = {{Rose: Composable Autodiff for the Interactive Web}},
166+
booktitle = {38th European Conference on Object-Oriented Programming (ECOOP 2024)},
167+
pages = {15:1--15:27},
168+
series = {ECOOP'24},
169+
isbn = {978-3-95977-341-6},
170+
issn = {1868-8969},
171+
year = {2024},
172+
volume = {313},
173+
editor = {Aldrich, Jonathan and Salvaneschi, Guido},
174+
publisher = {Schloss Dagstuhl -- Leibniz-Zentrum f{\"u}r Informatik},
175+
address = {Dagstuhl, Germany},
176+
url = {https://drops.dagstuhl.de/entities/document/10.4230/LIPIcs.ECOOP.2024.15},
177+
urn = {urn:nbn:de:0030-drops-208642},
178+
doi = {10.4230/LIPIcs.ECOOP.2024.15},
179+
annote = {Keywords: Automatic differentiation, differentiable programming, compilers, web}
180+
}

src/App.tsx

Lines changed: 92 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -99,74 +99,94 @@ export const Copy = ({
9999
);
100100
};
101101

102+
const PubMeta = ({ pdf, talk, slides, bibtex }: Paper) => (
103+
<div className="flex gap-2">
104+
{bibtex && (
105+
<div className="flex items-center gap-0.5">
106+
<BsBookmarkCheck />
107+
<Copy data={bibtex}>bib</Copy>
108+
</div>
109+
)}
110+
{pdf && (
111+
<div className="flex items-center gap-0.5">
112+
<FaRegFilePdf />
113+
<A href={pdf}>pdf</A>
114+
</div>
115+
)}
116+
{talk && (
117+
<div className="flex items-center gap-0.5">
118+
<FaRegPlayCircle />
119+
<A href={talk}>talk</A>
120+
</div>
121+
)}
122+
{slides && (
123+
<div className="flex items-center gap-0.5">
124+
<BiSlideshow />
125+
<A href={slides}>slides</A>
126+
</div>
127+
)}
128+
</div>
129+
);
130+
131+
const PubAuthors = ({
132+
pdf,
133+
title,
134+
venue,
135+
authors,
136+
talk,
137+
coauthors,
138+
authorDisplayNames,
139+
series,
140+
slides,
141+
id,
142+
bibtex,
143+
}: Paper) => (
144+
<span className="text-base font-light">
145+
{authors
146+
.map((a, i) => authorDisplayNames?.get(i) ?? a)
147+
.map((a) => (coauthors?.includes(a) ? `${a}*` : a))
148+
.map((a) =>
149+
a === "Wode Ni" || a === "Wode Ni*" ? <strong>{a}</strong> : a
150+
)
151+
.map((a, i) => (
152+
<span key={`${id}-author-${i}`}>
153+
<li className={`inline dark:font-thin`}>{a}</li>
154+
{i !== authors.length - 1 && <span>, </span>}
155+
</span>
156+
))}
157+
.{" "}
158+
</span>
159+
);
160+
161+
const PubVenue = ({ venue, series, type }: Paper) => {
162+
switch (type) {
163+
case "thesis":
164+
return (
165+
<>
166+
<span className="text-base font-light">{venue}. </span>
167+
<span className="text-base font-light italic">{series}.</span>
168+
</>
169+
);
170+
default:
171+
return <span className="text-base font-light italic">{series}.</span>;
172+
}
173+
};
174+
102175
const Publications = () => (
103176
<div>
104-
{Papers.map(
105-
({
106-
pdf,
107-
title,
108-
venue,
109-
authors,
110-
talk,
111-
coauthors,
112-
authorDisplayNames,
113-
series,
114-
slides,
115-
id,
116-
bibtex,
117-
}: Paper) => (
118-
<div key={id} className="my-4">
119-
<a href={pdf}>
120-
<span className="text-lg font-semibold dark:font-normal cursor-pointer">
121-
{title}
122-
</span>
123-
</a>
124-
<br />
125-
<span className="text-base font-light">
126-
{authors
127-
.map((a, i) => authorDisplayNames?.get(i) ?? a)
128-
.map((a) => (coauthors?.includes(a) ? `${a}*` : a))
129-
.map((a) =>
130-
a === "Wode Ni" || a === "Wode Ni*" ? <strong>{a}</strong> : a
131-
)
132-
.map((a, i) => (
133-
<span key={`${id}-author-${i}`}>
134-
<li className={`inline dark:font-thin`}>{a}</li>
135-
{i !== authors.length - 1 && <span>, </span>}
136-
</span>
137-
))}
177+
{Papers.map((p: Paper) => (
178+
<div key={p.id} className="my-4">
179+
<a href={p.pdf}>
180+
<span className="text-lg font-semibold dark:font-normal cursor-pointer">
181+
{p.title}
138182
</span>
139-
. <span className="text-base font-light italic">{series}</span>
140-
{"."}
141-
<div className="flex gap-2">
142-
{bibtex && (
143-
<div className="flex items-center gap-0.5">
144-
<BsBookmarkCheck />
145-
<Copy data={bibtex}>bib</Copy>
146-
</div>
147-
)}
148-
{pdf && (
149-
<div className="flex items-center gap-0.5">
150-
<FaRegFilePdf />
151-
<A href={pdf}>pdf</A>
152-
</div>
153-
)}
154-
{talk && (
155-
<div className="flex items-center gap-0.5">
156-
<FaRegPlayCircle />
157-
<A href={talk}>talk</A>
158-
</div>
159-
)}
160-
{slides && (
161-
<div className="flex items-center gap-0.5">
162-
<BiSlideshow />
163-
<A href={slides}>slides</A>
164-
</div>
165-
)}
166-
</div>
167-
</div>
168-
)
169-
)}
183+
</a>
184+
<br />
185+
<PubAuthors {...p} />
186+
<PubVenue {...p} />
187+
<PubMeta {...p} />
188+
</div>
189+
))}
170190
</div>
171191
);
172192

@@ -380,8 +400,9 @@ const App: React.FC = () => {
380400
<div className="max-w-screen-md md:col-span-2">
381401
<Section header={"Research"}>
382402
<Text className="">
383-
I am a Ph.D. candidate at Carnegie Mellon University, School of
384-
Computer Science, advised by{" "}
403+
I recently received my{" "}
404+
<A href={"/assets/nimo-dissertation.pdf"}>Ph.D.</A> from Carnegie
405+
Mellon University, School of Computer Science, advised by{" "}
385406
<A href="http://pact.cs.cmu.edu/koedinger.html">Ken Koedinger</A>{" "}
386407
and <A href="https://www.cs.cmu.edu/~jssunshi/">Josh Sunshine</A>.
387408
Here are some selected papers. Refer to the{" "}
@@ -424,6 +445,10 @@ const App: React.FC = () => {
424445
I am an avid pool player. I play in local leagues and national
425446
tournaments.
426447
</Text>
448+
<Text>
449+
Right now I'm working on interactive diagramming at{" "}
450+
<A href="https://brilliant.org/drnimo">Brilliant</A>.
451+
</Text>
427452
</Section>
428453
</div>
429454
<div className="md:ml-10 md:max-w-60">

src/Papers.ts

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99

1010
const bibliography = parseBibFile(bib);
1111

12-
type PaperType = "conference" | "journal" | "workshop" | "preprint";
12+
type PaperType = "conference" | "journal" | "workshop" | "preprint" | "thesis";
1313
interface PaperMeta {
1414
type: PaperType;
1515
icon?: string;
@@ -29,23 +29,40 @@ export interface Paper extends PaperMeta {
2929
authors: string[];
3030
venue: string;
3131
id: string;
32-
series: string;
32+
series?: string;
3333
}
3434

3535
const entries: Papers = {
36+
"ni-thesis-2024": {
37+
type: "thesis",
38+
pdf: new URL("/assets/nimo-dissertation.pdf", import.meta.url).href,
39+
talk: "https://youtu.be/gVZJc7_0T14?si=tyN741CBUqDtCa3r",
40+
},
3641
"edgeworth-2024": {
3742
type: "conference",
3843
pdf: new URL("/assets/las-24-edgeworth.pdf", import.meta.url).href,
3944
slides: new URL("/assets/las-24-edgeworth-talk.key", import.meta.url).href,
4045
},
46+
"diagrams-2024": {
47+
type: "conference",
48+
pdf: new URL("/assets/diagrams-24-penrose.pdf", import.meta.url).href,
49+
coauthors: ["Wode Ni", "Sam Estep", "Hwei-Shin Harriman"],
50+
authorDisplayNames: new Map([[3, "Jiří Minarčík"]]),
51+
},
52+
"rose-2024": {
53+
type: "conference",
54+
pdf: "https://drops.dagstuhl.de/storage/00lipics/lipics-vol313-ecoop2024/LIPIcs.ECOOP.2024.15/LIPIcs.ECOOP.2024.15.pdf",
55+
},
4156
"minkowski-2024": {
4257
type: "conference",
4358
pdf: new URL("/assets/siggraph-24-minkowski.pdf", import.meta.url).href,
59+
talk: "https://youtu.be/kNp-eY-kKq0?si=HvHFsq1RaUUQNPpg",
4460
authorDisplayNames: new Map([[0, "Jiří Minarčík"]]),
4561
},
4662
"stsearch-2024": {
4763
type: "conference",
4864
pdf: "https://dl.acm.org/doi/pdf/10.1145/3656460",
65+
talk: "https://youtu.be/M_wXlm_xmlc?si=vufu-clOuuSmO6SC",
4966
},
5067
"recode-ni-2021": {
5168
type: "conference",
@@ -95,6 +112,23 @@ const getVenue = (type: PaperType, entry: BibEntry): string => {
95112
return normalizeFieldValue(entry.getField("journal")!) as string;
96113
case "preprint":
97114
throw new Error("cannot get venue for preprint");
115+
case "thesis":
116+
return "Ph.D. Dissertation";
117+
}
118+
};
119+
120+
const getSeries = (type: PaperType, entry: BibEntry): string => {
121+
switch (type) {
122+
case "workshop":
123+
case "conference":
124+
case "journal":
125+
case "preprint":
126+
return (normalizeFieldValue(entry.getField("series")) as string).replace(
127+
/\s/g,
128+
""
129+
);
130+
case "thesis":
131+
return normalizeFieldValue(entry.getField("school")) as string;
98132
}
99133
};
100134

@@ -109,7 +143,7 @@ ${Object.entries(entry.fields)
109143
const parseEntry = (id: string, entry: BibEntry, meta: PaperMeta): Paper => {
110144
const author: any = entry.getField("author");
111145
const title: any = entry.getField("title");
112-
const series: any = entry.getField("series");
146+
const series: any = getSeries(meta.type, entry);
113147
if (author && title && series) {
114148
return {
115149
title: normalizeFieldValue(title) as string,
@@ -120,7 +154,7 @@ const parseEntry = (id: string, entry: BibEntry, meta: PaperMeta): Paper => {
120154
.concat(author.jrs)
121155
.join(" ")
122156
),
123-
series: (normalizeFieldValue(series) as string).replace(/\s/g, ""),
157+
series: series,
124158
venue: getVenue(meta.type, entry),
125159
id,
126160
bibtex: unparseEntry(entry),
@@ -141,32 +175,6 @@ const parseBib = (bib: BibFilePresenter): Paper[] =>
141175
}
142176
});
143177

144-
const preprints: Paper[] = [
145-
{
146-
title: "Codifying Visual Representations",
147-
authors: [
148-
"Wode Ni",
149-
"Sam Estep",
150-
"Hwei-Shin Harriman",
151-
"Jiří Minarčík",
152-
"Joshua Sunshine",
153-
],
154-
venue: "DIAGRAMS 2024",
155-
id: "diagrams-24",
156-
series: "DIAGRAMS'24",
157-
type: "preprint",
158-
pdf: new URL("/assets/diagrams-24-penrose.pdf", import.meta.url).href,
159-
coauthors: ["Wode Ni", "Sam Estep", "Hwei-Shin Harriman"],
160-
},
161-
{
162-
id: "rose-24",
163-
title: "Rose: Efficient and Extensible Autodiff on the Web",
164-
authors: ["Sam Estep", "Wode Ni", "Raven Rothkopf", "Joshua Sunshine"],
165-
venue: "ECOOP 2024",
166-
series: "ECOOP'24",
167-
type: "preprint",
168-
pdf: "https://arxiv.org/pdf/2402.17743.pdf",
169-
},
170-
];
178+
const preprints: Paper[] = [];
171179

172180
export default [...preprints, ...parseBib(bibliography)];

0 commit comments

Comments
 (0)