Kshitij-verbaflo commited on
Commit
f046f61
Β·
verified Β·
1 Parent(s): 1f1f0c9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +96 -30
app.py CHANGED
@@ -1,65 +1,131 @@
1
  import gradio as gr
2
  from jinja2 import Template
 
3
 
4
- def render_mermaid(jinja_text, user_city, property):
 
5
  try:
6
  template = Template(jinja_text)
7
- rendered_code = template.render(user_city=user_city, property=property)
8
- print("DEBUG: Rendered Mermaid Code:\n", rendered_code)
9
  mermaid_md = f"```mermaid\n{rendered_code}\n```"
10
  return mermaid_md
11
  except Exception as e:
12
  return f"**Template Error:** {str(e)}"
13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  default_template = """
15
  flowchart TD
16
- Start["Start"] --> AskCity["{% if user_city %}You're viewing in {{ user_city }}.{% else %}Which city would you like to view in?{% endif %}"]
17
- AskCity --> AskProperty["{% if property %}You want to view {{ property }}.{% else %}What property are you interested in?{% endif %}"]
 
 
18
  """
19
 
20
  custom_css = """
21
  .gr-box { padding: 1.5rem; }
22
 
23
- .sticky-left {
24
- position: sticky;
25
- top: 1rem;
26
- align-self: flex-start;
27
- height: fit-content;
28
- z-index: 1;
29
  }
30
 
31
- .scroll-right {
32
- max-height: 90vh;
 
33
  overflow-y: auto;
34
- padding-right: 1rem;
 
 
35
  }
 
36
  """
37
 
38
- with gr.Blocks(theme=gr.themes.Base(), css=custom_css) as demo:
39
- gr.Markdown("## 🧠 Jinja2 β†’ Mermaid Renderer", elem_id="title")
40
- gr.Markdown("Customize the Mermaid flowchart using Jinja2 logic and see a live preview.")
41
 
42
  with gr.Row():
43
- # LEFT SIDE (Sticky)
44
- with gr.Column(scale=1, elem_classes=["sticky-left"]):
45
- user_city = gr.Textbox(label="πŸ™οΈ User City", placeholder="e.g., Liverpool", lines=1)
46
- property = gr.Textbox(label="🏒 Property", placeholder="e.g., Moda Living", lines=1)
47
  jinja_input = gr.Code(
48
  label="✍️ Jinja2 + Mermaid Template",
49
  language="html",
50
  value=default_template,
51
- lines=18
 
52
  )
53
 
54
- # RIGHT SIDE (Scrollable)
55
- with gr.Column(scale=1, elem_classes=["scroll-right"]):
56
- rendered_md = gr.Markdown(label="πŸ“ˆ Live Mermaid Preview")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
- inputs = [jinja_input, user_city, property]
59
- jinja_input.change(render_mermaid, inputs=inputs, outputs=rendered_md)
60
- user_city.change(render_mermaid, inputs=inputs, outputs=rendered_md)
61
- property.change(render_mermaid, inputs=inputs, outputs=rendered_md)
62
 
63
- demo.load(render_mermaid, inputs=inputs, outputs=rendered_md)
 
64
 
65
  demo.launch()
 
1
  import gradio as gr
2
  from jinja2 import Template
3
+ import json
4
 
5
+ # Render the Mermaid chart with Jinja variables
6
+ def render_mermaid(jinja_text, variables):
7
  try:
8
  template = Template(jinja_text)
9
+ rendered_code = template.render(**variables)
 
10
  mermaid_md = f"```mermaid\n{rendered_code}\n```"
11
  return mermaid_md
12
  except Exception as e:
13
  return f"**Template Error:** {str(e)}"
14
 
