Newsgroup: it.comp.software.newsreader
Titolo: [HAMSTER][Lungo] Ancora sullo script per giustificare il testo

   (e   sono
disponibile per ulteriori chiarimenti, ovvio).
Per sfruttare anche la funzione per  il  trattamento  in  uscita  dei
prefissi  di  risposta, si modifichi  la  chiamata a tomas, nel testo
dello script, secondo quanto indicato al punto 3b):
da
tomas("","","","") 
a
tomas("","","3","") 
Un ultima cosa: lo script puň essere ampliato. Quando un articolo  in
uscita  č  caricato  in  una  lista, ed č pronto per essere trattato,
conviene  farci  tutto  quello  che  si  vuole  (magari   aggiungere,
togliere,  modificare  alcuni header), prima di salvarlo di nuovo (da
dove  credete  che  arrivi  il  "%ghost"  nei  miei  messageID,   per
esempio?). Ma qui lascio spazio alle necessitŕ di ciascuno.
Ecco, di seguito, lo script:
#!hs2
#!load hamster.hsm
#!load hmessage.hsm
#########################################################
#### I caratteri ascii 204, 205 e 206 sono riservati ####
#### al   corretto   funzionamento   dello   script: ####
#### non devono comparire nel testo da giustificare. ####
#########################################################
HamRequireVersion("1.3.23.4",True)
tomas("","","","") #### Chiamata alla procedura Tomas (Treatment of_
                        Outgoing Messages and ArticleS)
                   #### I parametri possibili sono:
                   #### $path -> percordo della cartella in cui
                   #### cercare i file da giustificare;
                   #### $ext -> estensione dei file da caricare;
                   #### $actions -> azioni da intraprendere,_
                   #### secondo la legenda;
                   #### $targetline -> lunghezza della riga
                   #### giustificata.
                   #### Il default č che NON siano impostati qui.
		#############################################
		# Legenda $actions:                         #
		# ----------------                          #
		# 1 -> RE_outgoing                          #
		# 2 -> giustifica                           #
		# 3 -> giustifica & RE_outgoing             #
		#############################################
 
