Skip to content
This repository was archived by the owner on Aug 10, 2025. It is now read-only.

Commit 5ba5152

Browse files
authored
Add page label info to page marker flags (#1308)
See equivalent edits in GG2 (PR #330). Will not work with older versions of GG2. DistributedProofreaders/guiguts-py#330
1 parent 347c904 commit 5ba5152

File tree

1 file changed

+79
-8
lines changed

1 file changed

+79
-8
lines changed

src/lib/Guiguts/FileMenu.pm

Lines changed: 79 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ BEGIN {
1414
&cpcharactersubs &getsafelastpath &add_page_marker_flags &remove_page_marker_flags);
1515
}
1616

17+
my $marker_flag_regex = '\[Img(.+?)\|(.+?)\|(.+?)\]';
18+
1719
#
1820
# Wrapper routine to find a text/HTML file and open it
1921
sub file_open {
@@ -477,7 +479,7 @@ sub file_mark_pages {
477479
my $pagemark = 'Pg' . $page;
478480

479481
# Standardize page separator line format if necessary
480-
unless ( $line =~ /^-----File: (\S+)\.(png|jpg)---/ or $line =~ /\[Pg\S+?\]/ ) {
482+
unless ( $line =~ /^-----File: (\S+)\.(png|jpg)---/ or $line =~ /$marker_flag_regex/ ) {
481483
$textwindow->ntdelete( $linestart, $lineend );
482484
my $stdline = ( '-' x 5 ) . "File: $page.$ext";
483485
$stdline .= '-' x ( 75 - length($stdline) );
@@ -640,11 +642,38 @@ sub file_guess_page_marks {
640642
# Add page marker flags to facilitate editing in another editor
641643
sub add_page_marker_flags {
642644

643-
# Done in reverse order so two adjacent boundaries preserve their order.
644-
my $mark = 'end';
645+
# Get name of first page mark because it needs special treatment if
646+
# labels haven't been set up yet.
647+
my $mark = '1.0';
648+
my $firstmark = '';
649+
while ( $mark = $::textwindow->markNext($mark) ) {
650+
if ( $mark =~ /Pg\S+/ ) {
651+
$firstmark = $mark;
652+
last;
653+
}
654+
}
655+
656+
# Work in reverse order so two adjacent boundaries preserve their order.
657+
$mark = 'end';
645658
while ( $mark = $::textwindow->markPrevious($mark) ) {
646659
if ( $mark =~ /Pg\S+/ ) {
647-
$::textwindow->insert( $mark, "[$mark]", 'pageflag' );
660+
my $img = $mark;
661+
$img =~ s/Pg//;
662+
my $style = $::pagenumbers{$mark}{style};
663+
if ( not defined($style) or length($style) == 0 ) {
664+
$style = $mark eq $firstmark ? 'Arabic' : '"';
665+
}
666+
my $number = '+1';
667+
my $action = $::pagenumbers{$mark}{action};
668+
if ( not defined($action) or length($action) == 0 ) {
669+
$number = '1' if $mark eq $firstmark;
670+
} elsif ( $action eq 'Start @' ) {
671+
$number = $::pagenumbers{$mark}{base};
672+
} else {
673+
$number = $::pagenumbers{$mark}{action};
674+
}
675+
676+
$::textwindow->insert( $mark, "[Img$img|$style|$number]", 'pageflag' );
648677
}
649678
}
650679
}
@@ -654,7 +683,8 @@ sub add_page_marker_flags {
654683
sub remove_page_marker_flags {
655684
my $len;
656685
while ( my $found =
657-
$::textwindow->search( '-regexp', '-count', \$len, '--', '\[Pg\S+?\]', "1.0", "end" ) ) {
686+
$::textwindow->search( '-regexp', '-count', \$len, '--', $marker_flag_regex, "1.0", "end" )
687+
) {
658688
$::textwindow->delete( $found, "$found+${len}c" );
659689
}
660690
}
@@ -664,19 +694,60 @@ sub remove_page_marker_flags {
664694
sub update_page_markers_from_flags {
665695
my $textwindow = $::textwindow;
666696

697+
# Nothing to do if no flags
698+
return if not $textwindow->search( '-regexp', '--', $marker_flag_regex, '1.0', 'end' );
699+
700+
# Clear all page marks
701+
for ( $textwindow->markNames() ) {
702+
$textwindow->markUnset($_) if $_ =~ m{Pg(\S+)};
703+
}
704+
%::pagenumbers = ();
705+
667706
my $len;
668707
my $search_start = '1.0';
708+
my $cur_page = 1;
709+
my $cur_style = 'Arabic';
669710
while (
670711
my $found = $textwindow->search(
671-
'-regexp', '-count', \$len, '--', '\[(Pg\S+?)\]', $search_start, 'end'
712+
'-regexp', '-count', \$len, '--', $marker_flag_regex, $search_start, 'end'
672713
)
673714
) {
674715
$textwindow->tagAdd( 'pageflag', "$found", "$found+${len}c" );
675-
my $pagemark = $textwindow->get( "$found+1c", "$found+${len}c-1c" );
716+
my $pageflag = $textwindow->get( $found, "$found+${len}c" );
717+
$pageflag =~ $marker_flag_regex;
718+
719+
# Will always match since same regex as above
720+
my $img = $1;
721+
my $style = $2;
722+
my $number = $3;
723+
my $pagemark = "Pg$img";
724+
$::pagenumbers{$pagemark} = {};
676725
$::pagenumbers{$pagemark}{offset} = 1;
726+
$::pagenumbers{$pagemark}{style} = $style;
727+
$cur_style = $style if $style ne '"';
728+
729+
if ( $number eq "No Count" ) {
730+
$::pagenumbers{$pagemark}{action} = "No Count";
731+
$::pagenumbers{$pagemark}{label} = "";
732+
} else {
733+
if ( $number eq "+1" ) {
734+
$::pagenumbers{$pagemark}{action} = "+1";
735+
$cur_page++;
736+
} else {
737+
$::pagenumbers{$pagemark}{action} = "Start @";
738+
$::pagenumbers{$pagemark}{base} = $number;
739+
$cur_page = $number;
740+
}
741+
if ( $cur_style eq 'Roman' ) {
742+
$::pagenumbers{$pagemark}{label} = "Pg " . lc( ::roman($cur_page) or '' );
743+
} else {
744+
$::pagenumbers{$pagemark}{label} = "Pg $cur_page";
745+
}
746+
}
747+
677748
$textwindow->markSet( $pagemark, $found );
678749
$textwindow->markGravity( $pagemark, 'left' );
679-
$search_start = $textwindow->index("$found+4c");
750+
$search_start = $textwindow->index("$found+7c");
680751
}
681752
}
682753

0 commit comments

Comments
 (0)