Clipper On Line • Ver Tópico - Formatar fonte
Página 1 de 2

Formatar fonte

MensagemEnviado: 25 Out 2017 18:18
por JoséQuintas
Eu comecei a ficar cansado de ajustar os fontes da OOHG manualmente, e acabei criando um formatador de fontes.
Estou utilizando encima dos exemplos da OOHG, e conferindo um a um.
Até agora o resultado é satisfatório.

Por enquanto, a parte que faço manualmente, resultado do formatador é:
- retirar linhas em branco entre declarações LOCAL
- retirar a linha em branco antes de RETURN quando está dentro de um IF ou algo assim

De resto, que não dá pra fazer automático, pelo menos por enquanto:
- retirar comentários inúteis
- retirar no final do arquivo o comentário /* EOF */

Se der, vou ajustar pelo menos a primeira parte, mas comparado ao que estava antes, tá bom até demais... rs
Já faz todo alinhamento do fonte, e também Upper/Lower pra determinadas palavras.
E NÃO mexe na parte de fonte C, que não é formatada, e pode ser normal em fontes HMG.
O fonte em C é identificado por #pragma begindump e #pragma enddump.
Pode ter vários blocos de C e PRG dentro do fonte, vai formatar só as partes referentes a PRG.

Foi um desafio legal.... rs

Formatar fonte

MensagemEnviado: 25 Out 2017 21:33
por JoséQuintas
Eureka !!! Menos um.... rs

fonte de entrada:

procedure x
local a, ;
b
local c
local d
do while x
skip
enddo
return


fonte de saída:

PROCEDURE x

   LOCAL a, ;
      b
   LOCAL c
   LOCAL d

   DO WHILE x
      skip
   ENDDO

   RETURN


O problema era quando tinha isso, de várias declarações de variáveis em seguida.
Agora acresentar o skip na lista de uppercase... rs

Formatar fonte

MensagemEnviado: 25 Out 2017 22:10
por JoséQuintas
Mas a parte que vão gostar mesmo é esta:

entrada:
function Main
request DBFCDX , DBFFPT
VAR := 'Test'
set century on
set deleted on
set browsesync on
define window Form_1 ;
AT 0,0 ;
WIDTH 640 HEIGHT 480 ;
TITLE 'ooHG Browse Demo)' ;
MAIN NOMAXIMIZE ;
ON INIT OpenTables() ;
ON RELEASE CloseTables()
define main menu
POPUP 'File'
ITEM 'Set Browse Value'   ACTION Form_1.Browse_1.Value := Val ( InputBox ('Set Browse Value','') )
ITEM 'Get Browse Value'   ACTION MsgInfo ( Str ( Form_1.Browse_1.Value ) )
ITEM 'Refresh Browse'   ACTION Form_1.Browse_1.Refresh
SEPARATOR
ITEM 'Exit'      ACTION Form_1.Release
END POPUP
POPUP 'Help'
ITEM 'About'            ACTION MsgInfo (oohgversion()+" "+hb_compiler())
END POPUP
END MENU
DEFINE STATUSBAR
STATUSITEM ''
END STATUSBAR
@ 10,10 BROWSE Browse_1                                                                 ;
WIDTH 610                                ;
HEIGHT 390                               ;
HEADERS { 'Code' , 'First Name' , 'Last Name', 'Birth Date', 'Married' , 'Biography' } ;
WIDTHS { 150 , 150 , 150 , 150 , 150 , 150 } ;
WORKAREA &var ;
FIELDS { 'Test->Code' , 'Test->First' , 'Test->Last' , 'Test->Birth' , 'Test->Married' , 'Test->Bio' } ;
TOOLTIP 'Browse Test' ;
ON CHANGE ChangeTest() ;
JUSTIFY { BROWSE_JTFY_LEFT,BROWSE_JTFY_CENTER, BROWSE_JTFY_CENTER, BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER} ;
DELETE ;
LOCK ;
EDIT INPLACE
on key f10 of form_1 action {|| _oohg_calldump()}
end window
center window Form_1
Form_1.Browse_1.SetFocus
activate window Form_1
return nil


