Skip to content

About

My portfolio page. Feel free to fork it

Resources

Stars

4 stars

Watchers

1 watching

Forks

Latest commit

 

History

464 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Website content conventions

다국어 페이지

  • 한국어 원본은 /에 유지하고, 외국어 버전은 총 사용자 수(모국어·제2언어 포함) 상위 언어 기준으로 /en/, /zh/, /hi/, /es/, /ar/, /fr/, /bn/, /pt/에 생성합니다. 중국어는 간체, 아랍어는 현대 표준 아랍어입니다.
  • 각 언어는 홈뿐 아니라 일반 목록과 강의·논문 상세 페이지에 동일한 하위 경로를 제공합니다. 예: /es/lectures/, /en/books/, /ar/contact/. 푸터 맨 아래의 언어 선택기는 현재 페이지에 대응하는 언어별 페이지로 연결합니다.
  • 언어 경로가 없는 페이지의 첫 방문은 Cloudflare의 공개 /cdn-cgi/trace 응답 중 국가 코드만 읽어 해당 언어로 연결합니다. IP 주소·위치 정보는 저장하지 않으며 국가 조회에는 쿠키와 Referer를 보내지 않습니다. 직접 고른 언어 코드는 브라우저에 저장하여 우선 적용하고, 자동 선택 결과는 방문 세션 동안 재사용합니다. /en/ 등 명시된 언어 주소는 자동으로 바꾸지 않습니다. 조회 실패·시간 초과 시 지원되는 브라우저 언어, 없으면 영어를 사용합니다. 자동 이동을 기다리는 동안 사용자가 화면을 조작하면 이동을 취소합니다.
  • 번역은 content/locales/<언어>.json에서 관리하고 빌드 시 본문 HTML에 반영합니다. 번역 서비스 요청이나 브라우저의 자동 번역 기능에 의존하지 않습니다. 한국어 콘텐츠 수정 후 python scripts/build_site.py --prepare-locales로 번역 원문 목록을 갱신하고, 추가·변경된 문구를 모든 언어에 번역한 뒤 일반 빌드를 실행합니다.
  • 번역 키는 원문 문자열의 해시입니다. {{0}} 등의 인라인 태그 자리표시자와 {label}, {count} 등의 동적 UI 변수를 보존합니다. 식별자·날짜·금액·강의 분류 키·원본 링크를 번역하거나 새로 추정하지 않습니다. content/locales/runtime-source.json은 메뉴·필터·더보기·문의 전송 상태 등 동적 문구의 한국어 원본입니다.
  • 논문 제목·저자·출판 정보·초록·전문·인용 자료는 원문을 유지하고 주변 메뉴와 안내만 번역합니다. PDF와 이미지, 코드 및 인용 다운로드 파일은 기존 자산을 공유합니다.
  • 각 언어 페이지의 canonical은 해당 언어 주소이며 한국어·8개 외국어·x-default의 hreflang을 상호 연결합니다. 사이트맵에는 실제 생성된 언어별 주소를 모두 포함하고 기존 예제 사이트 주소를 보존합니다. 모바일 연속 스크롤과 기관 필터, 더보기는 현재 언어를 유지합니다.
  • python scripts/check_site.py는 다국어 검사를 포함합니다. python scripts/check_locales.py로 별도 실행할 수도 있습니다. 번역 누락·자리표시자 변형, 경로·사이트맵·검색 메타데이터, 연구 원문·자산 보존을 검사하며 node scripts/check_i18n_runtime.cjs는 언어별 동작을 확인합니다.

