Tipp-Upload: VB.NET 0148: qvYATE - Eine kleine Template-Engine für ASP
von Marcus May
Ü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.
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 |
Verwendete API-Aufrufe: |
Download: |
' 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
Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.