saída:
FUNCTION Main

   REQUEST DBFCDX , DBFFPT
   VAR := 'Test'
   SET CENTURY ON
   SET deleted on
   SET browsesync on
   DEFINE WINDOW Form_1 ;
         AT 0,0 ;
         WIDTH 640 HEIGHT 480 ;
         TITLE 'ooHG Browse Demo)' ;
         MAIN NOMAXIMIZE ;
         ON INIT OpenTables() ;
         ON RELEASE CloseTables()
      DEFINE MAIN MENU
         POPUP 'File'
            ITEM 'Set Browse Value'   ACTION Form_1.Browse_1.Value := Val ( InputBox ('Set Browse Value','') )
            ITEM 'Get Browse Value'   ACTION MsgInfo ( Str ( Form_1.Browse_1.Value ) )
            ITEM 'Refresh Browse'   ACTION Form_1.Browse_1.Refresh
            SEPARATOR
            ITEM 'Exit'      ACTION Form_1.Release
         END POPUP
         POPUP 'Help'
            ITEM 'About'            ACTION MsgInfo (oohgversion()+" "+hb_compiler())
         END POPUP
      END MENU
      DEFINE STATUSBAR
         STATUSITEM ''
      END STATUSBAR
      @ 10,10 BROWSE Browse_1                                                                 ;
         WIDTH 610                                ;
         HEIGHT 390                               ;
         HEADERS { 'Code' , 'First Name' , 'Last Name', 'Birth Date', 'Married' , 'Biography' } ;
         WIDTHS { 150 , 150 , 150 , 150 , 150 , 150 } ;
         WORKAREA &var ;
         FIELDS { 'Test->Code' , 'Test->First' , 'Test->Last' , 'Test->Birth' , 'Test->Married' , 'Test->Bio' } ;
         TOOLTIP 'Browse Test' ;
         ON CHANGE ChangeTest() ;
         JUSTIFY { BROWSE_JTFY_LEFT,BROWSE_JTFY_CENTER, BROWSE_JTFY_CENTER,  BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER} ;
         DELETE ;
         LOCK ;
         EDIT INPLACE
      on key f10 of form_1 action {|| _oohg_calldump()}
   END WINDOW
   CENTER WINDOW Form_1
   Form_1.Browse_1.SetFocus
   ACTIVATE WINDOW Form_1

   RETURN NIL


A única parte deformada aí do fonte, não sei se tem a ver com Windows 10 e Edge, foi o post que deformou.... rs

Formatar fonte

MensagemEnviado: 26 Out 2017 06:34
por asimoes
Quintas,

Aproveitando a ideia, poderia até criar uma base de sintaxe com os nomes do tipo por exemplo

TIPO    UPPERCASE  CAPITALIZE
LOCAL     .T.         .F.
PRIVATE   .T.         .F.
DO WHILE  .T.         .F.

Capitalize seria para transformar a primeira letra em caixa alta e o restante em caixa baixa

Onde encontrar o tipo e uppercase for .t. ou .f. transforma em caixa alta/baixa

É só uma ideia

Formatar fonte

MensagemEnviado: 26 Out 2017 09:25
por JoséQuintas
O ideal é ajustar o do Harbour mesmo.
É que fonte com linguagem C dentro não dá pra usar ele.

ajustar maiúscula minúscula é complicado.
Por exemplo cComando := "do case"
Já não poderia formatar isso entre aspas, senão vai causar problema.

Um problema que tive durante os testes:

do while ! eof() ;

skip
enddo

isso acima funciona, desde que não seja apagada a linha em branco.
senão vai parecer que o formatador sumiu com alguma linha de continuação.... rs

Não é fácil prever coisas do usuário.
Formatar o básico já tá bom demais.
O UPPERCASE, faço só da PRIMEIRA PALAVRA da linha, pra evitar problemas.
E não é que isso já causa um grande impacto ao visualizar o fonte !

Formatar fonte

MensagemEnviado: 26 Out 2017 09:40
por JoséQuintas
A propósito, tá na minha pasta de rascunhos (drafts)

https://github.com/JoseQuintas/JoseQuintas/blob/master/drafts/hmgformat.ch
https://github.com/JoseQuintas/JoseQuintas/blob/master/drafts/hmgformat.prg

tá ajustado pra trabalhar na pasta de exemplos da OOHG, e obrigar a digitar BACKUP_IS_OK

É que nunca se sabe o estrago que pode fazer em outros fontes..... rs
No meu caso, como está controlado pelo git, é só resetar as alterações em caso de problema.

Formatar fonte

MensagemEnviado: 26 Out 2017 15:08
por JoséQuintas
Cheguei numa parte dos fontes que ainda tem problema, o formatador ainda não resolveu.

dá problema nos #ifdef e METHOD
acaba ficando desalinhado depois deles.

Até aí... tudo bem... melhor ajustar poucos fontes a mão do que todos.... rs

Formatar fonte

MensagemEnviado: 27 Out 2017 11:05
por JoséQuintas
Cheguei a conclusão que é quase impossível formatar fonte Clipper/Harbour/XHarbour.

Existe uma coisa chamada: palavra reservada, e isso não existe em Clipper/Harbour/xHarbour.

Exemplos:

PAGE X
   WIDTH 10
   HEIGHT 10
END
PAGE := 5


