267 Commits

Author SHA1 Message Date
augushong
8402da869f 修复中间预览区滚动和表格溢出空白页
- 中间预览区: 改为flex布局, #render-preview设flex:1+min-height:0实现滚动
- 表格溢出: 溢出路径中TABLE块优先用splitTableByRows按行拆分
  替代margin-top负值CSS裁切,避免续接页丢失表头和内容不可见
  第一个chunk与当前页已有内容(H2等)同行,剩余chunks独立成页
2026-05-19 21:23:01 +08:00
augushong
4f1bcae05b 修复中间预览区与右侧画布排版一致性
- 隐藏中间预览区滚动条,消除15px宽度差异
- 统一padding为20px,内容宽度均为500px
- .page-content行高改用CSS变量--pi-line-height
- #paginated-preview加入CSS变量选择器
- 去掉中间预览区右侧边框
2026-05-19 20:52:38 +08:00
augushong
616e7c507b fix(phone-image): 中間預覽區與右側畫布換行位置不一致
根因: #render-preview無padding(內容寬540px), 右側.page-body有padding:20px(內容寬500px),
40px寬度差導致文字換行位置不同。
修復: #render-preview添加padding:var(--pi-spacing)(20px) + box-sizing:border-box,
使中間預覽區內容寬度(500px)與右側畫布一致。
2026-05-19 20:19:17 +08:00
augushong
e937970986 fix(phone-image): 右側畫布字號不生效+字號刷新丟失
1. applyFontScale()新增#paginated-preview的CSS變量設置
   --pi-font-scale/--pi-table-font-scale/--pi-code-font-scale
2. .page-content新增font-size:calc(14px*var(--pi-font-scale,1))
   之前.page-content無font-size設置,右側DOM分頁無法響應字號調整
