Как изменить цвет шрифта чисел в TextEdit - PullRequest
0 голосов
/ 30 октября 2018

Мне было интересно, возможно ли изменение цвета шрифта для определенных чисел в TextEdit.

Например, все «1» синим, «2 красным» и т. Д.

Если это невозможно в TextEdit, может кто-нибудь предложить аналогичное программное обеспечение, способное сделать это, и читать файлы .txt?

1 Ответ

0 голосов
/ 30 октября 2018

Это было весело! 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

Я получаю:

enter image description here


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} = "&amp;";
   $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} = "&lt;";
   $i=62; $HofH{$i}{out} = "&gt;";

   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
...