Programmation

Bouts de code, algorithmes retranscrits et astuces de programmation : ici on parle PHP, Javascript, JQuery, VB.Net et parfois un peu d’autres langages !

VB.Net : fonction de content spinning

Comme on me l’a demandé expressément, voici le snippet VB.Net (adaptable facilement à n’importe quel langage) permettant de spinner un texte construit pour cela. C’est cet algorithme simple de content spinning, basé sur la récursivité et sur l’utilisation des expressions régulières, que j’utilise dans effiSpin pour générer les variantes de mes contenus spinnés.

'Objet Random global
'On doit le "sortir" de la fonction pour générer à chaque appel un nombre aléatoire
'Sinon chaque spin généré sera... identique !
Private _Rand As New Random()

''' <summary>
''' Génération d'un spin aléatoire à partir d'un masterspin
''' </summary>
''' <param name="sSource">Texte source du masterspin à spinner (optionnel)</param>
''' <returns>Version spinnée aléatoirement du texte source</returns>
''' <remarks></remarks>
Public Function Spin(ByVal sSource As String = "") As String

	'Si le texte ne contient pas d'accolades, on le retourne sans autre traitement
    If Not sSource.Contains("{") Then
        Return sSource
        Exit Function
    End If

	'Recherche de tous les groupes de mots entre accolades ne contenant pas d'accolades
    Dim oReg As New Regex("{([^{}]*)}")

	'Pour chaque groupe correspondant à notre recherche...
    For Each oMatch As Match In oReg.Matches(sSource)
		'On découpe le contenu en tableau de chaînes (le séparateur est un pipe)
        Dim sMots() As String = oMatch.Groups(1).Value.Split("|"(0))
		'On remplace le groupe par l'un des mots pris au hasard
        Dim iPos As Integer = sSource.IndexOf(oM.Groups(0).Value)
        sSource = sSource.Substring(0, iPos) & sMots(_Rand.Next(0, sMots.Length)) & sSource.Substring(iPos + oM.Groups(0).Value.Length)
    Next

    Return Spin(sSource) 'Récursivité sur le reste non spinné

End Function

Il faut impérativement « sortir » le générateur de nombres aléatoires de la fonction récursive, au risque d’obtenir à chaque appel des spins identiques (j’ai été confronté à cet étrange problème !) ; en matière de performances, l’utilisation des expressions régulières procure un gain appréciable par rapport aux simples manipulations de chaînes de caractères.

On peut avec cette fonction, traiter de gros textes (+5000 mots) sans problème particuliers, et ainsi bâtir ses propres outils de content spinning.

VB.Net : copier un répertoire

Chose incroyable dans le .Net Framework 4.0 (et inférieurs), il n’existe aucune fonction native pour copier un répertoire en VB.Net ! On peut déplacer des répertoires, en créer (avec arborescence complète !) ou en supprimer et renommer, mais pas en copier avec leur contenu.

Voici un bout de code ± optimisé palliant à ce manque surprenant :

	Imports System.IO
	Imports System.Threading.Tasks

    ''' <summary>
    ''' Copie un répertoire (et tout son contenu) vers un nouvel emplacement
    ''' </summary>
    ''' <param name="sSourcePath">Chemin du répertoire source à copier</param>
    ''' <param name="sDestinationPath">Chemin du répertoire de destination</param>
    ''' <returns>VRAI si la copie se déroule bien, FAUX sinon</returns>
    ''' <remarks></remarks>
    Public Function CopyDir(ByVal sSourcePath As String, ByVal sDestinationPath As String) As Boolean

        'Appelle la version utilisant les objets DirectoryInfo
        Return CopyDir(New DirectoryInfo(sSourcePath), New DirectoryInfo(sDestinationPath))

    End Function

    ''' <summary>
    ''' Copie un répertoire (et tout son contenu) vers un nouvel emplacement
    ''' </summary>
    ''' <param name="oSource">Objet DirectoryInfo représentant le répertoire source à copier</param>
    ''' <param name="oDestination">Objet DirectoryInfo représentant le répertoire de destination</param>
    ''' <returns>VRAI si la copie se déroule bien, FAUX sinon</returns>
    ''' <remarks></remarks>
    Private Function CopyDir(ByVal oSource As DirectoryInfo, ByVal oDestination As DirectoryInfo) As Boolean

        Dim bResult As Boolean = True   'Retour de la copie (VRAI = succès)

        Try
            oDestination.Create()       'Création du répertoire de destination (le cas échéant)

            'Copie de tous ses fichiers (utilise le parallélisme pour de meilleures performances)
            Parallel.ForEach(oSource.GetFiles(), Sub(oFichier As FileInfo)
                                                     oFichier.CopyTo(Path.Combine(oDestination.FullName, oFichier.Name))
                                                 End Sub)

            'Copie (par récursivité) de tous ses sous-répertoires
            For Each oSousRepertoire As DirectoryInfo In oSource.GetDirectories()
                CopyDir(oSousRepertoire, oDestination.CreateSubdirectory(oSousRepertoire.Name))
            Next
        Catch ex As Exception
            'Si une erreur se produit, on indique l'erreur - à adapter selon vos besoins, notamment pour tracer les sources d'erreur !
            bResult = False
        End Try

        Return bResult

    End Function

En espérant que cela puisse servir à quelques uns d’entre vous.

 Haut de page