Index: openacs-4/packages/xowf/tcl/xowf-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/tcl/xowf-procs.tcl,v
diff -u -r1.28.2.81 -r1.28.2.82
--- openacs-4/packages/xowf/tcl/xowf-procs.tcl 5 Oct 2022 14:06:00 -0000 1.28.2.81
+++ openacs-4/packages/xowf/tcl/xowf-procs.tcl 25 Nov 2022 19:17:02 -0000 1.28.2.82
@@ -973,14 +973,10 @@
return $result
}
- Context instproc as_graph {{-current_state ""} {-visited ""} {-dpi 96} {-style "width:100%"}} {
- set dot ""
- catch {set dot [::util::which dot]}
- # final resort for cases, where ::util::which is not available
- if {$dot eq "" && [file executable /usr/bin/dot]} {set dot /usr/bin/dot}
- if {$dot eq ""} {return "Program 'dot' is not available! No graph displayed."}
+
+ Context instproc dotcode {{-current_state ""} {-visited ""} {-dpi 96}} {
set obj_id [namespace tail ${:object}]
- set result [subst {digraph workflow_$obj_id \{
+ set dotcode [subst {digraph workflow_$obj_id \{
dpi = $dpi;
node \[shape=doublecircle, margin=0.001, fontsize=8, fixedsize=1, width=0.4, style=filled\]; start;
node \[shape=ellipse, fontname="Courier", color=lightblue2, style=filled,
@@ -995,28 +991,28 @@
} else {
set color ""
}
- append result " state_[$s name] \[label=\"[$s label]\"$color\];\n"
+ append dotcode " state_[$s name] \[label=\"[$s label]\"$color\];\n"
}
set initializeObj [:wf_definition_object initialize]
if {[nsf::is object $initializeObj]} {
- append result "start->state_initial \[label=\"[$initializeObj label]\"\];\n"
+ append dotcode "start->state_initial \[label=\"[$initializeObj label]\"\];\n"
} else {
- append result "start->state_initial;\n"
+ append dotcode "start->state_initial;\n"
}
set :condition_count 0
foreach s [:defined State] {
foreach a [$s get_actions -set true] {
set actionObj [:wf_definition_object $a]
- append result [:draw_transition $s $actionObj ""]
+ append dotcode [:draw_transition $s $actionObj ""]
set drawn($actionObj) 1
}
foreach role [$s set handled_roles] {
set role_ctx [self]-$role
#:msg exists?role=$role->[self]-$role->[nsf::is object ${role_ctx}]
if {[nsf::is object ${role_ctx}::[$s name]]} {
foreach a [${role_ctx}::[$s name] get_actions] {
- append result [:draw_transition $s ${role_ctx}::$a "$role:"]
+ append dotcode [:draw_transition $s ${role_ctx}::$a "$role:"]
}
}
}
@@ -1029,22 +1025,29 @@
if {[info exists drawn($action)]} {continue}
if {[$action state_safe]} {
foreach s [:defined State] {
- append result [:draw_transition $s $action ""]
+ append dotcode [:draw_transition $s $action ""]
}
}
}
- append result "\}\n"
- set package_id [${:object} package_id]
- set path [acs_package_root_dir [::$package_id package_key]]/www/
- set fn $path/g.dot
- set ofn dot-$obj_id.png
- set f [open $fn w]; fconfigure $f -encoding utf-8; puts $f $result; close $f
- if {[catch {exec $dot -Tpng $fn -o $path/$ofn} errorMsg]} {
- :msg "Error during execution of $dot: $errorMsg"
+ append dotcode "\}\n"
+ return $dotcode
+ }
+
+
+ Context instproc as_graph {{-current_state ""} {-visited ""} {-dpi 72} {-style "width:20%"}} {
+ set dot ""
+ set dot [::util::which dot]
+ if {$dot eq ""} {
+ return "Program 'dot' is not available! No graph displayed."
}
- file delete -- $fn
- return "\n"
+ set dotcode [:dotcode -current_state $current_state -visited $visited -dpi $dpi]
+
+ set svg [util::inline_svg_from_dot -css [subst {
+ svg g a:link {text-decoration: none;}
+ div.inner svg {height:100%; overflow: visible; $style; margin: 0 auto;}
+ }] $dotcode]
+ return $svg
}
Context instproc check {} {