chiark / gitweb /
commitid: In Small, include commitid if it fits
[reprap-play.git] / commitid.scad.pl
index 3c409f5416925e1ba548eaf9f2ba824f5588e991..cfb31f849f85c005f6214d8527a120b4b8a52da8 100755 (executable)
@@ -34,6 +34,7 @@ $SIG{__WARN__} = sub { die @_; };
 #    $Commitid_scale          if not set, we use 1.0 }  together
 #    $Commitid_depth          if not set, we use xy pixel size from above / 2
 #    $Commitid_depth_scale    if not set, we use 1.0 (multiplies depth above)
+#    $Commitid_max_best_scale if not set, we use 2.0 (max mult of xy in Best)
 #
 # For each form we have
 #
@@ -65,6 +66,9 @@ $SIG{__WARN__} = sub { die @_; };
 #       eg if the count is 123456
 #            Small5    3456*
 #            Small8    __123456    (where _ are spaces)
+#       the git objectid is included if it will fit
+#       unambiguously and usefully eg
+#            Small9    ab*123456
 #
 #   Small2S Small4S ... Small10S:
 #   Small3T Small9T:
@@ -248,6 +252,8 @@ our $do_git; # contains may chars 'c' (count) and/or 'o' (object)
 our $do_git_untracked = 1;
 our $argcounter;
 
+our @forms;
+
 sub rjustt ($$;$) { # right justify and truncate (ie, pad and truncate at left)
                     # always includes prefix
     my ($sz, $whole, $prefix) = @_;
@@ -270,6 +276,13 @@ sub ljustt ($$;$) {
 sub genform ($@) {
     my ($form, @lines) = @_;
     gentextmodule($form, @lines);
+    my $f = {
+       Form => $form,
+       Chars => (length join '', @lines),
+       Lines => (scalar @lines),
+       Ambiguous => ($form =~ m/Full/ && !grep { m/\W/ } @lines),
+    };
+    push @forms, $f;
 }
 
 sub genform_q ($$$) {
@@ -346,8 +359,16 @@ sub do_git () {
     foreach my $sz (2..10) {
        gentextmodule_demo_start_batch();
 
-       genform_plusq("Small$sz", rjustt($sz, $git_count, $git_dirty))
-           if defined $git_count;
+       if (defined($git_count)) {
+           my $smallstr = rjustt($sz, $git_count, $git_dirty);
+           if (defined($git_object) && $sz >= length($git_count) + 3) {
+               $smallstr = $git_object;
+               $smallstr .= ($git_dirty || ' ');
+               $smallstr .= $git_count;
+               $smallstr = rjustt($sz, $smallstr);
+           }
+           genform_plusq("Small$sz", $smallstr);
+       }
 
        genform_plusq("Git$sz", ljustt($sz, $git_object, $git_dirty))
            if defined $git_object;
@@ -364,7 +385,68 @@ sub do_git () {
                    rjustt($e, $git_count));
        }
     }
-}    
+}
+
+sub do_some_best ($$) {
+    my ($modname, $formre) = @_;
+    my $fullmodname = "Commitid_${modname}_2D";
+    p "module $fullmodname(max_sz) {\n";
+    p ' sc_max = $Commitid_max_best_scale ? $Commitid_max_best_scale : 2;'."\n";
+    my @do;
+    foreach my $f (
+        sort {
+           $b->{Chars} <=> $a->{Chars} or
+           $a->{Lines} <=> $b->{Chars}
+        }
+        grep {
+           $_->{Form} =~ m/$formre/ &&
+           !$_->{Ambiguous}
+       }
+        @forms
+    ) {
+       my $form = $f->{Form};
+       p " sz_$form = Commitid_${form}_sz();\n";
+       foreach my $rot (qw(0 1)) {
+           my $id = "${form}_r${rot}";
+           p " sc_$id = min(sc_max";
+           foreach my $xy (qw(0 1)) {
+               p ",max_sz[$xy]/sz_$form","[",(($xy xor $rot)+0),"]";
+           }
+           p ");\n";
+           push @do, " if (sc_$id >= 1.0) {\n";
+           push @do, "  scale(sc_$id)\n";
+           push @do, "   rotate(90) translate([0,-sz_$form"."[1]])\n" if $rot;
+           push @do, "   Commitid_${form}_2D();\n";
+           push @do, " } else";
+       }
+    }
+    push @do, <<END;
+ {
+  echo("$fullmodname could not fit anything in", max_sz);
+ }
+END
+    p $_ foreach @do;
+    p "}\n";
+}
+
+sub do_git_best () {
+    return unless $do_git;
+
+    # Auto-computer for `best fit'
+    #
+    # We have two best fit approaches: with count, and git-object-id-only
+    #
+    # For `with count', we only ever include the git object id if the
+    # result would be unambigous.  That means that at least one space
+    # or punctuation was generated.
+    #
+    # We sort the options by firstly number of characters
+    # (decreasing), and then by number of lines (increasing) and
+    # try each one both ways round.
+
+    do_some_best('BestCount', 'Small|Full') if $do_git =~ m/c/;
+    do_some_best('BestObjid', 'Git|Full') if $do_git =~ m/o/;
+}
 
 while (@ARGV) {
     $_ = shift;
@@ -394,6 +476,7 @@ gentextmodule_demo_start_batch();
 gentextmodule('FontDemo', @demo);
 
 do_git();
+do_git_best();
 
 p "module Commitid_2DDemo(){\n";
 p " st = Commitid__scale() * [ 10, 5 ];\n";