Category: | Text Processing | |
Author/Contact Info | stephen (steven@jubal.com) | |
Description: | I was writing up a list of comments on someone's code, and got tired of retyping the line number and filename over and over again. Also, I liked to skip around a bit in the files, but wanted to keep my annotations sorted. So for starters, I wrote a little XEmacs LISP to automatically add my annotations to a buffer called 'Annotations'. It would ask me for the comment in the minibuffer, then write the whole thing, so that I could keep working without even having to switch screens. I bound it to a key so I could do it repeatedly. Pretty basic stuff. annotate.el
This would generate a bunch of annotations like this:
Next, I wanted to format my annotations so I could post them here in some kind of HTML format. So I wrote a little text processor to take my annotations, parse them, and format the result in HTML. This was not difficult, since most of the heavy lifting was done by the Template module. Here's a standard template file... pretty ugly, really, but you can define your own without changing the code...
Alternatively, I could have had my XEmacs function output XML and used XSLT. Six of one, half a dozen of the other... Plus, one could write a template file to translate annotations into an XML format. The Output
|
|
use strict; #### #### comment_reader.pl #### #### Reads a comment file from command-line arg or standard input #### and outputs the result as a fragment of HTML suitable for #### Perlmonks. #### use IO::File; use Getopt::Long; use Template; ###################### Constants ###################### use constant DEFAULT_TEMPLATE => 'comment_tmpl.tt2'; ###################### Main Program ################### MAIN: { ## Get the options my $template_file = DEFAULT_TEMPLATE; my $outfile = undef; GetOptions('outfile=s' => \$outfile, 'template=s' => \$template_file +); my $entries = read_entries(); my $template = Template->new(); $template->process($template_file, { files => $entries }, $outfile) or die $Template::ERROR; } ###################### Subroutines ##################### ## ## read_entries() ## ## Reads whatever entries are present on the command line, ## then returns them parsed and sorted as a reference ## to an array of hashes, like so: ## [ # List of files ## { 'name' => ## sub read_entries { my %comments = (); while (<>) { chomp; # Bare-bones attempt at avoiding missing closing tags while (m{<(?!\/)([^>]+)>}g) { my $tag = $1; m{</$tag>}i or warn "Missing closing tag for $tag at $.\n"; } my ($file_list, $comment) = split(/\s+/, $_, 2); foreach my $lineref (split(/;/, $file_list) ) { my ($file, $lines) = split(/:/, $lineref, 2); foreach my $line (split(/,/, $lines)) { push( @{ $comments{$file}{$line} }, $comment ); } } } return sort_files(\%comments); } ## ## Given a hash reference, turns it into a list of hashrefs. ## sub sort_files { my ($comments) = @_; my @files = (); foreach my $file (sort keys %$comments) { my @lines = (); foreach my $line (sort {$a <=> $b} keys %{$comments->{$file}}) { push(@lines, { 'number' => $line, 'comments' => $comments->{$fil +e}{$line} }); } push (@files, { name => $file, lines => \@lines }); } return \@files; } |
|
---|
Replies are listed 'Best First'. | |
---|---|
•Re: Annotating Files
by merlyn (Sage) on Apr 18, 2002 at 01:04 UTC | |
A reply falls below the community's threshold of quality. You may see it by logging in. |