/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

11
11
# option defaults
12
12
my $todo_dir = "~/.todo";
13
13
my $display_all = 0;
14
 
my $display_section = "IMMEDIATE";
 
14
my $display_section = "TODO";
15
15
my $display_headers = 0;
16
16
my $mode_edit = 0;
17
17
my $mode_help = 0;
34
34
# help mode
35
35
if( $mode_help ) {
36
36
    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";
 
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";
45
45
    exit( 0 );
46
46
}
47
47
 
48
48
# version mode
49
49
if( $mode_version ) {
50
 
    print "todo 1.0\n" .
51
 
        "Copyright (C) 2011 Tim Marston.\n";
 
50
    print "todo 1.0\n".
 
51
        "Copyright (C) 2011 Tim Marston.\n".
 
52
        "http://ed.am/software/todo\n";
52
53
    exit( 0 );
53
54
}
54
55
 
68
69
if( $mode_edit )
69
70
{
70
71
    # 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
 
                `> "$todo_dir/todo"`;
76
 
                $? == 0 or die "couldn't create initial todo file";
77
 
                `bzr add --no-aliases -q "$todo_dir/todo"`;
78
 
                $? == 0 or die "couldn't add todo file to bzr repo";
79
 
        }
 
72
    if( ! -d $todo_dir ) {
 
73
        mkdir $todo_dir or die "couldn't create todo directory";
 
74
        `bzr init --no-aliases -q "$todo_dir"`;
 
75
        $? == 0 or die "couldn't init bzr repo";
 
76
    }
 
77
    
 
78
    # create a default todo file, as necessary
 
79
    if( ! -f "$todo_dir/todo" ) {
 
80
        open FILE, ">$todo_dir/todo" or die "couldn't create default todo file";
 
81
        my $content = <<"EOT";
 
82
<!-- This file uses Markdown syntax. For more info about Markdown
 
83
     syntax, see http://daringfireball.net/projects/markdown/syntax.
 
84
 
 
85
     There should be a main H1 header called "TODO" for the main todo
 
86
     list section (one has been added for you below). You can also add
 
87
     as many more sections as you like for other lists. And feel free
 
88
     to delete this comment! -->
 
89
 
 
90
TODO
 
91
====
 
92
 
 
93
* make a list of things to do
 
94
 
 
95
EOT
 
96
        print FILE $content or die "couldn't write default todo file";
 
97
        close FILE;
 
98
        `bzr add --no-aliases -q "$todo_dir/todo"`;
 
99
        $? == 0 or die "couldn't add todo file to bzr repo";
 
100
    }
80
101
 
81
102
    # determine editor from environment, default to "emacs -nw"
82
103
    my $editor = $ENV{ 'EDITOR' };
84
105
    my @exec_array = split( / +/, $editor );
85
106
    push( @exec_array, "$todo_dir/todo" );
86
107
 
87
 
        # detect emacs and try to use markdown-mode
88
 
        $exec_array[ 0 ] eq "emacs" and push( @exec_array, '--funcall=markdown-mode' );
 
108
    # detect emacs and try to use markdown-mode
 
109
    $exec_array[ 0 ] eq "emacs" and
 
110
        push( @exec_array, '--funcall=markdown-mode' );
89
111
 
90
112
    # edit todo file
91
113
    system( @exec_array );
92
 
        $? == 0 or die "unable to exec editor";
93
 
 
94
 
        # check for changes and commit it
95
 
        $output = `bzr status --no-aliases "$todo_dir/todo"`;
96
 
        $? == 0 or die "couldn't check bzr rerpo status";
97
 
        chomp $output;
98
 
        if( $output ne "" ) {
99
 
                `bzr commit --no-aliases -q -m - "$todo_dir/todo"`;
100
 
                $? == 0 or die "couldn't commit to bzr repo";
101
 
        }
102
 
        
103
 
        # exit
104
 
        exit
 
114
    $? == 0 or
 
115
        die "can't start editor, check EDITOR envionment variable";
 
116
 
 
117
    # check for changes and commit it
 
118
    $output = `bzr status --no-aliases "$todo_dir/todo"`;
 
119
    $? == 0 or die "couldn't check bzr rerpo status";
 
120
    chomp $output;
 
121
    if( $output ne "" ) {
 
122
        `bzr commit --no-aliases -q -m - "$todo_dir/todo"`;
 
123
        $? == 0 or die "couldn't commit to bzr repo";
 
124
    }
 
125
 
 
126
    # after editing, exit
 
127
    exit
105
128
}
106
129
 
107
130
# scan through file
114
137
 
115
138
    # detect the line after section headings, and thus sections
116
139
    if( /^[-=]{2,}/ && $next_section ne '' ) {
117
 
                $section = $next_section;
118
 
                $next_section = '';
 
140
        $section = $next_section;
 
141
        $next_section = '';
119
142
    }
120
143
    # detect section headings
121
 
    elsif( /^[A-Z]+$/ ) {
122
 
                $next_section = $_;
123
 
                chomp( $next_section );
 
144
    elsif( /^[-_\.A-Za-z0-9 ]+$/ ) {
 
145
        $next_section = $_;
 
146
        chomp( $next_section );
124
147
    }
125
148
    # we have neither a section heading nor the line after
126
149
    else {
127
 
                $next_section = '';
128
 
 
129
 
                # display line
130
 
                if( $section eq $display_section ||
131
 
                        $display_all )
132
 
                {
133
 
                        # detect section change
134
 
                        if( $section ne $old_section ) {
135
 
                                $old_section = $section;
136
 
                                
137
 
                                # display section heading
138
 
                                if( $display_headers ||
139
 
                                        $display_all )
140
 
                                {
141
 
                                        my $heading = 'TODO';
142
 
                                        $heading .= ' ('.lc( $section ).')' if $section ne "IMMEDIATE";
143
 
                                        print "$heading\n".
144
 
                                                ( "=" x length( $heading ) )."\n";
145
 
                                }
146
 
                        }
147
 
 
148
 
                        # replace tabs with 4 spaces
149
 
                        s/\t/    /g;
150
 
 
151
 
                        # display the line
152
 
                        print;
153
 
                }
 
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
        }
154
175
    }
155
176
}