Eingebung Übergabe dynamischer Liste

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TroaX
Beiträge: 651
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 64 GB RAM, 3060TI, 2.5 TB SSD, 3 FHD Displays, Win 10 Pro | Lappi: Ryzen 7 5800H, 16 GB RAM, 512 GB SSD, Win 11 Home
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:
Programmierung: B4J (Nur B4J = Keine andere Variante) | Webtechs (Nur zum erweitern meiner BANano-Apps)
Ich habe jetzt PureBasic erstmal von meiner Liste gestrichen. Ich habe aus diversen Gründen B4J nochmal eine Chance gegeben und mich noch einmal richtig reingefressen. Da ist zwar auch nicht alles perfekt. Aber dafür kann ich persönlich trotzdem deutlich mehr damit anfangen, als mit PureBasic.
Antworten