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:
- Apri FrontPage.
- Attiva la voce di menu ‘Strumenti|Macro|Visual Basic Editor‘. Si dovrebbe attivare così l’editor VBA di FrontPage.
- 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.
- Importa il file Form_output.frm, che definisce la finestra in cui verrà evidenziato l’output, una volta invocato il programma esterno.
- Entra nel modulo Validate e definisci le 5 costanti, come abbiamo appena visto nel paragrafo 3.1
- Chiudi l’editor VBA col comando ‘File|Chiudi‘ o con la combinazione di tasti Alt + Q. Ora sei nuovamente in FrontPage
- Seleziona ‘Strumenti|Personalizza‘ per aprire la finestra corrispondente
- Seleziona la cartella Comandi, come nella figura di sotto
- Seleziona la voce Nuovo menu nella casella delle categorie. La casella sulla destra dovrebbe contenere almeno un comando chiamato “Nuovo menu”
- 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.
- Fai clic col tasto destro sul menu appena inserito; si apre un particolare menu contestuale.
- 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.
- 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.
- 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” .
- 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).
- Chiudi la finestra di personalizzazione
- Tutto dovrebbe essere pronto. Prova a vedere come funziona!