/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 12:46:10 UTC
  • Revision ID: edam@waxworlds.org-20120104124610-nrrs6mv1btg390ni
rewrite file parsing to cache the last line and only display it when we know the current line is not a section heading "underline" line.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/perl
2
2
 
 
3
use feature "state";
 
4
 
3
5
use strict;
4
6
use warnings;
5
7
use Getopt::Long;
34
36
# help mode
35
37
if( $mode_help ) {
36
38
    print "todo - display your todo file\n\n".
37
 
        "Usage: $app_name [OPTIONS]\n\n".
38
 
        "Options:\n".
39
 
        "  -a, --all              display all sections\n".
40
 
        "  -e, --edit             edit your todo file\n".
41
 
        "  -h, --headers          show setion headers\n".
42
 
        "  -s, --section=SECTION  display this named section\n".
43
 
        "      --help     display this help and exit\n".
44
 
        "      --version  output version information and exit\n";
 
39
    "Usage: $app_name [OPTIONS]\n\n".
 
40
    "Options:\n".
 
41
    "  -a, --all              display all sections\n".
 
42
    "  -e, --edit             edit your todo file\n".
 
43
    "  -h, --headers          show setion headers\n".
 
44
    "      --section=SECTION  display this named section\n".
 
45
    "      --help     display this help and exit\n".
 
46
    "      --version  output version information and exit\n";
45
47
    exit( 0 );
46
48
}
47
49
 
48
50
# version mode
49
51
if( $mode_version ) {
50
 
    print "todo 1.0\n" .
51
 
        "Copyright (C) 2011 Tim Marston.\n";
 
52
    print "todo 1.0\n".
 
53
        "Copyright (C) 2011 Tim Marston.\n".
 
54
        "http://ed.am/software/todo\n";
52
55
    exit( 0 );
53
56
}
54
57
 
