The following are examples of using the TclPlugin. To shorten the examples [{TclPlugin...}] is used where [{com.ingenta.jspwiki.plugin.TclPlugin ...}] is correct.

Incorporating one wiki page inside another#

[{TclPlugin script='wiki::page get MyPage' result='wiki' }]

A list of project pages#

Use the following script to place a table of "project" pages into another page. A project page is just a page with a given prefix: For example, "TclPlugin" is a prefix for page about the TclPlugin.

[{TclPlugin scriptPage='ProjectPagesScript' prefix='TclPlugin' result='wiki' }]

Place the following in the ProjectPagesScript wiki page

set projectPages [list]
foreach page [wiki::info pages] {
   if { [string first $args(prefix) [lindex $page 0]] == 0 } {
      lappend projectPages $page
   }
}

set result "|| Page || Author || Last modified \n"
set c [string length $args(prefix)]
foreach page $projectPages {
    append result "| \[[string range [lindex $page 0] $c end]|[lindex $page 0]\]"
    append result "| \[[lindex $page 1]\]"
    append result "| [clock format [lindex $page 3] -format {%e %B %Y}]"
    append result "\n"
}

return $result

Note that this script is similar to the existing IndexPlugin.

Late milestones#

If you keep project milestones in a wiki table, for example,

1 June 2004 10% milestone aa
1 Aug 2004 10% milestone a
4 Aug 2004 done milestone b
3 Aug 2004 10% milestone c
8 Aug 2004 10% milestone d
12 Aug 2004 10% milestone d
12 Aug 2004 10% milestone dd
13 Aug 2004 10% milestone e
14 Aug 2004 10% milestone g
21 Aug 2004 10% milestone f
23 Aug 2004 10% milestone f
15 September 2004 10% milestone h
15 September 2004 10% milestone i

the following script will show late milestones

Due Days late Description
1 June 2004-78milestone aa
1 August 2004-17milestone a
3 August 2004-15milestone c
8 August 2004-10milestone d
12 August 2004-6milestone dd
12 August 2004-6milestone d
13 August 2004-5milestone e
14 August 2004-4milestone g
[{TclPlugin scriptPage='LateMilestonesScript' dataPage='ProjectMilestones' result='wiki' }]

Place the following in the LateMilestonesScript wiki page

# parse milestone data from wiki table
set data [wiki::page get $args(dataPage)]
foreach line [split $data \n] {
    set m [split $line |]
    if {[llength $m] != 4} { continue }
    lappend milestones [list [clock scan [lindex $m 1]] [string trim [lindex $m 2]] [string trim [lindex $m 3]] ]
}

# order milestones by date
proc compareDate { a b } {
    expr [lindex $a 0] - [lindex $b 0]
}
set milestones [lsort -command compareDate $milestones]

# gather late milestones
set today [clock scan "today 0"]
set late [list]
foreach milestone $milestones {
    if { [lindex $milestone 0] < $today && [lindex $milestone 1] != "done" } { lappend late $milestone }
}

# output late milestone presentation
set yearday [clock format $today -format %j]
set result "|| Due || Days late || Description \n"
foreach milestone $late {
    append result |
    append result [clock format [lindex $milestone 0] -format "%e %B %Y"]
    append result |
    append result [expr [clock format [lindex $milestone 0] -format %j] - $yearday]
    append result |
    append result [lindex $milestone 2]
    append result \n
}

return $html

Note that there is a flaw in this script in that it does not handle projects that span mulitple years. The root of the flaw is the yearday handling.

Calendar of last week's and this week's events#

Outputs a calendar of recient and forthcoming events from a list of events in the body of the plugin. For example,

[{TclPlugin result='wiki' scriptPage='EventCalendarScript'

| 12 Aug 2004 | Event A
| 14 Aug 2004 | Event B
| 16 Aug 2004 | Event C
| 21 Aug 2004 | Event D
| 21 Aug 2004 | Event E
| 22 Aug 2004 | Event F
| 23 Aug 2004 | Event G
| 01 Sep 2004 | Event X
| 02 Sep 2004 | Event Y

}]

outputs

Sun 15 Aug Mon 16 Aug Tue 17 Aug Wed 18 Aug Thu 19 Aug Fri 20 Aug Sat 21 Aug
Event C Event D Event E
Sun 22 Aug Mon 23 Aug Tue 24 Aug Wed 25 Aug Thu 26 Aug Fri 27 Aug Sat 28 Aug
Event F Event G

Save the following in the page EventCalendarScript

# get the wiki data
set data $args(_body)

# create list of dates between sundays
set dates [list]
set sunday [clock scan "sunday 0"]
foreach offset { -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 } {
    set date [clock scan "$offset day" -base $sunday ]
    lappend dates $date
    set datetoevents($date) [list]    
}

# scan and records the events in the wiki data
# where the date is in the first table cell 
# and the even is in the second
foreach line [split $data \n\r] {
    if { [string first $line |] } {
        set e [split $line |]
        set date [lindex $e 1]
        # get the date at 12am.
        set date [clock scan [clock format [clock scan $date] -format "%e %b %Y 0"]]
        set event [lindex $e 2]
        if [info exists datetoevents($date)] {
            lappend datetoevents($date) $event
        }
    }
}

# format a wiki table of the calendar
set wiki ""
set head ""
set body ""
set day 1
foreach date $dates {
    # header for date
    append head "|| "
    append head [clock format $date -format {%a %e %b}]
    # events for date
    append body "| "
    foreach event $datetoevents($date) {
        append body $event
    }
    # end of the week?
    incr day
    if { $day == 8 || $day == 15 } {
        append wiki $head \n $body \n
        set head ""
        set body ""
    }
}

return $wiki

List the authors of the page#

The AuthorsPlugin wants a list of the authors that edited the page. An edit is a count of non-consecutive changes except were the changes are more than an hour apart. The following script will output such information for the current page

set versions [wiki::page versions current]

proc cmptimes { a b } {
    expr [lindex $a 3] - [lindex $b 3]
}

proc cmpcounts { a b } {
    global counts
    expr $counts($a) - $counts($b)
}

set onehour [expr 60 * 60]

set previousauthor ""
set previousmodified 0

foreach version [lsort -command cmptimes $versions] {
    set author [lindex $version 1]
    set modified [lindex $version 3]
    # skip IP address authored versions
    if { [regexp {[0-9]+\.[0-9]+.[0-9]+\.[0-9]+} $author] } {
        continue
    }
    if { ! [info exists counts($author)] } {
        set counts($author) 0
    }
    if { $author != $previousauthor } {
        incr counts($author)
        set previousmodified $modified
        set previousauthor $author
    } else {
        if { $previousmodified + $onehour <= $modified } {
            incr counts($author)
            set previousmodified $modified
        }
    }
}

append wiki "|| Author || Edits\n"
foreach author [lsort -decreasing -command cmpcounts [array names counts]] {
    append wiki "| $author | $counts($author)\n"
}

return $wiki

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-9) was last changed on 12-Oct-2007 21:15 by JanneJalkanen