Thread: [Codestriker-commits] CVS update: codestriker/lib/Codestriker/Http HtmlEntityLineFilter.pm LineBrea
Brought to you by:
sits
From: <si...@us...> - 2008-03-10 23:18:05
|
User: sits Date: 08/03/10 16:18:04 Modified: lib/Codestriker/Action ViewTopic.pm lib/Codestriker/Http DeltaRenderer.pm Added: lib/Codestriker/Http HtmlEntityLineFilter.pm LineBreakLineFilter.pm LineFilter.pm TabToNbspLineFilter.pm Log: Introduced the notion of a LineFilter when rendering lines within a delta. This nicely separates out potentially complex line rendering code into separate modules, and will hopefully make customisations easier to accomplish. Will need to implement the LxrLineFilter, and then the SyntaxHighlightingLineFilter. Index: ViewTopic.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/ViewTopic.pm,v retrieving revision 1.55 retrieving revision 1.56 diff -u -r1.55 -r1.56 --- ViewTopic.pm 9 Mar 2008 19:57:07 -0000 1.55 +++ ViewTopic.pm 10 Mar 2008 23:18:03 -0000 1.56 @@ -242,8 +242,8 @@ } my $delta_renderer = - Codestriker::Http::Delta->new($topic, \@comments, \@deltas, $query, - $mode, $brmode); + Codestriker::Http::DeltaRenderer->new($topic, \@comments, \@deltas, $query, + $mode, $brmode, $tabwidth); # Set the add general comment URL. $vars->{'add_general_comment_element'} = Index: DeltaRenderer.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Http/DeltaRenderer.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DeltaRenderer.pm 9 Mar 2008 19:57:08 -0000 1.1 +++ DeltaRenderer.pm 10 Mar 2008 23:18:03 -0000 1.2 @@ -7,15 +7,18 @@ # Object for handling the computation of a delta for displaying to HTML. -package Codestriker::Http::Delta; +package Codestriker::Http::DeltaRenderer; use strict; -use HTML::Entities (); +use Codestriker::Http::HtmlEntityLineFilter; +use Codestriker::Http::TabToNbspLineFilter; +use Codestriker::Http::LineBreakLineFilter; # Constructor. sub new { - my ($type, $topic, $comments, $deltas, $query, $mode, $brmode) = @_; + my ($type, $topic, $comments, $deltas, $query, $mode, $brmode, + $tabwidth) = @_; my $self = {}; $self->{topic} = $topic; @@ -24,6 +27,7 @@ $self->{query} = $query; $self->{mode} = $mode; $self->{brmode} = $brmode; + $self->{tabwidth} = $tabwidth; # Build a hash from filenumber|fileline|new -> comment array, so that # when rendering, lines can be coloured appropriately. Also build a list @@ -46,9 +50,24 @@ $self->{comment_locations} = \@comment_locations; $self->{comment_location_map} = \%comment_location_map; + # Record list of line filter objects to apply to each line of code. + # Setup some default filters. + @{$self->{line_filters}} = (); + push @{$self->{line_filters}}, Codestriker::Http::HtmlEntityLineFilter->new(); + push @{$self->{line_filters}}, Codestriker::Http::TabToNbspLineFilter->new($tabwidth); + push @{$self->{line_filters}}, Codestriker::Http::LineBreakLineFilter->new($brmode); + bless $self, $type; } +# Add a line filter to this delta-renderer, which will be called for each +# line that is to be rendered. +sub add_line_filter +{ + my ($self, $line_filter) = @_; + push @{$self->{line_filters}}, $line_filter; +} + # Render $text with the appropriate anchor attributes set for # displaying any existing comments and a link for adding new ones. sub comment_link @@ -122,14 +141,6 @@ for (my $i = 0; $i <= $#diff_lines; $i++) { my $data = $diff_lines[$i]; - # TODO: make these text transformations as plugins. - # TODO: perform syntax highlighting. - # TODO: perform LXR linking. - # TODO: tab adjust. - # TODO: line breaking. - # Escape the data. - $data = HTML::Entities::encode($data); - if ($data =~ /^\-(.*)$/o) { # Line corresponding to old code. push @{ $self->{diff_old_lines} }, $1; @@ -160,12 +171,12 @@ my $line = {}; my $data_class = $self->{mode} == $Codestriker::COLOURED_MODE ? "n" : "msn"; - $line->{old_data} = $data; + $line->{old_data} = $self->_apply_line_filters($data); $line->{old_data_line} = $self->comment_link($self->{filenumber}, $old_linenumber, 0, $old_linenumber); $line->{old_data_class} = $data_class; - $line->{new_data} = $data; + $line->{new_data} = $self->_apply_line_filters($data); $line->{new_data_line} = $self->comment_link($self->{filenumber}, $new_linenumber, 1, $new_linenumber); @@ -269,16 +280,31 @@ } my $line = {}; - $line->{old_data} = $old_data; + $line->{old_data} = $self->_apply_line_filters($old_data); $line->{old_data_line} = $self->comment_link($self->{filenumber}, $old_data_line, 0, $old_data_line); $line->{old_data_class} = $render_old_colour; - $line->{new_data} = $new_data; + $line->{new_data} = $self->_apply_line_filters($new_data); $line->{new_data_line} = $self->comment_link($self->{filenumber}, $new_data_line, 1, $new_data_line); $line->{new_data_class} = $render_new_colour; push @{$self->{lines}}, $line; } + + # Apply all of the line filters to the line of text supplied. + sub _apply_line_filters { + my ($self, $text) = @_; + + # TODO: perform syntax highlighting. + # TODO: perform LXR linking. + foreach my $line_filter (@{$self->{line_filters}}) { + $text = $line_filter->filter($text); + } + + # Unconditionally add a at the start for better alignment. + # Fix so count isn't stuffed. + return " " . $text; + } } 1; Index: HtmlEntityLineFilter.pm =================================================================== RCS file: HtmlEntityLineFilter.pm diff -N HtmlEntityLineFilter.pm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ HtmlEntityLineFilter.pm 10 Mar 2008 23:18:03 -0000 1.1 @@ -0,0 +1,34 @@ +############################################################################### +# Codestriker: Copyright (c) 2001, 2002 David Sitsky. All rights reserved. +# si...@us... +# +# This program is free software; you can redistribute it and modify it under +# the terms of the GPL. + +# Line filter for encoding HTML entities correctly. + +package Codestriker::Http::HtmlEntityLineFilter; + +use strict; + +use Codestriker::Http::LineFilter; + +@Codestriker::Http::HtmlEntityLineFilter::ISA = + ("Codestriker::Http::LineFilter"); + +sub new { + my $type = shift; + + my $self = Codestriker::Http::LineFilter->new(); + return bless $self, $type; +} + +# Escape all HTML entities so that they are displayed correctly. +sub filter { + my ($self, $text) = @_; + + return HTML::Entities::encode($text); +} + +1; + Index: LineBreakLineFilter.pm =================================================================== RCS file: LineBreakLineFilter.pm diff -N LineBreakLineFilter.pm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ LineBreakLineFilter.pm 10 Mar 2008 23:18:04 -0000 1.1 @@ -0,0 +1,44 @@ +############################################################################### +# Codestriker: Copyright (c) 2001, 2002 David Sitsky. All rights reserved. +# si...@us... +# +# This program is free software; you can redistribute it and modify it under +# the terms of the GPL. + +# Line filter for handling line-breaks. +# entities. + +package Codestriker::Http::LineBreakLineFilter; + +use strict; + +use Codestriker::Http::LineFilter; + +@Codestriker::Http::LineBreakLineFilter::ISA = + ("Codestriker::Http::LineFilter"); + +# Take the linebreak mode as a parameter. +sub new { + my ($type, $brmode) = @_; + + my $self = Codestriker::Http::LineFilter->new(); + $self->{brmode} = $brmode; + + return bless $self, $type; +} + +# Convert the spaces appropriately for line-breaking. +sub filter { + my ($self, $text) = @_; + + if ($self->{brmode} == $Codestriker::LINE_BREAK_ASSIST_MODE) { + $text =~ s/^(\s+)/my $sp='';for(my $i=0;$i<length($1);$i++){$sp.=' '}$sp;/ge; + } + else { + $text =~ s/\s/ /g; + } + + return $text; +} + +1; Index: LineFilter.pm =================================================================== RCS file: LineFilter.pm diff -N LineFilter.pm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ LineFilter.pm 10 Mar 2008 23:18:04 -0000 1.1 @@ -0,0 +1,29 @@ +############################################################################### +# Codestriker: Copyright (c) 2001, 2002 David Sitsky. All rights reserved. +# si...@us... +# +# This program is free software; you can redistribute it and modify it under +# the terms of the GPL. + +# Base object for all line filter objects to extend from. A line filter takes +# a line of code and transforms it in some fashion. + +package Codestriker::Http::LineFilter; + +use strict; + +sub new { + my $type = shift; + my $self = {}; + return bless $self, $type; +} + +sub filter { + my ($self, $text) = @_; + + # Default is a no-op. + return $text; +} + +1; + Index: TabToNbspLineFilter.pm =================================================================== RCS file: TabToNbspLineFilter.pm diff -N TabToNbspLineFilter.pm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ TabToNbspLineFilter.pm 10 Mar 2008 23:18:04 -0000 1.1 @@ -0,0 +1,41 @@ +############################################################################### +# Codestriker: Copyright (c) 2001, 2002 David Sitsky. All rights reserved. +# si...@us... +# +# This program is free software; you can redistribute it and modify it under +# the terms of the GPL. + +# Line filter for converting tabs to the appropriate number of +# entities. + +package Codestriker::Http::TabToNbspLineFilter; + +use strict; + +use Codestriker::Http::LineFilter; + +@Codestriker::Http::HtmlEntityLineFilter::ISA = + ("Codestriker::Http::LineFilter"); + +# Take the desired tabwidth as a parameter. +sub new { + my ($type, $tabwidth) = @_; + + my $self = Codestriker::Http::LineFilter->new(); + $self->{tabwidth} = $tabwidth; + + return bless $self, $type; +} + +# Convert tabs to the appropriate number of entities. +sub filter { + my ($self, $text) = @_; + + my $tabwidth = $self->{tabwidth}; + 1 while $text =~ s/\t+/' ' x + (length($&) * $tabwidth - length($`) % $tabwidth)/eo; + + return $text; +} + +1; |