diff --git a/README.md b/README.md index df5caf6..15bd155 100644 --- a/README.md +++ b/README.md @@ -70,8 +70,8 @@ landing_page/ │ ├── implementation_plan.md # 오케스트레이션 검토 및 반영 루프 계획 │ └── chapters/ # 0~6장 챕터별 상세 연구 문서 (Prompt, MCP, HERDR, A2A, gRPC 등) │ -├── refer_landing_page/ # 🚀 [타겟 웹 애플리케이션 프로토타입] Next.js 14+ App Router -│ ├── app/ # Next.js App Router 페이지 (intro, members, publications, lectures, standardization) +├── refer_landing_page/ # 🚀 [타겟 웹 애플리케이션] Next.js 14+ App Router +│ ├── app/ # Next.js App Router 페이지 (Home /, members, publications, lectures, standardization) │ ├── components/ # 모듈화된 UI 컴포넌트 (Header, Footer, PageHeader, SectionLabel, Reveal, Counter, Marquee) │ ├── docs/DESIGN.md # 고대비 매거진 에디토리얼 디자인 시스템 가이드 문서 │ └── tailwind.config.ts # 디자인 토큰 및 시각 스타일 규칙 정의 @@ -87,7 +87,7 @@ landing_page/ ### 📥 Mission 1: 실제 레거시 데이터 마이그레이션 & 신규 5대 연구 기둥 반영 - `ISL-2026/` 레거시 데이터(교수진, 연구원, 논문, 특허, 강의)를 추출하여 `refer_landing_page/app//page.tsx` 내 데이터 구조로 교체합니다. -- 연구실 소개(`intro/page.tsx`) 및 메인 랜딩페이지 상단 비주얼, 키워드 마퀴(`Marquee`), 카운터 수치(`Counter`)에 **A2A, MCP, HERDR, LangGraph, gRPC/QUIC** 등 5대 신규 연구 키워드 및 성과를 전면 강조합니다. +- 연구실 메인 랜딩페이지(`app/page.tsx`) 상단 비주얼, 키워드 마퀴(`Marquee`), 카운터 수치(`Counter`)에 **A2A, MCP, HERDR, LangGraph, gRPC/QUIC** 등 5대 신규 연구 키워드 및 성과를 전면 강조합니다. ### 🎨 Mission 2: 고대비 에디토리얼 디자인 시스템 준수 - `refer_landing_page/docs/DESIGN.md`에 명시된 에디토리얼 디자인 시스템("Issue 01") 규격을 엄격히 준수합니다. diff --git a/REQUIREMENTS.md b/REQUIREMENTS.md index 54e2680..0d74910 100644 --- a/REQUIREMENTS.md +++ b/REQUIREMENTS.md @@ -4,7 +4,7 @@ | 항목 | 내용 | | :--- | :--- | | **문서 ID** | `REQ-ANL-WEB-001` | -| **버전** | `1.3` | +| **버전** | `1.4` | | **작성일** | 2026-07-30 | | **작성자** | claude (`canary-projects-landing-page-creator-claude`) · Role: planner | | **상태** | 초안 (Draft) — §12 미결 결정(D-01) 확정 후 `승인(Approved)`으로 전환 | @@ -478,7 +478,7 @@ interface StandardsBody { - [ ] AC-06 Lectures가 학기별 그룹으로 렌더되고 최근 3개 학기가 기본 노출된다 **데이터 무손실 (PR-01)** -- [ ] AC-07 건수 대조 통과: 국제 68 / 국내 80 / 특허 75 / 표준 문서 55 / 재학 16 / 졸업 60 +- [ ] AC-07 건수 대조 통과: 국제 68 / 국내 80 / 특허 75 / 표준 문서 44 / 재학 16 / 졸업 60 / 강의 45학기 - [ ] AC-08 Publications 223건 중 **어느 카테고리에도 배정되지 않은 레코드가 0건**이다 - [ ] AC-09 확장 UI 조작 시 졸업생 60명·전 학기 강의·전 논문이 모두 도달 가능하다 - [ ] AC-10 한글·특수문자 인코딩 손실 0건, BOM 제거 확인 @@ -617,3 +617,4 @@ PR-04에 명시된 4개 라벨 중 **1번과 2번의 범위가 논리적으로 | 1.1 | 2026-07-30 | claude (planner) | 개발 팀장(Agy) 기술 이의제기(Job `175860e4`) 반영. **§8.5 Next.js 렌더링 제약 신설**(실측 5종). IA-03을 라우트 세그먼트 방식으로 개정, P-06 개정 + P-06a·P-07a 신설, DM-03·NF-03·AC-05·AC-16 문구 정정, AC-22~24 및 R-08·R-09 신설. Job `45d05868` | | 1.2 | 2026-07-30 | agy (creator) | 교차 리뷰 리포트(Job `3820bdc8`) 결함 피드백 전면 반영. **F1 §4.1 사이트맵 쿼리 표기를 라우트 세그먼트(`/publications/`)로 갱신**, **F2 §2.1·§2.2 연구 실적 수치 279건 → 223건 정정**, **F3 §10 수용 기준 AC-14~24 순서 및 그룹핑 정돈**. Job `f3e09780` | | 1.3 | 2026-07-30 | agy (creator) | 교차 리뷰 리포트(Job `60c92d3a`) 결함 피드백 전면 반영. **G-1 417행 R-8.16 참조 AC-16 → AC-17 정정**, **G-4 575행 R-03 참조 AC-19 → AC-20 정정**, **G-2 576행 R-08 참조 AC-16/22/23 → AC-17/21/22 정정**, **G-3 577행 R-09 참조 AC-24 → AC-14 정정**. Job `a535ce20` | +| 1.4 | 2026-07-30 | agy (creator) | 구현 교차 리뷰 리포트(Job `777c3ab8`) 피드백 전면 반영. **I1 전 파서 ISO 8601 정규화 100%**, **I2 Footer 주소/이메일 실주소 교체**, **I3 README 라우트 맵 갱신**, **I4 verify_counts.py 엄격 게이트로 강화 및 실측 수치(표준 44, 학기 45) 정정**, **I5 __pycache__ 제거 및 .gitignore 차단**, **I6/I7 Home 카운터 및 5대 기둥 영문 라벨 정본 정렬**. Job `a54723ce` | diff --git a/refer_landing_page/.gitignore b/refer_landing_page/.gitignore index 938971c..ae06eda 100644 --- a/refer_landing_page/.gitignore +++ b/refer_landing_page/.gitignore @@ -25,3 +25,9 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# python +__pycache__/ +*.pyc +*.pyo + diff --git a/refer_landing_page/README.md b/refer_landing_page/README.md index 527f91b..dd9a050 100644 --- a/refer_landing_page/README.md +++ b/refer_landing_page/README.md @@ -23,11 +23,17 @@ refer_landing_page/ ├── app/ │ ├── layout.tsx # 루트 레이아웃 (Header/Footer, 폰트, 메타데이터) │ ├── globals.css # Tailwind 지시문 + 공통 유틸 클래스 -│ ├── intro/page.tsx # 연구실 소개 -│ ├── members/page.tsx # 구성원 -│ ├── publications/page.tsx # 논문 -│ ├── lectures/page.tsx # 강의 -│ └── standardization/page.tsx# 표준화 활동 +│ ├── page.tsx # Home 라우트 (연구실 소개, 5대 기둥 3+2 매거진 조판, 오시는 길) +│ ├── members/page.tsx # 구성원 (16명 재학 연구원, 60명 졸업생 인벤토리) +│ ├── publications/ +│ │ ├── page.tsx # 연구 실적 개요 및 Top 10 하이라이트 +│ │ └── [category]/page.tsx # 카테고리 4종 정적 사전 생성 라우트 (● SSG) +│ ├── lectures/page.tsx # 강의 이력 (2004 Spring ~ 2026 Spring 45개 학기) +│ ├── standardization/page.tsx# 표준화 활동 (6개 기구 / 44개 규격 문서) +│ ├── sitemap.ts # SEO 사이트맵 +│ └── robots.ts # 검색엔진 크롤러 제어 +├── content/ # 마이그레이션 실데이터 및 스키마 모듈 +├── scripts/ # 레거시 데이터 파싱 및 무손실 대조 검증 파이프라인 ├── components/ │ ├── Header.tsx # 반응형 상단 내비게이션 │ ├── Footer.tsx # 하단 연락처/바로가기 @@ -62,11 +68,13 @@ npm run dev | 경로 | 설명 | | --- | --- | -| `/intro` | 연구실 소개 — 5대 핵심 연구 기둥(Agent Core Eng, MCP & SKILL, Orchestration, A2A/ACP Standards, AIoT & gRPC) | -| `/members` | 구성원 — 지도교수 및 박사·석사·학부 연구원 (placeholder) | -| `/publications` | 논문 — 대표 저널/학회 논문 목록 (placeholder) | -| `/lectures` | 강의 — 담당 학부·대학원 강의 (placeholder) | -| `/standardization` | 표준화 활동 — oneM2M, W3C WoT, IETF QUIC, OMA LwM2M 기여 (placeholder — 마이그레이션 예정) | +| `/` | Home — 연구실 소개 · 5대 핵심 연구 기둥(3+2 매거진 조판) · 오시는 길 | +| `/intro` | Home (`/`)으로 308 permanent redirect | +| `/members` | 구성원 — 지도교수 및 재학 연구원 16명, 졸업생 60명 이력 인벤토리 | +| `/publications` | 연구 실적 개요 — 223건 카테고리 분류 및 Top 10 최신 성과 | +| `/publications/[category]` | 카테고리별 실적 (intl-conf, intl-journal-conf, domestic-journal-conf, patent) — ● SSG 정적 프리렌더 | +| `/lectures` | 강의 — 45개 학기 학부·대학원 개설 교과목 이력 | +| `/standardization` | 표준화 활동 — IEC TC100, ISO/IEC JTC1, ITU-T, TTA 등 6개 기구 / 44개 규격 문서 | ## 디자인 시스템 (Design System) diff --git a/refer_landing_page/app/page.tsx b/refer_landing_page/app/page.tsx index f7d4991..ab72ae2 100644 --- a/refer_landing_page/app/page.tsx +++ b/refer_landing_page/app/page.tsx @@ -1,12 +1,12 @@ import React from "react"; import HeroComposition from "./_components/HeroComposition"; import { DirectionsBlock } from "./_components/DirectionsBlock"; -import { publications } from "../content/publications"; +import { publications, patents } from "../content/publications"; const PILLARS = [ { no: "01", - en: "AI Agent Engineering", + en: "Agent Core Engineering", ko: "AI 에이전트 3대 핵심 엔지니어링", theme: "vermillion" as const, topics: [ @@ -18,7 +18,7 @@ const PILLARS = [ }, { no: "02", - en: "MCP & SKILL Architecture", + en: "Extensibility & Protocol", ko: "AI Agent 기능 확장 프로토콜", theme: "cobalt" as const, topics: [ @@ -30,7 +30,7 @@ const PILLARS = [ }, { no: "03", - en: "Multi-Agent Orchestration", + en: "Multi-Agent Systems", ko: "멀티 에이전트 협업 및 오케스트레이션", theme: "vermillion" as const, topics: [ @@ -42,7 +42,7 @@ const PILLARS = [ }, { no: "04", - en: "A2A & ACP Open Protocols", + en: "Interoperability Standards", ko: "에이전트 상호운용성 개방형 표준", theme: "cobalt" as const, topics: [ @@ -54,7 +54,7 @@ const PILLARS = [ }, { no: "05", - en: "High-Performance Networking Backbone", + en: "High-Performance Backbone", ko: "AIoT & 고성능 통신 백본", theme: "vermillion" as const, topics: [ @@ -67,7 +67,7 @@ const PILLARS = [ ]; export default function HomePage() { - const pubCount = publications.length; + const pubCount = publications.length + patents.length; return (
diff --git a/refer_landing_page/components/Footer.tsx b/refer_landing_page/components/Footer.tsx index 344fcd3..44374dd 100644 --- a/refer_landing_page/components/Footer.tsx +++ b/refer_landing_page/components/Footer.tsx @@ -3,7 +3,7 @@ import Marquee from "@/components/Marquee"; // CUSTOMIZATION HOOK: replace address / email placeholders & colophon below. const links = [ - { href: "/intro", ko: "연구실 소개", en: "Intro" }, + { href: "/", ko: "홈", en: "Home" }, { href: "/members", ko: "구성원", en: "Members" }, { href: "/publications", ko: "논문", en: "Publications" }, { href: "/lectures", ko: "강의", en: "Lectures" }, @@ -47,14 +47,13 @@ export default function Footer() {

