Newsgroup: it.comp.software.newsreader
Titolo: [SLRN] Pacchetto di filtri di riformattazione

  Mi scuso in anticipo per la lunghezza, ma ho difficolta` nel gestire
il mio `spazio  web' (Virgilio ha cambiato  i riferimenti dell'account
tin.it
, e  non ho  il tempo  materiale per  ripristinare il  tutto), e
cosi` mi sono assunto la  responsabilita` di postare questo script sul
NewsGroup, nella speranza che a qualcuno possa tornare utile.
  Era da tempo che  mi frullava per la testa, e ora  - dopo i preziosi
consigli di `Zefram' Bassi e pkd - ci sono riuscito.
  L'esigenza  mi  era  nata frequentando  it.arti.scrivere,  NewsGroup
secondo  me  molto  interessante  per quanto  riguarda  i  `contenuti'
(racconti scritti da gente alla  quale piace scrivere) ma estremamente
carente  - per  non dire  "demoralizzante"  - per  quanto riguarda  la
formattazione dei post.
  Dal momento che so - per esperienza diretta - che esortare a leggere
le basi della `Netiquette' e` una  causa persa in partenza (quando non
si  rischia addirittura  di  `offendere' il  `postatore selvaggio'  di
turno), e dal momento che  la stragrande maggioranza ha la `deleteria'
abitudine di scrivere con Word, per poi con un cut & paste infilare il
risultato nel  newsreader o nelle  finestre di NewsLand e/o  di Google
(con  i risultati  che si  possono facilmente  immaginare), e  insomma
considerando che in  fondo in fine le casistiche  sono un'infinita`, e
che non si  puo` costringere nessuno a cambiare  le proprie abitudini,
anche se pessime...
  ...ho optato  per un lavoro  di `rifinitura' del  messaggio inviato.
Cosi` io posso  leggere in santa pace  nel modo che piace a  me, e chi
l'ha spedito dorme sogni tranquilli... ;;;)
  Il  risultato  finale  secondo  me  e`  notevole.  C'e`  sicuramente
ancora  qualche sbavatura  (per esempio  dovrei trovare  il tempo  per
documentarmi  sulle varie  codifiche),  pero` credo  che  la base  sia
sufficientemente "solida".
  Lo  script puo`  ovviamente essere  agganciato a  un `Hook'  in modo
da  poterlo lanciare  in  automatico all'apertura  di ogni  messaggio:
personalmente ho  preferito l'assegnazione di un  tasto, anche perche'
non  `tutti' i  messaggi necessitano  di una  riformattazione talmente
`pesante'.
[Nota]: In  alcuni casi  ho sacrificato  qualche spazio  per contenere
        ogni riga dello  script in 80 caratteri. Si  perde qualcosa in
        "leggibilita`", pero` le funzionalita` restano invariate.
  Un saluto a tutti, e scusate ancora per l'eventuale disturbo.
