Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/workflows/slides.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ jobs:
# 토큰이 테마에 반영됐는지 확인 (tokens.json만 고치고 sync를 잊은 PR 방지)
- run: npm run tokens && git diff --exit-code tokens/tokens.css themes/causal-lab.css
- run: npm run build
env:
CHROME_PATH: /usr/bin/google-chrome
- uses: actions/upload-pages-artifact@v3
with:
path: dist
Expand Down
2 changes: 1 addition & 1 deletion .marprc.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Marp CLI 설정 — `npm run build` / `npm run build:pdf`
# Marp CLI 설정 — `npm run build` (HTML 공개)
inputDir: ./slides
output: ./dist
themeSet: ./themes
Expand Down
4 changes: 4 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 현재 공개 방식 (2026-10-11)

사용자 결정으로 당분간 HTML만 공개합니다. PDF 생성 명령과 배포용 다운로드 링크를 제거했습니다. 아래 과거 인계 메모의 HTML/PDF 병행 결정은 현재 방식으로 대체됩니다. PDF 재개는 HTML과 스타일을 공유하고 페이지별 배치 비교를 통과한 뒤 검토합니다.

# 참여자 AI 튜터 모드

러너가 읽기·풀이·기록·GitHub 제출을 도와달라고 요청하면 먼저 [TUTOR.md](TUTOR.md)를 읽고 그 절차를 따릅니다. 러너의 생각과 확인한 근거를 함께 정리하고, 미확인 내용을 검증된 결과로 쓰지 않습니다.
Expand Down
8 changes: 6 additions & 2 deletions DESIGN.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# DESIGN.md — Causal-Lab 슬라이드 디자인 시스템

가짜연구소 인과추론팀(Causal-Lab) PPT 디자인을 마크다운 기반 템플릿으로 옮긴 문서입니다. 디자인만 담고 있으며 특정 발표 내용은 포함하지 않습니다.
발표자는 디자인을 신경 쓰지 않고 **내용만 `.md`로 쓰면** 같은 모양의 HTML(주) / PDF(부)가 만들어지는 것이 목표입니다.
발표자는 디자인을 신경 쓰지 않고 **내용만 `.md`로 쓰면** 같은 디자인의 HTML이 만들어지는 것이 현재 공개 목표입니다. PDF는 화면 배치가 달라져 2026-10-11부터 생성을 중단했습니다.

- 디자인 토큰 원본: [`tokens/tokens.json`](tokens/tokens.json) (W3C Design Tokens 형식)
- CSS 변수: [`tokens/tokens.css`](tokens/tokens.css) — 자동 생성
Expand Down Expand Up @@ -212,4 +212,8 @@ OT 화면의 크기·간격 조정은 덱 전용 `live.css`에 한정하며 공

## 8. 공개 OT 화면

공개 OT HTML은 읽기 전용입니다. 텍스트 편집·행 추가·체크 변경 기능을 제공하지 않습니다. 기존 하단 45px 도구 모음에는 이전·다음·현재 쪽수, PDF 저장과 사용 안내 링크를 둡니다. 화면 폭 480px 이하에서는 도구 모음을 12px 글자·6px 간격으로 줄입니다. 사용 안내는 `slides/ot-live/guide.html`을 같은 폴더에 배포하며 흰 배경·navy 제목·peach/blue 반반 구분선을 사용합니다. 본문은 18px, 문서 폭은 최대 800px이고 좁은 화면에서는 자연스럽게 줄바꿈합니다.
공개 OT HTML은 읽기 전용입니다. 텍스트 편집·행 추가·체크 변경 기능을 제공하지 않습니다. 기존 하단 45px 도구 모음에는 이전·다음·현재 쪽수와 사용 안내 링크를 둡니다. 화면 폭 480px 이하에서는 도구 모음을 12px 글자·6px 간격으로 줄입니다. 사용 안내는 `slides/ot-live/guide.html`을 같은 폴더에 배포하며 흰 배경·navy 제목·peach/blue 반반 구분선을 사용합니다. 본문은 18px, 문서 폭은 최대 800px이고 좁은 화면에서는 자연스럽게 줄바꿈합니다.

