diff options
author | Karl Berry <karl@freefriends.org> | 2018-09-15 21:42:19 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-09-15 21:42:19 +0000 |
commit | 21b240fd974a27aad7d7c48cb027718a9e471f5b (patch) | |
tree | 85440b7e5cc9b6ca36f33a504377851ed0ac6e19 /Master | |
parent | 6646c4d916203b724973f3d5adbd597577cdb1b4 (diff) |
latexindent (15sep18)
git-svn-id: svn://tug.org/texlive/trunk@48673 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rwxr-xr-x | Master/bin/win32/latexindent.exe | bin | 11459600 -> 11461685 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/support/latexindent/README | 2 | ||||
-rw-r--r-- | Master/texmf-dist/doc/support/latexindent/latexindent.pdf | bin | 733304 -> 740178 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/support/latexindent/sec-the-m-switch.tex | 60 | ||||
-rw-r--r-- | Master/texmf-dist/doc/support/latexindent/title.tex | 2 | ||||
-rw-r--r-- | Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm | 7 | ||||
-rw-r--r-- | Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm | 227 | ||||
-rw-r--r-- | Master/texmf-dist/scripts/latexindent/LatexIndent/Sentence.pm | 362 | ||||
-rw-r--r-- | Master/texmf-dist/scripts/latexindent/LatexIndent/Version.pm | 4 | ||||
-rwxr-xr-x | Master/texmf-dist/scripts/latexindent/defaultSettings.yaml | 2 | ||||
-rwxr-xr-x | Master/texmf-dist/scripts/latexindent/latexindent.pl | 2 |
11 files changed, 425 insertions, 243 deletions
diff --git a/Master/bin/win32/latexindent.exe b/Master/bin/win32/latexindent.exe Binary files differindex f72957ab12e..20818652b55 100755 --- a/Master/bin/win32/latexindent.exe +++ b/Master/bin/win32/latexindent.exe diff --git a/Master/texmf-dist/doc/support/latexindent/README b/Master/texmf-dist/doc/support/latexindent/README index 0e4600ed256..ca5d51c1672 100644 --- a/Master/texmf-dist/doc/support/latexindent/README +++ b/Master/texmf-dist/doc/support/latexindent/README @@ -1,5 +1,5 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - latexindent.pl, version 3.5, 2018-08-13 + latexindent.pl, version 3.5.1, 2018-09-15 PERL script to indent code within environments, and align delimited environments in .tex files. diff --git a/Master/texmf-dist/doc/support/latexindent/latexindent.pdf b/Master/texmf-dist/doc/support/latexindent/latexindent.pdf Binary files differindex d93a76ea06b..4e7d556041b 100644 --- a/Master/texmf-dist/doc/support/latexindent/latexindent.pdf +++ b/Master/texmf-dist/doc/support/latexindent/latexindent.pdf diff --git a/Master/texmf-dist/doc/support/latexindent/sec-the-m-switch.tex b/Master/texmf-dist/doc/support/latexindent/sec-the-m-switch.tex index 3677af3f169..0ff58be3153 100644 --- a/Master/texmf-dist/doc/support/latexindent/sec-the-m-switch.tex +++ b/Master/texmf-dist/doc/support/latexindent/sec-the-m-switch.tex @@ -357,7 +357,7 @@ latexindent.pl -s textwrap6.tex -l=textwrap11.yaml -m \subsection{oneSentencePerLine: modifying line breaks for sentences}\label{sec:onesentenceperline} You can instruct \texttt{latexindent.pl} to - format%%%%% + format%%%%%% \announce{2018-01-13}{one sentence per line} your file so that it puts one sentence per line. Thank you to \cite{mlep} for helping to shape and test this feature. The behaviour of this part of the script is controlled by @@ -650,7 +650,7 @@ latexindent.pl multiple-sentences4 -m -l=item-rules2.yaml \end{minipage} \subsubsection{text wrapping and indenting sentences} - The \texttt{oneSentencePerLine}%% + The \texttt{oneSentencePerLine}%%% \announce*{2018-08-13}{oneSentencePerline text wrap and indent} can be instructed to perform text wrapping and indentation upon sentences. @@ -679,6 +679,48 @@ latexindent.pl multiple-sentences5 -m -l=sentence-wrap1.yaml \vref{lst:textwrap9-yaml}, for example, you would replace/append \texttt{environments} with, for example, \texttt{sentence: 50}. + The indentation of sentences requires that sentences are stored as code blocks. This + means that you may need to tweak \vref{lst:sentencesEndWith}. Let's explore this in + relation to \cref{lst:multiple-sentences6}. + + \cmhlistingsfromfile*{demonstrations/multiple-sentences6.tex}{\texttt{multiple-sentences6.tex}}{lst:multiple-sentences6} + + By default, \texttt{latexindent.pl} will find the full-stop within the first + \texttt{item}, which means that, upon running the following commands + \begin{commandshell} +latexindent.pl multiple-sentences6 -m -l=sentence-wrap1.yaml +latexindent.pl multiple-sentences6 -m -l=sentence-wrap1.yaml -y="modifyLineBreaks:oneSentencePerLine:sentenceIndent:''" +\end{commandshell} + we receive the respective output in \cref{lst:multiple-sentences6-mod1} and + \cref{lst:multiple-sentences6-mod2}. + + \cmhlistingsfromfile*{demonstrations/multiple-sentences6-mod1.tex}{\texttt{multiple-sentences6-mod1.tex} using \cref{lst:sentence-wrap1-yaml}}{lst:multiple-sentences6-mod1} + + \cmhlistingsfromfile*{demonstrations/multiple-sentences6-mod2.tex}{\texttt{multiple-sentences6-mod2.tex} using \cref{lst:sentence-wrap1-yaml} and no sentence indentation}{lst:multiple-sentences6-mod2} + + We note that \cref{lst:multiple-sentences6-mod1} the \texttt{itemize} code block has + \emph{not} been indented appropriately. This is because the + oneSentencePerLine has been instructed to store sentences (because + \cref{lst:sentence-wrap1-yaml}); each sentence is then searched for code blocks. + + We can tweak the settings in \vref{lst:sentencesEndWith} to ensure that full stops are + not followed by \texttt{item} commands, and that the end of sentences + contains \lstinline!\end{itemize}! as in \cref{lst:itemize-yaml} (if you intend to use this, ensure that you + remove the line breaks from the \texttt{other} field). + + \cmhlistingsfromfile*[style=yaml-LST]*{demonstrations/itemized.yaml}[MLB-TCB]{\texttt{itemize.yaml}}{lst:itemize-yaml} + + Upon running + \begin{commandshell} +latexindent.pl multiple-sentences6 -m -l=sentence-wrap1.yaml,itemize.yaml +\end{commandshell} + we receive the output in \cref{lst:multiple-sentences6-mod3}. + + \cmhlistingsfromfile*{demonstrations/multiple-sentences6-mod3.tex}{\texttt{multiple-sentences6-mod3.tex} using \cref{lst:sentence-wrap1-yaml} and \cref{lst:itemize-yaml}}{lst:multiple-sentences6-mod3} + + Notice that the sentence has received indentation, and that the + \texttt{itemize} code block has been found and indented correctly. + \subsection{removeParagraphLineBreaks: modifying line breaks for paragraphs}\label{subsec:removeparagraphlinebreaks} When the \texttt{-m} switch is active \texttt{latexindent.pl} has the ability to remove line breaks% @@ -821,7 +863,7 @@ latexindent.pl -m shortlines-md.tex -o shortlines-md4.tex -l remove-para4.yaml \end{widepage} then we obtain the output in \cref{lst:shortlines-md4}. \cmhlistingsfromfile{demonstrations/shortlines-md4.tex}{\texttt{shortlines-md4.tex}}{lst:shortlines-md4} - Note%%%% + Note%%%%% \announce*{2018-08-13}*{updates to all in removeParagraphLineBreaks} that the \texttt{all} field can take the same exceptions detailed in \cref{lst:textwrap6-yaml}{lst:textwrap8-yaml}. @@ -889,7 +931,7 @@ latexindent.pl -m sl-stop.tex -o sl-stop4-comment.tex -l=remove-para4.yaml,stop- \subsection{Combining removeParagraphLineBreaks and textWrapOptions}\label{subsec:removeparagraphlinebreaks:and:textwrap} - The%%%% + The%%%%% \announce*{2018-08-13}{combine text wrap and remove paragraph line breaks} text wrapping routine (\vref{subsec:textwrapping}) and remove paragraph line breaks routine (\vref{subsec:removeparagraphlinebreaks}) can be combined. @@ -929,7 +971,7 @@ latexindent.pl -m textwrap7.tex -l=textwrap12.yaml -o=+-mod12 \subsection{Poly-switches}\label{sec:poly-switches} Every other field in the \texttt{modifyLineBreaks} field uses poly-switches, and can - take one of \emph{five}%%%%% + take one of \emph{five}%%%%%% \announce{2017-08-21}*{blank line poly-switch} integer values: \begin{itemize}[font=\bfseries] \item[$-1$] \emph{remove mode}: line breaks before or after the @@ -1044,7 +1086,7 @@ latexindent.pl -m env-mlb.tex -l env-mlb2.yaml comment symbol has been added before adding the line break; in both cases, trailing horizontal space has been stripped before doing so. - Let's%%%%% + Let's%%%%%% \announce{2017-08-21}{demonstration of blank line poly-switch (3)} now change each of the \texttt{1} values in \cref{lst:env-mlb1,lst:env-mlb2} so that they are $3$ and save them into \texttt{env-mlb5.yaml} and @@ -1142,7 +1184,7 @@ latexindent.pl -m env-mlb.tex -l env-mlb8.yaml comment symbol has been added before adding the line break; in both cases, trailing horizontal space has been stripped before doing so. - Let's%%%%% + Let's%%%%%% \announce{2017-08-21}{demonstration of blank line poly-switch (3)} now change each of the \texttt{1} values in \cref{lst:env-mlb7,lst:env-mlb8} so that they are $3$ and save them into \texttt{env-mlb11.yaml} and @@ -1425,7 +1467,7 @@ latexindent.pl -m env-mlb7.tex -l env-mlb13.yaml,env-mlb14.yaml,UnpreserveBlankL ifelsefi & \verb!before words!$\BeginStartsOnOwnLine$ & $\BeginStartsOnOwnLine$ & IfStartsOnOwnLine \\ & \verb!\if...!$\BodyStartsOnOwnLine$ & $\BodyStartsOnOwnLine$ & BodyStartsOnOwnLine \\ & \verb!body of if/or statement!$\OrStartsOnOwnLine$ & $\OrStartsOnOwnLine$ & OrStartsOnOwnLine % - \announce{2018-04-27}{new ifElseFi code block polyswitches} \\ + \announce{2018-04-27}{new ifElseFi code block polyswitches} \\ & \verb!\or!$\OrFinishesWithLineBreak$ & $\OrFinishesWithLineBreak$ & OrFinishesWithLineBreak \\ & \verb!body of if/or statement!$\ElseStartsOnOwnLine$ & $\ElseStartsOnOwnLine$ & ElseStartsOnOwnLine \\ & \verb!\else!$\ElseFinishesWithLineBreak$ & $\ElseFinishesWithLineBreak$ & ElseFinishesWithLineBreak \\ @@ -1464,7 +1506,7 @@ latexindent.pl -m env-mlb7.tex -l env-mlb13.yaml,env-mlb14.yaml,UnpreserveBlankL specialBeginEnd & before words$\BeginStartsOnOwnLine$ & $\BeginStartsOnOwnLine$ & SpecialBeginStartsOnOwnLine \\ & \verb!\[!$\BodyStartsOnOwnLine$ & $\BodyStartsOnOwnLine$ & SpecialBodyStartsOnOwnLine \\ & \verb!body of special/middle!$\ElseStartsOnOwnLine$ & $\ElseStartsOnOwnLine$ & SpecialMiddleStartsOnOwnLine % - \announce{2018-04-27}{new special code block polyswitches} \\ + \announce{2018-04-27}{new special code block polyswitches} \\ & \verb!\middle!$\ElseFinishesWithLineBreak$ & $\ElseFinishesWithLineBreak$ & SpecialMiddleFinishesWithLineBreak \\ & body of special/middle $\EndStartsOnOwnLine$ & $\EndStartsOnOwnLine$ & SpecialEndStartsOnOwnLine \\ & \verb!\]!$\EndFinishesWithLineBreak$ & $\EndFinishesWithLineBreak$ & SpecialEndFinishesWithLineBreak \\ diff --git a/Master/texmf-dist/doc/support/latexindent/title.tex b/Master/texmf-dist/doc/support/latexindent/title.tex index f1aaa7a4b7e..c5bc77b483b 100644 --- a/Master/texmf-dist/doc/support/latexindent/title.tex +++ b/Master/texmf-dist/doc/support/latexindent/title.tex @@ -8,7 +8,7 @@ sharp corners, enhanced, overlay={\node[anchor=north east,outer sep=2pt] at ([xshift=3cm,yshift=4mm]frame.north east) {\includegraphics[width=3cm]{logo}}; }] - \centering\ttfamily\bfseries latexindent.pl\\[1cm] Version 3.5 + \centering\ttfamily\bfseries latexindent.pl\\[1cm] Version 3.5.1 \end{tcolorbox} } \author{Chris Hughes \thanks{and contributors! diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm index 1b9d3811fb9..491b9bce7f3 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm @@ -27,7 +27,8 @@ use LatexIndent::GetYamlSettings qw/yaml_read_settings yaml_modify_line_breaks_s use LatexIndent::FileExtension qw/file_extension_check/; use LatexIndent::BackUpFileProcedure qw/create_back_up_file/; use LatexIndent::BlankLines qw/protect_blank_lines unprotect_blank_lines condense_blank_lines/; -use LatexIndent::ModifyLineBreaks qw/modify_line_breaks_body modify_line_breaks_end remove_line_breaks_begin adjust_line_breaks_end_parent text_wrap remove_paragraph_line_breaks construct_paragraph_reg_exp one_sentence_per_line text_wrap_remove_paragraph_line_breaks/; +use LatexIndent::ModifyLineBreaks qw/modify_line_breaks_body modify_line_breaks_end remove_line_breaks_begin adjust_line_breaks_end_parent text_wrap remove_paragraph_line_breaks construct_paragraph_reg_exp text_wrap_remove_paragraph_line_breaks/; +use LatexIndent::Sentence qw/one_sentence_per_line/; use LatexIndent::TrailingComments qw/remove_trailing_comments put_trailing_comments_back_in add_comment_symbol construct_trailing_comment_regexp/; use LatexIndent::HorizontalWhiteSpace qw/remove_trailing_whitespace remove_leading_space/; 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/; @@ -95,7 +96,6 @@ sub operate_on_file{ $self->find_file_contents_environments_and_preamble; $self->dodge_double_backslash; $self->remove_leading_space; - $self->one_sentence_per_line if $is_m_switch_active; $self->process_body_of_text; $self->remove_trailing_whitespace(when=>"after"); $self->condense_blank_lines; @@ -180,6 +180,9 @@ sub process_body_of_text{ sub find_objects{ my $self = shift; + # one sentence per line: sentences are objects, as of V3.5.1 + $self->one_sentence_per_line if ($is_m_switch_active and ${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{manipulateSentences}); + # search for environments $logger->trace('looking for ENVIRONMENTS') if $is_t_switch_active; $self->find_environments if ${$self}{body} =~ m/$environmentBasicRegExp/s; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm index afa1360369d..2faa53b2920 100644 --- a/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm @@ -25,7 +25,7 @@ use LatexIndent::TrailingComments qw/$trailingCommentRegExp/; use LatexIndent::Switches qw/$is_m_switch_active $is_t_switch_active $is_tt_switch_active/; use LatexIndent::Item qw/$listOfItems/; 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 one_sentence_per_line text_wrap_remove_paragraph_line_breaks/; +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/; our $paragraphRegExp = q(); @@ -327,230 +327,5 @@ sub remove_paragraph_line_breaks{ } } -sub one_sentence_per_line{ - my $self = shift; - - return unless ${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{manipulateSentences}; - $logger->trace("*One sentence per line regular expression construction: (see oneSentencePerLine: manipulateSentences)") if $is_t_switch_active; - - # sentences FOLLOW - # sentences FOLLOW - # sentences FOLLOW - my $sentencesFollow = q(); - - while( my ($sentencesFollowEachPart,$yesNo)= each %{${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesFollow}}){ - if($yesNo){ - if($sentencesFollowEachPart eq "par"){ - $sentencesFollowEachPart = qr/\R?\\par/s; - } elsif ($sentencesFollowEachPart eq "blankLine"){ - $sentencesFollowEachPart = qr/ - (?:\A(?:$tokens{blanklines}\R)+) # the order of each of these - | # is important, as (like always) the first - (?:\G(?:$tokens{blanklines}\R)+) # thing to be matched will - | # be accepted - (?:(?:$tokens{blanklines}\h*\R)+) - | - \R{2,} - | - \G - /sx; - } elsif ($sentencesFollowEachPart eq "fullStop"){ - $sentencesFollowEachPart = qr/\./s; - } elsif ($sentencesFollowEachPart eq "exclamationMark"){ - $sentencesFollowEachPart = qr/\!/s; - } elsif ($sentencesFollowEachPart eq "questionMark"){ - $sentencesFollowEachPart = qr/\?/s; - } elsif ($sentencesFollowEachPart eq "rightBrace"){ - $sentencesFollowEachPart = qr/\}/s; - } elsif ($sentencesFollowEachPart eq "commentOnPreviousLine"){ - $sentencesFollowEachPart = qr/$trailingCommentRegExp\h*\R/s; - } elsif ($sentencesFollowEachPart eq "other"){ - $sentencesFollowEachPart = qr/$yesNo/; - } - $sentencesFollow .= ($sentencesFollow eq '' ? q() : "|").qr/$sentencesFollowEachPart/sx; - } - } - # if blankLine is not active from sentencesFollow then we need to set up the - # beginning of the string, but make sure that it is *not* followed by a - # blank line token, or a blank line - if(!${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesFollow}}{blankLine}){ - $sentencesFollow .= ($sentencesFollow eq '' ? q() : "|"). - qr/ - \G - (?!$tokens{blanklines}) - /sx; - } - - if(${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesFollow}}{blankLine}){ - $sentencesFollow = ($sentencesFollow eq '' ? q() : qr/(?:$sentencesFollow)(?:\h|\R)*/sx ); - } else { - $sentencesFollow = ($sentencesFollow eq '' ? q() : qr/(?:$sentencesFollow)(?:\h*\R?)/sx ); - } - - - $logger->trace("Sentences follow regexp:") if $is_tt_switch_active; - $logger->trace($sentencesFollow) if $is_tt_switch_active; - - # sentences BEGIN with - # sentences BEGIN with - # sentences BEGIN with - my $sentencesBeginWith = q(); - - while( my ($sentencesBeginWithEachPart,$yesNo)= each %{${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesBeginWith}}){ - if($yesNo){ - if($sentencesBeginWithEachPart eq "A-Z"){ - $logger->trace("sentence BEGINS with capital letters (see oneSentencePerLine:sentencesBeginWith:A-Z)") if $is_t_switch_active; - $sentencesBeginWithEachPart = qr/(?!(?:$tokens{blanklines}|$tokens{verbatim}|$tokens{preamble}))[A-Z]/; - } elsif ($sentencesBeginWithEachPart eq "a-z"){ - $logger->trace("sentence BEGINS with lower-case letters (see oneSentencePerLine:sentencesBeginWith:a-z)") if $is_t_switch_active; - $sentencesBeginWithEachPart = qr/[a-z]/; - } elsif ($sentencesBeginWithEachPart eq "other"){ - $logger->trace("sentence BEGINS with other $yesNo (reg exp) (see oneSentencePerLine:sentencesBeginWith:other)") if $is_t_switch_active; - $sentencesBeginWithEachPart = qr/$yesNo/; - } - $sentencesBeginWith .= ($sentencesBeginWith eq "" ? q(): "|" ).$sentencesBeginWithEachPart; - } - } - $sentencesBeginWith = qr/$sentencesBeginWith/; - - # sentences END with - # sentences END with - # sentences END with - ${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesEndWith}}{basicFullStop} = 0 if ${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesEndWith}}{betterFullStop}; - my $sentencesEndWith = q(); - - while( my ($sentencesEndWithEachPart,$yesNo)= each %{${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesEndWith}}){ - if($yesNo){ - if($sentencesEndWithEachPart eq "basicFullStop"){ - $logger->trace("sentence ENDS with full stop (see oneSentencePerLine:sentencesEndWith:basicFullStop") if $is_t_switch_active; - $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]))/; - } elsif ($sentencesEndWithEachPart eq "exclamationMark"){ - $logger->trace("sentence ENDS with exclamation mark (see oneSentencePerLine:sentencesEndWith:exclamationMark)") if $is_t_switch_active; - $sentencesEndWithEachPart = qr/!/; - } elsif ($sentencesEndWithEachPart eq "questionMark"){ - $logger->trace("sentence ENDS with question mark (see oneSentencePerLine:sentencesEndWith:questionMark)") if $is_t_switch_active; - $sentencesEndWithEachPart = qr/\?/; - } elsif ($sentencesEndWithEachPart eq "other"){ - $logger->trace("sentence ENDS with other $yesNo (reg exp) (see oneSentencePerLine:sentencesEndWith:other)") if $is_t_switch_active; - $sentencesEndWithEachPart = qr/$yesNo/; - } - $sentencesEndWith .= ($sentencesEndWith eq "" ? q(): "|" ).$sentencesEndWithEachPart; - } - } - $sentencesEndWith = qr/$sentencesEndWith/; - - # the OVERALL sentence regexp - # the OVERALL sentence regexp - # the OVERALL sentence regexp - $logger->trace("Overall sentences end with regexp:") if $is_tt_switch_active; - $logger->trace($sentencesEndWith) if $is_tt_switch_active; - - $logger->trace("Finding sentences...") if $is_t_switch_active; - - my $notWithinSentence = qr/$trailingCommentRegExp/s; - - # if - # - # modifyLineBreaks - # oneSentencePerLine - # sentencesFollow - # blankLine - # - # is set to 0 then we need to *exclude* the $tokens{blanklines} from the sentence routine, - # otherwise we could begin a sentence with $tokens{blanklines}. - if(!${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesFollow}}{blankLine}){ - $notWithinSentence .= "|".qr/(?:\h*\R?$tokens{blanklines})/s; - } - - # similarly for \par - if(${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesFollow}}{par}){ - $notWithinSentence .= "|".qr/(?:\R?\\par)/s; - } - - # initiate the sentence counter - my $sentenceCounter; - my @sentenceStorage; - - # make the sentence manipulation - ${$self}{body} =~ s/((?:$sentencesFollow)) - (\h*) - (?!$notWithinSentence) - ((?:$sentencesBeginWith).*?) - ($sentencesEndWith)/ - my $beginning = $1; - my $h_space = ($2?$2:q()); - my $middle = $3; - my $end = $4; - my $trailingComments = q(); - # remove trailing comments from within the body of the sentence - while($middle =~ m|$trailingCommentRegExp|){ - $middle =~ s|\h*($trailingCommentRegExp)||s; - $trailingComments .= $1; - } - # remove line breaks from within a sentence - $middle =~ s| - (?!\A) # not at the *beginning* of a match - (\h*)\R # possible horizontal space, then line break - |$1?$1:" ";|esgx if ${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{removeSentenceLineBreaks}; - $middle =~ s|$tokens{blanklines}\h*\R?|$tokens{blanklines}\n|sg; - $logger->trace("follows: $beginning") if $is_tt_switch_active; - $logger->trace("sentence: $middle") if $is_tt_switch_active; - $logger->trace("ends with: $end") if $is_tt_switch_active; - # reconstruct the sentence - $sentenceCounter++; - push(@sentenceStorage,{id=>$tokens{sentence}.$sentenceCounter.$tokens{endOfToken},value=>$middle.$end}); - $beginning.$h_space.$tokens{sentence}.$sentenceCounter.$tokens{endOfToken}.$trailingComments; - /xsge; - - # loop back through the sentenceStorage and replace with the sentence, adjusting line breaks - # before and after appropriately - while( my $sentence = pop @sentenceStorage){ - my $sentenceStorageID = ${$sentence}{id}; - my $sentenceStorageValue = ${$sentence}{value}; - - # option to text wrap (and option to indent) sentences - if(${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{textWrapSentences}){ - my $sentenceObj = LatexIndent::Document->new(body=>$sentenceStorageValue, - name=>"sentence", - modifyLineBreaksYamlName=>"sentence", - ); - - # text wrapping - $sentenceObj->yaml_get_columns; - $sentenceObj->text_wrap; - - # indentation of sentences - if(${$sentenceObj}{body} =~ m/ - (.*?) # content of first line - \R # first line break - (.*$) # rest of body - /sx){ - my $bodyFirstLine = $1; - my $remainingBody = $2; - my $indentation = ${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentenceIndent}; - $logger->trace("first line of sencent: $bodyFirstLine") if $is_tt_switch_active; - $logger->trace("remaining body (before indentation):\n'$remainingBody'") if($is_tt_switch_active); - - # add the indentation to all the body except first line - $remainingBody =~ s/^/$indentation/mg unless($remainingBody eq ''); # add indentation - $logger->trace("remaining body (after indentation):\n$remainingBody'") if($is_tt_switch_active); - - # put the body back together - ${$sentenceObj}{body} = $bodyFirstLine."\n".$remainingBody; - } - $sentenceStorageValue = ${$sentenceObj}{body}; - }; - # sentence at the very END - ${$self}{body} =~ s/\h*$sentenceStorageID\h*$/$sentenceStorageValue/s; - # sentence at the very BEGINNING - ${$self}{body} =~ s/^$sentenceStorageID\h*\R?/$sentenceStorageValue\n/s; - # all other sentences - ${$self}{body} =~ s/\R?\h*$sentenceStorageID\h*\R?/\n$sentenceStorageValue\n/s; - } - -} 1; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Sentence.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Sentence.pm new file mode 100644 index 00000000000..c7bc39c284b --- /dev/null +++ b/Master/texmf-dist/scripts/latexindent/LatexIndent/Sentence.pm @@ -0,0 +1,362 @@ +package LatexIndent::Sentence; +# 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_m_switch_active/; +use LatexIndent::LogFile qw/$logger/; +use LatexIndent::Environment qw/$environmentBasicRegExp/; +use LatexIndent::IfElseFi qw/$ifElseFiBasicRegExp/; +use LatexIndent::Heading qw/$allHeadingsRegexp/; +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/one_sentence_per_line/; +our $sentenceCounter; + +sub one_sentence_per_line{ + my $self = shift; + + $logger->trace("*One sentence per line regular expression construction: (see oneSentencePerLine: manipulateSentences)") if $is_t_switch_active; + + # sentences FOLLOW + # sentences FOLLOW + # sentences FOLLOW + my $sentencesFollow = q(); + + while( my ($sentencesFollowEachPart,$yesNo)= each %{${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesFollow}}){ + if($yesNo){ + if($sentencesFollowEachPart eq "par"){ + $sentencesFollowEachPart = qr/\R?\\par/s; + } elsif ($sentencesFollowEachPart eq "blankLine"){ + $sentencesFollowEachPart = qr/ + (?:\A(?:$tokens{blanklines}\R)+) # the order of each of these + | # is important, as (like always) the first + (?:\G(?:$tokens{blanklines}\R)+) # thing to be matched will + | # be accepted + (?:(?:$tokens{blanklines}\h*\R)+) + | + \R{2,} + | + \G + /sx; + } elsif ($sentencesFollowEachPart eq "fullStop"){ + $sentencesFollowEachPart = qr/\./s; + } elsif ($sentencesFollowEachPart eq "exclamationMark"){ + $sentencesFollowEachPart = qr/\!/s; + } elsif ($sentencesFollowEachPart eq "questionMark"){ + $sentencesFollowEachPart = qr/\?/s; + } elsif ($sentencesFollowEachPart eq "rightBrace"){ + $sentencesFollowEachPart = qr/\}/s; + } elsif ($sentencesFollowEachPart eq "commentOnPreviousLine"){ + $sentencesFollowEachPart = qr/$trailingCommentRegExp\h*\R/s; + } elsif ($sentencesFollowEachPart eq "other"){ + $sentencesFollowEachPart = qr/$yesNo/; + } + $sentencesFollow .= ($sentencesFollow eq '' ? q() : "|").qr/$sentencesFollowEachPart/sx; + } + } + # if blankLine is not active from sentencesFollow then we need to set up the + # beginning of the string, but make sure that it is *not* followed by a + # blank line token, or a blank line + if(!${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesFollow}}{blankLine}){ + $sentencesFollow .= ($sentencesFollow eq '' ? q() : "|"). + qr/ + \G + (?!$tokens{blanklines}) + /sx; + } + + if(${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesFollow}}{blankLine}){ + $sentencesFollow = ($sentencesFollow eq '' ? q() : qr/(?:$sentencesFollow)(?:\h|\R)*/sx ); + } else { + $sentencesFollow = ($sentencesFollow eq '' ? q() : qr/(?:$sentencesFollow)(?:\h*\R?)/sx ); + } + + + $logger->trace("Sentences follow regexp:") if $is_tt_switch_active; + $logger->trace($sentencesFollow) if $is_tt_switch_active; + + # sentences BEGIN with + # sentences BEGIN with + # sentences BEGIN with + my $sentencesBeginWith = q(); + + while( my ($sentencesBeginWithEachPart,$yesNo)= each %{${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesBeginWith}}){ + if($yesNo){ + if($sentencesBeginWithEachPart eq "A-Z"){ + $logger->trace("sentence BEGINS with capital letters (see oneSentencePerLine:sentencesBeginWith:A-Z)") if $is_t_switch_active; + $sentencesBeginWithEachPart = qr/(?!(?:$tokens{blanklines}|$tokens{verbatim}|$tokens{preamble}))[A-Z]/; + } elsif ($sentencesBeginWithEachPart eq "a-z"){ + $logger->trace("sentence BEGINS with lower-case letters (see oneSentencePerLine:sentencesBeginWith:a-z)") if $is_t_switch_active; + $sentencesBeginWithEachPart = qr/[a-z]/; + } elsif ($sentencesBeginWithEachPart eq "other"){ + $logger->trace("sentence BEGINS with other $yesNo (reg exp) (see oneSentencePerLine:sentencesBeginWith:other)") if $is_t_switch_active; + $sentencesBeginWithEachPart = qr/$yesNo/; + } + $sentencesBeginWith .= ($sentencesBeginWith eq "" ? q(): "|" ).$sentencesBeginWithEachPart; + } + } + $sentencesBeginWith = qr/$sentencesBeginWith/; + + # sentences END with + # sentences END with + # sentences END with + ${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesEndWith}}{basicFullStop} = 0 if ${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesEndWith}}{betterFullStop}; + my $sentencesEndWith = q(); + + while( my ($sentencesEndWithEachPart,$yesNo)= each %{${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesEndWith}}){ + if($yesNo){ + if($sentencesEndWithEachPart eq "basicFullStop"){ + $logger->trace("sentence ENDS with full stop (see oneSentencePerLine:sentencesEndWith:basicFullStop") if $is_t_switch_active; + $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]))/; + } elsif ($sentencesEndWithEachPart eq "exclamationMark"){ + $logger->trace("sentence ENDS with exclamation mark (see oneSentencePerLine:sentencesEndWith:exclamationMark)") if $is_t_switch_active; + $sentencesEndWithEachPart = qr/!/; + } elsif ($sentencesEndWithEachPart eq "questionMark"){ + $logger->trace("sentence ENDS with question mark (see oneSentencePerLine:sentencesEndWith:questionMark)") if $is_t_switch_active; + $sentencesEndWithEachPart = qr/\?/; + } elsif ($sentencesEndWithEachPart eq "other"){ + $logger->trace("sentence ENDS with other $yesNo (reg exp) (see oneSentencePerLine:sentencesEndWith:other)") if $is_t_switch_active; + $sentencesEndWithEachPart = qr/$yesNo/; + } + $sentencesEndWith .= ($sentencesEndWith eq "" ? q(): "|" ).$sentencesEndWithEachPart; + } + } + $sentencesEndWith = qr/$sentencesEndWith/; + + # the OVERALL sentence regexp + # the OVERALL sentence regexp + # the OVERALL sentence regexp + $logger->trace("Overall sentences end with regexp:") if $is_tt_switch_active; + $logger->trace($sentencesEndWith) if $is_tt_switch_active; + + $logger->trace("Finding sentences...") if $is_t_switch_active; + + my $notWithinSentence = qr/$trailingCommentRegExp/s; + + # if + # + # modifyLineBreaks + # oneSentencePerLine + # sentencesFollow + # blankLine + # + # is set to 0 then we need to *exclude* the $tokens{blanklines} from the sentence routine, + # otherwise we could begin a sentence with $tokens{blanklines}. + if(!${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesFollow}}{blankLine}){ + $notWithinSentence .= "|".qr/(?:\h*\R?$tokens{blanklines})/s; + } + + # similarly for \par + if(${${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentencesFollow}}{par}){ + $notWithinSentence .= "|".qr/(?:\R?\\par)/s; + } + + # initiate the sentence counter + my @sentenceStorage; + + # make the sentence manipulation + ${$self}{body} =~ s/((?:$sentencesFollow)) + (\h*) + (?!$notWithinSentence) + ((?:$sentencesBeginWith).*?) + ($sentencesEndWith) + (\h*)? # possibly followed by horizontal space + (\R)? # possibly followed by a line break + ($trailingCommentRegExp)? # possibly followed by trailing comments + / + my $beginning = $1; + my $h_space = ($2?$2:q()); + my $middle = $3; + my $end = $4; + my $trailing = ($5?$5:q()).($6?$6:q()).($7?$7:q()); + my $lineBreaksAtEnd = ($6? 1 : ($7?1:0) ); + my $trailingComments = q(); + # remove trailing comments from within the body of the sentence + if (${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{removeSentenceLineBreaks}){ + while($middle =~ m|$trailingCommentRegExp|){ + $middle =~ s|\h*($trailingCommentRegExp)||s; + $trailingComments .= $1; + } + } + # remove line breaks from within a sentence + $middle =~ s| + (?!\A) # not at the *beginning* of a match + (\h*)\R # possible horizontal space, then line break + |$1?$1:" ";|esgx if ${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{removeSentenceLineBreaks}; + $middle =~ s|$tokens{blanklines}\h*\R?|$tokens{blanklines}\n|sg; + $logger->trace("follows: $beginning") if $is_tt_switch_active; + $logger->trace("sentence: $middle") if $is_tt_switch_active; + $logger->trace("ends with: $end") if $is_tt_switch_active; + # if indentation is specified for sentences, then we treat + # them as objects; otherwise we don't + my $replacementText = q(); + if(${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentenceIndent} =~ m|\h+|){ + my $sentenceObj = LatexIndent::Sentence->new( + name=>"sentence", + begin=>q(), + body=>$middle.$end, + end=>q(), + indentation=>${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentenceIndent}, + modifyLineBreaksYamlName=>"sentence", + BeginStartsOnOwnLine=>1, + ); + # log file output + $logger->trace("*sentence found: $middle.$end") if $is_t_switch_active; + + # the settings and storage of most objects has a lot in common + $self->get_settings_and_store_new_object($sentenceObj); + ${@{${$self}{children}}[-1]}{replacementText} = $beginning.$h_space.$tokens{sentence}.$sentenceCounter.$tokens{endOfToken}.$trailingComments.$trailing.($lineBreaksAtEnd ? q() : "\n"); + $replacementText = ${@{${$self}{children}}[-1]}{replacementText}; + } else { + $sentenceCounter++; + push(@sentenceStorage,{id=>$tokens{sentence}.$sentenceCounter.$tokens{endOfToken},value=>$middle.$end}); + $replacementText = $beginning.$h_space.$tokens{sentence}.$sentenceCounter.$tokens{endOfToken}.$trailingComments.$trailing.($lineBreaksAtEnd ? q() : "\n"); + }; + $replacementText; + /xsge; + + if(${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentenceIndent} !~ m/\h+/){ + # loop back through the sentenceStorage and replace with the sentence, adjusting line breaks + # before and after appropriately + while( my $sentence = pop @sentenceStorage){ + my $sentenceStorageID = ${$sentence}{id}; + my $sentenceStorageValue = ${$sentence}{value}; + + # option to text wrap (and option to indent) sentences + if(${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{textWrapSentences}){ + my $sentenceObj = LatexIndent::Document->new(body=>$sentenceStorageValue, + name=>"sentence", + modifyLineBreaksYamlName=>"sentence", + ); + + # text wrapping + $sentenceObj->yaml_get_columns; + $sentenceObj->text_wrap; + + # indentation of sentences + if(${$sentenceObj}{body} =~ m/ + (.*?) # content of first line + \R # first line break + (.*$) # rest of body + /sx){ + my $bodyFirstLine = $1; + my $remainingBody = $2; + my $indentation = ${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentenceIndent}; + $logger->trace("first line of sencent: $bodyFirstLine") if $is_tt_switch_active; + $logger->trace("remaining body (before indentation):\n'$remainingBody'") if($is_tt_switch_active); + + # add the indentation to all the body except first line + $remainingBody =~ s/^/$indentation/mg unless($remainingBody eq ''); # add indentation + $logger->trace("remaining body (after indentation):\n$remainingBody'") if($is_tt_switch_active); + + # put the body back together + ${$sentenceObj}{body} = $bodyFirstLine."\n".$remainingBody; + } + $sentenceStorageValue = ${$sentenceObj}{body}; + }; + # sentence at the very END + ${$self}{body} =~ s/\h*$sentenceStorageID\h*$/$sentenceStorageValue/s; + # sentence at the very BEGINNING + ${$self}{body} =~ s/^$sentenceStorageID\h*\R?/$sentenceStorageValue\n/s; + # all other sentences + ${$self}{body} =~ s/\R?\h*$sentenceStorageID\h*\R?/\n$sentenceStorageValue\n/s; + } + } +} + +sub create_unique_id{ + my $self = shift; + + $sentenceCounter++; + ${$self}{id} = "$tokens{sentence}$sentenceCounter"; + return; +} + +sub tasks_particular_to_each_object{ + my $self = shift; + + # option to text wrap (and option to indent) sentences + if(${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{textWrapSentences}){ + $self->yaml_get_columns; + $self->text_wrap; + } + + # search for environments + $logger->trace('looking for ENVIRONMENTS') if $is_t_switch_active; + $self->find_environments if ${$self}{body} =~ m/$environmentBasicRegExp/s; + + # search for ifElseFi blocks + $logger->trace('looking for IFELSEFI') if $is_t_switch_active; + $self->find_ifelsefi if ${$self}{body} =~ m/$ifElseFiBasicRegExp/s; + + # search for headings (part, chapter, section, setc) + $logger->trace('looking for HEADINGS (chapter, section, part, etc)') if $is_t_switch_active; + $self->find_heading if ${$self}{body} =~ m/$allHeadingsRegexp/s; + + # the ordering of finding commands and special code blocks can change + $self->find_commands_or_key_equals_values_braces_and_special if ${$self}{body} =~ m/$specialBeginAndBracesBracketsBasicRegExp/s; +} + +sub indent_body{ + return unless ${$masterSettings{modifyLineBreaks}{oneSentencePerLine}}{sentenceIndent} =~ m/\h+/; + + my $self = shift; + + # indentation of sentences + if(${$self}{body} =~ m/ + (.*?) # content of first line + \R # first line break + (.*$) # rest of body + /sx){ + my $bodyFirstLine = $1; + my $remainingBody = $2; + my $indentation = ${$self}{indentation}; + $logger->trace("first line of sentence $bodyFirstLine") if $is_tt_switch_active; + $logger->trace("remaining body (before indentation):\n'$remainingBody'") if($is_tt_switch_active); + + # add the indentation to all the body except first line + $remainingBody =~ s/^/$indentation/mg unless($remainingBody eq ''); # add indentation + $logger->trace("remaining body (after indentation):\n$remainingBody'") if($is_tt_switch_active); + + # put the body back together + ${$self}{body} = $bodyFirstLine."\n".$remainingBody; + } +} + +sub yaml_get_indentation_settings_for_this_object{ + return; +} + +sub add_surrounding_indentation_to_begin_statement{ + # specific method for sentences + my $self = shift; + + my $surroundingIndentation = ${$self}{surroundingIndentation}; + ${$self}{body} =~ s/^(\h*)?/$surroundingIndentation/s; # add indentation + +} + + +1; diff --git a/Master/texmf-dist/scripts/latexindent/LatexIndent/Version.pm b/Master/texmf-dist/scripts/latexindent/LatexIndent/Version.pm index 989d4f73fb1..41ca222bb3f 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.5'; -our $versionDate = '2018-08-13'; +our $versionNumber = '3.5.1'; +our $versionDate = '2018-09-15'; 1 diff --git a/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml b/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml index a1ef1172aca..704ae17418f 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.5, 2018-08-13 +# defaultSettings.yaml for latexindent.pl, version 3.5.1, 2018-09-15 # a script that aims to # beautify .tex, .sty, .cls files # diff --git a/Master/texmf-dist/scripts/latexindent/latexindent.pl b/Master/texmf-dist/scripts/latexindent/latexindent.pl index 0945273d857..60148de7ab3 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.5, 2018-08-13 +# latexindent.pl, version 3.5.1, 2018-09-15 # # 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 |