<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package LatexIndent::Check;

#	This program is free software: you can redistribute it and/or modify
#	it under the terms of the GNU General Public License as published by
#	the Free Software Foundation, either version 3 of the License, or
#	(at your option) any later version.
#
#	This program is distributed in the hope that it will be useful,
#	but WITHOUT ANY WARRANTY; without even the implied warranty of
#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#	GNU General Public License for more details.
#
#	See http://www.gnu.org/licenses/.
#
#	Chris Hughes, 2017
#
#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
use strict;
use warnings;
use Exporter              qw/import/;
use LatexIndent::LogFile  qw/$logger/;
use LatexIndent::Switches qw/$is_m_switch_active $is_check_verbose_switch_active/;
our @ISA       = "LatexIndent::Document";    # class inheritance, Programming Perl, pg 321
our @EXPORT_OK = qw/simple_diff/;

sub simple_diff {
    my $self = shift;

    # simple diff...
    $logger-&gt;info("*simple diff: (check switch active)");

    # check switch work below here
    if ( ${$self}{originalBody} eq ${$self}{body} ) {
        $logger-&gt;info("no differences, no diff to report");
        return;
    }

    # otherwise we loop through the old and new body, and make comparisons
    my @oldBody = split( "\n", ${$self}{originalBody} );
    my @newBody = split( "\n", ${$self}{body} );
    my @diff    = ();

    # this loop stores the differences ...
    if ($is_m_switch_active) {

        # if -m *is* active, then the number of lines in old and new may not be the same
        # so we need to go through the options
        my $maxLines = ( $#oldBody &gt;= $#newBody ? $#oldBody : $#newBody );

        # loop through to maxLines, accounting for the three scenarios:
        #
        #   oldBody[lineCount] and newBody[lineCount] both defined
        #   oldBody[lineCount] defined and newBody[lineCount] not defined
        #   oldBody[lineCount] not defined and newBody[lineCount] defined
        #
        for ( my $lineCount = 0; $lineCount &lt;= $maxLines; $lineCount++ ) {
            if ( $lineCount &lt;= $#oldBody and $lineCount &lt;= $#newBody ) {
                if ( $oldBody[$lineCount] ne $newBody[$lineCount] ) {
                    push( @diff,
                        { old =&gt; $oldBody[$lineCount], new =&gt; $newBody[$lineCount], lineNumber =&gt; $lineCount + 1 } );
                }
            }
            elsif ( $lineCount &lt;= $#oldBody ) {
                push( @diff, { old =&gt; $oldBody[$lineCount], lineNumber =&gt; $lineCount + 1 } );
            }
            else {
                push( @diff, { new =&gt; $newBody[$lineCount], lineNumber =&gt; $lineCount + 1 } );
            }
        }
    }
    else {
        # if -m is not active, then the number of lines in old and new will be the same
        for ( my $lineCount = 0; $lineCount &lt;= $#oldBody; $lineCount++ ) {
            if ( $oldBody[$lineCount] ne $newBody[$lineCount] ) {
                push( @diff,
                    { old =&gt; $oldBody[$lineCount], new =&gt; $newBody[$lineCount], lineNumber =&gt; $lineCount + 1 } );
            }
        }
    }

    # initialise the old and new tmp body for storage
    my $tmpOldBody         = '-';
    my $tmpNewBody         = '+';
    my $previousLineNumber = -1;

    # and the 'diff chunk' storage array
    my @diffChunks               = ();
    my $diffChunkFirstLineNumber = ${ $diff[0] }{lineNumber};

    # ... and this loop combines the diffs into chunks
    for my $i ( 0 .. $#diff ) {

        my $currentLineNumber = ${ $diff[$i] }{lineNumber};

        if ( $i == $#diff
            or ( $previousLineNumber &gt;= 0 and $currentLineNumber &gt; ( $previousLineNumber + 1 ) ) )
        {

            my $lastLine = ${ $diff[ $i - 1 ] }{lineNumber};

            if ( $i == $#diff ) {
                $lastLine = $currentLineNumber;
                $tmpOldBody .= ( $tmpOldBody eq '-' ? q() : "\n-" ) . ${ $diff[$i] }{old};
                $tmpNewBody .= ( $tmpNewBody eq '+' ? q() : "\n+" ) . ${ $diff[$i] }{new};
            }

            push(
                @diffChunks,
                {   old       =&gt; $tmpOldBody,
                    new       =&gt; $tmpNewBody,
                    firstLine =&gt; $diffChunkFirstLineNumber,
                    lastLine  =&gt; $lastLine
                }
            );

            $tmpOldBody               = '-' . ${ $diff[$i] }{old} if defined ${ $diff[$i] }{old};
            $tmpNewBody               = '+' . ${ $diff[$i] }{new} if defined ${ $diff[$i] }{new};
            $diffChunkFirstLineNumber = $currentLineNumber;
        }
        else {
            $tmpOldBody .= ( $tmpOldBody eq '-' ? q() : "\n-" ) . ${ $diff[$i] }{old} if defined ${ $diff[$i] }{old};
            $tmpNewBody .= ( $tmpNewBody eq '+' ? q() : "\n+" ) . ${ $diff[$i] }{new} if defined ${ $diff[$i] }{new};
        }

        $previousLineNumber = ${ $diff[$i] }{lineNumber};
    }

    # finally, output the diff chunks
    foreach (@diffChunks) {
        $logger-&gt;info("@@ ${$_}{firstLine} -- ${$_}{lastLine} @@");
        $logger-&gt;info( ${$_}{old} );
        $logger-&gt;info( ${$_}{new} );

        # possibly output to terminal
        if ($is_check_verbose_switch_active) {
            print "\n@@ ${$_}{firstLine} -- ${$_}{lastLine} @@\n";
            print ${$_}{old}, "\n";
            print ${$_}{new}, "\n";
        }
    }
}

1;
</pre></body></html>