quit
Sub tomas($path,$ext,$actions,$targetlen)
#############################################
# Legenda $actions:                         #
# ----------------                          #
# 1 -> RE_outgoing                          #
# 2 -> giustifica                           #
# 3 -> giustifica & RE_outgoing             #
#############################################
    if($actions="")
	$actions="2"
    else
	if(!RE_match($actions,"^[1-3]$"))
		warning("Azioni invalide! Script_
		 interrotto.")
		quit
	endif
    endif
    $actions=int($actions)
    if($actions>=2)
	if($targetlen="")
		$targetlen=linelen
	else
		if(!RE_match($targetlen,"^0*[1-9]\d{1,2}$"))
			warning("Lunghezza target invalida_
			 o non consentita! Script interrotto.")
			quit
		else
			$targetlen=int($targetlen)
		endif
	endif
	if($ext="")
		$ext="msg"
	else
 
	endif
    endif
 
	if($path="")
		work_in_dir(HamNewsOutPath,$ext,$actions,$targetlen)
		work_in_dir(HamMailsOutPath,$ext,$actions,$targetlen)
	else		
		if(direxists($path))
			$path=RE_extract($path,".*[^\\]")+"\"
			work_in_dir($path,$ext,$actions,$targetlen)
		else
			Warning("Percorso inesistente!_
			 Script interrotto.")
			quit
		endif
	endif
endsub
Sub linelen #### Impostazione della lunghezza-obiettivo
var($ok,$targetlen)
	#### Leggi la lunghezza da hscripts.ini
	$targetlen=IniRead("","giustifica","targetlen","") 
	if($targetlen<>RE_Extract($targetlen, "^\d+" ))
		$targetlen=""
	endif	
	$targetlen=eval($targetlen)
	if($targetlen=0) #### Se la lunghezza č zero
	   repeat
	      $targetlen =_
	       InputBox("Lunghezza riga giustificata_
	        ( >= quella impostata nel newsreader,_
	         e compresa fra 40 e 75)?",_
	           "Inserisci lunghezza riga giustificata",_
		     "69", $ok) #### domandala
	      if($targetlen<>RE_Extract($targetlen,"^\d+"))
		   $targetlen=""
	      endif
	      $targetlen=eval($targetlen)
	   until(($ok=1)&&($targetlen>39)&&($targetlen<76))
	   IniWrite("","giustifica","targetlen",_
	    $targetlen) #### e salvala in hscripts.ini	
	endif
return($targetlen)
endsub
Sub work_in_dir($path,$ext,$actions,$targetlen) #### Procedura di_
 carico
var( $files, $files_num, $indice, $message, $nomefile, $a1, $a2 )
	$files = Listalloc(0,0)
	ListFiles($files,$path+"*."+$ext,true)
	$files_num = listcount( $files )
	$indice = 0
	$message = Listalloc(0,0)
	while( $indice < $files_num )
		Listclear( $message )
		$nomefile = listget( $files, $indice )
		ListLoad( $message, $nomefile )
 
		if($actions<>2)
			RE_outgoing($message)
		endif
		if($actions>=2)
			giustifica($message,$targetlen)
		endif
 
		ListSave( $message, $nomefile )
		inc($indice)
	endwhile
	Listfree($message)	
	Listfree( $files )
endsub
Sub giustifica(*$message,$targetlen) #### Inizio procedura di_
 giustificazione
var( $inizio_corpo, $fine_corpo, $riga, $lunghezza, $stringa,_
 $bianchi, $spazi, $cerca, $limitatore, $inizio, $contenuto,_
  $fra_virgolette, $fra_virgolette_mod, $incipit,_
   $lunghezza_incipit, $a1, $a2 )
varset($flag, false)
$contenuto=MsgGetHeader($message,"Content-Type:") 
#### procedi solo su testo semplice
if(($contenuto="")||(RE_match($contenuto,"text/plain")_
 &&!RE_match($contenuto,"UTF"))) 
 $inizio_corpo = ListIndexOf($message,"") + 1
 $fine_corpo = listcount($message) - 1
 
 #### escludi firma
 $limitatore=ListIndexOf($message, "-- " )
 if(($limitatore>$inizio_corpo)&&($limitatore<=$fine_corpo))
  $fine_corpo=$limitatore - 1 
 endif
 
 #### Per ogni riga da trattare:
 for($riga, $inizio_corpo, $fine_corpo)
 
 
  #### elimina spazi finali
  $stringa=RE_extract(ListGet($message,$riga),".*\S")
 
  #### procedi solo se la riga non introduce uuencode
  if(!RE_match($stringa, "^begin \d+ \S+"))
 
   $inizio=ord($stringa)
 
   #### scarta righe secondo il criterio dei caratteri
   if(($inizio=62)||($inizio=124)||($inizio=63)||($inizio=35)_
    ||RE_match($stringa,"\t|^\s{5,}"))
    # do nothing
   #### altrimenti procedi
   else
    $lunghezza=len($stringa)
    #### procedi solo sulle righe di lunghezza OK
    if(($lunghezza+5>$targetlen)||(($riga<>$fine_corpo)_
     &&(len(trim(ListGet($message,$riga+1)))>3)&&_
      ($lunghezza+11>$targetlen))||(($lunghezza+21>$targetlen)_
       &&(!RE_match($stringa,_
 "[.:;!?](\s*([.;:8?]-?[(){}[\]oOPpD<>/|\\]+)|(_\(?[^+oO\-]\)?))?$"))))
 
     #### procedi solo se ci sono blank interni
     if(RE_match(trim($stringa), " ")) 
      #### preserva incipit (se particolare) 
      $incipit=RE_extract($stringa,_
 "^\s*(((\d{0,2}[a-zA-Z]?|[a-zA-Z]{1}\d?)\))|[-+*]{1,3})?\s+")
      $lunghezza_incipit=len($incipit)
      if($lunghezza_incipit<>0)
       $stringa=segnaposto($lunghezza_incipit,chr(205))+_
        delete($stringa,1,$lunghezza_incipit)
      endif
      $cerca=""".*?"""
      #### salvaguarda quanto virgolettetato
      repeat
 
       #### estrapola le porzioni, una per una
       $fra_virgolette=RE_extract($stringa,$cerca)
       #### crea una copia d'appoggio
       $fra_virgolette_mod=$fra_virgolette 
       #### modifica la copia
       $fra_virgolette_mod=replace(replace($fra_virgolette_mod," ",_
        chr(204),true),"""",chr(206),true) 
       #### sostituisci temporaneamente l'originale
       $stringa=replace($stringa,$fra_virgolette,$fra_virgolette_mod)
      until($fra_virgolette="")
 
      #### procedi solo se ci sono ancora blank interni
      if(RE_match(trim($stringa)," "))
 
       #### procedi a righe alterne
       if($flag = true)
        #### inverti: da "ab c def" a "fed c ba"
        inverti_stringa($stringa)
       endif
       #### determina il numero di spazi bianchi da aggiungere		
       $spazi=$targetlen - $lunghezza 
       $bianchi=""
       #### ciclo di ricerca intervalli bianchi ####
       while($spazi>0)
        #### dimensionamento progressivo dell'intervallo di lavoro
        $bianchi=$bianchi+" "
        $cerca="(?<=\S)"+$bianchi+"(?=\S)"
        #### ciclo di allungamento degli intervalli bianchi        
        repeat
         RE_Split($stringa, $cerca, $a1, $a2)
         if($a2<>"")
          $stringa=$a1+$bianchi+" "+$a2
          $spazi=$spazi-1
         endif
        until(($spazi=0)||($a2=""))
       endwhile	#### ora la riga č giustificata
      endif
      #### ripristino delle righe invertite	
      if($flag = true)
       inverti_stringa($stringa)
      endif
      #### ripristino dell'incipit
      $stringa=$incipit+trim($stringa, chr(205))
      #### ripristino del testo temporaneamente sostituito
      $stringa=replace(replace($stringa,chr(204)," ",true),_
       chr(206),"""",true)
      #### salvataggio riga giustificata
      ListSet($message, $riga, $stringa)
      #### cambio di flag
      $flag=!$flag
     endif
    endif
   endif
  else
   $riga=$fine_corpo + 1 #### esclusione uuencode
  endif
 endfor
endif
endsub
Sub RE_outgoing(*$articolo)
var($original_sbj,$ref,$numero,$gruppo,$riferito,$hdl_gruppo,_
 $a1, $a2)
if(RE_match(msggetheader($articolo, "Subject:"),_
 "^(=\?[^?]+\?Q\?)?Re:"))
 
	$ref=msggetheader($articolo,_
	 "In-Reply-To:")
	if($ref="")
		$ref=RE_Extract(msggetheader($articolo,_
	 	 "References:"), "<[^<>]+>(?=[^<>]*$)")
	endif
 
	if(Hamartlocatemid($ref, $gruppo,$numero)=0)
		$hdl_gruppo=hamgroupopen($gruppo)
		$riferito=listalloc
		listsettext($riferito,_
		 hamarttext($hdl_gruppo,$numero))
		$original_sbj=msggetheader($riferito,_
		 "X-Original-Subject:")
		listfree($riferito)
		hamgroupclose($hdl_gruppo)
		if($original_sbj<>"")
			if(RE_match($original_sbj,_
			 "^(=\?[^?]+\?Q\?)?Re:"))
				Msgsetheader($articolo,_
				 "Subject:", $original_sbj)
			else
			if(ord($original_sbj)=61)
				$a1=RE_Extract($original_sbj,_
			 	 "^=\?[^?]+\?Q\?(R(e)?:_)+")
				$a2=RE_Extract($a1,"(R(e)?:_)+")
				Msgsetheader($articolo,_
				 "Subject:",_
				  replace($original_sbj,$a1,_
				   replace($a1,$a2,"Re:_"+$a2)))
			else
				Msgsetheader($articolo,_
				 "Subject:", "Re: "_
				   +$original_sbj)
			endif
				#### avvertimento R: ####
		varset($insert,listindexof($articolo,"")+1)
		if(!RE_match(listget($articolo,$insert),_
		 "(?-i)_ATTENZIONE_!!!"))				
			listinsert($articolo,$insert,_
		 "_ATTENZIONE_!!!")
			listinsert($articolo,$insert+1,"Il_
		 tuo programma utilizza un prefisso di_
		  risposta non standard.")
			listinsert($articolo,$insert+2,_
		 "(""R: "" al posto di ""Re: ""). Per_
		  cortesia, risolvi il problema.")
			listinsert($articolo,$insert+3,_
		 "Maggiori informazioni qui:_
 
www.vene.ws/mail/r-out.asp
 - Grazie.")
			listinsert($articolo,$insert+4)
			listinsert($articolo,$insert+5)
		endif
				#### fine avvertimento R: ####
			endif
		endif
	endif
endif
endsub
Sub inverti_stringa(*$stringa)
var($lunghezza_stringa, $idx, $stringa_invertita)  
	$stringa_invertita=""
	$lunghezza_stringa=len($stringa)
	for($idx, $lunghezza_stringa, 1, -1)
		$stringa_invertita = $stringa_invertita +_
                 copy($stringa, $idx, 1)
	endfor
	$stringa = $stringa_invertita
endsub
Sub segnaposto($numero, $modello)
var($idx,$segnaposto)
	$segnaposto=""
	for($idx,1,$numero)
		$segnaposto=$segnaposto+$modello
	endfor
return($segnaposto)
endsub
-- 
Informazioni su it.*: 
http://www.news.nic.it/news-it/faq.html
Archivio news: 
http://groups.google.com/advanced_group_search?hl=it
Linee guida della netiquette: 
http://www.faqs.org/rfcs/rfc1855.html
*PLEASE* visit: 
www.aspenleaf.com/distributed/distrib-projects.html

Lines: 666
Ulp!


> Ulp!
Scusa l'ignoranza, cosa significa?
-- 
Marco (19, 150+, NA) VW Golf TDI - GTI (
marco_go...@despammed.com
)
BBS RXII 17", Distanziali, Tar-Ox, Bilstein+H&R -40mm, filtro aria K&N
Sound by /////Alpine, Tec and JL -- Powered by Phoenix Gold and Steg
Gilera Runner 50SP Kat  and  CBR 600F   ogni tanto driver :-D

Scusa l'ignoranza, cosa significa?
666  è  il numero della Bestia. Ehm... mai visto un film dell'orrore?
Cfr. Apocalisse 13:
16Faceva sì che tutti, piccoli e grandi, ricchi e  poveri,  liberi  e
schiavi  ricevessero un marchio sulla mano destra e sulla fronte; 17e
che nessuno potesse comprare o  vendere  senza  avere  tale  marchio,
cioè  il  nome  della  bestia  o il numero del suo nome. 18Qui sta la
sapienza. Chi ha intelligenza calcoli il numero  della  bestia:  essa
rappresenta un nome d'uomo. E tal cifra è seicentosessantasei.
<parodia>
e  che  nessuno  potesse  leggere o postare senza avere tale marchio:
solo gli articoli giustificati erano permessi.
</parodia> ;-)))))


 solo gli articoli giustificati erano permessi.
anch'io voglio il testo giustificato!!! :°( 
-- 
http://werted.cjb.net

[X-Post to another: 1 group(s)]
Ghost scopri' di avere strani poteri il Sat, 1 Jun 2002 15:06:59 +0200
quando alzo' la sua spada al cielo e disse:
| L'ottimo  Alessio  (Sleepers)  mi  ha  chiesto  di  postare  l'ultima
| versione del  mio  script,  quello  che  giustifica  il  testo  degli
| articoli/messaggi  in  uscita
[cut]
molto carino! lo sto usando, ma ci ho messo delle piccole modifiche per
aggiustarmelo come mi era piu' comodo ^_^
ho fatto in modo tale che lo script venga chiamato solo sul post che
viene inviato su hamster e non ogni volta su tutti i post nella
cartella... anche se innocuo, mi pare inutile. utilizzando gli
automatismi poi lo script viene chiamato quando il post arriva su
hamster dal client, non quando sta per essere inviato, cosi' per me e'
piu' veloce poi l'upload una volta connesso ^_^
anzitutto ho messo tutto in un modulo: e' piu' elegante!
poi non utilizzo il file ini per memorizzare la lunghezza della riga, ma
lo metto come variabile globale del modulo... mi pare inutile usare un
file ini...
nel modulo ho creato questa funzione
Sub giustificaPost($filePost)
	var($msg, $modified)
	if(!FileExists($filePost))
		return (false)
	endif
	$msg = ListAlloc
	ListLoad($msg, $filePost)
	$modified = giustifica($msg)
	if($modified)
		ListSave($msg, $filePost)
	endif
	ListFree($msg)
	return ($modified)
endsub
poi ho creto uno script Giustifica.hsc con questo contenuto:
#!hs2
#!load Giustifica.hsm
if (ParamCount == 2)
	giustificaPost(ParamStr(2))
endif
quit
poi in automatismi ho messo per posta uscente, news uscenti e gateway
mail2news il caricamento dello script.
nella funzione giustifica ho introdotto una semplice variabile che tiene
lo stato del messaggio, se e' modificato o meno, cosi' evito di salvare
il file se non viene modificato dallo script e questa variabile viene
restituita da giustifica.
ah, nella parte per non variare la firma ho aggiunto che deve
controllare, oltre a "-- " anche "--=20"
ehi, mi spieghi come faccio se non voglio giustificare una parte del
messaggio? c'e' un marcatore di inizio-fine non-modifica?
per adesso ho messo un controllo su un header: se e' settato, come in
questa mail, allora non giustifica (dato che c'e' del codice...)
ho postato questo sperando possa essere utile a qualcuno. se non e'
chiaro, sono pronto a chiarire!
lo script che uso per i post in uscita e' piu' complesso, e sistema
altre cose, come scrivere follow-up all'inizio del post se c'e' il
follow-up, oppure togliere degli header inutili o inserirne altri,
ecc. se volete lo posto ^^
-- 
"Conviene comportarsi nel modo più semplice, specie quando
 si ha la reputazione d'essere una persona molto astuta"
   \            |                 |  |          |
  _ \    \   _` |  _|-_)\ \  \ /  __ |  _` |  _||  _` |   \ andrew.harlan
_/  _\_| _|\__,_|_|\___| \_/\_/  _| _|\__,_|_| _|\__,_|_| _| @
infinito.it