[5.20 win] Editorgadget et autocorrection (majuscule)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[5.20 win] Editorgadget et autocorrection (majuscule)

Message par blendman »

salut

voici un premier essai pour de l'autocorrection :
- majuscule en début de phrase, après les signes de ponctuation
- espace ajouté après une virgule

Il est possible qu'il reste un ou deux bugs, mais ça fonctionne déjà.

Code :

Code : Tout sélectionner

;{ infos
; autocorrection en début de phrase
; by blendman 08/2013
; pb 5.20 - windows x86/64
;}

;{ constantes
#editor = 0
#window =0
;}

Procedure EditorGadgetCursorX (Gadget)
  ; by danilo
  ; returns X-Pos of Cursor
  REG = GadgetID (Gadget)
  SendMessage_ (REG, #EM_EXGETSEL ,0,Range.CHARRANGE)
  ProcedureReturn (Range\cpMax-( SendMessage_ (REG, #EM_LINEINDEX , SendMessage_ (REG, #EM_EXLINEFROMCHAR ,0,Range\cpMin),0))+1)
EndProcedure

Procedure EditorGadgetCursorY (Gadget)
  ; by danilo
  ; returns Y-Pos of Cursor
  REG = GadgetID (Gadget)
  SendMessage_ (REG, #EM_EXGETSEL ,0,Range.CHARRANGE)
  ProcedureReturn SendMessage_ (REG, #EM_EXLINEFROMCHAR ,0,Range\cpMin)+1
EndProcedure

Procedure AutoCorrect()

  pos = EditorGadgetCursorX(#editor) ; la position de la lettre sur la ligne courante
  line = EditorGadgetCursorY(#editor) -1 ; la ligne courante
  texte$ = GetGadgetItemText(#editor,line) ; le texte de la ligne courante
  lettre0$ = Mid(texte$, pos-1, 1); on vérifie la lettre tapée avant la lettre courante
  lettre1$ = Mid(texte$, pos, 1); on vérifie la lettre tapée actuelle
  
  
  If GetAsyncKeyState_(#VK_RETURN) ; si on va à la ligne
    lignePrec$ = GetGadgetItemText(#editor,line-1)
    fin$ = Mid(lignePrec$,Len(lignePrec$))
    If fin$ ="." Or fin$ ="?" Or fin$ = "!"      
      texte$ = GetGadgetItemText(#editor,line-1); on va mettre une maj au 1er mot d ela ligne d'avant si besoin.
      char2$ = Mid(texte$, 0,1); on retient la lettre          
      textefinal2$ = UCase(char2$)+
                     Right(texte$,Len(texte$) -1) 
      
      textotal$ =GetGadgetText(#editor)
      fin = Len(textotal$)
      SetGadgetItemText(#editor,line-1,textefinal2$)
      SendMessage_(GadgetID(#editor), #EM_SETSEL, fin, fin)
      SetActiveGadget(#editor)  
    EndIf
  ElseIf lettre0$ = " " Or lettre0$ ="." Or lettre0$=";" Or lettre0$="!" Or lettre0$="?" Or lettre0$ =","; si c'est un espace, on vérifie les lettres d'avant 
    espace +1
    For  i = Len(texte$)-2 To 0 Step -1  
      char$ = Mid(texte$, i, 1) 
      If char$ =" "
        espace +1          
      ElseIf char$="." Or char$=";" Or char$="!" Or char$="?"; signe de ponctuation          
        ;{ on vérifie le nombre d'espace trouvé : on peut en trouvé 1, 2 ou +.
        If espace = 1
          char3$ = Mid(texte$,i+1,1)
          If char3$<>"." And char3$<>"!" And char3$<>"?"
            ;Debug "il manque un espace après le point normal, d'exclamation ou d'interrogation" 
            char2$ = Mid(texte$, i+1,1); on retient la lettre après le point
            
            textefinal2$ = Left(texte$,i)+
                           " "+   
                           UCase(char2$)+
                           Right(texte$,Len(Texte$) - i-1)              
            SetGadgetItemText(#editor,line,textefinal2$)
            SendMessage_(GadgetID(#editor), #EM_SETSEL, pos+1, pos+1)
            SetActiveGadget(#editor) 
          EndIf
          Break;
        ElseIf espace =2
          ;Debug "ok pour la maj"
          char2$ = Mid(texte$, i+2,1); on retient la lettre après le point  
          textefinal2$ = Left(texte$,i+1)+                              
                         UCase(char2$)+
                         Right(texte$,Len(Texte$) - i-2) 
          textotal$ =GetGadgetText(#editor)
          fin = Len(textotal$)
          SetGadgetItemText(#editor,line,textefinal2$)
          SendMessage_(GadgetID(#editor), #EM_SETSEL, fin, fin)
          SetActiveGadget(#editor)      
          Break;
        Else 
          ;Debug "pas ok"
          Break;
        EndIf 
        ;}
      ElseIf i = 0 ; on est en début de phrase.
        ; on vérifie si on n'est pas allé à la ligne d emanière automatique (avec l'éditeur en wrodwrap par exemple)
        lignePrec$ = GetGadgetItemText(#editor,line-1)
        For k =Len(lignePrec$) To Len(lignePrec$)-4 Step -1
          fin$ = Mid(lignePrec$,k)
          If fin$ ="." Or fin$ ="?" Or fin$ = "!" Or line <= 0  
            char2$ = Mid(texte$, 0,1); on retient la lettre  
            textefinal2$ = UCase(char2$)+
                           Right(texte$,Len(texte$) -1)
            textotal$ =GetGadgetText(#editor)
            fin = Len(textotal$)
            SetGadgetItemText(#editor,line,textefinal2$)
            SendMessage_(GadgetID(#editor), #EM_SETSEL, fin, fin)
            SetActiveGadget(#editor) 
            Break
          EndIf
        Next k        
        Break;
      ElseIf char$="," ; on verifie s'il y a un espace après la virgule
         If espace = 1
          char3$ = Mid(texte$,i+1,1)
          If char3$<>"." And char3$<>"!" And char3$<>"?"
            ;Debug "manque un espace après la virgule" 
            char2$ = Mid(texte$, i+1,1); on retient la lettre après le point            
            textefinal2$ = Left(texte$,i)+
                           " "+                              
                           Right(texte$,Len(Texte$) - i) 
            textotal$ =GetGadgetText(#editor)
            fin = Len(textotal$)
            SetGadgetItemText(#editor,line,textefinal2$)
            SendMessage_(GadgetID(#editor), #EM_SETSEL, fin, fin)
            SetActiveGadget(#editor) 
          EndIf
          Break;
        EndIf        
      EndIf       
    Next i 
  EndIf
EndProcedure

Procedure autocorrect2()
  ;Protected Debut, Fin
  ; methode qui bug :(
  
  SendMessage_(GadgetID(#editor), #EM_GETSEL, @Debut, @Fin)
  texte$ = GetGadgetText(#editor)

  line = SendMessage_(GadgetID(#editor), #EM_LINEFROMCHAR, debut, 0)  
  ligne$ = GetGadgetItemText(#editor, line)
    
  lettre0$ = Mid(texte$, Debut, 1); on vérifie la lettre tapée
  lettre$ = Mid(texte$, Debut-1, 1); on vérifie la lettre-1 tapée
  
  If debut = 1 ; c'est la première lettre. On la met en maj
    textefinal2$ = UCase(lettre$)
    SetGadgetText(#editor,textefinal2$)
    SendMessage_(GadgetID(#editor), #EM_SETSEL, Fin, Fin)
    SetActiveGadget(#editor)
  ElseIf Len(ligne$) = 1 Or (Len(ligne$) =2 And FindString(ligne$,Chr(9)))
    ; si on est allé à la ligne avec sans tabulation, on met la 1ère lettre de la ligne en maj, car on commence un nouveau paragraphe.
    textefinal2$ = UCase(ligne$)
    SetGadgetItemText(#editor,line,textefinal2$)
    SendMessage_(GadgetID(#editor), #EM_SETSEL, Fin, Fin)
    SetActiveGadget(#editor)
  Else
    ; on vérifie si c'est un signe de ponctuation pour la lettre-1
    If lettre$ = "." Or lettre$ ="!" Or lettre$ ="?" Or lettre$ =";"  
      lettre2$ =  UCase(Mid(texte$, Debut, 1))
      If lettre2$ = "." ; si c'est un point on ne fait rien, ça veut dire qu'il y a plusieurs points l'un après l'autre
        ; on ne fait rien
      ElseIf lettre2$ <>" " ; on n'a pas l'espace après le point on le rajoute et on change la lettre après en maj
        textefinal2$ = Left(texte$,Debut-1)+" "+
                       lettre2$ +
                       Right(texte$,Len(Texte$) - Fin)
        SetGadgetText(#editor,textefinal2$)
        SendMessage_(GadgetID(#editor), #EM_SETSEL, fin+1, Fin+1); car on a ajouté une lettre
        SetActiveGadget(#editor)        
      EndIf 
    ElseIf  lettre1$ = "." Or lettre1$ ="!" Or lettre1$ ="?" Or lettre1$ =";" ; si la lettre -2 est un signe de ponctuation
      lettre2$ =  UCase(Mid(texte$, Debut, 1))
      If lettre$ = " "; on a bien l'espace après le point, on ajoute la lettre suivante en maj
        textefinal2$ = Left(texte$,Debut-1)+
                       lettre2$ +
                       Right(texte$,Len(Texte$) - Fin)
        SetGadgetText(#editor,textefinal2$)
        SendMessage_(GadgetID(#editor), #EM_SETSEL, Debut+1, Fin+1)
        SetActiveGadget(#editor)
      EndIf       
    EndIf
  EndIf
  
EndProcedure

If OpenWindow(#window, 0, 0, 600, 400, "Majuscule Automatique", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  EditorGadget(#editor, 5, 5, 590, 390, #PB_Editor_WordWrap)
  LoadFont(0,"Times New Roman",12,#PB_Font_HighQuality)
  SetGadgetFont(#editor,FontID(0))
  SetActiveGadget(#editor)
  
  Repeat 
    Event = WaitWindowEvent() 
    Eventgadget = EventGadget()
    
    Select event
        
      Case #PB_Event_CloseWindow
        quit = 1
        
      Case #PB_Event_Gadget
        
        Select Eventgadget            
            
          Case #editor            
            If EventType() = #PB_EventType_Change
              AutoCorrect()
            EndIf
            
        EndSelect
            
    EndSelect
  Until quit = 1
EndIf
Si vous modifiez le code ou que vous trouvez un bug que vous corrigez, n'hésitez pas à poster le code ;)
Dernière modification par blendman le lun. 19/août/2013 8:47, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Editorgadget et autocorrection (majuscule)

Message par Backup »

j'ai pas testé , mais ton code me parait bien compliqué ...:)

c'est quoi la regle ?

tu veux une majuscule au debut des mots premier d'une phrase (comme la grammaire )
et une majuscule lorsque (. ! ? ... : ) précède le mot (comme la grammaire)

c'est ça ? :)

reedit : je vais voir demain, si je peux faire un truc dans le genre ... ça me plait bien comme casse tete :lol:
Dernière modification par Backup le sam. 17/août/2013 19:54, modifié 1 fois.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Editorgadget et autocorrection (majuscule)

Message par blendman »

Dobro a écrit :j'ai pas testé , mais ton code me parait bien compliqué ...:)

c'est quoi la regle ?

tu veux une majuscule au debut des mots premier d'une phrase (comme la grammaire )
et une majuscule lorsque (. ! ? ... : ) précède le mot (comme la grammaire)

c'est ça ? :)
oui, et j'ajoute l'espace manquant si besoin (après . ! ? ... ; , :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Editorgadget et autocorrection (majuscule)

Message par Backup »

reedit : je vais voir demain, si je peux faire un truc dans le genre ... ça me plait bien comme casse tete :lol:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Editorgadget et autocorrection (majuscule)

Message par Ar-S »

Un genre de truc sympa à faire en effet.
Pour ma part je croiserais quelques replace/remove string avec des expressions régulières.
Ce n'est pas de "l'auto correction" et il y a surement de quoi améliorer les expressions mais le résultat et déjà satisfaisant.

- Espace des ponctuations : , ! | ; .
- Majuscule en début de phrase et point final

il est du coup très facile d'ajouter des caractères à nos règles d'expressions.

Code : Tout sélectionner

T.s = "le paquet était arrivé à destination ,comme une tortue sur son lieu de naissance .comme le dit mère grand! les courges c'est la vie?Le petit pont de bois; triste et humide"
Q = 0


Procedure.s Corrige(T$)
; by Ar-S 

; Commençons par le point final
     LastCar.s = Right(T$, 1)
      If LastCar  <>  "." And LastCar  <>  "?" And LastCar  <>  "!"
            T$ + "."
      EndIf 
      ; La 1ère majuscule
      T$ = ReplaceString(T$,Left(T$,1), UCase(Left(T$,1)),#PB_String_CaseSensitive,1,1)
      
      
Dim result$(0)       
; Pas d'espace avant le point et la virgule !
CreateRegularExpression(0,"[a-z]+[ ]+[.|,]") 
NbFound = ExtractRegularExpression(0, t$ , result$()) 
ReDim result$(NbFound) 
Debug NbFound
For k = 0 To NbFound-1
  Word.s = result$(k)
  Word.s = RemoveString(Word," ",0,1,1)
  Debug result$(k) + " changé en " + Word
  
  T$ = ReplaceString(T$, result$(k), Word) 
Next 
ReDim result$(0) 
FreeRegularExpression(0) 


; Espace avant ! et ?
CreateRegularExpression(0,"[a-zA-Z]+[!|?|;]") 
NbFound = ExtractRegularExpression(0, t$ , result$()) 
ReDim result$(NbFound) 
Debug NbFound
For k = 0 To NbFound-1
  Word.s = result$(k)
  Word.s = InsertString(Word," ",Len(word))
  Debug result$(k) + " changé en " + Word
  
  T$ = ReplaceString(T$, result$(k), Word) 
Next 
ReDim result$(0) 
FreeRegularExpression(0) 

; Espace après ! et ? et . et , et ;
ReDim result$(0)
CreateRegularExpression(0,"[.|,|!|?|;]+[a-zA-Z]") 
NbFound = ExtractRegularExpression(0, T$ , result$()) 
ReDim result$(NbFound) 
Debug NbFound
For k = 0 To NbFound-1

Word.s = result$(k)
Word.s = InsertString(Word," ",2)
Debug result$(k) + " changé en " + Word
  
T$ = ReplaceString(T$, result$(k), Word) 
Next 
ReDim result$(0) 
FreeRegularExpression(0) 


; Les Majuscules
ReDim result$(0)
CreateRegularExpression(0,"[.|!|?|;]+[ ]+[a-z]") 
NbFound = ExtractRegularExpression(0, T$ , result$()) 
ReDim result$(NbFound) 
Debug NbFound
For k = 0 To NbFound-1
      Word.s = result$(k)
      Word.s = ReplaceString(Word, Right(Word,1), UCase(Right(Word,1)),0, Len(word) ,1)
      Debug result$(k) + " changé en " + Word
      T$ = ReplaceString(T$, result$(k), Word) 
Next 

ReDim result$(0) 
FreeRegularExpression(0) 


Debug T$

ProcedureReturn T$
EndProcedure



OpenWindow(0,0,0,400,250,"test", #PB_Window_SystemMenu)

EditorGadget(1,0,0,400,229, #PB_Editor_WordWrap)
SetGadgetText(1,t)

ButtonGadget(2,0,230,400,20,"Corriger")

Repeat
      Select WaitWindowEvent()
            Case #PB_Event_Gadget
                  Select EventGadget()
                              
                        Case 2
                              SetGadgetText(1, Corrige(T))
                               
                              
                  EndSelect      
            Case #PB_Event_CloseWindow
                    Select EventWindow()
                      Case 0
                              Q=1
                    EndSelect
      
      EndSelect
Until Q = 1
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Editorgadget et autocorrection (majuscule)

Message par blendman »

ravi de voir que ce "challenge" vous intéresse :D

@Ar-s : c'est sympa, j'ai corrigé le code pour que ça marche en temps réel ;).

Code : Tout sélectionner

T.s = "le paquet était arrivé à destination ,comme une tortue sur son lieu de naissance .comme le dit mère grand! les courges c'est la vie?Le petit pont de bois; triste et humide"
Q = 0


Procedure.s Corrige(t$="")
  ; by Ar-S
  ; modification by blendman
  Protected Debut.i, Fin.i
  
  SendMessage_(GadgetID(1), #EM_GETSEL, @Debut, @Fin); pour vérifier où est le curseur
  T$ = GetGadgetText(1)

; on vérifie les touches utilisées.
If GetAsyncKeyState_(#VK_RETURN) Or GetAsyncKeyState_(#VK_SPACE) Or
   GetAsyncKeyState_(190) Or GetAsyncKeyState_(223) Or 
   GetAsyncKeyState_(110)
  
  If GetAsyncKeyState_(#VK_RETURN); pour connaitre le nombre d'entrée, de vraies lignes, mais ça ne marche pas :(
    T$ + Chr(13)
  EndIf
  
;{ ça, j'ai viré car ça ne marchait pas pour l'autocorrection  
; Commençons par le point final
; LastCar.s = Right(T$, 1)
; If LastCar  <>  "." And LastCar  <>  "?" And LastCar  <>  "!"
;   T$ + "."
; EndIf
;}

; La 1ère majuscule
T$ = ReplaceString(T$,Left(T$,1), UCase(Left(T$,1)),#PB_String_CaseSensitive,1,1)
modif = 0

;{ les corrections 

Dim result$(0)   

;{ Pas d'espace avant le point et la virgule !
CreateRegularExpression(0,"[a-z]+[ ]+[.|,]")
NbFound = ExtractRegularExpression(0, t$ , result$())
ReDim result$(NbFound)
;Debug NbFound
modif - nbfound
For k = 0 To NbFound-1
  Word.s = result$(k)
  Word.s = RemoveString(Word," ",0,1,1)
  ;Debug result$(k) + " changé en " + Word
  T$ = ReplaceString(T$, result$(k), Word)
Next
ReDim result$(0)
FreeRegularExpression(0)
;}

;{ Espace avant ! et ?
CreateRegularExpression(0,"[a-zA-Z]+[!|?|;]")
NbFound = ExtractRegularExpression(0, t$ , result$())
ReDim result$(NbFound)
;Debug NbFound
modif + Nbfound
For k = 0 To NbFound-1
  Word.s = result$(k)
  Word.s = InsertString(Word," ",Len(word))
  ;Debug result$(k) + " changé en " + Word
  T$ = ReplaceString(T$, result$(k), Word)
Next
ReDim result$(0)
FreeRegularExpression(0)
;}

;{ Espace après ! et ? et . et , et ;
ReDim result$(0)
CreateRegularExpression(0,"[.|,|!|?|;]+[a-zA-Z]")
NbFound = ExtractRegularExpression(0, T$ , result$())
modif + Nbfound
ReDim result$(NbFound)
;Debug NbFound
For k = 0 To NbFound-1
Word.s = result$(k)
Word.s = InsertString(Word," ",2)
;Debug result$(k) + " changé en " + Word
T$ = ReplaceString(T$, result$(k), Word)
Next
ReDim result$(0)
FreeRegularExpression(0)
;}

;{ Les Majuscules
ReDim result$(0)
CreateRegularExpression(0,"[.|!|?|;]+[ ]+[a-z]")
;{ marche pas, pour connaitre les entrées 
CreateRegularExpression(1,"["+Chr(13)+"]+[a-z]") 
NbFound2 = ExtractRegularExpression(1, T$ , result$())
Debug NbFound2
;}
NbFound = ExtractRegularExpression(0, T$ , result$())
ReDim result$(NbFound)
;Debug NbFound
For k = 0 To NbFound+NbFound2-1
  Word.s = result$(k)
  Word.s = ReplaceString(Word, Right(Word,1), UCase(Right(Word,1)),0, Len(word) ,1)
  ;Debug result$(k) + " changé en " + Word
  T$ = ReplaceString(T$, result$(k), Word)
Next
ReDim result$(0)
FreeRegularExpression(0)
;}

;}

SetGadgetText(1,t$)
SendMessage_(GadgetID(1), #EM_SETSEL, Debut+modif, Fin+modif); ; on replace le curseur là où il était avec les modifications prises en charge
SetActiveGadget(1)

EndIf
EndProcedure

If OpenWindow(0,0,0,400,250,"Auto-correction", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  EditorGadget(1,0,0,400,229, #PB_Editor_WordWrap)
  SetGadgetText(1,T)
  
  Repeat
    event = WaitWindowEvent()
    EventGadget = EventGadget()
    EventWindow= EventWindow()
    
    Select event
        
      Case #PB_Event_Gadget
        
        Select EventGadget
          Case 1
            If EventType()=#PB_EventType_Change
              Corrige()
            EndIf
            
        EndSelect  
        
      Case #PB_Event_CloseWindow
        
        Select EventWindow
          Case 0
            Q=1
        EndSelect
        
    EndSelect  
  Until Q = 1
EndIf
Au fait, c'est quoi dans une regularexpression pour vérifier la touche entrée ? (j'ai testé #vk_return, chr(13), mais je n'ai pas réussi ^^). Afin de mettre la majuscule à un mot qui se trouve à la ligne, après un signe de ponctuation sur la ligne précédente.
A propos des regularexpressions, l'idée est intéressante, justement, je me posais la question sur les expressions régulières.


@Dobro : j'attends avec impatience ton code ;)


D'ailleurs si le casse-tête vous plait, après, je vais essayer d'ajouter la correction orthographique (d'après les mots d'un fichier texte ou d'une bdd) et les synonymes (idem). Mais bon, j'essaie déjà
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Editorgadget et autocorrection (majuscule)

Message par Ar-S »

Pour le retour à la ligne essaies

Code : Tout sélectionner

[\n]
Voir ce lien bien sympa.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Editorgadget et autocorrection (majuscule)

Message par blendman »

Ar-S a écrit :Pour le retour à la ligne essaies

Code : Tout sélectionner

[\n]
Voir ce lien bien sympa.
merci pour le lien ;)

ça marche nickel pour :

Code : Tout sélectionner

CreateRegularExpression(1,"[\n]+[a-z]") 
Mais pas avec :

Code : Tout sélectionner

CreateRegularExpression(1,"[.|!|?|;]+[\n]+[a-z]") 
Ce qui est dommage car du coup, la majuscule se fait même s'il n'y a pas de ponctuation. Une idée de ce qu'il faut noter dans ce cas ? (ne mettre la majuscule à la ligne suivante que si le dernier caractère de la ligne précédente est un signe de ponctuation . ; ! ? )
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Editorgadget et autocorrection (majuscule)

Message par falsam »

Ton premier code a un inconvénient : Si on cherche à taper un nom de domaine un espace et des majuscule s'insérent.
Exemple : purebasic.com devient Purebasic. Com
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Editorgadget et autocorrection (majuscule)

Message par Backup »

bon voici ma version ...
en esperant qu'elle fonctionne ... je l'ai testé ..ça me parait bon ...

elle tiens compte des points finissant une phrase précédente ..
par exemple si on tape

"rien ne sert.
de courir , il faut partir a point"

le "de" sera affublé d'une majuscule .. alors que si le point n'est pas present dans la premiere ligne , la deuxieme n'aura pas de majuscule ...

bon .. la version a Ar-s avec les expressions regulieres est surement la meilleurs voie ..
ce qui me gennais dans ton code c'est la profusion de "ELSEIF " je trouve que ça complique le code :)

ma version :
(elle ne prends pas en compte le copier-coller de texte , mais seulement celui q'uon tape en directe )

Code : Tout sélectionner

; Purebasic 5.11
#editor = 0
#window =0

Declare  AutoCorrect()
Declare  EditorGadgetLocate2(Gadget,x,y)
Declare  EditorGadgetCursorY2(Gadget)



If OpenWindow(#window, 0, 0, 600, 400, "Majuscule Automatique", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
	EditorGadget(#editor, 5, 5, 590, 390, #PB_Editor_WordWrap)
	LoadFont(0,"Times New Roman",12,#PB_Font_HighQuality)
	SetGadgetFont(#editor,FontID(0))
	SetActiveGadget(#editor)
	
	Repeat
		Event = WaitWindowEvent()
		Eventgadget = EventGadget()
		
		Select event
			
			Case #PB_Event_CloseWindow
			quit = 1
			
			Case #PB_Event_Gadget
			
			Select Eventgadget           
				
				Case #editor           
				If EventType() = #PB_EventType_Change
					
					AutoCorrect()
				EndIf
				
			EndSelect
			
		EndSelect
	Until quit = 1
EndIf





procedure AutoCorrect()
	; Version Dobro
	; V1
	If GetAsyncKeyState_(#VK_RETURN) ; si on va à la ligne
		
		line = EditorGadgetCursorY2(#editor)-2  ; la ligne courante
		
		Texte$ =GetGadgetItemText(#editor, line)
		
		; **************************************************
		; suprime les espaces avant le signe
		restore espace_S:
		ChaineCherchee$=""
		while ChaineCherchee$<>"-1"
			read.s ChaineCherchee$
			ChaineRemplacee$=ChaineCherchee$
			Texte$ = ReplaceString(Texte$, " "+ChaineCherchee$, ChaineRemplacee$ ) 
		wend
		; **************************************************
		
		; **************************************************
		; suprime les espaces apres le signe , et en remet un
		restore S_espace:
		ChaineCherchee$=""
		while ChaineCherchee$<>"-1"
			read.s ChaineCherchee$
			ChaineRemplacee$=ChaineCherchee$
			Texte$ = ReplaceString(Texte$, ChaineCherchee$+" ", ChaineRemplacee$ ) ; suprime l'espace
			Texte$ = ReplaceString(Texte$, ChaineCherchee$, ChaineRemplacee$+" " ) ; remet un espace
		wend
		; **************************************************
		
		; **************************************************
		; cherche les signes et met une majuscule au mot suivant
		restore S_Maj:
		ChaineCherchee$=""
		
		while ChaineCherchee$<>"-1"
			read.s ChaineCherchee$
			For k=1 To len(Texte$)
				extrait$=mid(Texte$,k,1)
				
				if extrait$=ChaineCherchee$
					pos_espace=FindString(Texte$," ",k+2)
					extrait2$=mid(Texte$,k+2,pos_espace-(k+1))
					change$=Ucase(left(extrait2$,1))+right(extrait2$,len(extrait2$)-1)
					Texte$ = ReplaceString(Texte$, extrait2$, change$ ,#PB_String_NoCase ,k,1) 
				Endif
			Next k
		wend
		; **************************************************
		SetGadgetItemText(#editor, line, Texte$) ; pose la ligne en cours dans l'editeur
		
		; ************* change premier caractere du text *****************
		for u=0 to CountGadgetItems(#editor)
			Texte$ =GetGadgetItemText(#editor,u )
			if trim(Texte$) <>"" 
				extrait$=mid(Texte$,1,len(texte$))
				change$=Ucase(left(extrait$,1))+right(extrait$,len(extrait$)-1)
				Texte$ = change$
				SetGadgetItemText(#editor, u, Texte$) ; pose la ligne en cours dans l'editeur
				break
			Endif
		Next u
		
		; **************************************************************
		; ******************** cherche si le dernier caractere d'une ligne precedente contient un signe **************
		
		for u=0 to CountGadgetItems(#editor)
			Texte$ =GetGadgetItemText(#editor,u )
			if flag=1 and right(Texte$,1)<>" " or right(Texte$,1)<>""
				extrait$=mid(Texte$,1,len(texte$))
				change$=Ucase(left(extrait$,1))+right(extrait$,len(extrait$)-1)
				Texte$ = change$
				flag=0
			endif
			restore S_Maj:
			ChaineCherchee$=""
			while ChaineCherchee$<>"-1"
				read.s ChaineCherchee$
				if right(trim(Texte$),1)=ChaineCherchee$ 
					Flag=1
				Endif
			Wend
			SetGadgetItemText(#editor, u, Texte$) ; pose la ligne en cours dans l'editeur
		Next u
		; ****************************************************************************************************
		
		
	endif
	
Endprocedure
Procedure EditorGadgetLocate2(Gadget,x,y)
	; Set cursor position
	REG = GadgetID(Gadget)
	CharIdx = SendMessage_(REG,#EM_LINEINDEX,y-1,0)
	LLength = SendMessage_(REG,#EM_LINELENGTH,CharIdx,0)
	If LLength >= x-1
		CharIdx + x-1
	EndIf
	Range.CHARRANGE
	Range\cpMin = CharIdx
	Range\cpMax = CharIdx
	SendMessage_(REG,#EM_EXSETSEL,0,Range)
EndProcedure
Procedure EditorGadgetCursorY2(Gadget)
	; returns Y-Pos of Cursor
	REG = GadgetID(Gadget)
	SendMessage_(REG,#EM_EXGETSEL,0,Range.CHARRANGE)
	ProcedureReturn SendMessage_(REG,#EM_EXLINEFROMCHAR,0,Range\cpMin)+1
EndProcedure

DataSection
	espace_S:
	data.s "!","?","...",";",",",":",".","-1"
	S_espace:
	data.s "!","?","...",";",",",":",".","-1"
	S_Maj:
	data.s ";",".","!","?","...",":","-1"
EndDataSection 

; EPB



@Falsam , surement que le miens fera pareil ... c'est pour un editeur de text , il faudrait juste ajouter des exceptions....

[reedit] ha non .. ça a l'air de marcher avec le miens :) .... ha non ; finalement l'espace est present
Dernière modification par Backup le lun. 19/août/2013 9:54, modifié 2 fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Editorgadget et autocorrection (majuscule)

Message par falsam »

Dobro a écrit :@Falsam , surement que le miens fera pareil ... c'est pour un editeur de text , il faudrait juste ajouter des exceptions....ha non .. ça a l'air de marcher avec le miens :)
Non ça fait la même chose. Presse la touche entrée juste après avoir saisi un nom de domaine.

Un bug à signaler
-Saisi une première phrase puis à la ligne suivante une autre phrase.
-Positionnes toi à la fin de la première phrase et presse la touche entrée pour insérer une ligne.
-L'insertion de la ligne s'effectue bien (Normal) par contre le curseur se positionne à la fin de la 3eme ligne.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Editorgadget et autocorrection (majuscule)

Message par Backup »

oui , il suffirai d'ajouter un suivit de la position du curseur
en fonction de l'apuis sur les touches flechées et du clic souris gauche
(événements a ajouter...)

j'ai mis la fonction " EditorGadgetCursorY2(Gadget)" et "EditorGadgetLocate2(Gadget,x,y)"
qui permettent justement de deplacer le curseur , et de connaitre sa position en ligne

ça depasse le cadre du chalenge ... :)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Editorgadget et autocorrection (majuscule)

Message par Ar-S »

falsam a écrit :Ton premier code a un inconvénient : Si on cherche à taper un nom de domaine un espace et des majuscule s'insérent.
Exemple : purebasic.com devient Purebasic. Com
On peut ajouter un expressione à la fin qui re corrigerait ça

Code : Tout sélectionner

[a-z]+[.]+[ ]+[Com|Net|Org|Fr etc]+[ ]
ça fait de la correction de correction mais hormis cela, je vois pas comment un prog de correction ferait la différence.

------edit------

P.S : Louée soit la team pour le flag #PB_Editor_WordWrap de l'editorgadget() :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Editorgadget et autocorrection (majuscule)

Message par venom »

Intéressant ces codes :P Sympa






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [5.20 win] Editorgadget et autocorrection (majuscule)

Message par graph100 »

il existe des expressions régulières toutes faites pour la détection des adresses emails, internets etc...
Faut chercher un peu là dessus je pense
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre