Re: Eingebung Übergabe dynamischer Liste
Verfasst: 19.11.2023 15:23
Danke. Wie gesagt war mir der Weg ja schon bekannt. Und da es leider ja nicht anders geht, habe ich es auch nach kurzer Pause so gemacht. Funktioniert alles. Alles supi
Jetzt noch Refactoring und dann weiter 
Code: Alles auswählen
EnableExplicit
; Replacer-Moldule for Replacing Placeholder in Plaintext, HTML, Markdown etc.
; ===================================
; Module Declaration for external Use
DeclareModule Replacer
; Sructure for nested Map
Structure NestedMap
Map Entity.s()
EndStructure
Declare.s ReplaceVariable(template.s, variable.s, content.s)
Declare.s ReplaceCondition(template.s, conditionblock.s, condition.b)
Declare.s ReplaceLoop(template.s, variable.s, List Entities.NestedMap())
EndDeclareModule
; ====================
; Moduleimplementation
Module Replacer
; ==================
; Internal variables
Define ExpressionVariable.s
Define ExpressionLoop.s
Define ExpressionCondition.s
Define ExpressionFlags.i
Define ExpressionEntity.s
ExpressionVariable = "{%VAR:<NAME>}"
ExpressionLoop = "{%LOOP:<NAME>}(.*?){%ENDLOOP:<NAME>}"
ExpressionCondition = "{%IF:<NAME>}(.*?){%ENDIF:<NAME>}"
ExpressionEntity = "{%ENT:(.*?)}"
ExpressionFlags = #PB_RegularExpression_DotAll | #PB_RegularExpression_MultiLine | #PB_RegularExpression_AnyNewLine | #PB_RegularExpression_NoCase
; ========================================
; Procedure to Replace any single variable
Procedure.s ReplaceVariable(template.s, variable.s, content.s)
Shared ExpressionVariable
ExpressionVariable = ReplaceString(ExpressionVariable,"<NAME>",variable)
ProcedureReturn ReplaceString(template,ExpressionVariable,content)
EndProcedure
; ==========================================================
; Procedure to show or delete textblock by a given condition
Procedure.s ReplaceCondition(template.s, conditionblock.s, condition.b)
Shared ExpressionCondition
Shared ExpressionFlags
Define Expression.i
ExpressionCondition = ReplaceString(ExpressionCondition, "<NAME>", conditionblock)
Expression = CreateRegularExpression(#PB_Any, ExpressionCondition, ExpressionFlags)
If ExamineRegularExpression(Expression, template)
While NextRegularExpressionMatch(Expression)
If condition
template = ReplaceString(template, RegularExpressionMatchString(Expression), RegularExpressionGroup(Expression,1))
Else
template = ReplaceString(template, RegularExpressionMatchString(Expression), "")
EndIf
Wend
EndIf
FreeRegularExpression(Expression)
ProcedureReturn template
EndProcedure
; =================================================================
; Procedure to repeating a textblock and replace entity placeholder
Procedure.s ReplaceLoop(template.s, variable.s, List Entities.NestedMap())
Shared ExpressionLoop
Shared ExpressionFlags
Shared ExpressionEntity
Define LoopExpression.i
Define EntityExpression.i
Define Cache.s
Define Stringpart.s
Define BuildedString.s
ExpressionLoop = ReplaceString(ExpressionLoop, "<NAME>", variable)
LoopExpression = CreateRegularExpression(#PB_Any, ExpressionLoop, ExpressionFlags)
EntityExpression = CreateRegularExpression(#PB_Any, ExpressionEntity, ExpressionFlags)
If ExamineRegularExpression(LoopExpression, template)
While NextRegularExpressionMatch(LoopExpression)
Stringpart = RegularExpressionMatchString(LoopExpression)
ForEach Entities()
Cache = RegularExpressionGroup(LoopExpression,1)
If ExamineRegularExpression(EntityExpression, Cache)
While NextRegularExpressionMatch(EntityExpression)
Cache = ReplaceString(Cache, RegularExpressionMatchString(EntityExpression), Entities()\Entity(RegularExpressionGroup(EntityExpression,1)))
Wend
EndIf
BuildedString = BuildedString + Cache
Next
template = ReplaceString(template, Stringpart, BuildedString)
Wend
EndIf
FreeRegularExpression(LoopExpression)
FreeRegularExpression(EntityExpression)
ProcedureReturn template
EndProcedure
EndModule
; ===========================================================================
; TEST-BLOCK !!!!!!
NewList Template.Replacer::NestedMap()
AddElement(Template())
Template()\Entity("vorname") = "Markus"
Template()\Entity("nachname") = "Muster"
Template()\Entity("strasse") = "Feldweg 1"
Template()\Entity("ort") = "12345 Musterstadt"
AddElement(Template())
Template()\Entity("vorname") = "Stefan"
Template()\Entity("nachname") = "Testmann"
Template()\Entity("strasse") = "Musterbach 21"
Template()\Entity("ort") = "54321 Musterfelden"
AddElement(Template())
Template()\Entity("vorname") = "Anja"
Template()\Entity("nachname") = "Dummy"
Template()\Entity("strasse") = "Großmarkt 5"
Template()\Entity("ort") = "54321 Musterfelden"
Define.s Test
Test = "{%LOOP:adressen}Vorname: {%ENT:vorname} | Nachname: {%ENT:nachname}"
Test = Test + #CRLF$ + "Straße: {%ENT:strasse} | PLZ/Ort: {%ENT:ort}" + #CRLF$
Test = Test + #CRLF$ + "{%ENDLOOP:adressen}"
OpenConsole()
Print(Replacer::ReplaceLoop(Test, "adressen", Template()))
Input()