diff lib/CLI.pm @ 36:74859abd87cc

update cli tool
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 07 May 2018 12:59:27 +0900
parents
children 202d1ab8775a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/CLI.pm	Mon May 07 12:59:27 2018 +0900
@@ -0,0 +1,191 @@
+package CLI;
+use strict;
+use warnings;
+use utf8;
+
+use DDP { deparse => 1 };
+
+use Smart::Options;
+use Smart::Options::Declare;
+use Time::Piece;
+use Time::Seconds;
+use Capture::Tiny qw/capture/;
+use Path::Tiny;
+use File::chdir;
+use Carp qw/croak/;
+
+use Class::Tiny qw/ template root_dir/;
+use feature 'say';
+
+sub run {
+    my($self,@args) = @_;
+    my $opt = Smart::Options->new->options(
+        file => { describe => 'target file', alias => 'f'}
+    );
+    $opt->subcmd(
+           new    => Smart::Options->new(),
+           build  => Smart::Options->new(),
+           open   => Smart::Options->new->default('target' => 'slide.md'),
+           'build_open' => Smart::Options->new->default('target' => 'slide.md'),
+           upload => Smart::Options->new(),
+           memo => Smart::Options->new(),
+           edit => Smart::Options->new(),
+           zip => Smart::Options->new(),
+     );
+
+    my $result = $opt->parse(@args);
+    my $command = $result->{command} // "open";
+
+    my $option = $result->{cmd_option}->{f} || $result->{cmd_option}->{file} || 0;
+
+    my $call= $self->can("cmd_$command");
+    croak 'undefine subcommand' unless $call;
+    $self->$call($option);
+}
+
+sub cmd_new {
+    my ($self) = @_;
+    my ($y,$m,$d) = _y_m_d();
+    my $slide = path($self->root_dir)->child($y)->child($m)->child($d)->child('slide.md')->touchpath;
+    path($self->template)->copy($slide);
+}
+
+sub cmd_build {
+    my($self,$target) = @_;
+
+    if ($target){
+        $target = path($target);
+        $self->_build($target->dirname,$target->basename);
+    } else {
+        $self->_build($self->_search_recently_day());
+    }
+}
+
+sub _build {
+    my ($self,$dir,$target) = @_;
+
+    $target //= 'slide.md';
+
+    say "[AUTO] BUILD at $dir/$target";
+
+    local $CWD = $dir;
+
+    my ($stdout,$stderr,$exit) = capture {
+        system("slideshow build ${target} -t s6cr");
+    };
+
+    croak "Perl can't build...." if $stderr;
+}
+
+sub cmd_build_open {
+    my($self,$target) = @_;
+    $self->cmd_build($target);
+    if($target){
+        $target =~ s/\.md$/\.html/;
+    }
+    $self->cmd_open(path($target));
+}
+
+sub cmd_open {
+    my($self,$slide) = @_;
+    
+    my $target;
+
+    if ($slide){
+       $target = $slide;
+    } else {
+       $slide  = 'slide.html';
+       $target = $self->_search_recently_day()->child($slide);
+    }
+
+    if($target->realpath){
+       system 'open', ($target->realpath);
+    } else {
+       croak 'dont found slide.html';
+    }
+}
+
+sub cmd_upload {
+    say "[AUTO]hg addremove";
+    my ($stdout,$stderr,$exit) = capture {
+        system("hg addremove");
+        system("hg add");
+    };
+
+
+    croak "didn't add" if $stderr;
+
+    say "[AUTO]hg commit -m auto-Update generated slides by script";
+
+    ($stdout,$stderr,$exit) = capture { system('hg commit -m "auto-Update generated slides by script"');};
+
+    if ($stderr) { say $stderr; croak "didn't commit";}
+
+    say "[AUTO]hg push";
+
+    ($stdout,$stderr,$exit) = capture { system('hg push'); };
+
+    if ( $stderr ) {
+        say $stderr;
+        croak "didn't commit";
+    } else {
+        say $stdout;
+    }
+}
+
+sub _y_m_d {
+    my $t = localtime;
+    # ex... 2018/02/14
+    ($t->strftime('%Y'), $t->strftime('%m'), $t->strftime('%d'));
+}
+
+sub _search_recently_day {
+    my($self) = @_;
+    my ($y,$m,$d) = _y_m_d();
+    my $root_dir = path($self->root_dir)->child($y)->child($m);
+
+    my $date = shift @{ [sort { $b->stat->mtime <=> $a->stat->mtime } $root_dir->children]};
+    return $date;
+}
+
+sub cmd_memo {
+    my ($self) = @_;
+    my ($y,$m,$d) = _y_m_d();
+    my $memo = path($self->root_dir)->child($y)->child($m)->child($d)->child('memo.txt')->touchpath;
+    exec $ENV{EDITOR},($memo->realpath);
+}
+
+sub cmd_edit {
+    my ($self) = @_;
+    my $recent_day = $self->_search_recently_day();
+    my @targets = $recent_day->children(qr/\.md$/);
+    my $target = pop @targets;
+    exec $ENV{EDITOR},($target->realpath);
+}
+
+sub cmd_zip {
+    my ($self) = @_;
+    my $recent_day = $self->_search_recently_day();
+    my $t = localtime;
+    my $zip = $recent_day->child('zip.txt')->touch->opena;
+
+    $t-= ONE_WEEK;
+
+    for(1..7){
+       my($y,$m,$d)=($t->strftime('%Y'), $t->strftime('%m'), $t->strftime('%d'));
+       my $memo = path($self->root_dir)->child($y)->child($m)->child($d)->child('memo.txt');
+
+       unless ($memo->exists) {
+           $t += ONE_DAY;
+           next;
+       }
+
+       say $zip "$y-$m-$d----";
+       say $zip $memo->slurp;
+       say $zip "----------";
+       $t += ONE_DAY;
+    }
+}
+
+
+1;