MSXFAQ-Script:TGMenu

Hallo Frontpage Anwender, ich pflege diese Webseite mit über 700 statischen Seiten auf meinem Notebook mit FrontPage 2003 und bieten den Besuchern für eine einfache Navigation das Tigramenu links oben an. Die Struktur der Webseite pflege ich dabei in der Frontpage Navigation. Hier eine Momentaufnahme:

Sie können sicher verstehen, dass ich die Definition für TGMenu nicht von Hand erstellen will, sondern mir mit etwas VBA eine Routine geschrieben habe, die anhand der Frontpage Navigation eine Definition für Tigramenu erstellt. Der Code hierfür stelle ich hier kostenfrei bereit. Erwarten Sie aber bitte keinen umfangreichen Support.

Get the Code

Hier ist der benötigte Code:

' Frontpage VBA Macro to create a menu definition file für TigraMenu v2.0
' see http://www.softcomplex.com/products/tigra_menu/
' (c) 2005 Frank Carius  http://www.msxfaq.de

Option Explicit

Const OUTPUT_FILE As String = "menu_items.js"       ' name of the item definition file in the current web

Const menuiconhtm = "<img border=""0"" src=""/images/icon-menuhtm.gif"" align=""middle"">"
Const menuiconfld = "<img border=""0"" src=""/images/icon-menufld.gif"" align=""middle"">"

Sub TGMenu()
    'Main procedure to build the tigra menu based on the fronpage navigation structure

    Call Logging(1, "BuildTGMenu: gestartet")
    If ActiveWeb Is Nothing Then
            Call Logging(4, "BuildTGMenu: FEHLER: Kein Web geöffnet")
            MsgBox "Please open a web first to build the menu file !", vbOKOnly Or vbCritical
            Exit Sub
    End If
    Open ActiveWeb.RootFolder.Name + "\" + OUTPUT_FILE für Output As #1
    Print #1, "var MENU_ITEMS = ["
    Print #1, BuildTGSubMenu(ActiveWeb.RootNavigationNode, 0)
    Print #1, "];"
    Close #1
    Call Logging(1, "BuildTGMenu: beendet")
End Sub

Function BuildTGSubMenu(ByRef node As NavigationNode, level As Integer) As String

    Dim childNode As NavigationNode
    If node Is ActiveWeb.RootNavigationNode Then  ' handle special case rootnode
        für Each childNode In node.Children
            BuildTGSubMenu = BuildTGSubMenu & BuildTGSubMenu(childNode, level + 1)          ' process child navigation nodes
        Next
    Else
        If node.InNavBars Then                          ' ignore excluded pages
            Call Logging(2, "BuildTGMenu: Verarbeite:" + MakeRel(ActiveWeb, node.URL))
            If node.Children.count = 0 Then
                BuildTGSubMenu = Space(level * 4) + "['" + menuiconhtm + HTMLUmlaut(node.Label) + "','/" & MakeRel(ActiveWeb, node.URL) + "',null"
                BuildTGSubMenu = BuildTGSubMenu + "]," + vbCrLf                              ' close submenu
            Else
                BuildTGSubMenu = Space(level * 4) + "['" + menuiconfld + HTMLUmlaut(node.Label) + "','/" & MakeRel(ActiveWeb, node.URL) + "',null"
                BuildTGSubMenu = BuildTGSubMenu + "," + vbCrLf                               ' close line partially
                für Each childNode In node.Children
                    BuildTGSubMenu = BuildTGSubMenu & BuildTGSubMenu(childNode, level + 1)          ' process child navigation nodes
                Next
                BuildTGSubMenu = BuildTGSubMenu & Space(level * 4) + "]," + vbCrLf              ' close parent menu if not top level menu
            End If
        End If
    End If
End Function


