util::diff (public)
util::diff [ -old old ] [ -new new ] [ -show_old_p show_old_p ]
Defined in packages/acs-tcl/tcl/util-diff-procs.tcl
Perform a UNIX diff on 'old' and 'new', and return an HTML fragment of the changes. Requires struct::list (from tcllib)
- Switches:
- -old (optional)
- original text
- -new (optional)
- new text
- -show_old_p (optional, defaults to
"t"
)- Returns:
- HTML fragment of differences between 'old' and 'new'
- Author:
- Vinod Kurup vinod@kurup.com
- Created:
- 2005-10-18
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
Source code: package require struct::list set old [split $old " "] set new [split $new " "] # tcllib procs to get a list of differences between 2 lists # see: http://tcllib.sourceforge.net/doc/struct_list.html set len1 [llength $old] set len2 [llength $new] set result [::struct::list longestCommonSubsequence $old $new] set result [::struct::list lcsInvert $result $len1 $len2] # each chunk is either 'deleted', 'added', or 'changed' set i 0 foreach chunk $result { ns_log notice "\n$chunk\n" set action [lindex $chunk 0] lassign [lindex $chunk 1] old_index1 old_index2 lassign [lindex $chunk 2] new_index1 new_index2 while {$i < $old_index1} { lappend output [lindex $old $i] incr i } if { $action eq "changed" } { if {$show_old_p} { lappend output <d> foreach item [lrange $old $old_index1 $old_index2] { lappend output [string trim $item] } lappend output </d> } lappend output <a> foreach item [lrange $new $new_index1 $new_index2] { lappend output [string trim $item] } lappend output </a> incr i [expr {$old_index2 - $old_index1 + 1}] } elseif { $action eq "deleted" } { lappend output <d> foreach item [lrange $old $old_index1 $old_index2] { lappend output [string trim $item] } lappend output </d> incr i [expr {$old_index2 - $old_index1 + 1}] } elseif { $action eq "added" } { while {$i < $old_index2} { lappend output [lindex $old $i] incr i } lappend output <a> foreach item [lrange $new $new_index1 $new_index2] { lappend output [string trim $item] } lappend output </a> } } # add any remaining words at the end. while {$i < $len1} { lappend output [lindex $old $i] incr i } set output [join $output " "] set output [string map {"<d>" {<span class="diff-deleted">} "</d>" </span> "<a>" {<span class="diff-added">} "</a>" </span>} $output] return "$output"XQL Not present: Generic, PostgreSQL, Oracle