1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| Public Class Form1
Dim maxCarParLigne As Integer = 28 'Nombre cractères maxi par lignes.
Dim longSource As Integer = 0 ' Nbre caract. du texte global.
Dim debPlage As Integer = 0 'Index début et fin de la portion de texte à traiter.
Dim finPlage As Integer = maxCarParLigne
Dim pos As Integer = 0 'Position actuel du curseur.
Dim lastPos As Integer = 0 'Position antérieure du curseur.
Dim longCurrentLine As Integer = 0 'Nbre caract. de la ligne sélectionnée.
Dim longCurrentLineEtMotSuivant As Integer = 0 'Nbre caract. de la ligne sélectionnée + le 1er mot de la ligne suivante.
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'chargement éventuel d'un fichier texte (Rtf) existant.
rtb1.LoadFile(IO.Path.GetFullPath("Expressions régulières1.rtf"))
End Sub
Private Sub rtb1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rtb1.SelectionChanged
'Position actuelle du curseur.
pos = rtb1.SelectionStart
' Regex correspondant à tout espace blanc (équivalent à [ \f\n\r\t\v]).
Dim regNR As New System.Text.RegularExpressions.Regex("\s")
'Calcul de la longueur de la ligne sélectionnée et de celle ci + le 1er mot de la ligne suivante.
' Recherche de l'index du début de la ligne suivante
Dim debLineSuiv As Integer
debLineSuiv = rtb1.GetFirstCharIndexFromLine(rtb1.GetLineFromCharIndex(pos) + 1)
' Si cette ligne existe.
If debLineSuiv > -1 Then
' La différence entre les index de début des 2 lignes donne la longueur de la ligne en cours.
longCurrentLine = debLineSuiv - (rtb1.GetFirstCharIndexFromLine(rtb1.GetLineFromCharIndex(pos)) + 1)
'A partir de lindex de la ligne suivante, on recherche le 1er espace blanc = index de la fin de son 1er mot.
' Si la recherche est fructueuse le calcul se fait sinon on lui donne la valeur indiquée.
Dim premMotLineSuivant As Match = regNR.Match(rtb1.Text, debLineSuiv)
If premMotLineSuivant.Success Then
longCurrentLineEtMotSuivant = premMotLineSuivant.Index - rtb1.GetFirstCharIndexOfCurrentLine
Else
longCurrentLineEtMotSuivant = maxCarParLigne + 1
End If
' Sinon, on calcul à partir de la fin du texte.
Else
longCurrentLine = longSource - (rtb1.GetFirstCharIndexFromLine(rtb1.GetLineFromCharIndex(pos)))
longCurrentLineEtMotSuivant = maxCarParLigne + 1
End If
End Sub
Private Sub rtb1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rtb1.TextChanged
miseEnForme()
End Sub
Private Sub miseEnForme()
lastPos = pos 'position du curseur au du changement de texte
debPlage = rtb1.GetFirstCharIndexOfCurrentLine 'le début de la ligne cursée.
'Si la ligne répasse le nombre de char autorisés ou si la ligne + le mot suivant est inf à cette valeur = traitement.
If longCurrentLine > maxCarParLigne OrElse longCurrentLineEtMotSuivant < maxCarParLigne + 1 Then
'On ajoute un espace en fin de texte, afin que tous les mots soient traités par la regex.
If Not Char.IsWhiteSpace(rtb1.GetCharFromPosition(rtb1.GetPositionFromCharIndex(longSource))) Then
rtb1.AppendText(" ")
End If
' Les regex :
' "[\p{P}\s\w]+(?=[\s])" représente une suite de mots entiers.
' "[\n\r]" représente un saut de ligne.
Dim regMot As New System.Text.RegularExpressions.Regex("[\p{P}\s\w]+(?=[\s])")
Dim regNR As New System.Text.RegularExpressions.Regex("[\n\r]")
' collection de suites de mots ou de sauts de lignes trouvés dans la plage fixée.
Dim mcMot As MatchCollection
Dim mcNR As MatchCollection
' "longPlage" représentera la suite de mots maxi possible dans la plage fixée.
Dim longPlage As Integer = 0
' Traitement.
Do
' Calcul de l'index du début de la plage à traiter et longueur du texte.
debPlage += longPlage
longSource = rtb1.TextLength
' Traitement terminé, on sort de la boucle.
If debPlage >= longSource Then
Exit Do
End If
' Calcul de la fin de la plage = au max autorisé sauf en fin
' de texte = aux derniers caractères restants afin d'éviter un dépassement de capacité.
finPlage = Math.Min(maxCarParLigne + 1, longSource - debPlage)
' Collection des sauts de ligne dans la plage, remplacés par des espaces.
mcNR = regNR.Matches(rtb1.Text.Substring(debPlage, finPlage))
For Each mNR As Match In mcNR
rtb1.SelectionStart = debPlage + mNR.Index
rtb1.SelectionLength = mNR.Length
rtb1.SelectedText = Regex.Replace(rtb1.SelectedText, mNR.Value, " ")
Next
' Définit la position de la fin du dernier mot entier dans la plage
' et remplace l'espace suivant par un saut de ligne.
' Définit la longueur de la chaine pour le départ de la plage suivante.
mcMot = regMot.Matches(rtb1.Text.Substring(debPlage, finPlage))
If mcMot.Count > 0 Then
Dim mcMotStr As String
mcMotStr = mcMot(mcMot.Count - 1).Value
longPlage = mcMot(mcMot.Count - 1).Index + mcMot(mcMot.Count - 1).Length
rtb1.SelectionStart = debPlage + longPlage
rtb1.SelectionLength = 1
rtb1.SelectedText = Regex.Replace(rtb1.SelectedText, rtb1.SelectedText, vbCrLf)
longPlage += 1
End If
Loop
End If
' Repositionne le curseur.
rtb1.Select(lastPos, 0)
End Sub |
Partager