• Publicity: Public Only All

deprecated-procs.tcl

Provides a collection of deprecated procs to provide backward compatibility for sites who have not yet removed calls to the deprecated functions. In order to skip loading of deprecated code, use the following snippet in your config file ns_section ns/server/${server}/acs ns_param WithDeprecatedCode 0

Location:
packages/acs-templating/tcl/deprecated-procs.tcl
CVS Identification:
$Id: deprecated-procs.tcl,v 1.10 2024/09/11 06:15:48 gustafn Exp $

Procedures in this file

Detailed information

[ hide source ] | [ make this the default ]

Content File Source

ad_library {

    Provides a collection of deprecated procs to provide backward
    compatibility for sites who have not yet removed calls to the
    deprecated functions.

    In order to skip loading of deprecated code, use the following
    snippet in your config file

        ns_section ns/server/${server}/acs
            ns_param WithDeprecatedCode 0
    
    @cvs-id $Id: deprecated-procs.tcl,v 1.10 2024/09/11 06:15:48 gustafn Exp $
}

if {![ad_with_deprecated_code_p]} {
    ns_log notice "deprecated-procs: skip deprecated code"
    return
}
ns_log notice "deprecated-procs include deprecated code"

namespace eval template {}
namespace eval template::util {}

ad_proc -public -deprecated template::util::get_cookie { name {default_value ""} } {
    Retrieve the value of a cookie and return it
    Return the default if no such cookie exists

    @see ad_get_cookie
} {
    set headers [ns_conn headers]
    set cookie [ns_set iget $headers Cookie]

    if { [regexp "$name=(\[^;\]+)" $cookie match value] } {
    return [ns_urldecode $value]
    }

    return $default_value
}

ad_proc -public -deprecated template::util::set_cookie { expire_state name value { domain "" } } {
    Create a cookie with specified parameters.  The expiration state
    may be persistent, session, or a number of minutes from the current
    time.

    @see ad_set_cookie
} {

    if { [string match $domain {}] } {
    set path "ns/server/[ns_info server]/module/nssock"
    set domain [ns_config $path Hostname]
    }

    set cookie "$name=[ns_urlencode $value]; path=/; domain=$domain"

    switch -- $expire_state {

    persistent {
        append cookie ";expires=Wed, 01-Jan-2020 01:00:00 GMT"
    }

    "" -
    session {
    }

    default {

        set time [expr {[ns_time] + ($expire_state * 60)}]
        append cookie ";expires=[ns_httptime $time]"
    }
    }

    ns_set put [ns_conn outputheaders] "Set-Cookie" $cookie
}

ad_proc -public -deprecated template::util::clear_cookie { name { domain "" } } {
    Expires an existing cookie.

    @see ad_get_cookie

} {
    if { [string match $domain {}] } {
    set path "ns/server/[ns_info server]/module/nssock"
    set domain [ns_config $path Hostname]
    }

    set cookie "$name=expired; path=/; domain=$domain;"
    append cookie "expires=Tue, 01-Jan-1980 01:00:00 GMT"

    ns_set put [ns_conn outputheaders] "Set-Cookie" $cookie
}

d_proc -deprecated -public template::util::quote_html {
    html
} {
    Quote possible HTML tags in the contents of the html parameter.
    @see ns_quotehtml
} {

    return [ns_quotehtml $html]
}


