diff options
author | Karl Berry <karl@freefriends.org> | 2019-07-13 21:40:12 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2019-07-13 21:40:12 +0000 |
commit | 757d85974d6b7911f766ae371404144ec3bdce34 (patch) | |
tree | 795c61e735cf8826289bb477020f3e50ec5aa914 /Master/texmf-dist/scripts | |
parent | 8e8c05aa6d6db2c28633a8924de4a0b941b52030 (diff) |
latexindent (13jul19)
git-svn-id: svn://tug.org/texlive/trunk@51635 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/scripts')
23 files changed, 631 insertions, 311 deletions
diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/AlignmentAtAmpersand.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/AlignmentAtAmpersand.pm index 7a4a9727c89..8b8e387d095 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/AlignmentAtAmpersand.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/AlignmentAtAmpersand.pm @@ -27,7 +27,7 @@ use LatexIndent::GetYamlSettings qw/%masterSettings/; use LatexIndent::Tokens qw/%tokens/; use LatexIndent::LogFile qw/$logger/; our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321 -our @EXPORT_OK = qw/align_at_ampersand find_aligned_block/; +our @EXPORT_OK = qw/align_at_ampersand find_aligned_block double_back_slash_else/; our $alignmentBlockCounter; sub find_aligned_block{ @@ -258,7 +258,7 @@ sub align_at_ampersand{ } # output some of the info so far to the log file - $logger->trace("*Alignment at ampersand routine") if $is_t_switch_active; + $logger->trace("*Alignment at ampersand routine for ${$self}{name} (see lookForAlignDelims)") if $is_t_switch_active; $logger->trace("Maximum column sizes of horizontally stripped formatted block (${$self}{name}): @maximumColumnWidth") if $is_t_switch_active; $logger->trace("align at ampersand: ${$self}{lookForAlignDelims}") if $is_t_switch_active; $logger->trace("align at \\\\: ${$self}{alignDoubleBackSlash}") if $is_t_switch_active; @@ -505,4 +505,21 @@ sub align_at_ampersand{ ${$self}{body} =~ s/\h*\R$//s if !${$self}{linebreaksAtEnd}{body}; } +sub double_back_slash_else{ + my $self = shift; + + # check for existence of \\ statement, and associated line break information + $self->check_for_else_statement( + # else name regexp + elseNameRegExp=>qr/${${$masterSettings{fineTuning}}{modifyLineBreaks}}{doubleBackSlash}/, + # else statements name: note that DBS stands for 'Double Back Slash' + ElseStartsOnOwnLine=>"DBSStartsOnOwnLine", + # end statements + ElseFinishesWithLineBreak=>"DBSFinishesWithLineBreak", + # for the YAML settings storage + storageNameAppend=>"DBS", + # logfile information + logName=>"double-back-slash-block (for align at ampersand, see lookForAlignDelims)", + ); +} 1; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Arguments.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Arguments.pm index 7c84a0e65f3..96450fdaaf2 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/Arguments.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Arguments.pm @@ -24,7 +24,7 @@ use LatexIndent::LogFile qw/$logger/; use Data::Dumper; use Exporter qw/import/; our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321 -our @EXPORT_OK = qw/get_arguments_regexp find_opt_mand_arguments get_numbered_arg_regexp construct_arguments_regexp $optAndMandRegExp/; +our @EXPORT_OK = qw/get_arguments_regexp find_opt_mand_arguments construct_arguments_regexp $optAndMandRegExp comma_else/; our $ArgumentCounter; our $optAndMandRegExp; our $optAndMandRegExpWithLineBreaks; @@ -222,13 +222,6 @@ sub create_unique_id{ return; } -sub get_numbered_arg_regexp{ - - # for example #1 #2, etc - my $numberedArgRegExp = qr/(?:#\d\h*;?,?\/?)+/; - return $numberedArgRegExp; -} - sub get_arguments_regexp{ my $self = shift; @@ -240,11 +233,9 @@ sub get_arguments_regexp{ # some calls to this routine need to account for the linebreaks at the end, some do not my $lineBreaksAtEnd = (defined ${input}{mode} and ${input}{mode} eq 'lineBreaksAtEnd')?'\R*':q(); - # for example #1 #2, etc - my $numberedArgRegExp = $self->get_numbered_arg_regexp; - - # beamer special - my $beamerRegExp = qr/\<.*?\>/; + # arguments Before, by default, includes beamer special and numbered arguments, for example #1 #2, etc + my $argumentsBefore = qr/${${$masterSettings{fineTuning}}{arguments}}{before}/; + my $argumentsBetween = qr/${${$masterSettings{fineTuning}}{arguments}}{between}/; # commands are allowed strings between arguments, e.g node, decoration, etc, specified in stringsAllowedBetweenArguments my $stringsBetweenArguments = q(); @@ -272,7 +263,7 @@ sub get_arguments_regexp{ return qr/ ( # capture into $1 (?: - (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$numberedArgRegExp|$beamerRegExp|_|\^|$stringsBetweenArguments)* + (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$argumentsBefore|$argumentsBetween|$stringsBetweenArguments)* (?: (?: \h* # 0 or more spaces @@ -332,7 +323,7 @@ sub get_arguments_regexp{ # NOT followed by (?! (?: - (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$numberedArgRegExp|$beamerRegExp|$stringsBetweenArguments)* # 0 or more h-space, blanklines, trailing comments + (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$argumentsBefore|$stringsBetweenArguments)* # 0 or more h-space, blanklines, trailing comments (?: (?:(?<!\\)\[) | @@ -350,7 +341,7 @@ sub get_arguments_regexp{ return qr/ ( # capture into $1 (?: - (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$numberedArgRegExp|$beamerRegExp|_|\^|$stringsBetweenArguments)* + (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$argumentsBefore|$argumentsBetween|$stringsBetweenArguments)* (?: (?: \h* # 0 or more spaces @@ -383,7 +374,7 @@ sub get_arguments_regexp{ # NOT followed by (?! (?: - (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$numberedArgRegExp|$beamerRegExp)* # 0 or more h-space, blanklines, trailing comments + (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$argumentsBefore)* # 0 or more h-space, blanklines, trailing comments (?: (?:(?<!\\)\[) | @@ -398,4 +389,21 @@ sub get_arguments_regexp{ } } +sub comma_else{ + my $self = shift; + + # check for existence of \\ statement, and associated line break information + $self->check_for_else_statement( + # else name regexp + elseNameRegExp=>qr/${${$masterSettings{fineTuning}}{modifyLineBreaks}}{comma}/, + # else statements name + ElseStartsOnOwnLine=>"CommaStartsOnOwnLine", + # end statements + ElseFinishesWithLineBreak=>"CommaFinishesWithLineBreak", + # for the YAML settings storage + storageNameAppend=>"comma", + # logfile information + logName=>"comma block, see CommaStartsOnOwnLine and CommaFinishesWithLineBreak", + ); +} 1; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Command.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Command.pm index 2ba44bd5a62..a877a6295c1 100755 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/Command.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Command.pm @@ -64,11 +64,14 @@ sub construct_command_regexp{ # details to log file $logger->trace("*The special command names regexp is: $commandNameSpecialRegExp (see commandNameSpecial)") if $is_t_switch_active; + # read from fine tuning + my $commandNameRegExp = qr/${${$masterSettings{fineTuning}}{commands}}{name}/; + # construct the command regexp $commandRegExp = qr/ (\\|\\@|@) ( - [+a-zA-Z@\*0-9_\:]+?|$commandNameSpecialRegExp # lowercase|uppercase letters, @, *, numbers + $commandNameRegExp|$commandNameSpecialRegExp # lowercase|uppercase letters, @, *, numbers ) (\h*) (\R*)? @@ -203,4 +206,10 @@ sub align_at_ampersand{ return; } +sub double_back_slash_else{ + # need an empty routine here for commands; see + # test-cases/alignment/command-align.tex for example + return; +} + 1; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm index b4441b99455..7f6694d0493 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm @@ -21,8 +21,9 @@ use utf8; use open ':std', ':encoding(UTF-8)'; # gain access to subroutines in the following modules -use LatexIndent::Switches qw/storeSwitches %switches $is_m_switch_active $is_t_switch_active $is_tt_switch_active/; +use LatexIndent::Switches qw/storeSwitches %switches $is_m_switch_active $is_t_switch_active $is_tt_switch_active $is_r_switch_active $is_rr_switch_active $is_rv_switch_active/; use LatexIndent::LogFile qw/processSwitches $logger/; +use LatexIndent::Replacement qw/make_replacements/; use LatexIndent::GetYamlSettings qw/yaml_read_settings yaml_modify_line_breaks_settings yaml_get_indentation_settings_for_this_object yaml_poly_switch_get_every_or_custom_value yaml_get_indentation_information yaml_get_object_attribute_for_indentation_settings yaml_alignment_at_ampersand_settings yaml_get_textwrap_removeparagraphline_breaks %masterSettings yaml_get_columns/; use LatexIndent::FileExtension qw/file_extension_check/; use LatexIndent::BackUpFileProcedure qw/create_back_up_file/; @@ -34,15 +35,15 @@ use LatexIndent::HorizontalWhiteSpace qw/remove_trailing_whitespace remove_leadi use LatexIndent::Indent qw/indent wrap_up_statement determine_total_indentation indent_begin indent_body indent_end_statement final_indentation_check get_surrounding_indentation indent_children_recursively check_for_blank_lines_at_beginning put_blank_lines_back_in_at_beginning add_surrounding_indentation_to_begin_statement post_indentation_check/; use LatexIndent::Tokens qw/token_check %tokens/; use LatexIndent::HiddenChildren qw/find_surrounding_indentation_for_children update_family_tree get_family_tree check_for_hidden_children/; -use LatexIndent::AlignmentAtAmpersand qw/align_at_ampersand find_aligned_block/; +use LatexIndent::AlignmentAtAmpersand qw/align_at_ampersand find_aligned_block double_back_slash_else/; use LatexIndent::DoubleBackSlash qw/dodge_double_backslash un_dodge_double_backslash/; # code blocks use LatexIndent::Verbatim qw/put_verbatim_back_in find_verbatim_environments find_noindent_block find_verbatim_commands find_verbatim_special verbatim_common_tasks/; -use LatexIndent::Environment qw/find_environments $environmentBasicRegExp/; +use LatexIndent::Environment qw/find_environments $environmentBasicRegExp construct_environments_regexp/; use LatexIndent::IfElseFi qw/find_ifelsefi construct_ifelsefi_regexp $ifElseFiBasicRegExp/; use LatexIndent::Else qw/check_for_else_statement/; -use LatexIndent::Arguments qw/get_arguments_regexp find_opt_mand_arguments get_numbered_arg_regexp construct_arguments_regexp/; +use LatexIndent::Arguments qw/get_arguments_regexp find_opt_mand_arguments construct_arguments_regexp comma_else/; use LatexIndent::OptionalArgument qw/find_optional_arguments/; use LatexIndent::MandatoryArgument qw/find_mandatory_arguments get_mand_arg_reg_exp/; use LatexIndent::RoundBrackets qw/find_round_brackets/; @@ -83,28 +84,34 @@ sub operate_on_file{ $self->create_back_up_file; $self->token_check; - $self->construct_regular_expressions; - $self->find_noindent_block; - $self->find_verbatim_commands; - $self->find_aligned_block; - $self->remove_trailing_comments; - $self->find_verbatim_environments; - $self->find_verbatim_special; - $self->verbatim_modify_line_breaks if $is_m_switch_active; - $self->text_wrap if ($is_m_switch_active and !${$masterSettings{modifyLineBreaks}{textWrapOptions}}{perCodeBlockBasis} and ${$masterSettings{modifyLineBreaks}{textWrapOptions}}{columns}>1); - $self->protect_blank_lines; - $self->remove_trailing_whitespace(when=>"before"); - $self->find_file_contents_environments_and_preamble; - $self->dodge_double_backslash; - $self->remove_leading_space; - $self->process_body_of_text; - $self->remove_trailing_whitespace(when=>"after"); - $self->condense_blank_lines; - $self->unprotect_blank_lines; - $self->un_dodge_double_backslash; - $self->put_verbatim_back_in (match=>"everything-except-commands"); - $self->put_trailing_comments_back_in; - $self->put_verbatim_back_in (match=>"just-commands"); + $self->make_replacements(when=>"before") if ($is_r_switch_active and !$is_rv_switch_active); + unless ($is_rr_switch_active){ + $self->construct_regular_expressions; + $self->find_noindent_block; + $self->find_verbatim_commands; + $self->find_aligned_block; + $self->remove_trailing_comments; + $self->find_verbatim_environments; + $self->find_verbatim_special; + $self->verbatim_modify_line_breaks if $is_m_switch_active; + $self->make_replacements(when=>"before") if $is_rv_switch_active; + $self->text_wrap if ($is_m_switch_active and !${$masterSettings{modifyLineBreaks}{textWrapOptions}}{perCodeBlockBasis} and ${$masterSettings{modifyLineBreaks}{textWrapOptions}}{columns}>1); + $self->protect_blank_lines; + $self->remove_trailing_whitespace(when=>"before"); + $self->find_file_contents_environments_and_preamble; + $self->dodge_double_backslash; + $self->remove_leading_space; + $self->process_body_of_text; + $self->remove_trailing_whitespace(when=>"after"); + $self->condense_blank_lines; + $self->unprotect_blank_lines; + $self->un_dodge_double_backslash; + $self->make_replacements(when=>"after") if $is_rv_switch_active; + $self->put_verbatim_back_in (match=>"everything-except-commands"); + $self->put_trailing_comments_back_in; + $self->put_verbatim_back_in (match=>"just-commands"); + $self->make_replacements(when=>"after") if ($is_r_switch_active and !$is_rv_switch_active); + } $self->output_indented_text; return } @@ -112,6 +119,7 @@ sub operate_on_file{ sub construct_regular_expressions{ my $self = shift; $self->construct_trailing_comment_regexp; + $self->construct_environments_regexp; $self->construct_ifelsefi_regexp; $self->construct_list_of_items; $self->construct_special_begin; @@ -335,7 +343,7 @@ sub tasks_common_to_each_object{ $self->adjust_replacement_text_line_breaks_at_end; # modify line breaks on body and end statements - $self->modify_line_breaks_body if $is_m_switch_active; + $self->modify_line_breaks_body if ($is_m_switch_active and defined ${$self}{BodyStartsOnOwnLine}); # modify line breaks end statements $self->modify_line_breaks_end if $is_m_switch_active; @@ -343,6 +351,8 @@ sub tasks_common_to_each_object{ # check the body for current children $self->check_for_hidden_children if ${$self}{body} =~ m/$tokens{beginOfToken}/; + # double back slash poly-switch check + $self->double_back_slash_else if ($is_m_switch_active and ${$self}{lookForAlignDelims}); return; } diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Else.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Else.pm index 10b1cc4d41b..5a367c784fc 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/Else.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Else.pm @@ -55,27 +55,32 @@ sub check_for_else_statement{ while(${$self}{body} =~ m/$elseRegExp(\h*)($trailingCommentRegExp)?/){ ${$self}{body} =~ s/$elseRegExp(\h*)($trailingCommentRegExp)? / - # create a new IfElseFi object + # create a new Else object my $else = LatexIndent::Else->new(begin=>$1, - name=>${$self}{name}, - storageNameAppend=>$input{storageNameAppend}, - body=>$3, - end=>q(), - linebreaksAtEnd=>{ - begin=>$2?1:0, - body=>0, - end=>0, - }, - aliases=>{ - # begin statements - BeginStartsOnOwnLine=>$input{ElseStartsOnOwnLine}, - # end statements - BodyStartsOnOwnLine=>$input{ElseFinishesWithLineBreak}, - }, - modifyLineBreaksYamlName=>${$self}{modifyLineBreaksYamlName}, - endImmediatelyFollowedByComment=>0, - horizontalTrailingSpace=>q(), - ); + name=>${$self}{name}, + storageNameAppend=>$input{storageNameAppend}, + body=>$3, + end=>q(), + linebreaksAtEnd=>{ + begin=>$2?1:0, + body=>0, + end=>0, + }, + aliases=>{ + # begin statements + BeginStartsOnOwnLine=>$input{ElseStartsOnOwnLine}, + # end statements + BodyStartsOnOwnLine=>$input{ElseFinishesWithLineBreak}, + }, + modifyLineBreaksYamlName=>${$self}{modifyLineBreaksYamlName}, + endImmediatelyFollowedByComment=>0, + horizontalTrailingSpace=>q(), + # mandatory and optional arguments have a parent, which we need + # to detail for double back slash poly-switches + # (see test-cases alignment command-align.tex, for example) + parent=>(${$self}{parent}?${$self}{parent}:"none"), + ); + # log file output $logger->trace("*$input{logName} found: ${$self}{name}")if $is_t_switch_active; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Environment.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Environment.pm index 2c74f47554e..401cbecbee2 100755 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/Environment.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Environment.pm @@ -28,35 +28,41 @@ use LatexIndent::Special qw/$specialBeginAndBracesBracketsBasicRegExp/; use Data::Dumper; use Exporter qw/import/; our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321 -our @EXPORT_OK = qw/find_environments $environmentBasicRegExp/; +our @EXPORT_OK = qw/find_environments $environmentBasicRegExp construct_environments_regexp/; our $environmentCounter; our $environmentBasicRegExp = qr/\\begin\{/; +our $environmentRegExp; # store the regular expresssion for matching and replacing the \begin{}...\end{} statements -our $environmentRegExp = qr/ - ( - \\begin\{ - ( - [a-zA-Z@\*0-9_\\]+ # lowercase|uppercase letters, @, *, numbers - ) # environment name captured into $2 - \} # \begin{<something>} statement - \h* # horizontal space - (\R*)? # possible line breaks (into $3) - ) # begin statement captured into $1 - ( - (?: # cluster-only (), don't capture - (?! # don't include \begin in the body - (?:\\begin) # cluster-only (), don't capture - ). # any character, but not \\begin - )*? # non-greedy - (\R*)? # possible line breaks (into $5) - ) # environment body captured into $4 - ( - \\end\{\2\} # \end{<something>} statement - ) # captured into $6 - (\h*)? # possibly followed by horizontal space - (\R)? # possibly followed by a line break - /sx; +sub construct_environments_regexp{ + + # read from fine tuning + my $environmentNameRegExp = qr/${${$masterSettings{fineTuning}}{environments}}{name}/; + $environmentRegExp = qr/ + ( + \\begin\{ + ( + $environmentNameRegExp # lowercase|uppercase letters, @, *, numbers + ) # environment name captured into $2 + \} # \begin{<something>} statement + \h* # horizontal space + (\R*)? # possible line breaks (into $3) + ) # begin statement captured into $1 + ( + (?: # cluster-only (), don't capture + (?! # don't include \begin in the body + (?:\\begin) # cluster-only (), don't capture + ). # any character, but not \\begin + )*? # non-greedy + (\R*)? # possible line breaks (into $5) + ) # environment body captured into $4 + ( + \\end\{\2\} # \end{<something>} statement + ) # captured into $6 + (\h*)? # possibly followed by horizontal space + (\R)? # possibly followed by a line break + /sx; +} sub find_environments{ my $self = shift; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/FileExtension.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/FileExtension.pm index 93f8016f030..716598de777 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/FileExtension.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/FileExtension.pm @@ -35,28 +35,23 @@ sub file_extension_check{ # grab the filename my $fileName = ${$self}{fileName}; + # see if an extension exists for the fileName + my ($name,$dir,$ext) = fileparse($fileName,qr/\..[^.]*$/); + # grab the file extension preferences my %fileExtensionPreference= %{$masterSettings{fileExtensionPreference}}; # sort the file extensions by preference my @fileExtensions = sort { $fileExtensionPreference{$a} <=> $fileExtensionPreference{$b} } keys(%fileExtensionPreference); - # get the base file name, allowing for different extensions (possibly no extension) - my ($name, $dir, $ext) = fileparse($fileName, @fileExtensions); + # store the base name ${$self}{baseName} = $name; - # check to make sure given file type is supported - if( -e $fileName and !$ext ){ - my $message = "The file $fileName exists , but the extension does not correspond to any given in fileExtensionPreference; consinder updating fileExtensionPreference."; - $logger->fatal("*$message"); - die($message); - } - # if no extension, search according to fileExtensionPreference if ($fileName ne "-"){ if (!$ext) { $logger->info("*File extension work:"); - $logger->info("latexindent called to act upon $fileName with a file extension;\nsearching for file with an extension in the following order (see fileExtensionPreference):"); + $logger->info("latexindent called to act upon $fileName without a file extension;\nsearching for file with an extension in the following order (see fileExtensionPreference):"); $logger->info(join("\n",@fileExtensions)); my $fileFound = 0; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/GetYamlSettings.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/GetYamlSettings.pm index 97cb36df823..3029043f23f 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/GetYamlSettings.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/GetYamlSettings.pm @@ -256,6 +256,23 @@ sub yaml_read_settings{ } } } + } elsif (ref($firstLevelValue) eq "ARRAY") { + # update amalgamate in master settings + if(ref(${$firstLevelValue}[0]) eq "HASH" and defined ${$firstLevelValue}[0]{amalgamate}){ + ${$masterSettings{$firstLevelKey}[0]}{amalgamate} = ${$firstLevelValue}[0]{amalgamate}; + shift @{$firstLevelValue} if ${$masterSettings{$firstLevelKey}[0]}{amalgamate}; + } + + # if amalgamate is set to 1, then append + if(${$masterSettings{$firstLevelKey}[0]}{amalgamate}){ + # loop through the other settings + foreach (@{$firstLevelValue}){ + push (@{$masterSettings{$firstLevelKey}},$_); + } + } else { + # otherwise overwrite + $masterSettings{$firstLevelKey} = $firstLevelValue; + } } else { $masterSettings{$firstLevelKey} = $firstLevelValue; } @@ -375,7 +392,7 @@ sub yaml_read_settings{ # loop through each of the settings specified in the -y switch foreach(@yamlSettings){ # split each value at semi-colon - my (@keysValues) = split(/(?<!\\):/,$_); + my (@keysValues) = split(/(?<!(?:\\|\[)):(?!\])/,$_); # $value will always be the last element my $value = $keysValues[-1]; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/IfElseFi.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/IfElseFi.pm index 29a0065bfe6..056b36d8c3e 100755 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/IfElseFi.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/IfElseFi.pm @@ -17,6 +17,7 @@ package LatexIndent::IfElseFi; use strict; use warnings; use LatexIndent::Tokens qw/%tokens/; +use LatexIndent::GetYamlSettings qw/%masterSettings/; use LatexIndent::TrailingComments qw/$trailingCommentRegExp/; use LatexIndent::Switches qw/$is_m_switch_active $is_t_switch_active $is_tt_switch_active/; use LatexIndent::LogFile qw/$logger/; @@ -33,10 +34,11 @@ our $ifElseFiBasicRegExp = qr/\\if/; # note: we search for \else separately in an attempt to keep this regexp a little more managable sub construct_ifelsefi_regexp{ + my $ifElseFiNameRegExp = qr/${${$masterSettings{fineTuning}}{ifElseFi}}{name}/; $ifElseFiRegExp = qr/ ( \\ - (@?if[a-zA-Z@]*?) + ($ifElseFiNameRegExp) \h* (\R*) ) # begin statement, e.g \ifnum, \ifodd diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Indent.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Indent.pm index fce49e2c660..eb36db21082 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/Indent.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Indent.pm @@ -325,40 +325,57 @@ sub indent_children_recursively{ if(defined ${$child}{BeginStartsOnOwnLine}){ my $BeginStringLogFile = ${$child}{aliases}{BeginStartsOnOwnLine}||"BeginStartsOnOwnLine"; - # if the child ID is not the first character and BeginStartsOnOwnLine>=1 - # then we will need to add a line break (==1), a comment (==2) or another blank line (==3) - if(${$child}{BeginStartsOnOwnLine}>=1 and !$IDFirstNonWhiteSpaceCharacter){ - # by default, assume that no trailing comment token is needed - my $trailingCharacterToken = q(); - if(${$child}{BeginStartsOnOwnLine}==2){ - $logger->trace("Removing space immediately before ${$child}{id}, in preparation for adding % ($BeginStringLogFile == 2)") if $is_t_switch_active; - ${$self}{body} =~ s/\h*${$child}{idRegExp}/${$child}{id}/s; - $logger->trace("Adding a % at the end of the line that ${$child}{begin} is on, then a linebreak ($BeginStringLogFile == 2)") if $is_t_switch_active; - $trailingCharacterToken = "%".$self->add_comment_symbol; - } elsif (${$child}{BeginStartsOnOwnLine}==3){ - $logger->trace("Adding a blank line at the end of the line that ${$child}{begin} is on, then a linebreak ($BeginStringLogFile == 3)") if $is_t_switch_active; - $trailingCharacterToken = "\n".(${$masterSettings{modifyLineBreaks}}{preserveBlankLines}?$tokens{blanklines}:q()); - } else { - $logger->trace("Adding a linebreak at the beginning of ${$child}{begin} (see $BeginStringLogFile)") if $is_t_switch_active; + # + # Blank line poly-switch notes (==4) + # + # when BeginStartsOnOwnLine=4 we adopt the following approach: + # temporarily change BeginStartsOnOwnLine to -1, make adjustments + # temporarily change BeginStartsOnOwnLine to 3, make adjustments + # + # we use an array, @polySwitchValues to facilitate this + my @polySwitchValues = (${$child}{BeginStartsOnOwnLine}==4)?(-1,3):(${$child}{BeginStartsOnOwnLine}); + + foreach(@polySwitchValues){ + # if BeginStartsOnOwnLine is 4, then we hack + # $IDFirstNonWhiteSpaceCharacter + # to be 0 on the second time through (poly-switch set to 3) + $IDFirstNonWhiteSpaceCharacter = 0 if (${$child}{BeginStartsOnOwnLine}==4 and $_==3); + + # if the child ID is not the first character and BeginStartsOnOwnLine>=1 + # then we will need to add a line break (==1), a comment (==2) or another blank line (==3) + if($_>=1 and !$IDFirstNonWhiteSpaceCharacter){ + # by default, assume that no trailing comment token is needed + my $trailingCharacterToken = q(); + if($_==2){ + $logger->trace("Removing space immediately before ${$child}{id}, in preparation for adding % ($BeginStringLogFile == 2)") if $is_t_switch_active; + ${$self}{body} =~ s/\h*${$child}{idRegExp}/${$child}{id}/s; + $logger->trace("Adding a % at the end of the line that ${$child}{begin} is on, then a linebreak ($BeginStringLogFile == 2)") if $is_t_switch_active; + $trailingCharacterToken = "%".$self->add_comment_symbol; + } elsif ($_==3){ + $logger->trace("Adding a blank line at the end of the line that ${$child}{begin} is on, then a linebreak ($BeginStringLogFile == 3)") if $is_t_switch_active; + $trailingCharacterToken = "\n".(${$masterSettings{modifyLineBreaks}}{preserveBlankLines}?$tokens{blanklines}:q()); + } else { + $logger->trace("Adding a linebreak at the beginning of ${$child}{begin} (see $BeginStringLogFile)") if $is_t_switch_active; + } + + # the trailing comment/linebreak magic + ${$child}{begin} = "$trailingCharacterToken\n".${$child}{begin}; + $child->add_surrounding_indentation_to_begin_statement; + + # remove surrounding indentation ahead of % + ${$child}{begin} =~ s/^(\h*)%/%/ if($_==2); + } elsif ($_==-1 and $IDFirstNonWhiteSpaceCharacter){ + # finally, if BeginStartsOnOwnLine == -1 then we might need to *remove* a blank line(s) + # important to check we don't move the begin statement next to a blank-line-token + my $blankLineToken = $tokens{blanklines}; + if(${$self}{body} !~ m/$blankLineToken\R*\h*${$child}{idRegExp}/s){ + $logger->trace("Removing linebreak before ${$child}{begin} (see $BeginStringLogFile in ${$child}{modifyLineBreaksYamlName} YAML)") if $is_t_switch_active; + ${$self}{body} =~ s/(\h*)(?:\R*|\h*)+${$child}{idRegExp}/$1${$child}{id}/s; + } else { + $logger->trace("Not removing linebreak ahead of ${$child}{begin}, as blank-line-token present (see preserveBlankLines)") if $is_t_switch_active; + } } - - # the trailing comment/linebreak magic - ${$child}{begin} = "$trailingCharacterToken\n".${$child}{begin}; - $child->add_surrounding_indentation_to_begin_statement; - - # remove surrounding indentation ahead of % - ${$child}{begin} =~ s/^(\h*)%/%/ if(${$child}{BeginStartsOnOwnLine}==2); - } elsif (${$child}{BeginStartsOnOwnLine}==-1 and $IDFirstNonWhiteSpaceCharacter){ - # finally, if BeginStartsOnOwnLine == -1 then we might need to *remove* a blank line(s) - # important to check we don't move the begin statement next to a blank-line-token - my $blankLineToken = $tokens{blanklines}; - if(${$self}{body} !~ m/$blankLineToken\R*\h*${$child}{idRegExp}/s){ - $logger->trace("Removing linebreak before ${$child}{begin} (see $BeginStringLogFile in ${$child}{modifyLineBreaksYamlName} YAML)") if $is_t_switch_active; - ${$self}{body} =~ s/(\h*)(?:\R*|\h*)+${$child}{idRegExp}/$1${$child}{id}/s; - } else { - $logger->trace("Not removing linebreak ahead of ${$child}{begin}, as blank-line-token present (see preserveBlankLines)") if $is_t_switch_active; - } - } + } } $logger->trace(Dumper(\%{$child})) if($is_tt_switch_active); diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/KeyEqualsValuesBraces.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/KeyEqualsValuesBraces.pm index 0e939731015..590d9acb8c5 100755 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/KeyEqualsValuesBraces.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/KeyEqualsValuesBraces.pm @@ -17,6 +17,7 @@ package LatexIndent::KeyEqualsValuesBraces; use strict; use warnings; use LatexIndent::Tokens qw/%tokens/; +use LatexIndent::GetYamlSettings qw/%masterSettings/; use LatexIndent::TrailingComments qw/$trailingCommentRegExp/; use LatexIndent::Switches qw/$is_m_switch_active $is_t_switch_active $is_tt_switch_active/; use LatexIndent::LogFile qw/$logger/; @@ -37,21 +38,19 @@ sub construct_key_equals_values_regexp{ # blank line token my $blankLineToken = $tokens{blanklines}; + # read from fine tuning + my $keyEqualsValuesBracesBrackets = qr/${${$masterSettings{fineTuning}}{keyEqualsValuesBracesBrackets}}{name}/; + my $keyEqualsValuesBracesBracketsFollow = qr/${${$masterSettings{fineTuning}}{keyEqualsValuesBracesBrackets}}{follow}/; + # store the regular expresssion for matching and replacing $key_equals_values_bracesRegExp = qr/ ( - (?: - (?:(?<!\\)\{) - | - , - | - (?:(?<!\\)\[) - ) + (?:$keyEqualsValuesBracesBracketsFollow) (?:\h|\R|$blankLineToken|$trailingCommentRegExp)* ) # $1 pre-key bit: could be { OR , OR [ (\\)? # $2 possible backslash ( - [a-zA-Z@\*0-9_\/.\h\{\}:\#-]+? # lowercase|uppercase letters, @, *, numbers, forward slash, dots + $keyEqualsValuesBracesBrackets? # lowercase|uppercase letters, @, *, numbers, forward slash, dots ) # $3 name ( (?:\h|\R|$blankLineToken|$trailingCommentRegExp)* diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/LogFile.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/LogFile.pm index b8ebc034b3a..75ebe0b2ea2 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/LogFile.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/LogFile.pm @@ -80,6 +80,15 @@ usage: latexindent.pl [options] [file][.tex|.sty|.cls|.bib|...] -m, --modifylinebreaks modify linebreaks before, during, and at the end of code blocks; trailing comments and blank lines can also be added using this feature + -r,--replacement + replacement mode, allows you to replace strings and regular expressions + verbatim blocks not respected + -rv,--replacementrespectverb + replacement mode, allows you to replace strings and regular expressions + while respecting verbatim code blocks + -rr,--onlyreplacement + *only* replacement mode, no indentation + verbatim blocks not respected ENDQUOTE ; exit(2); @@ -182,6 +191,8 @@ ENDQUOTE $logger->info("-m|--modifylinebreaks: modify line breaks") if($switches{modifyLineBreaks}); $logger->info("-g|--logfile: logfile name") if($switches{logFileName}); $logger->info("-c|--cruft: cruft directory") if($switches{cruftDirectory}); + $logger->info("-r|--replacement: replacement mode") if($switches{replacement}); + $logger->info("-rr|--onlyreplacement: *only* replacement mode, no indentation") if($switches{onlyreplacement}); # check if overwrite and outputfile are active similtaneously if($switches{overwrite} and $switches{outputToFile}){ diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/MandatoryArgument.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/MandatoryArgument.pm index 0b641231f2a..b5b3ac8de6f 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/MandatoryArgument.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/MandatoryArgument.pm @@ -18,7 +18,7 @@ use strict; use warnings; use LatexIndent::Tokens qw/%tokens/; use LatexIndent::TrailingComments qw/$trailingCommentRegExp/; -use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/; +use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active $is_m_switch_active /; use LatexIndent::LogFile qw/$logger/; use LatexIndent::IfElseFi qw/$ifElseFiBasicRegExp/; use LatexIndent::Special qw/$specialBeginBasicRegExp/; @@ -128,6 +128,8 @@ sub tasks_particular_to_each_object{ # search for special begin/end $self->find_special if ${$self}{body} =~ m/$specialBeginBasicRegExp/s; + # comma poly-switch check + $self->comma_else if $is_m_switch_active; } 1; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm index a0763456e02..0f33f88b834 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm @@ -28,27 +28,34 @@ use LatexIndent::LogFile qw/$logger/; our @EXPORT_OK = qw/modify_line_breaks_body modify_line_breaks_end adjust_line_breaks_end_parent remove_line_breaks_begin text_wrap remove_paragraph_line_breaks construct_paragraph_reg_exp text_wrap_remove_paragraph_line_breaks verbatim_modify_line_breaks/; our $paragraphRegExp = q(); - sub modify_line_breaks_body{ my $self = shift; + # + # Blank line poly-switch notes (==4) + # + # when BodyStartsOnOwnLine=4 we adopt the following approach: + # temporarily change BodyStartsOnOwnLine to -1, make adjustments + # temporarily change BodyStartsOnOwnLine to 3, make adjustments + # switch BodyStartsOnOwnLine back to 4 # add a line break after \begin{statement} if appropriate - if(defined ${$self}{BodyStartsOnOwnLine}){ + my @polySwitchValues = (${$self}{BodyStartsOnOwnLine}==4)?(-1,3):(${$self}{BodyStartsOnOwnLine}); + foreach(@polySwitchValues){ my $BodyStringLogFile = ${$self}{aliases}{BodyStartsOnOwnLine}||"BodyStartsOnOwnLine"; - if(${$self}{BodyStartsOnOwnLine}>=1 and !${$self}{linebreaksAtEnd}{begin}){ + if($_>=1 and !${$self}{linebreaksAtEnd}{begin}){ # if the <begin> statement doesn't finish with a line break, # then we have different actions based upon the value of BodyStartsOnOwnLine: # BodyStartsOnOwnLine == 1 just add a new line # BodyStartsOnOwnLine == 2 add a comment, and then new line # BodyStartsOnOwnLine == 3 add a blank line, and then new line - if(${$self}{BodyStartsOnOwnLine}==1){ + if($_==1){ # modify the begin statement - $logger->trace("Adding a linebreak at the end of begin, ${$self}{begin} (see $BodyStringLogFile)") if $is_t_switch_active; + $logger->trace("Adding a linebreak at the end of begin statement ${$self}{begin} (see $BodyStringLogFile)") if $is_t_switch_active; ${$self}{begin} .= "\n"; ${$self}{linebreaksAtEnd}{begin} = 1; $logger->trace("Removing leading space from body of ${$self}{name} (see $BodyStringLogFile)") if $is_t_switch_active; ${$self}{body} =~ s/^\h*//; - } elsif(${$self}{BodyStartsOnOwnLine}==2){ + } elsif($_==2){ # by default, assume that no trailing comment token is needed my $trailingCommentToken = q(); if(${$self}{body} !~ m/^\h*$trailingCommentRegExp/s){ @@ -63,7 +70,7 @@ sub modify_line_breaks_body{ } else { $logger->trace("Even though $BodyStringLogFile == 2, ${$self}{begin} already finishes with a %, so not adding another.") if $is_t_switch_active; } - } elsif (${$self}{BodyStartsOnOwnLine}==3){ + } elsif ($_==3){ my $trailingCharacterToken = q(); $logger->trace("Adding a blank line at the end of begin ${$self}{begin} followed by a linebreak ($BodyStringLogFile == 3)") if $is_t_switch_active; ${$self}{begin} =~ s/\h*$//; @@ -72,12 +79,12 @@ sub modify_line_breaks_body{ $logger->trace("Removing leading space from body of ${$self}{name} (see $BodyStringLogFile)") if $is_t_switch_active; ${$self}{body} =~ s/^\h*//; } - } elsif (${$self}{BodyStartsOnOwnLine}==-1 and ${$self}{linebreaksAtEnd}{begin}){ + } elsif ($_==-1 and ${$self}{linebreaksAtEnd}{begin}){ # remove line break *after* begin, if appropriate $self->remove_line_breaks_begin; } } - } +} sub remove_line_breaks_begin{ my $self = shift; @@ -90,86 +97,111 @@ sub remove_line_breaks_begin{ sub modify_line_breaks_end{ my $self = shift; - # possibly modify line break *before* \end{statement} - if(defined ${$self}{EndStartsOnOwnLine}){ - my $EndStringLogFile = ${$self}{aliases}{EndStartsOnOwnLine}||"EndStartsOnOwnLine"; - if(${$self}{EndStartsOnOwnLine}>=1 and !${$self}{linebreaksAtEnd}{body}){ - # if the <body> statement doesn't finish with a line break, - # then we have different actions based upon the value of EndStartsOnOwnLine: - # EndStartsOnOwnLine == 1 just add a new line - # EndStartsOnOwnLine == 2 add a comment, and then new line - # EndStartsOnOwnLine == 3 add a blank line, and then new line - $logger->trace("Adding a linebreak at the end of body (see $EndStringLogFile)") if $is_t_switch_active; - - # by default, assume that no trailing character token is needed - my $trailingCharacterToken = q(); - if(${$self}{EndStartsOnOwnLine}==2){ - $logger->trace("Adding a % immediately after body of ${$self}{name} ($EndStringLogFile==2)") if $is_t_switch_active; - $trailingCharacterToken = "%".$self->add_comment_symbol; - ${$self}{body} =~ s/\h*$//s; - } elsif (${$self}{EndStartsOnOwnLine}==3) { - $logger->trace("Adding a blank line immediately after body of ${$self}{name} ($EndStringLogFile==3)") if $is_t_switch_active; - $trailingCharacterToken = "\n".(${$masterSettings{modifyLineBreaks}}{preserveBlankLines}?$tokens{blanklines}:q()); - ${$self}{body} =~ s/\h*$//s; - } - - # modified end statement - if(${$self}{body} =~ m/^\h*$/s and ${$self}{BodyStartsOnOwnLine} >=1 ){ - ${$self}{linebreaksAtEnd}{body} = 0; - } else { - ${$self}{body} .= "$trailingCharacterToken\n"; - ${$self}{linebreaksAtEnd}{body} = 1; - } - } elsif (${$self}{EndStartsOnOwnLine}==-1 and ${$self}{linebreaksAtEnd}{body}){ - # remove line break *after* body, if appropriate - - # check to see that body does *not* finish with blank-line-token, - # if so, then don't remove that final line break - if(${$self}{body} !~ m/$tokens{blanklines}$/s){ - $logger->trace("Removing linebreak at the end of body (see $EndStringLogFile)") if $is_t_switch_active; - ${$self}{body} =~ s/\R*$//sx; - ${$self}{linebreaksAtEnd}{body} = 0; - } else { - $logger->trace("Blank line token found at end of body (${$self}{name}), see preserveBlankLines, not removing line break before ${$self}{end}") if $is_t_switch_active; + # + # Blank line poly-switch notes (==4) + # + # when EndStartsOnOwnLine=4 we adopt the following approach: + # temporarily change EndStartsOnOwnLine to -1, make adjustments + # temporarily change EndStartsOnOwnLine to 3, make adjustments + # switch EndStartsOnOwnLine back to 4 + # + + my @polySwitchValues =(defined ${$self}{EndStartsOnOwnLine} and ${$self}{EndStartsOnOwnLine}==4) ?(-1,3):(${$self}{EndStartsOnOwnLine}); + foreach(@polySwitchValues){ + # possibly modify line break *before* \end{statement} + if(defined ${$self}{EndStartsOnOwnLine}){ + my $EndStringLogFile = ${$self}{aliases}{EndStartsOnOwnLine}||"EndStartsOnOwnLine"; + if($_>=1 and !${$self}{linebreaksAtEnd}{body}){ + # if the <body> statement doesn't finish with a line break, + # then we have different actions based upon the value of EndStartsOnOwnLine: + # EndStartsOnOwnLine == 1 just add a new line + # EndStartsOnOwnLine == 2 add a comment, and then new line + # EndStartsOnOwnLine == 3 add a blank line, and then new line + $logger->trace("Adding a linebreak at the end of body (see $EndStringLogFile)") if $is_t_switch_active; + + # by default, assume that no trailing character token is needed + my $trailingCharacterToken = q(); + if($_==2){ + $logger->trace("Adding a % immediately after body of ${$self}{name} ($EndStringLogFile==2)") if $is_t_switch_active; + $trailingCharacterToken = "%".$self->add_comment_symbol; + ${$self}{body} =~ s/\h*$//s; + } elsif ($_==3) { + $logger->trace("Adding a blank line immediately after body of ${$self}{name} ($EndStringLogFile==3)") if $is_t_switch_active; + $trailingCharacterToken = "\n".(${$masterSettings{modifyLineBreaks}}{preserveBlankLines}?$tokens{blanklines}:q()); + ${$self}{body} =~ s/\h*$//s; + } + + # modified end statement + if(${$self}{body} =~ m/^\h*$/s and (defined ${$self}{BodyStartsOnOwnLine}) and ${$self}{BodyStartsOnOwnLine} >=1 ){ + ${$self}{linebreaksAtEnd}{body} = 0; + } else { + ${$self}{body} .= "$trailingCharacterToken\n"; + ${$self}{linebreaksAtEnd}{body} = 1; + } + } elsif ($_==-1 and ${$self}{linebreaksAtEnd}{body}){ + # remove line break *after* body, if appropriate + + # check to see that body does *not* finish with blank-line-token, + # if so, then don't remove that final line break + if(${$self}{body} !~ m/$tokens{blanklines}$/s){ + $logger->trace("Removing linebreak at the end of body (see $EndStringLogFile)") if $is_t_switch_active; + ${$self}{body} =~ s/\R*$//sx; + ${$self}{linebreaksAtEnd}{body} = 0; + } else { + $logger->trace("Blank line token found at end of body (${$self}{name}), see preserveBlankLines, not removing line break before ${$self}{end}") if $is_t_switch_active; + } } - } + } } - # possibly modify line break *after* \end{statement} - if(defined ${$self}{EndFinishesWithLineBreak} - and ${$self}{EndFinishesWithLineBreak}>=1 - and !${$self}{linebreaksAtEnd}{end}){ - # if the <end> statement doesn't finish with a line break, - # then we have different actions based upon the value of EndFinishesWithLineBreak: - # EndFinishesWithLineBreak == 1 just add a new line - # EndFinishesWithLineBreak == 2 add a comment, and then new line - # EndFinishesWithLineBreak == 3 add a blank line, and then new line - my $EndStringLogFile = ${$self}{aliases}{EndFinishesWithLineBreak}||"EndFinishesWithLineBreak"; - if(${$self}{EndFinishesWithLineBreak}==1){ - $logger->trace("Adding a linebreak at the end of ${$self}{end} ($EndStringLogFile==1)") if $is_t_switch_active; - ${$self}{linebreaksAtEnd}{end} = 1; - - # modified end statement - ${$self}{replacementText} .= "\n"; - } elsif(${$self}{EndFinishesWithLineBreak}==2){ - if(${$self}{endImmediatelyFollowedByComment}){ - # no need to add a % if one already exists - $logger->trace("Even though $EndStringLogFile == 2, ${$self}{end} is immediately followed by a %, so not adding another; not adding line break.") if $is_t_switch_active; - } else { - # otherwise, create a trailing comment, and tack it on - $logger->trace("Adding a % immediately after, ${$self}{end} ($EndStringLogFile==2)") if $is_t_switch_active; - my $trailingCommentToken = "%".$self->add_comment_symbol; - ${$self}{end} =~ s/\h*$//s; - ${$self}{replacementText} .= "$trailingCommentToken\n"; - ${$self}{linebreaksAtEnd}{end} = 1; - } - } elsif(${$self}{EndFinishesWithLineBreak}==3){ - $logger->trace("Adding a blank line at the end of ${$self}{end} ($EndStringLogFile==3)") if $is_t_switch_active; - ${$self}{linebreaksAtEnd}{end} = 1; - - # modified end statement - ${$self}{replacementText} .= (${$masterSettings{modifyLineBreaks}}{preserveBlankLines}?$tokens{blanklines}:"\n")."\n"; - } + # + # Blank line poly-switch notes (==4) + # + # when EndFinishesWithLineBreak=4 we adopt the following approach: + # temporarily change EndFinishesWithLineBreak to -1, make adjustments + # temporarily change EndFinishesWithLineBreak to 3, make adjustments + # switch EndFinishesWithLineBreak back to 4 + # + @polySwitchValues =(defined ${$self}{EndFinishesWithLineBreak} and ${$self}{EndFinishesWithLineBreak}==4) ?(-1,3):(${$self}{EndFinishesWithLineBreak}); + foreach(@polySwitchValues){ + last if !(defined $_); + ${$self}{linebreaksAtEnd}{end} = 0 if($_==3 and (defined ${$self}{EndFinishesWithLineBreak} and ${$self}{EndFinishesWithLineBreak}==4)); + + # possibly modify line break *after* \end{statement} + if(defined $_ and $_>=1 + and !${$self}{linebreaksAtEnd}{end}){ + # if the <end> statement doesn't finish with a line break, + # then we have different actions based upon the value of EndFinishesWithLineBreak: + # EndFinishesWithLineBreak == 1 just add a new line + # EndFinishesWithLineBreak == 2 add a comment, and then new line + # EndFinishesWithLineBreak == 3 add a blank line, and then new line + my $EndStringLogFile = ${$self}{aliases}{EndFinishesWithLineBreak}||"EndFinishesWithLineBreak"; + if($_==1){ + $logger->trace("Adding a linebreak at the end of ${$self}{end} ($EndStringLogFile==1)") if $is_t_switch_active; + ${$self}{linebreaksAtEnd}{end} = 1; + + # modified end statement + ${$self}{replacementText} .= "\n"; + } elsif($_==2){ + if(${$self}{endImmediatelyFollowedByComment}){ + # no need to add a % if one already exists + $logger->trace("Even though $EndStringLogFile == 2, ${$self}{end} is immediately followed by a %, so not adding another; not adding line break.") if $is_t_switch_active; + } else { + # otherwise, create a trailing comment, and tack it on + $logger->trace("Adding a % immediately after, ${$self}{end} ($EndStringLogFile==2)") if $is_t_switch_active; + my $trailingCommentToken = "%".$self->add_comment_symbol; + ${$self}{end} =~ s/\h*$//s; + ${$self}{replacementText} .= "$trailingCommentToken\n"; + ${$self}{linebreaksAtEnd}{end} = 1; + } + } elsif($_==3){ + $logger->trace("Adding a blank line at the end of ${$self}{end} ($EndStringLogFile==3)") if $is_t_switch_active; + ${$self}{linebreaksAtEnd}{end} = 1; + + # modified end statement + ${$self}{replacementText} .= (${$masterSettings{modifyLineBreaks}}{preserveBlankLines}?$tokens{blanklines}:"\n")."\n"; + } + } } } diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm index 4508943ddfa..f20e23ca547 100755 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm @@ -17,6 +17,7 @@ package LatexIndent::NamedGroupingBracesBrackets; use strict; use warnings; use LatexIndent::Tokens qw/%tokens/; +use LatexIndent::GetYamlSettings qw/%masterSettings/; use LatexIndent::TrailingComments qw/$trailingCommentRegExp/; use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/; use LatexIndent::LogFile qw/$logger/; @@ -33,18 +34,22 @@ sub construct_grouping_braces_brackets_regexp{ # grab the arguments regexp my $optAndMandRegExp = $self->get_arguments_regexp; + # read from fine tuning + my $NamedGroupingBracesBracketsRegExp = qr/${${$masterSettings{fineTuning}}{NamedGroupingBracesBrackets}}{name}/; + my $NamedGroupingFollowRegExp = qr/${${$masterSettings{fineTuning}}{NamedGroupingBracesBrackets}}{follow}/; + # store the regular expresssion for matching and replacing $grouping_braces_regexp = qr/ ( - \h|\R|\{|\[|\$|\)|\( + $NamedGroupingFollowRegExp ) ( - [0-9\.a-zA-Z@\*><]+? # lowercase|uppercase letters, @, *, numbers, forward slash, dots - ) # $2 name - (\h*) # $3 h-space - (\R*) # $4 linebreaks - ($optAndMandRegExp) # $5 mand|opt arguments (at least one) - (\R)? # $8 linebreak + $NamedGroupingBracesBracketsRegExp # lowercase|uppercase letters, @, *, numbers, forward slash, dots + ) # $2 name + (\h*) # $3 h-space + (\R*) # $4 linebreaks + ($optAndMandRegExp) # $5 mand|opt arguments (at least one) + (\R)? # $8 linebreak /sx; # something {value} grouping braces with trailing comment diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/OptionalArgument.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/OptionalArgument.pm index 60e03ca91d4..fdaa549a7ae 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/OptionalArgument.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/OptionalArgument.pm @@ -18,7 +18,7 @@ use strict; use warnings; use LatexIndent::Tokens qw/%tokens/; use LatexIndent::TrailingComments qw/$trailingCommentRegExp/; -use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/; +use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active $is_m_switch_active /; use LatexIndent::LogFile qw/$logger/; use LatexIndent::IfElseFi qw/$ifElseFiBasicRegExp/; use LatexIndent::Special qw/$specialBeginBasicRegExp/; @@ -113,6 +113,8 @@ sub tasks_particular_to_each_object{ # search for special begin/end $self->find_special if ${$self}{body} =~ m/$specialBeginBasicRegExp/s; + # comma poly-switch check + $self->comma_else if $is_m_switch_active; } 1; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Replacement.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Replacement.pm new file mode 100644 index 00000000000..1bc51caed2d --- /dev/null +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Replacement.pm @@ -0,0 +1,89 @@ +package LatexIndent::Replacement; +# 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 LatexIndent::Tokens qw/%tokens/; +use LatexIndent::TrailingComments qw/$trailingCommentRegExp/; +use LatexIndent::GetYamlSettings qw/%masterSettings/; +use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active $is_rr_switch_active/; +use LatexIndent::LogFile qw/$logger/; +use Data::Dumper; +use Exporter qw/import/; +our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321 +our @EXPORT_OK = qw/make_replacements/; + +sub make_replacements{ + my $self = shift; + my %input = @_; + if ($is_t_switch_active and !$is_rr_switch_active){ + $logger->trace("*Replacement mode *$input{when}* indentation: -r") ; + } elsif ($is_t_switch_active and $is_rr_switch_active) { + $logger->trace("*Replacement mode, -rr switch is active") if $is_t_switch_active ; + } + + my @replacements = @{$masterSettings{replacements}}; + + foreach ( @replacements ){ + next if !(${$_}{this} or ${$_}{substitution}); + + # default value of "lookForThis" is 1 + ${$_}{lookForThis} = 1 if( !(defined ${$_}{lookForThis})); + + # move on if this one shouldn't be looked for + next if(!${$_}{lookForThis}); + + # default value of "when" is before + ${$_}{when} = "before" if( !(defined ${$_}{when}) or $is_rr_switch_active); + + # update to the logging file + if($is_t_switch_active and (${$_}{when} eq $input{when})){ + $logger->trace("-"); + $logger->trace("this: ${$_}{this}") if(${$_}{this}); + $logger->trace("that: ${$_}{that}") if(${$_}{that}); + $logger->trace("substitution: ${$_}{substitution}") if(${$_}{substitution}); + $logger->trace("when: ${$_}{when}"); + } + + # perform the substitutions + if(${$_}{when} eq $input{when}){ + $logger->warn("*You have specified both 'this' and 'substitution'; the 'substitution' field will be ignored") if(${$_}{this} and ${$_}{substitution}); + if(${$_}{this}){ + # *string* replacement + # *string* replacement + # *string* replacement + my $this = qq{${$_}{this}}; + my $that = (defined ${$_}{that}) ? qq{${$_}{that}} : q(); + my $index_match = index(${$self}{body}, $this); + while ( $index_match != -1 ) { + substr (${$self}{body}, $index_match, length($this), $that ); + $index_match = index(${$self}{body}, $this); + } + } else { + # *regex* replacement + # *regex* replacement + # *regex* replacement + + # https://stackoverflow.com/questions/12423337/how-to-pass-a-replacing-regex-as-a-command-line-argument-to-a-perl-script + my $body = ${$self}{body}; + eval("\$body =~ ${$_}{substitution}"); + ${$self}{body} = $body ; + } + } + } +} + +1; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Sentence.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Sentence.pm index 48ae0379d6c..cc11997e36f 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/Sentence.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Sentence.pm @@ -129,7 +129,7 @@ sub one_sentence_per_line{ $sentencesEndWithEachPart = qr/\./; } elsif($sentencesEndWithEachPart eq "betterFullStop"){ $logger->trace("sentence ENDS with *better* full stop (see oneSentencePerLine:sentencesEndWith:betterFullStop") if $is_t_switch_active; - $sentencesEndWithEachPart = qr/(?:\.\)(?!\h*[a-z]))|(?:(?<!(?:(?:e\.g)|(?:i\.e)|(?:etc))))\.(?!(?:[a-z]|[A-Z]|\-|~|\,|[0-9]))/; + $sentencesEndWithEachPart = qr/${${$masterSettings{fineTuning}}{modifyLineBreaks}}{betterFullStop}/; } elsif ($sentencesEndWithEachPart eq "exclamationMark"){ $logger->trace("sentence ENDS with exclamation mark (see oneSentencePerLine:sentencesEndWith:exclamationMark)") if $is_t_switch_active; $sentencesEndWithEachPart = qr/!/; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Switches.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Switches.pm index a5b07936a6d..d738a4b36b6 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/Switches.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Switches.pm @@ -17,11 +17,14 @@ package LatexIndent::Switches; use strict; use warnings; use Exporter qw/import/; -our @EXPORT_OK = qw/%switches storeSwitches $is_m_switch_active $is_t_switch_active $is_tt_switch_active/; +our @EXPORT_OK = qw/%switches storeSwitches $is_m_switch_active $is_t_switch_active $is_tt_switch_active $is_r_switch_active $is_rr_switch_active $is_rv_switch_active/; our %switches; our $is_m_switch_active; our $is_t_switch_active; our $is_tt_switch_active; +our $is_r_switch_active; +our $is_rr_switch_active; +our $is_rv_switch_active; sub storeSwitches{ my $self = shift; @@ -32,6 +35,10 @@ sub storeSwitches{ $is_t_switch_active = defined $switches{trace}?$switches{trace}: 0; $is_tt_switch_active = defined $switches{ttrace}?$switches{ttrace}: 0; $is_t_switch_active = $is_tt_switch_active ? $is_tt_switch_active : $is_t_switch_active; + $is_r_switch_active = defined $switches{replacement}?$switches{replacement}: 0; + $is_rr_switch_active = defined $switches{onlyreplacement}?$switches{onlyreplacement}: 0; + $is_rv_switch_active = defined $switches{replacementRespectVerb}?$switches{replacementRespectVerb}: 0; + $is_r_switch_active = ($is_rr_switch_active|$is_rv_switch_active) ? ($is_rr_switch_active|$is_rv_switch_active) : $is_r_switch_active; delete ${$self}{switches}; } 1; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm index 0c18484649a..eea6ee6747a 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm @@ -17,6 +17,7 @@ package LatexIndent::UnNamedGroupingBracesBrackets; use strict; use warnings; use LatexIndent::Tokens qw/%tokens/; +use LatexIndent::GetYamlSettings qw/%masterSettings/; use LatexIndent::TrailingComments qw/$trailingCommentRegExp/; use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/; use LatexIndent::LogFile qw/$logger/; @@ -36,8 +37,9 @@ sub construct_unnamed_grouping_braces_brackets_regexp{ # blank line token my $blankLineToken = $tokens{blanklines}; - # for example #1 #2, etc - my $numberedArgRegExp = $self->get_numbered_arg_regexp; + # arguments Before, by default, includes beamer special and numbered arguments, for example #1 #2, etc + my $argumentsBefore = qr/${${$masterSettings{fineTuning}}{arguments}}{before}/; + my $UnNamedGroupingFollowRegExp = qr/${${$masterSettings{fineTuning}}{UnNamedGroupingBracesBrackets}}{follow}/; # store the regular expresssion for matching and replacing $un_named_grouping_braces_RegExp = qr/ @@ -48,18 +50,18 @@ sub construct_unnamed_grouping_braces_brackets_regexp{ | (?:(?<!\\)\}) ) - (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$numberedArgRegExp)* # 0 or more h-space, blanklines, trailing comments + (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$argumentsBefore)* # 0 or more h-space, blanklines, trailing comments ) # END of NOT ( (?: - \{|\[|,|&|\)|\(|\$ # starting with { OR [ OR , OR & OR ) OR ( OR $ + $UnNamedGroupingFollowRegExp # starting with { OR [ OR , OR & OR ) OR ( OR $ ) \h* - ) # $1 into beginning bit - (\R*) # $2 linebreaksAtEnd of begin - ($optAndMandRegExp) # $3 mand|opt arguments (at least one) stored into body - (\R)? # $6 linebreak + ) # $1 into beginning bit + (\R*) # $2 linebreaksAtEnd of begin + ($optAndMandRegExp) # $3 mand|opt arguments (at least one) stored into body + (\R)? # $6 linebreak /sx; $un_named_grouping_braces_RegExp_trailing_comment = qr/$un_named_grouping_braces_RegExp(\h*)((?:$trailingCommentRegExp\h*)*)?/; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Version.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Version.pm index 52a659dc79c..c0ecb8bb067 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/Version.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Version.pm @@ -19,6 +19,6 @@ use warnings; use Exporter qw/import/; our @EXPORT_OK = qw/$versionNumber $versionDate/; -our $versionNumber = '3.6'; -our $versionDate = '2019-05-05'; +our $versionNumber = '3.7'; +our $versionDate = '2019-07-13'; 1 diff --git a/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml b/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml index d457e96e3a3..a706131365a 100755 --- a/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml +++ b/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml @@ -1,4 +1,4 @@ -# defaultSettings.yaml for latexindent.pl, version 3.6, 2019-05-05 +# defaultSettings.yaml for latexindent.pl, version 3.7, 2019-07-13 # a script that aims to # beautify .tex, .sty, .cls files # @@ -21,15 +21,18 @@ # For all communication, please visit: https://github.com/cmhughes/latexindent.pl -# You're welcome to change anything you like in here, but +# You should feel encouraged to change anything you like in these settings, but # it would probably be better to have your own user settings # files somewhere else - remember that this file may be overwritten -# when you update your distribution. Please see the manual -# for details of how to setup your own settings files. +# when you update your tex distribution. Please see the manual linked from: # -# Please read the manual first to understand what each switch does. +# https://github.com/cmhughes/latexindent.pl +# +# for details of how to create and configure your own settings files. +# +# Please read the manual (linked from above) first to understand what each switch does. -# latexindent can be called without a file extension, +# latexindent can be called to act on a file without using the file's extension, # e.g, simply # latexindent myfile # in which case the choice of file extension is chosen @@ -41,7 +44,7 @@ fileExtensionPreference: .cls: 3 .bib: 4 -# default file extension of backup file (if original is overwritten with -w switch) +# default file extension of backup file (if -w switch is active) # for example, if your .tex file is called # myfile.tex # and you specify the backupExtension as BACKUP.bak then your @@ -49,23 +52,26 @@ fileExtensionPreference: # myfileBACKUP.bak backupExtension: .bak -# only one backup per file; if onlyOneBackUp is 0 then, as a safety measure, -# the number on the extension increments by 1 each time: -# myfile.bak0, myfile.bak1, myfile.bak2 +# only one backup per file: +# - if onlyOneBackUp is 0 then, as a safety measure, +# the number on the extension increments by 1 each time: # -# if you set onlyOnebackUp to 1, then the backup file will -# be overwritten each time (not recommended until you trust the script) +# myfile.bak0, myfile.bak1, myfile.bak2 +# - if you set onlyOnebackUp to 1, then the backup file will +# be overwritten each time (not recommended until you trust the script) onlyOneBackUp: 0 -# some users may only want a set number of backup files, -# say at most 3; in which case, they can change this switch. +# some users may want a finite number of backup files, +# say at most 3; in which case, they can change this maxNumberOfBackUps. +# # If maxNumberOfBackUps is set to 0 (or less) then infinitely # many backups are possible, unless onlyOneBackUp is switched on maxNumberOfBackUps: 0 -# some users may wish to cycle through back up files, for example, -# with maxNumberOfBackUps: 4, they may wish to delete the oldest -# back up file, and keep only the most recent. +# some users may wish to cycle through back up files. +# +# for example, with maxNumberOfBackUps: 4, they may +# wish to delete the oldest back up file, and keep only the most recent. # # copy myfile.bak1 to myfile.bak0 # copy myfile.bak2 to myfile.bak1 @@ -102,8 +108,7 @@ verbatimCommands: # no indent blocks (not necessarily verbatim # environments) which are marked as %\begin{noindent} -# or anything else that the user puts in this hash -# table +# or anything else that you detail in the following noIndentBlock: noindent: 1 cmhtest: 1 @@ -136,7 +141,7 @@ lookForPreamble: # postfoothook=\end{mdframed}, preambleCommandsBeforeEnvironments: 0 -# Default value of indentation +# default value of indentation defaultIndent: "\t" # name of code blocks that should have their body aligned at ampersand delimiters @@ -185,7 +190,7 @@ indentAfterItems: description: 1 list: 1 -# if you want to use other names for your items (such as, for example, part) +# if you want to use other names for your items (for example, \part) # then populate them here; note that you can trick latexindent.pl # into indenting all kinds of commands (within environments specified in # indentAfterItems) using this technique. @@ -193,7 +198,7 @@ itemNames: item: 1 myitem: 1 -# specialBeginEnd is mainly mathmode focus, although +# specialBeginEnd is, by default, mathmode focus, although # there's no restrictions specialBeginEnd: displayMath: @@ -248,10 +253,10 @@ indentAfterHeadings: maximumIndentation: -1 # if you don't want to have additional indentation -# in an environment put it in this hash table; note that -# environments in this field will inherit +# in a code block, then add it to noAdditionalIndent; note that +# code blocks in this field will inherit # the *current* level of indentation they just won't -# get any *additional*. +# get any *additional* indentation noAdditionalIndent: myexample: 1 mydefinition: 1 @@ -264,8 +269,8 @@ noAdditionalIndent: document: 1 frame: 0 -# if you have indent rules for particular environments -# or commands, put them in here; for example, you might just want +# if you have indent rules for particular code blocks +# then you can populate them in indentRules; for example, you might just want # to use a space " " or maybe a double tab "\t\t" indentRules: myenvironment: "\t\t" @@ -325,72 +330,114 @@ commandCodeBlocks: # modifyLineBreaks will only be searched if the -m # switch is active -# BeginStartsOnOwnLine: 1 -# if a begin statement is not already on its own line, -# then, with -m active, it will be moved to its own line. # +# poly-switch examples: +# +# BeginStartsOnOwnLine: +# modify line breaks before a begin statement +# +# when set to -1, e.g +# some text some text +# \begin{myenvironment} +# will be changed to +# some text some text \begin{myenvironment} +# when set to 0, the switch is ignored # when set to 1, e.g # some text some text \begin{myenvironment} # will be changed to # some text some text # \begin{myenvironment} -# when set to -1, e.g -# some text some text -# \begin{myenvironment} +# when set to 2, e.g +# some text some text \begin{myenvironment} # will be changed to +# some text some text% +# \begin{myenvironment} +# when set to 3, e.g # some text some text \begin{myenvironment} -# when set to 0, the switch is ignored +# will be changed to +# some text some text # -# BodyStartsOnOwnLine: 1 -# if body does not already start on its own line, then with -# -m active, it will be moved to its own line. +# \begin{myenvironment} +# +# BodyStartsOnOwnLine: +# modify line breaks before the beginning of the body # +# when set to -1, e.g +# \begin{myenv} +# body text body text +# will be changed to +# \begin{myenv}body text body text +# when set to 0, the switch is ignored # when set to 1, e.g # \begin{myenv}body text body text # will be changed to # \begin{myenv} # body text body text -# when set to -1, e.g -# \begin{myenv} -# body text body text +# when set to 2, e.g +# \begin{myenv}body text body text # will be changed to +# \begin{myenv}% +# body text body text +# when set to 3, e.g # \begin{myenv}body text body text -# when set to 0, the switch is ignored +# will be changed to +# \begin{myenv} +# +# body text body text # -# EndStartsOnOwnLine: 1 -# if an end statement is not already on its own line, -# then, with -m active, it will be moved to its own line. +# EndStartsOnOwnLine: +# modify line breaks before the end statement # +# when set to -1, e.g +# some text some text +# \end{myenvironment} +# will be changed to +# some text some text \end{myenvironment} +# when set to 0, the switch is ignored # when set to 1, e.g # some text some text \end{myenvironment} # will be changed to # some text some text # \end{myenvironment} -# when set to -1, e.g -# some text some text -# \end{myenvironment} +# when set to 2, e.g +# some text some text \end{myenvironment} # will be changed to +# some text some text% +# \end{myenvironment} +# when set to 3, e.g # some text some text \end{myenvironment} -# when set to 0, the switch is ignored +# will be changed to +# some text some text # -# EndFinishesWithLineBreak: 1 -# this switch adjusts line breaks immmediately -# after an end statement (with -m active) +# \end{myenvironment} +# +# EndFinishesWithLineBreak: +# modify line breaks after the end statement # -# when set to 1, e.g -# \end{myenvironment}some text some text -# will be changed to -# \end{myenvironment} -# some text some text # when set to -1, e.g # \end{myenvironment} # some text some text # will be changed to # \end{myenvironment}some text some text # when set to 0, the switch is ignored +# when set to 1, e.g +# \end{myenvironment}some text some text +# will be changed to +# \end{myenvironment} +# some text some text +# when set to 2, e.g +# \end{myenvironment}some text some text +# will be changed to +# \end{myenvironment}% +# some text some text +# when set to 3, e.g +# \end{myenvironment}some text some text +# will be changed to +# \end{myenvironment} +# +# some text some text # -# Naturally, you can specify settings for individual environments, -# commands, headings, etc, populate as you wish. +# you can specify settings on a per-name basis modifyLineBreaks: preserveBlankLines: 1 condenseMultipleBlankLinesInto: 1 @@ -519,3 +566,38 @@ modifyLineBreaks: verbatim: VerbatimBeginStartsOnOwnLine: 0 VerbatimEndFinishesWithLineBreak: 0 + +# replacements, only active when either -r or -rr switches are active +replacements: + - + amalgamate: 1 + - + this: 'latexindent.pl' + that: 'pl.latexindent' + lookForThis: 1 + when: before + +# fineTuning allows you to tweak the internal pattern matching that +# is central to latexindent.pl +fineTuning: + environments: + name: '[a-zA-Z@\*0-9_\\]+' + ifElseFi: + name: '@?if[a-zA-Z@]*?' + commands: + name: '[+a-zA-Z@\*0-9_\:]+?' + keyEqualsValuesBracesBrackets: + name: '[a-zA-Z@\*0-9_\/.\h\{\}:\#-]+?' + follow: '(?:(?<!\\)\{)|,|(?:(?<!\\)\[)' + NamedGroupingBracesBrackets: + name: '[0-9\.a-zA-Z@\*><]+?' + follow: '\h|\R|\{|\[|\$|\)|\(' + UnNamedGroupingBracesBrackets: + follow: '\{|\[|,|&|\)|\(|\$' + arguments: + before: '(?:#\d\h*;?,?\/?)+|\<.*?\>' + between: '_|\^|\*' + modifyLineBreaks: + betterFullStop: '(?:\.\)(?!\h*[a-z]))|(?:(?<!(?:(?:e\.g)|(?:i\.e)|(?:etc))))\.(?!(?:[a-z]|[A-Z]|\-|~|\,|[0-9]))' + doubleBackSlash: '\\\\(?:\h*\[\h*\d+\h*[a-zA-Z]+\h*\])?' + comma: ',' diff --git a/Master/texmf-dist/scripts/latexindent/latexindent.pl b/Master/texmf-dist/scripts/latexindent/latexindent.pl index cb2208d1176..ecdf7c79e48 100755 --- a/Master/texmf-dist/scripts/latexindent/latexindent.pl +++ b/Master/texmf-dist/scripts/latexindent/latexindent.pl @@ -1,5 +1,5 @@ #!/usr/bin/env perl -# latexindent.pl, version 3.6, 2019-05-05 +# latexindent.pl, version 3.7, 2019-07-13 # # 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 @@ -44,6 +44,9 @@ GetOptions ( "help|h"=>\$switches{showhelp}, "cruft|c=s"=>\$switches{cruftDirectory}, "screenlog|sl"=>\$switches{screenlog}, + "replacement|r"=>\$switches{replacement}, + "onlyreplacement|rr"=>\$switches{onlyreplacement}, + "replacementrespectverb|rv"=>\$switches{replacementRespectVerb}, ); # check local settings doesn't interfer with reading the file; |