______________________________________________________________________
*** Script Start ***
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%_____________________________________________________________________
%
% FormatArticle.sl
%
%  V. 0.2 by DisKre Panza - Free Software GNU GPL
%  21 Novembre 2004
%
%   `Pacchetto' di tre  funzioni in S-Lang per slrn.  E` stato testato
% unicamente  sotto Linux  Debian Woody.  Non garantisco  il risultato
% sotto Windows (e cmq, richiede  il programma `par', che esiste anche
% nella versione per Windows...)
%
%   La  funzione  `FiltraCaratteri'  consente  di  uniformare  diversi
% caratteri  codificati in  modo `strano'  (caratteri di  Word/Outlook
% Express, codifiche MIME e UTF-8, codifiche per il simbolo dell'Euro,
% e altre cose trovate qua e la`...)
%
%   La funzione  `GiustificaArticolo' utilizza `par'  per giustificare
% il 'body', o `corpo' dell'Articolo.
%
%   La funzione `FiltraArticolo'  e` la "Main", che  richiama le altre
% due. Il  risultato finale  e` un  messaggio - a  mio parere  - molto
% piu`  leggibile, soprattutto  per chi,  come me,  ha l'abitudine  di
% utilizzare in  lettura un  font a  spaziatura `fissa'.  Ne consiglio
% vivamente l'utilizzo soprattutto in presenza di post molto "lunghi".
%
%   Ovviamente, il tutto e`  liberamente utilizzabile, distribuibile e
% modificabile in base  alle proprie esigenze... Beh, se  vi scappa di
% `citarmi' non ci sputo mica sopra. Ma non e` indispensabile... ;)
%
%   Piu`  che  altro,  mi   interesserebbero  eventuali  commenti  e/o
% suggerimenti.
%
%   Spero   che  lo   script  sia   adeguatamente  commentato.   Resto
% naturalmente  a  disposizione  per ogni  eventuale  chiarimento  e/o
% proposta.
%
%   Per contattarmi: demokrito cochlea tin punctum it ;;;)
%
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%_____________________________________________________________________
% Filtraggio dei caratteri
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define FiltraCaratteri( art1 )
{
%_____________________________________________________________________
% Primo passaggio:
%   Sostituisce i  caratteri inviati dalle "specifiche"  (???) Windows
%   utilizzate dal controllo automatico di Word e di OutLook
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, "\x85", "...", strlen( art1 ) );
% N.B.: Che razza di carattere e` lo \x86? L'ho trovato in un post, ma
% non riesco a capire a cosa possa corrispondere...
  ( art1, ) = strreplace( art1, "\x91", "`"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\x92", "\'" , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\x93", "\"" , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\x94", "\"" , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\x96", "-"  , strlen( art1 ) );
%_____________________________________________________________________
% Secondo passaggio:
%   Sostituisce i caratteri inviati dalle "specifiche" (???) MIME
%   (praticamente: quando un post ha un header del tipo:
%     Content-Type: multipart/alternative;
%   )
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, "=\x0A", "\n", strlen( art1 ) );
  ( art1, ) = strreplace( art1, "=20"  , " " , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "=C8"  , "È" , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "=E0"  , "à" , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "=E8"  , "è" , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "=E9"  , "é" , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "=EC"  , "ì" , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "=F2"  , "ò" , strlen( art1 ) );
% La "ó" mi sa che non la usa nessuno... cmq, che codice ha?
  ( art1, ) = strreplace( art1, "=F9"  , "ù" , strlen( art1 ) );
%_____________________________________________________________________
% Terzo passaggio:
%   Sostituisce i caratteri inviati con lo "standard" (???) UTF-8
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, "\xE2\x80\x99", "\'",  strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\xE2\x80\x9C", "\"",  strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\xE2\x80\x9D", "\"",  strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\xE2\x80\xA6", "...", strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\xC3\xA8",     "è",   strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\xC3\xA9",     "é",   strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\xC3\xAC",     "ì",   strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\xC3\xB2",     "ò",   strlen( art1 ) );
% sempre la "ó"... uffa... che codice ha?
  ( art1, ) = strreplace( art1, "\xC3\xB9",     "ù",   strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\xC3",         "à",   strlen( art1 ) );
%_____________________________________________________________________
% Notare che  la "à" ho dovuto  metterla per ultima perche'  non ha un
% codice a due byte... ma chi cazzo ha fatto questa codifica?
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%_____________________________________________________________________
% Quarto passaggio:
%   Sostituzione di  assurdita` varie  che ho trovato  scandagliando i
%   varï post...
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% Forte Agent 1.9/32.560  (Anche questa: ma che razza  di codifica e`?
% In alcuni casi `sembra' richiamare l'utf-8, pero`...)
  ( art1, ) = strreplace( art1, "=C3=B2", "ché", strlen( art1 ) );
  ( art1, ) = strreplace( art1, "=C3=A0", "à"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "=C3=A8", "è"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "=C3=B9", "ù"  , strlen( art1 ) );
%_____________________________________________________________________
% Quinto passaggio:
%   Una vera "Chicca": il simbolo dell'Euro!...
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  % charset="utf-8"
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, "\xE2\x82\xAC", "\xA4",  strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\xE2\x2C\xAC", "\xA4",  strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\xC2\xA4"    , "\xA4",  strlen( art1 ) );
  % charset="gb18030"
  %~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, "\xA1\xE8", "\xA4",  strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\xA2\xE3", "\xA4",  strlen( art1 ) );
  % Questa dovrebbe essere la "bufala" di Windows...
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  % charset="ISO-8859-1"
  % charset="Windows-1252"
  ( art1, ) = strreplace( art1, "\x80", "\xA4",  strlen( art1 ) );
  % Se ne trovo altri, li aggiungo...
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%_____________________________________________________________________
% Sesto passaggio:
%   Qua invece tentiamo di cambiare gli apostrofi "ascii"...
%   (mah... mi sembra quasi di violentare me stesso...)
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, "a'", "à"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "E'", "È"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "E`", "È"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "e'", "è"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "e`", "è"  , strlen( art1 ) );
% sono solo io che faccio queste distinzioni, suvvi`a...
  ( art1, ) = strreplace( art1, "i'", "ì"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "o'", "ò"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "o`", "ò"  , strlen( art1 ) );
