/ / Alterar cor do texto de parte de uma string no OpenTBS - php, docx, opentbs, tinybutstrong

Alterar cor do texto de parte de uma string no OpenTBS - php, docx, opentbs, tinybutstrong

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 (&gt; 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 № 1

O 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?