ad_proc -deprecated -public template::util::multirow_foreach { name code_text } {
    runs a block of code foreach row in a multirow.

    Using "template::multirow foreach" is recommended over this routine.

    @param name the name of the multirow over which the block of
    code is iterated

    @param code_text the block of code in the for loop; this block can
    reference any of the columns belonging to the
    multirow specified; with the multirow named
    "fake_multirow" containing columns named "spanky"
    and "foobar",to set the column spanky to the value
    of column foobar use:<br>
    <code>set fake_multirow.spanky @fake_multirow.foobar@</code>
    <p>
    note: this block of code is evaluated in the same
    scope as the .tcl page that uses this procedure

    @author simon

    @see template::multirow
} {

    upvar $name:rowcount rowcount $name:columns columns i i
    upvar running_code running_code

    for { set i 1} {$i <= $rowcount} {incr i} {

    set running_code $code_text
    foreach column_name $columns {

        # first change all references to a column to the proper
        # rownum-dependent identifier, i.e. the array value identified
        # by $<multirow_name>:<rownum>(<column_name>)
        regsub -all -- "($name).($column_name)" $running_code "$name:${i}($column_name)" running_code
    }

    regsub -all -- {@([a-zA-Z0-9_:\(\)]+)@} $running_code {${\1}} running_code

    uplevel {
        eval $running_code
    }

    }

}

d_proc -deprecated -public template::util::get_param {
    name
    {section ""}
    {key ""}
} {
    Retrieve a stored parameter, or "" if no such parameter
    If section/key are present, read the parameter from the specified
    section.key in the INI file, and cache them under the given name
} {

    if { ![nsv_exists __template_config $name] } {

    # Extract the parameter from the ini file if possible
    if { $section ne "" } {

        # Use the name if no key is specified
        if { $key ne "" } {
        set key $name
        }

        set value [ns_config $section $key ""]
        if {$value eq ""} {
        return ""
        } else {
        # Cache the value and return it
        template::util::set_param $name $value
        return $value
        }

    } else {
        # No such parameter found and no key/section specified
        return ""
    }
    } else {
    return [nsv_get __template_config $name]
    }
}

ad_proc -public -deprecated  template::util::set_param { name value } {
    Set a stored parameter
} {
    nsv_set __template_config $name $value
}