% ...come sopra...
  ( art1, ) = strreplace( art1, "u'", "ù"  , strlen( art1 ) );
% correggiamo gli svarioni piu` comuni...
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, "erchè", "erché", strlen( art1 ) );
  ( art1, ) = strreplace( art1, "oichè", "oiché", strlen( art1 ) );
  ( art1, ) = strreplace( art1, "dà"   , "da\'"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "fà"   , "fa\'"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "pò"   , "po\'"  , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "chè"  , "ché"   , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "quì"  , "qui"   , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "quà"  , "qua"   , strlen( art1 ) );
% ...e gli accenti sbagliati...
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, " é"   , " è"   , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "á"    , "à"    , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "í"    , "ì"    , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "ú"    , "ù"    , strlen( art1 ) );
% ...puntini di sospensione!... (forse un po' esagerato...)
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  (art1,) = strreplace(art1, "\.\.\.\.\.\.\.\.\.\. ", "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\.\.\.\.\.\.\." , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\.\.\.\.\.\. "  , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\.\.\.\.\.\."   , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\.\.\.\.\. "    , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\.\.\.\.\."     , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\.\.\.\. "      , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\.\.\.\."       , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\.\.\. "        , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\.\.\."         , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\.\. "          , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\.\."           , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\. "            , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\.\."             , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\. "              , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\. "                , "\.\.\." , strlen(art1));
  (art1,) = strreplace(art1, "\.\.\."               , "\.\.\. ", strlen(art1));
% Spazio prima e dopo il punto
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, "  \.", "\. ", strlen( art1 ) );
  ( art1, ) = strreplace( art1, " \." , "\. ", strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\.  ", "\. ", strlen( art1 ) );
% Spazio prima e dopo la virgola
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, "  \,", "\, " , strlen( art1 ) );
  ( art1, ) = strreplace( art1, " \," , "\, " , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\,  ", "\, " , strlen( art1 ) );
% Spazio prima dell'apostrofo (e casi particolari...)
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, " \'" , "\'"   , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "\'st", " \'st", strlen( art1 ) );
% Casi particolari: apostrofo in fine linea
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, "\'\n", "\'", strlen( art1 ) );
% Spazio dopo l'apostrofo (e casi particolari...)
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( art1, ) = strreplace( art1, "\' " , "\'"   , strlen( art1 ) );
  ( art1, ) = strreplace( art1, "da\'", "da\' ", strlen( art1 ) );
  ( art1, ) = strreplace( art1, "fa\'", "fa\' ", strlen( art1 ) );
  ( art1, ) = strreplace( art1, "po\'", "po\' ", strlen( art1 ) );
%_____________________________________________________________________
% Sono ovviamente graditi suggerimenti...
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  return( art1 );
}
%_____________________________________________________________________
% Questa funzione puo` essere usata anche in modo autonomo, con le
% seguenti modifiche:
%
% define FiltraCaratteri()
% {
%   variable art1;
%
%   art1 = raw_article_as_string();
%
%   [... resto della funzione... ]
%
%   replace_article ( article );
%
%   return();
% }
%
% Poi `assegnare' un tasto alla funzione:
%   Ctrl+f non  mi risulta essere un  tasto gia` assegnato, e  mi pare
%   decisamente il piu` logico...
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%_____________________________________________________________________
% definekey ( "FiltraCaratteri", "^f", "article" );
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%_____________________________________________________________________
% Giustificazione del corpo dell'articolo
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define GiustificaArticolo( body )
{
  variable body_file, body_par;
  variable fp;
  variable line;
  variable fpar;
  variable new_body = "";
  % Assegna il nome al file temporaneo contenente il corpo del mex
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  body_file = "BodyTmp";
  body_par  = body_file + ".par";
  % Apre un file in scrittura e vi memorizza il corpo del Mex
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  fp = fopen( body_file, "w" );
  if( fp == NULL )
    verror ( "%s: non posso aprire il file %s in scrittura!...",
             _function_name(), body_file );
  % Scrive il corpo del Mex in un file temporaneo
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  () = fputs ( body, fp );
  % Chiude il file
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  () = fclose ( fp );
 
  % Esegue il comando di giustificazione `par'
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  () = system (sprintf ("cat %s | par B=.>_A_a 70j >%s",
                        body_file, body_par ) );
  % Apre il corpo del Mex giustificato
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  fp = fopen( body_par, "r" );
  if( fp == NULL )
    verror ( "%s: non posso aprire il file %s in lettura!...",
             _function_name(), body_par );
  % Preleva il corpo del messaggio
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  fpar = fgetslines( fp );
  % Chiude e cancella il file temporaneo
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  () = fclose( fp );
  () = remove( body_par );
  % Ricostruisce il nuovo corpo del messaggio
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  foreach( fpar )
  {
    line = ();
    new_body = strcat( new_body, line );
  }
  return( new_body );
}
%_____________________________________________________________________
% Come la precedente... Ctrl+j mi sembra appropriato
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%_____________________________________________________________________
% definekey ( "GiustificaArticolo", "^j", "article" );
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%_____________________________________________________________________
% Funzione `Main':
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define FiltraArticolo ()
{
  if( is_group_mode() )
    error ( _function_name() + " doesn\'t work in group mode!" );
%_____________________________________________________________________
% Lettura articolo 'grezzo"
%   E`  necessario utilizzare  il "raw"  perche' altrimenti  slrn puo`
%   "filtrare" l'articolo a modo suo.
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  variable
    article = raw_article_as_string(),
    i = is_substr ( article, "\n\n" ),    % cerca l'inizio del body
    j = is_substr ( article, "\n-- " ),   % cerca l'inizio della tag
    header, body, tagline;
  if( i >= 1 )
    header = article[[0:i-1]];   % separa l'header dal body
  else
    return();
  if( j >= 1 )
    body = article[[i:j-1]];     % separa il body dalla tag (se c'e`)
  else
    body = article[[i:]];
  if( j >= 1 )
    tagline = article[[j:]];     % preleva la tag (se c'e`)
%_____________________________________________________________________
% Filtra i caratteri per non avere sorprese alla fine
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%_____________________________________________________________________
  body = FiltraCaratteri( body );
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( body, ) = strreplace( body, "\n", "\n\n", 1 );
% Corregge 'sto cappero di errori che mi fanno...
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%  Non chiedetemi  perche', sarebbe troppo complicato...
  ( body, ) = strreplace( body, "\. \n"     , "\.\n"      , strlen( body ) );
% ...ebbene si`, c'e` anche chi fa questo errore... :-(
  ( body, ) = strreplace( body, "\.\n\n"    , "\.\n"      , strlen( body ) );
  ( body, ) = strreplace( body, "\.\n"      , "\.\n\n"    , strlen( body ) );
  ( body, ) = strreplace( body, "\.\.\.\n\n", "\.\.\.\n"  , strlen( body ) );
  ( body, ) = strreplace( body, "\.\.\.\n"  , "\.\.\.\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\!\n\n"    , "\!\n"      , strlen( body ) );
  ( body, ) = strreplace( body, "\!\n"      , "\!\n\n"    , strlen( body ) );
  ( body, ) = strreplace( body, "\?\n\n"    , "\?\n"      , strlen( body ) );
  ( body, ) = strreplace( body, "\?\n"      , "\?\n\n"    , strlen( body ) );
  ( body, ) = strreplace( body, "\-\n\n"    , "\-\n"      , strlen( body ) );
  ( body, ) = strreplace( body, "\-\n"      , "\-\n\n"    , strlen( body ) );
  ( body, ) = strreplace( body, "\:\n\n"    , "\:\n"      , strlen( body ) );
  ( body, ) = strreplace( body, "\:\n"      , "\:\n\n"    , strlen( body ) );
  % Uniforma il `Quoting'... (cinque mi pajono sufficienti...)
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  (body,) = strreplace(body,"\n\> \> \> \> \> ","¡\>\>\>\>\> ", strlen(body));
  (body,) = strreplace(body,"\n\> \> \> \> \>" ,"¡\>\>\>\>\> ", strlen(body));
  (body,) = strreplace(body,"\n\> \> \> \> "   ,"¡\>\>\>\> "  , strlen(body));
  (body,) = strreplace(body,"\n\> \> \> \>"    ,"¡\>\>\>\> "  , strlen(body));
  (body,) = strreplace(body,"\n\> \> \> "      ,"¡\>\>\> "    , strlen(body));
  (body,) = strreplace(body,"\n\> \> \>"       ,"¡\>\>\> "    , strlen(body));
  (body,) = strreplace(body,"\n\> \> "         ,"¡\>\> "      , strlen(body));
  (body,) = strreplace(body,"\n\> \>"          ,"¡\>\> "      , strlen(body));
  (body,) = strreplace(body,"\n\> "            ,"¡\> "        , strlen(body));
  (body,) = strreplace(body,"\n\>"             ,"¡\> "        , strlen(body));
% Sostituzioni in preparazione per `par'
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% Tenta di `intuire' gli "a capo"...
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  % Punto, Esclamazione, interrogazione, trattino in fine di riga...
  %   La scelta del carattere "¡" puo`  essere opinabile, ma lo uso da
  %   anni come delimitatore di  campo senza problemi. Ovviamente, chi
  %   ha corrispondenza spagnola potrebbe trovarsi in crisi... ;;;)
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( body, ) = strreplace( body, "\.\n\n"    , "\.\n"      , strlen( body ) );
  ( body, ) = strreplace( body, "\.\n"      , "\.\¡\¡"    , strlen( body ) );
  ( body, ) = strreplace( body, "\.\.\.\n\n", "\.\.\.\n"  , strlen( body ) );
  ( body, ) = strreplace( body, "\.\.\.\n"  , "\.\.\.\¡\¡", strlen( body ) );
  ( body, ) = strreplace( body, "\!\n\n"    , "\!\n"      , strlen( body ) );
  ( body, ) = strreplace( body, "\!\n"      , "\!\¡\¡"    , strlen( body ) );
  ( body, ) = strreplace( body, "\?\n\n"    , "\?\n"      , strlen( body ) );
  ( body, ) = strreplace( body, "\?\n"      , "\?\¡\¡"    , strlen( body ) );
  ( body, ) = strreplace( body, "\-\n\n"    , "\-\n"      , strlen( body ) );
  ( body, ) = strreplace( body, "\-\n"      , "\-\¡\¡"    , strlen( body ) );
  ( body, ) = strreplace( body, "\:\n\n"    , "\:\n"      , strlen( body ) );
  ( body, ) = strreplace( body, "\:\n"      , "\:\¡\¡"    , strlen( body ) );
  % Le righe vuote vengono lasciate tali e quali
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( body, ) = strreplace( body, "\n\n\n\n\n", "\¡\¡\¡\¡\¡", strlen( body ) );
  ( body, ) = strreplace( body, "\n\n\n\n"  , "\¡\¡\¡\¡"  , strlen( body ) );
  ( body, ) = strreplace( body, "\n\n\n"    , "\¡\¡\¡"    , strlen( body ) );
  ( body, ) = strreplace( body, "\n\n"      , "\¡\¡"      , strlen( body ) );
% Tranne questa... perche' l'ho commentata? boh...
% ( body, ) = strreplace( body, "\n \n"     , "\¡\¡"      , strlen( body ) );
  % Sostituisce tutti i `newline' rimanenti con il carattere `spazio'
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( body, ) = strreplace( body, "\n", " ", strlen( body ) );
  % Ripristina tutti i `newline'...
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( body, ) = strreplace( body, "\¡", "\n", strlen( body ) );
%_____________________________________________________________________
% Giustificazione dell'Articolo: Primo Passaggio
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%_____________________________________________________________________
  body = GiustificaArticolo( body );
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  % Elimina le righe quotate vuote
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( body, ) = strreplace( body, "\n\>\>\>\>\> \n", "\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\n\>\>\>\>\>\n" , "\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\n\>\>\>\> \n"  , "\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\n\>\>\>\>\n"   , "\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\n\>\>\> \n"    , "\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\n\>\>\>\n"     , "\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\n\>\> \n"      , "\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\n\>\>\n"       , "\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\n\> \n"        , "\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\n\>\n"         , "\n\n", strlen( body ) );
  % Crea Inizio Paragrafo e ri-Giustifica
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( body, ) = strreplace( body, "\n\n\n\n\n", "\n\n\n\n\n  ", strlen( body ) );
  ( body, ) = strreplace( body, "\n\n\n\n"  , "\n\n\n\n  "  , strlen( body ) );
  ( body, ) = strreplace( body, "\n\n\n"    , "\n\n\n  "    , strlen( body ) );
  ( body, ) = strreplace( body, "\n\n"      , "\n\n  "      , strlen( body ) );
  % Il quoting e` meglio lasciarlo pero` a inizio riga
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( body, ) = strreplace( body, "\n  \>"    , "\n\>"        , strlen( body ) );
%_____________________________________________________________________
% Giustificazione dell'Articolo: Secondo Passaggio
%_____________________________________________________________________
  body = GiustificaArticolo( body );
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  % Elimina righe non necessarie
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( body, ) = strreplace( body, "\n\n\n\n\n", "\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\n\n\n\n"  , "\n\n", strlen( body ) );
  ( body, ) = strreplace( body, "\n\n\n"    , "\n\n", strlen( body ) );
 
  % Ri-unisce l'header al body
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  if( i >= 1 )
  {
    header = strjoin ( header, "\n" );
    article = strcat ( header, body );
    if( j >= 1 )
    {
      article = strcat ( article, tagline );
    }
  }
  % Un ulteriore controllino... (non si sa mai...)
  %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ( article, ) = strreplace( article, "\n\n\n\n\n","\n\n", strlen( article ) );
  ( article, ) = strreplace( article, "\n\n\n\n"  ,"\n\n", strlen( article ) );
  ( article, ) = strreplace( article, "\n\n\n"    ,"\n\n", strlen( article ) );
 
%_____________________________________________________________________
% Sostituisce l'articolo con le modifiche effettuate
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   replace_article ( article );
}
%_____________________________________________________________________
% Definizione tasto `opinabile'... a me va bene cosi`...
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
definekey ( "FiltraArticolo", "^k", "article" );
______________________________________________________________________
*** Script End ***
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- 
Cio` che ho scritto, ho scritto.

   ( art1, ) = strreplace( art1, " sè"  , " sé"  , strlen( art1 ) );


  ( art1, ) = strreplace( art1, "oichè", "oiché", strlen( art1 ) );
Puoi semplificare sostituendo tutti i "chè" con "ché" (e l'hai fatto
qualche riga dopo, visto ora).
Ciao, Alessio.
-- 
Guide e manuali su Agent: 
http://www.sleepers.it
FAQ di ICS.newsreader: 
http://wiki.news.nic.it/IcsnFaq
Materiale in italiano per Agent: 
http://web.tiscali.it/agentit

 %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[...]
... se ho ben capito a questa riga andrebbe tolto il simbolo di commento
(%) per associare il filtro a Ctrl+f, o sbaglio?. Mi spieghi, ancora, in
che directory va posizionato il file con lo script (permessi a+x, vero?)
Grazie e scusa la banalità delle domande.
L. 
-- 
    /|                   L i n o G e
  \'o.O'  "Io ho vissuto a lungo, migliaia di anni, ma
  =(___)= non sono un dio e nemmeno uno degli immortali."
     U                                          s. kinG

a cosa corrispondono (funzione inversa)?
Trovato, basta usare la Mappa caratteri di W2000 o XP (ho appena fatto
un upgrade di OS sia a casa che in ufficio).
\x86 è una croce:
   |
---|---


 ====================================================================
  Al lancio di slrn, verra` letto .slrnrc e alla fine verra` elaborato
anche il file "News/Macro/FormatArticle.sl"
  Questo significa che lo script puoi metterlo dove ti pare, basta che
ne specifichi il corretto percorso nel file .slrnrc.
  Come  dicevo,  ci sono  ancora  alcune  `cosette' da  sistemare.  Mi
riservo  ancora  un  po'  di  tempo   per  i  vari  test,  poi  magari
faro`  un'annuncio  per  una  versione  migliore...  Magari  lo  mando
direttamente vie  e-mail agli  interessati, senza ripostare  lo script
nel NewsGroup...
  Un saluto.
