@@ -312,6 +312,8 @@ const copy = {
312312 scheduleOpenDay : "回到今日清单" ,
313313 matrixKicker : "Schedule Table" ,
314314 matrixTitle : "间隔学习总表" ,
315+ exportMatrixPdf : "导出 PDF" ,
316+ exportMatrixPdfTitle : "Vibe Coding Guide · 36 天学习计划" ,
315317 resetMatrix : "清空表格勾选" ,
316318 resetMatrixConfirm : "确定要清空总表里的所有勾选吗?" ,
317319 matrixDay : "天" ,
@@ -421,6 +423,8 @@ const copy = {
421423 scheduleOpenDay : "Today's checklist" ,
422424 matrixKicker : "Schedule Table" ,
423425 matrixTitle : "Spaced Learning Table" ,
426+ exportMatrixPdf : "Export PDF" ,
427+ exportMatrixPdfTitle : "Vibe Coding Guide · 36-Day Learning Plan" ,
424428 resetMatrix : "Clear table checks" ,
425429 resetMatrixConfirm : "Clear all table checks?" ,
426430 matrixDay : "Day" ,
@@ -647,6 +651,8 @@ const els = {
647651 matrixKicker : document . querySelector ( "#matrix-kicker" ) ,
648652 matrixTitle : document . querySelector ( "#matrix-title" ) ,
649653 matrixTable : document . querySelector ( "#schedule-table" ) ,
654+ exportMatrixPdf : document . querySelector ( "#export-matrix-pdf-button" ) ,
655+ exportMatrixPdfLabel : document . querySelector ( "#export-matrix-pdf-label" ) ,
650656 resetMatrix : document . querySelector ( "#reset-matrix-button" ) ,
651657 resetMatrixLabel : document . querySelector ( "#reset-matrix-label" ) ,
652658 noteKicker : document . querySelector ( "#note-kicker" ) ,
@@ -1714,6 +1720,9 @@ function renderSchedulePlan() {
17141720 els . scheduleOpenDayLabel . textContent = text . scheduleOpenDay ;
17151721 els . matrixKicker . textContent = text . matrixKicker ;
17161722 els . matrixTitle . textContent = text . matrixTitle ;
1723+ els . exportMatrixPdfLabel . textContent = text . exportMatrixPdf ;
1724+ els . exportMatrixPdf . title = text . exportMatrixPdf ;
1725+ els . exportMatrixPdf . setAttribute ( "aria-label" , text . exportMatrixPdf ) ;
17171726 els . resetMatrixLabel . textContent = text . resetMatrix ;
17181727
17191728 renderScheduleTable ( ) ;
@@ -2062,6 +2071,23 @@ function resetMatrixProgress() {
20622071 renderSchedulePlan ( ) ;
20632072}
20642073
2074+ function exportSchedulePdf ( ) {
2075+ const previousTitle = document . title ;
2076+ document . body . dataset . printMode = "schedule" ;
2077+ document . title = copy [ state . lang ] . exportMatrixPdfTitle ;
2078+
2079+ window . addEventListener (
2080+ "afterprint" ,
2081+ ( ) => {
2082+ delete document . body . dataset . printMode ;
2083+ document . title = previousTitle ;
2084+ } ,
2085+ { once : true } ,
2086+ ) ;
2087+
2088+ window . requestAnimationFrame ( ( ) => window . print ( ) ) ;
2089+ }
2090+
20652091async function loadGuide ( lang , shouldUpdateUrl = true ) {
20662092 state . lang = lang ;
20672093 state . headings = [ ] ;
@@ -2376,6 +2402,7 @@ els.nextDay.addEventListener("click", () => setDay(state.day + 1));
23762402els . openReader . addEventListener ( "click" , ( ) => openChapter ( firstChapterForDay ( state . day ) ) ) ;
23772403els . resetDay . addEventListener ( "click" , ( ) => resetDay ( state . day ) ) ;
23782404els . resetAllButton . addEventListener ( "click" , resetAllProgress ) ;
2405+ els . exportMatrixPdf . addEventListener ( "click" , exportSchedulePdf ) ;
23792406els . resetMatrix . addEventListener ( "click" , resetMatrixProgress ) ;
23802407els . search . addEventListener ( "input" , renderToc ) ;
23812408els . top . addEventListener ( "click" , ( ) => window . scrollTo ( { top : 0 , behavior : "smooth" } ) ) ;
0 commit comments