Macro in Visual Studio per formattare e pulire sorgenti importati da fonti esterne

Preambolo

Come già detto forse in alcuni post,mi sto leggendo "Teach yourself ANSI C++ in 21 days", ISBN 0-672-30887-6 , J.Liberty, J.Hord - SAMS Publishing (1996).
In questo libro ben fatto sono presenti numerosi programmi (trovate la lista di quelli che ho fatto io qui),ma dal momento che il libro è in formato PDF,mi tocca andare di CTRL+C per copiare il codice dal PDF e importarlo in Visual Studio.
Qui sorge lo sbattimento di ripulire il codice sorgente da alcune cosette presenti nella versione PDF. A seguire una macro che farà proprio questo,dovrete poi modificare solo l'espressione regolare a seconda di quello che dovete fare.

Presentazione del problema

Un programma nel PDF menzionato sopra,si presenta così:

code
Fig 1

Quando viene importato in Visual Studio si presenta così:

code2

Fig 2

L'immagine Fig 2 non è il corrispettivo di Fig 1 ma rende l'idea dello schifo generato: un codice non formattato,con la presenza di numeri di linea da scartare e con la possibile presenza di caratteri spurii come ” e via dicendo.

Creazione della macro

Siccome non conosco il Visual Basic e le svariate API che regolano l'uso delle macro in Visual Studio,ho usato lo strumento di registrazione delle macro (Tools -> Macros -> Record Temporary Macro oppure Ctrl+Shift+R).

I comandi che seguono verranno registrati dalla macro:

  • Edit -> Find and Replace -> Replace in Files. Cliccare sul + di Options e flaggare "Use" scgliendo dal menu a tendina "Regular Expression". In "Look In" scegliere "Current Document";
  • In "Find what" inserire l'espressione regolare che ci serve. Per me: prima tratto i numeri di linea inserendo in "Find What" ^:z\: e in "Replace with" nulla. Se ci sono altre sostituzioni da fare ripetere il passaggio.
  • Chiudere la finestra di "Find and Replace";
  • Riportiamo il focus sul codice sorgente e premere CTRL+A e poi CTRL+F / CTRL+K in sequenza uno dopo l'altro. Questi comandi rispettivamente selezionano tutto il codice e lo indentano per bene (ci sono ovviamente le rispettive voci di menu). Salviamo il file.
  • Stoppare la macro;

In questo modo abbiamo il codicep rincipale per una macro funzionante su UN SOLO E BEN PRECISO FILE: quello su cui stavamo lavorando. Ma se volessimo che la macro funzionasse per tutti i file su cui stiamo lavorando?

Purtroppo Visual Studio registra che abbiamo reso attiva la finestra con il codice del nostro programma e traduce pedissequamente. Dobbiamo editare la nostra macro. Io non conoscendo bene le API ho fatto si che venisse richiesto il nom del file da editare e in questo modo la macro funziona. Ecco la macro finale:

Sub PulisciCodice()
Dim nomefile As String
nomefile = InputBox("Come si chiama il file da pulire?", "MACRO PULIZIA FILE")
If nomefile = "" Then
MsgBox("Non hai immesso alcun valore,la macro esce.")
Exit Sub
End If
DTE.ExecuteCommand("Edit.ReplaceinFiles")
DTE.Windows.Item("{CF2DDC32-8CAD-11D2-9302-005345000000}").Activate() 'Find and Replace
DTE.Windows.Item(Constants.vsWindowKindMacroExplorer).Activate()
DTE.Find.FindWhat = "^:z\:"
DTE.Find.ReplaceWith = ""
DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
DTE.Find.MatchCase = False
DTE.Find.MatchWholeWord = False
DTE.Find.MatchInHiddenText = True
DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr
DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResults1
DTE.Find.Action = vsFindAction.vsFindActionReplaceAll
If (DTE.Find.Execute() = vsFindResult.vsFindResultNotFound) Then
Throw New System.Exception("vsFindResultNotFound")
End If
DTE.Windows.Item("{CF2DDC32-8CAD-11D2-9302-005345000000}").Close()
DTE.Windows.Item(nomefile).Activate()
DTE.ActiveDocument.Selection.SelectAll()
DTE.ExecuteCommand("Edit.FormatSelection")
DTE.ActiveDocument.Save()
End Sub
Salvate pure questa macro. L'unica cosa che non son riuscito a fare è l'uso dell'espressione regolare per il carattere “ poichè Visual Studio lo interpreta come un uguale. Chiederò su GoogleGoups. Si ringrazia Guido per il breve consulto su Visual Basic.

0 comments:

Byte Strike Blog - Designed by Posicionamiento Web | Bloggerized by GosuBlogger