3. 字號從後端savedConfig正確恢復(fontScale:1.2驗證通過)
2026-05-19 20:08:17 +08:00
augushong
234746aa83 fix(phone-image): 右側正文水平居中問題
根因: .preview-thumb-item有text-align:center, 被子元素.dom-page-container繼承,
導致.page-content內所有文字水平居中。
在.dom-page-container上顯式設置text-align:left覆蓋繼承。
2026-05-19 19:52:46 +08:00
augushong
3867256519 fix(phone-image): 修復5個UI問題
1. 中間預覽區工具欄折行: 縮小字號/間距(gap 8->4, font 12->11px)
2. 右側畫布缺少頁間距: 新增scaleWrapper裁切transform溢出
3. 右側對齊下拉框不可見: select改為正常文檔流,移除position:absolute
4. 正文水平居中: dom-page-content添加text-align:left
5. 列表不顯示序號/圓點: 顯式設置list-style-type + display:list-item
2026-05-19 19:46:11 +08:00
augushong
a587a0c00a fix(phone-image): 修復refreshDomPage鍵不匹配導致對齊不生效
BUG-2修復: refreshDomPage用pageIndex+1讀config.pageAlignments,但setPageAlignment用pageNum寫入。
封面頁佔據index=0時,第一個內容頁的key不一致。
改為從DOM的data-page-num屬性獲取正確的pageNum。
2026-05-19 01:21:27 +08:00
augushong
d098f725be fix(phone-image): 移除未導出的applyFontScale調用
BUG-1修復: PhoneImageEngine.applyFontScale是IIFE內部私有函數,未在公開API導出。
updateConfig()內部已自動調用applyFontScale(),HTML中的直接調用是多餘的且會報錯。
2026-05-19 01:10:10 +08:00
augushong
1ef0a4eabd fix(phone-image): 修復F2審查發現的代碼質量問題
- 移除captureDomPages中冗餘的console.log/error雙寫(統一用PhoneImageLogPanel)
- 修復phone-image:save-config監聽器中無效的三元表達式(L829)
2026-05-19 00:51:49 +08:00
augushong
7bb066b704 feat(phone-image): codeFontScale UI控件+集成
- HTML新增代碼字號下拉選擇控件(0.5x-2.0x+自定義輸入)
- currentConfig初始化恢復codeFontScale
- change事件更新config+applyFontScale+debouncedSaveConfig
- 所有saveConfig/saveImages調用包含codeFontScale
2026-05-19 00:43:29 +08:00
augushong
8bb232a3f0 feat(phone-image): 生成圖片SnapDOM截圖流程改造
- 新增captureDomPages(): 從右側DOM容器串行截圖
- 新增generateLongImageFromCanvases(): canvas拼接長圖
- saveImages()條件分支: useDomPreview走DOM截圖, 否則走舊路徑
- 截圖參數scale=2, backgroundColor=#ffffff
- 保留doCapturePages/capturePagesFromStaging作為備用
2026-05-19 00:35:30 +08:00
augushong
94039d026e feat(phone-image): 對齊持久化+防抖自動保存
- saveImages新增mergedConfig合併pageAlignments
- 新增debouncedSaveConfig(): 300ms防抖自動保存
- 對齊change handler調用refreshDomPage+debouncedSaveConfig
- 重置按鈕逐頁刷新DOM+防抖保存
- HTML新增phone-image:save-config事件監聽器
- currentConfig初始化正確同步pageAlignments
2026-05-19 00:30:29 +08:00
augushong
63459832a5 feat(phone-image): 段落按行截断+overflow跨頁續接
- paginateContent新增overflow截斷:剩餘空間>40px時放入當前頁(CSS裁切)
- generateContentPage新增overflowOffset參數:續接頁用負margin-top偏移
- 跨多頁溢出while循環處理:單個塊可跨越3+頁
- 保留orphan control和splitOversizedBlock邏輯
- 不限制塊類型:段落/表格/代碼塊/圖片都可截斷
2026-05-19 00:21:34 +08:00
augushong
f274691ba7 feat(phone-image): codeFontScale+代碼塊預渲染+純圖片頁HTML
- config新增codeFontScale:1, applyFontScale新增--pi-code-font-scale CSS變量
- 新增async preRenderCodeBlocks(): 超長代碼塊(>contentAreaHeight)用SnapDOM截圖替換為img
- render()在parseHtmlToBlocks之前await preRenderCodeBlocks
- saveConfig payload新增codeFontScale
- renderPureImageToCanvas標記@deprecated
- 純圖片頁在renderDomPages中檢測並添加flex居中樣式
2026-05-19 00:09:26 +08:00
augushong
9915f1c887 feat(phone-image): DOM預覽渲染覈心邏輯實現
- renderDomPageThumbnails()完整實現:逐頁創建DOM容器+transform縮放
- 直接複用pages[].html(含品牌header/內容/頁碼),保證預覽=輸出
- 對齊select事件處理兼容DOM預覽和JPEG預覽兩種模式
- refreshDomPage()更新valign class
- 渲染進度日誌每5頁輸出
2026-05-18 23:53:31 +08:00
augushong
bfeb1811be feat(phone-image): DOM分页預覽CSS+HTML基礎結構和數據模型 2026-05-18 23:32:40 +08:00
augushong
0782399709 fix(typesetting): 修复SnapDOM全局
- SnapDOM v2.12.0 IIFE构建非真正IIFE,function $/let .$
- 加载snapdom.js前保存jQuery的
- 加载后立即恢复jQuery的$
- 集成测试通过: 21页排版正常,纯图片页有brand header+页码
- Console零JS错误,排版耗时约2秒
2026-05-17 14:07:59 +08:00
augushong
f847c55e11 feat(typesetting): 纯图片页统一走SnapDOM截图 - 包含品牌页头和页码
- 移除runCaptureLoop中纯图片页的特殊处理分支
- 纯图片页不再跳过截图,统一走snapdom.toCanvas
- 品牌header和页码自然包含在纯图片页中
- isPureImagePage/getPureImageSrc/renderPureImageToCanvas标注@deprecated
- 修复普通截图回调缺少pageProgressCallback调用的bug
2026-05-17 13:38:44 +08:00
augushong
92426fe57e feat(typesetting): 段落按句拆分填满页面剩余空间 - 减少空白浪费
- paginateContent正常块换页判断增加按句拆分逻辑
- p/blockquote超过剩余空间时调用splitOversizedBlock拆分
- 拆分后的句子块逐步填入当前页,多余推到后续页
- img/pre/table/h2/h3/h4不拆分,直接换页
- remainingSpace>50条件防止极小碎片
- 拆分失败时回退到原有换页逻辑
2026-05-17 13:35:19 +08:00
augushong
0f38e4a52c feat(typesetting): 分页算法增加orphan control - 标题不再孤悬页面底部
- paginateContent正常块判断增加标题orphan control
- 标题(h2/h3/h4)后检查下一个块能否放入当前页
- 若放不下则回退标题到下一页开头
- 超大块处理增加标题回退逻辑
- 超大表格拆分时前面的h2标题和表格第一部分同页
2026-05-17 13:30:31 +08:00
augushong
665a9cc9e5 refactor(typesetting): 替换html2canvas为SnapDOM v2.12.0 - 解决渲染不一致问题
- 新增 public/static/lib/snapdom/snapdom.js (IIFE构建)
- phone_image.html script引用从html2canvas改为snapdom
- phone-image.js 3处截图调用全部替换为snapdom.toCanvas()
  - capturePageViaHtml2Canvas (分页截图)
  - 长图生成 (scale:2)
  - 导出单页 (scale:2)
