[NEED HELP] Dynamic widget and extension renderer

My goal is to create pages (“person” template):

---
description: "Create a person"
tags: 
- template
- custom
hooks.newPage:
  suggestedName: ""
  confirmName: true
  openIfExists: true
  command: "new person"
frontmatter: |
  tags: 
  - person
  person:
    first_name:
    last_name:
    job:
      position:
      company:
      department:
      skills:
      - 
      customers:
      -
    personal:
      hobbies:
      - 
      children: 
      - 
---

and to process them to generate plantuml organization chart

local function join(tbl, sep)
    return table.concat(tbl, sep or ", ")
end
local function cleanAndLower(str)
  if str ~= nil then
    local cleaned = str:gsub("[^%w]", "")
    cleaned = str:gsub(" ", "")
    return cleaned:lower()
  end
  return ""
end

local function generatePerson(uml,person)
    local uml = {}
    table.insert(uml, "Enterprise_Boundary( "..cleanAndLower(person.job.company).." , \""..person.job.company.."\") {")
    for i,department in ipairs(person.job.department) do
      table.insert(uml, string.rep(" ", i*4) .."Boundary( "..cleanAndLower(department).." , \""..department.."\") {")
      if i== #person.job.department then
        table.insert(uml,  string.rep(" ", i*8).."Person( ".. cleanAndLower(person.first_name.. person.last_name).." , \"".. person.first_name.." " ..person.last_name.."\" , \""..join(person.job.position, " ").."\" )")
      end
    end
    for i,department in ipairs(person.job.department) do
      table.insert(uml, string.rep(" ",(#person.job.department-i+1)*4) .."}")
    end
    table.insert(uml, "}")
    return table.concat(uml, "\n")
end

function children(path)
    local crumbsChildren = {}
    local mypage = path or editor.getCurrentPage()
    for page in each(table.sort(space.listPages(), compareDate)) do
        --print(mypage,page.name,string.find(page.name,mypage) )
        if (string.find(page.name,mypage) and mypage ~= page.name and #crumbsChildren <7)
        then
              table.insert(crumbsChildren, {name = page.ref})
        end
    end
    return crumbsChildren
end

function getFrontMatter(page)
    return index.extractFrontmatter(space.readPage(page)).frontmatter
end 

function organizationChart(path)
  local uml = {}
  table.insert(uml, "```plantuml")
  table.insert(uml, "@startuml")
  table.insert(uml, "!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml") 
  table.insert(uml, "LAYOUT_TOP_DOWN()") 
    table.insert(uml, "") 
  local liste= children(path)
  for i,pag in ipairs(liste) do
        local frontM= getFrontMatter(pag.name)
        if frontM ~= nil and frontM.person ~= nil then
          local person = frontM.person
          table.insert(uml, generatePerson(uml, person))
        end
  end
  table.insert(uml, "")
  table.insert(uml, "@enduml")
  table.insert(uml, "```")
  local result= table.concat(uml, "\n")  
  print(result)
  return widget.new {
    markdown = result
  }
end

Currently, plantuml code has well, and it generates plantuml diagram but it’s not interpreted by plantuml plugin.
I see code

....

It should be an image .

Any idea?