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()