- API映射: html2canvas(elem,{scale,useCORS,width,height,logging}) -> snapdom.toCanvas(elem,{scale,backgroundColor})
- 返回值兼容: Promise<Canvas> 下游toDataURL不受影响
- 保留html2canvas目录不删除(output.html仍引用)
2026-05-17 13:25:58 +08:00
augushong
eb392ff1d7 fix(typesetting): 修复品牌logo非正方形时被强制压缩的问题 - 改为按比例自适应宽度
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-17 11:33:25 +08:00
augushong
aa6124adbc feat(typesetting): 品牌标识CSS样式 - brand-header/brand-logo/brand-name 2026-05-17 11:14:50 +08:00
augushong
bf32bce922 feat(typesetting): 页面品牌标识 - 数据链路+渲染函数+分页修正
- Post.php: phoneImage()传递siteName/siteLogo到模板
- phone_image.html: postData增加siteName/siteLogo字段
- phone-image.js: 新增generateBrandHeader()+preloadBrandLogo()
- phone-image.js: 3个页面生成函数调用品牌头部
- phone-image.js: contentAreaHeight扣减BRAND_HEADER_HEIGHT(36px)
- logo预转base64规避html2canvas CORS,过滤默认头像
2026-05-17 11:12:56 +08:00
augushong
0ce43ddd19 fix(typesetting): 修复对齐下拉CSS不生效的bug - img添加class + flex布局 2026-05-17 00:40:03 +08:00
augushong
ee9e2acca2 refactor(typesetting): Wave2 - 表格字号移位+画布header+对齐下拉+移除历史UI
- T3: 表格字号从设置弹框移到渲染预览header工具栏
- T4: 画布预览区添加header bar和重置对齐按钮
- T5: 对齐按钮改为select下拉,change仅CSS操作不重渲染
- T6: 移除历史记录UI(按钮/菜单/处理函数/URL变量)
- CSS: alignment-toggle样式替换为alignment-select样式
2026-05-17 00:30:25 +08:00
augushong
aa067ad202 refactor(typesetting): Wave1 - UPSERT改造 + 移除历史记录后端接口
- PhoneImage.php: saveConfigOnly/createOutput改为find-then-update-or-create
- Post.php: 移除6个历史记录方法(postOutputList/getOutputListJson等)
- 删除post_output/index.html模板
2026-05-17 00:22:04 +08:00
augushong
e3a4cd000c docs(notes.md): add snapshot support and author statement
update notes.md to add two new items: add author statement to exported images, add snapshot support for articles and related products
2026-05-16 23:43:12 +08:00
augushong
65433bcac5 fix(typesetting): saveConfig() 添加 tableFontScale 字段持久化
F3审查发现saveConfig()函数构建的config payload缺少tableFontScale字段,
导致仅保存配置时表格字号不会持久化到后端。添加该字段修复此问题。
2026-05-16 00:43:10 +08:00
augushong
3ea3a6dbe3 feat(typesetting): Wave 2 - 流式渲染、表格字号独立控制、作者声明
- 缩略图改为流式渲染,截图一页即显示一页
- 新增tableFontScale独立控制表格字号,含后端持久化
- 内容页顶部添加作者声明(文/作者名),空值隐藏
2026-05-16 00:35:03 +08:00
augushong
2b9bfb179f feat(typesetting): Wave 1 - 对齐修复+底部对齐、封面页字号豁免、字号UI改造
- 修复对齐按钮缺少click handler的缺陷,新增事件委托
- 三态对齐切换: 居顶(↑) -> 居中(↕) -> 居底(↓)
- 封面页和尾页通过CSS变量重置不受全局fontScale影响
- 字号控制从slider改为dropdown+自定义输入,预设0.5/0.8/1.0/1.2/1.5/2.0
2026-05-16 00:23:36 +08:00
augushong
b8c05e0329 fix(phoneimage): 修复字号缩放不生效于画布渲染和段落文字,缩小表格行间距
- CSS: 在 #render-preview 和 #render-staging 上重新声明中间变量
  (--pi-font-size-base 等),使其在本地用 --pi-font-scale 重新计算,
  解决 CSS 自定义属性在 :root 预计算后子元素继承固定值的问题
