Só explicando como funciona o formatador:
criei algumas listas de palavras:
FMT_BLANKLINE - as que vão pular linha (PROCEDURE,CLASS,etc)
FMT_GO_AHEAD - as que vão causar indentação pra frente, tipo IF, DO WHILE, FOR, PROCEDURE
FMT_GO_BACK - as que vão causar indentação pra trás, tipo ENDIF, ENDDO
FMT_AT_BEGIN - as que vão ficar no inÃcio da linha, tipo PROCEDURE, CLASS, FUNCTION
FMT_TO_UPPER - as que vão ser convertidas pra maiúscula
FMT_TO_LOWER - idem pra minúscula
E uma função pra pesquisa disso na linha isCmdType( FMT_GO_AHEAD, cTexto )
Conforme vão sendo encontradas as palavras - no inÃcio da linha - a reação é de acordo com a lista.
Encontrou ENDIF, que pertence a FMT_GO_BACK, então reduz a indentação.
Encontrou PROCEDURE, que pertence a FMT_AT_BEGIN, então coloca na coluna ZERO
Encontrou PROCEDURE, que pertence a FMT_BLANK_LINE, então adiciona uma linha em branco antes e outra depois de PROCEDURE.
Encontrou uma palavra na lista de FMT_TO_UPPER, então converte só essa primeira palavra pra Uppercase
Encontrou duas linhas em branco, então retira uma delas, não pode ter mais de duas linhas em branco em seguida.
É relativamente simples.
As "encrencas" são as precauções sobre o que pode acontecer.
Acrescentei hoje referente a IF x;ENDIF na mesma linha, e também pra DO WHILE;ENDDO e WHILE;ENDDO
Ignorar se está entre #pragma begin dump e #pragma enddump
ignorar se é comentário está entre /* */
ignorar se é comentário com // ou *
apenas alinhar se for continuação da linha anterior (com ponto e vÃrgula)
Uma variável PROCEDURENAME não ser confundida com PROCEDURE
Uma variável NEXTLINE não ser confundida com NEXT
E por aà vai.
Então o sucesso depende do quanto fugir do normal.
Se a variável se chamar nNext, cNext, etc. tudo bem, a inicial indica o tipo de conteúdo e já não confunde com um comando.
Então, se formatar errado, é tentar verificar o porque, e dependendo do caso, corrigir o formatador ou alterar o fonte.
À primeira vista, o máximo que poderia acontecer seria deixar alguma parte do fonte "torta", ou maiúscula/minúscula errada no inÃcio da linha.
E tem as merd. dos comandos das LIBs.
OOHG tem até comando repetido pra coisas diferentes.
E tem horas que é PAGE, que em uma LIB causa indentação e em outra não - ou conserta pra uma ou conserta pra outra.... rs
Se PAGE não indentar... o ENDPAGE vai bagunçar.
Numa lib que o page não serve pra mesma coisa.... a identação de PAGE vai atrapalhar.
Então, dependendo da LIB, é ir la na lista de comandos FMT_GO_AHEAD, e retirar o PAGE da lista.
Adicionais:
Se tiver um comentário assim
*------------------------------------------------
ele é removido, porque não tem nada útil.
Isso do comentário é na rotina IsEmptyComment()
FOR EACH oElement IN cText
IF ! oElement $ "/-*~"
RETURN .F.
ENDIF
NEXT
RETURN .T.
Se o comentário só tiver essas letras "/-*~"
Porque tem comentário assim:
*-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/
Lógico... isso exigiu a verificação de /* */ pra não apagar o que não deve.
Estou avisando para o caso de alguém querer mexer no fonte do formatador, tem que tomar cuidado pra mexer nessa função IsEmptyComment()
Ou retornar sempre .F., pra não mexer em comentário nenhum.