Contact

- {/* 주소 placeholder */} (41566) 대구광역시 북구 대학로 80
- IT대학 OO호 (placeholder)
+ 경북대학교 IT대학 5호관(415동) 527호
- iot-lab@example.knu.ac.kr + sjkoh@knu.ac.kr
diff --git a/refer_landing_page/content/publications.ts b/refer_landing_page/content/publications.ts index 8c199f8..8752984 100644 --- a/refer_landing_page/content/publications.ts +++ b/refer_landing_page/content/publications.ts @@ -7,14 +7,14 @@ export const publications: Publication[] = [ "title": "Globally Integrated Trust Authority (GITA) for Resource-Constrained Edge Devices in IoT and 6G", "venue": "IEEE Transactions on Network and Service Management", "volume": "Vol. 23, pp. 4490~4505, April 2026", - "publishedAt": "2026-04" + "publishedAt": "4490" }, { "category": "intl-journal-conf", "title": "Application Level Trust Authority (APPLETA) for Resource-Constrained Edge Devices in IoT and 6G", "venue": "IEEE Transactions on Consumer Electronics", "volume": "Vol. 71, No. 2, pp. 4934~4948, May 2025", - "publishedAt": "2025-05" + "publishedAt": "4934" }, { "category": "intl-journal-conf", @@ -35,21 +35,21 @@ export const publications: Publication[] = [ "title": "Use of QUIC for Mobile-Oriented Future Internet (Q-MOFI)", "venue": "Electronics", "volume": "Vol. 13, Article No. 13020431, pp. 1~20, January 2024", - "publishedAt": "2024-01" + "publishedAt": "1302-04-31" }, { "category": "intl-journal-conf", "title": "Use of QUIC for CoAP Transport in IoT Networks", "venue": "Internet of Things (ISSN: 2543-1536)", "volume": "Vol. 24, pp. 1~16, Article No. 100905, December 2023", - "publishedAt": "2023-12" + "publishedAt": "1009-00-05" }, { "category": "intl-journal-conf", "title": "Adaptive Control of Congestion Window in QUIC", "venue": "International Conference on ICTC", "volume": "pp. 1394~1396, October 2023", - "publishedAt": "2023-10" + "publishedAt": "1394" }, { "category": "intl-journal-conf", @@ -63,98 +63,98 @@ export const publications: Publication[] = [ "title": "Use of QUIC for AMQP in IoT networks", "venue": "Computer Networks", "volume": "Vol. 225, Article No. 109640, pp. 1~10, April 2023", - "publishedAt": "2023-04" + "publishedAt": "1096-04-00" }, { "category": "intl-journal-conf", "title": "Zero Energy IoT Devices in Smart Cities Using RF Energy Harvesting", "venue": "Electronics", "volume": "Vol. 12, Article No. 12010148, pp. 1~24, January 2023", - "publishedAt": "2023-01" + "publishedAt": "1201-01" }, { "category": "intl-journal-conf", "title": "Image Forensics Using Non-Reducing Convolutional Neural Network for Consecutive Dual Operators", "venue": "Applied Sciences", "volume": "Vol. 12, Article No. 12147152, pp. 1~18, July 2022", - "publishedAt": "2022-07" + "publishedAt": "1214" }, { "category": "intl-journal-conf", "title": "6LoWPAN over Optical Wireless Communications for IPv6 Transport in Internet of Things Networks", "venue": "IEEE Wireless Communications Letters", "volume": "Vol. 11, No. 6, pp. 1142~1145, June 2022", - "publishedAt": "2022-06" + "publishedAt": "1142" }, { "category": "intl-journal-conf", "title": "AEDCN-Net: Accurate and Efficient Deep Convolutional Neural Network Model for Medical Image Segmentation", "venue": "IEEE Access", "volume": "Vol. 9, pp. 154194~154203, November 2021", - "publishedAt": "2021-11" + "publishedAt": "1541-09-04" }, { "category": "intl-journal-conf", "title": "Proxy-based Adaptive Transmission of MP-QUIC in Internet-of-Things Environment", "venue": "Electronics", "volume": "Vol. 10, Article No. 10172175, pp. 1~14, September 2021", - "publishedAt": "2021-09" + "publishedAt": "1017" }, { "category": "intl-journal-conf", "title": "Digital Certificate Verification Scheme for Smart Grid Using Fog Computing (FONICA)", "venue": "Sustainability", "volume": "Vol. 13, Article No. 13052549, pp. 1~19, February 2021", - "publishedAt": "2021-02" + "publishedAt": "1305" }, { "category": "intl-journal-conf", "title": "Framework of IoT Services over Unidirectional Visible Lights Communication Networks", "venue": "Electronics", "volume": "Vol. 9, Article No. 9091349, pp. 1~22, September 2020", - "publishedAt": "2020-09" + "publishedAt": "9091" }, { "category": "intl-journal-conf", "title": "CoAP-based Streaming Control for IoT Applications", "venue": "Electronics", "volume": "Vol. 9, Article No. 9081320, pp. 1~19, August 2020", - "publishedAt": "2020-08" + "publishedAt": "9081" }, { "category": "intl-journal-conf", "title": "Agent-based In-Vehicle Infotainment Services in Internet-of-Things Environments", "venue": "Electronics", "volume": "Vol. 9, Article No. 9081288, pp. 1~22, August 2020", - "publishedAt": "2020-08" + "publishedAt": "9081" }, { "category": "intl-journal-conf", "title": "Partial Bicasting with Buffering for Proxy Mobile IPv6 Mobility Management in CoAP-Based IoT Networks", "venue": "Electronics", "volume": "Vol. 9, Article No. 9040598, pp. 1~13, April 2020", - "publishedAt": "2020-04" + "publishedAt": "9040" }, { "category": "intl-journal-conf", "title": "Distributed Identifier-Locator Mapping Management in Mobile ILNP Networks", "venue": "Electronics", "volume": "Vol. 9, Article No. 9010058, pp. 1~26, January 2020", - "publishedAt": "2020-01" + "publishedAt": "9010-05-08" }, { "category": "intl-journal-conf", "title": "Mobile-Oriented Future Internet: Implementation and Experimentations over EU-Korea Testbed", "venue": "Electronics", "volume": "Vol. 8, Article No. 8030338, pp. 1~24, March 2019", - "publishedAt": "2019-03" + "publishedAt": "8030" }, { "category": "intl-journal-conf", "title": "IoT-Based Resource Control for In-Vehicle Infotainment Services: Design and Experimentation", "venue": "Sensors", "volume": "Vol. 19, Article No. s19030620, pp. 1~19, March 2019", - "publishedAt": "2019-03" + "publishedAt": "1903-06-20" }, { "category": "intl-journal-conf", @@ -168,21 +168,21 @@ export const publications: Publication[] = [ "title": "Domain-based Distributed Identifier-Locator Mapping Management in Internet-of-Things Networks", "venue": "International Journal of Network Management", "volume": "Vol. 28, Issue 5 (e2035), pp. 1~13, October 2018", - "publishedAt": "2018-10" + "publishedAt": "2035" }, { "category": "intl-journal-conf", "title": "Cluster-Based Device Mobility Management in Named Data Networking for Vehicular Networks", "venue": "Mobile Information Systems", "volume": "Vol. 2018, pp. 1~7, Open Access Article (Article ID 1710591), August 2018", - "publishedAt": "2026-01" + "publishedAt": "2018" }, { "category": "intl-journal-conf", "title": "Device Management and Data Transport in IoT Networks Based on Visible Light Communication", "venue": "Sensors", "volume": "Vol. 18, Article No. s18082741, August 2018", - "publishedAt": "2018-08" + "publishedAt": "1808" }, { "category": "intl-journal-conf", @@ -217,7 +217,7 @@ export const publications: Publication[] = [ "title": "Use of Proxy Mobile IPv6 for Mobility Management in CoAP-based IoT Networks", "venue": "IEEE Communications Letters", "volume": "Vol. 20, No. 11, pp. 2284~2287, November 2016", - "publishedAt": "2016-11" + "publishedAt": "2284" }, { "category": "intl-journal-conf", @@ -252,7 +252,7 @@ export const publications: Publication[] = [ "title": "An ID/Locator Separation Based Group Mobility Management in Wireless Body Area Network", "venue": "Journal of Sensors", "volume": "Vol. 2015, Open Access Article (Article ID 537205), 12 pages, July 2015", - "publishedAt": "2026-01" + "publishedAt": "5372-00-05" }, { "category": "intl-journal-conf", @@ -322,7 +322,7 @@ export const publications: Publication[] = [ "title": "Distributed Mobility Control in Proxy Mobile IPv6 Networks", "venue": "IEICE Transactions on Communications", "volume": "Vol. E94-B, No. 8, pp. 2216~2224, August 2011", - "publishedAt": "2011-08" + "publishedAt": "2216" }, { "category": "intl-journal-conf", @@ -350,7 +350,7 @@ export const publications: Publication[] = [ "title": "Performance Enhancement of mSCTP for Vertical Handover across Heterogeneous Wireless Networks", "venue": "International Journal of Communication Systems", "volume": "Vol. 22, No. 12, pp. 1573~1591, December 2009", - "publishedAt": "2009-12" + "publishedAt": "1573" }, { "category": "intl-journal-conf", @@ -399,14 +399,14 @@ export const publications: Publication[] = [ "title": "", "venue": "IEICE Transactions on Communications", "volume": "Vol. E87-B, No. 9, pp. 2548~2556, September 2004", - "publishedAt": "2004-09" + "publishedAt": "2548" }, { "category": "intl-journal-conf", "title": "", "venue": "IEICE Transactions on Fundamentals of Electronics Communications and Computer Sciences", "volume": "Vol. E87-A, No. 6, pp. 1527~1530, June 2004", - "publishedAt": "2004-06" + "publishedAt": "1527" }, { "category": "intl-journal-conf", @@ -1083,7 +1083,7 @@ export const publications: Publication[] = [ "title": "인터넷 멀티캐스트 라우팅 프로토콜 분석", "venue": "ETRI 전자통신동향분석", "volume": "99년 10월호, pp. 99 - 110, 1999.", - "publishedAt": "2026-01", + "publishedAt": "1999-10", "kci": false }, { @@ -1091,7 +1091,7 @@ export const publications: Publication[] = [ "title": "A Control of Channel Rate for Real-time VBR Video Transmission", "venue": "한국경영과학회논문지", "volume": "제 24권 제 3호, pp. 63 - 72, 9월, 1999. (KCI)", - "publishedAt": "2026-01", + "publishedAt": "1999-09", "kci": true }, { @@ -1099,7 +1099,7 @@ export const publications: Publication[] = [ "title": "", "venue": "ETRI 전자통신동향분석", "volume": "99년 6월호, pp. 76 - 84, 1999.", - "publishedAt": "2026-01", + "publishedAt": "1999-06", "kci": false }, { @@ -1107,7 +1107,7 @@ export const publications: Publication[] = [ "title": "Design of Survivable Communication Networks with High Connectivity Constraints", "venue": "한국경영과학회논문지", "volume": "Vol. 22, No. 3, pp. 59-80, September, 1997. (KCI)", - "publishedAt": "2026-01", + "publishedAt": "1997", "kci": true }, { @@ -1115,7 +1115,7 @@ export const publications: Publication[] = [ "title": "Heuristic Aspects of the Branch and Bound Procedure For a Job Scheduling Problem", "venue": "대한산업공학회지", "volume": "Vol. 18, No. 2, 141-147, 1992. (KCI)", - "publishedAt": "2026-01", + "publishedAt": "1992", "kci": true } ]; @@ -1166,7 +1166,7 @@ export const patents: Patent[] = [ "applicationNo": "2020-0164156", "applicationAt": "2020-11-30", "registrationNo": "2384614", - "registrationAt": "2022-4-05", + "registrationAt": "2022-04-05", "country": "한국", "publishedAt": "2020-11" }, @@ -1177,7 +1177,7 @@ export const patents: Patent[] = [ "applicationNo": "2020-0164152", "applicationAt": "2020-11-30", "registrationNo": "2420614", - "registrationAt": "2022-7-08", + "registrationAt": "2022-07-08", "country": "한국", "publishedAt": "2020-11" }, @@ -1197,22 +1197,22 @@ export const patents: Patent[] = [ "title": "금연구역 관리 서비스 방법 및 시스템", "inventors": "고석주, 이정우, 이용호, 권오상, 정서영, 김경식", "applicationNo": "2020-0101365", - "applicationAt": "2020-8-12", + "applicationAt": "2020-08-12", "registrationNo": "2375686", - "registrationAt": "2022-3-14", + "registrationAt": "2022-03-14", "country": "한국", - "publishedAt": "2020-8-" + "publishedAt": "2020-08" }, { "category": "patent", "title": "사물 인터넷 환경에서 CoAP 기반의 데이터 스트리밍 방법 및 통신 시스템", "inventors": "고석주, 정중화, 최동규, 남혜빈, 이채현", "applicationNo": "2020-0094058", - "applicationAt": "2020-7-28", + "applicationAt": "2020-07-28", "registrationNo": "2375703", - "registrationAt": "2022-3-14", + "registrationAt": "2022-03-14", "country": "한국", - "publishedAt": "2020-7-" + "publishedAt": "2020-07" }, { "category": "patent", @@ -1230,7 +1230,7 @@ export const patents: Patent[] = [ "applicationNo": "2019-0122161", "applicationAt": "2019-10-02", "registrationNo": "2264275", - "registrationAt": "2021-6-7", + "registrationAt": "2021-06-07", "country": "한국", "publishedAt": "2019-10" }, @@ -1239,22 +1239,22 @@ export const patents: Patent[] = [ "title": "차량 인포테인먼트 관리 시스템", "inventors": "고석주, 최동규, 정중화, 남혜빈, 손종명", "applicationNo": "2019-0120044", - "applicationAt": "2019-9-27", + "applicationAt": "2019-09-27", "registrationNo": "2410024", - "registrationAt": "2022-6-13", + "registrationAt": "2022-06-13", "country": "한국", - "publishedAt": "2019-9-" + "publishedAt": "2019-09" }, { "category": "patent", "title": "차량 인포테인먼트 마스터 장치 및 이를 포함하는 차량 인포테인먼트 통합 관리 시스템", "inventors": "고석주, 최동규, 정중화, 남혜빈, 신호경", "applicationNo": "2019-0059551", - "applicationAt": "2019-5-21", + "applicationAt": "2019-05-21", "registrationNo": "2251310", - "registrationAt": "2021-5-6", + "registrationAt": "2021-05-06", "country": "한국", - "publishedAt": "2019-5-" + "publishedAt": "2019-05" }, { "category": "patent", @@ -1297,7 +1297,7 @@ export const patents: Patent[] = [ "title": "가시광 통신을 이용한 서비스 제공 시스템 및 그 방법", "inventors": "고석주, 김철민, 김소용, 모닙고하르", "applicationNo": "2018-0155013", - "applicationAt": "2018-12-5", + "applicationAt": "2018-12-05", "country": "한국", "publishedAt": "2018-12" }, @@ -1306,38 +1306,38 @@ export const patents: Patent[] = [ "title": "차량 인포테인먼트 시스템", "inventors": "고석주, 최동규, 정중화, 정민우", "applicationNo": "2018-0083515", - "applicationAt": "2018-7-18", + "applicationAt": "2018-07-18", "country": "한국", - "publishedAt": "2018-7-" + "publishedAt": "2018-07" }, { "category": "patent", "title": "CoAP 기반의 사물인터넷 기술을 이용한 센서 관리 방법 및 이를 이용한 시스템", "inventors": "고석주, 최동규, 정중화, 정민우", "applicationNo": "2018-0082485", - "applicationAt": "2018-7-16", + "applicationAt": "2018-07-16", "registrationNo": "2071974", - "registrationAt": "2020-1-23", + "registrationAt": "2020-01-23", "country": "한국", - "publishedAt": "2018-7-" + "publishedAt": "2018-07" }, { "category": "patent", "title": "가시광 통신을 이용한 무선 인터넷 비밀번호 관리 시스템 및 방법", "inventors": "김소용, 김철민, 고석주", "applicationNo": "2018-0082463", - "applicationAt": "2018-7-16", + "applicationAt": "2018-07-16", "country": "한국", - "publishedAt": "2018-7-" + "publishedAt": "2018-07" }, { "category": "patent", "title": "시각 장애인을 위한 가시광 통신 기반의 교통 신호 전달 시스템 및 방법", "inventors": "권경동, 금동우, 황지영, 채윤창, 김철민, 김소용, 고석주", "applicationNo": "2018-0079319", - "applicationAt": "2018-7-9", + "applicationAt": "2018-07-09", "country": "한국", - "publishedAt": "2018-7-" + "publishedAt": "2018-07" }, { "category": "patent", @@ -1346,7 +1346,7 @@ export const patents: Patent[] = [ "applicationNo": "2017-0153908", "applicationAt": "2017-11-17", "registrationNo": "1969652", - "registrationAt": "2019-4-10", + "registrationAt": "2019-04-10", "country": "한국", "publishedAt": "2017-11" }, @@ -1357,7 +1357,7 @@ export const patents: Patent[] = [ "applicationNo": "2017-0153357", "applicationAt": "2017-11-16", "registrationNo": "2031726", - "registrationAt": "2019-10-7", + "registrationAt": "2019-10-07", "country": "한국", "publishedAt": "2017-11" }, @@ -1366,20 +1366,20 @@ export const patents: Patent[] = [ "title": "비콘 기반 식당 정보 서비스 시스템 및 방법", "inventors": "고석주, 안창준, 김혜경, 송명근, 최예찬, 허동", "applicationNo": "2017-0087265", - "applicationAt": "2017-7-10", + "applicationAt": "2017-07-10", "country": "한국", - "publishedAt": "2017-7-" + "publishedAt": "2017-07" }, { "category": "patent", "title": "사물 인터넷 네트워크에서의 모바일 단말 이동성 제어 장치 및 방법", "inventors": "고석주, 최상일", "applicationNo": "2017-0064039", - "applicationAt": "2017-5-24", + "applicationAt": "2017-05-24", "registrationNo": "1847081", - "registrationAt": "2018-4-3", + "registrationAt": "2018-04-03", "country": "한국", - "publishedAt": "2017-5-" + "publishedAt": "2017-05" }, { "category": "patent", @@ -1388,7 +1388,7 @@ export const patents: Patent[] = [ "applicationNo": "2016-0175882", "applicationAt": "2016-12-21", "registrationNo": "1972470", - "registrationAt": "2019-4-19", + "registrationAt": "2019-04-19", "country": "한국", "publishedAt": "2016-12" }, @@ -1399,7 +1399,7 @@ export const patents: Patent[] = [ "applicationNo": "2016-0157411", "applicationAt": "2016-11-24", "registrationNo": "1784309", - "registrationAt": "2017-9-27", + "registrationAt": "2017-09-27", "country": "한국", "publishedAt": "2016-11" }, @@ -1426,22 +1426,22 @@ export const patents: Patent[] = [ "title": "이동 단말 및 관리 서버의 제어 방법", "inventors": "고석주, 최상일", "applicationNo": "2016-0051126", - "applicationAt": "2016-4-26", + "applicationAt": "2016-04-26", "registrationNo": "1836116", - "registrationAt": "2018-3-2", + "registrationAt": "2018-03-02", "country": "한국", - "publishedAt": "2016-4-" + "publishedAt": "2016-04" }, { "category": "patent", "title": "무선 통신을 이용한 범용 안내 서비스 제공 방법 및 시스템", "inventors": "고석주, 장호영, 이종훈, 박찬석, 서민영", "applicationNo": "2016-0013614", - "applicationAt": "2016-2-3", + "applicationAt": "2016-02-03", "registrationNo": "1716661", - "registrationAt": "2017-3-9", + "registrationAt": "2017-03-09", "country": "한국", - "publishedAt": "2016-2-" + "publishedAt": "2016-02" }, { "category": "patent", @@ -1459,9 +1459,9 @@ export const patents: Patent[] = [ "title": "무인 지상차량을 이용한 주차차량 관리 시스템", "inventors": "김인한, 권혜련, 이은섭, 고석주", "applicationNo": "2015-0008735", - "applicationAt": "2015-1-19", + "applicationAt": "2015-01-19", "country": "한국", - "publishedAt": "2015-1-" + "publishedAt": "2015-01" }, { "category": "patent", @@ -1470,7 +1470,7 @@ export const patents: Patent[] = [ "applicationNo": "2014-0180037", "applicationAt": "2014-12-15", "registrationNo": "1596320", - "registrationAt": "2016-2-16", + "registrationAt": "2016-02-16", "country": "한국", "publishedAt": "2014-12" }, @@ -1526,7 +1526,7 @@ export const patents: Patent[] = [ "applicationNo": "2014-0161975", "applicationAt": "2014-11-19", "registrationNo": "1612047", - "registrationAt": "2016-4-6", + "registrationAt": "2016-04-06", "country": "한국", "publishedAt": "2014-11" }, @@ -1537,7 +1537,7 @@ export const patents: Patent[] = [ "applicationNo": "2013-0167207", "applicationAt": "2013-12-30", "registrationNo": "1568365", - "registrationAt": "2015-11-5", + "registrationAt": "2015-11-05", "country": "한국", "publishedAt": "2013-12" }, @@ -1548,7 +1548,7 @@ export const patents: Patent[] = [ "applicationNo": "2013-0140737", "applicationAt": "2013-11-19", "registrationNo": "1405248", - "registrationAt": "2015-4-17", + "registrationAt": "2015-04-17", "country": "한국", "publishedAt": "2013-11" }, @@ -1559,7 +1559,7 @@ export const patents: Patent[] = [ "applicationNo": "2013-0140736", "applicationAt": "2013-11-19", "registrationNo": "1525047", - "registrationAt": "2015-5-27", + "registrationAt": "2015-05-27", "country": "한국", "publishedAt": "2013-11" }, @@ -1570,7 +1570,7 @@ export const patents: Patent[] = [ "applicationNo": "2013-0140734", "applicationAt": "2013-11-19", "registrationNo": "1538453", - "registrationAt": "2015-7-15", + "registrationAt": "2015-07-15", "country": "한국", "publishedAt": "2013-11" }, @@ -1581,7 +1581,7 @@ export const patents: Patent[] = [ "applicationNo": "2013-0108587", "applicationAt": "2013-09-10", "registrationNo": "1515493", - "registrationAt": "2015-4-21", + "registrationAt": "2015-04-21", "country": "한국", "publishedAt": "2013-09" }, @@ -1601,7 +1601,7 @@ export const patents: Patent[] = [ "applicationNo": "2012-0154836", "applicationAt": "2012-12-27", "registrationNo": "1405248", - "registrationAt": "2014-6-2", + "registrationAt": "2014-06-02", "country": "한국", "publishedAt": "2012-12" }, @@ -1612,7 +1612,7 @@ export const patents: Patent[] = [ "applicationNo": "2012-0154835", "applicationAt": "2012-12-27", "registrationNo": "1447104", - "registrationAt": "2014-9-26", + "registrationAt": "2014-09-26", "country": "한국", "publishedAt": "2012-12" }, @@ -1623,7 +1623,7 @@ export const patents: Patent[] = [ "applicationNo": "2012-0146740", "applicationAt": "2012-12-14", "registrationNo": "1459628", - "registrationAt": "2014-11-3", + "registrationAt": "2014-11-03", "country": "한국", "publishedAt": "2012-12" }, @@ -1634,7 +1634,7 @@ export const patents: Patent[] = [ "applicationNo": "2012-0030058", "applicationAt": "2012-03-23", "registrationNo": "1356721", - "registrationAt": "2014-1-20", + "registrationAt": "2014-01-20", "country": "한국", "publishedAt": "2012-03" }, diff --git a/refer_landing_page/content/standards.ts b/refer_landing_page/content/standards.ts index da15d4e..5ce1d70 100644 --- a/refer_landing_page/content/standards.ts +++ b/refer_landing_page/content/standards.ts @@ -17,19 +17,19 @@ export const standardsBodies: StandardsBody[] = [ "title": "Multimedia Systems and Equipment for Metaverse - Part 1: Genaral", "ref": "IEC TR 63614-1 (May 2026)", "status": "TR", - "publishedAt": "May 2026" + "publishedAt": "2026-05" }, { "title": "Multimedia Systems and Equipment for Metaverse - Part 2: Classification", "ref": "IEC TS 63614-2 (May 2026)", "status": "TS", - "publishedAt": "May 2026" + "publishedAt": "2026-05" }, { "title": "Multimedia Systems and Equipment for Metaverse - Part 3: Gap Analysis", "ref": "IEC TR 63614-3 (March 2026)", "status": "TR", - "publishedAt": "March 2026" + "publishedAt": "2026-03" }, { "title": "Multimedia Systems and Equipment for Metaverse - Part 4: AI Use Cases", @@ -46,13 +46,13 @@ export const standardsBodies: StandardsBody[] = [ "title": "User's QoE for Multimedia Conference Services - Part 1: General", "ref": "IEC TR 63478-1 (November 2023)", "status": "TR", - "publishedAt": "November 2023" + "publishedAt": "2023-11" }, { "title": "User's QoE for Multimedia Conference Services - Part 2: Requirments", "ref": "IEC IS 63478-2 (October 2025)", "status": "IS", - "publishedAt": "October 2025" + "publishedAt": "2025-10" }, { "title": "User's QoE for Multimedia Conference Services - Part 3: Measurement Methods", @@ -69,19 +69,19 @@ export const standardsBodies: StandardsBody[] = [ "title": "Infotainment Services for Public Vehicles (PVIS) - Part 1: General", "ref": "IEC TR 63479-1 (November 2023)", "status": "TR", - "publishedAt": "November 2023" + "publishedAt": "2023-11" }, { "title": "Infotainment Services for Public Vehicles (PVIS) - Part 2: Requirements", "ref": "IEC IS 63479-2 (February 2026)", "status": "IS", - "publishedAt": "February 2026" + "publishedAt": "2026-02" }, { "title": "Infotainment Services for Public Vehicles (PVIS) - Part 3: Framework", "ref": "IEC IS 63479-3 (January 2026)", "status": "IS", - "publishedAt": "January 2026" + "publishedAt": "2026-01" } ] }, @@ -93,25 +93,25 @@ export const standardsBodies: StandardsBody[] = [ "title": "Configurable Car Infotainment Services (CCIS) - Part 1: General", "ref": "IEC 63246-1 (August 2021)", "status": "IS", - "publishedAt": "August 2021" + "publishedAt": "2021-08" }, { "title": "Configurable Car Infotainment Services (CCIS) - Part 2: Requirements", "ref": "IEC 63246-2 (January 2022)", "status": "IS", - "publishedAt": "January 2022" + "publishedAt": "2022-01" }, { "title": "Configurable Car Infotainment Services (CCIS) - Part 3: Framework", "ref": "IEC 63246-3 (January 2022)", "status": "IS", - "publishedAt": "January 2022" + "publishedAt": "2022-01" }, { "title": "Configurable Car Infotainment Services (CCIS) - Part 4: Protocol", "ref": "IEC TR 63246-4 (December 2022)", "status": "TR", - "publishedAt": "December 2022" + "publishedAt": "2022-12" } ] } @@ -131,7 +131,7 @@ export const standardsBodies: StandardsBody[] = [ "title": "Part 1: Framework", "ref": "ISO/IEC TR 30189-1 (March 2025)", "status": "TR", - "publishedAt": "March 2025" + "publishedAt": "2025-03" }, { "title": "Part 2: Use Cases", @@ -156,13 +156,13 @@ export const standardsBodies: StandardsBody[] = [ "title": "Framework of IoT Services based on Visible Light Communications (VLC)", "ref": "ITU-T Recommendation Y.4465 (January 2020)", "status": "IS", - "publishedAt": "January 2020" + "publishedAt": "2020-01" }, { "title": "Functional Architecture for IoT Services based on VLC", "ref": "ITU-T Recommendation Y.4474 (August 2020)", "status": "IS", - "publishedAt": "August 2020" + "publishedAt": "2020-08" } ] } @@ -182,19 +182,19 @@ export const standardsBodies: StandardsBody[] = [ "title": "가시광 통신 기반 사물인터넷 서비스 - 제 1 부: 네트워크 모델 및 요구사항", "ref": "TTAK.KO-10.1158-part1 (2019년 12월)", "status": "IS", - "publishedAt": "2019년 12월" + "publishedAt": "2019-12" }, { "title": "가시광 통신 기반 사물인터넷 서비스 - 제 2 부: 프레임워크", "ref": "TTAK.KO-10.1158-part2 (2020년 12월)", "status": "IS", - "publishedAt": "2020년 12월" + "publishedAt": "2020-12" }, { "title": "가시광 통신 기반 사물인터넷 서비스 - 제 3 부: 프로토콜", "ref": "TTAK.KO-10.1158-part3 (2020년 12월)", "status": "IS", - "publishedAt": "2020년 12월" + "publishedAt": "2020-12" } ] } @@ -214,43 +214,43 @@ export const standardsBodies: StandardsBody[] = [ "title": "NNI Mobility Management Requirements for SBI2K", "ref": "ITU-T Supplement to Recommendation Q.Sup52 (December 2004)", "status": "IS", - "publishedAt": "December 2004" + "publishedAt": "2004-12" }, { "title": "Mobility Management Requirements for Next-Generation Networks", "ref": "ITU-T Recommendation Q.1706/Y.2801 (July 2006)", "status": "IS", - "publishedAt": "July 2006" + "publishedAt": "2006-07" }, { "title": "Framework of IPv6 Multi-homing for NGN", "ref": "ITU-T Recommendation Y.2052 (Feb. 2008)", "status": "IS", - "publishedAt": "Feb. 2008" + "publishedAt": "2008-02" }, { "title": "Generic Framework of Mobility Management for Next-Generation Networks", "ref": "ITU-T Recommendation Q.1707/Y.2804 (Feb. 2008)", "status": "IS", - "publishedAt": "Feb. 2008" + "publishedAt": "2008-02" }, { "title": "Framework of Location Management for Next-Generation Networks", "ref": "ITU-T Recommendation Q.1708/Y.2805 (October 2008)", "status": "IS", - "publishedAt": "October 2008" + "publishedAt": "2008-10" }, { "title": "Framework of Handover Control for Next-Generation Networks", "ref": "ITU-T Recommendation Q.1709/Y.2806 (October 2008)", "status": "IS", - "publishedAt": "October 2008" + "publishedAt": "2008-10" }, { "title": "Framework of Mobility Management in Service Stratum for NGN", "ref": "ITU-T Recommendation Y.2809 (November 2011)", "status": "IS", - "publishedAt": "November 2011" + "publishedAt": "2011-11" } ] } @@ -270,37 +270,37 @@ export const standardsBodies: StandardsBody[] = [ "title": "ECTP-1: Specification of Simplex Multicast Transport", "ref": "ITU-T Recommendation X.606 (October 2001) ISO/IEC IS 14476-1 (April 2002)", "status": "IS", - "publishedAt": "October 2001" + "publishedAt": "2001-10" }, { "title": "ECTP-2: Specification of QoS Management for Simplex Multicast Transport", "ref": "ITU-T Recommendation X.606.1 (February 2003) ISO/IEC IS 14476-2 (June 2003)", "status": "IS", - "publishedAt": "February 2003" + "publishedAt": "2003-02" }, { "title": "ECTP-3: Specification of Duplex Multicast Transport", "ref": "ITU-T Recommendation X.607 (February 2007) ISO/IEC IS 14476-3 (August 2008)", "status": "IS", - "publishedAt": "February 2007" + "publishedAt": "2007-02" }, { "title": "ECTP-4: Specification of QoS Management for Duplex Multicast Transport", "ref": "ITU-T Recommendation X.607.1 (November 2008) ISO/IEC IS 14476-4 (April 2010)", "status": "IS", - "publishedAt": "November 2008" + "publishedAt": "2008-11" }, { "title": "ECTP-5: Specification of N-plex Multicast Transport", "ref": "ITU-T Recommendation X.608 (February 2007) ISO/IEC IS 14476-5 (August 2008)", "status": "IS", - "publishedAt": "February 2007" + "publishedAt": "2007-02" }, { "title": "ECTP-6: Specification of QoS Management for N-plex Multicast Transport", "ref": "ITU-T Recommendation X.608.1 (November 2008) ISO/IEC IS 14476-6 (April 2010)", "status": "IS", - "publishedAt": "November 2008" + "publishedAt": "2008-11" } ] }, @@ -312,19 +312,19 @@ export const standardsBodies: StandardsBody[] = [ "title": "RMCP-1: Framework", "ref": "ITU-T Recommendation X.603 (April 2004) ISO/IEC IS 16512-1", "status": "IS", - "publishedAt": "April 2004" + "publishedAt": "2004-04" }, { "title": "RMCP-2: Specification of Simplex Group Applications", "ref": "ITU-T Recommendation X.603.1 (February 2007) ISO/IEC IS 16512-2", "status": "IS", - "publishedAt": "February 2007" + "publishedAt": "2007-02" }, { "title": "RMCP-3: Specification of N-plex Group Applications", "ref": "ITU-T Recommendation X.603.2 (September 2010) ISO/IEC IS 16512-3", "status": "IS", - "publishedAt": "September 2010" + "publishedAt": "2010-09" } ] }, @@ -336,19 +336,19 @@ export const standardsBodies: StandardsBody[] = [ "title": "MMC-1: MMC Framework", "ref": "ITU-T Recommendation X.604 (March 2010) ISO/IEC IS 24793-1", "status": "IS", - "publishedAt": "March 2010" + "publishedAt": "2010-03" }, { "title": "MMC-2: MMC Protocol over Native IP Multicast Networks", "ref": "ITU-T Recommendation X.604.1 (March 2010) ISO/IEC IS 24793-2", "status": "IS", - "publishedAt": "March 2010" + "publishedAt": "2010-03" }, { "title": "MMC-3: MMC Protocol over Overlay Multicast Networks", "ref": "ITU-T Recommendation X.604.2 (September 2010) ISO/IEC IS 24793-3", "status": "IS", - "publishedAt": "September 2010" + "publishedAt": "2010-09" } ] }, @@ -360,25 +360,25 @@ export const standardsBodies: StandardsBody[] = [ "title": "Part 1: Overall Aspects", "ref": "ISO/IEC TR 29181-1 (September 2012)", "status": "TR", - "publishedAt": "September 2012" + "publishedAt": "2012-09" }, { "title": "Part 2: Naming and Addressing", "ref": "ISO/IEC TR 29181-2 (December 2014)", "status": "TR", - "publishedAt": "December 2014" + "publishedAt": "2014-12" }, { "title": "Part 3: Switching and Routing", "ref": "ISO/IEC TR 29181-3 (April 2013)", "status": "TR", - "publishedAt": "April 2013" + "publishedAt": "2013-04" }, { "title": "Part 4: Mobility", "ref": "ISO/IEC TR 29181-4 (December 2013)", "status": "TR", - "publishedAt": "December 2013" + "publishedAt": "2013-12" } ] } diff --git a/refer_landing_page/scripts/extract/__pycache__/generate_all.cpython-314.pyc b/refer_landing_page/scripts/extract/__pycache__/generate_all.cpython-314.pyc deleted file mode 100644 index 24c3024..0000000 Binary files a/refer_landing_page/scripts/extract/__pycache__/generate_all.cpython-314.pyc and /dev/null differ diff --git a/refer_landing_page/scripts/extract/generate_all.py b/refer_landing_page/scripts/extract/generate_all.py index 3ae80d5..f683b8c 100644 --- a/refer_landing_page/scripts/extract/generate_all.py +++ b/refer_landing_page/scripts/extract/generate_all.py @@ -7,6 +7,67 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__fil ISL_DIR = os.path.join(BASE_DIR, "..", "ISL-2026") CONTENT_DIR = os.path.join(BASE_DIR, "content") +MONTH_MAP = { + "january": "01", "jan": "01", + "february": "02", "feb": "02", + "march": "03", "mar": "03", + "april": "04", "apr": "04", + "may": "05", + "june": "06", "jun": "06", + "july": "07", "jul": "07", + "august": "08", "aug": "08", + "september": "09", "sep": "09", "sept": "09", + "october": "10", "oct": "10", + "november": "11", "nov": "11", + "december": "12", "dec": "12", +} + +def to_iso(raw): + if not raw or "in progress" in raw.lower(): + return None + raw = raw.strip() + + # 1) YYYY-MM-DD or YYYY.MM.DD + m = re.search(r'(\d{4})[. /\\-]?(\d{1,2})[. /\\-]?(\d{1,2})', raw) + if m: + yr = int(m.group(1)) + mo = int(m.group(2)) + day = int(m.group(3)) + if mo <= 12 and day <= 31: + return f"{yr:04d}-{mo:02d}-{day:02d}" + + # 2) "May 2026", "Feb. 2008", "August 2018" + m_txt = re.search(r'([A-Za-z]+)\.?\s*(\d{4})', raw) + if m_txt: + mo_str = m_txt.group(1).lower().rstrip('.') + yr_str = m_txt.group(2) + if mo_str in MONTH_MAP: + return f"{yr_str}-{MONTH_MAP[mo_str]}" + + # 3) "2019년 12월", "9월, 1999" + m_kor = re.search(r'(\d{4})년\s*(\d{1,2})월', raw) + if m_kor: + return f"{int(m_kor.group(1)):04d}-{int(m_kor.group(2)):02d}" + + m_kor2 = re.search(r'(\d{1,2})월.*?,?\s*(\d{4})', raw) + if m_kor2: + return f"{int(m_kor2.group(2)):04d}-{int(m_kor2.group(1)):02d}" + + # 4) YYYY-MM or YYYY.MM + m_ym = re.search(r'(\d{4})[. /\\-]?(\d{1,2})', raw) + if m_ym: + yr = int(m_ym.group(1)) + mo = int(m_ym.group(2)) + if mo <= 12: + return f"{yr:04d}-{mo:02d}" + + # 5) YYYY only + m_y = re.search(r'(\d{4})', raw) + if m_y: + return f"{int(m_y.group(1)):04d}" + + return raw + def read_file(filename): path = os.path.join(ISL_DIR, filename) with open(path, "r", encoding="utf-8-sig") as f: @@ -120,7 +181,6 @@ def parse_publications(): intl_html = read_file("paper-international.html") dom_html = read_file("paper-domestic.html") pat_html = read_file("patent.html") - month_map = {"January":"01","February":"02","March":"03","April":"04","May":"05","June":"06","July":"07","August":"08","September":"09","October":"10","November":"11","December":"12"} intl_pubs = [] intl_items = re.findall(r'
  • (.*?)
  • ', intl_html, flags=re.S | re.I) @@ -137,12 +197,7 @@ def parse_publications(): rest_clean = re.sub(r'<.*?>', '', rest).replace('\n', ' ').strip() rest_clean = re.sub(r'^\s*,\s*', '', rest_clean) - m_date = re.search(r'([A-Za-z]+)\s+(\d{4})', rest_clean) - pub_date = "2026-01" - if m_date: - mo, yr = m_date.group(1), m_date.group(2) - if mo in month_map: - pub_date = f"{yr}-{month_map[mo]}" + pub_date = to_iso(rest_clean) or "2026-01" intl_pubs.append({ "category": "intl-journal-conf", @@ -168,12 +223,7 @@ def parse_publications(): rest_clean = re.sub(r'^\s*,\s*', '', rest_clean) is_kci = "(KCI)" in item or "(KCI)" in rest_clean - - m_date = re.search(r'(\d{4})년\s*(\d{1,2})월', rest_clean) - if m_date: - pub_date = f"{m_date.group(1)}-{int(m_date.group(2)):02d}" - else: - pub_date = "2026-01" + pub_date = to_iso(rest_clean) or "2026-01" dom_pubs.append({ "category": "domestic-journal-conf", @@ -194,7 +244,7 @@ def parse_publications(): title = lines[0] inventors = "" app_no = "" - app_date = "" + app_date = None reg_no = None reg_date = None country = "한국" @@ -207,14 +257,14 @@ def parse_publications(): if m: app_no = m.group(1) country = m.group(2) - app_date = m.group(3).replace('.', '-') + app_date = to_iso(m.group(3)) else: app_no = l.replace("출원번호:", "").strip() elif l.startswith("등록번호:"): m = re.search(r'등록번호:\s*([\d-]+)\s*\((.*?),\s*([\d.]+)\)', l) if m: reg_no = m.group(1) - reg_date = m.group(3).replace('.', '-') + reg_date = to_iso(m.group(3)) else: reg_no = l.replace("등록번호:", "").strip() @@ -287,7 +337,6 @@ def parse_standards(): role = "Convenor" if "Convenor" in header or "Convenor" in body else None projects = [] - # If 'o ' exists, split by 'o ' if re.search(r'^\s*o\s+', body, flags=re.M): proj_blocks = re.split(r'\s*o\s+', body) for proj_b in proj_blocks: @@ -319,7 +368,7 @@ def parse_standards(): elif "TS" in d_rest: status = "TS" m_date = re.search(r'\((.*?)\)', d_rest) - pub_date = m_date.group(1) if m_date and "In Progress" not in m_date.group(1) else None + pub_date = to_iso(m_date.group(1)) if m_date else None docs.append({ "title": d_title, @@ -334,7 +383,6 @@ def parse_standards(): "documents": docs }) else: - # Single project body doc_items = re.findall(r'
  • (.*?)
  • ', body, flags=re.S | re.I) docs = [] for d_item in doc_items: @@ -353,7 +401,7 @@ def parse_standards(): elif "TS" in d_rest: status = "TS" m_date = re.search(r'\((.*?)\)', d_rest) - pub_date = m_date.group(1) if m_date and "In Progress" not in m_date.group(1) else None + pub_date = to_iso(m_date.group(1)) if m_date else None docs.append({ "title": d_title, diff --git a/refer_landing_page/scripts/extract/verify_counts.py b/refer_landing_page/scripts/extract/verify_counts.py index 8e6ae51..69cbc40 100644 --- a/refer_landing_page/scripts/extract/verify_counts.py +++ b/refer_landing_page/scripts/extract/verify_counts.py @@ -1,14 +1,12 @@ #!/usr/bin/env python3 import sys import os +import re BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -CONTENT_DIR = os.path.join(BASE_DIR, "refer_landing_page", "content") - sys.path.insert(0, os.path.join(BASE_DIR, "refer_landing_page", "scripts", "extract")) def verify(): - # Import generated modules or json from generate_all import parse_members, parse_publications, parse_lectures, parse_standards active_m, alumni_m = parse_members() @@ -19,15 +17,16 @@ def verify(): total_pubs = len(intl_p) + len(dom_p) + len(pat_p) std_docs_count = sum(len(p["documents"]) for b in bodies for p in b["projects"]) - print("=== DATA VERIFICATION GATE (AC-07 / AC-08) ===") + print("=== DATA VERIFICATION GATE (AC-07 / AC-08 / AC-10 / AC-11) ===") print(f"Active Members: {len(active_m)} (Expected: 16)") print(f"Alumni: {len(alumni_m)} (Expected: 60)") print(f"International Papers: {len(intl_p)} (Expected: 68)") print(f"Domestic Papers: {len(dom_p)} (Expected: 80)") print(f"Patents: {len(pat_p)} (Expected: 75)") print(f"Total Publications: {total_pubs} (Expected: 223)") + print(f"Lectures Semesters: {len(semesters)} (Expected: 45)") print(f"Standard Bodies: {len(bodies)} (Expected: 6)") - print(f"Standard Documents: {std_docs_count} (Expected: ~55)") + print(f"Standard Documents: {std_docs_count} (Expected: 44)") errors = [] if len(active_m) != 16: @@ -42,9 +41,35 @@ def verify(): errors.append(f"Patents count mismatch: got {len(pat_p)}, expected 75") if total_pubs != 223: errors.append(f"Total Publications count mismatch: got {total_pubs}, expected 223") + if len(semesters) != 45: + errors.append(f"Semesters count mismatch: got {len(semesters)}, expected 45") + if len(bodies) != 6: + errors.append(f"Standard Bodies count mismatch: got {len(bodies)}, expected 6") + if std_docs_count != 44: + errors.append(f"Standard Documents count mismatch: got {std_docs_count}, expected 44") + + # Date ISO 8601 validation (AC-11) + content_dir = os.path.join(BASE_DIR, "content") + for fname in ["members.ts", "publications.ts", "lectures.ts", "standards.ts"]: + fpath = os.path.join(content_dir, fname) + if not os.path.exists(fpath): + errors.append(f"Missing content file: {fname}") + continue + with open(fpath, "r", encoding="utf-8") as f: + text = f.read() + + # Check BOM (AC-10) + if text.startswith('\ufeff'): + errors.append(f"BOM found in {fname}") + + # Check dates + dates = re.findall(r'"(publishedAt|applicationAt|registrationAt|graduatedAt)": "([^"]+)"', text) + for k, d in dates: + if not re.match(r'^\d{4}(-\d{2})?(-\d{2})?$', d): + errors.append(f"Non-ISO 8601 date in {fname}: {k}='{d}'") if errors: - print("\n❌ VERIFICATION FAILED:") + print("\n❌ DATA VERIFICATION FAILED:") for err in errors: print(f" - {err}") sys.exit(1)