- CSS: #render-preview 的 font-size 从 var(--pi-font-size-base) 改为
  直接 calc(14px * var(--pi-font-scale, 1)),确保段落文字响应缩放
- JS: doCapturePages() 在 ensureStaging() 后调用 applyFontScale(),
  确保首次创建 staging 时 --pi-font-scale 被正确设置
- CSS: th/td padding 从 8px 10px 缩小为 4px 10px,减少表格行间距
- HTML: body 布局改为 flex-column 防止页面级滚动
2026-05-15 23:38:39 +08:00
augushong
f18091b931 feat(phoneimage): 接入保存/配置/历史操作日志并移除layer.load遮罩 2026-05-15 22:19:39 +08:00
augushong
a1dbfbc97d feat(phoneimage): 接入渲染管线逐页进度日志 2026-05-15 22:09:46 +08:00
augushong
07dcc964f4 feat(phoneimage): 添加日志面板UI和右栏布局重构 2026-05-15 22:00:43 +08:00
augushong
6fc164fe90 fix(phone-image): 修复字号倍数影响编辑器+刷新后丢失
- CSS变量 --pi-font-scale 仅在渲染容器上设置,不再全局污染
- Slider松手后立即保存配置,确保fontScale持久化
2026-05-15 20:44:16 +08:00
augushong
5a81385448 feat(phone-image): 添加字号倍数控制功能
- CSS: 新增 --pi-font-scale 变量,全量 font-size 支持 calc 缩放
- JS: config.fontScale 影响分页计算,applyFontScale() 同步CSS变量
- HTML: 渲染预览区 Slider 控件(0.5x~2.0x),拖动即时预览,松手完整渲染
- 后端: PhoneImage.php 新增 fontScale 配置字段和校验
- 所有保存路径(autoSave/save/generate)包含 fontScale 持久化
2026-05-15 00:50:57 +08:00
augushong
8ad90a28c0 fix(admin/post/view): correct the thumb item index offset
修正分页图片缩略项的data-index索引偏移,使其从0开始正确对应分页下标
2026-05-14 23:32:54 +08:00
augushong
66fb6e1d57 docs(notes.md): add author declaration in exported graph notes
新增了导出图片需要增加头部作者声明的笔记内容
2026-05-14 23:30:20 +08:00
augushong
10879a8037 feat(output_view): 导出页面重构 - 长图卡片化展示、缩略图增大、预览优化、纯图片页原图保存
- output_view.html: 长图改为固定高度卡片(70px),Blob URL查看,缩略图minmax(280px,1fr),
  竖图预览优先填充视口高度,下载功能完整保留
- phone-image.js: renderPureImageToCanvas()使用naturalWidth/naturalHeight保持原图分辨率,
  新增长图生成和保存功能