정적 페이지 생성

  • 이 사이트는 빌드 시 본문이 포함된 HTML을 생성합니다. 각 주소에서 자바스크립트 없이도 전체 본문을 읽을 수 있습니다.
  • 원본 콘텐츠는 content/sections/*.html, 페이지 구성과 제목·설명은 content/site.json, 공통 레이아웃은 content/layout.html에서 관리합니다.
  • index.html과 각 하위 폴더의 index.html, privacy.html은 생성 결과입니다. 원본을 수정한 후 python scripts/build_site.py를 실행하세요.
  • 개인정보처리방침은 승인된 content/sections/privacy.html에서 /privacy.html로 생성합니다. content/site.json의 output은 파일 주소를 지정하고 footer: false는 공통 푸터 목록에서 제외합니다. 문의폼 하단의 작은 링크로 연결하며 상단 메뉴와 연속 스크롤 순서에는 넣지 않습니다. 주소와 사이트맵은 동일한 출력 경로를 사용합니다. 문안 변경은 게시 전에 운영자의 승인을 받습니다.
  • python scripts/build_site.py --check로 생성 결과가 최신인지 확인하고, python scripts/check_site.py로 원문·카드 수·내부 경로·검색 메타데이터 보존 여부를 검사합니다. Python 표준 라이브러리만 사용합니다.
  • GitHub Pages에는 생성된 파일을 함께 배포합니다. 별도 애플리케이션 서버는 필요하지 않습니다. GitHub Actions는 푸시와 PR에서 생성 결과와 콘텐츠를 검사합니다.
  • scripts/site_feeds.py는 공개된 강의·저서·논문·언론 보도 카드에서 /feed.xml(RSS 2.0), /feed.json(JSON Feed 1.1), /api/index.json 및 /api/lectures.json, /api/books.json, /api/papers.json, /api/news.json을 생성합니다. API 목록은 전체 항목을 포함하며 확인된 원문 필드만 내보냅니다. 상세 페이지가 있는 강의·논문은 해당 주소로, 저서는 Books로, 보도는 원문 기사로 연결합니다. 기록된 날짜와 피드 게시일을 혼동하지 않도록 날짜는 본문과 date_text에 원문대로 유지하며 알 수 없는 최초 게시일·시간을 생성하지 않습니다. 같은 원본으로 빌드하면 피드도 동일하며, ID는 제목·설명 수정에 영향받지 않습니다. 피드 주소는 공통 head와 푸터에 표시합니다. JSON은 정적 조회용이며 쿼리 매개변수로 서버 필터링하지 않습니다.
  • 사이트맵은 기존 도서 예제 사이트 주소를 보존하면서 각 페이지 주소를 추가합니다. 실제 HTML 내용이 바뀐 페이지의 수정일만 갱신합니다.
  • scripts/check_site.py는 사이트맵의 페이지 누락·중복, 대표 주소와 호스트, 수정일, robots.txt 연결도 검사합니다. 강의 분류의 해시 주소와 모바일 연속 스크롤 상태, 이전 주소의 리다이렉트는 별도 페이지로 등록하지 않습니다. 별도 저장소에서 제공하는 예제 사이트 주소는 content/project-sitemap.xml에서 관리합니다.
  • 홈 /와 /books/, /media/, /news/, /courses/online/, /courses/offline/, /lectures/, /papers/, /patents/, /projects/, /activities/, /memberships/, /collections/, /contact/는 모두 실제 index.html 파일이 있는 주소입니다. 이전 /courses/ 주소도 물리적인 index.html을 유지하며 Online으로 연결합니다.
  • 모든 카드와 본문은 정적 HTML에 포함됩니다. 데스크톱과 JavaScript 미사용 환경에서는 전체 목록을 표시합니다. 모바일(768px 이하)에서는 Books를 제외한 카드 목록과 기부 내역을 처음 4행만 표시하며, 더보기 버튼을 한 번 누르면 해당 목록 전체를 펼칩니다. 현재 열 수를 기준으로 행을 계산하므로 1열에서는 4건, 2열에서는 8건이 먼저 표시됩니다. Lectures 기관 필터를 바꾸면 해당 분류의 첫 4행부터 표시하며, 이어 붙인 섹션에도 같은 규칙을 적용합니다.
  • 화면 디자인은 기존 style.css를 공통으로 사용합니다. 페이지 제목은 group-header·group-title·group-desc, 본문은 section-group을 유지하며, page.css에는 정적 페이지 전환에 필요한 보완만 둡니다. 홈 히어로와 기존 카드 크기·색상·간격을 별도로 덮어쓰지 않습니다.
  • 콘텐츠 카드 목록은 화면 폭 1920px 이상에서 본문 최대 폭 1600px·4열로 표시합니다. 그보다 작은 화면의 기존 열 수와 홈·문의 페이지 배열은 유지합니다.
  • 상단 메뉴는 Lectures와 Courses로 나눕니다. Lectures에는 기관별 출강 이력을, Courses에는 Online / Offline 교육과정을 표시합니다.
  • Lectures의 하위 메뉴는 전체 / 기업 / 공공기관 / 교육기관 / 연구기관 / 컨퍼런스입니다. 다른 페이지에서는 해당 분류가 선택된 강의 페이지로 연결하고, 강의 목록이 이미 있는 문서에서는 주소 변경이나 재로딩 없이 필터를 적용합니다. 모바일 메뉴와 데스크톱 드롭다운에 동일하게 표시합니다.
  • 모바일 메뉴의 하위 항목은 옆 화살표 버튼으로 접고 펼칩니다. 메뉴를 열 때 현재 읽고 있는 그룹만 기본으로 펼치고, 다른 그룹을 펼치면 이전 그룹은 접습니다. 그룹 이름은 기존 페이지 링크를 유지하며 데스크톱 드롭다운은 그대로 사용합니다.
  • 상단 메뉴와 스크롤 연결은 About 다음에 Media → Books → Lectures → Courses(Online / Offline) → News → R&D → ETC → Contact 순서입니다. 모바일 연속 스크롤에서는 홈의 Media 목록과 이어 붙인 섹션을 기준으로 현재 메뉴 강조 표시를 갱신합니다. 주소·방문 기록·본문의 원래 페이지 식별자는 바꾸지 않습니다.
  • 모바일(768px 이하)은 현재 본문의 끝에 가까워지면 다음 HTML의 main 안쪽만 이어 붙입니다. 주소·방문 기록·스크롤 위치는 바꾸지 않으며, 헤더와 푸터는 하나만 유지합니다. 중간의 다음 페이지 카드는 숨기고 Contact까지 이어진 뒤 푸터를 표시합니다. 요청 실패 시 재시도 버튼과 개별 페이지 링크를 표시합니다. 이미 붙인 콘텐츠는 화면 회전 후에도 유지합니다. continuous-scroll.js가 로딩을 담당하고 script.js가 추가된 강의 메뉴·인용 복사·문의 폼·프로젝트 통계를 초기화합니다.
  • 데스크톱은 기존처럼 맨 아래에서 추가 하향 스크롤로 다음 페이지로 이동합니다. 휠·트랙패드 입력은 300ms 넘게 멈춘 뒤 시작해야 하며, 페이지 끝에 도착한 동작의 관성만으로는 넘어가지 않습니다. 안내와 다음 페이지 링크는 본문 끝과 푸터 사이에 표시합니다. 실제 상단 메뉴 순서로 이어지고 Contact에서 끝나며, 메뉴·입력란·텍스트 선택·확대 상태에서는 이동하지 않습니다. 연속 스크롤을 지원하지 않는 모바일 브라우저에서는 기존 스와이프와 링크를 유지합니다.
  • 공통 스크립트와 style.css·page.css 주소에는 빌드 시 파일 내용의 해시를 붙여 배포 직후 이전 캐시와 섞이지 않도록 합니다.
  • 교육과정 원본은 content/sections/courses-online.html과 courses-offline.html에서 관리합니다. 온라인 영상·라이브 교육과 대면 교육을 실제 진행 방식으로 분류합니다. LG 인화원의 MVP·그룹스터디 과정도 사용자 확인에 따라 Online에 포함합니다.
  • Online은 인프런 강좌(inflearn.com 또는 inf.run 링크)를 먼저 표시합니다. 인프런 강좌끼리와 나머지 교육과정끼리는 원본 순서를 유지하며, 빌드 시 자동 정렬합니다.
  • Papers는 정식 출판물(학술지·학회 논문과 학위논문)을 먼저 표시하고 프리프린트를 뒤에 표시합니다. 각 그룹 안에서는 확인된 출판 연도의 내림차순이며 같은 연도는 원본 순서를 유지합니다. 모든 논문 카드에 data-publication-type="published|preprint"와 data-publication-year를 기재합니다. 같은 연구의 정식 출판본과 프리프린트 링크는 한 카드에 함께 둘 수 있습니다.
  • 논문 설명에는 원문에 실린 영문 Abstract를 사용하며 임의 요약이나 번역으로 대체하지 않습니다. 학술지·학회 정식 출판본이 있으면 그 버전의 초록을 우선합니다. 논문 이미지는 원본 PDF의 첫 페이지를 비율대로 표시하고, KCI의 1쪽 미리보기 PDF는 전체 논문과 구분해 다운로드 링크에 미리보기 PDF (1쪽)으로 명시합니다. 익명 심사본이나 투고용 템플릿을 정식 출판본으로 올리지 않습니다.
  • 모바일 논문 카드의 하단 링크는 긴 설명 문구를 숨기고 아이콘으로 표시합니다. 미리보기·정식 논문·프리프린트·인용 복사는 title과 접근성 이름으로 구분하며 데스크톱에서는 설명 문구를 유지합니다.
  • 논문별 서지정보와 고정 주소는 content/papers.json에서 관리하고 제목·원문 초록·이미지·기존 링크는 content/sections/papers.html을 사용합니다. 빌드 시 /papers/<slug>/ 상세 페이지와 목록의 제목 링크, Scholar citation_* 메타데이터·구조화 데이터·사이트맵을 함께 생성합니다. 상세 페이지는 JavaScript나 더보기 없이 초록과 전문을 표시합니다. 석사학위논문은 사용자 요청으로 초록만 유지합니다. 제목·연도가 두 원본에서 다르면 빌드가 실패합니다.
  • 전문은 원문에서 변환한 content/paper-bodies/<record_id>.html, 버전 및 원본 해시는 content/paper-bodies.json, 본문 그림은 src/images/paper-body/<record_id>/에서 관리합니다. 출판본·저자 원고·프리프린트의 출처 구분은 메타데이터에 유지하고 원고 버전·변환 안내 문구는 페이지에 표시하지 않습니다. 원고 DOCX/HWP/HWPX와 비공개 Drive 자료·연락처는 공개 저장소에 복사하지 않습니다. 목차는 실제 본문 제목에서 생성하며 원문의 표·그림·수식·참고문헌을 보존합니다. PDF에서 복원한 복잡한 수식·그림은 원문 영역을 추출하여 보완합니다.
  • scripts/paper_citations.py가 확인된 서지정보로 APA·MLA·Chicago bibliography·IEEE·BibTeX·RIS를 생성합니다. 상세 페이지의 형식별 복사 버튼과 미리보기, 같은 폴더의 citation.bib·citation.ris를 함께 생성합니다. 없는 쪽수·권호·날짜는 추정하지 않습니다. paper-reader.js는 인용 복사와 목차 표시만 보완하며 전문 표시는 JavaScript에 의존하지 않습니다.
  • full_pdf는 같은 출판 버전임을 확인한 전문 PDF에만 지정합니다. 생성기는 변경하지 않은 PDF를 상세 페이지와 같은 폴더의 paper.pdf로 복사하고 그 주소를 citation_pdf_url로 표시합니다. 미리보기·다른 버전·제외 요청한 석사 PDF는 이 필드에 넣지 않습니다. 상세 페이지와 PDF 사본은 생성 결과이므로 직접 수정하지 않습니다. 검색 색인과 순위는 검색엔진이 결정하며 메타데이터만으로 보장되지 않습니다.
  • 강의 상세 페이지 /lectures/<data-record-id>/는 Lectures에 표시되는 카드에서 직접 생성합니다. 제목·날짜·이미지·기관명·설명·자료 링크를 그대로 사용하며 별도 본문은 작성하지 않습니다. 상세 카드 아래에는 강의 목록으로 돌아가기 버튼을 표시합니다. 목록의 제목과 기관명은 상세 페이지로 연결하고, 상세 페이지의 기관명에는 카드에 있던 원래 기관 링크를 유지합니다. 링크가 없던 기관의 URL은 추정하지 않습니다. 반복 교육의 Courses 사본도 같은 상세 주소를 사용합니다. 기존 카드의 data-record-id는 주소를 유지하는 식별자이므로 이미지나 설명을 수정할 때 바꾸지 않습니다.
  • Offline 과정은 Lectures에도 함께 표시하고, Lectures에서 출강일이 3개 이상인 항목은 Courses에도 표시합니다. 날짜가 부족한 기록의 사용자 확인 결과와 Online/Offline 구분은 content/cross-listing.json에서 관리합니다. 반복 출강의 진행 방식이 미확인 상태이면 빌드를 중단하므로 임의로 분류하지 않습니다.
  • 교차 게재하는 카드의 제목·설명·이미지는 원본 한 곳에서만 관리합니다. data-record-id는 항목을 참조하는 고유값이며, Offline 원본의 data-category는 Lectures의 기관 필터에도 사용됩니다. 목록 안의 중복과 반복 교차 게재는 생성기가 방지합니다. Offline과 Lectures 모두 전체 최근 날짜순으로 정렬합니다.
  • 홈의 강의 통계는 교차 게재 전 원본 수로 계산해 중복 집계를 피하고, 강의 이력 바로가기에는 실제 목록에 표시되는 수를 사용합니다.
  • 모바일 홈은 소개 다음에 Media 목록을 바로 표시하고 Explore 바로가기를 숨깁니다. Media 목록은 /media/와 동일한 원본에서 생성하며 다른 목록과 같이 처음 4행을 표시합니다. 모바일 홈의 다음 페이지는 이미 표시한 Media를 건너뛰고 Books로 이어지며, 데스크톱 홈은 Explore와 다음 Media 연결을 유지합니다.
  • 모바일 책 목록은 작은 화면에서도 2열이며 제목은 두 줄까지 표시합니다. 홈·독립 Books 페이지·연속 스크롤로 추가한 Books에 같은 규칙을 적용하고 서점 링크는 줄바꿈해 모두 유지합니다. 다른 종류의 카드 열 수는 유지합니다.
  • 사회공헌의 기부 내역은 content/sections/social.html에서 관리합니다. 금액이 있는 항목을 먼저 표시하고 두 그룹 안의 기존 순서는 유지합니다. 금액이 공개되지 않은 항목은 미공개로 표시하고, 누적 후원은 개별 내역과 중복 합산하지 않습니다. 같은 기관·같은 달에 별도로 기록된 기부는 임의로 합치거나 삭제하지 않습니다.
  • 기존 /#books, /#education-section 등의 외부 링크는 JavaScript가 새 페이지로 연결합니다. 새 링크에는 해시 대신 실제 페이지 주소를 사용하세요.
  • src/resource_forward의 외부 사이트용 책·문의 조각은 별도로 보존합니다. 공통 콘텐츠를 변경하면 해당 조각의 동기화 여부도 확인하세요.

강의 이력

  • 같은 연도에 여러 번 진행한 강의는 연도를 처음에만 적습니다: 2026.09.10. 09.24.
  • 연도가 달라지면 새 연도를 다시 적습니다: 2025.12.20. 2026.01.10.
  • 강의 카드 안의 날짜는 오래된 날짜부터 순서대로 적습니다.
  • 날짜에 표시된 연도는 제목 끝에 (2024)처럼 다시 적지 않습니다. 강의 주제나 공식 과정명에 포함된 연도·기수·차시는 유지합니다.
  • 강의용 로고는 흰 배경의 600×450 WebP(품질 75)에 원래 비율로 배치합니다. 로고 내용은 288×216 안에 맞춰 여백을 확보하고 카드에는 object-fit: contain을 적용합니다.
  • 강의 이미지의 jsDelivr 주소는 해당 파일이 포함된 고정 커밋을 참조합니다. CDN 로딩 실패 시 사이트 안의 같은 이미지로 한 번 재시도하고, 두 경로 모두 실패하면 공통 대체 이미지를 표시합니다. 화면 가까이의 이미지는 미리 불러옵니다.
  • HTML의 따옴표·앰퍼샌드는 한 번만 이스케이프합니다. 생성기는 원본에서 중첩된 엔티티를 발견하면 파일·행번호를 표시하고 빌드를 중단합니다.
  • Lectures의 전체는 기관 분류를 섞어 하나의 목록으로 표시합니다. 기관별 구분 제목이나 별도 섹션은 넣지 않습니다.
  • 모든 강의 카드는 가장 최근 진행일 기준 내림차순입니다. 여러 날짜가 있으면 가장 늦은 날짜를 기준으로 합니다. 특정 기관 분류를 선택해도 이 순서를 유지합니다.
  • 월일을 알 수 없는 강의는 2024년처럼 연도만 적습니다. 같은 해의 정확한 날짜가 있는 강의 뒤, 이전 연도 강의 앞에 정렬하며 같은 연도끼리는 기존 순서를 유지합니다.
  • scripts/build_site.py는 교차 게재를 마친 전체 강의 카드를 #lecture-list.lecturesContainer 하나에 정렬합니다. 필터·건수와 카드 그리드를 빌드 시 생성하므로 자바스크립트 없이도 전체 목록을 읽을 수 있습니다. 같은 날짜인 항목은 원래 순서를 유지합니다.
  • 강의 카드의 data-category에는 기업, 공공기관, 교육기관, 연구기관, 컨퍼런스 중 하나를 적습니다. 학교·대학교·도서관은 교육기관입니다.
  • 교육부·교육청·교육지원청과 교육청연수원·특수교육지원센터 등 교육행정 소속기관은 공공기관으로 분류합니다. 도서관·학교는 교육기관을 유지합니다.
  • 국가공무원인재개발원·보건복지인재원 등 공공 인재개발기관은 공공기관, KIRD는 연구기관으로 분류합니다.
  • 한국생산성본부·농협중앙회·신협중앙회·한국가스안전공사·한국공항공사·미래와소프트웨어재단·서울시 기계공업 협동조합·한국건설기술인협회는 기업으로 분류합니다.
  • 진로체험센터·직업교육센터·여성발전센터·노인종합복지관은 공공기관으로 분류합니다.
  • 학회·개인 모임은 컨퍼런스로 분류합니다. 별도로 확정한 협회·재단의 분류를 우선하며, 새 강의처의 분류가 모호하면 임의로 확정하지 않고 사용자에게 확인합니다.
  • 목록 앞에는 전체 / 기업 / 공공기관 / 교육기관 / 연구기관 / 컨퍼런스 필터 버튼과 건수를 표시합니다. 분류를 선택하면 해당 분류의 카드만 표시하고 전체를 누르면 모든 카드를 다시 표시합니다. URL 변경이나 추가 요청 없이 동작하며 모바일 연속 스크롤로 불러온 목록에서도 동일하게 작동합니다. 건수는 원본 카드에서 자동 집계하고, 알 수 없는 data-category 값이 있으면 빌드를 중단합니다.

About

My portfolio page. Feel free to fork it

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages