• Publicity: Public Only All

doc-procs.tcl

Generic doc procs

Location:
packages/xotcl-core/tcl/doc-procs.tcl
Created:
2015-04-30
Author:
Gustaf Neumann
CVS Identification:
$Id: doc-procs.tcl,v 1.9 2024/10/29 16:40:12 gustafn Exp $

Procedures in this file

Detailed information

[ hide source ] | [ make this the default ]

Content File Source

xo::library doc {
    Generic doc procs

    @creation-date 2015-04-30
    @author Gustaf Neumann
    @cvs-id $Id: doc-procs.tcl,v 1.9 2024/10/29 16:40:12 gustafn Exp $
}

namespace eval ::xo {

    proc dotquote {e} {
        return \"$e\"
    }

    proc dotquotel {l} {
        set result [list]
        foreach e $l { lappend result \"$e\" }
        return $result
    }

    ad_proc -private dot_append_method {{-documented_methods 1} e methods_ref kind} {
    } {
        upvar $methods_ref methods
        set infokind $kind
        if {$kind eq "instproc"} {append infokind s}
        ::xo::api scope_from_object_reference scope e
        if {$kind eq "proc"} {set prefix "→ "} {set prefix ""}
        foreach methodName [apidoc::get_object_property $e $kind] {
            if {$documented_methods} {
                set proc_index [::xo::api proc_index $scope $e $kind $methodName]
                #:msg "check $methodName => [nsv_exists api_proc_doc $proc_index]"
                if {[nsv_exists api_proc_doc $proc_index]} {
                    lappend methods $prefix$methodName
                }
            } else {
                lappend methods $prefix$methodName
            }
        }
    }

    ad_proc -private dotclass {{-is_focus 0} {-hide_methods 1} {-documented_methods 1} e} {
    } {
        set definition ""
        if {$is_focus} {
            set style "style=filled,penwidth=1.5,color=bisque4,fillcolor=beige,"
        } else {
            set style ""
        }
        set url [export_vars -base show-object {{object $e}}]
        append definition "[dotquote $e] \[${style}URL=\"$url\",label=\"\{$e|"
        foreach slot [$e info slots] {
            set name ""
            catch {set name $slot name}
            if {$name ne ""} {
                append definition "[$slot name]\\l"
            }
        }
        append definition "|"
        ::xo::api scope_from_object_reference scope e
        set methods [list]
        if {!$hide_methods} {
            dot_append_method -documented_methods $documented_methods $e methods proc
            dot_append_method -documented_methods $documented_methods $e methods instproc
            dot_append_method -documented_methods $documented_methods $e methods instforward
        }
        foreach method [lsort $methods] {
            append definition "$method\\l"
        }
        append definition "\}\"\];\n"
    }

    ad_proc -private dotobject {e} {
    } {
        set url [export_vars -base show-object {{object $e}}]
        set definition "[dotquote $e] \[URL=\"$url\"\];\n";
    }

    d_proc -private dotcode {
        {-with_children 0}
        {-with_instance_relations 0}
        {-omit_base_classes 1}
        {-documented_methods 1}
        {-hide_methods 1}
        {-current_object ""}
        {-dpi 96}
        things
    } {
    } {
        set classes {}
        set objects {}
        set iclasses {}
        set mclasses {}

        foreach e $things {
            if {![::nsf::is object $e]
                || ($omit_base_classes && [::nsf::is baseclass $e])
            } continue
            lappend [expr {[::nsf::is class $e] ? "classes" : "objects"}] $e
        }
        set instances ""
        if {$with_instance_relations} {
            foreach e $things {
                if {![::nsf::is object $e]
                    || ($omit_base_classes && [::nsf::is baseclass $e])
                } continue
                set c [$e info class]
                if {$omit_base_classes && [::nsf::is baseclass $c]} continue
                if {$c ni $things} {lappend iclasses $c}
                append instances "[dotquote $e]->[dotquote $c];\n"
            }
        }
        set superclasses ""
        set drawn ""
        foreach e $classes {
            if {![::nsf::is object $e]} continue
            set reduced_sc [list]
            foreach sc [::apidoc::get_object_property $e superclass] {
                if {$omit_base_classes && [::nsf::is baseclass $sc]} continue
                lappend reduced_sc $sc
            }
            if {$reduced_sc eq {}} {
                continue
            }
            foreach sc $reduced_sc {
                #
                # Draw always the superclass of the object of
                # interest, which might in the case of multiple
                # inheritance not in the "things" variable.  This
                # might leave out the superclass of the superclass.
                #
                if {$sc in $things || $sc ne "::nx::Object"} {
                    if {![dict exists $drawn $e-$sc]} {
                        append superclasses "[dotquote $e]->[dotquotel $sc];\n"
                        dict set drawn $e-$sc 1
                    }
                }
            }
        }
        set children ""
        set mixins ""
        foreach e $things {
            if {![::nsf::is object $e] || ($omit_base_classes && [::nsf::is baseclass $e])} continue
            if {$with_children} {
                foreach c [$e info children] {
                    if {$c ni $things} continue
                    append children "[dotquote $c]->[dotquote $e];\n"
                }
            }
            set m [apidoc::get_object_property $e mixin]
            #puts "-- $e mixin $m"
            if {$m eq ""} continue
            foreach mixin $m {
                if {$mixin ni $things} {lappend mclasses $m}
                append mixins "[dotquote $e]->[dotquotel $mixin];\n"
            }
        }
        set tclasses ""
        set instmixins ""
        foreach e $classes {
            set m [apidoc::get_object_property $e instmixin]
            #puts "-- $e instmixin $m"
            if {$m eq ""} continue
            #foreach mixin $m {
            #  append tclasses [dotclass -documented_methods $documented_methods $mixin]
            #}

            foreach mixin $m {
                if {$mixin ni $things} {lappend mclasses $mixin}
                append instmixins "[dotquote $e]->[dotquotel $mixin];\n"
            }
        }

        foreach e $classes {
            append tclasses [dotclass \
                                 -is_focus [expr {$e eq $current_object}] \
                                 -hide_methods $hide_methods \
                                 -documented_methods $documented_methods \
                                 $e]
        }
        set tobjects {}
        foreach e $objects {
            append tobjects [dotobject $e]
        }
        set tmclasses {}
        foreach e $mclasses {
            append tmclasses [dotobject $e]
        }
        set ticlasses {}
        foreach e $iclasses {
            append ticlasses [dotobject $e]
        }

        #label = \".\\n.\\nObject relations of [self]\"
        #edge \[dir=back, constraint=0\] \"::Decorate_Action\" -> \"::Action\";
        set objects  [join [dotquotel $objects] {; }]
        #set classes  [join [dotquotel $classes] {; }]
        set imcolor hotpink4

        set font "fontname = \"Helvetica\",fontsize = 8,"
        #set font "fontname = \"Bitstream Vera Sans\",fontsize = 8,"
        # rankdir = BT; labeldistance = 20;
        return "digraph {
   dpi = $dpi;
   rankdir = BT;
   node \[$font shape=record\]; $tclasses
   edge \[arrowhead=empty\]; $superclasses
   node \[fontcolor=$imcolor, color=$imcolor, style=filled, fillcolor=bisque\]; $tmclasses
   node \[fontcolor=blue, color=blue, style=filled, fillcolor=darkslategray2\]; $ticlasses
   node \[color=Green,shape=ellipse,fontcolor=Blue, style=filled, fillcolor=darkseagreen1\]; $tobjects
   edge \[color=Blue,style=dotted,arrowhead=normal,label=\"instance of\",fontsize=10\]; $instances
   edge \[color=pink,arrowhead=diamond, style=dotted\]; $children
   edge \[label=instmixin,fontsize=10,color=$imcolor,fontcolor=$imcolor,arrowhead=none,arrowtail=vee,style=dashed,dir=back,constraint=0\]; $instmixins
   edge \[label=mixin,fontsize=10,color=$imcolor,fontcolor=$imcolor,arrowhead=none,arrowtail=vee,style=dashed,dir=back,constraint=0\]; $mixins

}"
    }

}

::xo::library source_dependent
#
# Local variables:
#    mode: tcl
#    tcl-indent-level: 4
#    indent-tabs-mode: nil
# End: