Extending Build-markup with repeat refinement

后端 未结 2 433
夕颜
夕颜 2021-01-17 02:23

I tried to add a repeat refinement to build-markup function using the previous answer: How to bind to foreach context?

build-markup: func [
    {Return marku         


        
2条回答
  •  感情败类
    2021-01-17 03:09

    seems to work:

    build-markup: func [
        {Return markup text replacing <%tags%> with their evaluated results.} 
        content [string! file! url!] 
        /repeat block-fields block-values
        /quiet "Do not show errors in the output." 
        /local out eval value
    ][
    
      out: make string! 126 
    
      either not repeat [
          content: either string? content [copy content] [read content] 
    
          eval: func [val /local tmp] [
              either error? set/any 'tmp try [do val] [
                  if not quiet [
                      tmp: disarm :tmp 
                      append out reform ["***ERROR" tmp/id "in:" val]
                  ]
              ] [
                  if not unset? get/any 'tmp [append out :tmp]
              ]
          ] 
          parse/all content [
              any [
                  end break 
                  | "<%" [copy value to "%>" 2 skip | copy value to end] (eval value) 
                  | copy value [to "<%" | to end] (append out value)
              ]
          ]
        ][        
    
            actions: compose/only [
                set in system/words (to-lit-word pick (block-fields) 1) get pick (block-fields) 1
                set in system/words (to-lit-word pick (block-fields) 2) get pick (block-fields) 2
                probe get in system/words (to-lit-word pick (block-fields) 1)
                probe get in system/words (to-lit-word pick (block-fields) 2)
                append out build-markup content
    
            ]
            foreach :block-fields block-values actions        
        ] 
        out
    ]
    
    template1: {    <%a%><%b%>
    }
    template2: {  
    <%build-markup/repeat template1 [a b] [1 2 3 4]%>
      
    }
    template3: {
    <%build-markup/repeat template2 [a b] [1 2 3 4 5 6]%>
    
    } build-markup template3

    output:

    == {
    12 34
    12 34

    >

    提交回复
    热议问题