【问题标题】:Change Text Colour of Part of a string in OpenTBS在 OpenTBS 中更改部分字符串的文本颜色
【发布时间】:2013-12-16 15:33:00
【问题描述】:

我正在构建一个大型 word 文档,只需要更改字符串“部分”的文本颜色。

我在 hereherehere 的几个地方发现了类似的问题,但我的问题似乎有所不同,我只想为字符串的一部分着色,而不是整个段落或整个 OpenTBS 字段,如这些示例中所示。

我首先尝试将单个字符串块包装在 docx XML 标记中,但发现 php 然后转换为实体(> 等),这显然没有用。目前,我已经开始通过模板脚本将部分文本包装在 XML 标记中,这给了我一个格式错误的 XML 输出,我想是因为我在一个子字符串的 </w:r><w:r> 之间有内容下一个子字符串。

关于如何正确执行此操作的任何建议?下面是当前代码和输出。

//Function called onmerge. I wrap the portion of string I want to change the text 
//colour of with [UNTRANSLATED] and [ENDUNTRANSLATED] manually earlier, and attempt 
//to swap them for tags at this point.
function lb($FieldName, &$CurrVal) { 
    $CurrVal= str_replace('[UNTRANSLATED]', '<w:r><w:rPr><w:color w:val="FF0000"/></w:rPr><w:t>', $CurrVal); 
    $CurrVal= str_replace('[ENDUNTRANSLATED]', '</w:t></w:r>', $CurrVal); 
}

然后输出...

<w:t> 
    <w:r> 
        <w:rPr> 
            <w:color w:val="FF0000" /> 
        </w:rPr> 
        <w:t>Slaked Lime</w:t> 
    </w:r>,
    <w:r>
         <w:rPr>
             <w:color w:val="FF0000" />
         </w:rPr>
         <w:t>Air slaked Lime</w:t>
    </w:r>,
[code continues in same style...]

Word 在我的第二个块和第二个 &lt;w:r&gt; 标记所在的位置标记错误。不幸的是,这个错误非常难以描述。


【问题讨论】:

  • 如果没有逗号就很难测试它并让我们知道这些是否真的是问题吗?如果是,我认为您引用的第一个问题有您需要的答案,您只是不想将这些逗号包装在它们自己的元素中......我也不认为您可以将 &lt;w:t&gt;s 包装在其他 @ 987654331@s - 您是否尝试将父级更改为&lt;w:p&gt;?希望缺少的结束标签只是一个复制粘贴错误......
  • 你好,莎拉。再试一次,不是特别是逗号,而是 Word 在我的第一个 &lt;/w:r&gt; 和下一个 &lt;w:r&gt; 之后标记了错误。 (这是一个非描述性错误。)我会相应地更新问题。我没有尝试更改父 &lt;w:t&gt; - 我不太了解 docx xml 的结构。所有这部分代码都是自动生成的,但是在 tinybutstrong 中是否有任何版本的 getParentXMLTag()?我不知道该怎么做。

标签: php docx opentbs tinybutstrong


【解决方案1】:

上述代码的问题是 OpenTBS 将字符串输入到一对 &lt;w:r&gt;&lt;w:t&gt; 标签中,在插入自己的标签之前,这些标签需要关闭。 (正如 Sarah Kemp 在 cmets 中所说,&lt;w:t&gt; 似乎不可嵌套。

以下是更新的工作版本。还需要添加xml:space="preserve" 以保持间距。

//Function called onmerge. I wrap the portion of string I want to change the text 
//colour of with [UNTRANSLATED] and [ENDUNTRANSLATED] manually earlier, and attempt 
//to swap them for tags at this point.
function lb($FieldName, &$CurrVal) {
  $CurrVal= str_replace('[UNTRANSLATED]', '</w:t></w:r><w:r><w:rPr><w:color w:val="FF0000"/></w:rPr><w:t xml:space="preserve">', $CurrVal);
  $CurrVal= str_replace('[ENDUNTRANSLATED]', '</w:t></w:r><w:r><w:t xml:space="preserve">', $CurrVal);
} 

【讨论】:

    【解决方案2】:

    我唯一的建议是查看格式良好的 Word 文档并以此为基础编写代码。我制作了一个基本文档并输入了一行,然后更改了一个单词的颜色。然后我将文件扩展名从docx 更改为zip,并查看了word/document.xml 中的XML。这是直接来自 Word 的样子(应用了格式):

    <w:p w:rsidR="00BA3836" w:rsidRDefault="00420636">
        <w:r>
            <w:t xml:space="preserve">This is some text where </w:t>
        </w:r>
        <w:r w:rsidRPr="00420636">
            <w:rPr>
                <w:color w:val="FF0000"/>
            </w:rPr>
            <w:t>parts</w:t>
        </w:r>
        <w:r>
            <w:t xml:space="preserve"> are red.</w:t>
        </w:r>
    </w:p>
    

    在文档中,“零件”一词是红色的。

    如果您像我所做的那样从您的 .docx 文件中提取 XML 并发布相关区域(TBS 标签完整 - 在合并之前),我可以提供更多帮助。

    听起来您非常接近解决此问题。你玩过参数strconv=no吗?

    【讨论】:

    • 嗨莎拉,感谢您的完整回复!上面的例子是提取的XML post-merge,pre-merge,它只是一个多级嵌套表的单元格中的单个标签,因为这部分是从一个标签生成的,该标签创建了大约16页的word doc,通过大量嵌套合并。无论如何,标签只是[section_sub1_sub1.fieldContents;onformat=lb;magnet=tbs:row](但正如它所显示的,这是几个子块!)
    • 从您的示例中,这表明我应该将我的其他(非彩色)文本包含在 &lt;w:r&gt;&lt;w:t&gt; 标签中 - 但我怎样才能做到这一点? :-/ 虽然也许我可以在 PHP 中完成它的所有部分......但是我想它会嵌套在 docx 的原始&lt;w:t&gt; 中,我认为这是被禁止的?我会有更多的戏份。
    • 设法最终以如下所示的方式解决 - 感谢您的帮助调试和有用的指示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多