Newsgroup: it.comp.software.newsreader
Titolo: [HAMSTER] Script per giustificare il testo di articoli/messaggi

[Xpost  senza  follouap,  per  creare  traffico  su  hamster.it.misc]
Tanto per far qualcosa...
Lo  script  funziona  sui messaggi di posta e sugli articoli di news:
-sui  MIME  text/plain,  ma  non  sui  multipart  (né  su altri MIME,
ovviamente);
-sui  non-MIME  (privi dell'header Content-Type:), limitatamente alla
parte di testo che eventualmente preceda il "begin ..." dell'uuencode.
Non  agisce  sulle  firme,  se  correttamente  delimitate  da  "-- ".
Una  tantum,  cioè  solo la prima volta che lo sia avvia, richiede di
immettere  la lunghezza che dovranno avere le righe giustificate, che
sarà comunque compresa fra 40 e 75. Tale lunghezza dovrebbe essere la
medesima  impostata nel mail/newsreader usato per comporrei messaggi;
può  essere superiore, ma non inferiore. Le righe che sorpassino tale
limite non saranno infatti giustificate.
Lo  script  non agisce sulle righe troppo corte. Diverso è il caso, a
seconda  che  esse  si concludano con un carattere della classe [;:.]
oppure  no:  nel  primo  caso  le  righe  devono essere lunghe almeno
obiettivo-10, nel secondo almeno obiettivo-20, essendo "obiettivo" la
lunghezza di una riga giustificata.
 
Lo  script non agisce sulle righe che comincino coi caratteri >,|,?,#
(presumibilmente  di  quoting),  oppure  comincino con almeno 5 spazi
bianchi,  oppure contengano dei TAB (a meno che non siano inutilmente
posti  a  fine riga, caso in cui verranno tagliati e sarà come non ci
fossero).
Nelle  righe  giustificate,  non  vengono  alterate le parti di testo
comprese  fra "virgolette doppie". A tal fine, non bisogna nidificare
le virgolette.
Così va bene (lo script capisce):
fuori   "dentro virg."   fuori  "dentro virg."  fuori  "dentro virg."
Così va male (lo script non capisce):
fuori    "dentro virgolette "dentro    due    volte" dentro"    fuori
La  cosa  ha  un  prezzo:  non  usate i caratteri ascii 204 e 206 nei
vostri  testi  (non  dovrebbe  essere  un  gran sacrificio: aprite il
notepad  e  verificate  pure),  o  verranno  sostituiti  da  spazi  e
virgolette.
Lo  script andrà eseguito prima di inviare gli articoli da Hamster al
server  remoto:  naturalmente potrebbe essere inglobato in un secondo
script  multifunzionale,  che  magari  automatizzi la procedura, e lo
chiami, al momento giusto, con:
runscript("giustifica" , "" , true)
Segue  lo  script.  Raccomando  di preservarne la corretta grafia (le
righe  non  devono  essere  spezzate  senza  accorgimenti,  meglio se
restano tal quali sono). Le righe sono spesso lunghe, siete avvisati.
Ho  inserito  numerosi  commenti,  per  chi volesse rendersi conto di
come funzionino le cose. Se deprecabilmente non dovessero funzionare,
fatemi  pure  un  fischio  e  vedrò...  (se  mi  date direttamente la
soluzione, è anche meglio). ;-)
Va beh, ecco qua.
-- 
Script, da copiare in giustifica.hsc
--- iniziare a copiare dalla riga qui sotto ---
#!hs2
#!load hmessage.hsm
var( $lunghezza_obiettivo, $listauscite, $uscite, $indice, $listafile,_
      $nomefile, $ok ) #### variabili globali ####
