{"owner":"ccfddl","repo":"ccf-deadlines","hasSkills":true,"totalSkillsCount":6,"totalTokensCount":6029,"categories":["plugin-manifest","anthropic-skill"],"hasMcp":false,"mcpConfig":null,"found":["extensions/cli/readme.md","extensions/ical/readme.md","extensions/chrome/chrome/manifest.json","extensions/chrome/README.md","extensions/chrome/chrome/README.md","extensions/chrome/README.zh-CN.md"],"skills":{"extensions/cli/readme.md":"# ccfddl cli\n\nCLI tool for CCFDDL - Conference Deadline Tracker\n\n## Install\n\n```bash\npip install -e \".[dev]\"\n```\n\n## Usage\n\n```bash\n# Show help\nccfddl --help\n\n# List all categories\nccfddl --list-categories\n\n# Filter by conference, subcategory, rank\nccfddl --conf CVPR ICCV --sub AI --rank A\n\n# JSON output\nccfddl --json --sub AI\n\n# Show version\nccfddl --version\n```\n\n### Arguments\n\n| Argument | Type  | Description                          | Example            |\n| -------- | ----- | -------------------------------- ----| ------------------ |\n| `--conf` | str[] | A list of conference IDs to filter.  | `--conf CVPR ICCV` |\n| `--sub`  | str[] | A list of subcategory IDs to filter. | `--sub AI CG`      |\n| `--rank` | str[] | A list of ranks to filter.           | `--rank A B`       |\n| `--json` | flag  | Output in JSON format.               | `--json`           |\n| `--list-categories` | flag | List all categories.          | `--list-categories`|\n| `--url`  | str   | Custom URL for conference data.      | `--url https://...`|\n| `--version` | flag | Show version.                       | `--version`        |\n\n## Generate iCal/RSS Feeds\n\n```bash\n# Generate iCal files (requires xlin package)\npython -m ccfddl.convert_to_ical\n\n# Generate RSS files\npython -m ccfddl.convert_to_rss\n\n# From the repository root, declare self links for published feeds\npython extensions/cli/ccfddl/convert_to_rss.py --output-dir feeds --feed-base-url https://example.com/feeds/\n```\n\n`--feed-base-url` adds an RSS `atom:link rel=\"self\"` for each published feed,\nincluding language and ranking/category variants. Omit it for local exports\nwhose public URL is unknown.\n\n## Project Structure\n\n```\nccfddl/\n├── __init__.py      # Package entry, exports public API\n├── __main__.py      # CLI entry point\n├── fetch.py         # Data fetching and processing\n├── output.py        # Output formatting (table, JSON)\n├── models.py        # Data models\n├── utils.py         # Utility functions\n├── convert_to_ical.py\n├── convert_to_rss.py\n└── tests/           # Test suite\n```\n\n## Development\n\n```bash\n# Install dev dependencies\npip install -e \".[dev]\"\n\n# Run tests\npython -m pytest ccfddl/tests/ -v\n\n# Run tests with coverage\npython -m pytest ccfddl/tests/ --cov=ccfddl --cov-report=html\n\n# Type checking\nmypy ccfddl/\n```\n\n## Python API\n\n```python\nfrom ccfddl import (\n    # Models\n    Conference, ConferenceYear, Timeline, Rank, Category,\n    CATEGORIES, VALID_SUBS,\n    get_category_by_sub, get_all_subs, is_valid_sub,\n    # Utils\n    load_mapping, get_timezone, reverse_index,\n    format_duration, parse_datetime_with_tz,\n    # Fetch & Output\n    fetch_conferences, process_conference_deadlines, filter_results,\n    output_table, output_json, list_categories,\n)\n\n# Get category info\ncat = get_category_by_sub(\"AI\")\nprint(cat.name)  # 人工智能\nprint(cat.name_en)  # Artificial Intelligence\n\n# Parse timezone\nfrom datetime import datetime\ntz = get_timezone(\"UTC+8\")\ndt = datetime(2025, 1, 15, 23, 59, 59, tzinfo=tz)\n```\n","extensions/ical/readme.md":"## iCal Subscription:\n\n- English: `https://ccfddl.com/conference/deadlines/deadlines_en.ics`\n- 简体中文: `https://ccfddl.com/conference/deadlines/deadlines_zh.ics`\n\nCalendar (`.ics`) and RSS (`.xml`) feeds are published in `/conference/deadlines/`. Existing `/conference/deadlines_*.ics` and `.xml` subscriptions redirect to the new folder through the Cloudflare Worker.\n\nThe deployment generates files directly in that folder using `--output-dir public/conference/deadlines`. Without `--output-dir`, the CLI still writes to the current directory.\n\n<img src=\"../../.readme_assets/screenshot_iCal.jpg\" width=\"500px\"/>\n\nThe filter is mapped to the name of iCal file in the following rules:\n\n- no filter: `deadlines_en.ics` and `deadlines_zh.ics`\n- one filter: `deadlines_{lang}_{ccf_rank}.ics`, `deadlines_{lang}_{core_rank}.ics`, `deadlines_{lang}_{thcpl_rank}.ics`, or `deadlines_{lang}_{sub}.ics`\n- two filters: any ordered pair among `ccf_rank`, `core_rank`, `thcpl_rank`, and `sub`\n- three filters: any ordered triple among `ccf_rank`, `core_rank`, `thcpl_rank`, and `sub`\n- four filters: `deadlines_{lang}_{ccf_rank}_{core_rank}_{thcpl_rank}_{sub}.ics`\n\nFor example, given filter: lang=en, core=A, thcpl=B, sub=SE, it will refer to `deadlines_en_core_A_thcpl_B_SE.ics`.\n\nFor `A*`, the generated filename uses `Astar`, for example `deadlines_en_core_Astar_SE.ics`.\n","extensions/chrome/chrome/manifest.json":"{\n  \"manifest_version\": 3,\n  \"name\": \"CCF DDL Tracker\",\n  \"description\": \"Track your upcoming CCF deadlines and see days remaining on the badge.\",\n  \"version\": \"2.0.0\",\n  \"permissions\": [\"storage\", \"alarms\"],\n  \"host_permissions\": [\"https://ccfddl.com/*\", \"https://ccfddl.github.io/*\"],\n  \"action\": {\n    \"default_title\": \"CCF DDL Tracker\",\n    \"default_popup\": \"popup.html\",\n    \"default_icon\": {\n      \"128\": \"icons/icon128.png\"\n    }\n  },\n  \"background\": {\n    \"service_worker\": \"background.js\",\n    \"type\": \"module\"\n  },\n  \"icons\": {\n    \"128\": \"icons/icon128.png\"\n  }\n}\n","extensions/chrome/README.md":"<div align=\"center\">\n  <img src=\"assets/ccf-ddl-tracker-logo.png\" alt=\"CCF DDL Tracker Logo\" width=\"96\" />\n\n  # CCF DDL Tracker\n\n  Chrome extension for tracking CCF deadlines with a compact popup, import flow, and local-only storage.\n\n  **Version:** `v2.0`\n\n  [中文版本](README.zh-CN.md) ·\n  [Chrome Web Store](https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb) ·\n  [Chrome Extension README](chrome/README.md) ·\n  [CCFDDL Source](https://github.com/ccfddl/ccf-deadlines) ·\n  [Repository](https://github.com/jaychempan/ccf-ddl-tracker)\n</div>\n\n---\n\n## Preview\n\n<div align=\"center\">\n  <img src=\"assets/previewv2.0.png\" alt=\"CCF DDL Tracker v2.0 Preview\" width=\"720\" />\n</div>\n\nThe v2.0 popup focuses on density and speed: compact top cards, a persistent import panel, a floating conference picker, footer shortcuts, and a lightweight settings popover.\n\n---\n\n## Install\n\n### Chrome Web Store\n\nInstall directly from the Chrome Web Store:\n\n<div align=\"center\">\n  <a href=\"https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb\" target=\"_blank\" rel=\"noopener\">\n    <img src=\"https://fonts.gstatic.com/s/i/productlogos/chrome_store/v7/192px.svg\" alt=\"Chrome Web Store\" width=\"56\" height=\"56\" />\n  </a>\n</div>\n\n### Load Unpacked\n\n1. Open Chrome and visit `chrome://extensions/`.\n2. Enable `Developer mode`.\n3. Click `Load unpacked`.\n4. Select the [`chrome/`](chrome/) directory in this repository.\n5. Pin `CCF DDL Tracker` to the toolbar and click the icon to use it.\n\n<details>\n  <summary>Need more extension-specific details?</summary>\n\n  See [chrome/README.md](chrome/README.md) for the extension-only guide.\n</details>\n\n---\n\n\n## Highlights\n\n- **Native popup experience**: Clicking the extension icon opens a compact Chrome popup instead of a separate window.\n- **Manual + imported deadlines**: You can add custom deadlines or import recommended conferences from CCFDDL.\n- **Official site shortcuts**: Imported conferences retain homepage links, and added cards can open the conference website directly.\n- **Bilingual UI**: Switch between Chinese and English from the bottom toolbar.\n- **Display preferences**: Choose 24-hour or 12-hour time, and switch date order between `YYYY/MM/DD` and `MM/DD/YYYY`.\n- **Local-only data**: All data stays in `chrome.storage.local`, with no account or cloud sync.\n\n---\n\n## Customization\n\n- **Language**: Toggle between Chinese and English from the popup footer.\n- **Time format**: Choose `24-hour` or `12-hour (AM/PM)` in the settings panel.\n- **Date order**: Choose `YYYY/MM/DD` or `MM/DD/YYYY`.\n- **Imported conference cards**: Imported items can be added to your own list and opened directly on the conference website.\n\n---\n\n## Data Source & Privacy\n\n- **Primary source**: [`ccfddl/ccf-deadlines`](https://github.com/ccfddl/ccf-deadlines)\n- **Fallback**: CCFDDL ICS feeds when GitHub data is unavailable\n- **Storage**: `chrome.storage.local`\n- **Privacy**: no account, no cloud sync, no telemetry\n\n---\n\n## Development\n\n- Repository: <https://github.com/jaychempan/ccf-ddl-tracker>\n- Chrome extension docs: [chrome/README.md](chrome/README.md)\n- Tech stack: Manifest V3, Vanilla JavaScript, `chrome.storage.local`\n- Contribution: Issues and pull requests are welcome\n\n---\n\n## Changelog\n\n<details open>\n  <summary><strong>v2.0</strong> - UI overhaul, import improvements, settings, and versioning</summary>\n\n  - Reworked the popup into a denser layout with two entry cards and a bottom utility bar\n  - Kept the import panel visible by default while moving recommendations into a floating search picker\n  - Imported conferences now keep homepage links and added cards can open the official conference site\n  - Added display settings for `24-hour / 12-hour` time and `year-month-day / month-day-year` date order\n  - Added a `v2.0` version label in the popup header and bumped the extension version\n</details>\n\n<details>\n  <summary><strong>v1.0.1</strong> - Refresh and day-count fixes</summary>\n\n  - Fixed automatic date refresh issues\n  - Added a manual refresh button\n  - Corrected same-day deadlines to display `0 days`\n</details>\n\n---\n\n## License\n\nMIT License\n","extensions/chrome/chrome/README.md":"# CCF DDL Tracker (Chrome Extension)\n\n## 使用方法 / Usage\n\n1. 打开 Chrome，进入 `chrome://extensions/`。/ Open Chrome and go to `chrome://extensions/`.\n2. 打开右上角的“开发者模式”。/ Enable “Developer mode”.\n3. 点击“加载已解压的扩展程序”，选择本仓库的 `chrome/` 目录。/ Click “Load unpacked” and select `chrome/`.\n4. 安装完成后，点击浏览器工具栏的“CCF DDL Tracker”图标。/ Click the toolbar icon.\n\n## 功能说明 / Features\n\n- **当前版本**：扩展版本已更新为 `v2.0`，弹窗右上角会显示版本标记。/ The extension is now `v2.0`, and the popup header shows the current version.\n- **添加 DDL**：填写标题、日期、时间，点击“添加”。/ Add title/date/time and click “Add”.\n- **查看详情**：弹窗中会按时间排序展示多个 DDL，并显示剩余天数。/ Sorted list with remaining days.\n- **徽标提示**：工具栏图标会显示最近一个 DDL 的剩余天数。/ Badge shows the nearest days left.\n- **删除 DDL**：在条目右侧点击“删除”。/ Delete from the list.\n- **双入口卡片**：新增截止日期和从 CCFDDL 导入改为一行两个入口卡片，点击后切换下方面板。/ Add DDL and Import from CCFDDL now appear as two side-by-side entry cards that switch the panel below.\n- **导入推荐会议**：导入面板默认常驻显示，会优先显示已缓存会议，并在点击搜索框时获取最新推荐。/ The import panel stays visible by default, shows cached conferences first, and refreshes recommendations when the search field is focused.\n- **官网直达**：从 CCFDDL 导入的会议会保留官网链接，加入“我的截止日期”后可直接点击卡片打开会议官网。/ Imported CCFDDL conferences retain their homepage links, and once added to \"My DDLs\" the card can be clicked to open the conference website.\n- **底部工具栏**：中英切换和 CCFDDL 官网入口已移动到底部工具栏，右上角不再放操作项。/ Language switching and the CCFDDL website shortcut now live in the bottom toolbar instead of the top-right corner.\n- **协作入口**：底部工具栏新增 GitHub 仓库链接，可直接打开项目主页参与开发。/ The bottom toolbar now includes a GitHub repository link so you can open the project page and contribute directly.\n- **显示设置**：底部新增设置入口，可切换时间显示为 24 小时制或上午/下午 12 小时制。/ A new settings entry in the bottom bar lets you switch time display between 24-hour and 12-hour formats.\n- **日期顺序**：设置面板新增日期顺序选项，可在“年月日”和“月日年”之间切换。/ The settings panel now includes a date-order option for switching between year/month/day and month/day/year.\n- **底部贴边**：底部工具栏已固定贴到底边，去掉其下方的空白区域。/ The bottom utility bar is now anchored to the popup edge, removing the empty area beneath it.\n- **底部更轻量**：底部工具栏进一步压缩为接近单行文字的样式，语言切换不再保留按钮感。/ The bottom utility bar is further compressed into a near single-line text-style row, and the language toggle no longer looks like a button.\n- **启动误触保护**：弹窗刚打开时会短暂忽略导入入口的误触，避免工具栏点击把“从 CCFDDL 导入”意外点开。/ When the popup first opens, the import entry briefly ignores accidental clicks so the toolbar click does not unintentionally open \"Import from CCFDDL\".\n- **原生弹窗**：点击工具栏图标会打开 Chrome 原生 popup，而不是独立窗口。/ Clicking the toolbar icon opens the native Chrome popup instead of a separate window.\n- **原生日期选择器**：中英文界面都使用 Chrome 原生日期选择器，日期显示格式遵循浏览器或系统本地化设置。/ Both languages use Chrome's native date picker, and the displayed format follows browser or system localization.\n- **界面微调**：压缩了顶栏高度，并优化了导入区的搜索与提示布局。/ The header is more compact, and the import panel now uses a cleaner search-and-hint layout.\n- **DDL 标题行调整**：数量显示在标题右侧，刷新按钮保持右对齐。/ The DDL header keeps the count beside the title while the Refresh button stays right-aligned.\n- **弹窗图标更新**：弹窗顶部图标改为 `chrome/icons/logo.png`。/ The popup header icon now uses `chrome/icons/logo.png`.\n- **整体更紧凑**：统一压缩了表单、卡片、列表项和按钮的纵向间距。/ The form, cards, list rows, and buttons now use tighter vertical spacing overall.\n- **操作更轻量**：新增表单提交成功后会自动收起，导入面板默认常驻，而推荐会议只在点击搜索框时自动加载。/ The add form closes after a successful submission, the import panel stays visible by default, and recommendations only auto-load when the search field is focused.\n- **内部滚动优先**：尽量避免外层弹窗滚动，“我的 DDL”和推荐会议列表各自在内部滚动。/ The popup avoids outer scrolling as much as possible, with \"My DDLs\" and recommendations scrolling inside their own areas.\n- **入口卡片稳定切换**：导入面板默认展开，再次点击导入卡片会收起它，点击新增卡片会先关闭导入面板。/ The import panel starts expanded, clicking the import card again collapses it, and clicking the add card closes the import panel first.\n- **悬浮搜索选择器**：点击搜索会议输入框时，会自动加载并弹出悬浮的推荐会议列表。/ Clicking the conference search input auto-loads and opens a floating recommendation picker.\n- **入口文案更紧凑**：顶部两个入口卡片的标题和说明文字现在居中显示，并进一步压缩了行高。/ The two top entry cards now center their title and helper text with tighter line height.\n- **入口角标图标**：顶部两个入口卡片的图标移动到左上角，不再额外占用行高。/ The two top entry card icons now sit in the top-left corner without adding extra line height.\n- **导入图标优化**：从 CCFDDL 导入入口的角标改为更简洁的搜索图标。/ The CCFDDL import entry badge now uses a cleaner search icon.\n- **英文文案微调**：英文入口卡片的标题和说明文字做了缩短，减少不自然换行。/ The English entry-card title and helper copy were shortened to reduce awkward wrapping.\n- **中文标题调整**：中文界面的“我的 DDL”改为“我的截止日期”。/ The Chinese \"My DDLs\" title was renamed to \"我的截止日期\".\n- **导入提示文案**：搜索框下方增加了一行小字，提示点击搜索框可获取最新会议列表。/ A small helper line below the import search field explains that clicking it loads the latest conference list.\n- **提示与刷新按钮微调**：导入区提示文字改为居中显示，“我的截止日期”的刷新按钮改为图标按钮。/ The import helper text is now centered, and the \"My DDLs\" refresh control now uses an icon button.\n- **刷新图标与动效**：刷新按钮改为更常见的无底框 SVG 图标，并增加旋转动效表示已触发刷新。/ The refresh control now uses a more standard frameless SVG icon and spins briefly to indicate that refresh was triggered.\n\n## 数据存储 / Data\n\n所有数据保存在 `chrome.storage.local` 中，仅在本机可见。/ Stored locally in `chrome.storage.local`.\n","extensions/chrome/README.zh-CN.md":"<div align=\"center\">\n  <img src=\"assets/ccf-ddl-tracker-logo.png\" alt=\"CCF DDL Tracker Logo\" width=\"96\" />\n\n  # CCF DDL Tracker\n\n  轻量的 Chrome 扩展，用于管理 CCF 相关会议截止日期，支持手动添加、CCFDDL 导入和本地提醒。\n\n  **版本:** `v2.0`\n\n  [English Version](README.md) ·\n  [Chrome Web Store](https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb) ·\n  [Chrome 扩展说明](chrome/README.md) ·\n  [CCFDDL 数据源](https://github.com/ccfddl/ccf-deadlines) ·\n  [项目仓库](https://github.com/jaychempan/ccf-ddl-tracker)\n</div>\n\n---\n\n## 预览\n\n<div align=\"center\">\n  <img src=\"assets/previewv2.0.png\" alt=\"CCF DDL Tracker v2.0 中文预览\" width=\"720\" />\n</div>\n\nv2.0 的 popup 更强调紧凑和高效：顶部双入口卡片、默认常驻的导入面板、悬浮会议选择层、底部快捷入口，以及轻量设置面板都集中在同一视图里。\n\n---\n\n## 安装\n\n### Chrome Web Store\n\n可直接从 Chrome 应用商店安装：\n\n<div align=\"center\">\n  <a href=\"https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb\" target=\"_blank\" rel=\"noopener\">\n    <img src=\"https://fonts.gstatic.com/s/i/productlogos/chrome_store/v7/192px.svg\" alt=\"Chrome Web Store\" width=\"56\" height=\"56\" />\n  </a>\n</div>\n\n### 开发者模式安装\n\n1. 打开 Chrome，进入 `chrome://extensions/`。\n2. 打开 `开发者模式`。\n3. 点击 `加载已解压的扩展程序`。\n4. 选择本仓库下的 [`chrome/`](chrome/) 目录。\n5. 固定到工具栏后点击图标即可使用。\n\n<details>\n  <summary>需要更细的扩展说明？</summary>\n\n  可查看 [chrome/README.md](chrome/README.md)。\n</details>\n\n---\n\n\n## 核心功能\n\n- **原生贴靠弹窗**：点击扩展图标后，会直接打开紧凑的 Chrome popup，而不是单独窗口。\n- **手动添加 + 导入会议**：既可以新增自定义截止日期，也可以从 CCFDDL 导入推荐会议。\n- **官网直达**：导入的会议会保留官网链接，加入列表后可直接点击打开会议官网。\n- **中英双语**：可在底部工具栏中切换中文和英文界面。\n- **显示设置**：支持 `24 小时 / 12 小时` 时间制，以及 `年月日 / 月日年` 日期顺序切换。\n- **仅本地存储**：所有数据都保存在 `chrome.storage.local` 中，不依赖账号或云同步。\n\n---\n\n## 自定义\n\n- **语言**：可在 popup 底部切换中文和英文。\n- **时间制式**：可在设置面板中选择 `24 小时` 或 `12 小时（AM/PM）`。\n- **日期顺序**：可切换 `YYYY/MM/DD` 或 `MM/DD/YYYY`。\n- **导入会议卡片**：导入后的会议可加入个人列表，并支持直接跳转会议官网。\n\n---\n\n## 数据来源与隐私\n\n- **主数据源**：[`ccfddl/ccf-deadlines`](https://github.com/ccfddl/ccf-deadlines)\n- **回退数据源**：当 GitHub 数据不可用时，回退到 CCFDDL ICS\n- **存储方式**：`chrome.storage.local`\n- **隐私**：无账号、无云同步、无遥测\n\n---\n\n## 开发\n\n- 仓库：<https://github.com/jaychempan/ccf-ddl-tracker>\n- Chrome 扩展说明：[chrome/README.md](chrome/README.md)\n- 技术栈：Manifest V3、Vanilla JavaScript、`chrome.storage.local`\n- 共同开发：欢迎提交 Issue 和 Pull Request\n\n---\n\n## 更新日志\n\n<details open>\n  <summary><strong>v2.0</strong> - 界面重构、导入优化、设置增强与版本标识</summary>\n\n  - 重构 popup 布局，改为更紧凑的双入口卡片和底部工具栏\n  - 导入面板默认常驻，搜索框点击后弹出悬浮推荐列表\n  - 导入会议支持保留官网链接，加入“我的截止日期”后可点击卡片打开官网\n  - 新增显示设置，支持 `24 小时 / 12 小时` 和 `年月日 / 月日年` 两组偏好\n  - 弹窗右上角增加 `v2.0` 版本标记，并同步升级扩展版本号\n</details>\n\n<details>\n  <summary><strong>v1.0.1</strong> - 刷新与剩余天数修复</summary>\n\n  - 修复日期无法自动更新的问题\n  - 新增手动刷新按钮\n  - 修正当天截止任务显示为 `0 天`\n</details>\n\n---\n\n## License\n\nMIT License\n"},"files":{"extensions/cli/readme.md":"# ccfddl cli\n\nCLI tool for CCFDDL - Conference Deadline Tracker\n\n## Install\n\n```bash\npip install -e \".[dev]\"\n```\n\n## Usage\n\n```bash\n# Show help\nccfddl --help\n\n# List all categories\nccfddl --list-categories\n\n# Filter by conference, subcategory, rank\nccfddl --conf CVPR ICCV --sub AI --rank A\n\n# JSON output\nccfddl --json --sub AI\n\n# Show version\nccfddl --version\n```\n\n### Arguments\n\n| Argument | Type  | Description                          | Example            |\n| -------- | ----- | -------------------------------- ----| ------------------ |\n| `--conf` | str[] | A list of conference IDs to filter.  | `--conf CVPR ICCV` |\n| `--sub`  | str[] | A list of subcategory IDs to filter. | `--sub AI CG`      |\n| `--rank` | str[] | A list of ranks to filter.           | `--rank A B`       |\n| `--json` | flag  | Output in JSON format.               | `--json`           |\n| `--list-categories` | flag | List all categories.          | `--list-categories`|\n| `--url`  | str   | Custom URL for conference data.      | `--url https://...`|\n| `--version` | flag | Show version.                       | `--version`        |\n\n## Generate iCal/RSS Feeds\n\n```bash\n# Generate iCal files (requires xlin package)\npython -m ccfddl.convert_to_ical\n\n# Generate RSS files\npython -m ccfddl.convert_to_rss\n\n# From the repository root, declare self links for published feeds\npython extensions/cli/ccfddl/convert_to_rss.py --output-dir feeds --feed-base-url https://example.com/feeds/\n```\n\n`--feed-base-url` adds an RSS `atom:link rel=\"self\"` for each published feed,\nincluding language and ranking/category variants. Omit it for local exports\nwhose public URL is unknown.\n\n## Project Structure\n\n```\nccfddl/\n├── __init__.py      # Package entry, exports public API\n├── __main__.py      # CLI entry point\n├── fetch.py         # Data fetching and processing\n├── output.py        # Output formatting (table, JSON)\n├── models.py        # Data models\n├── utils.py         # Utility functions\n├── convert_to_ical.py\n├── convert_to_rss.py\n└── tests/           # Test suite\n```\n\n## Development\n\n```bash\n# Install dev dependencies\npip install -e \".[dev]\"\n\n# Run tests\npython -m pytest ccfddl/tests/ -v\n\n# Run tests with coverage\npython -m pytest ccfddl/tests/ --cov=ccfddl --cov-report=html\n\n# Type checking\nmypy ccfddl/\n```\n\n## Python API\n\n```python\nfrom ccfddl import (\n    # Models\n    Conference, ConferenceYear, Timeline, Rank, Category,\n    CATEGORIES, VALID_SUBS,\n    get_category_by_sub, get_all_subs, is_valid_sub,\n    # Utils\n    load_mapping, get_timezone, reverse_index,\n    format_duration, parse_datetime_with_tz,\n    # Fetch & Output\n    fetch_conferences, process_conference_deadlines, filter_results,\n    output_table, output_json, list_categories,\n)\n\n# Get category info\ncat = get_category_by_sub(\"AI\")\nprint(cat.name)  # 人工智能\nprint(cat.name_en)  # Artificial Intelligence\n\n# Parse timezone\nfrom datetime import datetime\ntz = get_timezone(\"UTC+8\")\ndt = datetime(2025, 1, 15, 23, 59, 59, tzinfo=tz)\n```\n","extensions/ical/readme.md":"## iCal Subscription:\n\n- English: `https://ccfddl.com/conference/deadlines/deadlines_en.ics`\n- 简体中文: `https://ccfddl.com/conference/deadlines/deadlines_zh.ics`\n\nCalendar (`.ics`) and RSS (`.xml`) feeds are published in `/conference/deadlines/`. Existing `/conference/deadlines_*.ics` and `.xml` subscriptions redirect to the new folder through the Cloudflare Worker.\n\nThe deployment generates files directly in that folder using `--output-dir public/conference/deadlines`. Without `--output-dir`, the CLI still writes to the current directory.\n\n<img src=\"../../.readme_assets/screenshot_iCal.jpg\" width=\"500px\"/>\n\nThe filter is mapped to the name of iCal file in the following rules:\n\n- no filter: `deadlines_en.ics` and `deadlines_zh.ics`\n- one filter: `deadlines_{lang}_{ccf_rank}.ics`, `deadlines_{lang}_{core_rank}.ics`, `deadlines_{lang}_{thcpl_rank}.ics`, or `deadlines_{lang}_{sub}.ics`\n- two filters: any ordered pair among `ccf_rank`, `core_rank`, `thcpl_rank`, and `sub`\n- three filters: any ordered triple among `ccf_rank`, `core_rank`, `thcpl_rank`, and `sub`\n- four filters: `deadlines_{lang}_{ccf_rank}_{core_rank}_{thcpl_rank}_{sub}.ics`\n\nFor example, given filter: lang=en, core=A, thcpl=B, sub=SE, it will refer to `deadlines_en_core_A_thcpl_B_SE.ics`.\n\nFor `A*`, the generated filename uses `Astar`, for example `deadlines_en_core_Astar_SE.ics`.\n","extensions/chrome/chrome/manifest.json":"{\n  \"manifest_version\": 3,\n  \"name\": \"CCF DDL Tracker\",\n  \"description\": \"Track your upcoming CCF deadlines and see days remaining on the badge.\",\n  \"version\": \"2.0.0\",\n  \"permissions\": [\"storage\", \"alarms\"],\n  \"host_permissions\": [\"https://ccfddl.com/*\", \"https://ccfddl.github.io/*\"],\n  \"action\": {\n    \"default_title\": \"CCF DDL Tracker\",\n    \"default_popup\": \"popup.html\",\n    \"default_icon\": {\n      \"128\": \"icons/icon128.png\"\n    }\n  },\n  \"background\": {\n    \"service_worker\": \"background.js\",\n    \"type\": \"module\"\n  },\n  \"icons\": {\n    \"128\": \"icons/icon128.png\"\n  }\n}\n","extensions/chrome/README.md":"<div align=\"center\">\n  <img src=\"assets/ccf-ddl-tracker-logo.png\" alt=\"CCF DDL Tracker Logo\" width=\"96\" />\n\n  # CCF DDL Tracker\n\n  Chrome extension for tracking CCF deadlines with a compact popup, import flow, and local-only storage.\n\n  **Version:** `v2.0`\n\n  [中文版本](README.zh-CN.md) ·\n  [Chrome Web Store](https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb) ·\n  [Chrome Extension README](chrome/README.md) ·\n  [CCFDDL Source](https://github.com/ccfddl/ccf-deadlines) ·\n  [Repository](https://github.com/jaychempan/ccf-ddl-tracker)\n</div>\n\n---\n\n## Preview\n\n<div align=\"center\">\n  <img src=\"assets/previewv2.0.png\" alt=\"CCF DDL Tracker v2.0 Preview\" width=\"720\" />\n</div>\n\nThe v2.0 popup focuses on density and speed: compact top cards, a persistent import panel, a floating conference picker, footer shortcuts, and a lightweight settings popover.\n\n---\n\n## Install\n\n### Chrome Web Store\n\nInstall directly from the Chrome Web Store:\n\n<div align=\"center\">\n  <a href=\"https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb\" target=\"_blank\" rel=\"noopener\">\n    <img src=\"https://fonts.gstatic.com/s/i/productlogos/chrome_store/v7/192px.svg\" alt=\"Chrome Web Store\" width=\"56\" height=\"56\" />\n  </a>\n</div>\n\n### Load Unpacked\n\n1. Open Chrome and visit `chrome://extensions/`.\n2. Enable `Developer mode`.\n3. Click `Load unpacked`.\n4. Select the [`chrome/`](chrome/) directory in this repository.\n5. Pin `CCF DDL Tracker` to the toolbar and click the icon to use it.\n\n<details>\n  <summary>Need more extension-specific details?</summary>\n\n  See [chrome/README.md](chrome/README.md) for the extension-only guide.\n</details>\n\n---\n\n\n## Highlights\n\n- **Native popup experience**: Clicking the extension icon opens a compact Chrome popup instead of a separate window.\n- **Manual + imported deadlines**: You can add custom deadlines or import recommended conferences from CCFDDL.\n- **Official site shortcuts**: Imported conferences retain homepage links, and added cards can open the conference website directly.\n- **Bilingual UI**: Switch between Chinese and English from the bottom toolbar.\n- **Display preferences**: Choose 24-hour or 12-hour time, and switch date order between `YYYY/MM/DD` and `MM/DD/YYYY`.\n- **Local-only data**: All data stays in `chrome.storage.local`, with no account or cloud sync.\n\n---\n\n## Customization\n\n- **Language**: Toggle between Chinese and English from the popup footer.\n- **Time format**: Choose `24-hour` or `12-hour (AM/PM)` in the settings panel.\n- **Date order**: Choose `YYYY/MM/DD` or `MM/DD/YYYY`.\n- **Imported conference cards**: Imported items can be added to your own list and opened directly on the conference website.\n\n---\n\n## Data Source & Privacy\n\n- **Primary source**: [`ccfddl/ccf-deadlines`](https://github.com/ccfddl/ccf-deadlines)\n- **Fallback**: CCFDDL ICS feeds when GitHub data is unavailable\n- **Storage**: `chrome.storage.local`\n- **Privacy**: no account, no cloud sync, no telemetry\n\n---\n\n## Development\n\n- Repository: <https://github.com/jaychempan/ccf-ddl-tracker>\n- Chrome extension docs: [chrome/README.md](chrome/README.md)\n- Tech stack: Manifest V3, Vanilla JavaScript, `chrome.storage.local`\n- Contribution: Issues and pull requests are welcome\n\n---\n\n## Changelog\n\n<details open>\n  <summary><strong>v2.0</strong> - UI overhaul, import improvements, settings, and versioning</summary>\n\n  - Reworked the popup into a denser layout with two entry cards and a bottom utility bar\n  - Kept the import panel visible by default while moving recommendations into a floating search picker\n  - Imported conferences now keep homepage links and added cards can open the official conference site\n  - Added display settings for `24-hour / 12-hour` time and `year-month-day / month-day-year` date order\n  - Added a `v2.0` version label in the popup header and bumped the extension version\n</details>\n\n<details>\n  <summary><strong>v1.0.1</strong> - Refresh and day-count fixes</summary>\n\n  - Fixed automatic date refresh issues\n  - Added a manual refresh button\n  - Corrected same-day deadlines to display `0 days`\n</details>\n\n---\n\n## License\n\nMIT License\n","extensions/chrome/chrome/README.md":"# CCF DDL Tracker (Chrome Extension)\n\n## 使用方法 / Usage\n\n1. 打开 Chrome，进入 `chrome://extensions/`。/ Open Chrome and go to `chrome://extensions/`.\n2. 打开右上角的“开发者模式”。/ Enable “Developer mode”.\n3. 点击“加载已解压的扩展程序”，选择本仓库的 `chrome/` 目录。/ Click “Load unpacked” and select `chrome/`.\n4. 安装完成后，点击浏览器工具栏的“CCF DDL Tracker”图标。/ Click the toolbar icon.\n\n## 功能说明 / Features\n\n- **当前版本**：扩展版本已更新为 `v2.0`，弹窗右上角会显示版本标记。/ The extension is now `v2.0`, and the popup header shows the current version.\n- **添加 DDL**：填写标题、日期、时间，点击“添加”。/ Add title/date/time and click “Add”.\n- **查看详情**：弹窗中会按时间排序展示多个 DDL，并显示剩余天数。/ Sorted list with remaining days.\n- **徽标提示**：工具栏图标会显示最近一个 DDL 的剩余天数。/ Badge shows the nearest days left.\n- **删除 DDL**：在条目右侧点击“删除”。/ Delete from the list.\n- **双入口卡片**：新增截止日期和从 CCFDDL 导入改为一行两个入口卡片，点击后切换下方面板。/ Add DDL and Import from CCFDDL now appear as two side-by-side entry cards that switch the panel below.\n- **导入推荐会议**：导入面板默认常驻显示，会优先显示已缓存会议，并在点击搜索框时获取最新推荐。/ The import panel stays visible by default, shows cached conferences first, and refreshes recommendations when the search field is focused.\n- **官网直达**：从 CCFDDL 导入的会议会保留官网链接，加入“我的截止日期”后可直接点击卡片打开会议官网。/ Imported CCFDDL conferences retain their homepage links, and once added to \"My DDLs\" the card can be clicked to open the conference website.\n- **底部工具栏**：中英切换和 CCFDDL 官网入口已移动到底部工具栏，右上角不再放操作项。/ Language switching and the CCFDDL website shortcut now live in the bottom toolbar instead of the top-right corner.\n- **协作入口**：底部工具栏新增 GitHub 仓库链接，可直接打开项目主页参与开发。/ The bottom toolbar now includes a GitHub repository link so you can open the project page and contribute directly.\n- **显示设置**：底部新增设置入口，可切换时间显示为 24 小时制或上午/下午 12 小时制。/ A new settings entry in the bottom bar lets you switch time display between 24-hour and 12-hour formats.\n- **日期顺序**：设置面板新增日期顺序选项，可在“年月日”和“月日年”之间切换。/ The settings panel now includes a date-order option for switching between year/month/day and month/day/year.\n- **底部贴边**：底部工具栏已固定贴到底边，去掉其下方的空白区域。/ The bottom utility bar is now anchored to the popup edge, removing the empty area beneath it.\n- **底部更轻量**：底部工具栏进一步压缩为接近单行文字的样式，语言切换不再保留按钮感。/ The bottom utility bar is further compressed into a near single-line text-style row, and the language toggle no longer looks like a button.\n- **启动误触保护**：弹窗刚打开时会短暂忽略导入入口的误触，避免工具栏点击把“从 CCFDDL 导入”意外点开。/ When the popup first opens, the import entry briefly ignores accidental clicks so the toolbar click does not unintentionally open \"Import from CCFDDL\".\n- **原生弹窗**：点击工具栏图标会打开 Chrome 原生 popup，而不是独立窗口。/ Clicking the toolbar icon opens the native Chrome popup instead of a separate window.\n- **原生日期选择器**：中英文界面都使用 Chrome 原生日期选择器，日期显示格式遵循浏览器或系统本地化设置。/ Both languages use Chrome's native date picker, and the displayed format follows browser or system localization.\n- **界面微调**：压缩了顶栏高度，并优化了导入区的搜索与提示布局。/ The header is more compact, and the import panel now uses a cleaner search-and-hint layout.\n- **DDL 标题行调整**：数量显示在标题右侧，刷新按钮保持右对齐。/ The DDL header keeps the count beside the title while the Refresh button stays right-aligned.\n- **弹窗图标更新**：弹窗顶部图标改为 `chrome/icons/logo.png`。/ The popup header icon now uses `chrome/icons/logo.png`.\n- **整体更紧凑**：统一压缩了表单、卡片、列表项和按钮的纵向间距。/ The form, cards, list rows, and buttons now use tighter vertical spacing overall.\n- **操作更轻量**：新增表单提交成功后会自动收起，导入面板默认常驻，而推荐会议只在点击搜索框时自动加载。/ The add form closes after a successful submission, the import panel stays visible by default, and recommendations only auto-load when the search field is focused.\n- **内部滚动优先**：尽量避免外层弹窗滚动，“我的 DDL”和推荐会议列表各自在内部滚动。/ The popup avoids outer scrolling as much as possible, with \"My DDLs\" and recommendations scrolling inside their own areas.\n- **入口卡片稳定切换**：导入面板默认展开，再次点击导入卡片会收起它，点击新增卡片会先关闭导入面板。/ The import panel starts expanded, clicking the import card again collapses it, and clicking the add card closes the import panel first.\n- **悬浮搜索选择器**：点击搜索会议输入框时，会自动加载并弹出悬浮的推荐会议列表。/ Clicking the conference search input auto-loads and opens a floating recommendation picker.\n- **入口文案更紧凑**：顶部两个入口卡片的标题和说明文字现在居中显示，并进一步压缩了行高。/ The two top entry cards now center their title and helper text with tighter line height.\n- **入口角标图标**：顶部两个入口卡片的图标移动到左上角，不再额外占用行高。/ The two top entry card icons now sit in the top-left corner without adding extra line height.\n- **导入图标优化**：从 CCFDDL 导入入口的角标改为更简洁的搜索图标。/ The CCFDDL import entry badge now uses a cleaner search icon.\n- **英文文案微调**：英文入口卡片的标题和说明文字做了缩短，减少不自然换行。/ The English entry-card title and helper copy were shortened to reduce awkward wrapping.\n- **中文标题调整**：中文界面的“我的 DDL”改为“我的截止日期”。/ The Chinese \"My DDLs\" title was renamed to \"我的截止日期\".\n- **导入提示文案**：搜索框下方增加了一行小字，提示点击搜索框可获取最新会议列表。/ A small helper line below the import search field explains that clicking it loads the latest conference list.\n- **提示与刷新按钮微调**：导入区提示文字改为居中显示，“我的截止日期”的刷新按钮改为图标按钮。/ The import helper text is now centered, and the \"My DDLs\" refresh control now uses an icon button.\n- **刷新图标与动效**：刷新按钮改为更常见的无底框 SVG 图标，并增加旋转动效表示已触发刷新。/ The refresh control now uses a more standard frameless SVG icon and spins briefly to indicate that refresh was triggered.\n\n## 数据存储 / Data\n\n所有数据保存在 `chrome.storage.local` 中，仅在本机可见。/ Stored locally in `chrome.storage.local`.\n","extensions/chrome/README.zh-CN.md":"<div align=\"center\">\n  <img src=\"assets/ccf-ddl-tracker-logo.png\" alt=\"CCF DDL Tracker Logo\" width=\"96\" />\n\n  # CCF DDL Tracker\n\n  轻量的 Chrome 扩展，用于管理 CCF 相关会议截止日期，支持手动添加、CCFDDL 导入和本地提醒。\n\n  **版本:** `v2.0`\n\n  [English Version](README.md) ·\n  [Chrome Web Store](https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb) ·\n  [Chrome 扩展说明](chrome/README.md) ·\n  [CCFDDL 数据源](https://github.com/ccfddl/ccf-deadlines) ·\n  [项目仓库](https://github.com/jaychempan/ccf-ddl-tracker)\n</div>\n\n---\n\n## 预览\n\n<div align=\"center\">\n  <img src=\"assets/previewv2.0.png\" alt=\"CCF DDL Tracker v2.0 中文预览\" width=\"720\" />\n</div>\n\nv2.0 的 popup 更强调紧凑和高效：顶部双入口卡片、默认常驻的导入面板、悬浮会议选择层、底部快捷入口，以及轻量设置面板都集中在同一视图里。\n\n---\n\n## 安装\n\n### Chrome Web Store\n\n可直接从 Chrome 应用商店安装：\n\n<div align=\"center\">\n  <a href=\"https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb\" target=\"_blank\" rel=\"noopener\">\n    <img src=\"https://fonts.gstatic.com/s/i/productlogos/chrome_store/v7/192px.svg\" alt=\"Chrome Web Store\" width=\"56\" height=\"56\" />\n  </a>\n</div>\n\n### 开发者模式安装\n\n1. 打开 Chrome，进入 `chrome://extensions/`。\n2. 打开 `开发者模式`。\n3. 点击 `加载已解压的扩展程序`。\n4. 选择本仓库下的 [`chrome/`](chrome/) 目录。\n5. 固定到工具栏后点击图标即可使用。\n\n<details>\n  <summary>需要更细的扩展说明？</summary>\n\n  可查看 [chrome/README.md](chrome/README.md)。\n</details>\n\n---\n\n\n## 核心功能\n\n- **原生贴靠弹窗**：点击扩展图标后，会直接打开紧凑的 Chrome popup，而不是单独窗口。\n- **手动添加 + 导入会议**：既可以新增自定义截止日期，也可以从 CCFDDL 导入推荐会议。\n- **官网直达**：导入的会议会保留官网链接，加入列表后可直接点击打开会议官网。\n- **中英双语**：可在底部工具栏中切换中文和英文界面。\n- **显示设置**：支持 `24 小时 / 12 小时` 时间制，以及 `年月日 / 月日年` 日期顺序切换。\n- **仅本地存储**：所有数据都保存在 `chrome.storage.local` 中，不依赖账号或云同步。\n\n---\n\n## 自定义\n\n- **语言**：可在 popup 底部切换中文和英文。\n- **时间制式**：可在设置面板中选择 `24 小时` 或 `12 小时（AM/PM）`。\n- **日期顺序**：可切换 `YYYY/MM/DD` 或 `MM/DD/YYYY`。\n- **导入会议卡片**：导入后的会议可加入个人列表，并支持直接跳转会议官网。\n\n---\n\n## 数据来源与隐私\n\n- **主数据源**：[`ccfddl/ccf-deadlines`](https://github.com/ccfddl/ccf-deadlines)\n- **回退数据源**：当 GitHub 数据不可用时，回退到 CCFDDL ICS\n- **存储方式**：`chrome.storage.local`\n- **隐私**：无账号、无云同步、无遥测\n\n---\n\n## 开发\n\n- 仓库：<https://github.com/jaychempan/ccf-ddl-tracker>\n- Chrome 扩展说明：[chrome/README.md](chrome/README.md)\n- 技术栈：Manifest V3、Vanilla JavaScript、`chrome.storage.local`\n- 共同开发：欢迎提交 Issue 和 Pull Request\n\n---\n\n## 更新日志\n\n<details open>\n  <summary><strong>v2.0</strong> - 界面重构、导入优化、设置增强与版本标识</summary>\n\n  - 重构 popup 布局，改为更紧凑的双入口卡片和底部工具栏\n  - 导入面板默认常驻，搜索框点击后弹出悬浮推荐列表\n  - 导入会议支持保留官网链接，加入“我的截止日期”后可点击卡片打开官网\n  - 新增显示设置，支持 `24 小时 / 12 小时` 和 `年月日 / 月日年` 两组偏好\n  - 弹窗右上角增加 `v2.0` 版本标记，并同步升级扩展版本号\n</details>\n\n<details>\n  <summary><strong>v1.0.1</strong> - 刷新与剩余天数修复</summary>\n\n  - 修复日期无法自动更新的问题\n  - 新增手动刷新按钮\n  - 修正当天截止任务显示为 `0 天`\n</details>\n\n---\n\n## License\n\nMIT License\n"},"items":[{"name":"manifest.json","path":"extensions/chrome/chrome/manifest.json","rawUrl":"https://raw.githubusercontent.com/ccfddl/ccf-deadlines/HEAD/extensions/chrome/chrome/manifest.json","title":"CCF DDL Tracker","category":"anthropic-skill","format":"json","content":"{\n  \"manifest_version\": 3,\n  \"name\": \"CCF DDL Tracker\",\n  \"description\": \"Track your upcoming CCF deadlines and see days remaining on the badge.\",\n  \"version\": \"2.0.0\",\n  \"permissions\": [\"storage\", \"alarms\"],\n  \"host_permissions\": [\"https://ccfddl.com/*\", \"https://ccfddl.github.io/*\"],\n  \"action\": {\n    \"default_title\": \"CCF DDL Tracker\",\n    \"default_popup\": \"popup.html\",\n    \"default_icon\": {\n      \"128\": \"icons/icon128.png\"\n    }\n  },\n  \"background\": {\n    \"service_worker\": \"background.js\",\n    \"type\": \"module\"\n  },\n  \"icons\": {\n    \"128\": \"icons/icon128.png\"\n  }\n}\n","frontmatter":{"manifest_version":3,"name":"CCF DDL Tracker","description":"Track your upcoming CCF deadlines and see days remaining on the badge.","version":"2.0.0","permissions":["storage","alarms"],"host_permissions":["https://ccfddl.com/*","https://ccfddl.github.io/*"],"action":{"default_title":"CCF DDL Tracker","default_popup":"popup.html","default_icon":{"128":"icons/icon128.png"}},"background":{"service_worker":"background.js","type":"module"},"icons":{"128":"icons/icon128.png"}},"isInternal":false,"tokens":172,"sizeBytes":575},{"name":"README.zh-CN.md","path":"extensions/chrome/README.zh-CN.md","rawUrl":"https://raw.githubusercontent.com/ccfddl/ccf-deadlines/HEAD/extensions/chrome/README.zh-CN.md","title":"Chrome Skill","category":"anthropic-skill","format":"markdown","content":"<div align=\"center\">\n  <img src=\"assets/ccf-ddl-tracker-logo.png\" alt=\"CCF DDL Tracker Logo\" width=\"96\" />\n\n  # CCF DDL Tracker\n\n  轻量的 Chrome 扩展，用于管理 CCF 相关会议截止日期，支持手动添加、CCFDDL 导入和本地提醒。\n\n  **版本:** `v2.0`\n\n  [English Version](README.md) ·\n  [Chrome Web Store](https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb) ·\n  [Chrome 扩展说明](chrome/README.md) ·\n  [CCFDDL 数据源](https://github.com/ccfddl/ccf-deadlines) ·\n  [项目仓库](https://github.com/jaychempan/ccf-ddl-tracker)\n</div>\n\n---\n\n## 预览\n\n<div align=\"center\">\n  <img src=\"assets/previewv2.0.png\" alt=\"CCF DDL Tracker v2.0 中文预览\" width=\"720\" />\n</div>\n\nv2.0 的 popup 更强调紧凑和高效：顶部双入口卡片、默认常驻的导入面板、悬浮会议选择层、底部快捷入口，以及轻量设置面板都集中在同一视图里。\n\n---\n\n## 安装\n\n### Chrome Web Store\n\n可直接从 Chrome 应用商店安装：\n\n<div align=\"center\">\n  <a href=\"https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb\" target=\"_blank\" rel=\"noopener\">\n    <img src=\"https://fonts.gstatic.com/s/i/productlogos/chrome_store/v7/192px.svg\" alt=\"Chrome Web Store\" width=\"56\" height=\"56\" />\n  </a>\n</div>\n\n### 开发者模式安装\n\n1. 打开 Chrome，进入 `chrome://extensions/`。\n2. 打开 `开发者模式`。\n3. 点击 `加载已解压的扩展程序`。\n4. 选择本仓库下的 [`chrome/`](chrome/) 目录。\n5. 固定到工具栏后点击图标即可使用。\n\n<details>\n  <summary>需要更细的扩展说明？</summary>\n\n  可查看 [chrome/README.md](chrome/README.md)。\n</details>\n\n---\n\n\n## 核心功能\n\n- **原生贴靠弹窗**：点击扩展图标后，会直接打开紧凑的 Chrome popup，而不是单独窗口。\n- **手动添加 + 导入会议**：既可以新增自定义截止日期，也可以从 CCFDDL 导入推荐会议。\n- **官网直达**：导入的会议会保留官网链接，加入列表后可直接点击打开会议官网。\n- **中英双语**：可在底部工具栏中切换中文和英文界面。\n- **显示设置**：支持 `24 小时 / 12 小时` 时间制，以及 `年月日 / 月日年` 日期顺序切换。\n- **仅本地存储**：所有数据都保存在 `chrome.storage.local` 中，不依赖账号或云同步。\n\n---\n\n## 自定义\n\n- **语言**：可在 popup 底部切换中文和英文。\n- **时间制式**：可在设置面板中选择 `24 小时` 或 `12 小时（AM/PM）`。\n- **日期顺序**：可切换 `YYYY/MM/DD` 或 `MM/DD/YYYY`。\n- **导入会议卡片**：导入后的会议可加入个人列表，并支持直接跳转会议官网。\n\n---\n\n## 数据来源与隐私\n\n- **主数据源**：[`ccfddl/ccf-deadlines`](https://github.com/ccfddl/ccf-deadlines)\n- **回退数据源**：当 GitHub 数据不可用时，回退到 CCFDDL ICS\n- **存储方式**：`chrome.storage.local`\n- **隐私**：无账号、无云同步、无遥测\n\n---\n\n## 开发\n\n- 仓库：<https://github.com/jaychempan/ccf-ddl-tracker>\n- Chrome 扩展说明：[chrome/README.md](chrome/README.md)\n- 技术栈：Manifest V3、Vanilla JavaScript、`chrome.storage.local`\n- 共同开发：欢迎提交 Issue 和 Pull Request\n\n---\n\n## 更新日志\n\n<details open>\n  <summary><strong>v2.0</strong> - 界面重构、导入优化、设置增强与版本标识</summary>\n\n  - 重构 popup 布局，改为更紧凑的双入口卡片和底部工具栏\n  - 导入面板默认常驻，搜索框点击后弹出悬浮推荐列表\n  - 导入会议支持保留官网链接，加入“我的截止日期”后可点击卡片打开官网\n  - 新增显示设置，支持 `24 小时 / 12 小时` 和 `年月日 / 月日年` 两组偏好\n  - 弹窗右上角增加 `v2.0` 版本标记，并同步升级扩展版本号\n</details>\n\n<details>\n  <summary><strong>v1.0.1</strong> - 刷新与剩余天数修复</summary>\n\n  - 修复日期无法自动更新的问题\n  - 新增手动刷新按钮\n  - 修正当天截止任务显示为 `0 天`\n</details>\n\n---\n\n## License\n\nMIT License\n","isInternal":false,"tokens":1446,"sizeBytes":4131},{"name":"README.md","path":"extensions/chrome/chrome/README.md","rawUrl":"https://raw.githubusercontent.com/ccfddl/ccf-deadlines/HEAD/extensions/chrome/chrome/README.md","title":"chrome Documentation","category":"plugin-manifest","format":"markdown","content":"# CCF DDL Tracker (Chrome Extension)\n\n## 使用方法 / Usage\n\n1. 打开 Chrome，进入 `chrome://extensions/`。/ Open Chrome and go to `chrome://extensions/`.\n2. 打开右上角的“开发者模式”。/ Enable “Developer mode”.\n3. 点击“加载已解压的扩展程序”，选择本仓库的 `chrome/` 目录。/ Click “Load unpacked” and select `chrome/`.\n4. 安装完成后，点击浏览器工具栏的“CCF DDL Tracker”图标。/ Click the toolbar icon.\n\n## 功能说明 / Features\n\n- **当前版本**：扩展版本已更新为 `v2.0`，弹窗右上角会显示版本标记。/ The extension is now `v2.0`, and the popup header shows the current version.\n- **添加 DDL**：填写标题、日期、时间，点击“添加”。/ Add title/date/time and click “Add”.\n- **查看详情**：弹窗中会按时间排序展示多个 DDL，并显示剩余天数。/ Sorted list with remaining days.\n- **徽标提示**：工具栏图标会显示最近一个 DDL 的剩余天数。/ Badge shows the nearest days left.\n- **删除 DDL**：在条目右侧点击“删除”。/ Delete from the list.\n- **双入口卡片**：新增截止日期和从 CCFDDL 导入改为一行两个入口卡片，点击后切换下方面板。/ Add DDL and Import from CCFDDL now appear as two side-by-side entry cards that switch the panel below.\n- **导入推荐会议**：导入面板默认常驻显示，会优先显示已缓存会议，并在点击搜索框时获取最新推荐。/ The import panel stays visible by default, shows cached conferences first, and refreshes recommendations when the search field is focused.\n- **官网直达**：从 CCFDDL 导入的会议会保留官网链接，加入“我的截止日期”后可直接点击卡片打开会议官网。/ Imported CCFDDL conferences retain their homepage links, and once added to \"My DDLs\" the card can be clicked to open the conference website.\n- **底部工具栏**：中英切换和 CCFDDL 官网入口已移动到底部工具栏，右上角不再放操作项。/ Language switching and the CCFDDL website shortcut now live in the bottom toolbar instead of the top-right corner.\n- **协作入口**：底部工具栏新增 GitHub 仓库链接，可直接打开项目主页参与开发。/ The bottom toolbar now includes a GitHub repository link so you can open the project page and contribute directly.\n- **显示设置**：底部新增设置入口，可切换时间显示为 24 小时制或上午/下午 12 小时制。/ A new settings entry in the bottom bar lets you switch time display between 24-hour and 12-hour formats.\n- **日期顺序**：设置面板新增日期顺序选项，可在“年月日”和“月日年”之间切换。/ The settings panel now includes a date-order option for switching between year/month/day and month/day/year.\n- **底部贴边**：底部工具栏已固定贴到底边，去掉其下方的空白区域。/ The bottom utility bar is now anchored to the popup edge, removing the empty area beneath it.\n- **底部更轻量**：底部工具栏进一步压缩为接近单行文字的样式，语言切换不再保留按钮感。/ The bottom utility bar is further compressed into a near single-line text-style row, and the language toggle no longer looks like a button.\n- **启动误触保护**：弹窗刚打开时会短暂忽略导入入口的误触，避免工具栏点击把“从 CCFDDL 导入”意外点开。/ When the popup first opens, the import entry briefly ignores accidental clicks so the toolbar click does not unintentionally open \"Import from CCFDDL\".\n- **原生弹窗**：点击工具栏图标会打开 Chrome 原生 popup，而不是独立窗口。/ Clicking the toolbar icon opens the native Chrome popup instead of a separate window.\n- **原生日期选择器**：中英文界面都使用 Chrome 原生日期选择器，日期显示格式遵循浏览器或系统本地化设置。/ Both languages use Chrome's native date picker, and the displayed format follows browser or system localization.\n- **界面微调**：压缩了顶栏高度，并优化了导入区的搜索与提示布局。/ The header is more compact, and the import panel now uses a cleaner search-and-hint layout.\n- **DDL 标题行调整**：数量显示在标题右侧，刷新按钮保持右对齐。/ The DDL header keeps the count beside the title while the Refresh button stays right-aligned.\n- **弹窗图标更新**：弹窗顶部图标改为 `chrome/icons/logo.png`。/ The popup header icon now uses `chrome/icons/logo.png`.\n- **整体更紧凑**：统一压缩了表单、卡片、列表项和按钮的纵向间距。/ The form, cards, list rows, and buttons now use tighter vertical spacing overall.\n- **操作更轻量**：新增表单提交成功后会自动收起，导入面板默认常驻，而推荐会议只在点击搜索框时自动加载。/ The add form closes after a successful submission, the import panel stays visible by default, and recommendations only auto-load when the search field is focused.\n- **内部滚动优先**：尽量避免外层弹窗滚动，“我的 DDL”和推荐会议列表各自在内部滚动。/ The popup avoids outer scrolling as much as possible, with \"My DDLs\" and recommendations scrolling inside their own areas.\n- **入口卡片稳定切换**：导入面板默认展开，再次点击导入卡片会收起它，点击新增卡片会先关闭导入面板。/ The import panel starts expanded, clicking the import card again collapses it, and clicking the add card closes the import panel first.\n- **悬浮搜索选择器**：点击搜索会议输入框时，会自动加载并弹出悬浮的推荐会议列表。/ Clicking the conference search input auto-loads and opens a floating recommendation picker.\n- **入口文案更紧凑**：顶部两个入口卡片的标题和说明文字现在居中显示，并进一步压缩了行高。/ The two top entry cards now center their title and helper text with tighter line height.\n- **入口角标图标**：顶部两个入口卡片的图标移动到左上角，不再额外占用行高。/ The two top entry card icons now sit in the top-left corner without adding extra line height.\n- **导入图标优化**：从 CCFDDL 导入入口的角标改为更简洁的搜索图标。/ The CCFDDL import entry badge now uses a cleaner search icon.\n- **英文文案微调**：英文入口卡片的标题和说明文字做了缩短，减少不自然换行。/ The English entry-card title and helper copy were shortened to reduce awkward wrapping.\n- **中文标题调整**：中文界面的“我的 DDL”改为“我的截止日期”。/ The Chinese \"My DDLs\" title was renamed to \"我的截止日期\".\n- **导入提示文案**：搜索框下方增加了一行小字，提示点击搜索框可获取最新会议列表。/ A small helper line below the import search field explains that clicking it loads the latest conference list.\n- **提示与刷新按钮微调**：导入区提示文字改为居中显示，“我的截止日期”的刷新按钮改为图标按钮。/ The import helper text is now centered, and the \"My DDLs\" refresh control now uses an icon button.\n- **刷新图标与动效**：刷新按钮改为更常见的无底框 SVG 图标，并增加旋转动效表示已触发刷新。/ The refresh control now uses a more standard frameless SVG icon and spins briefly to indicate that refresh was triggered.\n\n## 数据存储 / Data\n\n所有数据保存在 `chrome.storage.local` 中，仅在本机可见。/ Stored locally in `chrome.storage.local`.\n","isInternal":false,"tokens":2145,"sizeBytes":7561},{"name":"README.md","path":"extensions/chrome/README.md","rawUrl":"https://raw.githubusercontent.com/ccfddl/ccf-deadlines/HEAD/extensions/chrome/README.md","title":"chrome Documentation","category":"plugin-manifest","format":"markdown","content":"<div align=\"center\">\n  <img src=\"assets/ccf-ddl-tracker-logo.png\" alt=\"CCF DDL Tracker Logo\" width=\"96\" />\n\n  # CCF DDL Tracker\n\n  Chrome extension for tracking CCF deadlines with a compact popup, import flow, and local-only storage.\n\n  **Version:** `v2.0`\n\n  [中文版本](README.zh-CN.md) ·\n  [Chrome Web Store](https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb) ·\n  [Chrome Extension README](chrome/README.md) ·\n  [CCFDDL Source](https://github.com/ccfddl/ccf-deadlines) ·\n  [Repository](https://github.com/jaychempan/ccf-ddl-tracker)\n</div>\n\n---\n\n## Preview\n\n<div align=\"center\">\n  <img src=\"assets/previewv2.0.png\" alt=\"CCF DDL Tracker v2.0 Preview\" width=\"720\" />\n</div>\n\nThe v2.0 popup focuses on density and speed: compact top cards, a persistent import panel, a floating conference picker, footer shortcuts, and a lightweight settings popover.\n\n---\n\n## Install\n\n### Chrome Web Store\n\nInstall directly from the Chrome Web Store:\n\n<div align=\"center\">\n  <a href=\"https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb\" target=\"_blank\" rel=\"noopener\">\n    <img src=\"https://fonts.gstatic.com/s/i/productlogos/chrome_store/v7/192px.svg\" alt=\"Chrome Web Store\" width=\"56\" height=\"56\" />\n  </a>\n</div>\n\n### Load Unpacked\n\n1. Open Chrome and visit `chrome://extensions/`.\n2. Enable `Developer mode`.\n3. Click `Load unpacked`.\n4. Select the [`chrome/`](chrome/) directory in this repository.\n5. Pin `CCF DDL Tracker` to the toolbar and click the icon to use it.\n\n<details>\n  <summary>Need more extension-specific details?</summary>\n\n  See [chrome/README.md](chrome/README.md) for the extension-only guide.\n</details>\n\n---\n\n\n## Highlights\n\n- **Native popup experience**: Clicking the extension icon opens a compact Chrome popup instead of a separate window.\n- **Manual + imported deadlines**: You can add custom deadlines or import recommended conferences from CCFDDL.\n- **Official site shortcuts**: Imported conferences retain homepage links, and added cards can open the conference website directly.\n- **Bilingual UI**: Switch between Chinese and English from the bottom toolbar.\n- **Display preferences**: Choose 24-hour or 12-hour time, and switch date order between `YYYY/MM/DD` and `MM/DD/YYYY`.\n- **Local-only data**: All data stays in `chrome.storage.local`, with no account or cloud sync.\n\n---\n\n## Customization\n\n- **Language**: Toggle between Chinese and English from the popup footer.\n- **Time format**: Choose `24-hour` or `12-hour (AM/PM)` in the settings panel.\n- **Date order**: Choose `YYYY/MM/DD` or `MM/DD/YYYY`.\n- **Imported conference cards**: Imported items can be added to your own list and opened directly on the conference website.\n\n---\n\n## Data Source & Privacy\n\n- **Primary source**: [`ccfddl/ccf-deadlines`](https://github.com/ccfddl/ccf-deadlines)\n- **Fallback**: CCFDDL ICS feeds when GitHub data is unavailable\n- **Storage**: `chrome.storage.local`\n- **Privacy**: no account, no cloud sync, no telemetry\n\n---\n\n## Development\n\n- Repository: <https://github.com/jaychempan/ccf-ddl-tracker>\n- Chrome extension docs: [chrome/README.md](chrome/README.md)\n- Tech stack: Manifest V3, Vanilla JavaScript, `chrome.storage.local`\n- Contribution: Issues and pull requests are welcome\n\n---\n\n## Changelog\n\n<details open>\n  <summary><strong>v2.0</strong> - UI overhaul, import improvements, settings, and versioning</summary>\n\n  - Reworked the popup into a denser layout with two entry cards and a bottom utility bar\n  - Kept the import panel visible by default while moving recommendations into a floating search picker\n  - Imported conferences now keep homepage links and added cards can open the official conference site\n  - Added display settings for `24-hour / 12-hour` time and `year-month-day / month-day-year` date order\n  - Added a `v2.0` version label in the popup header and bumped the extension version\n</details>\n\n<details>\n  <summary><strong>v1.0.1</strong> - Refresh and day-count fixes</summary>\n\n  - Fixed automatic date refresh issues\n  - Added a manual refresh button\n  - Corrected same-day deadlines to display `0 days`\n</details>\n\n---\n\n## License\n\nMIT License\n","isInternal":false,"tokens":1056,"sizeBytes":4195},{"name":"readme.md","path":"extensions/cli/readme.md","rawUrl":"https://raw.githubusercontent.com/ccfddl/ccf-deadlines/HEAD/extensions/cli/readme.md","title":"cli Documentation","category":"plugin-manifest","format":"markdown","content":"# ccfddl cli\n\nCLI tool for CCFDDL - Conference Deadline Tracker\n\n## Install\n\n```bash\npip install -e \".[dev]\"\n```\n\n## Usage\n\n```bash\n# Show help\nccfddl --help\n\n# List all categories\nccfddl --list-categories\n\n# Filter by conference, subcategory, rank\nccfddl --conf CVPR ICCV --sub AI --rank A\n\n# JSON output\nccfddl --json --sub AI\n\n# Show version\nccfddl --version\n```\n\n### Arguments\n\n| Argument | Type  | Description                          | Example            |\n| -------- | ----- | -------------------------------- ----| ------------------ |\n| `--conf` | str[] | A list of conference IDs to filter.  | `--conf CVPR ICCV` |\n| `--sub`  | str[] | A list of subcategory IDs to filter. | `--sub AI CG`      |\n| `--rank` | str[] | A list of ranks to filter.           | `--rank A B`       |\n| `--json` | flag  | Output in JSON format.               | `--json`           |\n| `--list-categories` | flag | List all categories.          | `--list-categories`|\n| `--url`  | str   | Custom URL for conference data.      | `--url https://...`|\n| `--version` | flag | Show version.                       | `--version`        |\n\n## Generate iCal/RSS Feeds\n\n```bash\n# Generate iCal files (requires xlin package)\npython -m ccfddl.convert_to_ical\n\n# Generate RSS files\npython -m ccfddl.convert_to_rss\n\n# From the repository root, declare self links for published feeds\npython extensions/cli/ccfddl/convert_to_rss.py --output-dir feeds --feed-base-url https://example.com/feeds/\n```\n\n`--feed-base-url` adds an RSS `atom:link rel=\"self\"` for each published feed,\nincluding language and ranking/category variants. Omit it for local exports\nwhose public URL is unknown.\n\n## Project Structure\n\n```\nccfddl/\n├── __init__.py      # Package entry, exports public API\n├── __main__.py      # CLI entry point\n├── fetch.py         # Data fetching and processing\n├── output.py        # Output formatting (table, JSON)\n├── models.py        # Data models\n├── utils.py         # Utility functions\n├── convert_to_ical.py\n├── convert_to_rss.py\n└── tests/           # Test suite\n```\n\n## Development\n\n```bash\n# Install dev dependencies\npip install -e \".[dev]\"\n\n# Run tests\npython -m pytest ccfddl/tests/ -v\n\n# Run tests with coverage\npython -m pytest ccfddl/tests/ --cov=ccfddl --cov-report=html\n\n# Type checking\nmypy ccfddl/\n```\n\n## Python API\n\n```python\nfrom ccfddl import (\n    # Models\n    Conference, ConferenceYear, Timeline, Rank, Category,\n    CATEGORIES, VALID_SUBS,\n    get_category_by_sub, get_all_subs, is_valid_sub,\n    # Utils\n    load_mapping, get_timezone, reverse_index,\n    format_duration, parse_datetime_with_tz,\n    # Fetch & Output\n    fetch_conferences, process_conference_deadlines, filter_results,\n    output_table, output_json, list_categories,\n)\n\n# Get category info\ncat = get_category_by_sub(\"AI\")\nprint(cat.name)  # 人工智能\nprint(cat.name_en)  # Artificial Intelligence\n\n# Parse timezone\nfrom datetime import datetime\ntz = get_timezone(\"UTC+8\")\ndt = datetime(2025, 1, 15, 23, 59, 59, tzinfo=tz)\n```\n","isInternal":false,"tokens":822,"sizeBytes":3050},{"name":"readme.md","path":"extensions/ical/readme.md","rawUrl":"https://raw.githubusercontent.com/ccfddl/ccf-deadlines/HEAD/extensions/ical/readme.md","title":"ical Documentation","category":"plugin-manifest","format":"markdown","content":"## iCal Subscription:\n\n- English: `https://ccfddl.com/conference/deadlines/deadlines_en.ics`\n- 简体中文: `https://ccfddl.com/conference/deadlines/deadlines_zh.ics`\n\nCalendar (`.ics`) and RSS (`.xml`) feeds are published in `/conference/deadlines/`. Existing `/conference/deadlines_*.ics` and `.xml` subscriptions redirect to the new folder through the Cloudflare Worker.\n\nThe deployment generates files directly in that folder using `--output-dir public/conference/deadlines`. Without `--output-dir`, the CLI still writes to the current directory.\n\n<img src=\"../../.readme_assets/screenshot_iCal.jpg\" width=\"500px\"/>\n\nThe filter is mapped to the name of iCal file in the following rules:\n\n- no filter: `deadlines_en.ics` and `deadlines_zh.ics`\n- one filter: `deadlines_{lang}_{ccf_rank}.ics`, `deadlines_{lang}_{core_rank}.ics`, `deadlines_{lang}_{thcpl_rank}.ics`, or `deadlines_{lang}_{sub}.ics`\n- two filters: any ordered pair among `ccf_rank`, `core_rank`, `thcpl_rank`, and `sub`\n- three filters: any ordered triple among `ccf_rank`, `core_rank`, `thcpl_rank`, and `sub`\n- four filters: `deadlines_{lang}_{ccf_rank}_{core_rank}_{thcpl_rank}_{sub}.ics`\n\nFor example, given filter: lang=en, core=A, thcpl=B, sub=SE, it will refer to `deadlines_en_core_A_thcpl_B_SE.ics`.\n\nFor `A*`, the generated filename uses `Astar`, for example `deadlines_en_core_Astar_SE.ics`.\n","isInternal":false,"tokens":388,"sizeBytes":1372}],"systemPromptSnippet":"<yakaai_skills repo=\"ccfddl/ccf-deadlines\">\n<!-- File: extensions/chrome/chrome/manifest.json (Tokens: ~172 | Category: anthropic-skill) -->\n{\n  \"manifest_version\": 3,\n  \"name\": \"CCF DDL Tracker\",\n  \"description\": \"Track your upcoming CCF deadlines and see days remaining on the badge.\",\n  \"version\": \"2.0.0\",\n  \"permissions\": [\"storage\", \"alarms\"],\n  \"host_permissions\": [\"https://ccfddl.com/*\", \"https://ccfddl.github.io/*\"],\n  \"action\": {\n    \"default_title\": \"CCF DDL Tracker\",\n    \"default_popup\": \"popup.html\",\n    \"default_icon\": {\n      \"128\": \"icons/icon128.png\"\n    }\n  },\n  \"background\": {\n    \"service_worker\": \"background.js\",\n    \"type\": \"module\"\n  },\n  \"icons\": {\n    \"128\": \"icons/icon128.png\"\n  }\n}\n\n<!-- File: extensions/chrome/README.zh-CN.md (Tokens: ~1446 | Category: anthropic-skill) -->\n<div align=\"center\">\n  <img src=\"assets/ccf-ddl-tracker-logo.png\" alt=\"CCF DDL Tracker Logo\" width=\"96\" />\n\n  # CCF DDL Tracker\n\n  轻量的 Chrome 扩展，用于管理 CCF 相关会议截止日期，支持手动添加、CCFDDL 导入和本地提醒。\n\n  **版本:** `v2.0`\n\n  [English Version](README.md) ·\n  [Chrome Web Store](https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb) ·\n  [Chrome 扩展说明](chrome/README.md) ·\n  [CCFDDL 数据源](https://github.com/ccfddl/ccf-deadlines) ·\n  [项目仓库](https://github.com/jaychempan/ccf-ddl-tracker)\n</div>\n\n---\n\n## 预览\n\n<div align=\"center\">\n  <img src=\"assets/previewv2.0.png\" alt=\"CCF DDL Tracker v2.0 中文预览\" width=\"720\" />\n</div>\n\nv2.0 的 popup 更强调紧凑和高效：顶部双入口卡片、默认常驻的导入面板、悬浮会议选择层、底部快捷入口，以及轻量设置面板都集中在同一视图里。\n\n---\n\n## 安装\n\n### Chrome Web Store\n\n可直接从 Chrome 应用商店安装：\n\n<div align=\"center\">\n  <a href=\"https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb\" target=\"_blank\" rel=\"noopener\">\n    <img src=\"https://fonts.gstatic.com/s/i/productlogos/chrome_store/v7/192px.svg\" alt=\"Chrome Web Store\" width=\"56\" height=\"56\" />\n  </a>\n</div>\n\n### 开发者模式安装\n\n1. 打开 Chrome，进入 `chrome://extensions/`。\n2. 打开 `开发者模式`。\n3. 点击 `加载已解压的扩展程序`。\n4. 选择本仓库下的 [`chrome/`](chrome/) 目录。\n5. 固定到工具栏后点击图标即可使用。\n\n<details>\n  <summary>需要更细的扩展说明？</summary>\n\n  可查看 [chrome/README.md](chrome/README.md)。\n</details>\n\n---\n\n\n## 核心功能\n\n- **原生贴靠弹窗**：点击扩展图标后，会直接打开紧凑的 Chrome popup，而不是单独窗口。\n- **手动添加 + 导入会议**：既可以新增自定义截止日期，也可以从 CCFDDL 导入推荐会议。\n- **官网直达**：导入的会议会保留官网链接，加入列表后可直接点击打开会议官网。\n- **中英双语**：可在底部工具栏中切换中文和英文界面。\n- **显示设置**：支持 `24 小时 / 12 小时` 时间制，以及 `年月日 / 月日年` 日期顺序切换。\n- **仅本地存储**：所有数据都保存在 `chrome.storage.local` 中，不依赖账号或云同步。\n\n---\n\n## 自定义\n\n- **语言**：可在 popup 底部切换中文和英文。\n- **时间制式**：可在设置面板中选择 `24 小时` 或 `12 小时（AM/PM）`。\n- **日期顺序**：可切换 `YYYY/MM/DD` 或 `MM/DD/YYYY`。\n- **导入会议卡片**：导入后的会议可加入个人列表，并支持直接跳转会议官网。\n\n---\n\n## 数据来源与隐私\n\n- **主数据源**：[`ccfddl/ccf-deadlines`](https://github.com/ccfddl/ccf-deadlines)\n- **回退数据源**：当 GitHub 数据不可用时，回退到 CCFDDL ICS\n- **存储方式**：`chrome.storage.local`\n- **隐私**：无账号、无云同步、无遥测\n\n---\n\n## 开发\n\n- 仓库：<https://github.com/jaychempan/ccf-ddl-tracker>\n- Chrome 扩展说明：[chrome/README.md](chrome/README.md)\n- 技术栈：Manifest V3、Vanilla JavaScript、`chrome.storage.local`\n- 共同开发：欢迎提交 Issue 和 Pull Request\n\n---\n\n## 更新日志\n\n<details open>\n  <summary><strong>v2.0</strong> - 界面重构、导入优化、设置增强与版本标识</summary>\n\n  - 重构 popup 布局，改为更紧凑的双入口卡片和底部工具栏\n  - 导入面板默认常驻，搜索框点击后弹出悬浮推荐列表\n  - 导入会议支持保留官网链接，加入“我的截止日期”后可点击卡片打开官网\n  - 新增显示设置，支持 `24 小时 / 12 小时` 和 `年月日 / 月日年` 两组偏好\n  - 弹窗右上角增加 `v2.0` 版本标记，并同步升级扩展版本号\n</details>\n\n<details>\n  <summary><strong>v1.0.1</strong> - 刷新与剩余天数修复</summary>\n\n  - 修复日期无法自动更新的问题\n  - 新增手动刷新按钮\n  - 修正当天截止任务显示为 `0 天`\n</details>\n\n---\n\n## License\n\nMIT License\n\n<!-- File: extensions/chrome/chrome/README.md (Tokens: ~2145 | Category: plugin-manifest) -->\n# CCF DDL Tracker (Chrome Extension)\n\n## 使用方法 / Usage\n\n1. 打开 Chrome，进入 `chrome://extensions/`。/ Open Chrome and go to `chrome://extensions/`.\n2. 打开右上角的“开发者模式”。/ Enable “Developer mode”.\n3. 点击“加载已解压的扩展程序”，选择本仓库的 `chrome/` 目录。/ Click “Load unpacked” and select `chrome/`.\n4. 安装完成后，点击浏览器工具栏的“CCF DDL Tracker”图标。/ Click the toolbar icon.\n\n## 功能说明 / Features\n\n- **当前版本**：扩展版本已更新为 `v2.0`，弹窗右上角会显示版本标记。/ The extension is now `v2.0`, and the popup header shows the current version.\n- **添加 DDL**：填写标题、日期、时间，点击“添加”。/ Add title/date/time and click “Add”.\n- **查看详情**：弹窗中会按时间排序展示多个 DDL，并显示剩余天数。/ Sorted list with remaining days.\n- **徽标提示**：工具栏图标会显示最近一个 DDL 的剩余天数。/ Badge shows the nearest days left.\n- **删除 DDL**：在条目右侧点击“删除”。/ Delete from the list.\n- **双入口卡片**：新增截止日期和从 CCFDDL 导入改为一行两个入口卡片，点击后切换下方面板。/ Add DDL and Import from CCFDDL now appear as two side-by-side entry cards that switch the panel below.\n- **导入推荐会议**：导入面板默认常驻显示，会优先显示已缓存会议，并在点击搜索框时获取最新推荐。/ The import panel stays visible by default, shows cached conferences first, and refreshes recommendations when the search field is focused.\n- **官网直达**：从 CCFDDL 导入的会议会保留官网链接，加入“我的截止日期”后可直接点击卡片打开会议官网。/ Imported CCFDDL conferences retain their homepage links, and once added to \"My DDLs\" the card can be clicked to open the conference website.\n- **底部工具栏**：中英切换和 CCFDDL 官网入口已移动到底部工具栏，右上角不再放操作项。/ Language switching and the CCFDDL website shortcut now live in the bottom toolbar instead of the top-right corner.\n- **协作入口**：底部工具栏新增 GitHub 仓库链接，可直接打开项目主页参与开发。/ The bottom toolbar now includes a GitHub repository link so you can open the project page and contribute directly.\n- **显示设置**：底部新增设置入口，可切换时间显示为 24 小时制或上午/下午 12 小时制。/ A new settings entry in the bottom bar lets you switch time display between 24-hour and 12-hour formats.\n- **日期顺序**：设置面板新增日期顺序选项，可在“年月日”和“月日年”之间切换。/ The settings panel now includes a date-order option for switching between year/month/day and month/day/year.\n- **底部贴边**：底部工具栏已固定贴到底边，去掉其下方的空白区域。/ The bottom utility bar is now anchored to the popup edge, removing the empty area beneath it.\n- **底部更轻量**：底部工具栏进一步压缩为接近单行文字的样式，语言切换不再保留按钮感。/ The bottom utility bar is further compressed into a near single-line text-style row, and the language toggle no longer looks like a button.\n- **启动误触保护**：弹窗刚打开时会短暂忽略导入入口的误触，避免工具栏点击把“从 CCFDDL 导入”意外点开。/ When the popup first opens, the import entry briefly ignores accidental clicks so the toolbar click does not unintentionally open \"Import from CCFDDL\".\n- **原生弹窗**：点击工具栏图标会打开 Chrome 原生 popup，而不是独立窗口。/ Clicking the toolbar icon opens the native Chrome popup instead of a separate window.\n- **原生日期选择器**：中英文界面都使用 Chrome 原生日期选择器，日期显示格式遵循浏览器或系统本地化设置。/ Both languages use Chrome's native date picker, and the displayed format follows browser or system localization.\n- **界面微调**：压缩了顶栏高度，并优化了导入区的搜索与提示布局。/ The header is more compact, and the import panel now uses a cleaner search-and-hint layout.\n- **DDL 标题行调整**：数量显示在标题右侧，刷新按钮保持右对齐。/ The DDL header keeps the count beside the title while the Refresh button stays right-aligned.\n- **弹窗图标更新**：弹窗顶部图标改为 `chrome/icons/logo.png`。/ The popup header icon now uses `chrome/icons/logo.png`.\n- **整体更紧凑**：统一压缩了表单、卡片、列表项和按钮的纵向间距。/ The form, cards, list rows, and buttons now use tighter vertical spacing overall.\n- **操作更轻量**：新增表单提交成功后会自动收起，导入面板默认常驻，而推荐会议只在点击搜索框时自动加载。/ The add form closes after a successful submission, the import panel stays visible by default, and recommendations only auto-load when the search field is focused.\n- **内部滚动优先**：尽量避免外层弹窗滚动，“我的 DDL”和推荐会议列表各自在内部滚动。/ The popup avoids outer scrolling as much as possible, with \"My DDLs\" and recommendations scrolling inside their own areas.\n- **入口卡片稳定切换**：导入面板默认展开，再次点击导入卡片会收起它，点击新增卡片会先关闭导入面板。/ The import panel starts expanded, clicking the import card again collapses it, and clicking the add card closes the import panel first.\n- **悬浮搜索选择器**：点击搜索会议输入框时，会自动加载并弹出悬浮的推荐会议列表。/ Clicking the conference search input auto-loads and opens a floating recommendation picker.\n- **入口文案更紧凑**：顶部两个入口卡片的标题和说明文字现在居中显示，并进一步压缩了行高。/ The two top entry cards now center their title and helper text with tighter line height.\n- **入口角标图标**：顶部两个入口卡片的图标移动到左上角，不再额外占用行高。/ The two top entry card icons now sit in the top-left corner without adding extra line height.\n- **导入图标优化**：从 CCFDDL 导入入口的角标改为更简洁的搜索图标。/ The CCFDDL import entry badge now uses a cleaner search icon.\n- **英文文案微调**：英文入口卡片的标题和说明文字做了缩短，减少不自然换行。/ The English entry-card title and helper copy were shortened to reduce awkward wrapping.\n- **中文标题调整**：中文界面的“我的 DDL”改为“我的截止日期”。/ The Chinese \"My DDLs\" title was renamed to \"我的截止日期\".\n- **导入提示文案**：搜索框下方增加了一行小字，提示点击搜索框可获取最新会议列表。/ A small helper line below the import search field explains that clicking it loads the latest conference list.\n- **提示与刷新按钮微调**：导入区提示文字改为居中显示，“我的截止日期”的刷新按钮改为图标按钮。/ The import helper text is now centered, and the \"My DDLs\" refresh control now uses an icon button.\n- **刷新图标与动效**：刷新按钮改为更常见的无底框 SVG 图标，并增加旋转动效表示已触发刷新。/ The refresh control now uses a more standard frameless SVG icon and spins briefly to indicate that refresh was triggered.\n\n## 数据存储 / Data\n\n所有数据保存在 `chrome.storage.local` 中，仅在本机可见。/ Stored locally in `chrome.storage.local`.\n\n<!-- File: extensions/chrome/README.md (Tokens: ~1056 | Category: plugin-manifest) -->\n<div align=\"center\">\n  <img src=\"assets/ccf-ddl-tracker-logo.png\" alt=\"CCF DDL Tracker Logo\" width=\"96\" />\n\n  # CCF DDL Tracker\n\n  Chrome extension for tracking CCF deadlines with a compact popup, import flow, and local-only storage.\n\n  **Version:** `v2.0`\n\n  [中文版本](README.zh-CN.md) ·\n  [Chrome Web Store](https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb) ·\n  [Chrome Extension README](chrome/README.md) ·\n  [CCFDDL Source](https://github.com/ccfddl/ccf-deadlines) ·\n  [Repository](https://github.com/jaychempan/ccf-ddl-tracker)\n</div>\n\n---\n\n## Preview\n\n<div align=\"center\">\n  <img src=\"assets/previewv2.0.png\" alt=\"CCF DDL Tracker v2.0 Preview\" width=\"720\" />\n</div>\n\nThe v2.0 popup focuses on density and speed: compact top cards, a persistent import panel, a floating conference picker, footer shortcuts, and a lightweight settings popover.\n\n---\n\n## Install\n\n### Chrome Web Store\n\nInstall directly from the Chrome Web Store:\n\n<div align=\"center\">\n  <a href=\"https://chromewebstore.google.com/detail/fnnpcnlkehcbickmdmepjpjimgcleidd?utm_source=item-share-cb\" target=\"_blank\" rel=\"noopener\">\n    <img src=\"https://fonts.gstatic.com/s/i/productlogos/chrome_store/v7/192px.svg\" alt=\"Chrome Web Store\" width=\"56\" height=\"56\" />\n  </a>\n</div>\n\n### Load Unpacked\n\n1. Open Chrome and visit `chrome://extensions/`.\n2. Enable `Developer mode`.\n3. Click `Load unpacked`.\n4. Select the [`chrome/`](chrome/) directory in this repository.\n5. Pin `CCF DDL Tracker` to the toolbar and click the icon to use it.\n\n<details>\n  <summary>Need more extension-specific details?</summary>\n\n  See [chrome/README.md](chrome/README.md) for the extension-only guide.\n</details>\n\n---\n\n\n## Highlights\n\n- **Native popup experience**: Clicking the extension icon opens a compact Chrome popup instead of a separate window.\n- **Manual + imported deadlines**: You can add custom deadlines or import recommended conferences from CCFDDL.\n- **Official site shortcuts**: Imported conferences retain homepage links, and added cards can open the conference website directly.\n- **Bilingual UI**: Switch between Chinese and English from the bottom toolbar.\n- **Display preferences**: Choose 24-hour or 12-hour time, and switch date order between `YYYY/MM/DD` and `MM/DD/YYYY`.\n- **Local-only data**: All data stays in `chrome.storage.local`, with no account or cloud sync.\n\n---\n\n## Customization\n\n- **Language**: Toggle between Chinese and English from the popup footer.\n- **Time format**: Choose `24-hour` or `12-hour (AM/PM)` in the settings panel.\n- **Date order**: Choose `YYYY/MM/DD` or `MM/DD/YYYY`.\n- **Imported conference cards**: Imported items can be added to your own list and opened directly on the conference website.\n\n---\n\n## Data Source & Privacy\n\n- **Primary source**: [`ccfddl/ccf-deadlines`](https://github.com/ccfddl/ccf-deadlines)\n- **Fallback**: CCFDDL ICS feeds when GitHub data is unavailable\n- **Storage**: `chrome.storage.local`\n- **Privacy**: no account, no cloud sync, no telemetry\n\n---\n\n## Development\n\n- Repository: <https://github.com/jaychempan/ccf-ddl-tracker>\n- Chrome extension docs: [chrome/README.md](chrome/README.md)\n- Tech stack: Manifest V3, Vanilla JavaScript, `chrome.storage.local`\n- Contribution: Issues and pull requests are welcome\n\n---\n\n## Changelog\n\n<details open>\n  <summary><strong>v2.0</strong> - UI overhaul, import improvements, settings, and versioning</summary>\n\n  - Reworked the popup into a denser layout with two entry cards and a bottom utility bar\n  - Kept the import panel visible by default while moving recommendations into a floating search picker\n  - Imported conferences now keep homepage links and added cards can open the official conference site\n  - Added display settings for `24-hour / 12-hour` time and `year-month-day / month-day-year` date order\n  - Added a `v2.0` version label in the popup header and bumped the extension version\n</details>\n\n<details>\n  <summary><strong>v1.0.1</strong> - Refresh and day-count fixes</summary>\n\n  - Fixed automatic date refresh issues\n  - Added a manual refresh button\n  - Corrected same-day deadlines to display `0 days`\n</details>\n\n---\n\n## License\n\nMIT License\n\n<!-- File: extensions/cli/readme.md (Tokens: ~822 | Category: plugin-manifest) -->\n# ccfddl cli\n\nCLI tool for CCFDDL - Conference Deadline Tracker\n\n## Install\n\n```bash\npip install -e \".[dev]\"\n```\n\n## Usage\n\n```bash\n# Show help\nccfddl --help\n\n# List all categories\nccfddl --list-categories\n\n# Filter by conference, subcategory, rank\nccfddl --conf CVPR ICCV --sub AI --rank A\n\n# JSON output\nccfddl --json --sub AI\n\n# Show version\nccfddl --version\n```\n\n### Arguments\n\n| Argument | Type  | Description                          | Example            |\n| -------- | ----- | -------------------------------- ----| ------------------ |\n| `--conf` | str[] | A list of conference IDs to filter.  | `--conf CVPR ICCV` |\n| `--sub`  | str[] | A list of subcategory IDs to filter. | `--sub AI CG`      |\n| `--rank` | str[] | A list of ranks to filter.           | `--rank A B`       |\n| `--json` | flag  | Output in JSON format.               | `--json`           |\n| `--list-categories` | flag | List all categories.          | `--list-categories`|\n| `--url`  | str   | Custom URL for conference data.      | `--url https://...`|\n| `--version` | flag | Show version.                       | `--version`        |\n\n## Generate iCal/RSS Feeds\n\n```bash\n# Generate iCal files (requires xlin package)\npython -m ccfddl.convert_to_ical\n\n# Generate RSS files\npython -m ccfddl.convert_to_rss\n\n# From the repository root, declare self links for published feeds\npython extensions/cli/ccfddl/convert_to_rss.py --output-dir feeds --feed-base-url https://example.com/feeds/\n```\n\n`--feed-base-url` adds an RSS `atom:link rel=\"self\"` for each published feed,\nincluding language and ranking/category variants. Omit it for local exports\nwhose public URL is unknown.\n\n## Project Structure\n\n```\nccfddl/\n├── __init__.py      # Package entry, exports public API\n├── __main__.py      # CLI entry point\n├── fetch.py         # Data fetching and processing\n├── output.py        # Output formatting (table, JSON)\n├── models.py        # Data models\n├── utils.py         # Utility functions\n├── convert_to_ical.py\n├── convert_to_rss.py\n└── tests/           # Test suite\n```\n\n## Development\n\n```bash\n# Install dev dependencies\npip install -e \".[dev]\"\n\n# Run tests\npython -m pytest ccfddl/tests/ -v\n\n# Run tests with coverage\npython -m pytest ccfddl/tests/ --cov=ccfddl --cov-report=html\n\n# Type checking\nmypy ccfddl/\n```\n\n## Python API\n\n```python\nfrom ccfddl import (\n    # Models\n    Conference, ConferenceYear, Timeline, Rank, Category,\n    CATEGORIES, VALID_SUBS,\n    get_category_by_sub, get_all_subs, is_valid_sub,\n    # Utils\n    load_mapping, get_timezone, reverse_index,\n    format_duration, parse_datetime_with_tz,\n    # Fetch & Output\n    fetch_conferences, process_conference_deadlines, filter_results,\n    output_table, output_json, list_categories,\n)\n\n# Get category info\ncat = get_category_by_sub(\"AI\")\nprint(cat.name)  # 人工智能\nprint(cat.name_en)  # Artificial Intelligence\n\n# Parse timezone\nfrom datetime import datetime\ntz = get_timezone(\"UTC+8\")\ndt = datetime(2025, 1, 15, 23, 59, 59, tzinfo=tz)\n```\n\n<!-- File: extensions/ical/readme.md (Tokens: ~388 | Category: plugin-manifest) -->\n## iCal Subscription:\n\n- English: `https://ccfddl.com/conference/deadlines/deadlines_en.ics`\n- 简体中文: `https://ccfddl.com/conference/deadlines/deadlines_zh.ics`\n\nCalendar (`.ics`) and RSS (`.xml`) feeds are published in `/conference/deadlines/`. Existing `/conference/deadlines_*.ics` and `.xml` subscriptions redirect to the new folder through the Cloudflare Worker.\n\nThe deployment generates files directly in that folder using `--output-dir public/conference/deadlines`. Without `--output-dir`, the CLI still writes to the current directory.\n\n<img src=\"../../.readme_assets/screenshot_iCal.jpg\" width=\"500px\"/>\n\nThe filter is mapped to the name of iCal file in the following rules:\n\n- no filter: `deadlines_en.ics` and `deadlines_zh.ics`\n- one filter: `deadlines_{lang}_{ccf_rank}.ics`, `deadlines_{lang}_{core_rank}.ics`, `deadlines_{lang}_{thcpl_rank}.ics`, or `deadlines_{lang}_{sub}.ics`\n- two filters: any ordered pair among `ccf_rank`, `core_rank`, `thcpl_rank`, and `sub`\n- three filters: any ordered triple among `ccf_rank`, `core_rank`, `thcpl_rank`, and `sub`\n- four filters: `deadlines_{lang}_{ccf_rank}_{core_rank}_{thcpl_rank}_{sub}.ics`\n\nFor example, given filter: lang=en, core=A, thcpl=B, sub=SE, it will refer to `deadlines_en_core_A_thcpl_B_SE.ics`.\n\nFor `A*`, the generated filename uses `Astar`, for example `deadlines_en_core_Astar_SE.ics`.\n</yakaai_skills>"}