diff --git a/rem2pdf/bin/rem2pdf b/rem2pdf/bin/rem2pdf index caf378c3..97eedcf5 100755 --- a/rem2pdf/bin/rem2pdf +++ b/rem2pdf/bin/rem2pdf @@ -33,8 +33,8 @@ my $settings = { fill_entire_page => 0, media => 'Letter', - width => 612, - height => 792, + width => 0, + height => 0, title_font => 'Helvetica', header_font => 'Helvetica', @@ -47,7 +47,7 @@ my $settings = { daynum_size => 14, entry_size => 8, - border_size => 6, + border_size => 4, line_thickness => 1, margin_top => 36, @@ -56,10 +56,62 @@ my $settings = { margin_right => 36, }; +my $ret = GetOptions('landscape|l' => \$settings->{landscape}, + 'small-calendars|c' => \$settings->{small_calendars}, + 'left-numbers|x' => \$settings->{numbers_on_left}, + 'fill-entire-page|e' => \$settings->{fill_entire_page}, + 'fill-page|e' => \$settings->{fill_entire_page}, + 'media|m=s' => \$settings->{media}, + 'width|w=i' => \$settings->{width}, + 'height|h=i' => \$settings->{height}, + 'title-font=s' => \$settings->{title_font}, + 'header-font=s' => \$settings->{header_font}, + 'daynum-font=s' => \$settings->{daynum_font}, + 'entry-font=s' => \$settings->{entry_font}, + 'small-cal-font=s' => \$settings->{small_cal_font}, + 'title-size=f' => \$settings->{title_size}, + 'header-size=f' => \$settings->{header_size}, + 'daynum-size=f' => \$settings->{daynum_size}, + 'entry-size=f' => \$settings->{entry_size}, + 'border-size=f' => \$settings->{border_size}, + 'line-thickness=f' => \$settings->{line_thickness}, + 'margin-top=f' => \$settings->{margin_top}, + 'margin-bottom=f' => \$settings->{margin_bottom}, + 'margin-left=f' => \$settings->{margin_left}, + 'margin-right=f' => \$settings->{margin_right}, + ); +if (!$ret) { + usage(); + exit(1); +} + +if ($settings->{width} <= 0 || + $settings->{height} <= 0) { + my $size = $media_to_size->{ucfirst($settings->{media})}; + if (!$size) { + print STDERR "Unknown media " . $settings->{media} . "\n"; + exit(1); + } + $settings->{width} = $size->[0]; + $settings->{height} = $size->[1]; +} + +if ($settings->{landscape}) { + my $tmp = $settings->{width}; + $settings->{width} = $settings->{height}; + $settings->{height} = $tmp; +} + my $done_one = 0; my $surface = Cairo::PdfSurface->create_for_stream(sub { print $_[1]; }, undef, $settings->{width}, $settings->{height}); + +$surface->set_metadata('title', 'Calendar'); +$surface->set_metadata('author', 'Remind (https://dianne.skoll.ca/projects/remind/)'); +$surface->set_metadata('creator', 'rem2pdf (https://dianne.skoll.ca/projects/remind/)'); +$surface->set_metadata('subject', 'Calendar'); + my $cr = Cairo::Context->create($surface); $cr->set_line_width($settings->{line_thickness}); diff --git a/rem2pdf/lib/Remind/PDF/Entry.pm b/rem2pdf/lib/Remind/PDF/Entry.pm index 691eed84..7b2aca0b 100644 --- a/rem2pdf/lib/Remind/PDF/Entry.pm +++ b/rem2pdf/lib/Remind/PDF/Entry.pm @@ -70,6 +70,22 @@ sub render my ($self, $month, $cr, $settings, $so_far, $day, $col, $height) = @_; # Do nothing in pre-render mode return 0 unless $height; + + # Render in small text at bottom-right + my ($x1, $y1, $x2, $y2) = $month->col_box_coordinates($so_far, $col, $height, $settings); + my $layout = Pango::Cairo::create_layout($cr); + + $layout->set_text($self->{body}); + my $desc = Pango::FontDescription->from_string($settings->{entry_font} . ' ' . int(0.75 * $settings->{entry_size}) . 'px'); + $layout->set_font_description($desc); + my ($wid, $h) = $layout->get_pixel_size(); + + $cr->save(); + $cr->move_to($x2 - $settings->{border_size}/4 - $wid, $y2 - $settings->{border_size}/4 - $h); + Pango::Cairo::show_layout($cr, $layout); + $cr->restore(); + + return 0; } package Remind::PDF::Entry::moon; @@ -191,6 +207,16 @@ package Remind::PDF::Entry::psfile; use base 'Remind::PDF::Entry'; package Remind::PDF::Entry::pango; use base 'Remind::PDF::Entry'; +sub adjust +{ + my ($self) = @_; + if ($self->{body} =~ /^@([-0-9.]+),\s*([-0-9.]+)\s*(.*)/) { + $self->{atx} = $1; + $self->{aty} = $2; + $self->{body} = $3; + } +} + sub render { my ($self, $month, $cr, $settings, $so_far, $day, $col, $height) = @_; @@ -201,13 +227,33 @@ sub render $layout->set_width(1024 * ($x2 - $x1 - 2 * $settings->{border_size})); $layout->set_wrap('word-char'); $layout->set_markup($self->{body}); + + if (($layout->get_text() // '') eq '') { + # Invalid markup + return 0; + } my $desc = Pango::FontDescription->from_string($settings->{entry_font} . ' ' . $settings->{entry_size} . 'px'); $layout->set_font_description($desc); my ($wid, $h) = $layout->get_pixel_size(); if ($height) { $cr->save(); - $cr->move_to($x1 + $settings->{border_size}, $so_far); + if (defined($self->{atx}) && defined($self->{aty})) { + my ($x, $y); + if ($self->{atx} < 0) { + $x = $x2 + $self->{atx} - $wid; + } else { + $x = $x1 + $self->{atx}; + } + if ($self->{aty} < 0) { + $y = $y2 + $self->{aty} - $h; + } else { + $y = $y1 + $self->{aty}; + } + $cr->move_to($x, $y); + } else { + $cr->move_to($x1 + $settings->{border_size}, $so_far); + } Pango::Cairo::show_layout($cr, $layout); $cr->restore(); } diff --git a/rem2pdf/lib/Remind/PDF/Month.pm b/rem2pdf/lib/Remind/PDF/Month.pm index 98e42bc0..a7058218 100644 --- a/rem2pdf/lib/Remind/PDF/Month.pm +++ b/rem2pdf/lib/Remind/PDF/Month.pm @@ -172,6 +172,7 @@ sub render # Remaining space on page $self->{remaining_space} = $settings->{height} - $settings->{margin_bottom} - $so_far; + $self->{minimum_row_height} = $self->{remaining_space} / 9; # First column my $first_col = $self->{firstwkday}; if ($self->{mondayfirst}) { @@ -213,6 +214,9 @@ sub render push(@{$self->{horiz_lines}}, $so_far); } + if ($so_far > $settings->{height} - $settings->{margin_bottom}) { + print STDERR "WARNING: overfull calendar box\n"; + } # The vertical lines my $cell = ($settings->{width} - $settings->{margin_left} - $settings->{margin_right}) / 7; for (my $i=0; $i<=7; $i++) { @@ -227,6 +231,9 @@ sub render $cr->line_to($settings->{width} - $settings->{margin_right}, $y); $cr->stroke(); } + + # Done this page + $cr->show_page(); } sub draw_row @@ -252,6 +259,9 @@ sub draw_row $height = $self->{row_height} - $settings->{border_size}; } + if ($height < $self->{minimum_row_height}) { + $height = $self->{minimum_row_height}; + } # Now draw for real while ($col < 7) { $self->draw_day($cr, $settings, $so_far, $day, $col, $height); @@ -328,6 +338,15 @@ sub draw_day $entry->render($self, $cr, $settings, $top, $day, $col, $height); next; } + + # An absolutely-positioned Pango markup should not adjust height + # either + if ($entry->isa('Remind::PDF::Entry::pango') && + defined($entry->{atx}) && defined($entry->{aty})) { + $entry->render($self, $cr, $settings, $top, $day, $col, $height); + next; + } + # Shade is done already if ($entry->isa('Remind::PDF::Entry::shade')) { next; @@ -341,6 +360,12 @@ sub draw_day $entry_height += $h2; $so_far += $h2; } + if ($height) { + if ($entry_height > $height) { + print STDERR "WARNING: overfull box at $day " . $self->{monthname} . ' ' . $self->{year} . "\n"; + $entry_height = $height; + } + } return $h + $entry_height + 2 * $settings->{border_size}; } @@ -375,7 +400,7 @@ sub draw_daynames $height = $h; } } - return $so_far + $height + $settings->{border_size}; + return $so_far + $height + $settings->{border_size} * .75; } sub draw_title @@ -383,6 +408,7 @@ sub draw_title my ($self, $cr, $settings) = @_; my $title = $self->{monthname} . ' ' . $self->{year}; + $cr->get_target()->set_page_label($title); my $layout = Pango::Cairo::create_layout($cr); $layout->set_text(Encode::decode('UTF-8', $title)); my $desc = Pango::FontDescription->from_string($settings->{title_font} . ' ' . $settings->{title_size} . 'px'); diff --git a/tests/scripts.rem b/tests/scripts.rem index c158917f..3dbb0c76 100644 --- a/tests/scripts.rem +++ b/tests/scripts.rem @@ -12,9 +12,12 @@ REM 10 SPECIAL COLOR 0 128 0 Напоминание REM 11 SPECIAL COLOR 128 0 0 Υπενθύμιση REM 12 SPECIAL PANGO Bold and Italic and underline REM 12 MSG Hello +REM 12 SPECIAL PANGO Very Fancy -REM 13 SPECIAL PANGO Invalid +REM 13 SPECIAL PANGO Invalid +REM 13 MSG Hello Again +REM 15 SPECIAL PANGO @1,-1 [hebday($U)] [hebmon($U)] Rise [sunrise($U)] Set [sunset($U)] REM 1 SPECIAL SHADE 128 255 128 REM [moondate(0)] SPECIAL MOON 0 @@ -22,4 +25,4 @@ REM [moondate(1)] SPECIAL MOON 1 REM [moondate(2)] SPECIAL MOON 2 -1 -1 [moontime(2)] REM [moondate(3)] SPECIAL MOON 3 -1 -1 [moontime(3)] -REM Mon SPECIAL WEEK [weekno(today())] \ No newline at end of file +REM Mon SPECIAL WEEK (W[weekno(today())]) \ No newline at end of file