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 for 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 For 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
        For 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
                For 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:

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:

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".

Keywords:Backstage Frontpage VBA Script Skript