ad_proc -deprecated template::get_resource_path {} {
    Get the template directory
    The body is doublequoted, so it is interpreted when this file is read
    @see template::resource_path
"
  return \"[file dirname [file dirname [info script]]]/resources\"
"

##################################################################################
#
# From richtext-procs.tcl
#
##################################################################################
namespace eval template::widget {}

ad_proc -public -deprecated template::widget::richtext_htmlarea { element_reference tag_attributes } {
    Implements the richtext widget, which offers rich text editing options.

    If the acs-templating.UseHtmlAreaForRichtextP parameter is set to true (1),
    this will use the htmlArea WYSIWYG editor widget.
    Otherwise, it will use a normal textarea, with a drop-down to select a format.
    The available formats are:
    <ul>
    <li>Enhanced text = Allows HTML, but automatically inserts line and paragraph breaks.
    <li>Plain text = Automatically inserts line and paragraph breaks,
    and quotes all HTML-specific characters, such as less-than, greater-than, etc.
    <li>Fixed-width text = Same as plain text, but conserves spacing; useful for tabular data.
    <li>HTML = normal HTML.
    </ul>
    You can also parameterize the richtext widget with a 'htmlarea_p' attribute,
    which can be true or false, and which will override the parameter setting.

    @see template::widget::richtext
} {
  upvar $element_reference element

  if { [info exists element(html)] } {
    array set attributes $element(html)
  }

  array set attributes $tag_attributes

  if { [info exists element(value)] } {
      set contents [template::util::richtext::get_property contents $element(value)]
      set format   [template::util::richtext::get_property format $element(value)]
  } else {
      set contents {}
      set format {}
  }
  
  set output {}

  if {$element(mode) eq "edit"} {
      append output {<script type="text/javascript" nonce='$::__csp_nonce'><!--} \n {acs_RichText_WriteButtons();  //--></script>}
      
      set attributes(id) "richtext__$element(form_id)__$element(id)"
      
      if { [info exists element(htmlarea_p)] && $element(htmlarea_p) ne "" } {
          set htmlarea_p [string is true -strict $element(htmlarea_p)]
      } else {
          set htmlarea_p [parameter::get \
                              -package_id [apm_package_id_from_key "acs-templating"] \
                              -parameter "UseHtmlAreaForRichtextP" \
                              -default 0]
      }

      # Check browser's User-Agent header for compatibility with htmlArea
      ad_return_complaint 1 "use htmlareap = $htmlarea_p"
      if { $htmlarea_p } {
          set user_agent [string tolower [ns_set iget [ns_conn headers] User-Agent]]
          if { [string first "opera" $user_agent] != -1 } { 
              # Opera - doesn't work, even though Opera claims to be IE
              set htmlarea_p 0
          } elseif { [regexp {msie ([0-9]*)\.([0-9]+)} $user_agent matches major minor] } {
              # IE, works for browsers > 5.5
              if { $major < 5 || ($major == 5  && $minor < 5) } {
                  set htmlarea_p 0
              }
          } elseif { [regexp {gecko/0*([1-9][0-9]*)} $user_agent match build] } {
              if { $build < 20030210 } {
                  set htmlarea_p 0
              }
          } else {
              set htmlarea_p 0
          }
      }

      if { $htmlarea_p } {
          # Tell the blank-master to include the special stuff for htmlArea in the page header
          lappend ::acs_blank_master__htmlareas $attributes(id)
      }

      append output [textarea_internal $element(id) attributes $contents]
      if { $htmlarea_p } {
          append output [subst {<input name="$element(id).format" value="text/html" type="hidden">}]
      } else {
          append output \
              [subst {<br>[_ acs-templating.Format]:}] \
              [menu $element(id).format [template::util::richtext::format_options$format attributes]
      }
          
      # Spell-checker
      array set spellcheck [template::util::spellcheck::spellcheck_properties -element_ref element]
      if { $spellcheck(render_p) } {
          append output \
              [subst { [_ acs-templating.Spellcheck]: }] \
              [menu "$element(id).spellcheck" [nsv_get spellchecker lang_options] \
                   $spellcheck(selected_option) attributes]
      }
  } else {
      # Display mode
      if { [info exists element(value)] } {
          append output \
              [template::util::richtext::get_property html_value $element(value)] \
              [subst {<input type="hidden" name="$element(id)" value="[ns_quotehtml $contents]">}] \
              [subst {<input type="hidden" name="$element(id).format" value="[ns_quotehtml $format]">}]
      }
  }
      
  return $output
}

##################################################################################
#
# From doc-tcl-procs.tcl
#
##################################################################################

ad_proc -private -deprecated template::util::server_root {} {
    uses ns_library to find the server root, may not always be accurate
    because it essentially asks for the Tcl library path and
    strips off the last /tcl directory.

    @see use $::acs::rootdir instead
} {

  set path_length [expr [llength [file split [ns_library private]]] - 1]
  set svr_root "/[join [lreplace [file split [ns_library private]] $path_length $path_length] / ]"
  return $svr_root
}


ad_proc -private -deprecated template::util::display_value { ref } {
    a proc used for debugging, just prints out a value to the error log

    @see use simple "ns_log ...." instead
} {
    upvar $ref value
    ns_log notice "$ref: $value"
}

ad_proc -private -deprecated template::util::proper_noun { string_ref } {
    capitalizes the first letter of a string
    @return returns formatted string (UNFINISHED. FIXME.)
    @see use "string totitle ..."
} {

}

ad_proc -private -deprecated template::util::string_range { string indices } {
    @see use "string range instead"
} {
    return [string range $string [lindex $indices 0] [lindex $indices 1]]
}

##################################################################################
#
# From query-procs.tcl
#
##################################################################################
namespace eval template::query {}

ad_proc -public -deprecated template::query::iterate { statement_name sql body } {
    @param statement_name Standard db_api statement name used to hook 
                          into query dispatcher

    @param sql Query to use when processing this command

    @param body Code body to be execute for each result row of the 
                returned query

    @see db_foreach
} {

    db_with_handle db {
        set result [db_exec select $db $statement_name $sql 2]

        set rowcount 0

        while { [ns_db getrow $db $result] } {

            upvar __query_iterate_row row

            set row(rownum) [incr rowcount]

            set size [ns_set size $result]

            for { set i 0 } { $i < $size } { incr i } {

                set column [ns_set key $result $i]
                set row($column) [ns_set value $result $i]
            }

            # Execute custom code for each row
            uplevel "upvar 0 __query_iterate_row row; $body"
        }
    }
}

##################################################################################
#
# From parse-procs.tcl
#
##################################################################################

ad_proc -private -deprecated template::get_enclosing_tag { tag } {
    Reach back into the tag stack for the last enclosing instance of a tag.  
    Typically used where the usage of a tag depends on its context, such
    as the "group" tag within a "multiple" tag.
    
    Deprecated, use:
    <pre>
    set tag [template::enclosing_tag &lt;tag-type&gt;]
    set attribute [template::tag_attribute tag &lt;attribute&gt;]
    </pre>
    @param tag  The name of the enclosing tag to look for.

    @see template::enclosing_tag
    @see template::tag_attribute
} {
    set name ""

    variable tag_stack

    set last [expr {[llength $tag_stack] - 1}]

    for { set i $last } { $i >= 0 } { incr i -1 } {

        set pair [lindex $tag_stack $i]

        if {[lindex $pair 0] eq $tag} {
            set name [ns_set get [lindex $pair 1] name]
            break
        }
    }

    return $name
}

ad_proc -deprecated template::util::set_to_list { set args } {
    Turns an ns_set into a key-value list, excluding any number of
    specified keys.  Useful for turning the contents on an ns_set into
    a form that may be cached or manipulated as a native Tcl data structure.

    DEPRECATED: this proc can be replaced with trivial ns_set and
                plain tcl idioms

    @see ns_set

    @param set  A reference to an ns_set.
    @param args Any number of key names to exclude from the list.

    @return A list in the form { key value key value key value ... }
} {

    set result [list]

    for { set i 0 } { $i < [ns_set size $set] } { incr i } {

        set key [ns_set key $set $i]
        if { $key in $args } { continue }

        lappend result $key [ns_set value $set $i]
    }

    return $result
}

ad_proc -deprecated template::util::set_to_vars { set args } {
    Declare local variables for set values

    DEPRECATED: this proc can be replaced with trivial ns_set and
                plain tcl idioms

    @see ns_set

    @param set  A reference to an ns_set.
    @param args Any number of keys to declare as local variables.
} {

    if { [llength $args] == 0 } {

        for { set i 0 } { $i < [ns_set size $set] } { incr i } {
            set key [ns_set key $set $i]
            upvar $key value
            set value [ns_set get $set $key]
        }

    } else {

        foreach key $args {
            upvar $key value
            set value [ns_set get $set $key]
        }
    }
}

ad_proc -deprecated template::util::list_opts { {array_ref opts} } {
    Converts an array to an option list

    DEPRECATED: this proc can be replaced by simple tcl idioms

    @see plain tcl

    @param  array_ref  The name of the array in the calling frame containing
    option-value pairs.  Defaults to "opts".

    @return A list of option-value pairs suitable for appending to a command.
} {

    upvar $array_ref arr

    set ret [list]
    foreach {key value} [array get arr] {
        lappend ret "-$key" $value
    }

    return $ret
}

ad_proc -deprecated template::util::tcl_to_sql_list { lst } {
    Convert a Tcl list to a SQL list, for use with the "in" statement.
    Uses double single quotes to escape single quotes in values.

    DEPRECATED: NaviServer now provides a native API ns_dbquotelist for this; a
    tcl-implemented fallback for older NaviServer versions exists in current OpenACS code.

    @see ns_dbquotelist
} {

    if { [llength $lst] > 0 } {
        # replace single quotes by two single quotes
        regsub -all -- ' "$lst" '' lst2
        set sql "'"
        append sql [join $lst2 "', '"]
        append sql "'"
        return $sql
    } else {
        return ""
    }
}

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