## 9. HTML 전용 공개

전체 빌드는 HTML만 생성하며 자료 목록과 OT 도구 모음에 PDF 다운로드를 표시하지 않습니다. 로컬의 기존 PDF 파일은 자동 삭제하지 않습니다. CI는 새 작업 폴더에서 HTML을 빌드하므로 기존 공개 PDF는 다음 Pages 배포에서 제외됩니다. PDF를 재개하려면 OT 전용 스타일을 포함해 HTML과 인쇄 스타일을 공유하고, 글꼴 로딩·줄바꿈·표 경계·페이지별 배치 비교를 통과해야 합니다.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ ChatGPT·Claude·Gemini 등 AI 도구를 활용할 수 있습니다. 코드와

## 발표 슬라이드 작성

마크다운으로 Causal-Lab 디자인의 HTML/PDF 발표 자료를 만들 수 있습니다. [작성 안내](SLIDES.md)와 [디자인 규칙](DESIGN.md)을 참고하세요.
마크다운으로 Causal-Lab 디자인의 HTML 발표 자료를 만들 수 있습니다. [작성 안내](SLIDES.md)와 [디자인 규칙](DESIGN.md)을 참고하세요.


## 데이터셋 후보 보고서
Expand Down
8 changes: 5 additions & 3 deletions SLIDES.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# Causal-Lab 슬라이드 템플릿

마크다운으로 발표 자료를 쓰면 Causal-Lab 디자인이 적용된 HTML과 PDF가 만들어지는 템플릿입니다.
마크다운으로 발표 자료를 쓰면 Causal-Lab 디자인이 적용된 HTML이 만들어지는 템플릿입니다.
GitHub Actions가 빌드해서 GitHub Pages에 올립니다.

현재는 HTML로만 공개합니다. PDF 변환은 화면 배치가 달라지는 문제로 중단했으며, HTML과의 페이지별 비교를 통과한 뒤 재개를 검토합니다.

OT 자료를 보거나 수정하려면 [OT 사용 안내](docs/ot-live.md)를 참고하세요. 공개 HTML은 읽기 전용이며 원본 수정 PR이 병합된 뒤 다시 배포됩니다.

## 챕터 오너의 내용과 선택 슬라이드
Expand All @@ -28,7 +30,7 @@ OT 자료를 보거나 수정하려면 [OT 사용 안내](docs/ot-live.md)를

## 파일 배치 자동 검사

PR의 CI와 HTML·PDF·OT·보고서 빌드, 로컬 미리보기 시작 전에 같은 파일 배치 검사를 실행합니다.
PR의 CI와 HTML·OT·보고서 빌드, 로컬 미리보기 시작 전에 같은 파일 배치 검사를 실행합니다.