68
71
if( $mode_edit )
69
72
{
70
73
    # create the todo directory, as necessary
71
 
        if( ! -d $todo_dir ) {
72
 
                mkdir $todo_dir or die "couldn't create todo directory";
73
 
                `bzr init --no-aliases -q "$todo_dir"`;
74
 
                $? == 0 or die "couldn't init bzr repo";
75
 
        }
76
 
        
77
 
        # create a default todo file, as necessary
78
 
        if( ! -f "$todo_dir/todo" ) {
79
 
                open FILE, ">$todo_dir/todo" or die "couldn't create default todo file";
80
 
                my $content = <<"EOT";
 
74
    if( ! -d $todo_dir ) {
 
75
        mkdir $todo_dir or die "couldn't create todo directory";
 
76
        `bzr init --no-aliases -q "$todo_dir"`;
 
77
        $? == 0 or die "couldn't init bzr repo";
 
78
    }
 
79
    
 
80
    # create a default todo file, as necessary
 
81
    if( ! -f "$todo_dir/todo" ) {
 
82
        open FILE, ">$todo_dir/todo" or die "couldn't create default todo file";
 
83
        my $content = <<"EOT";
81
84
<!-- This file uses Markdown syntax. For more info about Markdown
82
85
     syntax, see http://daringfireball.net/projects/markdown/syntax.
83
86
 
93
96
 
94
97
EOT
95
98
        print FILE $content or die "couldn't write default todo file";
96
 
                close FILE;
97
 
                `bzr add --no-aliases -q "$todo_dir/todo"`;
98
 
                $? == 0 or die "couldn't add todo file to bzr repo";
99
 
        }
 
99
        close FILE;
 
100
        `bzr add --no-aliases -q "$todo_dir/todo"`;
 
101
        $? == 0 or die "couldn't add todo file to bzr repo";
 
102
    }
100
103
 
101
104
    # determine editor from environment, default to "emacs -nw"
102
105
    my $editor = $ENV{ 'EDITOR' };
104
107
    my @exec_array = split( / +/, $editor );
105
108
    push( @exec_array, "$todo_dir/todo" );
106
109
 
107
 
        # detect emacs and try to use markdown-mode
108
 
        $exec_array[ 0 ] eq "emacs" and
109
 
                push( @exec_array, '--funcall=markdown-mode' );
 
110
    # detect emacs and try to use markdown-mode
 
111
    $exec_array[ 0 ] eq "emacs" and
 
112
        push( @exec_array, '--funcall=markdown-mode' );
110
113
 
111
114
    # edit todo file
112
115
    system( @exec_array );
113
 
        $? == 0 or die "unable to exec editor";
114
 
 
115
 
        # check for changes and commit it
116
 
        $output = `bzr status --no-aliases "$todo_dir/todo"`;
117
 
        $? == 0 or die "couldn't check bzr rerpo status";
118
 
        chomp $output;
119
 
        if( $output ne "" ) {
120
 
                `bzr commit --no-aliases -q -m - "$todo_dir/todo"`;
121
 
                $? == 0 or die "couldn't commit to bzr repo";
 
116
    $? == 0 or
 
117
        die "can't start editor, check EDITOR envionment variable";
 
118
 
 
119
    # check for changes and commit it
 
120
    $output = `bzr status --no-aliases "$todo_dir/todo"`;
 
121
    $? == 0 or die "couldn't check bzr rerpo status";
 
122
    chomp $output;
 
123
    if( $output ne "" ) {
 
124
        `bzr commit --no-aliases -q -m - "$todo_dir/todo"`;
 
125
        $? == 0 or die "couldn't commit to bzr repo";
 
126
    }
 
127
 
 
128
    # after editing, exit
 
129
    exit
 
130
}
 
131
 
 
132
# function to display a line
 
133
sub display_line
 
134
{
 
135
        my ( $line, $section ) = @_;
 
136
        state $old_section = '';
 
137
 
 
138
        # detect section change
 
139
        if( $section ne $old_section ) {
 
140
                $old_section = $section;
 
141
                
 
142
                # display section heading
 
143
                if( $display_headers || $display_all ) {
 
144
                        print "$section\n".
 
145
                                ( "=" x length( $section ) )."\n";
 
146
                }
122
147
        }
123
148
 
124
 
        # after editing, exit
125
 
        exit
 
149
        # replace tabs with 4 spaces
 
150
        $line =~ s/\t/    /g;
 
151
        
 
152
        # display the line
 
153
        print $line;
126
154
}
127
155
 
 
156
 
128
157
# scan through file
129
 
my $next_section = '';
 
158
my $candidate_section = '';
130
159
my $section = '';
131
 
my $old_section = '';
 
160
my $last_line = '';
132
161
open FILE, "<$todo_dir/todo" or die "can't open todo file";
133
 
while( <FILE> ) {
134
 
    my $display = 0;
135
 
 
 
162
while( <FILE> )
 
163
{
136
164
    # detect the line after section headings, and thus sections
137
 
    if( /^[-=]{2,}/ && $next_section ne '' ) {
138
 
                $section = $next_section;
139
 
                $next_section = '';
 
165
    if( /^[-=]{2,}/ && $candidate_section ne '' ) {
 
166
        $section = $candidate_section;
 
167
        $candidate_section = '';
 
168
                $last_line = '';
 
169
                next;
140
170
    }
 
171
 
141
172
    # detect section headings
142
 
    elsif( /^[A-Z]+$/ ) {
143
 
                $next_section = $_;
144
 
                chomp( $next_section );
145
 
    }
146
 
    # we have neither a section heading nor the line after
 
173
    if( /^[-_\.A-Za-z0-9 ]+$/ ) {
 
174
        $candidate_section = $_;
 
175
                chomp $candidate_section;
 
176
        }
147
177
    else {
148
 
                $next_section = '';
149
 
 
150
 
                # display line
151
 
                if( ( $section eq $display_section ) ||
152
 
                        ( $section && $display_all ) )
153
 
                {
154
 
                        # detect section change
155
 
                        if( $section ne $old_section ) {
156
 
                                $old_section = $section;
157
 
                                
158
 
                                # display section heading
159
 
                                if( $display_headers ||
160
 
                                        $display_all )
161
 
                                {
162
 
                                        print "$section\n".
163
 
                                                ( "=" x length( $section ) )."\n";
164
 
                                }
165
 
                        }
166
 
 
167
 
                        # replace tabs with 4 spaces
168
 
                        s/\t/    /g;
169
 
 
170
 
                        # display the line
171
 
                        print;
172
 
                }
 
178
        $candidate_section = '';
 
179
        }
 
180
 
 
181
        # display last line
 
182
        display_line( $last_line, $section ) if( $last_line ne '' );
 
183
 
 
184
    # display line
 
185
        if( ( $section eq $display_section ) ||
 
186
                ( $section && $display_all ) )
 
187
        {
 
188
                $last_line = $_;
173
189
    }
 
190
        else {
 
191
                $last_line = '';
 
192
        }
174
193
}
 
194
display_line( $last_line, $section ) if( $last_line ne '' );