{--------------------------------------------------------}
{
{           TXTWord, tipos de formatação
{
{--------------------------------------------------------}

unit twtipofo;

interface

uses
    dvWin,
    dvArqLog,
    sysutils,
    classes,
    comobj,
    activex,
    twVars;

function trataFormatacao (f: string; lIni: integer): boolean;
function testaFormatacao (f: string): boolean;

implementation

{--------------------------------------------------------}
{       Verifica se a formatação desejada já está ativa.
{--------------------------------------------------------}

function aplicarFormatacao (fAtual, fNova: string; lIni: integer): boolean;
begin
    if fAtual =  fNova then
        begin
            inc (totalItensLog);
            if escritaNoLogAtivado then
                gravarArqLog ('Item de formatação na linha ' + intToStr(lIni + 1) + ' não é necessário: ' + fNova, 'txtWord.log');
            result := false;
        end
    else
        result := true;
end;

{--------------------------------------------------------}
{       Liga ou desliga tipos de formatação
{--------------------------------------------------------}

function trataFormatacao (f: string; lIni: integer): boolean;
var
    valor: string;
    p: integer;

    procedure trocaCorFonte;
    begin
        if (p < 0) and (p > 16) then p := 0;

        if p = 0 then aplicWord.Selection.Font.ColorIndex := wdAuto
        else
        if p = 1 then aplicWord.Selection.Font.ColorIndex := wdBlack
        else
        if p = 2 then aplicWord.Selection.Font.ColorIndex := wdBlue
        else
        if p = 3 then aplicWord.Selection.Font.ColorIndex := wdTurquoise
        else
        if p = 4 then aplicWord.Selection.Font.ColorIndex := wdBrightGreen
        else
        if p = 5 then aplicWord.Selection.Font.ColorIndex := wdPink
        else
        if p = 6 then aplicWord.Selection.Font.ColorIndex := wdRed
        else
        if p = 7 then aplicWord.Selection.Font.ColorIndex := wdYellow
        else
        if p = 8 then aplicWord.Selection.Font.ColorIndex := wdWhite
        else
        if p = 9 then aplicWord.Selection.Font.ColorIndex := wdDarkBlue
        else
        if p = 10 then aplicWord.Selection.Font.ColorIndex := wdTeal
        else
        if p = 11 then aplicWord.Selection.Font.ColorIndex := wdGreen
        else
        if p = 12 then aplicWord.Selection.Font.ColorIndex := wdViolet
        else
        if p = 13 then aplicWord.Selection.Font.ColorIndex := wdDarkRed
        else
        if p = 14 then aplicWord.Selection.Font.ColorIndex := wdDarkYellow
        else
        if p = 15 then aplicWord.Selection.Font.ColorIndex := wdGray50
        else
        if p = 16 then aplicWord.Selection.Font.ColorIndex := wdGray25;
    end;


begin
    result := true;

    P := pos ('=', f);
    if p <> 0 then
        begin
            valor := copy (f, p+1, length (f)-p-1);
            delete (f, p+1, length (f));
            f := maiuscansi (f);
            if (trim (valor) <> '') and (valor [1] in ['0' .. '9']) then
                begin
                    try
                        p := strToInt (valor)
                    except
                        inc (totalItensLog);
                        if escritaNoLogAtivado then gravarArqLog ('Erro na linha ' + intToStr(lIni + 1) + ', formatação: ' + f + valor + '>', 'txtWord.log');
                        sintetiza ('Erro na linha ' + intToStr(lIni + 1) + ', formatação: ' + f + valor + '>');
                        result := false;
                        exit;
                    end;
                end
            else
                p := 0;

            {Font, tipo de letra parte 1}
            if f = '<TF=' then //Tipo de fonte
                begin
                    if not aplicarFormatacao (tipoFonte, (f + valor + '>'), lIni) then exit;
                    aplicWord.Selection.Font.Name := valor;
                    tipoFonte :=  f + valor + '>';
                end
            else
            if f = '<SF=' then //Tamanho da fonte
                begin
                    if not aplicarFormatacao (tamanhoFonte, (f + valor + '>'), lIni) then exit;
                    aplicWord.Selection.Font.size := p;
                    tamanhoFonte := f + valor + '>';
                end
            else
            if f = '<CE=' then //Coloca cor da fonte
                begin
                    if not  aplicarFormatacao (corFonte, (f + valor + '>'), lIni) then exit;
                    trocaCorFonte;
                    corFonte := f + valor + '>';
                end
            else

            {comandos de margem e espacejamento}
            if f = '<MS=' then //<MS=valor> margem superior
                sintetiza ('Colocar comando Word')
            else
            if f = '<MI=' then //<MI=valor> margem inferior
                sintetiza ('Colocar comando Word')
            else
            if f = '<ME=' then //<ME=valor> margem esquerda
                sintetiza ('Colocar comando Word')
            else
            if f = '<MD=' then //<MD=valor> margem direita
                sintetiza ('Colocar comando Word')
            else
            if f = '<EL=' then //<EL=valor> espacejamento entre linhas
                sintetiza ('Colocar comando Word')
            else
            if f = '<RP=' then //<RP=valor> recuo de parágrafo
            // Corrigir, com erro.
                begin
                    if p > 0 then
                        aplicWord.Selection.ParagraphFormat.LeftIndent := p
                    else
                        begin
                            aplicWord.Selection.ParagraphFormat.SpaceBeforeAuto := False;
                            aplicWord.Selection.ParagraphFormat.SpaceAfterAuto := False;
                        end;
                end
            else
                result := false;
        end
    else
        begin
            f := maiuscansi (f);

            {paginação e título}
        if f = '<P>' then //Força salto de pagina
                sintetiza ('Colocar comando Word')
            else
            if f = '<IROD>' then //O texto a sseguir é colocado no rodapé
                sintetiza ('Colocar comando Word')
            else
            if f = '<FROD>' then //Fim do texto de rodapé
                sintetiza ('Colocar comando Word')
            else

            //alinhamento e separação de sílabas
            if f = '<AF>' then //Ativa a autoformatação de parágrafos (Justificar)
                begin
                    if not aplicarFormatacao (alinhamentoTexto, f, lIni) then exit;
                    aplicWord.Selection.paragraphFormat.Alignment := wdAlignParagraphJustify;
                    alinhamentoTexto :=  f;
                end
            else
            if f = '<C>' then //Centraliza texto seguinte
                begin
                    if not aplicarFormatacao (alinhamentoTexto, f, lIni) then exit;
                    aplicWord.Selection.paragraphFormat.Alignment := wdAlignParagraphCenter;
                    alinhamentoTexto := f;
                end
            else
            if f = '<AL>' then //Faz alinhamento à esquerda das linhas
                begin
                    if not aplicarFormatacao (alinhamentoTexto, f, lIni) then exit;
                    aplicWord.Selection.paragraphFormat.Alignment := wdAlignParagraphLeft;
                    alinhamentoTexto := f;
                end
            else
            if f = '<AR>' then //Faz alinhamento à direita das linhas
                begin
                    if not  aplicarFormatacao (alinhamentoTexto, f, lIni) then exit;
                    aplicWord.Selection.paragraphFormat.Alignment := wdAlignParagraphRight;
                    alinhamentoTexto := f;
                end
            else
            if f = '<SS>' then //Separa sílabas
                sintetiza ('Colocar comando Word')
            else
            if f = '<NSS>' then //Não separa sílabas
                sintetiza ('Colocar comando Word')
            else

            //Font, tipo de letra parte 2
            if f = '<IN>' then //Início de texto negritado
                begin
                    if not aplicarFormatacao (negrito, f, lIni) then exit;
                    aplicWord.Selection.Font.Bold := 1;
                    negrito := f;
                end
            else
            if f = '<FN>' then //Fim de texto negritado
                begin
                    if not aplicarFormatacao (negrito, f, lIni) then exit;
                    aplicWord.Selection.Font.Bold := 0;
                    negrito := f;
                end
            else
            if f = '<II>' then //Inicio de texto em itálico
                begin
                    if not aplicarFormatacao (italico, f, lIni) then exit;
                    aplicWord.Selection.Font.Italic := 1;
                    italico := f;
                end
            else
            if f = '<FI>' then //Fim de texto em itálico
                begin
                    if not aplicarFormatacao (italico, f, lIni) then exit;
                    aplicWord.Selection.Font.Italic := 0;
                    italico := f;
                end
            else
            if f = '<IS>' then //Início de texto sublinhado
                begin
                    if not aplicarFormatacao (sublinhado, f, lIni) then exit;
                    aplicWord.Selection.Font.Underline := 1;
                    sublinhado := f;
                end
            else
            if f = '<FS>' then //Fim de texto sublinhado
                begin
                    if not aplicarFormatacao (sublinhado, f, lIni) then exit;
                    aplicWord.Selection.Font.Underline := 0;
                    sublinhado := f;
                end
            else
            if f = '<ISO>' then //Início de texto sobrescrito
                sintetiza ('Colocar comando Word')
            else
            if f = '<FSO>' then //Fim de texto sobrescrito
                sintetiza ('Colocar comando Word')
            else
            if f = '<ISU>' then //Início de texto subscrito
                sintetiza ('Colocar comando Word')
            else
            if f = '<FSU>' then //Fim de texto subscrito
                sintetiza ('Colocar comando Word')

            else
                result := false;
        end;
end;

{--------------------------------------------------------}
{       Testa se o código de formatação é válido
{--------------------------------------------------------}

function testaFormatacao (f: string): boolean;
var
    p: integer;
begin
    testaFormatacao := true;
    f := maiuscansi (f);
    P := pos ('=', f);
    if p > 0 then
        begin
            delete (f, p+1, length (f)-p);

            if pos (f, '<TF= <SF= <CE= <MS= <MI= <ME= <MD= <EL= <RP= <TIT=') = 0 then
                testaFormatacao := false;
        end
    else
        begin
            if pos (f, '<NTIT> <P> <IROD> <FROD> <AF> <C> <AL> <AR> <SS> <NSS> <IN> <FN> <II> <FI> <IS> <FS> <ISO> <FSO> <ISU> <FSU>') = 0 then
                testaFormatacao := false;
        end;
end;

{--------------------------------------------------------}
begin
end.
