Microsoft FrontPage (versione 2000 o 2002) supporta Visual Basic for Applications (VBA) che utilizzeremo per integrare la validazione nei menu di sistema così che la semplice attivazione di una voce di menu possa avviare la validazione del nostro documento web.

Ho creato un file in Visual Basic (Validate.bas) che in pratica effettua la chiamata al validatore in VBA. Puoi consultare la guida in section 3.2 che descrive come incorporarlo in FrontPage.

Non commenterò il codice dettagliatamente, se non per accennare il principio fondamentale di funzionamento, per il quale nsgml.exe è richiamato dopo aver salvato in un file temporaneo il documento attivo in FrontPage, e presenta l’output di nsgml in una finestra di dialogo.

'
' Validate.bas - Integrare James Clark's SP in Microsoft FrontPage 2000/2002
'
'

Option Explicit

' Specifica il percorso in cui hai installato NSGML
Const NSGML_PATH = "C:Program FilesValidator"       ' Non dimenticare il backslash

' Specifica il percorso dell'eseguibile SP NSGML...
Const NSGML_PROGRAM_FILE = NSGML_PATH & "nsgmls.exe"

' Specifica il percorso di un file temporaneo...
Const TEMP_INPUT_FILE = NSGML_PATH & "input.tmp"
Const TEMP_OUTPUT_FILE = NSGML_PATH & "output.tmp"

' Specifica i file di input di SP (nsgml.exe)
Const XHTML1_SOC_FILE = NSGML_PATH & "PubtextXHTML.soc"
Const HTML4_SOC_FILE = NSGML_PATH & "PubtextHTML4.soc"'
'

'************************************
' VALIDA_FILE
'
'
' Basato sul codice di by Christoph Schneegans <mailto:Christoph@Schneegans.de>
' See <http://www.suodenjoki.dk/produktioner/artikler/validation/validation.zip>
' Tradotto in italiano da webaccessibile.spadamar.com