IF( x = 5 )
IF( x = 5, 10, 20 )


DO WHILE ! Eof() ;

   SKIP
ENDDO


CASE := 10


IF x = 10; Y = 20; ENDIF
IF x = 10; /* alguma notação */ ; y := 20 /* outra anotação */ ; ENDIF


x := HB_INLINE {  codigo fonte C }


Sempre que conserta uma coisa bagunça a outra..... rs
E se considerar que é fonte de LIB, nem dá pra imaginar o que pode ter em fonte de usuário..... rs
Vai servir só uma ajuda, e não uma solução.

Ficar enchendo de IFs... vai complicar cada vez mais.... e vai acabar não resolvendo.
De repente, deixar fácil de alterar, pra ajustar diferente pra cada fonte que aparecer.

Formatar fonte

MensagemEnviado: 30 Out 2017 08:41
por rubens
Bom dia...

Quintas...

Se você estiver com a minigui instalada.. dá um olhada nessa pasta... as vezes consegue tirar alguma idéia de lá...
C:\MiniGUI\UTILS\Code_ReIndent

Rubens

Formatar fonte

MensagemEnviado: 05 Nov 2017 21:21
por JoséQuintas
Olhem o tipo de fonte que tem pra formatar, não tem jeito, formatou errado.
Não se enganem... está formatado errado !!!!

      IF ( Form_1.miniwrite_1.FontBold , FORM_1.BOT_BOLD.PICTURE := "bold_on" , FORM_1.BOT_BOLD.PICTURE := "bold_off" )
         IF ( Form_1.miniwrite_1.FontItalic , FORM_1.BOT_ITAL.PICTURE := "ital_on" , FORM_1.BOT_ITAL.PICTURE := "ital_off" )
            IF ( Form_1.miniwrite_1.FontUnderline , FORM_1.BOT_SUBRA.PICTURE := "subra_on" , FORM_1.BOT_SUBRA.PICTURE := "subra_off" )
               IF ( Form_1.miniwrite_1.FontStrikeOut , FORM_1.BOT_TACHA.PICTURE := "tach_on" , FORM_1.BOT_TACHA.PICTURE := "tach_off" )
                  IF ( Form_1.miniwrite_1.FontScript == RTF_SUBSCRIPT , ( FORM_1.BOT_SUB.PICTURE := "sub_on" , FORM_1.BOT_SUP.PICTURE := "sup_off" ), FORM_1.BOT_SUB.PICTURE := "sub_off" )
                     IF ( Form_1.miniwrite_1.FontScript == RTF_SUPERSCRIPT , ( FORM_1.BOT_SUP.PICTURE := "sup_on" , FORM_1.BOT_SUB.PICTURE := "sub_off" ) , FORM_1.BOT_SUP.PICTURE := "sup_off" )


Problemas:

1. Problema principal: mania de colocar espaço em função. Soma ( 2 )
2. Junto a esse, usar IF() ao invés de IIF()

Aí... não tem formatador que resolva... rs
A título de curiosidade, é o fonte miniwriter.prg, da HMG3.

A propósito... agora estou testando o formatador no fonte de TODAS as LIBs GUI pra ver o que dá.... rs
HMG3, HMG Extended, HWGUI e OOHG.

Por enquanto a falha é justamente em fonte que sai do normal, como esse acima.
Apenas acaba bagunçando a indentação, como pode ser visto acima.
Mas acho que até se fosse formatar "a mão", poderia acontecer o mesmo problema..... rs
Isso confunde.

Formatar fonte

MensagemEnviado: 05 Nov 2017 21:25
por JoséQuintas
Ah sim....
Pra HMG3, e provavelmente HMG Extended e HWGUI.... só acrescentando palavras nas listas.

https://github.com/JoseQuintas/JoseQuintas/blob/master/drafts/hmgformat.ch

Ainda resultados interessantes, já que muitos fontes precisam realmente de formatação.

Lembrando que pra maiúscula, somente se estiver no começo da linha.
Se só no começo já complica, imaginem se fosse mexer em qualquer posição da linha..... rs

Formatar fonte

MensagemEnviado: 07 Nov 2017 09:40
por JoséQuintas
Alterei de novo.... rs
Agora coloquei em arquivo XML, assim nem precisa recompilar.
O programa busca o arquivo CFG na mesma pasta do EXE.

https://github.com/JoseQuintas/JoseQuintas/blob/master/drafts/hmgformat.cfg

Faltou dizer:
Quando falha, a indentação fica bagunçada.
Aí é olhar o fonte, procurando o que causou a "bagunça".

Usando um exemplo acima, bagunçou em IF ( x=1, y := 2 )
Nesse caso foi só corrigir o fonte: iif( x=1, y := 2 ) e depois reformatar.

