# -*- coding: utf-8 -*- """ 博客构建脚本:blog/posts/*.md -> website/static/blog/(列表 + 文章页)+ website/static/home.html(首页) front matter 格式: --- title: 文章标题 date: 2026-08-13 tags: 工业软件, ResLib --- """ import re from datetime import datetime from pathlib import Path import markdown BASE = Path(__file__).resolve().parent POSTS_DIR = BASE / "posts" OUT_BLOG = BASE.parent / "website" / "static" / "blog" OUT_HOME = BASE.parent / "website" / "static" / "home.html" OUT_ABOUT = BASE.parent / "website" / "static" / "about.html" SITE_NAME = "Easy Data Collection" SEO_NAME = "江北的渔夫的空间" NAV_ITEMS = [ { "key": "research", "href": "/research/", "label": "前沿技术研究", "children": [ ("http://124.220.63.9:25000", "Research Digest"), ("/research/neural/", "Neural Research"), ("/research/reslib/", "ResLib"), ], }, { "key": "tools", "href": "/tools/", "label": "工具开发", "children": [ ("/tools/sequence-diagram/", "Sequence-Diagram"), ("/tools/uni-viewer/", "Uni-Viewer"), ("/tools/engineer-craft/", "Engineer Craft"), ("/tools/five-phases-observer/", "The Five Phases Observer"), ("/tools/unitouch/", "UniTouch Interface"), ("/tools/edc-lite-erp/", "EDC Lite ERP"), ("/tools/physics-ai-fluent/", "Physics AI Fluent"), ], }, { "key": "resources", "href": "/resources/", "label": "资源中心", "children": [], }, { "key": "license", "href": "/license/", "label": "License", "children": [ ("/license/apply", "申请 License"), ("/license/status", "查询 / 下载"), ("/license/package", "资源包获取"), ], }, { "key": "blog", "href": "/blog/", "label": "博客", "children": [], }, ] def nav_html(active: str = "") -> str: parts = [] for item in NAV_ITEMS: if not item["children"]: cls = "nav-link active" if item["key"] == active else "nav-link" parts.append(f' {item["label"]}') continue parent_cls = "nav-link active" if item["key"] == active else "nav-link" links = "\n".join( f' {label}' for href, label in item["children"] ) parts.append( f""" """ ) return "\n".join(parts) def page_header(active: str = "", title: str = "") -> str: seo_title = f"{title} - {SEO_NAME}" if title else SEO_NAME return f""" {seo_title}
""" def page_footer() -> str: return f"""
""" def parse_post(path: Path) -> dict: text = path.read_text(encoding="utf-8") m = re.match(r"^---\s*\n(.*?)\n---\s*\n?(.*)$", text, re.S) front, body = ("", text) if m: front, body = m.group(1), m.group(2) meta = {} for line in front.splitlines(): if ":" in line: k, _, v = line.partition(":") meta[k.strip()] = v.strip() html = markdown.markdown( body, extensions=["extra", "toc", "sane_lists", "attr_list", "admonition"], ) return { "slug": path.stem, "title": meta.get("title", path.stem), "date": meta.get("date", ""), "tags": [t.strip() for t in meta.get("tags", "").split(",") if t.strip()], "html": html, } def summary(html: str, length: int = 120) -> str: text = re.sub(r"<[^>]+>", "", html) text = re.sub(r"\s+", " ", text).strip() if len(text) > length: text = text[:length] + "…" return text def fmt_date(s: str) -> str: try: return datetime.strptime(s, "%Y-%m-%d").strftime("%Y年%m月%d日") except ValueError: return s PRODUCT_CARDS = """
◷
Flutter Desktop

Sequence-Diagram

面向 PLC 流程节拍与相位角设计的时序图设计器,条形 / 圆周双视图。

了解详情 →
◉
Web Component

Uni-Viewer

纯前端、不出网的文件预览组件,271 个扩展名、47 条预览链路。

了解详情 →
⚙
Vue 3 · Vite

Engineer Craft

流程工业智能设计平台:31 个工程计算模块、URS 与 AI 审查。

了解详情 →
✦
GAP 公理协议

The Five Phases Observer

90 域观测协议与 720 个可证伪锚点,让决策可编译、可证伪。

了解详情 →
▦
Flutter · MQTT

UniTouch Interface

嵌入式工控机的设备控制软件,替代传统 HMI 的统一工控平台。

了解详情 →
▣
Electron · MySQL

EDC Lite ERP

