Commit 8bd869b0 authored by Frank Bergmann's avatar Frank Bergmann

- Updated to OpenACS 5.9.1

parent 01d05d0d
...@@ -2,31 +2,33 @@ ...@@ -2,31 +2,33 @@
<!-- Generated by the OpenACS Package Manager --> <!-- Generated by the OpenACS Package Manager -->
<package key="acs-api-browser" url="http://openacs.org/repository/apm/packages/acs-api-browser/" type="apm_service"> <package key="acs-api-browser" url="http://openacs.org/repository/apm/packages/acs-api-browser/" type="apm_service">
<package-name>ACS API Browser</package-name> <package-name>ACS API Browser</package-name>
<pretty-plural>ACS API Browsers</pretty-plural> <pretty-plural>ACS API Browsers</pretty-plural>
<initial-install-p>t</initial-install-p> <initial-install-p>t</initial-install-p>
<singleton-p>t</singleton-p> <singleton-p>t</singleton-p>
<version name="5.9.1" url="http://openacs.org/repository/download/apm/acs-api-browser-5.9.1.apm">
<license>GPL V2.0 or any later version</license> <license>GPL V2.0 or any later version</license>
<version name="5.9.0" url="http://openacs.org/repository/download/apm/acs-api-browser-5.9.0.apm"> <owner url="http://openacs.org">OpenACS</owner>
<owner url="http://openacs.org">OpenACS</owner> <summary>Interactive documentation for the Tcl and SQL APIs.</summary>
<summary>Interactive documentation for the Tcl and SQL APIs.</summary> <release-date>2017-08-06</release-date>
<release-date>2015-10-04</release-date> <maturity>3</maturity>
<maturity>3</maturity> <vendor url="http://openacs.org">OpenACS</vendor>
<vendor url="http://openacs.org">OpenACS</vendor> <license url="http://www.gnu.org/copyleft/gpl.html">GPL</license>
<license url="http://www.gnu.org/copyleft/gpl.html">GPL</license> <maturity>3</maturity>
<maturity>3</maturity> <description format="text/html">On line interactive documentation for the locally installed Tcl and SQL APIs. Links to the Tcl core and NaviServer/AOLServer online documentation as well.</description>
<description format="text/html">On line interactive documentation for the locally installed Tcl and SQL APIs. Links to the Tcl core and AOLServer online documentation as well.</description>
<provides url="acs-api-browser" version="5.9.1"/>
<provides url="acs-api-browser" version="5.9.0"/> <requires url="acs-tcl" version="5.9.1"/>
<requires url="acs-kernel" version="5.9.0"/> <requires url="acs-kernel" version="5.9.1"/>
<callbacks> <callbacks>
</callbacks> </callbacks>
<parameters> <parameters>
<parameter datatype="number" min_n_values="1" max_n_values="1" name="FancySourceFormattingP" default="1" description="Should we highlight syntax and hyperlink procedure names when showing procedure source code? (1 for yes, 0 for no)"/> <parameter datatype="number" min_n_values="1" max_n_values="1" name="FancySourceFormattingP" default="1" description="Should we highlight syntax and hyperlink procedure names when showing procedure source code? (1 for yes, 0 for no)"/>
</parameters> <parameter scope="instance" datatype="number" min_n_values="1" max_n_values="1" name="ValidateCSRFP" default="1" description="Boolean parameter to activate/deactivate CSRF protection for this package instance"/>
</parameters>
</version>
</version>
</package> </package>
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
<input type="text" name="query_string" value="@query_string@"><br> <input type="text" name="query_string" value="@query_string@"><br>
<input type="submit" value="All matches" name="search_type"> <input type="submit" value="All matches" name="search_type">
<input type="submit" value="Only best match" name="search_type"> <input type="submit" value="Only best match" name="search_type">
<if @::__csrf_token@ defined><input type="hidden" name="__csrf_token" value="@::__csrf_token;literal@"></if>
</div> </div>
<p><a href="@openacs_browse_url@">Browse OpenACS Tcl API</a></p> <p><a href="@openacs_browse_url@">Browse OpenACS Tcl API</a></p>
</td> </td>
...@@ -49,12 +50,13 @@ ...@@ -49,12 +50,13 @@
<tr style="background:#DDDDDD"> <tr style="background:#DDDDDD">
<td colspan="2"> <td colspan="2">
<form action="@aolserver_search_url@" method="get"> <form action="@aolserver_search_url@" method="get">
<h4>AOLserver Tcl API Search</h4> <h4>NaviServer/AOLserver Tcl API Search</h4>
<div> <div>
<input type="text" name="tcl_proc"> <input type="text" name="tcl_proc">
<input type="submit" value="Go"><br> <input type="submit" value="Go"><br>
<if @::__csrf_token@ defined><input type="hidden" name="__csrf_token" value="@::__csrf_token;literal@"></if>
(enter <em>exact</em> procedure name)<br> (enter <em>exact</em> procedure name)<br>
<a href="@aolserver_tcl_api_root@">Browse AOLserver Tcl API</a> <a href="@server_tcl_api_root@">Browse NaviServer Tcl API</a>
</div> </div>
</form> </form>
</td> </td>
...@@ -66,6 +68,7 @@ ...@@ -66,6 +68,7 @@
<h4>Tcl Documentation Search</h4> <h4>Tcl Documentation Search</h4>
<div> <div>
<input type="text" name="tcl_proc"> <input type="text" name="tcl_proc">
<if @::__csrf_token@ defined><input type="hidden" name="__csrf_token" value="@::__csrf_token;literal@"></if>
<input type="submit" value="Go"><br> <input type="submit" value="Go"><br>
(enter <em>exact</em> procedure name)<br> (enter <em>exact</em> procedure name)<br>
<a href="@tcl_docs_root@">Browse the Tcl documentation</a> <a href="@tcl_docs_root@">Browse the Tcl documentation</a>
......
...@@ -9,30 +9,26 @@ ...@@ -9,30 +9,26 @@
if { ![info exists query_string] } { if { ![info exists query_string] } {
set query_string {} set query_string {}
} }
set aolserver_tcl_api_root "http://www.aolserver.com/docs/devel/tcl/api/"
set tcl_docs_root "http://tcl.tk/man/tcl[info tclversion]/TclCmd/contents.htm"
set package_url [apm_package_url_from_key "acs-api-browser"] set package_url [apm_package_url_from_key "acs-api-browser"]
set openacs_search_url "${package_url}proc-search" # AOLserver has dropped documentation, use NaviServer docs instead
#set server_tcl_api_root "http://www.aolserver.com/docs/devel/tcl/api/"
set server_tcl_api_root "https://naviserver.sourceforge.io/n/toc.html"
set openacs_browse_url "${package_url}proc-browse" set tcl_docs_root "http://tcl.tk/man/tcl[info tclversion]/TclCmd/contents.htm"
set openacs_search_url "${package_url}proc-search"
set openacs_browse_url "${package_url}proc-browse"
set openacs_plsql_browse_url "${package_url}plsql-subprograms-all" set openacs_plsql_browse_url "${package_url}plsql-subprograms-all"
set aolserver_search_url "${package_url}tcl-proc-view"
set aolserver_search_url "${package_url}tcl-proc-view" set tcl_search_url "${package_url}tcl-doc-search"
set tcl_search_url "${package_url}tcl-doc-search"
switch [db_type] { switch [db_type] {
postgresql { postgresql {
set db_pretty "PostgreSQL [db_version]" set db_pretty "PostgreSQL [db_version]"
set db_doc_url "http://www.postgresql.org/docs/[db_version]/interactive/index.html" set db_doc_url "http://www.postgresql.org/docs/[db_version]/interactive/index.html"
set db_doc_search_url "http://search.postgresql.org/www.search" set db_doc_search_url "https://www.postgresql.org/search"
set db_doc_search_export [export_vars -form { { ul "http://www.postgresql.org/docs/[db_version]/static/%" } }] set db_doc_search_export [export_vars -form { { ul "https://www.postgresql.org/docs/[db_version]/static/%" } }]
set db_doc_search_query_name "q" set db_doc_search_query_name "q"
} }
oracle { oracle {
......
...@@ -16,9 +16,13 @@ namespace eval ::apidoc { ...@@ -16,9 +16,13 @@ namespace eval ::apidoc {
# NaviServer at sourceforge # NaviServer at sourceforge
# #
set ns_api_host "http://naviserver.sourceforge.net/" set ns_api_host "http://naviserver.sourceforge.net/"
set ns_api_index "n/naviserver/files/" set ns_api_index [list "n/naviserver/files/" "n/"]
set ns_api_root ${ns_api_host}${ns_api_index} set ns_api_root [list \
set ns_api_html_index $ns_api_root/commandlist.html ${ns_api_host}[lindex $ns_api_index 0] \
${ns_api_host}[lindex $ns_api_index 1] ]
set ns_api_html_index [list \
[lindex $ns_api_root 0]commandlist.html \
[lindex $ns_api_root 1]toc.html ]
} else { } else {
# #
# AOLserver wiki on panpotic # AOLserver wiki on panpotic
...@@ -347,6 +351,7 @@ ad_proc -public api_proc_documentation { ...@@ -347,6 +351,7 @@ ad_proc -public api_proc_documentation {
-xql:boolean -xql:boolean
-label -label
{-first_line_tag <h3>} {-first_line_tag <h3>}
{-proc_type ""}
proc_name proc_name
} { } {
...@@ -371,12 +376,25 @@ ad_proc -public api_proc_documentation { ...@@ -371,12 +376,25 @@ ad_proc -public api_proc_documentation {
array set default_values $doc_elements(default_values) array set default_values $doc_elements(default_values)
if {![info exists label]} { if {![info exists label]} {
set label $proc_name if {[llength $proc_name] > 1 && [info commands ::xo::api] ne ""} {
set label [::xo::api method_label $proc_name]
} else {
set label $proc_name
}
} }
if { $script_p } { if { $script_p } {
set pretty_name [api_proc_pretty_name -label $label $proc_name] set pretty_name [api_proc_pretty_name \
-include_debug_controls \
-proc_type $proc_type \
-label $label \
$proc_name]
} else { } else {
set pretty_name [api_proc_pretty_name -link -label $label $proc_name] set pretty_name [api_proc_pretty_name \
-include_debug_controls \
-link \
-proc_type $proc_type \
-label $label \
$proc_name]
} }
if {[regexp {<([^ >]+)} $first_line_tag match tag]} { if {[regexp {<([^ >]+)} $first_line_tag match tag]} {
set end_tag "</$tag>" set end_tag "</$tag>"
...@@ -386,27 +404,30 @@ ad_proc -public api_proc_documentation { ...@@ -386,27 +404,30 @@ ad_proc -public api_proc_documentation {
} }
append out $first_line_tag$pretty_name$end_tag append out $first_line_tag$pretty_name$end_tag
if {[regexp {^(.*) (inst)?proc (.*)$} $proc_name match cl prefix method]} { if {[regexp {^(.*) (inst)?proc (.*)$} $proc_name match cl prefix method]
set xotcl 1 && [info commands ::xo::api] ne ""
} {
set xotclArgs 1
set scope "" set scope ""
if {[regexp {^(.+) (.+)$} $cl match scope cl]} { regexp {^(.+) (.+)$} $cl match scope cl
set cl "$scope do $cl"
}
if {$prefix eq ""} { if {$prefix eq ""} {
set pretty_proc_name "[::xotcl::api object_link $scope $cl] $method" set pretty_proc_name "[::xo::api object_link $scope $cl] $method"
} else { } else {
set pretty_proc_name \ set pretty_proc_name [subst {<i>&lt;instance of [::xo::api object_link $scope $cl]&gt;</i> $method}]
"<i>&lt;instance of\
[::xotcl::api object_link $scope $cl]&gt;</i> $method"
} }
} else { } else {
set xotcl 0 set xotclArgs 0
set pretty_proc_name $proc_name if {[info commands ::xo::api] ne "" && [::xo::api isclass "" [lindex $proc_name 1]]} {
set name [lindex $proc_name 1]
set pretty_proc_name "[$name info class] [::xo::api object_link {} $name]"
} else {
set pretty_proc_name $proc_name
}
} }
lappend command_line $pretty_proc_name lappend command_line $pretty_proc_name
foreach switch $doc_elements(switches) { foreach switch $doc_elements(switches) {
if {$xotcl} { if {$xotclArgs} {
if {"boolean" in $flags($switch)} { if {"boolean" in $flags($switch)} {
set value "<i>on|off</i> " set value "<i>on|off</i> "
} elseif {"switch" in $flags($switch)} { } elseif {"switch" in $flags($switch)} {
...@@ -441,38 +462,44 @@ ad_proc -public api_proc_documentation { ...@@ -441,38 +462,44 @@ ad_proc -public api_proc_documentation {
if { $doc_elements(varargs_p) } { if { $doc_elements(varargs_p) } {
lappend command_line "\[ <i>args</i>... \]" lappend command_line "\[ <i>args</i>... \]"
} }
append out [util_wrap_list $command_line] "\n<blockquote>\n" append out [util_wrap_list $command_line]
set intro_out ""
if { $script_p } { if { $script_p } {
append out [subst {<p>Defined in append intro_out [subst {<p>Defined in
<a href="/api-doc/procs-file-view?path=[ns_urlencode $doc_elements(script)]">$doc_elements(script)</a> <a href="/api-doc/procs-file-view?path=[ns_urlencode $doc_elements(script)]">$doc_elements(script)</a>
<p>}] <p>}]
} }
if { $doc_elements(deprecated_p) } { if { $doc_elements(deprecated_p) } {
append out "<b><i>Deprecated." append intro_out "<b><i>Deprecated."
if { $doc_elements(warn_p) } { if { $doc_elements(warn_p) } {
append out " Invoking this procedure generates a warning." append intro_out " Invoking this procedure generates a warning."
} }
append out "</i></b><p>\n" append intro_out "</i></b><p>\n"
} }
append out "<p>[lindex $doc_elements(main) 0]\n<p>\n" set main [lindex $doc_elements(main) 0]
set haveBlocks [expr { if {$main ne ""} {
[info exists doc_elements(param)] append intro_out "<p>[lindex $doc_elements(main) 0]\n<p>\n"
|| [llength $doc_elements(switches)] > 0 }
|| [llength $doc_elements(positionals)] > 0
|| [info exists doc_elements(option)] #
|| [info exists doc_elements(return)] # Make first a quick check, and if it fails, double check details
|| [info exists doc_elements(error)] #
|| [info exists doc_elements(author)] set haveBlocks [expr {[llength $doc_elements(switches)] > 0
|| [info exists doc_elements(creation-date)] || [llength $doc_elements(positionals)] > 0}]
|| [info exists doc_elements(change-log)] if {$haveBlocks == 0} {
|| [info exists doc_elements(cvs-id)] foreach e {param option return error author creation-date change-log cvs-id see} {
|| [info exists doc_elements(see)] if {[info exists doc_elements($e)] && $doc_elements($e) ne ""} {
}] set haveBlocks 1
break
}
}
}
if {$haveBlocks} { if {$haveBlocks} {
append out "<dl>\n" set blocks_out "<dl>\n"
if { [info exists doc_elements(param)] } { if { [info exists doc_elements(param)] } {
foreach param $doc_elements(param) { foreach param $doc_elements(param) {
...@@ -483,49 +510,49 @@ ad_proc -public api_proc_documentation { ...@@ -483,49 +510,49 @@ ad_proc -public api_proc_documentation {
} }
if { [llength $doc_elements(switches)] > 0 } { if { [llength $doc_elements(switches)] > 0 } {
append out "<dt><b>Switches:</b></dt><dd><dl>\n" append blocks_out "<dt><b>Switches:</b></dt><dd><dl>\n"
foreach switch $doc_elements(switches) { foreach switch $doc_elements(switches) {
append out "<dt><b>-$switch</b>" append blocks_out "<dt><b>-$switch</b>"
if {"boolean" in $flags($switch)} { if {"boolean" in $flags($switch)} {
append out " (boolean)" append blocks_out " (boolean)"
} }
if { [info exists default_values($switch)] if { [info exists default_values($switch)]
&& $default_values($switch) ne "" && $default_values($switch) ne ""
} { } {
append out " (defaults to <code>\"[ns_quotehtml $default_values($switch)]\"</code>)" append blocks_out " (defaults to <code>\"[ns_quotehtml $default_values($switch)]\"</code>)"
} }
if {"required" in $flags($switch)} { if {"required" in $flags($switch)} {
append out " (required)" append blocks_out " (required)"
} else { } else {
append out " (optional)" append blocks_out " (optional)"
} }
append out "</dt>" append blocks_out "</dt>"
if { [info exists params($switch)] } { if { [info exists params($switch)] } {
append out "<dd>$params($switch)</dd>" append blocks_out "<dd>$params($switch)</dd>"
} }
} }
append out "</dl></dd>\n" append blocks_out "</dl></dd>\n"
} }
if { [llength $doc_elements(positionals)] > 0 } { if { [llength $doc_elements(positionals)] > 0 } {
append out "<dt><b>Parameters:</b></dt><dd>\n" append blocks_out "<dt><b>Parameters:</b></dt><dd>\n"
foreach positional $doc_elements(positionals) { foreach positional $doc_elements(positionals) {
append out "<b>$positional</b>" append blocks_out "<b>$positional</b>"
if { [info exists default_values($positional)] } { if { [info exists default_values($positional)] } {
if { $default_values($positional) eq "" } { if { $default_values($positional) eq "" } {
append out " (optional)" append blocks_out " (optional)"
} else { } else {
append out " (defaults to <code>\"$default_values($positional)\"</code>)" append blocks_out " (defaults to <code>\"$default_values($positional)\"</code>)"
} }
} }
if { [info exists params($positional)] } { if { [info exists params($positional)] } {
append out " - $params($positional)" append blocks_out " - $params($positional)"
} }
append out "<br>\n" append blocks_out "<br>\n"
} }
append out "</dd>\n" append blocks_out "</dd>\n"
} }
...@@ -535,46 +562,47 @@ ad_proc -public api_proc_documentation { ...@@ -535,46 +562,47 @@ ad_proc -public api_proc_documentation {
# by ad_proc. # by ad_proc.
if { [info exists doc_elements(option)] } { if { [info exists doc_elements(option)] } {
append out "<b>Options:</b><dl>" append blocks_out "<b>Options:</b><dl>"
foreach param $doc_elements(option) { foreach param $doc_elements(option) {
if { [regexp {^([^ \t]+)[ \t](.+)$} $param "" name value] } { if { [regexp {^([^ \t]+)[ \t](.+)$} $param "" name value] } {
append out "<dt><b>-$name</b></dt><dd>$value<br></dd>" append blocks_out "<dt><b>-$name</b></dt><dd>$value<br></dd>"
} }
} }
append out "</dl>" append blocks_out "</dl>"
} }
if { [info exists doc_elements(return)] } { if { [info exists doc_elements(return)] } {
append out "<dt><b>Returns:</b></dt><dd>[join $doc_elements(return) "<br>"]</dd>\n" append blocks_out "<dt><b>Returns:</b></dt><dd>[join $doc_elements(return) "<br>"]</dd>\n"
} }
if { [info exists doc_elements(error)] } { if { [info exists doc_elements(error)] } {
append out "<dt><b>Error:</b></dt><dd>[join $doc_elements(error) "<br>"]</dd>\n" append blocks_out "<dt><b>Error:</b></dt><dd>[join $doc_elements(error) "<br>"]</dd>\n"
} }
append out [::apidoc::format_common_elements doc_elements] append blocks_out [::apidoc::format_common_elements doc_elements]
append blocks_out "</dl>\n"
append out "</dl>\n" } else {
set blocks_out ""
} }
if { $source_p } { if { $source_p } {
if {[parameter::get_from_package_key \ if {[parameter::get_from_package_key \
-package_key acs-api-browser \ -package_key acs-api-browser \
-parameter FancySourceFormattingP \ -parameter FancySourceFormattingP \
-default 1]} { -default 1]} {
append out [subst {<dt><b>Source code:</b></dt><dd> set source_out [subst {<dt><b>Source code:</b></dt><dd>
<pre class="code">[::apidoc::tcl_to_html $proc_name]</pre> <pre class="code">[::apidoc::tcl_to_html $proc_name]</pre>
</dd> </dd>
}] }]
} else { } else {
append out [subst {<dt><b>Source code:</b></dt><dd> set source_out [subst {<dt><b>Source code:</b></dt><dd>
<pre class="code">[ns_quotehtml [api_get_body $proc_name]]</pre> <pre class="code">[ns_quotehtml [api_get_body $proc_name]]</pre>
</dd> </dd>
}] }]
} }
} else {
set source_out ""
} }
set xql_base_name $::acs::rootdir/ set xql_base_name $::acs::rootdir/
...@@ -600,9 +628,10 @@ ad_proc -public api_proc_documentation { ...@@ -600,9 +628,10 @@ ad_proc -public api_proc_documentation {
if { [file exists $::acs::rootdir/$xql_fn] } { if { [file exists $::acs::rootdir/$xql_fn] } {
set content [apidoc::get_xql_snippet -proc_name $proc_name -xql_file $xql_fn] set content [apidoc::get_xql_snippet -proc_name $proc_name -xql_file $xql_fn]
if {$content ne ""} {set content "<pre class='code'>$content</pre>"} if {$content ne ""} {set content "<pre class='code'>$content</pre>"}
set href [export_vars -base content-page-view {{source_p 1} {path $xql_fn}}]
append there [subst {<dt><b>PostgreSQL XQL file:</b></dt> append there [subst {<dt><b>PostgreSQL XQL file:</b></dt>
<dd>$content <dd>$content
<a href="[ns_quotehtml [export_vars -base content-page-view {{source_p 1} {path $xql_fn}}]]">$xql_fn</a> <a href="[ns_quotehtml $href]">$xql_fn</a>
<p> <p>
</dd> </dd>
}] }]
...@@ -614,9 +643,10 @@ ad_proc -public api_proc_documentation { ...@@ -614,9 +643,10 @@ ad_proc -public api_proc_documentation {
if { [file exists $::acs::rootdir/$xql_fn] } { if { [file exists $::acs::rootdir/$xql_fn] } {
set content [apidoc::get_xql_snippet -proc_name $proc_name -xql_file $xql_fn] set content [apidoc::get_xql_snippet -proc_name $proc_name -xql_file $xql_fn]
if {$content ne ""} {set content "<pre class='code'>$content</pre>"} if {$content ne ""} {set content "<pre class='code'>$content</pre>"}
set href [export_vars -base content-page-view {{source_p 1} {path $xql_fn}}]
append there [subst {<dt><b>Oracle XQL file:</b></dt> append there [subst {<dt><b>Oracle XQL file:</b></dt>
<dd>$content <dd>$content
<a href="[ns_quotehtml [export_vars -base content-page-view {{source_p 1} {path $xql_fn}}]]">$xql_fn</a> <a href="[ns_quotehtml $href]">$xql_fn</a>
<p> <p>
</dd> </dd>
}] }]
...@@ -624,19 +654,26 @@ ad_proc -public api_proc_documentation { ...@@ -624,19 +654,26 @@ ad_proc -public api_proc_documentation {
lappend missing Oracle lappend missing Oracle
} }
if {[llength $missing] > 0} { if {[llength $missing] > 0} {
append out [subst {<dt><b>XQL Not present:</b></dt><dd>[join $missing ", "]</dd>}] set xql_out [subst {<dt><b>XQL Not present:</b></dt><dd>[join $missing ", "]</dd>}]
} }
append out $there append xql_out $there
} else {
set xql_out ""
} }
set out_sections $intro_out$blocks_out$source_out$xql_out
if {$out_sections ne ""} {
append out <blockquote>$out_sections</blockquote>
}
# No "see also" yet. # No "see also" yet.
append out "</blockquote>"
return $out return $out
} }
ad_proc api_proc_pretty_name { ad_proc api_proc_pretty_name {
-link:boolean -link:boolean
-include_debug_controls:boolean
{-proc_type ""}
-label -label
proc proc
} { } {
...@@ -648,22 +685,21 @@ ad_proc api_proc_pretty_name { ...@@ -648,22 +685,21 @@ ad_proc api_proc_pretty_name {
set label $proc set label $proc
} }
if { $link_p } { if { $link_p } {
append out "<a href=\"[ns_quotehtml [api_proc_url $proc]]\">$label</a>" append out [subst {<a href="[ns_quotehtml [api_proc_url $proc]]">$label</a>}]
} else { } else {
append out "$label" append out $label
} }
array set doc_elements [nsv_get api_proc_doc $proc] set doc_elements [nsv_get api_proc_doc $proc]
if {$doc_elements(deprecated_p)} { set debug_html [expr {$include_debug_controls_p && [info commands ::xo::api] ne ""
set deprecated ", decprecated" ? [::xo::api debug_widget $proc] : ""}]
} else { set hints {}
set deprecated "" if {$proc_type ne ""} {lappend hints $proc_type}
} if {[dict exists $doc_elements protection]} {lappend hints [dict get $doc_elements protection]}
if { $doc_elements(public_p) } { if {[dict get $doc_elements deprecated_p]} {lappend hints deprecated}
append out " (public$deprecated)" if {[llength $hints] > 0} {
} append out " ([join $hints {, }])"
if { $doc_elements(private_p) } { }
append out " (private$deprecated)" append out $debug_html
}
return $out return $out
} }
...@@ -716,27 +752,29 @@ ad_proc -public api_describe_function { ...@@ -716,27 +752,29 @@ ad_proc -public api_describe_function {
ad_proc -public api_get_body {proc_name} { ad_proc -public api_get_body {proc_name} {
This function returns the body of a tcl proc or an xotcl method. This function returns the body of a Tcl proc or an xotcl method.
@param proc_name the name spec of the proc @param proc_name the name spec of the proc
@return body of the specified prox @return body of the specified prox
} { } {
if {[info commands ::xo::api] ne ""
if {[regexp {^(.*) (inst)?proc (.*)$} $proc_name match obj prefix method]} { && [regexp {^(.*) (inst)?proc (.*)$} $proc_name match obj prefix method]} {
if {[regexp {^(.*) (.*)$} $obj match thread obj]} { if {[regexp {^(.*) (.*)$} $obj match thread obj]} {
# the definition is located in a disconnected thread return [::xo::api get_method_source $thread $obj $prefix $method]
return [$thread do ::Serializer methodSerialize $obj $method $prefix]
} else { } else {
# the definition is locally in the connection thread return [::xo::api get_method_source "" $obj $prefix $method]
return [::Serializer methodSerialize $obj $method $prefix] }
} } elseif {[info commands ::xo::api] ne ""
} elseif {[regexp {^([^ ]+)(Class|Object) (.*)$} $proc_name match thread kind obj]} { && [regexp {^([^ ]+) (Class|Object) (.*)$} $proc_name . thread kind obj]} {
return [$thread do $obj serialize] return [::xo::api get_object_source $thread $obj]
} elseif {[info commands ::xo::api] ne ""
&& [regexp {(Class|Object) (.*)$} $proc_name . kind obj]} {
return [::xo::api get_object_source "" $obj]
} elseif {[info procs $proc_name] ne ""} { } elseif {[info procs $proc_name] ne ""} {
return [info body $proc_name] return [info body $proc_name]
} elseif {[info procs ::nsf::procs::$proc_name] ne ""} { } elseif {[info procs ::nsf::procs::$proc_name] ne ""} {
return [::nx::Object info method body ::nsf::procs::$proc_name] return [::nx::Object info method body ::nsf::procs::$proc_name]
} else { } else {
return "No such Tcl-proc" return "No such Tcl-proc '$proc_name'"
} }
} }
...@@ -771,10 +809,10 @@ namespace eval ::apidoc { ...@@ -771,10 +809,10 @@ namespace eval ::apidoc {
@param see a string expected to comtain the resource to format @param see a string expected to comtain the resource to format
@return the html string representing the resource @return the html string representing the resource
} { } {
regsub -all {proc *} $see {} see #regsub -all {proc *} $see {} see
set see [string trim $see] set see [string trim $see]
if {[nsv_exists api_proc_doc $see]} { if {[nsv_exists api_proc_doc $see]} {
set href [export_vars -base proc-view {{proc $see}}] set href [export_vars -base /api-doc/proc-view {{proc $see}}]
return [subst {<a href="[ns_quotehtml $href]">$see</a>}] return [subst {<a href="[ns_quotehtml $href]">$see</a>}]
} }
if {[string match "/doc/*" $see] if {[string match "/doc/*" $see]
...@@ -972,13 +1010,13 @@ namespace eval ::apidoc { ...@@ -972,13 +1010,13 @@ namespace eval ::apidoc {
return $score return $score
} }
ad_proc -private is_xotcl_object {scope proc_name} { ad_proc -private is_object {scope proc_name} {
Checks, whether the specified argument is an xotcl object. Checks, whether the specified argument is an xotcl object.
Does not cause problems when xocl is not loaded. Does not cause problems when xocl is not loaded.
@return boolean value @return boolean value
} { } {
set result 0 set result 0
catch {set result [::xotcl::api inscope $scope ::xotcl::Object isobject $proc_name]} catch {set result [::xo::api isobject $scope $proc_name]}
return $result return $result
} }
...@@ -1003,8 +1041,8 @@ namespace eval ::apidoc { ...@@ -1003,8 +1041,8 @@ namespace eval ::apidoc {
} { } {
if {[info commands ::xotcl::api] ne ""} { if {[info commands ::xo::api] ne ""} {
set scope [::xotcl::api scope_from_proc_index $proc_name] set scope [::xo::api scope_from_proc_index $proc_name]
} else { } else {
set scope "" set scope ""
} }
...@@ -1112,6 +1150,35 @@ namespace eval ::apidoc { ...@@ -1112,6 +1150,35 @@ namespace eval ::apidoc {
return $url return $url
} }
ad_proc -private get_doc_url {-cmd -index -root -host} {
foreach i $index r $root {
set result [util_memoize [list ::util::http::get -url $i]]
set page [dict get $result page]
#
# Since man pages contain often a summary of multiple commands, try
# abbreviation in case the full name is not found (e.g. man page "nsv"
# contains "nsv_array", "nsv_set" etc.)
#
set url ""
for {set i [string length $cmd]} {$i > 1} {incr i -1} {
set proc [string range $cmd 0 $i]
set url [apidoc::search_on_webindex \
-page $page \
-root $r \
-host $host \
-proc $proc]
if {$url ne ""} {
ns_log notice "=== cmd <$cmd> --> $url"
return $url
}
}
}
ns_log notice "=== cmd <$cmd> not found on <$index> root <$root> host <$host>"
return ""
}
ad_proc -private pretty_token {kind token} { ad_proc -private pretty_token {kind token} {
Encode the specified token in HTML Encode the specified token in HTML
} { } {
...@@ -1128,6 +1195,8 @@ namespace eval ::apidoc { ...@@ -1128,6 +1195,8 @@ namespace eval ::apidoc {
} { } {
set namespace_provided_p [expr {$proc_namespace ne ""}]
set script [string trimright $script] set script [string trimright $script]
template::head::add_style -style $::apidoc::style template::head::add_style -style $::apidoc::style
...@@ -1135,7 +1204,7 @@ namespace eval ::apidoc { ...@@ -1135,7 +1204,7 @@ namespace eval ::apidoc {
# to api-doc pages. Perhaps we should hyperlink them to the Tcl man pages? # to api-doc pages. Perhaps we should hyperlink them to the Tcl man pages?
# else and elseif are be treated as special cases later # else and elseif are be treated as special cases later
if {[info commands ::xotcl::api] ne ""} { if {[info commands ::xo::api] ne ""} {
set XOTCL_KEYWORDS [list self my next] set XOTCL_KEYWORDS [list self my next]
# Only command names are highlighted, otherwise we could add XOTcl method # Only command names are highlighted, otherwise we could add XOTcl method
# names by [lsort -unique [concat [list self my next] .. # names by [lsort -unique [concat [list self my next] ..
...@@ -1244,28 +1313,71 @@ namespace eval ::apidoc { ...@@ -1244,28 +1313,71 @@ namespace eval ::apidoc {
set procl [length_proc [string range $data $i end]] set procl [length_proc [string range $data $i end]]
set proc_name [string range $data $i $i+$procl] set proc_name [string range $data $i $i+$procl]
if {$proc_name eq "ad_proc"} {
#
# Pretty print comment after ad_proc rather than trying to index keywords
#
set endPos [string first \n $data $i+1]
if {$endPos > -1} {
set line0 [string range $data $i $endPos]
set line [string trim $line0]
#
# Does the line end with a open brace?
#
if {[string index $line end] eq "\{"} {
# Do we have a signature of an
# ad_proc (ad_proc ?-options ...?
# name args) before that?
#
# Note, that this handles just
# single line ad-proc signatures,
# not multi-line argument lists.
set start [string range $line 0 end-1]
set elements 3
for {set idx 1} {[string index [lindex $start $idx] 0] eq "-"} {incr idx} {
incr elements
}
if {[llength $start] == $elements} {
#
# Read next lines until brace is balanced.
#
set comment_start [expr {[string last "\{" $line] + $i}]
set comment_end [expr {$comment_start + 1}]
while {![info complete [string range $data $comment_start $comment_end]]
&& $comment_end < $l} {
incr comment_end
}
if {$comment_end < $l} {
ns_log notice "AD_PROC CAND COMM [string range $data $comment_start $comment_end]"
set url ""
append html \
"<a href='/api-doc/proc-view?proc=ad_proc' title='ad_proc'>" \
[pretty_token proc ad_proc] </a> \
[string range $data $i+7 $comment_start] \
"<span class='comment'>" \
[string range $data $comment_start+1 $comment_end-1] \
"</span>\}"
set i $comment_end
continue
}
}
}
}
}
if {$proc_name eq "*" || $proc_name eq "@"} { if {$proc_name eq "*" || $proc_name eq "@"} {
append html $proc_name append html $proc_name
} elseif {$proc_name in $::apidoc::KEYWORDS ||
([regexp {^::(.*)} $proc_name match had_colons]
&& $had_colons in $::apidoc::KEYWORDS)} {
} elseif {$proc_name in $::apidoc::KEYWORDS ||
([regexp {^::(.*)} $proc_name match had_colons] && $had_colons in $::apidoc::KEYWORDS)} {
set url "/api-doc/proc-view?proc=$proc_name" set url "/api-doc/proc-view?proc=$proc_name"
append html "<a href='[ns_quotehtml $url]' title='Tcl command'>" \ # append html "<a href='[ns_quotehtml $url]' title='Tcl command'>"[pretty_token keyword $proc_name]</a>
[pretty_token keyword $proc_name] </a> append html "<font color=#006F00>[pretty_token keyword $proc_name]</font>"
#append html [pretty_token keyword $proc_name]
} elseif {$proc_name in $XOTCL_KEYWORDS} { } elseif {$proc_name in $XOTCL_KEYWORDS} {
append html [pretty_token keyword $proc_name] append html [pretty_token keyword $proc_name]
} elseif {[is_xotcl_object $scope $proc_name]} {
set url [::xotcl::api object_url \
-show_source 1 -show_methods 2 \
$scope $proc_name]
append html "<a href='[ns_quotehtml $url]' title='XOTcl object'>" \
[pretty_token object $proc_name] </a>
} elseif {[string match "ns*" $proc_name]} { } elseif {[string match "ns*" $proc_name]} {
set url "/api-doc/tcl-proc-view?tcl_proc=$proc_name" set url "/api-doc/tcl-proc-view?tcl_proc=$proc_name"
append html "<a href='[ns_quotehtml $url]' title='[ns_info name] command'>" \ append html "<a href='[ns_quotehtml $url]' title='[ns_info name] command'>" \
...@@ -1276,21 +1388,47 @@ namespace eval ::apidoc { ...@@ -1276,21 +1388,47 @@ namespace eval ::apidoc {
} elseif {$proc_namespace ne "" } elseif {$proc_namespace ne ""
&& [info commands ::${proc_namespace}::${proc_name}] ne ""} { && [info commands ::${proc_namespace}::${proc_name}] ne ""} {
set url [api_proc_url ${proc_namespace}::${proc_name}]
append html "<a href='[ns_quotehtml $url]' title='API command'>" \ if {[is_object $scope ${proc_namespace}::${proc_name}]} {
[pretty_token proc $proc_name] </a> set url [::xo::api object_url \
-show_source 1 -show_methods 2 \
} elseif {[info commands ::$proc_name] ne ""} { $scope ::${proc_namespace}::${proc_name}]
set url [api_proc_url $proc_name] append html "<a href='[ns_quotehtml $url]' title='XOTcl object'>" \
append html "<a href='[ns_quotehtml $url]' title='API command'>" \ [pretty_token object $proc_name] </a>
[pretty_token proc $proc_name] </a> } else {
set url [api_proc_url ${proc_namespace}::${proc_name}]
append html "<a href='[ns_quotehtml $url]' title='API command'>" \
[pretty_token proc $proc_name] </a>
}
} elseif {[info commands ::$proc_name] ne ""} {
set absolute_name [expr {[string match "::*" $proc_name]
? $proc_name
: "::${proc_name}"}]
if {[is_object $scope $absolute_name]} {
set url [::xo::api object_url \
-show_source 1 -show_methods 2 \
$scope $absolute_name]
append html "<a href='[ns_quotehtml $url]' title='XOTcl object'>" \
[pretty_token object $proc_name] </a>
} else {
set url [api_proc_url $proc_name]
append html "<a href='[ns_quotehtml $url]' title='API command'>" \
[pretty_token proc $proc_name] </a>
}
} else { } else {
append html ${proc_name} append html $proc_name
set proc_ok 1 set proc_ok 1
} }
incr i $procl incr i $procl
if {$proc_name eq "namespace" && !$namespace_provided_p} {
set endPos [string first \n $data $i+1]
if {$endPos > -1} {
set line [string range $data $i+1 $endPos]
regexp {\s*eval\s+(::)?(\S+)\s+} $line . . proc_namespace
}
}
if {$proc_name eq "regexp" || $proc_name eq "regsub"} { if {$proc_name eq "regexp" || $proc_name eq "regsub"} {
# #
# Hack for nasty regexp stuff # Hack for nasty regexp stuff
...@@ -1328,7 +1466,7 @@ namespace eval ::apidoc { ...@@ -1328,7 +1466,7 @@ namespace eval ::apidoc {
ad_proc -private xql_links_list { path } { ad_proc -private xql_links_list { path } {
Returns list of xql files related to tcl script file Returns list of xql files related to Tcl script file
@param path path and filename from $::acs::rootdir @param path path and filename from $::acs::rootdir
} { } {
...@@ -1364,16 +1502,8 @@ namespace eval ::apidoc { ...@@ -1364,16 +1502,8 @@ namespace eval ::apidoc {
@return sanitized path @return sanitized path
} { } {
set path [ns_normalizepath $path]
if {[regsub -all {[.][.]/} $path "" shortened_path]} { if {![string match "/$prefix/*" $path]} {
set filename "$::acs::rootdir/$path"
ns_log notice [subst {INTRUDER ALERT:\n\nsomesone tried to snarf '$filename'!
file exists: [file exists $filename] user_id: [ad_conn user_id] peer: [ad_conn peeraddr]
}]
set path $shortened_path
}
if {![string match "$prefix/*" $path]} {
set filename "$::acs::rootdir/$path" set filename "$::acs::rootdir/$path"
ns_log notice [subst {INTRUDER ALERT:\n\nsomesone tried to snarf '$filename'! ns_log notice [subst {INTRUDER ALERT:\n\nsomesone tried to snarf '$filename'!
file exists: [file exists $filename] user_id: [ad_conn user_id] peer: [ad_conn peeraddr] file exists: [file exists $filename] user_id: [ad_conn user_id] peer: [ad_conn peeraddr]
...@@ -1413,7 +1543,7 @@ ad_proc api_proc_link { proc } { ...@@ -1413,7 +1543,7 @@ ad_proc api_proc_link { proc } {
@author Lars Pind (lars@pinds.com) @author Lars Pind (lars@pinds.com)
@creation-date 14 July 2000 @creation-date 14 July 2000
} { } {
return "<a href=\"[ns_htmlencode [api_proc_url $proc]]\">$proc</a>" return "<a href=\"[ns_quotehtml [api_proc_url $proc]]\">$proc</a>"
} }
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<if @source_link@ ne 0> <if @source_link@ ne 0>
<p> <p>
<if @source_p@ eq 0> <if @source_p;literal@ false>
[ <a href="content-page-view?@url_vars@&amp;source_p=1">show source</a> ] [ <a href="content-page-view?@url_vars@&amp;source_p=1">show source</a> ]
</if> </if>
<else> <else>
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
the default</a> ] the default</a> ]
</if> </if>
<if @source_p@ eq 1> <if @source_p;literal@ true>
<h4>Content File Source</h4> <h4>Content File Source</h4>
<!-- directly display file contents var to avoid translating i18n strings etc --> <!-- directly display file contents var to avoid translating i18n strings etc -->
......
...@@ -11,7 +11,7 @@ ad_page_contract { ...@@ -11,7 +11,7 @@ ad_page_contract {
@cvs-id $Id$ @cvs-id $Id$
} { } {
version_id:naturalnum,optional version_id:naturalnum,optional
source_p:boolean,optional,trim source_p:boolean,optional,trim,notnull
path:trim,notnull path:trim,notnull
} -properties { } -properties {
title:onevalue title:onevalue
...@@ -26,6 +26,7 @@ set default_source_p [ad_get_client_property -default 0 acs-api-browser api_doc_ ...@@ -26,6 +26,7 @@ set default_source_p [ad_get_client_property -default 0 acs-api-browser api_doc_
if { ![info exists source_p] } { if { ![info exists source_p] } {
set source_p $default_source_p set source_p $default_source_p
if {$source_p eq ""} {set source_p 0}
} }
if { ![info exists version_id] && if { ![info exists version_id] &&
...@@ -67,7 +68,7 @@ if {![file readable $::acs::rootdir/$path] || [file isdirectory $::acs::rootdir/ ...@@ -67,7 +68,7 @@ if {![file readable $::acs::rootdir/$path] || [file isdirectory $::acs::rootdir/
} }
set mime_type [ns_guesstype $path] set mime_type [ns_guesstype $path]
if {![string match "text/*" $mime_type]} { if {![string match "text/*" $mime_type] && [file extension $path] ne ".xql"} {
set source_p 0 set source_p 0
set source_link 0 set source_link 0
} else { } else {
...@@ -75,7 +76,11 @@ if {![string match "text/*" $mime_type]} { ...@@ -75,7 +76,11 @@ if {![string match "text/*" $mime_type]} {
} }
if { $source_p } { if { $source_p } {
set file_contents [template::util::read_file $::acs::rootdir/$path] set file_contents [template::util::read_file $::acs::rootdir/$path]
set file_contents [apidoc::tclcode_to_html $file_contents] if {[file extension $path] eq ".tcl"} {
set file_contents [apidoc::tclcode_to_html $file_contents]
} else {
set file_contents [ns_quotehtml $file_contents]
}
} }
template::util::list_to_multirow xql_links [::apidoc::xql_links_list $path] template::util::list_to_multirow xql_links [::apidoc::xql_links_list $path]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<ul> <ul>
<multiple name="deprecated"> <multiple name="deprecated">
<li><a <li><a
href="proc-view?proc=@deprecated.proc@">@deprecated.proc@</a> <i>@deprecated.args@</i> href="proc-view?proc=@deprecated.proc@">@deprecated.proc@</a> <em>@deprecated.args@</em>
</multiple> </multiple>
</ul> </ul>
......
...@@ -36,7 +36,7 @@ if {$version_id ne ""} { ...@@ -36,7 +36,7 @@ if {$version_id ne ""} {
where version_id = :version_id where version_id = :version_id
} }
if {[info exists pretty_name]} { if {[info exists pretty_name]} {
lappend context [list "package-view?version_id=$version_id&amp;kind=sql_files" "$pretty_name $version_name"] lappend context [list [export_vars -base package-view {version_id {kind sql_files}}] "$pretty_name $version_name"]
} }
} }
lappend context [file tail $url] lappend context [file tail $url]
......
...@@ -10,7 +10,7 @@ ad_page_contract { ...@@ -10,7 +10,7 @@ ad_page_contract {
@author Lars Pind (lars@pinds.com) @author Lars Pind (lars@pinds.com)
@cvs-id $Id$ @cvs-id $Id$
} { } {
about_package_key:optional about_package_key:token,trim,optional
} -properties { } -properties {
title:onevalue title:onevalue
context:onevalue context:onevalue
......
...@@ -22,12 +22,8 @@ set context [list {"plsql-subprograms-all" "All PL/SQL Subprograms"} "One PL/SQL ...@@ -22,12 +22,8 @@ set context [list {"plsql-subprograms-all" "All PL/SQL Subprograms"} "One PL/SQL
set source_text "" set source_text ""
db_foreach source_text "select text db_foreach source_text {} {
from user_source append source_text $text \n\n\n
where name = upper(:name)
and type = upper(:type)
order by line" {
append source_text $text
} }
switch $type { switch $type {
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<fullquery name="all_subprograms"> <fullquery name="all_subprograms">
<querytext> <querytext>
select object_type as type, object_name as name select object_type as type, object_name as name, 0 as nargs
from user_objects from user_objects
where object_type in ('PACKAGE', 'PROCEDURE', 'FUNCTION') where object_type in ('PACKAGE', 'PROCEDURE', 'FUNCTION')
order by order by
......
...@@ -6,11 +6,11 @@ ...@@ -6,11 +6,11 @@
<fullquery name="all_subprograms"> <fullquery name="all_subprograms">
<querytext> <querytext>
select proname as name, 'FUNCTION' as type select proname as name, 'FUNCTION' as type, pronargs as nargs
from pg_proc from pg_proc
where proowner=(select usesysid from pg_user where proowner=(select usesysid from pg_user
where usename = current_user) where usename = current_user)
order by proname order by proname, pronargs
</querytext> </querytext>
</fullquery> </fullquery>
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<ul> <ul>
<group column="type"> <group column="type">
<li><a href="plsql-subprogram-one?type=<%= [ns_urlencode @all_subprograms.type@] %>&name=<%= [ns_urlencode @all_subprograms.name@] %>"><code><%= [string tolower @all_subprograms.name@] %></code></a></li> <li><a href="@all_subprograms.url;noi18n@"><code>@all_subprograms.label@</code></a></li>
</group> </group>
</ul> </ul>
......
...@@ -16,9 +16,15 @@ set context [list "All PL/SQL Subprograms"] ...@@ -16,9 +16,15 @@ set context [list "All PL/SQL Subprograms"]
# #
# Organize the subprograms und types like FUNCTION, PROCEDURE, and # Organize the subprograms und types like FUNCTION, PROCEDURE, and
# PACKAGE in oracle or FUNCTION in PostgresSQL # PACKAGE in oracle or FUNCTION in PostgreSQL
# #
db_multirow all_subprograms all_subprograms {} db_multirow -extend { url label } all_subprograms all_subprograms {} {
set url [export_vars -base plsql-subprogram-one {type name}]
set label [string tolower $name]
if {$nargs > 0} {
append label /$nargs
}
}
# Local variables: # Local variables:
# mode: tcl # mode: tcl
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<multiple name="proc_list"> <multiple name="proc_list">
<% if { $proc_list(file) != $last_file } { %> <% if { $proc_list(file) != $last_file } { %>
<% if {[incr count] >1} { %> </ul> <% } %> <% if {[incr count] >1} { %> </ul> <% } %>
<b>@proc_list.file@</b> <ul> <strong>@proc_list.file@</strong> <ul>
<% set last_file @proc_list.file@ %> <% set last_file @proc_list.file@ %>
<% } %> <% } %>
<li><a href="@proc_list.url@">@proc_list.proc@</a> <li><a href="@proc_list.url@">@proc_list.proc@</a>
......
...@@ -42,9 +42,9 @@ foreach proc [nsv_array names api_proc_doc] { ...@@ -42,9 +42,9 @@ foreach proc [nsv_array names api_proc_doc] {
lappend matches [list $proc $doc_elements(script)] lappend matches [list $proc $doc_elements(script)]
} elseif {$type eq "Deprecated" && $doc_elements(deprecated_p)} { } elseif {$type eq "Deprecated" && $doc_elements(deprecated_p)} {
lappend matches [list $proc $doc_elements(script)] lappend matches [list $proc $doc_elements(script)]
} elseif {$type eq "Private" && $doc_elements(private_p) } { } elseif {$type eq "Private" && $doc_elements(protection) eq "private" } {
lappend matches [list $proc $doc_elements(script)] lappend matches [list $proc $doc_elements(script)]
} elseif {$type eq "Public" && $doc_elements(public_p) } { } elseif {$type eq "Public" && $doc_elements(protection) eq "public" } {
lappend matches [list $proc $doc_elements(script)] lappend matches [list $proc $doc_elements(script)]
} }
} }
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<ul> <ul>
<multiple name="results"> <multiple name="results">
<li> <if @results.score@ lt 10>&nbsp;&nbsp;</if>@results.score@: <a href="@results.url@">@results.proc@</a> <li> <if @results.score@ lt 10>&nbsp;&nbsp;</if>@results.score@: <a href="@results.url@">@results.proc@</a>
<i>@results.args;noquote@</i> <em>@results.args;noquote@</em>
</multiple> </multiple>
</ul> </ul>
...@@ -21,40 +21,40 @@ No results found ...@@ -21,40 +21,40 @@ No results found
<if @private_results:rowcount@ gt 0> <if @private_results:rowcount@ gt 0>
<if @show_private_p@ true> <if @show_private_p;literal@ true>
<p> <p>
<b>Show</b> | <a href="@hide_private_url@">Hide</a> <b>@private_results:rowcount@ private</b> procedure matches <strong>Show</strong> | <a href="@hide_private_url@">Hide</a> <strong>@private_results:rowcount@ private</strong> procedure matches
</p> </p>
<ul> <ul>
<multiple name="private_results"> <multiple name="private_results">
<li><if @private_results.score@ lt 10>&nbsp;&nbsp;</if>@private_results.score@: <a href="@private_results.url@">@private_results.proc@</a> <li><if @private_results.score@ lt 10>&nbsp;&nbsp;</if>@private_results.score@: <a href="@private_results.url@">@private_results.proc@</a>
<i>@private_results.args;noquote@</i> <em>@private_results.args;noquote@</em>
</multiple> </multiple>
</ul> </ul>
</if> </if>
<else> <else>
<p> <p>
<a href="@show_private_url@">Show</a> | <b>Hide</b> <b>@private_results:rowcount@ private</b> procedure matches <a href="@show_private_url@">Show</a> | <strong>Hide</strong> <strong>@private_results:rowcount@ private</strong> procedure matches
</p> </p>
</else> </else>
</if> </if>
<if @deprecated_results:rowcount@ gt 0> <if @deprecated_results:rowcount@ gt 0>
<if @show_deprecated_p@ true> <if @show_deprecated_p;literal@ true>
<p> <p>
<b>Show</b> | <a href="@hide_deprecated_url@">Hide</a> <b>@deprecated_results:rowcount@ deprecated</b> procedure matches <strong>Show</strong> | <a href="@hide_deprecated_url@">Hide</a> <strong>@deprecated_results:rowcount@ deprecated</strong> procedure matches
</p> </p>
<ul> <ul>
<multiple name="deprecated_results"> <multiple name="deprecated_results">
<li><if @deprecated_results.score@ lt 10>&nbsp;&nbsp;</if>@deprecated_results.score@: <a href="@deprecated_results.url@">@deprecated_results.proc@</a> <li><if @deprecated_results.score@ lt 10>&nbsp;&nbsp;</if>@deprecated_results.score@: <a href="@deprecated_results.url@">@deprecated_results.proc@</a>
<i>@deprecated_results.args;noquote@</i> <em>@deprecated_results.args;noquote@</em>
</multiple> </multiple>
</ul> </ul>
</if> </if>
<else> <else>
<p> <p>
<a href="@show_deprecated_url@">Show</a> | <b>Hide</b> <b>@deprecated_results:rowcount@ deprecated</b> procedure matches <a href="@show_deprecated_url@">Show</a> | <strong>Hide</strong> <strong>@deprecated_results:rowcount@ deprecated</strong> procedure matches
</p> </p>
</else> </else>
</if> </if>
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
ad_page_contract { ad_page_contract {
Searches for procedures with containing query_string Searches for procedures with containing query_string
if lucky redirects to best match if lucky redirects to best match
Weight the different hits with the propper weights Weight the different hits with the proper weights
Shows a list of returned procs with links to proc-view Shows a list of returned procs with links to proc-view
...@@ -13,14 +13,14 @@ ad_page_contract { ...@@ -13,14 +13,14 @@ ad_page_contract {
@creation-date Jul 14, 2000 @creation-date Jul 14, 2000
@cvs-id $Id$ @cvs-id $Id$
} { } {
{name_weight:optional 0} {name_weight:notnull 0}
{doc_weight:integer,optional 0} {doc_weight:integer,notnull 0}
{param_weight:integer,optional 0} {param_weight:integer,notnull 0}
{source_weight:integer,optional 0} {source_weight:integer,notnull 0}
{search_type:optional 0} {search_type:optional 0}
{show_deprecated_p:boolean 0} {show_deprecated_p:boolean,notnull 0}
{show_private_p:boolean 0} {show_private_p:boolean,notnull 0}
query_string {query_string:token,notnull}
} -properties { } -properties {
title:onevalue title:onevalue
context:onevalue context:onevalue
...@@ -30,6 +30,8 @@ ad_page_contract { ...@@ -30,6 +30,8 @@ ad_page_contract {
source_weight:onevalue source_weight:onevalue
query_string:onevalue query_string:onevalue
results:multirow results:multirow
} -validate {
csrf { csrf::validate }
} }
########################################################## ##########################################################
...@@ -132,7 +134,7 @@ foreach proc [nsv_array names api_proc_doc] { ...@@ -132,7 +134,7 @@ foreach proc [nsv_array names api_proc_doc] {
if { $doc_elements(deprecated_p) } { if { $doc_elements(deprecated_p) } {
lappend deprecated_matches [list $proc $score $args] lappend deprecated_matches [list $proc $score $args]
} else { } else {
if { $doc_elements(public_p) } { if { $doc_elements(protection) eq "public" } {
lappend matches [list $proc $score $args] lappend matches [list $proc $score $args]
} else { } else {
lappend private_matches [list $proc $score $args] lappend private_matches [list $proc $score $args]
...@@ -168,10 +170,15 @@ foreach output $deprecated_matches { ...@@ -168,10 +170,15 @@ foreach output $deprecated_matches {
set url [api_proc_url $proc] set url [api_proc_url $proc]
multirow append deprecated_results $score $proc $args $url multirow append deprecated_results $score $proc $args $url
} }
global __csrf_token
set show_deprecated_url [export_vars -base [ad_conn url] -override { { show_deprecated_p 1 } } { name_weight doc_weight param_weight source_weight search_type query_string show_private_p }] set show_deprecated_url [export_vars -base [ad_conn url] -override {{ show_deprecated_p 1 }} {
name_weight doc_weight param_weight source_weight search_type query_string show_private_p __csrf_token
}]
set hide_deprecated_url [export_vars -base [ad_conn url] -override { { show_deprecated_p 0 } } { name_weight doc_weight param_weight source_weight search_type query_string show_private_p }] set hide_deprecated_url [export_vars -base [ad_conn url] -override { { show_deprecated_p 0 } } {
name_weight doc_weight param_weight source_weight search_type query_string show_private_p __csrf_token
}]
multirow create private_results score proc args url multirow create private_results score proc args url
...@@ -183,9 +190,12 @@ foreach output $private_matches { ...@@ -183,9 +190,12 @@ foreach output $private_matches {
multirow append private_results $score $proc $args $url multirow append private_results $score $proc $args $url
} }
set show_private_url [export_vars -base [ad_conn url] -override { { show_private_p 1 } } { name_weight doc_weight param_weight source_weight search_type query_string show_deprecated_p }] set show_private_url [export_vars -base [ad_conn url] -override { { show_private_p 1 } } {
name_weight doc_weight param_weight source_weight search_type query_string show_deprecated_p __csrf_token
set hide_private_url [export_vars -base [ad_conn url] -override { { show_private_p 0 } } { name_weight doc_weight param_weight source_weight search_type query_string show_deprecated_p }] }]
set hide_private_url [export_vars -base [ad_conn url] -override { { show_private_p 0 } } {
name_weight doc_weight param_weight source_weight search_type query_string show_deprecated_p __csrf_token
}]
# Local variables: # Local variables:
# mode: tcl # mode: tcl
......
<master> <master>
<property name="doc(title)">@title;literal@</property> <property name="doc(title)">@title;literal@</property>
<property name="context">@context;literal@</property> <property name="context">@context;literal@</property>
<property name="head">
<style type="text/css">
div.api-doc {background: #e4e4e4;}
div.api-doc dd {margin-left: 2em;}
</style>
</property>
<if @error_msg@ ne ""> <if @error_msg@ ne "">
@error_msg;noquote@ @error_msg;noquote@
</if> </if>
<else> <else>
<table width="100%"> <div class="api-doc">
<tr><td style="background: #eeeeee">@documentation;literal@</td></tr> @documentation;literal@
</div>
</table> </table>
<if @source_p@ eq 0> <if @source_p;literal@ false>
[ <a href="@procViewToggleURL;noi18n@">show source</a> ] [ <a href="@procViewToggleURL;noi18n@">show source</a> ]
</if> </if>
<else> <else>
......
...@@ -36,8 +36,9 @@ set default_source_p [ad_get_client_property -default 0 acs-api-browser api_doc_ ...@@ -36,8 +36,9 @@ set default_source_p [ad_get_client_property -default 0 acs-api-browser api_doc_
set return_url [export_vars -base [ad_conn url] {proc version_id}] set return_url [export_vars -base [ad_conn url] {proc version_id}]
set error_msg "" set error_msg ""
if { ![info exists source_p] } { if { ![info exists source_p] || $source_p eq ""} {
set source_p $default_source_p set source_p $default_source_p
if {$source_p eq ""} {set source_p 0}
} }
if {[string match ::* $proc]} { if {[string match ::* $proc]} {
...@@ -75,33 +76,43 @@ proc $proc {[info args $proc]} { ...@@ -75,33 +76,43 @@ proc $proc {[info args $proc]} {
} }
</pre></p> </pre></p>
}] }]
} elseif {[info commands $absolute_proc] eq $absolute_proc} { } elseif {[info commands $absolute_proc] eq $absolute_proc} {
set result [util_memoize [list ::util::http::get -url $::apidoc::ns_api_html_index]] #
set page [dict get $result page] # In case the cmd is an object, redirect to the object browser
#
set url [apidoc::search_on_webindex \ if {[info commands ::nsf::is] ne "" && [nsf::is object $absolute_proc]} {
-page $page \ ad_returnredirect [export_vars -base /xotcl/show-object {{object $absolute_proc}}]
-root $::apidoc::ns_api_root \
-host $::apidoc::ns_api_host \
-proc $relative_proc]
if {$url ne ""} {
ns_log notice "api-doc/www/proc-view got URL <$url>"
ad_returnredirect -allow_complete_url $url
ad_script_abort ad_script_abort
} }
set result [util_memoize [list ::util::http::get -url $::apidoc::tcl_api_html_index]] #
set page [dict get $result page] # Try NaviSever API documentation
#
# Strip the end of the Tcl-URL to obtain the root set url [apidoc::get_doc_url \
regexp {^(.*)/[^/]+} $::apidoc::tcl_api_html_index _ root -cmd $relative_proc \
append root / -index $::apidoc::ns_api_html_index \
-root $::apidoc::ns_api_root \
-host $::apidoc::ns_api_host]
if {$url eq ""} {
#
# Try Tcl command documentation
#
regexp {^(.*)/[^/]+} $::apidoc::tcl_api_html_index _ root
append root /
set url [apidoc::get_doc_url \
-cmd $proc \
-index $::apidoc::tcl_api_html_index \
-root $root \
-host $root]
}
set url [apidoc::search_on_webindex -page $page -root $root -host $root -proc $proc]
if {$url ne ""} { if {$url ne ""} {
ns_log notice "api-doc/www/proc-view got URL <$url>"
ad_returnredirect -allow_complete_url $url ad_returnredirect -allow_complete_url $url
ad_script_abort ad_script_abort
} }
...@@ -111,7 +122,7 @@ proc $proc {[info args $proc]} { ...@@ -111,7 +122,7 @@ proc $proc {[info args $proc]} {
<p>The command <b>$proc</b> is an available command on <p>The command <b>$proc</b> is an available command on
the server and might be found in the <a the server and might be found in the <a
href="$::apidoc::tcl_api_html_index">Tcl</a> href="$::apidoc::tcl_api_html_index">Tcl</a>
or <a href="$::apidoc::ns_api_html_index">[ns_info name]</a> or <a href="[lindex $::apidoc::ns_api_html_index 0]">[ns_info name]</a>
documentation or in documentation for a loadable module. documentation or in documentation for a loadable module.
</p> </p>
}] }]
......
...@@ -2,3 +2,9 @@ ...@@ -2,3 +2,9 @@
set query_string [string range [ad_conn extra_url] [string length "proc/"] end] set query_string [string range [ad_conn extra_url] [string length "proc/"] end]
set url [export_vars -base [ad_conn package_url]proc-search { query_string { search_type "Feeling Lucky" } }] set url [export_vars -base [ad_conn package_url]proc-search { query_string { search_type "Feeling Lucky" } }]
ad_returnredirect $url ad_returnredirect $url
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
<property name="context">@context;literal@</property> <property name="context">@context;literal@</property>
<property name="head"> <property name="head">
<style type="text/css"> <style type="text/css">
td.doc {background: #e4e4e4;} div.api-doc {background: #e4e4e4;}
dd {margin-left: 2em;}
</style> </style>
</property> </property>
...@@ -23,13 +24,12 @@ ...@@ -23,13 +24,12 @@
<h3>Detailed information</h3> <h3>Detailed information</h3>
<multiple name="proc_doc_list"> <multiple name="proc_doc_list">
<table width="100%"> <div class="api-doc">
<tr><td class="doc">@proc_doc_list.doc;noquote@</td></tr> @proc_doc_list.doc;noquote@
</table> </div>
&nbsp;<p>
</multiple> </multiple>
<if @source_p@ eq 0> <if @source_p;literal@ false>
[ <a href="procs-file-view?@url_vars@&amp;source_p=1">show source</a> ] [ <a href="procs-file-view?@url_vars@&amp;source_p=1">show source</a> ]
</if> </if>
<else> <else>
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
the default</a> ] the default</a> ]
</if> </if>
<if @source_p@ eq 1> <if @source_p;literal@ true>
<h4>Content File Source</h4> <h4>Content File Source</h4>
<!-- directly display file contents var to avoid translating i18n strings etc --> <!-- directly display file contents var to avoid translating i18n strings etc -->
......
...@@ -3,10 +3,10 @@ ad_page_contract { ...@@ -3,10 +3,10 @@ ad_page_contract {
@cvs-id $Id$ @cvs-id $Id$
} { } {
version_id:naturalnum,optional version_id:naturalnum,optional,notnull
{ public_p:boolean "" } { public_p:boolean "" }
path:path,trim path:path,trim
source_p:boolean,optional,trim source_p:boolean,optional,trim,notnull
} -properties { } -properties {
title:onevalue title:onevalue
context:onevalue context:onevalue
...@@ -18,12 +18,14 @@ ad_page_contract { ...@@ -18,12 +18,14 @@ ad_page_contract {
set url_vars [export_vars {path version_id}] set url_vars [export_vars {path version_id}]
set return_url [ns_urlencode [ad_conn url]?][ns_urlencode $url_vars] set return_url [ns_urlencode [ad_conn url]?][ns_urlencode $url_vars]
set default_source_p [ad_get_client_property -default 0 acs-api-browser api_doc_source_p] set default_source_p [ad_get_client_property -default 0 acs-api-browser api_doc_source_p]
if { ![info exists source_p] } { if { ![info exists source_p] } {
set source_p $default_source_p set source_p $default_source_p
if {$source_p eq ""} {set source_p 0}
} }
if { ![info exists version_id] && if { ![info exists version_id]
[regexp {^packages/([^ /]+)/} $path "" package_key] } { && [regexp {^packages/([^ /]+)/} $path "" package_key] } {
db_0or1row version_id_from_package_key { db_0or1row version_id_from_package_key {
select version_id select version_id
from apm_enabled_package_versions from apm_enabled_package_versions
...@@ -32,7 +34,7 @@ if { ![info exists version_id] && ...@@ -32,7 +34,7 @@ if { ![info exists version_id] &&
} }
set path [apidoc::sanitize_path $path] set path [apidoc::sanitize_path $path]
if {![file readable $::acs::rootdir/$path] || [file isdirectory $::acs::rootdir/$path]} { if {![file readable ${::acs::rootdir}$path] || [file isdirectory ${::acs::rootdir}$path]} {
if {[info exists version_id]} { if {[info exists version_id]} {
set kind procs set kind procs
set href [export_vars -base [ad_conn package_url]/package-view {version_id {kind procs}}] set href [export_vars -base [ad_conn package_url]/package-view {version_id {kind procs}}]
...@@ -76,6 +78,7 @@ if { [info exists version_id] } { ...@@ -76,6 +78,7 @@ if { [info exists version_id] } {
} }
set path [string trimleft $path /]
lappend context [file tail $path] lappend context [file tail $path]
set title [file tail $path] set title [file tail $path]
...@@ -90,7 +93,7 @@ if { [nsv_exists api_proc_doc_scripts $path] } { ...@@ -90,7 +93,7 @@ if { [nsv_exists api_proc_doc_scripts $path] } {
foreach proc [lsort [nsv_get api_proc_doc_scripts $path]] { foreach proc [lsort [nsv_get api_proc_doc_scripts $path]] {
if { $public_p } { if { $public_p } {
array set doc_elements [nsv_get api_proc_doc $proc] array set doc_elements [nsv_get api_proc_doc $proc]
if { !$doc_elements(public_p) } { if { $doc_elements(protection) ne "public"} {
continue continue
} }
} }
...@@ -99,7 +102,7 @@ if { [nsv_exists api_proc_doc_scripts $path] } { ...@@ -99,7 +102,7 @@ if { [nsv_exists api_proc_doc_scripts $path] } {
foreach proc [lsort [nsv_get api_proc_doc_scripts $path]] { foreach proc [lsort [nsv_get api_proc_doc_scripts $path]] {
if { $public_p } { if { $public_p } {
array set doc_elements [nsv_get api_proc_doc $proc] array set doc_elements [nsv_get api_proc_doc $proc]
if { !$doc_elements(public_p) } { if { $doc_elements(protection) ne "public"} {
continue continue
} }
} }
......
ad_page_contract { ad_page_contract {
Set user preferences for API browsing. Set user preferences for API browsing.
} { } {
source_p:boolean,optional,notnull source_p:boolean,notnull
return_url return_url:localurl
} }
set found_p 0 ad_set_client_property -persistent t acs-api-browser api_doc_source_p $source_p
if { [info exists source_p] } { ad_returnredirect $return_url
ad_set_client_property -persistent t acs-api-browser api_doc_source_p $source_p
set found_p 1
}
if { $found_p } {
ad_returnredirect $return_url
} else {
ad_return_error "Unknown Property" "Couldn't find any property to set"
}
# Local variables: # Local variables:
# mode: tcl # mode: tcl
......
...@@ -6,16 +6,18 @@ Sorry, no Tcl procedures were found with that name. ...@@ -6,16 +6,18 @@ Sorry, no Tcl procedures were found with that name.
<p> <p>
You can try searching the <a href="@tcl_docs_url@">Tcl documentation</a> yourself. You can try searching the <a href="@tcl_docs_url;noi18n@">Tcl documentation</a> yourself.
<p> <p>
<table cellpadding="5"> <table cellpadding="5">
<tr> <tr>
<td bgcolor="#dddddd"> <td bgcolor="#dddddd">
<form action=tcl-doc-search method=get> <form action="tcl-doc-search" method="get">
<b>Tcl Documentation Search:</b><br> <strong>Tcl Documentation Search:</strong><br>
<input type="text" name="tcl_proc" value="@tcl_proc@"> <input type="submit" value="Go"><br> <input type="text" name="tcl_proc" value="@tcl_proc@">
<if @::__csrf_token@ defined><input type="hidden" name="__csrf_token" value="@::__csrf_token;literal@"></if>
<input type="submit" value="Go"><br>
</form> </form>
</td> </td>
</tr> </tr>
......
...@@ -7,30 +7,31 @@ ad_page_contract { ...@@ -7,30 +7,31 @@ ad_page_contract {
title:onevalue title:onevalue
context:onevalue context:onevalue
tcl_proc:onevalue tcl_proc:onevalue
} -validate {
csrf { csrf::validate }
} }
set tcl_docs_root "http://tcl.tk/man/tcl[info tclversion]/TclCmd/"
set tcl_docs_url "${tcl_docs_root}contents.htm"
with_catch errmsg { #
set tcl_docs_index_result [util_memoize [list util::http::get -url $tcl_docs_url]] # Try Tcl command documentation
set tcl_docs_index_page [dict get $tcl_docs_index_result page] #
} {
ad_return_error "Cannot Connect" "We're sorry, but we're having problems connecting to the server containing the Tcl documentation: $tcl_docs_url"
ad_script_abort
}
set tcl_proc [lindex $tcl_proc 0] regexp {^(.*)/[^/]+} $::apidoc::tcl_api_html_index _ root
set len [string length $tcl_proc] append root /
for { set i [expr { $len-1 }] } { $i >= 0 } { incr i -1 } { set url [apidoc::get_doc_url \
set search_for [string range $tcl_proc 0 $i] -cmd $tcl_proc \
if { [regexp "<a href=\"(\[^>\]+)\">$search_for</a>" $tcl_docs_index_page match relative_url] } { -index $::apidoc::tcl_api_html_index \
ad_returnredirect -allow_complete_url "$tcl_docs_root$relative_url" -root $root \
ad_script_abort -host $root]
}
if {$url ne ""} {
ns_log notice "api-doc/www/proc-view got URL <$url>"
ad_returnredirect -allow_complete_url $url
ad_script_abort
} }
set tcl_docs_url $::apidoc::tcl_api_html_index
set title "Tcl API Procedure Search for: \"$tcl_proc\"" set title "Tcl API Procedure Search for: \"$tcl_proc\""
set context [list "Tcl API Search: $tcl_proc"] set context [list "Tcl API Search: $tcl_proc"]
......
...@@ -6,14 +6,16 @@ Sorry, no <%= [ns_info name]%> Tcl API procedures were found with that name. ...@@ -6,14 +6,16 @@ Sorry, no <%= [ns_info name]%> Tcl API procedures were found with that name.
<p> <p>
You can try searching the <a href="@apidoc::ns_api_html_index@"><%= [ns_info name]%> documentation</a> yourself. You can try searching the <a href="@doc_url;noi18n@"><%= [ns_info name]%> documentation</a> yourself.
<p> <p>
<div style="background: #dddddd; display: inline-block; padding: 5px;"> <div style="background: #dddddd; display: inline-block; padding: 5px;">
<form action=tcl-proc-view method=get> <form action="tcl-proc-view" method="get">
<div><b>Tcl Api Search:</b><br> <div><strong>Tcl Api Search:</strong><br>
<input type="text" name="tcl_proc" value="@tcl_proc@"> <input type="submit" value="Go"><br> <input type="text" name="tcl_proc" value="@tcl_proc@">
<!-- <if @::__csrf_token@ defined><input type="hidden" name="__csrf_token" value="@::__csrf_token;literal@"></if> -->
<input type="submit" value="Go"><br>
</div> </div>
</form> </form>
</div> </div>
\ No newline at end of file
...@@ -7,25 +7,14 @@ ad_page_contract { ...@@ -7,25 +7,14 @@ ad_page_contract {
title:onevalue title:onevalue
context:onevalue context:onevalue
tcl_proc:onevalue tcl_proc:onevalue
} -validate {
csrf { csrf::validate }
} }
set ns_api_index_result [util_memoize [list ::util::http::get -url $::apidoc::ns_api_html_index]] set url [apidoc::get_doc_url -cmd $tcl_proc \
set ns_api_index_page [dict get $ns_api_index_result page] -index $::apidoc::ns_api_html_index \
-root $::apidoc::ns_api_root \
# -host $::apidoc::ns_api_host]
# Since man pages contain often a summary of multiple commands, try
# abbreviation in case the full name is not found (e.g. man page "nsv"
# contains "nsv_array", "nsv_set" etc.)
#
for {set i [string length $tcl_proc]} {$i > 1} {incr i -1} {
set proc [string range $tcl_proc 0 $i]
set url [apidoc::search_on_webindex \
-page $ns_api_index_page \
-root $::apidoc::ns_api_root \
-host $::apidoc::ns_api_host \
-proc $proc]
if {$url ne ""} break
}
if {$url ne ""} { if {$url ne ""} {
ad_returnredirect -allow_complete_url $url ad_returnredirect -allow_complete_url $url
...@@ -34,7 +23,7 @@ if {$url ne ""} { ...@@ -34,7 +23,7 @@ if {$url ne ""} {
set title "[ns_info name] Tcl API Search for: \"$tcl_proc\"" set title "[ns_info name] Tcl API Search for: \"$tcl_proc\""
set context [list "Tcl API Search: $tcl_proc"] set context [list "Tcl API Search: $tcl_proc"]
set doc_url [lindex $::apidoc::ns_api_html_index 0]
# Local variables: # Local variables:
# mode: tcl # mode: tcl
# tcl-indent-level: 4 # tcl-indent-level: 4
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment