Deutsch   English   Français   Italiano  
<1742373766-2276@newsgrouper.org>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!newsgrouper.org!.POSTED!not-for-mail
From: sundar <user2276@newsgrouper.org.invalid>
Newsgroups: comp.lang.tcl
Subject: Re: upvar and uplevel - help
References: <1742099876-2276@newsgrouper.org> <1742135596-153@newsgrouper.org>
Date: Wed, 19 Mar 2025 08:42:46 GMT
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Message-ID: <1742373766-2276@newsgrouper.org>
Injection-Info: newsgrouper.org; mail-complaints-to="newsgrouper@yahoo.com"; posting-account=user2276
Injection-Date: Wed, 19 Mar 2025 08:42:46 GMT
User-Agent: Newsgrouper/0.7.1
Bytes: 2423
Lines: 53


> It is a rather silly example, but the secret is that you pass the *name* 
> of the variables and not the value.

I have refactored the 'render' proc to use 'upvar' and this is turning out to be
more useful in simplifying all 'components',
```
proc render {data css template} {
    upvar $data _data
    upvar $css _css
    upvar $template _template
    # Generate scoped CSS and get container class
    lassign [scope_css $_css] scoped_css container_class
    
    # Create a container with the scoped CSS
    set result [div [list class $container_class] \
		    [style {} $scoped_css] \
		    [eval $_template]] 
    return $result
}
```
as an example here is 'pagination' component,
```
.... 
    dict set data headers {Name Email Status {Last Active}}
    set page 1  ;# Current page (default to 1)
    set page_size 5  ;# Rows per page

    set template {
	upvar page _page
	upvar page_size _page_size
	table {class "pagination-table"} \
	    [tr {} \
		 {*}[lmap header [dict get $_data headers] {
		     th {} $header
		 }]] \
	    {*}[lmap row [lrange [dict get $_data rows] [expr {($_page - 1) * $_page_size}] [expr {$_page * $_page_size - 1}]] {
		tr {} \
		    {*}[lmap cell $row {
			td {} $cell
		    }]
	    }] \
	    [div {class "pagination-nav"} \
		 [if {$_page > 1} {
		     a [list href "/pagination?page=[expr {$_page - 1}]" rel "prev"] "Previous"
		 }] \
		 [span {} "Page $_page"] \
		 [if {$_page * $_page_size < [llength [dict get $_data rows]]} {
		     a [list href "/pagination?page=[expr {$_page + 1}]" rel "next"] "Next"
		 }]]
    }
    return [render data table_pa_styles template]
}
```