Это было весело! macOS включает Perl и textutil
, которые используются для изменения форматов документов, так что вы можете делать что-то вроде того, что вам нужно, без необходимости устанавливать что-либо ...
#!/bin/bash
perl -pe 'BEGIN{ $/=\1; }
s/0/<font color="red" >0<font color="black">/ ||
s/1/<font color="green" >1<font color="black">/ ||
s/2/<font color="blue" >2<font color="black">/ ||
s/3/<font color="cyan" >3<font color="black">/ ||
s/4/<font color="magenta">4<font color="black">/ ||
s/5/<font color="yellow" >5<font color="black">/ ||
s/6/<font color="pink" >6<font color="black">/ ||
s/7/<font color="orange" >7<font color="black">/ ||
s/8/<font color="teal" >8<font color="black">/ ||
s/9/<font color="gray" >9<font color="black">/ ||
s/\n/<br>/;
' "$1" | textutil -format html -convert rtf -stdin -stdout > output.rtf
Сохраните это как go
и сделайте его исполняемым, только один раз с:
chmod +x go
Затем вы можете конвертировать любой документ, подобный этому:
./go input.txt
и он составит output.rtf
.
Итак, если я начну со следующего в input.txt
:
1234567890 I love RTF and HTML but not 2 much and I can't spell, or count 1,000,222
1 man had 2 dogs and 333 cats
Я получаю:
Perl читает по 1 символу за раз, из-за $/=\1;
. Затем он заменяет любую цифру тегом HTML font
другим цветом, а затем устанавливает черный цвет после цифры. Выходные данные затем передаются в textutil
, который должен обрабатывать входные данные как html
и делать вывод RTF.
Я потратил на это целый день, и до сих пор не понимаю, почему один из ваших документов работает, а другой - нет. Единственное, что я могу сказать, это то, что textutil
, похоже, не падает, когда я закомментирую следующую строку, которая меняет цвета 1
в вашем документе на зеленый! Понятия не имею почему!
s/1/<font color="green" >1<font color="black">/ ||
Я переписал это даже по-другому, но все равно. Я приведу код ниже, чтобы другие могли поиграть с ним:
#!/usr/bin/env perl
use strict;
use warnings;
my ($i, $x, %HofH);
# Initialise table mapping input bytes to output/actions
# So it's a hash of hashes, each hash stores the corresponding output string and whether it set colour
foreach $i ('A'..'Z', 'a'..'z' ){
$x = ord($i);
$HofH{$x}{out} = $i;
}
# Set up the coloured digits 0-9
$i=48; $HofH{$i}{out} = sprintf("<font color='red'>0") ; $HofH{$i}{colour}=1;
#$i=49; $HofH{$i}{out} = sprintf("1") ; $HofH{$i}{colour}=1; # THIS CRASHES TEXTUTIL ???
$i=50; $HofH{$i}{out} = sprintf("<font color='blue'>2") ; $HofH{$i}{colour}=1;
$i=51; $HofH{$i}{out} = sprintf("<font color='cyan'>3") ; $HofH{$i}{colour}=1;
$i=52; $HofH{$i}{out} = sprintf("<font color='magenta'>4"); $HofH{$i}{colour}=1;
$i=53; $HofH{$i}{out} = sprintf("<font color='yellow'>5") ; $HofH{$i}{colour}=1;
$i=54; $HofH{$i}{out} = sprintf("<font color='pink'>6") ; $HofH{$i}{colour}=1;
$i=55; $HofH{$i}{out} = sprintf("<font color='orange'>7") ; $HofH{$i}{colour}=1;
$i=56; $HofH{$i}{out} = sprintf("<font color='teal'>8") ; $HofH{$i}{colour}=1;
$i=57; $HofH{$i}{out} = sprintf("<font color='grey'>9") ; $HofH{$i}{colour}=1;
# Special cases - CR, LF, ampersand
$i=9; $HofH{$i}{out} = " ";
$i=10; $HofH{$i}{out} = "<br>\n";
$i=13; $HofH{$i}{out} = "<br>\n";
$i=39; $HofH{$i}{out} = "&";
$i=47; $HofH{$i}{out} = "/";
$i=61; $HofH{$i}{out} = "=";
$i=63; $HofH{$i}{out} = "?";
$i=40; $HofH{$i}{out} = "(";
$i=41; $HofH{$i}{out} = ")";
$i=45; $HofH{$i}{out} = "-";
$i=58; $HofH{$i}{out} = ":";
$i=59; $HofH{$i}{out} = ";";
$i=46; $HofH{$i}{out} = ".";
$i=44; $HofH{$i}{out} = ",";
$i=32; $HofH{$i}{out} = " ";
$i=60; $HofH{$i}{out} = "<";
$i=62; $HofH{$i}{out} = ">";
open(my $FILE, $ARGV[0]) or die $!;
binmode($FILE);
local $/ = \1;
my $cnt=0;
while ( my $byte = <$FILE> ) {
my $x = ord($byte);
if(defined $HofH{$x}){
printf("%s",$HofH{$x}{out});
printf("<font color='black'>") if defined $HofH{$x}{colour}
} else {
printf STDERR "ERROR: Character number %d ignored at byte offset %d\n",$x,$cnt;
}
$cnt++;
}
close $FILE;
Вы запускаете его с:
thisScript.pl someFile.txt | textutil -format html -convert rtf -stdin -stdout > output.rtf