diff --git a/README.md b/README.md index 560a11a..e9e2dd4 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,32 @@ journals: **Important**: Hugo reserves the front matter field `url` as a page URL override. `generate_content.py` maps `venues.yaml:url` → front matter field `homepage` to avoid this conflict. +### Journal Special Issues + +Journals with `submission_model: rolling` have no fixed deadlines, so WikiCFP yields nothing for them. Special issue CFPs are the only dated journal deadlines worth tracking. Add a `special_issues` list to the journal entry: + +```yaml +journals: + - acronym: TPDS + # ... existing fields ... + special_issues: + - title: "Edge AI Systems: Design and Optimization" + guest_editors: ["Wei Zhang", "Yong Cui", "Jian Wang"] + cfp_url: "https://..." + abstract_deadline: "Aug 15, 2026" + submission_deadline: "Sep 1, 2026" + notification: "Jan 2027" +``` + +Special issue deadlines appear in three places: +- **Journal page** — a "Special Issues" table below the journal metadata +- **Calendar page** — a "Journal Special Issues" table below the conference deadlines +- **FullCalendar grid** — events colored purple (`#7b2cbf`), titled `ACR SI — Title — deadline type`, carrying `cfp_url` in `extendedProps` + +Dates use the same `MMM D, YYYY` format as conference deadlines. `notification` additionally accepts month-only precision (`Jan 2027`), which lands on the first of that month in the calendar grid; the tables always print the raw string. + +These entries are `source: manual` by nature — WikiCFP doesn't cover journal special issues. Add them directly to `site/data//venues.yaml`. + --- ## `topics.yaml` Schema diff --git a/site/content/cloud-edge/calendar/_index.md b/site/content/cloud-edge/calendar/_index.md index f7159b5..090a380 100644 --- a/site/content/cloud-edge/calendar/_index.md +++ b/site/content/cloud-edge/calendar/_index.md @@ -1,7 +1,7 @@ --- title: Submission Deadlines layout: calendar -generated: '2026-08-17T16:18:08Z' +generated: '2026-08-17T17:07:26Z' draft: false events: - title: OSDI — abstract deadline @@ -386,23 +386,74 @@ events: end: '2026-05-22' extendedProps: location: Sydney, Australia +- title: 'TPDS SI — Edge AI Systems: Design and Optimization — abstract deadline' + start: '2026-08-15' + url: /cloud-edge/venues/journals/tpds/ + color: '#7b2cbf' + allDay: true + extendedProps: + cfp_url: https://www.computer.org/csdl/journal/td/call-for-papers +- title: 'TPDS SI — Edge AI Systems: Design and Optimization — paper deadline' + start: '2026-09-01' + url: /cloud-edge/venues/journals/tpds/ + color: '#7b2cbf' + allDay: true + extendedProps: + cfp_url: https://www.computer.org/csdl/journal/td/call-for-papers +- title: 'TPDS SI — Edge AI Systems: Design and Optimization — notification' + start: '2027-01-01' + url: /cloud-edge/venues/journals/tpds/ + color: '#7b2cbf' + allDay: true + extendedProps: + cfp_url: https://www.computer.org/csdl/journal/td/call-for-papers +- title: FGCS SI — Serverless Computing at the Edge — abstract deadline + start: '2026-07-31' + url: /cloud-edge/venues/journals/fgcs/ + color: '#7b2cbf' + allDay: true + extendedProps: + cfp_url: https://www.sciencedirect.com/journal/future-generation-computer-systems/call-for-papers +- title: FGCS SI — Serverless Computing at the Edge — paper deadline + start: '2026-09-15' + url: /cloud-edge/venues/journals/fgcs/ + color: '#7b2cbf' + allDay: true + extendedProps: + cfp_url: https://www.sciencedirect.com/journal/future-generation-computer-systems/call-for-papers +- title: FGCS SI — Serverless Computing at the Edge — notification + start: '2027-02-01' + url: /cloud-edge/venues/journals/fgcs/ + color: '#7b2cbf' + allDay: true + extendedProps: + cfp_url: https://www.sciencedirect.com/journal/future-generation-computer-systems/call-for-papers --- -| Conference | Abstract | Paper deadline | Notification | Event dates | Location | ICORE | -|---|---|---|---|---|---|---| -| [IPDPS](/cloud-edge/venues/conferences/ipdps/) | Oct 2, 2025 | Oct 9, 2025 | Feb 2, 2026 | May 25, 2026 - May 29, 2026 | New Orleans, USA | A | -| [MobiSys](/cloud-edge/venues/conferences/mobisys/) | Nov 28, 2025 | Dec 5, 2025 | Mar 2, 2026 | Jun 22-24, 2026 | | A | -| [OSDI](/cloud-edge/venues/conferences/osdi/) | Dec 4, 2025 | Dec 11, 2025 | | Jul 13-15, 2026 | Seattle, WA, USA | A* | -| [CCGrid](/cloud-edge/venues/conferences/ccgrid/) | | Dec 21, 2025 | Feb 10, 2026 | May 18-21, 2026 | Sydney, Australia | B | -| [HPDC](/cloud-edge/venues/conferences/hpdc/) | Jan 29, 2026 | Feb 5, 2026 | Mar 31, 2026 | Jul 13, 2026 - Jul 16, 2026 | Cleveland, OH, USA | A | -| [SOSP](/cloud-edge/venues/conferences/sosp/) | Mar 26, 2026 | Apr 1, 2026 | Jul 3, 2026 | Sep 29, 2026 - Oct 2, 2026 | Prague, Czechia | A* | -| [SC](/cloud-edge/venues/conferences/sc/) | Apr 1, 2026 | Apr 8, 2026 | Jul 1, 2026 | Nov 17-19, 2026 | Chicago, IL, USA | A | -| [SEC](/cloud-edge/venues/conferences/sec/) | Apr 24, 2026 | May 1, 2026 | Jul 29, 2026 | Oct 13-16, 2026 | | unranked | -| [EuroSys](/cloud-edge/venues/conferences/eurosys/) | May 7, 2026 | May 14, 2026 | Aug 21, 2026 | Apr 19-24, 2027 | Rabat, Morocco | A | -| [Middleware](/cloud-edge/venues/conferences/middleware/) | May 29, 2026 | Jun 5, 2026 | Aug 28, 2026 | Dec 14-18, 2026 | Tarragona, Spain | A | -| [ATC](/cloud-edge/venues/conferences/atc/) | | Jun 10, 2026 | Sep 18, 2026 | Nov 16-18, 2026 | Hong Kong | C | -| [SoCC](/cloud-edge/venues/conferences/socc/) | Jul 7, 2026 | Jul 14, 2026 | Sep 26, 2026 | Nov 18-20, 2026 | Singapore | — | -| [NSDI](/cloud-edge/venues/conferences/nsdi/) | Sep 10, 2026 | Sep 17, 2026 | Dec 8, 2026 | May 11-13, 2027 | Providence, RI, USA | National: USA | +## Conference Deadlines -> Deadlines sourced from conference websites and [WikiCFP](http://www.wikicfp.com/). +| Venue | Name | Abstract | Paper deadline | Notification | Event dates | Location | ICORE | +|---|---|---|---|---|---|---|---| +| [IPDPS](/cloud-edge/venues/conferences/ipdps/) | IEEE International Parallel and Distributed Processing Symposium | Oct 2, 2025 | Oct 9, 2025 | Feb 2, 2026 | May 25, 2026 - May 29, 2026 | New Orleans, USA | A | +| [MobiSys](/cloud-edge/venues/conferences/mobisys/) | ACM International Conference on Mobile Systems, Applications, and Services | Nov 28, 2025 | Dec 5, 2025 | Mar 2, 2026 | Jun 22-24, 2026 | | A | +| [OSDI](/cloud-edge/venues/conferences/osdi/) | USENIX Symposium on Operating Systems Design and Implementation | Dec 4, 2025 | Dec 11, 2025 | | Jul 13-15, 2026 | Seattle, WA, USA | A* | +| [CCGrid](/cloud-edge/venues/conferences/ccgrid/) | IEEE/ACM International Symposium on Cluster, Cloud and Internet Computing | | Dec 21, 2025 | Feb 10, 2026 | May 18-21, 2026 | Sydney, Australia | B | +| [HPDC](/cloud-edge/venues/conferences/hpdc/) | IEEE International Symposium on High Performance Distributed Computing | Jan 29, 2026 | Feb 5, 2026 | Mar 31, 2026 | Jul 13, 2026 - Jul 16, 2026 | Cleveland, OH, USA | A | +| [SOSP](/cloud-edge/venues/conferences/sosp/) | ACM Symposium on Operating Systems Principles | Mar 26, 2026 | Apr 1, 2026 | Jul 3, 2026 | Sep 29, 2026 - Oct 2, 2026 | Prague, Czechia | A* | +| [SC](/cloud-edge/venues/conferences/sc/) | International Conference for High Performance Computing, Networking, Storage and Analysis | Apr 1, 2026 | Apr 8, 2026 | Jul 1, 2026 | Nov 17-19, 2026 | Chicago, IL, USA | A | +| [SEC](/cloud-edge/venues/conferences/sec/) | IEEE/ACM Symposium on Edge Computing | Apr 24, 2026 | May 1, 2026 | Jul 29, 2026 | Oct 13-16, 2026 | | unranked | +| [EuroSys](/cloud-edge/venues/conferences/eurosys/) | European Conference on Computer Systems | May 7, 2026 | May 14, 2026 | Aug 21, 2026 | Apr 19-24, 2027 | Rabat, Morocco | A | +| [Middleware](/cloud-edge/venues/conferences/middleware/) | ACM/IFIP/USENIX Middleware Conference | May 29, 2026 | Jun 5, 2026 | Aug 28, 2026 | Dec 14-18, 2026 | Tarragona, Spain | A | +| [ATC](/cloud-edge/venues/conferences/atc/) | ACM SIGOPS Annual Technical Conference | | Jun 10, 2026 | Sep 18, 2026 | Nov 16-18, 2026 | Hong Kong | C | +| [SoCC](/cloud-edge/venues/conferences/socc/) | ACM Symposium on Cloud Computing | Jul 7, 2026 | Jul 14, 2026 | Sep 26, 2026 | Nov 18-20, 2026 | Singapore | — | +| [NSDI](/cloud-edge/venues/conferences/nsdi/) | USENIX Symposium on Networked Systems Design and Implementation | Sep 10, 2026 | Sep 17, 2026 | Dec 8, 2026 | May 11-13, 2027 | Providence, RI, USA | National: USA | + +## Journal Special Issues + +| Venue | Title | Abstract | Paper deadline | Notification | Guest Editors | +|---|---|---|---|---|---| +| [TPDS](/cloud-edge/venues/journals/tpds/) | [Edge AI Systems: Design and Optimization](https://www.computer.org/csdl/journal/td/call-for-papers) | Aug 15, 2026 | Sep 1, 2026 | Jan 2027 | Wei Zhang, Yong Cui, Jian Wang | +| [FGCS](/cloud-edge/venues/journals/fgcs/) | [Serverless Computing at the Edge](https://www.sciencedirect.com/journal/future-generation-computer-systems/call-for-papers) | Jul 31, 2026 | Sep 15, 2026 | Feb 2027 | Marco Serafini, Dimitrios Skarlatos | + +> Deadlines sourced from conference websites, [WikiCFP](http://www.wikicfp.com/), and journal special issue CFPs. diff --git a/site/content/cloud-edge/digests/_index.md b/site/content/cloud-edge/digests/_index.md index 3342d61..826cce0 100644 --- a/site/content/cloud-edge/digests/_index.md +++ b/site/content/cloud-edge/digests/_index.md @@ -3,3 +3,5 @@ title: Digests layout: digests draft: false --- + +tl;drs for the top papers. diff --git a/site/content/cloud-edge/venues/journals/FGCS/_index.md b/site/content/cloud-edge/venues/journals/FGCS/_index.md index a7f9fca..f1897e5 100644 --- a/site/content/cloud-edge/venues/journals/FGCS/_index.md +++ b/site/content/cloud-edge/venues/journals/FGCS/_index.md @@ -29,6 +29,13 @@ homepage: https://www.sciencedirect.com/journal/future-generation-computer-syste | **Website** | [https://www.sciencedirect.com/journal/future-generation-computer-systems](https://www.sciencedirect.com/journal/future-generation-computer-systems) | | **Latest digest** | [FGCS 2025](/cloud-edge/digests/fgcs-2025/) — 12 papers | +## Special Issues + +| Title | Abstract | Paper deadline | Notification | Guest Editors | +|---|---|---|---|---| +| [Serverless Computing at the Edge](https://www.sciencedirect.com/journal/future-generation-computer-systems/call-for-papers) | Jul 31, 2026 | Sep 15, 2026 | Feb 2027 | Marco Serafini, Dimitrios Skarlatos | + + ## Previous Editions ### FGCS 2025 diff --git a/site/content/cloud-edge/venues/journals/TPDS/_index.md b/site/content/cloud-edge/venues/journals/TPDS/_index.md index 78232f4..c6b3a2d 100644 --- a/site/content/cloud-edge/venues/journals/TPDS/_index.md +++ b/site/content/cloud-edge/venues/journals/TPDS/_index.md @@ -29,6 +29,13 @@ homepage: https://www.computer.org/csdl/journal/td | **Website** | [https://www.computer.org/csdl/journal/td](https://www.computer.org/csdl/journal/td) | | **Latest digest** | [TPDS 2025](/cloud-edge/digests/tpds-2025/) — 12 papers | +## Special Issues + +| Title | Abstract | Paper deadline | Notification | Guest Editors | +|---|---|---|---|---| +| [Edge AI Systems: Design and Optimization](https://www.computer.org/csdl/journal/td/call-for-papers) | Aug 15, 2026 | Sep 1, 2026 | Jan 2027 | Wei Zhang, Yong Cui, Jian Wang | + + ## Previous Editions ### TPDS 2025 diff --git a/site/data/cloud-edge/venues.yaml b/site/data/cloud-edge/venues.yaml index 139ed2c..3d1210c 100644 --- a/site/data/cloud-edge/venues.yaml +++ b/site/data/cloud-edge/venues.yaml @@ -106,6 +106,13 @@ journals: scimago_quartile: Q1 scimago_sjr: "1.560" scimago_h_index: "131" + special_issues: + - title: "Edge AI Systems: Design and Optimization" + guest_editors: ["Wei Zhang", "Yong Cui", "Jian Wang"] + cfp_url: "https://www.computer.org/csdl/journal/td/call-for-papers" + abstract_deadline: "Aug 15, 2026" + submission_deadline: "Sep 1, 2026" + notification: "Jan 2027" - acronym: TOCS full_name: "ACM Transactions on Computer Systems" @@ -150,6 +157,13 @@ journals: scimago_quartile: Q1 scimago_sjr: "1.520" scimago_h_index: "130" + special_issues: + - title: "Serverless Computing at the Edge" + guest_editors: ["Marco Serafini", "Dimitrios Skarlatos"] + cfp_url: "https://www.sciencedirect.com/journal/future-generation-computer-systems/call-for-papers" + abstract_deadline: "Jul 31, 2026" + submission_deadline: "Sep 15, 2026" + notification: "Feb 2027" - acronym: JPDC full_name: "Journal of Parallel and Distributed Computing" diff --git a/src/publish_assistant/generate_content.py b/src/publish_assistant/generate_content.py index 8fe530d..ac148a7 100644 --- a/src/publish_assistant/generate_content.py +++ b/src/publish_assistant/generate_content.py @@ -222,7 +222,8 @@ def _conf_body(fm: dict, digests: list[dict] | None = None, base_path: str = "") return "\n".join(lines) + "\n" -def _journal_body(fm: dict, digests: list[dict] | None = None, base_path: str = "") -> str: +def _journal_body(fm: dict, digests: list[dict] | None = None, base_path: str = "", + special_issues: list[dict] | None = None) -> str: q = fm.get("scimago_quartile") or "—" sjr = fm.get("scimago_sjr") or "—" h = fm.get("scimago_h_index") or "—" @@ -253,6 +254,25 @@ def _journal_body(fm: dict, digests: list[dict] | None = None, base_path: str = suffix = f"— {count} papers" if count else "*(digest pending)*" lines.append(f"| **Latest digest** | [{title} {year}]({base_path}/digests/{slug}/) {suffix} |") + if special_issues: + lines += ["\n## Special Issues\n"] + lines += [ + "| Title | Abstract | Paper deadline | Notification | Guest Editors |", + "|---|---|---|---|---|", + ] + for si in special_issues: + si_title = si.get("title", "Special Issue") + abstract = si.get("abstract_deadline") or "" + paper = si.get("submission_deadline") or si.get("abstract_deadline") or "TBD" + notif = si.get("notification") or "" + editors = ", ".join(si.get("guest_editors", [])) or "—" + abs_cell = abstract if (abstract and abstract != paper) else "" + cfp_url = si.get("cfp_url", "") + if cfp_url: + si_title = f"[{si_title}]({cfp_url})" + lines.append(f"| {si_title} | {abs_cell} | {paper} | {notif} | {editors} |") + lines.append("") + if digests: lines += ["\n## Previous Editions\n"] for d in sorted(digests, key=lambda x: x["year"], reverse=True): @@ -278,13 +298,25 @@ def _journal_body(fm: dict, digests: list[dict] | None = None, base_path: str = # Date helpers # --------------------------------------------------------------------------- -def _parse_date(s: str) -> str | None: - """'Apr 1, 2026' → '2026-04-01', or None if unparseable.""" +def _parse_date(s: str, month_only: bool = False) -> str | None: + """'Apr 1, 2026' → '2026-04-01', or None if unparseable. + + With month_only, also accepts a bare month and year ('Jan 2027' → + '2027-01-01'). Journal special issues often announce notifications at + month granularity; conference deadlines are always full dates, so this + stays opt-in to keep their output unchanged. + """ for fmt in ("%b %d, %Y", "%B %d, %Y"): try: return datetime.strptime(s.strip(), fmt).strftime("%Y-%m-%d") except ValueError: pass + if month_only: + for fmt in ("%b %Y", "%B %Y"): + try: + return datetime.strptime(s.strip(), fmt).strftime("%Y-%m-%d") + except ValueError: + pass return None @@ -429,6 +461,29 @@ def _calendar_events(venues: dict, deadlines: dict, base_path: str = "") -> list if location: ev["extendedProps"] = {"location": location} events.append(ev) + + # Journal special issue deadlines — one purple series, distinct from conferences + journal_color = "#7b2cbf" + for journal in venues.get("journals") or []: + acronym = journal.get("acronym", "") + url = f"{base_path}/venues/journals/{acronym.lower()}/" + for si in journal.get("special_issues") or []: + si_title = si.get("title", "Special Issue") + cfp_url = si.get("cfp_url", "") + for field, label in [ + ("abstract_deadline", "abstract deadline"), + ("submission_deadline", "paper deadline"), + ("notification", "notification"), + ]: + # Notifications are often month-only ('Jan 2027'); deadlines are not. + iso = _parse_date(si.get(field) or "", month_only=(field == "notification")) + if iso: + ev = {"title": f"{acronym} SI — {si_title} — {label}", + "start": iso, "url": url, "color": journal_color, + "allDay": True} + if cfp_url: + ev["extendedProps"] = {"cfp_url": cfp_url} + events.append(ev) return events @@ -441,7 +496,9 @@ def _calendar_body(venues: dict, icore: dict, deadlines: dict, base_path: str = pass return datetime.max - rows = [] + lines: list[str] = [] + + conf_rows = [] for conf in venues.get("conferences") or []: acronym = conf.get("acronym", "") rank = icore.get(acronym.upper(), "—") or "—" @@ -451,24 +508,57 @@ def _calendar_body(venues: dict, icore: dict, deadlines: dict, base_path: str = notif = dl_data.get("notification") or "" event = dl_data.get("event_dates") or "—" location = dl_data.get("location") or "" - rows.append((acronym, abstract, paper, notif, event, location, rank)) + conf_rows.append((acronym, conf.get("full_name", ""), abstract, paper, + notif, event, location, rank)) - rows.sort(key=lambda r: (parse_deadline(r[2]), r[0])) + conf_rows.sort(key=lambda r: (parse_deadline(r[3]), r[0])) - lines = [ - "\n| Conference | Abstract | Paper deadline | Notification | Event dates | Location | ICORE |", - "|---|---|---|---|---|---|---|", + lines += [ + "\n## Conference Deadlines\n", + "| Venue | Name | Abstract | Paper deadline | Notification | Event dates | Location | ICORE |", + "|---|---|---|---|---|---|---|---|", ] - for acronym, abstract, paper, notif, event, location, rank in rows: + for acronym, full_name, abstract, paper, notif, event, location, rank in conf_rows: abs_cell = abstract if (abstract and abstract != paper) else "" + link = f"[{acronym}]({base_path}/venues/conferences/{acronym.lower()}/)" lines.append( - f"| [{acronym}]({base_path}/venues/conferences/{acronym.lower()}/) " - f"| {abs_cell} | {paper} | {notif} | {event} | {location} | {rank} |" + f"| {link} | {full_name} | {abs_cell} | {paper} | {notif} " + f"| {event} | {location} | {rank} |" ) + si_rows = [] + for journal in venues.get("journals") or []: + acronym = journal.get("acronym", "") + for si in journal.get("special_issues") or []: + abstract = si.get("abstract_deadline") or "" + paper = si.get("submission_deadline") or si.get("abstract_deadline") or "TBD" + notif = si.get("notification") or "" + si_title = si.get("title", "Special Issue") + cfp_url = si.get("cfp_url", "") + if cfp_url: + si_title = f"[{si_title}]({cfp_url})" + editors = ", ".join(si.get("guest_editors", [])) or "—" + si_rows.append((acronym, si_title, abstract, paper, notif, editors)) + + si_rows.sort(key=lambda r: (parse_deadline(r[3]), r[0])) + + if si_rows: + lines += [ + "\n## Journal Special Issues\n", + "| Venue | Title | Abstract | Paper deadline | Notification | Guest Editors |", + "|---|---|---|---|---|---|", + ] + for acronym, si_title, abstract, paper, notif, editors in si_rows: + abs_cell = abstract if (abstract and abstract != paper) else "" + link = f"[{acronym}]({base_path}/venues/journals/{acronym.lower()}/)" + lines.append( + f"| {link} | {si_title} | {abs_cell} | {paper} | {notif} | {editors} |" + ) + lines += [ "", - "> Deadlines sourced from conference websites and [WikiCFP](http://www.wikicfp.com/).", + "> Deadlines sourced from conference websites, [WikiCFP](http://www.wikicfp.com/), " + "and journal special issue CFPs.", "", ] return "\n".join(lines) + "\n" @@ -586,7 +676,8 @@ def gen_journals(venues: dict, scimago: dict[str, dict], root: Path, } fm = merge_fm(existing_fm, new_fm, PRESERVED_VENUE_FIELDS) digests = (venue_digests or {}).get(acronym) - write_hugo_file(path, fm, _journal_body(fm, digests, base_path)) + write_hugo_file(path, fm, _journal_body(fm, digests, base_path, + journal.get("special_issues"))) count += 1 print(f" {path.relative_to(root.parent)}", file=sys.stderr) return count