Ainda tem algumas coisas pra resolver, por exemplo METHOD.
É que na declaração da classe é de um jeito, e fora dela é de outro.

Como são muitos fontes pra corrigir, estou procurando salvar os que deram certo, pra reduzir a lista de pendência.
Como eu disse antes, formatar tudo que é fonte de LIB automaticamente, só por milagre.
Então usando do jeito que está, que já ajuda muito, pra resolver o resto depois.
E nesse meio tempo, o que der pra melhorar já estou melhorando.

Formatar fonte

MensagemEnviado: 08 Nov 2017 09:24
por JoséQuintas
E alterei de novo.... rs
Por XML acabou permitindo cometer erros.

Agora criei uma referência para o que vai na coluna zero.
Pelo menos isso acaba tratando cada PROCEDURE,FUNCTION em separado, o que reduziu erros de formatação.

Formatar fonte

MensagemEnviado: 08 Nov 2017 09:44
por JoséQuintas
Sei que ainda tem coisas pra acertar, como por exemplo IF....;ENDIF na mesma linha.
Mas podem conferir o resultado comparando com o fonte das LIBs que cada um tem.

Exemplo, o superchief.prg, que tem mais de 2.500 linhas, e deve ter muitos dos comandos da HMG Extended

https://github.com/JoseQuintas/allgui/blob/master/hmge/SAMPLES/Applications/Super/superchef.prg

Nota:
Ainda não entrei nos fontes pra verificar, está tudo com o resultado direto do formatador.

Formatar fonte

MensagemEnviado: 08 Nov 2017 14:53
por JoséQuintas
Sabem aquilo de quando tudo está pronto, e pensamos: só mais uma alteraçãozinha....
Pois é...
ferrou tudo.
Apagou dos fontes o fim de comentário: */
Isso quando o comentário está neste estilo ************************************** */
Vou ter que resetar a allgui, e começar tudo de novo.... rs

Pelo menos agora vai ser só salvar as pastas e rodar o formatador.... menos mal.

Formatar fonte

MensagemEnviado: 11 Nov 2017 11:42
por JoséQuintas
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.

Formatar fonte

MensagemEnviado: 13 Nov 2017 14:23
por sygecom
Zé,
Será que esse teu formatador, ajustaria fontes com Hwgui ? Tenho uma porção aqui para ajeitar...kkkkk

Formatar fonte

MensagemEnviado: 13 Nov 2017 14:55
por JoséQuintas
No momento ele formata tudo da pasta ALLGUI e subpastas, vou ajustar pra poder passar nome de arquivo.

ALLGUI é HMG 3, HMG Extended, HWGUI e OOHG, todos os fontes e exemplos.

Deixei fonte contendo HB_INLINE de fora, porque mistura linguagem C no meio do fonte.
Para os #pragma begindump - #pragma enddump ok, o formatador não mexe nessa parte.

Por enquanto o máximo que poderia acontecer seria ficar torto para alguns programas.
Mas nunca se sabe o que se pode encontrar nos fontes.... rs
Por isso é bom o backup, ou copiar os fontes pra uma pasta e formatar lá, assim só ajusta o nome da pasta no formatador.

Formatar fonte

MensagemEnviado: 22 Nov 2017 22:59
por JoséQuintas
Consegui acertar para METHOD dentro de CLASS/CREATE CLASS
Não pula mais linha em branco, e sai na coluna que deveria.

Formatar fonte

MensagemEnviado: 23 Nov 2017 08:23
por JoséQuintas
Enviei pra ser salvo na OOHG.
Problemas formatando TODOS os fontes oficiais da OOHG:

1) Um ponto e vírgula na linha anterior do otherwise, deixou o otherwise pra frente

CASE dddd; // jdfhfhgf
       OTHERWISE


2) Um IF daqueles..... rs
Foi só corrigir o fonte (considero um erro no fonte). Foi considerado como iif() pelo formatador

   IF(  x = 10 )


3) O comando que causa indentação dentro de IF

IF ...
   DEFINE WINDOW
   ELSE
      DEFINE WINDOW
   ENDIF
END WINDOW


Até que são aceitáveis.
Com exceção do último, só alterar o que está no fonte, e tudo bem.
No último, não faço idéia qual poderia ser a alternativa.

Mas é um resultado bom.
Apenas 3 fontes precisaram de ajustes extras, e apenas um precisou formatação manual.

Formatar fonte

MensagemEnviado: 23 Nov 2017 08:36
por JoséQuintas
esqueci de mostrar aonde pegar
Como enviei pra fazer parte da OOHG, está no meu fork da OOHG.

https://github.com/JoseQuintas/oohg_core/blob/master/drafts/hmgformat.prg