/todo

To get this branch, use:
bzr branch http://bzr.ed.am/todo

« back to all changes in this revision

Viewing changes to todo

  • Committer: edam
  • Date: 2011-12-10 20:53:29 UTC
  • Revision ID: edam@waxworlds.org-20111210205329-7c5gfo6af3m3pz9c
fixed spaces

Show diffs side-by-side

added added

removed removed

1
1
#!/usr/bin/perl
2
2
 
3
 
use feature "state";
4
 
 
5
3
use strict;
6
4
use warnings;
7
5
use Getopt::Long;
25
23
    'a|all' => \$display_all,
26
24
    'e|edit' => \$mode_edit,
27
25
    'h|headers' => \$display_headers,
28
 
    's|section=s' => \$display_section,
 
26
    'section=s' => \$display_section,
29
27
    'help' => \$mode_help,
30
28
    'version' => \$mode_version,
31
 
) || @ARGV > 0 ) {
 
29
) ) {
32
30
    print "Try `$app_name --help' for more information.\n";
33
31
    exit( 1 );
34
32
}
36
34
# help mode
37
35
if( $mode_help ) {
38
36
    print "todo - display your todo file\n\n".
39
 
        #01234567890123456789012345678901234567890123456789012345678901234567890123456789
40
37
    "Usage: $app_name [OPTIONS]\n\n".
41
38
    "Options:\n".
42
39
    "  -a, --all              display all sections\n".
43
40
    "  -e, --edit             edit your todo file\n".
44
41
    "  -h, --headers          show setion headers\n".
45
 
    "  -s, --section=SECTION  display sections matching the regular expression\n".
 
42
    "  -s, --section=SECTION  display this named section\n".
46
43
    "      --help     display this help and exit\n".
47
 
    "      --version  output version information and exit\n".
48
 
        "\n".
49
 
        "Running without any options is the same as running with --section=TODO and\n".
50
 
        "lists the default section of the todo file.\n".
51
 
        "\n".
52
 
        "The environment variables EDITOR is used.\n".
53
 
        "\n".
54
 
        "Please report bugs to Tim Marston <tim\@ed.am>.\n";
 
44
    "      --version  output version information and exit\n";
55
45
    exit( 0 );
56
46
}
57
47
 
58
48
# version mode
59
49
if( $mode_version ) {
60
50
    print "todo 1.0\n".
61
 
        "Copyright (C) 2011, 2012 Tim Marston.\n".
 
51
        "Copyright (C) 2011 Tim Marston.\n".
62
52
        "http://ed.am/software/todo\n";
63
53
    exit( 0 );
64
54
}
110
100
    }
111
101
 
112
102
    # determine editor from environment, default to "emacs -nw"
113
 
        my $editor;
114
 
        $editor = $ENV{ 'EDITOR' };
115
 
        defined $editor or $editor = 'emacs -nw';
 
103
    my $editor = $ENV{ 'EDITOR' };
 
104
    defined $editor or $editor = 'emacs -nw';
116
105
    my @exec_array = split( / +/, $editor );
117
106
    push( @exec_array, "$todo_dir/todo" );
118
107
 
138
127
    exit
139
128
}
140
129
 
141
 
# function to display a line
142
 
sub display_line
143
 
{
144
 
        my ( $line, $section ) = @_;
145
 
        state $old_section = '';
146
 
 
147
 
        # detect section change
148
 
        if( $section ne $old_section ) {
149
 
                $old_section = $section;
150
 
                
151
 
                # display section heading
152
 
                if( $display_headers || $display_all ) {
153
 
                        print "$section\n".
154
 
                                ( "=" x length( $section ) )."\n";
155
 
                }
156
 
        }
157
 
 
158
 
        # replace tabs with 4 spaces
159
 
        $line =~ s/\t/    /g;
160
 
        
161
 
        # display the line
162
 
        print $line;
163
 
}
164
 
 
165
 
 
166
130
# scan through file
167
 
my $candidate_section = '';
 
131
my $next_section = '';
168
132
my $section = '';
169
 
my $last_line = '';
 
133
my $old_section = '';
170
134
open FILE, "<$todo_dir/todo" or die "can't open todo file";
171
 
while( <FILE> )
172
 
{
 
135
while( <FILE> ) {
 
136
    my $display = 0;
 
137
 
173
138
    # detect the line after section headings, and thus sections
174
 
    if( /^[-=]{2,}/ && $candidate_section ne '' ) {
175
 
        $section = $candidate_section;
176
 
        $candidate_section = '';
177
 
                $last_line = '';
178
 
                next;
 
139
    if( /^[-=]{2,}/ && $next_section ne '' ) {
 
140
        $section = $next_section;
 
141
        $next_section = '';
179
142
    }
180
 
 
181
143
    # detect section headings
182
 
    if( /^[-_\.A-Za-z0-9 ]+$/ ) {
183
 
        $candidate_section = $_;
184
 
                chomp $candidate_section;
185
 
        }
 
144
    elsif( /^[A-Z]+$/ ) {
 
145
        $next_section = $_;
 
146
        chomp( $next_section );
 
147
    }
 
148
    # we have neither a section heading nor the line after
186
149
    else {
187
 
        $candidate_section = '';
188
 
        }
189
 
 
190
 
        # display last line
191
 
        display_line( $last_line, $section ) if( $last_line ne '' );
192
 
 
193
 
    # display line
194
 
        if( ( lc( $section ) eq lc( $display_section ) ) ||
195
 
                ( $section && $display_all ) )
196
 
        {
197
 
                $last_line = $_;
 
150
        $next_section = '';
 
151
 
 
152
        # display line
 
153
        if( ( $section eq $display_section ) ||
 
154
            ( $section && $display_all ) )
 
155
        {
 
156
            # detect section change
 
157
            if( $section ne $old_section ) {
 
158
                $old_section = $section;
 
159
                
 
160
                # display section heading
 
161
                if( $display_headers ||
 
162
                    $display_all )
 
163
                {
 
164
                    print "$section\n".
 
165
                        ( "=" x length( $section ) )."\n";
 
166
                }
 
167
            }
 
168
 
 
169
            # replace tabs with 4 spaces
 
170
            s/\t/    /g;
 
171
 
 
172
            # display the line
 
173
            print;
 
174
        }
198
175
    }
199
 
        else {
200
 
                $last_line = '';
201
 
        }
202
176
}
203
 
display_line( $last_line, $section ) if( $last_line ne '' );