15
+ # Add a new variable to the dictionary
16
+ def add_variable(key, value, current_vars):
17
+ if not key:
18
+ return current_vars, "**Variable name is required**"
19
+
20
+ try:
21
+ parsed_value = json.loads(value)
22
+ except json.JSONDecodeError:
23
+ parsed_value = value
24
+
25
+ current_vars[key] = parsed_value
26
+ return current_vars, ""
27
+
28
+ # Reset all variables
29
+ def reset_variables():
30
+ return {}
31
+
32
+ # Default Jinja + Mermaid template
33
  default_template = """
34
  flowchart TD
35
+ Start(["Start"])
36
+ Start --> Decision{"Is city known?"}
37
+ Decision -->|Yes| City["You are in {{ user_city }}"]
38
+ Decision -->|No| AskCity["Please choose a city"]
39
  """
40
 
41
  custom_css = """
42
  .gr-box { padding: 1.5rem; }
43
 
44
+ #jinja-code-box {
45
+ max-height: 400px;
46
+ overflow-y: auto;
47
+ border: 1px solid #ddd;
48
+ border-radius: 6px;
 
49
  }
50
 
51
+ .markdown-preview {
52
+ padding: 1rem;
53
+ max-height: 85vh;
54
  overflow-y: auto;
55
+ white-space: pre-wrap;
56
+ font-size: 0.95rem;
57
+ line-height: 1.5;
58
  }
59
+ .gr-button { margin-right: 0.5rem; }
60
  """
61
 
62
+ with gr.Blocks(css=custom_css) as demo:
63
+ gr.Markdown("## 🧠 Jinja2 β†’ Mermaid Renderer (Dynamic Variables - Interactive)")
 
64
 
65
  with gr.Row():
66
+ # LEFT COLUMN
67
+ with gr.Column(scale=7):
 
 
68
  jinja_input = gr.Code(
69
  label="✍️ Jinja2 + Mermaid Template",
70
  language="html",
71
  value=default_template,
72
+ lines=18,
73
+ elem_id="jinja-code-box"
74
  )
75
 
76
+ gr.Markdown("### βž• Add Template Variables")
77
+ with gr.Row():
78
+ var_key = gr.Textbox(label="πŸ†” Variable Name (key)", placeholder="e.g., user_city")
79
+ var_value = gr.Textbox(label="πŸ“¦ Value (JSON)", placeholder='e.g., "London", 42, true')
80
+
81
+ with gr.Row():
82
+ add_btn = gr.Button("βž• Add Variable")
83
+ reset_btn = gr.Button("πŸ” Reset Variables")
84
+
85
+ error_box = gr.Markdown("", visible=False)
86
+ rendered_vars = gr.JSON(label="πŸ“‹ Current Variables")
87
+ variables_state = gr.State({}) # internal variable dictionary
88
+
89
+ # RIGHT COLUMN
90
+ with gr.Column(scale=5):
91
+ gr.Markdown("### πŸ“ˆ Live Mermaid Preview")
92
+ rendered_md = gr.Markdown(elem_classes="markdown-preview")
93
+
94
+ # ADD VARIABLE WORKFLOW
95
+ add_btn.click(
96
+ fn=add_variable,
97
+ inputs=[var_key, var_value, variables_state],
98
+ outputs=[variables_state, error_box],
99
+ show_progress=False
100
+ ).then(
101
+ fn=lambda x: x,
102
+ inputs=variables_state,
103
+ outputs=rendered_vars
104
+ ).then(
105
+ fn=render_mermaid,
106
+ inputs=[jinja_input, variables_state],
107
+ outputs=rendered_md
108
+ )
109
+
110
+ # RESET BUTTON WORKFLOW
111
+ reset_btn.click(
112
+ fn=reset_variables,
113
+ inputs=[],
114
+ outputs=variables_state
115
+ ).then(
116
+ fn=lambda x: x,
117
+ inputs=variables_state,
118
+ outputs=rendered_vars
119
+ ).then(
120
+ fn=render_mermaid,
121
+ inputs=[jinja_input, variables_state],
122
+ outputs=rendered_md
123
+ )
124
 
125
+ # On template change
126
+ jinja_input.change(render_mermaid, inputs=[jinja_input, variables_state], outputs=rendered_md)
 
 
127
 
128
+ # On load
129
+ demo.load(render_mermaid, inputs=[jinja_input, variables_state], outputs=rendered_md)
130
 
131
  demo.launch()