/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: 2012-01-04 11:58:14 UTC
  • Revision ID: edam@waxworlds.org-20120104115814-72kstt54mr6xcx4n
be less strict about what is allowed in a section heading

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;
16
14
my $display_section = "TODO";
17
15
my $display_headers = 0;
18
16
my $mode_edit = 0;
19
 
my $mode_less = 0;
20
17
my $mode_help = 0;
21
18
my $mode_version = 0;
22
19
 
26
23
    'a|all' => \$display_all,
27
24
    'e|edit' => \$mode_edit,
28
25
    'h|headers' => \$display_headers,
29
 
        'l|list' => \$mode_less,
30
 
    's|section=s' => \$display_section,
 
26
    'section=s' => \$display_section,
31
27
    'help' => \$mode_help,
32
28
    'version' => \$mode_version,
33
 
) || @ARGV > 0 ) {
 
29
) ) {
34
30
    print "Try `$app_name --help' for more information.\n";
35
31
    exit( 1 );
36
32
}
38
34
# help mode
39
35
if( $mode_help ) {
40
36
    print "todo - display your todo file\n\n".
41
 
        #01234567890123456789012345678901234567890123456789012345678901234567890123456789
42
37
    "Usage: $app_name [OPTIONS]\n\n".
43
38
    "Options:\n".
44
39
    "  -a, --all              display all sections\n".
45
40
    "  -e, --edit             edit your todo file\n".
46
41
    "  -h, --headers          show setion headers\n".
47
 
        "  -l, --list             show the list in your pager (see notes)\n".
48
 
    "  -s, --section=SECTION  display sections matching the regular expression\n".
 
42
    "  -s, --section=SECTION  display this named section\n".
49
43
    "      --help     display this help and exit\n".
50
 
    "      --version  output version information and exit\n".
51
 
        "\n".
52
 
        "Running without any options is the same as running with --section=TODO and\n".
53
 
        "lists the default section of the todo file.\n".
54
 
        "\n".
55
 
        "The advantage of using '--list' is that the pager is run as if the\n".
56
 
        "todo list were being edited. This means that if you decide to spawn an\n".
57
 
        "editor from you pager and edit the list, these changes get noticed.\n".
58
 
        "\n".
59
 
        "The environment variables EDITOR and PAGER are used.\n".
60
 
        "\n".
61
 
        "Please report bugs to Tim Marston <tim\@ed.am>.\n";
 
44
    "      --version  output version information and exit\n";
62
45
    exit( 0 );
63
46
}
64
47
 
65
48
# version mode
66
49
if( $mode_version ) {
67
50
    print "todo 1.0\n".
68
 
        "Copyright (C) 2011, 2012 Tim Marston.\n".
 
51
        "Copyright (C) 2011 Tim Marston.\n".
69
52
        "http://ed.am/software/todo\n";
70
53
    exit( 0 );
71
54
}
82
65
$todo_dir = glob( $todo_dir );
83
66
( -f $todo_dir ) and die "$todo_dir exists and is a file";
84
67
 
85
 
# less mode
86
 
if( $mode_less )
87
 
{
88
 
    ( ! -f "$todo_dir/todo" ) && die "no todo file";
89
 
        $mode_edit = 1;
90
 
}
91
 
 
92
68
# edit mode
93
69
if( $mode_edit )
94
70
{
124
100
    }
125
101
 
126
102
    # determine editor from environment, default to "emacs -nw"
127
 
        my $editor;
128
 
        if( $mode_less ) {
129
 
                $editor = $ENV{ 'PAGER' };
130
 
                defined $editor or $editor = 'less';
131
 
        }
132
 
        else {
133
 
                $editor = $ENV{ 'EDITOR' };
134
 
                defined $editor or $editor = 'emacs -nw';
135
 
        }
 
103
    my $editor = $ENV{ 'EDITOR' };
 
104
    defined $editor or $editor = 'emacs -nw';
136
105
    my @exec_array = split( / +/, $editor );
137
106
    push( @exec_array, "$todo_dir/todo" );
138
107
 
158
127
    exit
159
128
}
160
129
 
161
 
# function to display a line
162
 
sub display_line
163
 
{
164
 
        my ( $line, $section ) = @_;
165
 
        state $old_section = '';
166
 
 
167
 
        # detect section change
168
 
        if( $section ne $old_section ) {
169
 
                $old_section = $section;
170
 
                
171
 
                # display section heading
172
 
                if( $display_headers || $display_all ) {
173
 
                        print "$section\n".
174
 
                                ( "=" x length( $section ) )."\n";
175
 
                }
176
 
        }
177
 
 
178
 
        # replace tabs with 4 spaces
179
 
        $line =~ s/\t/    /g;
180
 
        
181
 
        # display the line
182
 
        print $line;
183
 
}
184
 
 
185
 
 
186
130
# scan through file
187
 
my $candidate_section = '';
 
131
my $next_section = '';
188
132
my $section = '';
189
 
my $last_line = '';
 
133
my $old_section = '';
190
134
open FILE, "<$todo_dir/todo" or die "can't open todo file";
191
 
while( <FILE> )
192
 
{
 
135
while( <FILE> ) {
 
136
    my $display = 0;
 
137
 
193
138
    # detect the line after section headings, and thus sections
194
 
    if( /^[-=]{2,}/ && $candidate_section ne '' ) {
195
 
        $section = $candidate_section;
196
 
        $candidate_section = '';
197
 
                $last_line = '';
198
 
                next;
 
139
    if( /^[-=]{2,}/ && $next_section ne '' ) {
 
140
        $section = $next_section;
 
141
        $next_section = '';
199
142
    }
200
 
 
201
143
    # detect section headings
202
 
    if( /^[-_\.A-Za-z0-9 ]+$/ ) {
203
 
        $candidate_section = $_;
204
 
                chomp $candidate_section;
205
 
        }
 
144
    elsif( /^[-_\.A-Za-z0-9 ]+$/ ) {
 
145
        $next_section = $_;
 
146
        chomp( $next_section );
 
147
    }
 
148
    # we have neither a section heading nor the line after
206
149
    else {
207
 
        $candidate_section = '';
208
 
        }
209
 
 
210
 
        # display last line
211
 
        display_line( $last_line, $section ) if( $last_line ne '' );
212
 
 
213
 
    # display line
214
 
        if( ( lc( $section ) eq lc( $display_section ) ) ||
215
 
                ( $section && $display_all ) )
216
 
        {
217
 
                $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
        }
218
175
    }
219
 
        else {
220
 
                $last_line = '';
221
 
        }
222
176
}
223
 
display_line( $last_line, $section ) if( $last_line ne '' );