feat(phoneimage): 接入渲染管线逐页进度日志

This commit is contained in:
augushong
2026-05-15 22:09:46 +08:00
parent 07dcc964f4
commit a1dbfbc97d
2 changed files with 20 additions and 7 deletions

View File

@@ -177,10 +177,12 @@ var PhoneImageEngine = (function () {
// 防止并发渲染 // 防止并发渲染
if (render._locked) { if (render._locked) {
// 标记有待处理的渲染请求,当前渲染完成后会自动重试 // 标记有待处理的渲染请求,当前渲染完成后会自动重试
PhoneImageLogPanel.log('渲染进行中,跳过本次请求', 'warn');
render._pending = true; render._pending = true;
return deferred.reject('rendering').promise(); return deferred.reject('rendering').promise();
} }
render._locked = true; render._locked = true;
PhoneImageLogPanel.log('开始渲染...', 'info');
pages = []; pages = [];
var sizeConfig = config.sizes[config.size] || config.sizes.xiaohongshu; var sizeConfig = config.sizes[config.size] || config.sizes.xiaohongshu;
@@ -189,12 +191,15 @@ var PhoneImageEngine = (function () {
// 从预览区读取已预处理的内容 // 从预览区读取已预处理的内容
syncPreview(); syncPreview();
PhoneImageLogPanel.log('同步预览区内容', 'info');
var previewEl = document.getElementById('render-preview'); var previewEl = document.getElementById('render-preview');
// 等待预览区内所有图片加载完成,否则 getBoundingClientRect 测高为0 // 等待预览区内所有图片加载完成,否则 getBoundingClientRect 测高为0
PhoneImageLogPanel.log('等待图片加载...', 'info');
waitForImages(previewEl).then(function () { waitForImages(previewEl).then(function () {
var cleanHtml = previewEl ? previewEl.innerHTML : ''; var cleanHtml = previewEl ? previewEl.innerHTML : '';
var blocks = parseHtmlToBlocks(cleanHtml); var blocks = parseHtmlToBlocks(cleanHtml);
PhoneImageLogPanel.log('解析内容: ' + blocks.length + ' 个块', 'info');
// 空内容检测 // 空内容检测
if (blocks.length === 0) { if (blocks.length === 0) {
@@ -205,13 +210,16 @@ var PhoneImageEngine = (function () {
// 封面页 // 封面页
pages.push(generateCoverPage(sizeConfig)); pages.push(generateCoverPage(sizeConfig));
PhoneImageLogPanel.log('生成封面页', 'info');
// 内容分页 // 内容分页
PhoneImageLogPanel.log('分页计算中...', 'info');
captureEditorBlocks(cleanHtml, blocks, contentAreaHeight, sizeConfig).then(function(contentPages) { captureEditorBlocks(cleanHtml, blocks, contentAreaHeight, sizeConfig).then(function(contentPages) {
pages = pages.concat(contentPages); pages = pages.concat(contentPages);
// 尾页 // 尾页
pages.push(generateSummaryPage(sizeConfig, pages.length)); pages.push(generateSummaryPage(sizeConfig, pages.length));
PhoneImageLogPanel.log('生成尾页', 'info');
// 页码 N/M // 页码 N/M
var totalPages = pages.length; var totalPages = pages.length;
@@ -226,6 +234,7 @@ var PhoneImageEngine = (function () {
// 渲染缩略图 // 渲染缩略图
renderThumbnails(sizeConfig).then(function() { renderThumbnails(sizeConfig).then(function() {
PhoneImageLogPanel.log('渲染完成,共 ' + pages.length + ' 页', 'success');
render._locked = false; render._locked = false;
if (render._pending) { if (render._pending) {
render._pending = false; render._pending = false;
@@ -233,10 +242,12 @@ var PhoneImageEngine = (function () {
} }
deferred.resolve(pages); deferred.resolve(pages);
}).catch(function(err) { }).catch(function(err) {
PhoneImageLogPanel.log('渲染失败: ' + err, 'error');
render._locked = false; render._locked = false;
deferred.reject(err); deferred.reject(err);
}); });
}).catch(function(err) { }).catch(function(err) {
PhoneImageLogPanel.log('分页计算失败: ' + err, 'error');
render._locked = false; render._locked = false;
deferred.reject(err); deferred.reject(err);
}); });
@@ -1034,7 +1045,7 @@ var PhoneImageEngine = (function () {
* sizeConfig: 尺寸配置(用于纯图片页canvas渲染) * sizeConfig: 尺寸配置(用于纯图片页canvas渲染)
* @returns {jQuery Deferred} resolves with array of dataURL strings or canvas objects * @returns {jQuery Deferred} resolves with array of dataURL strings or canvas objects
*/ */
function doCapturePages(opts) { function doCapturePages(opts, pageProgressCallback) {
var deferred = $.Deferred(); var deferred = $.Deferred();
ensureStaging(); ensureStaging();
@@ -1061,7 +1072,7 @@ var PhoneImageEngine = (function () {
// html2canvas会跳过visibility:hidden的元素临时切换为可见 // html2canvas会跳过visibility:hidden的元素临时切换为可见
$staging.css({ visibility: 'visible' }); $staging.css({ visibility: 'visible' });
// 表格和代码块已在中间栏中转为图片,无需再次转换 // 表格和代码块已在中间栏中转为图片,无需再次转换
runCaptureLoop($staging, opts, deferred); runCaptureLoop($staging, opts, deferred, pageProgressCallback);
}); });
}); });
@@ -1074,7 +1085,7 @@ var PhoneImageEngine = (function () {
* @param {Object} opts - 截图选项 * @param {Object} opts - 截图选项
* @param {jQuery Deferred} deferred - 外部deferred * @param {jQuery Deferred} deferred - 外部deferred
*/ */
function runCaptureLoop($staging, opts, deferred) { function runCaptureLoop($staging, opts, deferred, pageProgressCallback) {
var $pageElems = $staging.find('.phone-image-page'); var $pageElems = $staging.find('.phone-image-page');
if ($pageElems.length === 0) { if ($pageElems.length === 0) {
$staging.css({ visibility: 'hidden' }); $staging.css({ visibility: 'hidden' });
@@ -1108,16 +1119,18 @@ var PhoneImageEngine = (function () {
// 保存模式: 高质量绘制原图到canvas // 保存模式: 高质量绘制原图到canvas
renderPureImageToCanvas(pureSrc, opts.sizeConfig.width, opts.sizeConfig.height).then(function (canvas) { renderPureImageToCanvas(pureSrc, opts.sizeConfig.width, opts.sizeConfig.height).then(function (canvas) {
results.push(canvas); results.push(canvas);
if (pageProgressCallback) pageProgressCallback(idx + 1, total);
idx++; idx++;
captureNext(); captureNext();
}).catch(function () { }).catch(function () {
// 加载失败回退到html2canvas // 加载失败回退到html2canvas
capturePageViaHtml2Canvas($elem, $staging, opts, results, deferred, function () { idx++; captureNext(); }); capturePageViaHtml2Canvas($elem, $staging, opts, results, deferred, function () { if (pageProgressCallback) pageProgressCallback(idx + 1, total); idx++; captureNext(); });
}); });
return; return;
} else { } else {
// 缩略图模式: 直接用src // 缩略图模式: 直接用src
results.push(pureSrc); results.push(pureSrc);
if (pageProgressCallback) pageProgressCallback(idx + 1, total);
idx++; idx++;
captureNext(); captureNext();
return; return;
@@ -1169,6 +1182,8 @@ var PhoneImageEngine = (function () {
outputCanvas: false, outputCanvas: false,
quality: 0.85, quality: 0.85,
sizeConfig: sizeConfig sizeConfig: sizeConfig
}, function (current, total) {
PhoneImageLogPanel.log('截图: 第 ' + current + '/' + total + ' 页', 'info');
}).then(function (dataUrls) { }).then(function (dataUrls) {
displayThumbnails(dataUrls, sizeConfig); displayThumbnails(dataUrls, sizeConfig);
deferred.resolve(pages); deferred.resolve(pages);
@@ -1574,6 +1589,7 @@ var PhoneImageEngine = (function () {
syncPreview: syncPreview, syncPreview: syncPreview,
setPageAlignment: setPageAlignment, setPageAlignment: setPageAlignment,
exportLongImage: exportLongImage, exportLongImage: exportLongImage,
logPanel: PhoneImageLogPanel,
getContentHtml: function () { getContentHtml: function () {
if (window.phoneImageEditor) { if (window.phoneImageEditor) {
return window.phoneImageEditor.getHtml(); return window.phoneImageEditor.getHtml();

View File

@@ -500,12 +500,9 @@
$.extend(newConfig, extraConfig); $.extend(newConfig, extraConfig);
} }
PhoneImageEngine.updateConfig(newConfig); PhoneImageEngine.updateConfig(newConfig);
var loadIdx = layer.load();
PhoneImageEngine.render().then(function (pages) { PhoneImageEngine.render().then(function (pages) {
layer.close(loadIdx);
layer.msg('排版完成,共 ' + pages.length + ' 页'); layer.msg('排版完成,共 ' + pages.length + ' 页');
}).catch(function (err) { }).catch(function (err) {
layer.close(loadIdx);
if (err !== 'rendering') { if (err !== 'rendering') {
layer.msg('渲染失败: ' + err); layer.msg('渲染失败: ' + err);
} }