Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0148: qvYATE - Eine kleine Template-Engine für ASP

 von 

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Internet und Netzwerke

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
Template Engine Classic ASP ASP.NET

Damit er übernommen werden kann, müssen noch Änderungen daran vorgenommen werden. Sofern Sie der Autor sind, können Sie sich anmelden, um die Liste einzusehen.

Der Vorschlag wurde erstellt am: 19.11.2007 13:57.
Die letzte Aktualisierung erfolgte am 24.02.2008 14:07.

Zurück zur Übersicht

Beschreibung  

qvYATE ist eine einfache kleine (175 Zeilen Code) Template-Engine für ASP.NET und ASP Classic. Die Syntax ist in einem kleinen Beispiel erläutert. Unterstützt werden: Schleifen, optionale Sektionen, Variablen mit Vererbung aus übergerordneten Sektionen, rekursiver Import von Subtemplates. Das Projekt erzeugt eine .NET-DLL und ein TLB, so dass die Engine auch mit ASP Classic nutzbar ist.

Schwierigkeitsgrad

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [13,62 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' ------------- Anfang Projektgruppe qvYATE.sln  -------------
' ------------ Anfang Projektdatei qvYATE.vbproj  ------------
' ----------------- Anfang Datei Section.vb  -----------------
Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions

<ComClass(Section.ClassId, Section.InterfaceId, Section.EventsId)> Public Class Section

#Region "COM GUIDs"

    ' These  GUIDs provide the COM identity for this class
    ' and its COM interfaces. If you change them, existing
    ' clients will no longer be able to access the class.
    Public Const ClassId As String = "fcaf6250-8f11-4ef7-9704-beec98178a9c"
    Public Const InterfaceId As String = "45d68b74-696c-4abf-8471-676e1bd84223"
    Public Const EventsId As String = "32e0b994-7e4b-4e18-ad23-146d75483ab0"

#End Region

    Private strTemplateCode As String
    Private strName As String

    Private objSections As New List(Of Section)
    Private objValues As New Dictionary(Of String, String)
    Private objParentSection As Section

    Private Const REGEX_OPTIONS As RegexOptions = RegexOptions.IgnoreCase Or _
        RegexOptions.Multiline Or RegexOptions.Singleline

    Public Sub New()

        MyBase.New()

    End Sub

    Protected Overrides Sub Finalize()

        MyBase.Finalize()

    End Sub

    Protected Property ParentSection() As Section
        Get
            Return objParentSection

        End Get

        Set(ByVal value As Section)
            objParentSection = value

        End Set

    End Property

    Protected Property Name() As String

        ' Name of the section
        Get
            Return strName

        End Get

        Set(ByVal value As String)
            strName = value

        End Set

    End Property

    Public Property TemplateCode() As String

        ' Input code from parent section or document
        Get
            Return strTemplateCode

        End Get

        Set(ByVal value As String)
            strTemplateCode = value

        End Set

    End Property

    Public ReadOnly Property HTML() As String

        ' HTML output
        Get

            Dim strResult As String = strTemplateCode
            Dim objSectionsHTML As New Dictionary(Of String, StringBuilder)
            Dim objSection As Section
            Dim strKey As String

            ' collect code from child sections
            For Each objSection In objSections

                If (objSectionsHTML.ContainsKey(objSection.Name)) Then
                    objSectionsHTML.Item(objSection.Name).Append(objSection.HTML)

                Else

                    objSectionsHTML.Add(objSection.Name, New StringBuilder(objSection.HTML))
                End If

            Next

            ' replace sections by their collected code
            For Each strKey In objSectionsHTML.Keys

                strResult = Regex.Replace(strResult, "<!--\s*BEGIN\s+SECTION\s+" & strKey & _
                    "\s*-->(?<TemplateCode>.+)<!--\s*END\s+SECTION\s+" & strKey & _
                    "\s*-->", objSectionsHTML.Item(strKey).ToString, REGEX_OPTIONS)

            Next

            ' remove the remaining sections from template code...yes, greedy
            strResult = Regex.Replace(strResult, _
                "<!--\s*BEGIN\s+SECTION\s+(\w+)\s*-->.*<!--\s*END\s+SECTION\s+(\1)\s*-->", _
                "", REGEX_OPTIONS)

            ' replace placeholders from template code by their values
            For Each strKey In objValues.Keys

                strResult = Regex.Replace(strResult, "\[%\s*" & strKey & "\s*%\]", _
                    objValues.Item(strKey), REGEX_OPTIONS)

            Next

            ' remove the remaining placeholders from template code...also greedy...
            ' (only in the topmost section so we have some sort of inheritance of values to
            ' child sections)
            If (objParentSection Is Nothing) Then
                strResult = Regex.Replace(strResult, "\[%.*?%\]", "", REGEX_OPTIONS)
            End If

            Return strResult

        End Get

    End Property

    Public Sub AddValue(ByVal Key As String, ByVal Value As String)

        ' Add values to be replaced in the template code
        If objValues.ContainsKey(Key) Then
            objValues.Item(Key) = Value

        Else

            objValues.Add(Key, Value)
        End If

    End Sub

    Public Function AddSection(ByVal Name As String) As Section

        Dim objMatch As Match

        objMatch = Regex.Match(strTemplateCode, "<!--\s*BEGIN\s+SECTION\s+" & Name & _
            "\s*-->(?<TemplateCode>.+)<!--\s*END\s+SECTION\s+" & Name & "\s*-->", _
            REGEX_OPTIONS)

        If (objMatch.Success = True) Then

            Dim objSection As New Section

            objSection.ParentSection = Me
            objSection.Name = Name
            objSection.TemplateCode = objMatch.Groups("TemplateCode").ToString
            objSections.Add(objSection)
            Return objSection

        Else

            Return Nothing
        End If

    End Function

    Public Function LoadTemplateCode(ByVal FilePath As String) As Boolean

        If (File.Exists(FilePath)) Then

            Try

                Dim objStreamReader As New StreamReader(FilePath)

                ' Read template code from file
                strTemplateCode = objStreamReader.ReadToEnd
                objStreamReader.Close()

                ' check for import statements
                Dim Matches As MatchCollection = Regex.Matches(strTemplateCode, _
                    "<!--\s*IMPORT\s+FROM\s+(?<ImportFile>.+?)\s*-->", REGEX_OPTIONS)

                If (Matches.Count > 0) Then

                    Dim Match As Match

                    For Each Match In Matches

                        ' Use a (temporary) section so we have a recursive import of child templates
                        Dim objSection As New Section

                        Dim strImportFilePath As String = System.IO.Path.GetDirectoryName( _
                            FilePath) & "\" & Match.Groups("ImportFile").ToString

                        objSection.LoadTemplateCode(strImportFilePath)

                        ' Replace the import tag by the template code (or empty string if
                        ' file not found)
                        strTemplateCode = strTemplateCode.Replace(Match.ToString, _
                            objSection.TemplateCode)

                        objSection = Nothing
                    Next

                End If

                Return True

            Catch ex As Exception

            End Try
        End If

    End Function

End Class

' ------------------ Ende Datei Section.vb  ------------------
' ------------- Ende Projektdatei qvYATE.vbproj  -------------
' File not found: ../WindowsApplication1/WindowsApplication1.vbproj
' -------------- Ende Projektgruppe qvYATE.sln  --------------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.
Folgende Diskussionen existieren bereits

Template Engine - Spatzenkanonier 07.03.2008 10:14

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.