- 발표 폴더에는 파일 이름이 정확히 `index.md`인 파일이 있어야 합니다.
- `slides/<발표 폴더>/index.md` 외의 마크다운은 허용하지 않습니다. `README.md`, `INDEX.MD`, `img/notes.md`나 `.markdown`·`.mdown`·`.markdn` 파일도 차단합니다.
Expand All @@ -55,7 +57,7 @@ GitHub 웹에서 제출하는 순서(Fork, branch, 파일 올리기, PR)는 [TUT

- **VS Code**: 추천 확장(Marp for VS Code)을 설치하면 이 테마로 바로 미리보기 됩니다.
- **로컬 서버**: `npm ci` 후 `npm run dev`
- **전체 빌드**: `npm run build` → `dist/`에 덱별 `index.html`, `index.pdf`와 목록 페이지 (Chrome 필요)
- **전체 빌드**: `npm run build` → `dist/`에 덱별 `index.html`과 목록 페이지

러너와 챕터 오너는 설치 없이 GitHub 웹만으로 제출할 수 있습니다. 로컬 미리보기는 선택입니다.

Expand Down
7 changes: 3 additions & 4 deletions docs/ot-live.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
## 자료 보기와 저장

- [Pages에서 OT 보기](https://causalinferencelab.github.io/data-still-does-not-speak/ot-live/): 하단 이전·다음 버튼 또는 방향키·Page Up/Down으로 이동합니다. Home은 첫 장, End는 마지막 장입니다.
- [PDF 저장](https://causalinferencelab.github.io/data-still-does-not-speak/ot-live/index.pdf): PDF 화면의 다운로드 버튼으로 저장할 수 있습니다.
- [GitHub에서 원본 내용 읽기](../slides/ot-live/index.md): 문서 형식이며, 발표 화면은 Pages에서 봅니다.
- HTML을 보관하려면 OT 화면에서 브라우저의 **페이지 다른 이름으로 저장 → 웹페이지, 전체**를 선택하고 HTML과 생성된 이미지 폴더를 함께 보관합니다.

Expand All @@ -16,17 +15,17 @@
3. **Commit changes**로 작업 브랜치에 저장하고 **Contribute → Open pull request**로 원본 `main`에 제안합니다.
4. 검토·병합 후 배포가 완료되면 Pages에 반영됩니다. PR을 여는 것만으로는 반영되지 않습니다.

자세한 화면별 절차는 [제출 안내](../CONTRIBUTING.md)를 참고하세요. 생성된 HTML·PDF는 직접 커밋하지 않습니다.
자세한 화면별 절차는 [제출 안내](../CONTRIBUTING.md)를 참고하세요. 생성된 HTML는 직접 커밋하지 않습니다.

## 유지보수자 빌드

- 원본: `slides/ot-live/index.md`
- 전용 화면 스타일: `slides/ot-live/live.css`
- 생성 결과: `dist/ot-live/index.html`, `dist/ot-live/index.pdf`
- 생성 결과: `dist/ot-live/index.html`
- 전체 빌드: `npm run build`
- OT HTML만 다시 생성: `npm run build:ot-live` (기존 의존성이 설치된 환경)

화면 전용 CSS는 HTML 발표용입니다. PDF는 공통 Marp 테마로 생성하는 보조 출력입니다.
현재 자료는 HTML로만 공개합니다. PDF 생성과 공개 다운로드를 중단했습니다. 기존 PDF는 OT 전용 HTML 스타일 없이 공통 Marp 테마로 다시 변환되어 화면 배치가 달라졌습니다. PDF 재개 시에는 HTML과 공유하는 스타일·인쇄 레이아웃·폰트 로딩을 점검하고 페이지별 시각 비교를 통과해야 합니다.

## 이름·LinkedIn·목표 한 줄

Expand Down
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@
"tokens": "node scripts/sync-tokens.mjs",
"dev": "npm run check:slides && marp --no-stdin --server ./slides",
"build:html": "npm run check:slides && marp --no-stdin",
"build:pdf": "npm run check:slides && marp --no-stdin --pdf",
"build:reports": "npm run check:slides && node scripts/build-index.mjs",
"build": "npm run check:slides && npm run tokens && npm run build:html && npm run build:pdf && node scripts/copy-assets.mjs && npm run build:ot-live && node scripts/build-index.mjs",
"build": "npm run check:slides && npm run tokens && npm run build:html && node scripts/copy-assets.mjs && npm run build:ot-live && node scripts/build-index.mjs",
"build:ot-live": "npm run check:slides && node slides/ot-live/build-live.mjs"
},
"devDependencies": {
Expand Down
6 changes: 1 addition & 5 deletions scripts/build-index.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,13 @@ const decks = readdirSync("slides")
dir: d,
title: pick("title") ?? d,
presenter: pick("presenter") ?? "",
pdf: existsSync(join("dist", d, "index.pdf")),
};
});