Function HTMLUmlaut(ByVal s As String) As String
    'Encode german umlauts, not all special characters are handled currently
   
    s = Replace(s, "&", "&amp;")
    s = Replace(s, "<", "&lt;")
    s = Replace(s, ">", "&gt;")
    s = Replace(s, """", "&quot;")
    s = Replace(s, "ä", "&auml;")
    s = Replace(s, "ö", "&ouml;")
    s = Replace(s, "ü", "&uuml;")
    s = Replace(s, "ä", "&Auml;")
    s = Replace(s, "ö", "&Ouml;")
    s = Replace(s, "Ü", "&Uuml;")
    s = Replace(s, "ß", "&szlig;")
    s = Replace(s, " ", "&nbsp;")
    HTMLUmlaut = s
End Function

Sie können den Code einfach über die Zwischenablage übernehmen oder alternativ die BAS-Datei in einem ZIP-Archiv hier herunter laden.

tgmenu.bas.zip (1k)

Makro einbinden und starten

Um nun ihre persönliche "menu_items.js zu erhalten, gehen Sie wie folgt vor:

  • Sicherheitskopie
    Legen Sie zuerst eine Kopie ihrer bisherigen menu_items.js an. Software kann fehlerhaft sein.
  • Starten Sie Frontpage und öffnen Sie ihr Web
  • Prüfen Sie die Navigation
    Kontrollieren Sie, ob sie in Frontpage die Navigation nach ihren Wünschen definiert haben. Diese Navigation ist die Grundlage des Menüs.
  • Binden Sie den Code ein.
    Dazu starten Sie den Editor über das Menü "Extras - Makros - Visual Basic Editor". Alternativ können Sie auch ALT-F11 drücken. Importieren Sie dann den Code über die Zwischenablage oder importieren Sie die BAS-Datei.
  • CONST anpassen
    Kontrollieren sie die "CONST"-Definitionen am Anfang des Code. Sie bestimmen den Pfad der Ausgabedatei und die Icons vor den einzelnen Menüs. Wenn Sie keine Bilder benötigen, sollten Sie die Strings auf "" setzen.
  • Logging anpassen
    Ich verwende weiterhin eine Funktion aus Global, um die Aktivität zu protokollieren. Wenn Sie diese nicht einbinden wollten, dann sollten Sie die entsprechenden Zeilen auskommentieren oder durch ein debug.print ersetzen.
  • Makro ausführen
    Nun ist es nur noch ein kleiner Schritt, das Makro mit dem Namen "BuildTGMenu" über den Editor oder über Frontpage selbst auszuführen. Nach dem Durchlauf sollten Sie in ihrem Web eine Datei "menu_items.js" finden. Eventuell müssen Sie die Ansicht in Frontpage mit "Ansicht - Aktualisieren" oder die Funktionstaste F5 aktualisieren.
  • Testen
    Wenn Sie die erforderlichen Codezeilen in ihren HTML-Seiten eingebunden haben und JavaScript im Browser aktiviert ist, dann sollten Sie nun das aktuelle Menü sehen.

Wenn ihre Einbindung von Tigramenu selbst fehlerfrei ist, sollten Sie nun auch ein Menü im Browser haben.

Frühere Version

ACHTUNG: Die nun folgende Information dient eher der Belustigung und Verdeutlichung, wie viel schlechter VBScript ist, wenn es passende VBA-Objekte gibt.

Ich möchte nicht verbergen, dass ich auch einmal in eine Sackgasse gelaufen bin. Ich hatte in der Frontpage Newsgroups nach einem Weg gefragt, wie ich schnell die Seiten finden kann, die ich in der Navigation vergessen haben, worauf Christoph Schneegans lapidar geantwortet hat "Das ist ein Dreizeiler". Auf meine Rückfrage hatte ich dann eben diesen Dreizeiler und das hat mich aufgerüttelt.

Ich habe vorher nämlich versucht, per VBScript selbst die Frontpage Navigationsdatei (Siehe FrontPage Struktur) auszulesen und basierend darauf dann meine Javascript Definition zu erstellen. Heraus gekommen ist ein Skript mit über 180 Zeilen und keineswegs schnell oder leicht überschaubar. Ehe sie nun das Skript herunterladen, auspacken und gleich aufrufen, sollten Sie wissen:

  • NUTZEN SIE DIESES SKRIPT NICHT PRODUKTIV
  • Basisverzeichnis anpassen
    Sie müssen im Skript das Basisverzeichnis ihrer Webseite anpassen !. Ich denke nicht, dass sich ihre Webseite unter C:\inetpub\wwwroot\www.msxfaq.de befindet.
  • Tigra Menu einbinden
    Auch wenn Sie mit dem Skript die Definition erstellt haben, müssen Sie den noch das Tigramenü herunterladen und in ihre Webseiten einbinden
  • Webseite muss auf der Wurzel starten
    Da die Definition später für jede Seite gleich ist, muss die Adressierung mit absoluten Pfaden erfolgen, d.h. \verzeichnis\datei.htm und nicht mit ..\verzeichnis\datei.  Dies bedeutet, dass ihr Web auch wirklich die "Wurzel" sein muss, d.h. ein Startpunkt bei http://www.firma.tld\unterweb ist nicht möglich, es sei denn Sie passen das Skript an, dass vor jede URL eben noch "/unterweb" eingefügt wird.
  • CSCRIPT
    Rufen Sie das Programm mit CSCRIPT auf, da der Fortschritt mit wscript.echo ausgegeben wird und die damit massenhaft Bestätigungsfenster wegklicken müssen.

Das Skript wird von mir kostenfrei aber auch ohne Support angeboten. Der Quelltext ist offen und kann von jedermann auf eigene Bedürfnisse angepasst und verbreitet werden, so lange die Quelle (Mein Name und URL auf diese Seite) erkennbar bleibt.

fp2tg.zip

Sie "müssen" im Skript die Variable für das Basisverzeichnis anpassen !. Die Ausgabe der durchgeführten Befehle erfolgt auf dem Bildschirm. Das Ergebnis landet in der Datei "menu_items.js".