Sub Validate_File()

  Dim bFlipToHTMLSource As Boolean
  bFlipToHTMLSource = False

  If ActivePageWindow Is Nothing Then
    MsgBox "Apri un file nell'editor di FrontPage.", _
    vbOKOnly Or vbCritical
    Exit Sub
  End If

  If Not ActivePageWindow.ViewMode = fpPageViewNormal Then
    bFlipToHTMLSource = True
    ActivePageWindow.ViewMode = fpPageViewNormal
  End If

  Dim doc As FPHTMLDocument
  Set doc = ActivePageWindow.Document

  Dim fs
  Set fs = CreateObject("Scripting.FileSystemObject")

  Dim ts
  Set ts = fs.CreateTextFile(TEMP_INPUT_FILE)

 ' Scrive il documento corrente di FrpntPage in un file temporaneo
  ts.Write doc.DocumentHTML
  ts.Close

  Dim sSocFile ' As String
  Dim sLine ' As String
  Dim nLine ' As Integer

 ' Si assume che si intende validare un file XHTML 1.0
  sSocFile = XHTML1_SOC_FILE

 ' Il codice che segue prova (in prima battuta) a stabilire
  ' quale DTD sia stato specificato nel file di input, così
  '  da poter scegliere quale file SOC accoppiare a nsgml.exe
  Set ts = fs.OpenTextFile(TEMP_INPUT_FILE)
  nLine = 1
  While nLine < 4 And Not ts.AtEndOfStream ' Cerchiamo solo nelle prime 4 linee
    sLine = ts.ReadLine()
    If InStr(sLine, "DTD HTML 4") > 0 Then
      sSocFile = HTML4_SOC_FILE
    End If
    nLine = nLine + 1
  Wend
  ts.Close

  Dim strCmd As String

  ' Costruisce la riga di comando
  strCmd = NSGML_PROGRAM_FILE & " -s" & _
           " -c """ & sSocFile & """" & _
           " -f """ & TEMP_OUTPUT_FILE & """" & _
           " """ & TEMP_INPUT_FILE & """"

  'MsgBox strCmd

 ' Esegue la riga di comando...
  ' Per maggiori informazioni, consulta <http://support.microsoft.com/support/kb/articles/Q129/7/96.asp>
  ExecCmd strCmd

  If bFlipToHTMLSource Then
    ActivePageWindow.ViewMode = fpPageViewHtml
  End If

  Dim es
 'Legge il TEMP_OUTPUT_FILE e ne copia il contenuto nel Form_output
  Set es = fs.OpenTextFile(TEMP_OUTPUT_FILE, 1) ' 1=ForReading
  If es.AtEndOfStream Then
    Dim sOutput
    sOutput = "/documento validato con successo"
    If sSocFile = XHTML1_SOC_FILE Then
      sOutput = sOutput & " come XHTML 1.0"
    Else
      sOutput = sOutput & " come HTML 4.0"
    End If
    sOutput = sOutput & ". Nessun errore riscontrato."
    Form_tidy_output.TextBox_tidy_output.Text = sOutput
  Else
    Form_tidy_output.TextBox_tidy_output.Text = es.ReadAll
  End If
  Form_tidy_output.Caption = "Risultato della validazione"
  Form_tidy_output.Show

  Exit Sub

  ValidationError:
    MsgBox "La validazione non è stata eseguita correttamente. " & _
           "Non è stata apportata nessuna modifica." & Chr(10) & _
           "Error # " & CStr(Err.Number) & " " & Err.Description, _
           vbOKOnly Or vbCritical
End Sub

3.1 Personalizzare il codice VBA

Il codice VBA non può essere usato direttamente, ma necessita di un minimo di personalizzazione, rispetto a dove hai installato SP. Ci sono cinque stringhe da definire come costanti. Se hai installato tutto in una singola cartella, e se questa contiene al suo interno la cartella ‘pubtext’, dovrebbe essere sufficiente la modifica della sola costante NSGML_PATH.

' Specifica il percorso in cui hai installato NSGML
Const NSGML_PATH = "C:Program FilesValidator"       ' Non dimenticare il backslash

' Specifica il percorso dell'eseguibile SP NSGML...
Const NSGML_PROGRAM_FILE = NSGML_PATH & "nsgmls.exe"

' Specifica il percorso di un file temporaneo...
Const TEMP_INPUT_FILE = NSGML_PATH & "input.tmp"
Const TEMP_OUTPUT_FILE = NSGML_PATH & "output.tmp"

' Specifica i file di input di SP (nsgml.exe)
Const XHTML1_SOC_FILE = NSGML_PATH & "PubtextXHTML.soc"
Const HTML4_SOC_FILE = NSGML_PATH & "PubtextHTML4.soc"'

Volendo, puoi aggiungere un ulteriore livello di controllo sugli errori dopo un’esecuzione di ExecCmd. ExecCmd() restituisce il livello di errore riscontrato nel file eseguito. Nel caso di Tidy, “0” significa “OK”, “1” significa “Ci sono degli avvertimenti”, “2” significa “Ci sono errori”. In caso di errori, Tidy non può proseguire. Si potrebbe semplicemente aggiungere qualcosa del tipo:

If ExecCmd(strCmd) > 1 Then
  ...
  Exit Sub
End If

3.2 Personalizzare il menu di FrontPage

Questa sezione mostra come personalizzare il menu di FrontPage inserendo un nuovo menu che preveda la chiamata della funzione VBA. 

Segui i passi:

  1. Apri FrontPage.
  2. Attiva la voce di menu ‘Strumenti|Macro|Visual Basic Editor‘. Si dovrebbe attivare così l’editor VBA di FrontPage.
  3. Fai clic col tasto destro sulla cartella Moduli e seleziona ‘Importa File…‘ ed importa il file ExecuteCmd.bas. Attiva nuovamente l’importazione di file ed importaValidate.bas. Guarda la figura di sotto. Dovresti avere almeno due moduli nella cartella Moduli, uno chiamato ExecuteCmd, l’altro Validate. Se ci dovesse essere un altro modulo vuoto (Modulo1), lo puoi tranquillamente cancellare.

    Figure illustrating the import file feature of VBA.
    » La figura illustra la funzionalità di importazione di VBA.

  4. Importa il file Form_output.frm, che definisce la finestra in cui verrà evidenziato l’output, una volta invocato il programma esterno.
  5. Entra nel modulo Validate e definisci le 5 costanti, come abbiamo appena visto nel paragrafo 3.1 
  6. Chiudi l’editor VBA col comando ‘File|Chiudi‘ o con la combinazione di tasti Alt + Q. Ora sei nuovamente in FrontPage
  7. Seleziona ‘Strumenti|Personalizza‘ per aprire la finestra corrispondente
  8. Seleziona la cartella Comandi, come nella figura di sotto
    The Tools|Customize dialog.
    » Finestra di dialogo Strumenti|Personalizza.
  9. Seleziona la voce Nuovo menu nella casella delle categorie. La casella sulla destra dovrebbe contenere almeno un comando chiamato “Nuovo menu”
  10. Trascina il comando “Nuovo menu” sul menu principale di FrontPage, nella posizione che preferisci, per esempio dopo la voce di menu Format. Questa nuova posizione verrà evidenziata da una barra verticale.
  11. Fai clic col tasto destro sul menu appena inserito; si apre un particolare menu contestuale. 
  12. Il menu di contesto contiene una voce chiamata Nuovo nome che ti permette di specificare un nome per il nuovo menu. Io, per esempio l’ho chiamato “E&xtras”, dove il carattere & precede la lettera che servirà da scorciatoia – e che quindi verrà sottolineata.
  13. Nella finestra di personalizzaizone, scegli l’elemento Macro dalla casella delle categorie. Dovresti ora avere disponibili due nuovi comandi sulla destra; seleziona “Elemento di menu” e trascinalo sul tuo nuovo menu Extras.
  14. Usa di nuovo il tasto destro sul nuovo elemento appena inserito per attivare il menu di contesto, col quale specificherai il nome da dargli, per esempio “&Valida un Documento” .
  15. Sempre a partire dal menu di contesto (che si attiva col tasto destro sull’elemento da modificare) usa il comando “Assegna macro” e seleziona la macro Validate (quella che deriva dal modulo VBA di prima).
  16. Chiudi la finestra di personalizzazione
  17. Tutto dovrebbe essere pronto. Prova a vedere come funziona!