Eu estou construindo um grande documento do Word, e preciso alterar a cor do texto de "parte" de uma string, apenas.
Eu encontrei perguntas semelhantes em alguns lugares Aqui, Aqui e Aqui, mas onde meu problema parece diferir, é que eu desejo apenas colorir parte de uma string, em oposição a um parágrafo inteiro, ou um campo inteiro do OpenTBS, como nesses exemplos.
Eu primeiro tentei quebrar o pedaço individual de string em tags XML docx, mas achei php convertido em entidades (>
etc) que claramente não adiantava. Atualmente, mudei para envolver a parte do texto em tags XML através de um script de modelo, o que me dá uma saída XML malformada, presumo porque tenho conteúdo entre o </w:r>
de uma substring, e o <w:r>
da próxima subseqüência.
Algum conselho sobre como fazer isso corretamente? Abaixo está o código atual e a saída.
//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);
}
E a saída ...
<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...]
O Word sinaliza o erro no ponto em que meu segundo bloco e o segundo <w:r>
tag são. Infelizmente o erro é lindamente não descrito.
Respostas:
2 para resposta № 1O problema com o código acima foi que as sequências de entradas do OpenTBS em um par de <w:r><w:t>
tags, que precisam ser fechadas, antes de inserir as suas. (Como Sarah Kemp disse em comentários, <w:t>
não parece ser encaixável.
O abaixo é uma versão atualizada e funcional. xml:space="preserve"
também precisava ser adicionado para preservar o espaçamento.
//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);
}
1 para resposta № 2
Minha única sugestão é olhar para um documento do Word bem formado e basear seu código nisso. Fiz um documento básico e digitei uma linha e depois mudei a cor de uma palavra. Então eu mudei a extensão do arquivo para zip
a partir de docx
e olhou para o XML em word/document.xml
. Aqui está o que parece diretamente do Word (com formatação aplicada):
<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>
No documento, a palavra "partes" é vermelha.
Eu poderia oferecer mais ajuda se você extrair o XML do seu arquivo docx como eu fiz e postar a área relevante (com tags TBS intactas - antes da mesclagem).
Parece que você está muito perto de resolver isso. Você jogou com o parâmetro strconv=no
?