Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Batch text processing with Perl 6

I am reading Think Perl 6 by Laurent Rosenfeld, with Allen B. Downey recently which is a very good reading.

It has its .tex files available in github here.

It has code examples like this: enter image description here

I believe it would be very useful to have the code blocks colored like this: enter image description here

For this to happen we have to batch process all .tex files contained in the repository above. For this to happen we have to convert the latex code:

\begin{verbatim}
        say 42 ==  42;           # True
        say 42 ==  42.0;         # True
        say 42 ===  42;          # True
        say 42 === 42.0;         # False
\end{verbatim}


\begin{verbatim}
$x eq $y            # $x is string-wise equal to $y
$x ne $y            # $x is string-wise not equal to $y
$x gt $y            # $x is greater than $y (alphabetically after)
$x lt $y            # $x is less than $y (alphabetically before)
$x ge $y            # $x is greater than or equal to $y
$x le $y            # $x is less than or equal to $y
$x eqv $y           # $x is truly equivalent to $y
\end{verbatim}

TO

\begin{minted}{perl6}
        say 42 ==  42;           # True
        say 42 ==  42.0;         # True
        say 42 ===  42;          # True
        say 42 === 42.0;         # False
\end{minted}


\begin{minted}{perl6}
$x eq $y            # $x is string-wise equal to $y
$x ne $y            # $x is string-wise not equal to $y
$x gt $y            # $x is greater than $y (alphabetically after)
$x lt $y            # $x is less than $y (alphabetically before)
$x ge $y            # $x is greater than or equal to $y
$x le $y            # $x is less than or equal to $y
$x eqv $y           # $x is truly equivalent to $y
\end{minted}

I want to accomplish this with Perl 6. Here is how I plan to do.

THIS IS DUMMY CODE

# First I want to skim all the .tex files in the cloned repo (with git) 

for dir("ThinkPerl6/book") ->$file {
  say $file if $file~~/\.tex/;
}

# Read each .tex file and modify, replace `\begin{verbatim}` with `\begin{minted}{perl6}`

for "$file.tex".IO.lines -> $line {
  substitute with "\begin{minted}{perl6}" if $line ~~/\\begin\{verbatim\}/;
}

# Read each .tex file and modify, replace `\end{verbatim}` with `\end{minted}`

for "$file.tex".IO.lines -> $line {
  substitute with "\end{minted}" if $line ~~/\\end\{verbatim\}/;
}

I could not go beyond that. Any help? Use of regexp would be very helpful.

Best regards,

Suman

like image 648
Suman Khanal Avatar asked Dec 23 '22 15:12

Suman Khanal


2 Answers

You need to do the following steps:

  • create a copy of each line with a substitution applied. You can use the subst method for that
  • write the modified copy to a new file (maybe with extension .new added or so)
  • optionally, move the .new to override the original file. See this example for inspiration.

I hope this helps.

like image 88
moritz Avatar answered Dec 31 '22 15:12

moritz


Here is one implementation of moritz's first two bullet points.

my $fh-out = open "$file.new.tex", :w; # Create a new file

# Read in old file, line by line
for "$file.tex".IO.lines -> $line is copy {

    # Make changes, if needed
    $line.=subst('\begin\{verbatim\}','\begin{minted}{perl6}');
    $line.=subst('\end\{verbatim\}','\end{minted}');

    # Print line to new file
    $fh-out.put: $line;
}
like image 40
Christopher Bottoms Avatar answered Dec 31 '22 14:12

Christopher Bottoms