轻量资源计划与制造管理系统:物料编码、进销存、扫码称配全链路。

了解详情 →
◍
Python · GPU LBM

Physics AI Fluent

GPU 格子玻尔兹曼流场仿真:流化床空床流场分钟级求解,AI for Science 数据工厂。

了解详情 →
""" def build(): posts = [parse_post(p) for p in sorted(POSTS_DIR.glob("*.md"), reverse=True)] posts.sort(key=lambda p: p["date"], reverse=True) OUT_BLOG.mkdir(parents=True, exist_ok=True) # ---------- 博客列表页 ---------- cards = [] for p in posts: tags = "".join(f'{t}' for t in p["tags"]) cards.append(f"""
{tags}

{p['title']}

{summary(p['html'])}

""") if not cards: cards.append('

暂无文章,敬请期待。

') blog_list = f"""{page_header("blog")}

BLOG · 博客

工程实践与研究记录

工业软件、标准件库、深度学习与工具开发的过程记录。

{''.join(cards)}
{page_footer()}""" (OUT_BLOG / "index.html").write_text(blog_list, encoding="utf-8") # ---------- 文章详情页 ---------- for p in posts: tags = "".join(f'{t}' for t in p["tags"]) html = f"""{page_header("blog", p['title'])}

{p['title']}

{p['html']}
{page_footer()}""" (OUT_BLOG / p["slug"]).mkdir(parents=True, exist_ok=True) (OUT_BLOG / p["slug"] / "index.html").write_text(html, encoding="utf-8") # ---------- 首页 ---------- recent = "".join(f"""

{p['title']}

{summary(p['html'], 90)}

""" for p in posts[:3]) if not recent: recent = '

暂无文章,敬请期待。

' home = f"""{page_header("")}

EASY DATA COLLECTION · SINCOS.CC

数字化、人工智能研究与工程实施

工业软件集成 · 标准化管理 · 深度学习实践

3研究平台
7自研工具
100%私有化部署
Creo · Web · Edge多端形态
RESEARCH DIGEST

国际顶尖科研热榜

自动检索国际顶尖期刊与权威机构的最新成果,AI 输出中文摘要、技术突破总结与 0-5 突破度评分。

  • 31 个信源、21 个关注领域,每日 06:00 自动检索
  • 顶刊、上市公司公告、专利动态一屏掌握
⌕ 21 个领域 每日更新
RESLIB

资源中心管理器 ResLib

面向 Creo 7.0+ 的企业级标准零部件管理库:标准件浏览、3D 预览、搜索过滤、快速装配与 LIC 授权体系。

  • OpenGL 实时预览,装配体递归解析
  • 一键装配与参数定位,MAC 绑定授权
▤ Creo 7.0 - 10.0 3D 实时预览
NEURAL RESEARCH

NeuralMix AI 混合终点判断

ModbusRTU 高速采集 → Redis 缓冲 → TimescaleDB 存储 → 1D-CNN 实时评估混合均匀度,参数稳定即判定完成。

  • 实时 + 静态工艺参数融合建模
  • 支持 Windows / Ubuntu / NVIDIA Jetson
NeuralMix AI 混合终点判定轨迹

工具开发

每一款工具都来自真实项目 —— 独立研发、私有部署、持续迭代。

{PRODUCT_CARDS}

最新文章

{recent}

License 与资源中心

ResLib 授权申请、查询下载与标准件资源包统一入口;私有服务与代码托管在资源中心。

{page_footer()}""" OUT_HOME.write_text(home, encoding="utf-8") # ---------- 关于页 ---------- about = f"""{page_header("")}

ABOUT

关于

Easy Data Collection —— 工业软件与数据产品的独立开发实践。

SinCos

工业软件方向开发者,专注流程工业的数字化与智能化实践。

正在做

  • ResLib:资源中心管理器 —— Creo 7.0+ 标准零部件管理库(Pro/TOOLKIT DLL 插件),支持 License 在线申请与审批
  • Neural Research:NeuralMix AI 混合终点判断与算法研究
  • 工具开发:Sequence-Diagram、Uni-Viewer、Engineer Craft、UniTouch、EDC Lite ERP 等自研产品
  • Research Digest:国际顶尖科研热榜与 AI 突破度分析

联系方式

{page_footer()}""" OUT_ABOUT.write_text(about, encoding="utf-8") print(f"构建完成:{len(posts)} 篇文章 -> {OUT_BLOG} / home.html / about.html") if __name__ == "__main__": build()