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
