Mac版Outlook JS插件回写HTML时项目符号丢失问题求助
解决Mac版Outlook插件回写HTML丢失列表样式的问题
针对Mac版Outlook插件中getAsync返回列表结构被转为带MsoListParagraph类的<p>标签,回写后丢失项目符号样式的问题,提供以下几种可行方案:
方案1:保留原生Mso样式结构直接回写
Mac版Outlook基于Word渲染引擎,会通过MsoListParagraph类识别列表项。不要修改getAsync返回的原始HTML,直接调用setAsync回写即可。若直接回写仍丢失列表,可尝试将这些<p>标签包裹在MsoListContainer容器中:
<div class="MsoListContainer"> <p class=MsoListParagraph style='text-indent:0cm'><span lang=EN-US>The first bullet point.</span></p> <p class=MsoListParagraph style='text-indent:0cm'><span lang=EN-US>The second bullet point.</span></p> </div>
渲染引擎会自动识别类名,恢复原有列表结构和样式。
方案2:改用Markdown格式读写(跨平台兼容)
使用Office.CoercionType.Markdown替代HTML格式,Markdown的列表语法在Mac/Windows版Outlook中兼容性更好,且能自动保留列表样式:
// 获取Markdown格式内容 Office.context.mailbox.item.body.getAsync(Office.CoercionType.Markdown, (asyncResult) => { if (asyncResult.status === Office.AsyncResultStatus.Succeeded) { const markdownContent = asyncResult.value; // 处理内容后回写 Office.context.mailbox.item.body.setAsync(markdownContent, { coercionType: Office.CoercionType.Markdown }, (setResult) => { if (setResult.status === Office.AsyncResultStatus.Failed) { console.error(setResult.error.message); } }); } });
方案3:解析Mso样式重建结构化列表
若必须使用HTML格式,需解析MsoListParagraph的样式属性,重建带正确样式的<ul>/<li>结构:
function convertMsoListToHtml(msoHtml) { const parser = new DOMParser(); const doc = parser.parseFromString(msoHtml, 'text/html'); const listItems = doc.querySelectorAll('p.MsoListParagraph'); if (!listItems.length) return msoHtml; // 根据原样式判断是无序列表还是有序列表,此处以无序列表为例 const listContainer = doc.createElement('ul'); // 继承原列表的缩进和样式 const baseStyle = listItems[0].style; listContainer.style.textIndent = baseStyle.textIndent; // 映射Mso列表符号到CSS样式(需根据实际返回值调整) listContainer.style.listStyleType = 'disc'; listItems.forEach(p => { const li = doc.createElement('li'); // 转移原内容到<li>标签 while (p.firstChild) li.appendChild(p.firstChild); listContainer.appendChild(li); p.remove(); }); // 插入重建的列表到文档 listItems[0]?.parentNode.appendChild(listContainer); return doc.body.innerHTML; } // 使用示例 Office.context.mailbox.item.body.getAsync(Office.CoercionType.Html, (asyncResult) => { if (asyncResult.status === Office.AsyncResultStatus.Succeeded) { const convertedHtml = convertMsoListToHtml(asyncResult.value); Office.context.mailbox.item.body.setAsync(convertedHtml, { coercionType: Office.CoercionType.Html }, (setResult) => { if (setResult.status === Office.AsyncResultStatus.Failed) { console.error(setResult.error.message); } }); } });
注意:需根据实际返回的MsoListParagraph样式属性,调整listStyleType等CSS值,确保符号类型和位置与原内容一致。
内容的提问来源于stack exchange,提问作者Soham Nale
相关产品推荐
相关产品推荐