hamwaitidle
impostazione_lunghezza_obiettivo #### Chiamata alla procedura di impostazione della lunghezza di una riga giustificata ####
giustifica_nel_percorso(HamNewsOutPath) #### Chiamata alla procedura di carico, per le news ####
giustifica_nel_percorso(HamMailsOutPath) #### Chiamata alla procedura di carico, per la posta ####
quit #### Fine script ####
Sub impostazione_lunghezza_obiettivo #### Inizio procedura impostazione ####
	$lunghezza_obiettivo=IniRead("","giustifica","Lunghezza_riga_giustificata","") #### leggi la lunghezza, come stringa, da hscripts.ini ####
	if($lunghezza_obiettivo<>RE_Extract($lunghezza_obiettivo, "^\d+" )) #### se non è tutta di cifre ####
		$lunghezza_obiettivo="" #### allora che sia la stringa vuota ####
	endif	
	$lunghezza_obiettivo=eval($lunghezza_obiettivo) #### trasforma la stringa in numero ####
	if($lunghezza_obiettivo=0) #### se la lunghezza è zero ####
		repeat
			$lunghezza_obiettivo =_
			 InputBox("Lunghezza riga giustificata ( >= quella impostata nel newsreader, e compresa fra 40 e 75)?",_
		 	  "Inserisci lunghezza riga giustificata", "69", $ok) #### domandala, come stringa, in finestra pop-up ####
			if($lunghezza_obiettivo<>RE_Extract($lunghezza_obiettivo, "^\d+" )) #### se non è tutta di cifre ####
				$lunghezza_obiettivo="" #### allora che sia la stringa vuota ####
			endif
			$lunghezza_obiettivo=eval($lunghezza_obiettivo) #### trasforma la stringa in numero ####
		until(($ok=1)&&($lunghezza_obiettivo>39)&&($lunghezza_obiettivo<76)) #### controllane il valore, altrimenti ripeti il ciclo ####
		IniWrite("","giustifica","Lunghezza_riga_giustificata",$lunghezza_obiettivo) #### e salva la lunghezza in hscripts.ini ####	
	endif
	#### La lunghezza viene salvata nel file hscripts.ini (automaticamente creato, se necessario) ####
	#### sotto la sezione [giustifica] (automaticamente creata, se necessario).                   ####
endsub #### Fine procedura d'impostazione della lunghezza di una riga giustificata ####
Sub giustifica_nel_percorso($percorso) #### Inizio procedura di carico ####
	$listauscite = Listalloc( 0, 0 )
	listfiles( $listauscite, $percorso + "*.msg", true ) #### carichiamo una lista coi nomi dei file degli articoli o dei messaggi ####
	$uscite = listcount( $listauscite ) #### quanti sono i file? ####
	$indice = 0
	$listafile = Listalloc( 0, 0 )
	while( $indice < $uscite ) #### uno alla volta, caricheremo i file in un'apposita lista: ogni riga del file diventerà un item della lista ####
		Listclear( $listafile )
		$nomefile = listget( $listauscite, $indice )
		ListLoad( $listafile, $nomefile ) #### caricamento del file $nomefile nella lista ####
 
		giustifica #### chiamata alla procedura di giustificazione ####
 
		listsave( $listafile, $nomefile ) #### la lista di righe giustificate viene salvata nel file d'origine, sovrascritto ####
		inc($indice)
	endwhile
	Listfree($listafile) #### liberiamo le liste precedentemente create ####	
	Listfree( $listauscite )
