Eingebung Übergabe dynamischer Liste

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Eingebung Übergabe dynamischer Liste

Beitrag von TroaX »

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

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()
Jetzt noch Refactoring und dann weiter :wink:
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Antworten