const esc = (s) => s.replace(/[&<>"]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" })[c]);
const rows = decks
.map(
(d) => `<li><a href="./${d.dir}/">${esc(d.title)}</a>${d.presenter ? `<span>${esc(d.presenter)}</span>` : ""}${
d.pdf ? ` <a class="pdf" href="./${d.dir}/index.pdf">PDF</a>` : ""
}</li>`
(d) => `<li><a href="./${d.dir}/">${esc(d.title)}</a>${d.presenter ? `<span>${esc(d.presenter)}</span>` : ""}</li>`
)
.join("\n");
const reportRows = reports.map((r) => `<li><a href="./reports/${r.dir}/">${esc(r.title)}</a></li>`).join("\n");
Expand All @@ -65,7 +62,6 @@ li{font-size:19px;margin:0 0 14px}
li a{color:var(--color-text-primary);font-weight:700;text-decoration:none}
li a:hover,li a:focus-visible{color:var(--color-brand-navy);text-decoration:underline}
li span{color:var(--color-text-muted);margin-left:12px;font-size:16px}
a.pdf{font-size:13px;font-weight:700;color:var(--color-brand-navy);border:1px solid var(--color-brand-blue);padding:1px 6px;margin-left:10px}
footer{position:fixed;bottom:0;left:0;right:0;height:36px;background:var(--color-brand-blue)}
</style></head><body>
<div class="band"></div>
Expand Down
29 changes: 27 additions & 2 deletions scripts/check-slides.test.mjs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import assert from 'node:assert/strict';
import { cpSync, existsSync, mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
import { cpSync, existsSync, mkdtempSync, mkdirSync, readFileSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
Expand Down Expand Up @@ -70,11 +70,36 @@ for (const path of [
});
}

for (const command of ['build', 'build:pdf', 'dev', 'build:ot-live', 'build:reports']) {
for (const command of ['build', 'dev', 'build:ot-live', 'build:reports']) {
test(`${command} also blocks invalid Markdown before its build step`, () => {
const result = build({ 'slides/demo/index.md': deck, 'slides/demo/README.md': '# Notes\n' }, command);
assert.equal(result.status, 1, result.stdout + result.stderr);
assert.match(result.stderr, /slides\/demo\/README\.md/);
assert.equal(result.html, null);
});
}

test('OT and listing publish HTML without PDF download links', () => {
const cwd = mkdtempSync(join(tmpdir(), 'slides-html-only-'));
try {
for (const name of ['package.json', '.marprc.yml', 'scripts', 'tokens', 'themes', 'assets', 'slides']) {
cpSync(join(root, name), join(cwd, name), { recursive: true });
}
symlinkSync(join(root, 'node_modules'), join(cwd, 'node_modules'), 'dir');
mkdirSync(join(cwd, 'dist/ot-live'), { recursive: true });
writeFileSync(join(cwd, 'dist/ot-live/index.pdf'), 'old local PDF');
const result = spawnSync('npm', ['run', 'build'], { cwd, encoding: 'utf8', timeout: 30000 });
assert.equal(result.status, 0, result.stdout + result.stderr);
assert.equal(existsSync(join(cwd, 'dist/example/index.pdf')), false);
assert.equal(readFileSync(join(cwd, 'dist/ot-live/index.pdf'), 'utf8'), 'old local PDF');
for (const name of ['dist/index.html', 'dist/ot-live/index.html', 'dist/ot-live/guide.html']) {
const html = readFileSync(join(cwd, name), 'utf8');
assert.doesNotMatch(html, /href=["'][^"']*\.pdf/i);
}
const html = readFileSync(join(cwd, 'dist/ot-live/index.html'), 'utf8');
assert.match(html, /<section\b/);
assert.match(html, /href=".\/guide.html"/);
} finally {
rmSync(cwd, { recursive: true, force: true });
}
});
2 changes: 1 addition & 1 deletion slides/ot-live/build-live.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const root=path.resolve(base,'../..');
const output=path.join(root,'dist/ot-live/index.html');
execFileSync(path.join(root,'node_modules/.bin/marp'),['--no-stdin','--no-config','--html','--theme',path.join(root,'themes/causal-lab.css'),'--template','bare',path.join(base,'index.md'),'-o',output],{cwd:root,stdio:'inherit'});
let html=readFileSync(output,'utf8').replace('<html lang="C">','<html lang="ko">').replace(/lang="C"/g,'lang="ko"');
const toolbar=`<div id="ot-toolbar"><button id="ot-prev">← 이전</button><span id="ot-page" aria-live="polite"></span><button id="ot-next">다음 →</button><a href="./index.pdf" download>PDF 저장</a><a href="./guide.html" target="_blank" rel="noopener">사용 안내</a></div>`;
const toolbar=`<div id="ot-toolbar"><button id="ot-prev">← 이전</button><span id="ot-page" aria-live="polite"></span><button id="ot-next">다음 →</button><a href="./guide.html" target="_blank" rel="noopener">사용 안내</a></div>`;
html=html.replace('</head>','<style id="ot-live-style">'+readFileSync(path.join(base,'live.css'),'utf8')+'</style></head>');
html=html.replace('</body>',toolbar+'<script id="ot-live-script">'+readFileSync(path.join(base,'live-editor.js'),'utf8')+'</script></body>');
writeFileSync(output,html);
Expand Down
4 changes: 2 additions & 2 deletions slides/ot-live/guide.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ <h1>OT 자료 사용 안내</h1>
<h2>슬라이드 보기</h2>
<p><a href="./">OT 열기</a>에서 하단의 이전·다음 버튼으로 이동하세요. 키보드 방향키·Page Up·Page Down도 사용할 수 있습니다. Home은 첫 장, End는 마지막 장입니다.</p>
<h2>파일로 보관하기</h2>
<p><a href="./index.pdf" download>OT PDF 저장</a>을 누르세요. 브라우저에서 PDF가 열리면 PDF 화면의 다운로드 버튼으로 저장할 수 있습니다. 작은 화면에서는 PDF를 확대해 읽으세요.</p>
<p>현재 자료는 HTML로만 제공합니다. PDF 변환은 화면 배치가 달라지는 문제가 있어 당분간 제공하지 않습니다.</p>
<p>HTML을 파일로 보관하려면 OT 화면에서 브라우저의 <strong>페이지 다른 이름으로 저장</strong>을 선택하고 <strong>웹페이지, 전체</strong> 형식으로 저장하세요. 생성된 HTML과 이미지 폴더를 함께 보관해야 식당 사진도 표시됩니다.</p>
<h2>GitHub에서 내용 확인·수정하기</h2>
<ol>
Expand All @@ -21,7 +21,7 @@ <h2>GitHub에서 내용 확인·수정하기</h2>
<li><code>slides/ot-live/index.md</code>의 연필 아이콘으로 수정하고 <strong>Commit changes</strong>로 작업 브랜치에 저장합니다. 맨 위 설정과 슬라이드 구분선 <code>---</code>은 유지하세요.</li>
<li><strong>Contribute → Open pull request</strong>로 변경을 제안합니다. 대상은 원본 저장소의 <code>main</code>입니다. <a href="https://github.com/CausalInferenceLab/data-still-does-not-speak/blob/main/CONTRIBUTING.md">단계별 제출 안내</a>도 참고하세요.</li>
</ol>
<p>PR이 검토·병합되고 배포가 완료되면 Pages에 반영됩니다. PR을 여는 즉시 공개 자료가 바뀌지는 않습니다. 생성된 HTML·PDF를 직접 수정하거나 커밋하지 않습니다.</p>
<p>PR이 검토·병합되고 배포가 완료되면 Pages에 반영됩니다. PR을 여는 즉시 공개 자료가 바뀌지는 않습니다. 생성된 HTML를 직접 수정하거나 커밋하지 않습니다.</p>
<h2>이름·LinkedIn·목표 한 줄</h2>
<p>빌더가 공유하는 Google 폼으로 제출하고, 응답을 모아 한 번에 반영합니다. 공개 OT 화면에는 입력하지 않습니다.</p>
</main>
Expand Down
Loading