endsub #### fine procedura di carico ####
Sub giustifica #### inizio procedura di giustificazione ####
var( $inizio_corpo, $fine_corpo, $riga, $lunghezza, $stringa, $bianchi,_
      $spazi, $cerca, $a1, $a2, $limitatore, $inizio, $contenuto,_
       $fra_virgolette, $fra_virgolette_mod ) #### queste sono tutte variabili locali alla procedura ####
    $contenuto=MsgGetHeader($listafile,"Content-Type:") #### controllo dell'header Content-Type: #### 
    if(($contenuto="")||Re_match($contenuto,"text/plain")) #### procedi solo se il messaggio è di testo ####
	$inizio_corpo = ListIndexOf($listafile,"") + 1 #### inizio del body ####
        $fine_corpo = listcount($listafile) - 1 #### fine del body ####
 
	$limitatore=ListIndexOf($listafile, "-- " )
	if(($limitatore>$inizio_corpo)&&($limitatore<=$fine_corpo))
		$fine_corpo=$limitatore - 1 #### esclusione firma ####
	endif
 
	for($riga, $inizio_corpo, $fine_corpo) #### ciclo che esamina, una per una, ogni riga del body ####
	    $stringa=RE_extract(ListGet($listafile,$riga),".*\S") #### eliminazione spazi finali ####
	    if(!RE_match($stringa, "^begin \d+ \S+")) #### procedi solo se la riga non introduce un attach uuencode ####
		$inizio=ord($stringa)
		if(($inizio=62)||($inizio=124)||($inizio=63)||($inizio=35)||RE_match($stringa,"\t|^\s{5,}")) #### scarto righe secondo il criterio dei caratteri ####
                else #### altrimenti si procede ####
			$lunghezza=len($stringa)
			if(($lunghezza+11>$lunghezza_obiettivo)||(($lunghezza+21>$lunghezza_obiettivo)&&(!RE_match($stringa,"[.:;]$")))) #### procedi solo sulle righe di lunghezza compatibile ####
 
			    if(RE_match(trim($stringa), " ")) #### procedi solo se ci sono blank interni (altrimenti la riga ovviamente non è giustificabile) #### 
				$cerca=""".*?""" #### in soldoni, in $cerca finisce la stringa ".*?" virgolette comprese, che è la regexp che c'interessa usare ####
				repeat #### ciclo per la salvaguardia delle porzioni di stringa comprese fra virgolette (sostituzione temporanea) ####
					$fra_virgolette=RE_extract($stringa,$cerca) #### estrapoliamo le porzioni, una per una ####
					$fra_virgolette_mod=$fra_virgolette #### creiamo una copia d'appoggio ####
					$fra_virgolette_mod=replace(replace($fra_virgolette_mod," ", chr(204), true),"""", chr(206), true) #### modifichiamo la copia ####
					$stringa=replace($stringa,$fra_virgolette,$fra_virgolette_mod) #### la sostituiamo temporaneamente all'originale, nella stringa ####
				until($fra_virgolette="")
				$spazi=$lunghezza_obiettivo - $lunghezza #### determinazione del numero di spazi bianchi da aggiungere ####
				$bianchi=""
				while($spazi>0) #### ciclo di ricerca intervalli bianchi ####
					$bianchi=$bianchi+" " #### dimensionamento progressivo dell'intervallo bianco di lavoro, a crescere ####
					$cerca="(?<=\S)"+$bianchi+"(?=\S)" #### in $cerca finisce la regexp che individua gli intervalli bianchi della dimensione di lavoro ####
					repeat #### ciclo di allungamento intervalli bianchi ####
						RE_Split($stringa, $cerca, $a1, $a2) #### divisione riga in corrispondenza di un intervallo di lavoro ####
						if($a2<>"") #### se non siamo a fine riga ####
							$stringa=$a1+$bianchi+" "+$a2 #### ricomposizione riga con intervallo allungato di 1 blank ####
							$spazi=$spazi-1 #### aggiornamento del numero di spazi bianchi ancora da aggiungere ####
						endif
					until(($spazi=0)||($a2=""))
				endwhile
 
				#### ora la riga è giustificata ####
				$stringa=replace(replace($stringa,chr(204)," ",true),chr(206),"""",true) #### ripristino del testo fra virgolette ####
 
				ListSet($listafile, $riga, $stringa) #### salvataggio riga giustificata ####
			    endif
			endif
		endif
	    else
	    	$riga=$fine_corpo + 1 #### esclusione uuencode ####
	    endif
	endfor
    endif
endsub #### fine procedura di giustificazione ####

Lo  script  funziona  sui messaggi di posta e sugli articoli di news:
Accidenti! E io che ho impostato Vim come editor esterno e giustifico
semplicemente con i tasti "_j" ...  :-ppp
Comunque un buon Lavoro!
Ciao.
-- 
Antonio  @=D 

Comunque un buon Lavoro!
Ti ringrazio.

Ti ringrazio.
I ringraziamenti ancdranno a te, da parte di quelli che usano Hamster!
Ciao.
-- 
Antonio  @=D 

Ecco qua (sempre salvo errori).
 
Grave BUG: in rari casi, entrambe le versioni dello script potrebbero
entrare in un loop infinito. Il bug si risolve ripetendo un controllo
prima del core della subroutine "giustifica":
---------------------------------------------------------------------
				if(RE_match(trim($stringa), " ")) #### procedi solo se ci sono ancora blank interni (ora la condizione è anche sufficiente) ####
 
					$spazi=$lunghezza_obiettivo - $lunghezza #### determinazione del numero di spazi bianchi da aggiungere ####
					$bianchi=""
					while($spazi>0) #### ciclo di ricerca intervalli bianchi ####
						$bianchi=$bianchi+" " #### dimensionamento progressivo dell'intervallo bianco di lavoro, a crescere ####
						$cerca="(?<=\S)"+$bianchi+"(?=\S)" #### in $cerca finisce la regexp che individua gli intervalli bianchi della dimensione di lavoro ####
						repeat #### ciclo di allungamento intervalli bianchi ####
							RE_Split($stringa, $cerca, $a1, $a2) #### divisione riga in corrispondenza di un intervallo di lavoro ####
							if($a2<>"") #### se non siamo a fine riga ####
								$stringa=$a1+$bianchi+" "+$a2 #### ricomposizione riga con intervallo allungato di 1 blank ####
								$spazi=$spazi-1 #### aggiornamento del numero di spazi bianchi ancora da aggiungere ####
							endif
						until(($spazi=0)||($a2=""))
					endwhile
					#### ora la riga è giustificata ####
				endif
---------------------------------------------------------------------
Bisogna  aggiungere,  nello  script,  la  prima  e  l'ultima riga qui
indicate, ovvero l'if(...) e l'endif.
-- 
Informazioni su it.*: 
http://www.news.nic.it/news-it/faq.html
I manifesti dei gruppi: 
http://www.news.nic.it/gruppi-it.html
Linee guida della netiquette: 
http://www.faqs.org/rfcs/rfc1855.html