- Post.php: 新增outputView()方法提供导出页面渲染数据
- PhoneImage.php: 图片数据改为DB存储,新增saveLongImage()方法
- phone_image.html: 添加导出页面入口按钮
- 新增数据库迁移: post_output_file表添加image_data字段
2026-05-14 23:22:19 +08:00
augushong
f60d1abff6 fix(security): DebugMysql日志驱动使用PDO预处理防止SQL注入 2026-05-14 23:22:01 +08:00
augushong
37259cfb4b fix(phoneimage): 修复渲染分页截断 - 测高包含margin并等待图片加载 2026-05-13 12:35:10 +08:00
augushong
29dbc7ca55 feat(phoneimage): 三列布局重构 - 添加渲染预览区并改造渲染管线
- 增加中间渲染预览列(540px),三列布局:编辑器 | 预览 | 缩略图
- CSS作用域迁移:排版样式从#editor-text-area迁移到#render-preview
- 编辑器恢复干净默认样式,消除表格/图片间隙和溢出问题
- 新增syncPreview()实时同步编辑器内容到预览区(300ms防抖)
- captureEditorBlocks()改为从预览区DOM测高,不再克隆编辑器DOM
- render()改为从预览区读取已预处理HTML,所见即所得
2026-05-12 23:12:48 +08:00
augushong
ccbfdde73e fix(phone-image): 修复分割线样式覆盖和表格丢行问题
1. 删除CSS覆盖wangeditor divider默认样式的规则,保留原生分割线外观
2. 新增splitTableByRows函数,超大表格按行拆分渲染,每页保留表头
3. splitOversizedBlock对表格不再跳过,改为调用splitTableByRows
2026-05-12 22:07:26 +08:00
augushong
30291a9dca docs(phone-image): 全面更新架构文档反映wangeditor方案
重写渲染管线、新增wangeditor集成章节、更新数据流/存储模型/配置体系、
新增UI布局/已删除函数/已知限制章节(373行新增,171行删除)
2026-05-11 23:40:20 +08:00
augushong
b6f2e9ef09 fix(phone-image): 移除不存在的layui dropdown依赖,改用纯JS下拉菜单
layui 2.x没有内置dropdown模块,导致整个页面JS回调不执行。
- layui.use依赖从['form','layer','dropdown']改为['form','layer']
- 用纯jQuery实现toggle下拉菜单替代dropdown.render()
- 添加more-dropdown-menu CSS hover样式
2026-05-11 23:20:20 +08:00
augushong
f6fc53940c feat(phone-image): Wave2 CSS样式+自动保存+历史加载
- T4: 新增编辑器区/操作栏/弹框CSS样式(390行),覆盖两栏布局、
  wangeditor编辑区排版、divider分页标记、设置弹框、右侧预览区
- T5: onChange自动保存(2.6s防抖),保存状态指示器(waiting/saving/saved/error)
- T6: loadFromHistory改用editor.setHtml()+updateConfig()替换旧init
- 修复: doAutoSave删除无效递归调用
2026-05-11 22:55:24 +08:00
augushong
1f8128385f refactor(phone-image): wangeditor 排版引擎核心重构
- 两栏布局:取消左侧工具栏,中间改为wangeditor v5编辑器
- 顶部操作栏:设置/保存/生成并保存+更多下拉(历史/重新生成/下载/长图)
- 设置弹框:尺寸选择+水印输入,删除全局字号滑块
- wangeditor完整工具栏+divider分割线标记分页
- 删除旧渲染管线:renderContentFlow/insertPageBreak/removePageBreak/convertFlowBlocksToImages/measureBlockHeights
- 新增captureEditorBlocks:从编辑器DOM测高+按分割线分组+实际高度分页
- 新增exportLongImage:从wangeditor DOM截长图
- getContentHtml改为从wangeditor实例读取
2026-05-11 22:45:38 +08:00
augushong
518085d493 refactor(phone-image): 配置字段对齐,架构文档更新
- PHP getConfigFields 移除 template/font,新增 pageAlignments
- validateConfig 字段与 getConfigFields 一致
- 架构文档更新数据流、配置体系、已知问题、修复记录章节
2026-05-11 21:24:16 +08:00
augushong
e9d839ae8a docs(phone-image): 产出排版功能架构文档
fix(phone-image): 修复分页标记丢失bug,消除双数据源问题

- 新增 getContentHtml() 和 updateConfig() 引擎API
- 保存逻辑改用引擎内部 content_html,不再从DOM读取
- doRender 改用 updateConfig,配置变更不重置内容
- loadFromHistory 改用 init+render 全量初始化
- PHP/JS 配置字段对齐(移除template/font,新增pageAlignments)
2026-05-11 21:17:37 +08:00