Newsgroup: it.comp.www.asp
Titolo: spezzare lunghi testi

Salve,
ho un problemino che potrebbe sembrare tutto somamto banale ma che non 
riesco a risolvere in maniera sodisfaciente.
Ho un lungo testo, che vado a leggere da un file txt esterno e che ho la 
necessità di presentare spezzato in varie parti di lunghezza data, 
appunto perche' intero sarebbe troppo esteso per una singola pagina.
Pensavo di sfruttare la funzione Mid e prendere il pezzo che mi 
interessa definita la lunghezza massima di ogni singolo blocco, ma mi 
sono accorto che in questo modo verrebbe interrotto in una posizione non 
meglio definita, addirittura spezzando una parola nel peggiore dei casi.
Qualcuno mi sa consigliare uno scriptino in modo che cada 
approssimativamente su un invio a capo per esempio ?
grazie e ciao,
daniele

 ha scritto nel messaggio
news:MPG.146c1d832...@News.CIS.DFN.DE...

Ti posso dare un suggerimento, che poi dovrai approfondire tu (e non mi
dispiacerebbe se poi lo pubbicassi sul NG o comunque lo rendessi pubblico):
Fissa la lunghezza a x dove x e' una costante, magari inserita in una
variabile di applicazione, mettiamo che sia = 400.
Poi devi andare a leggere il carattere 400, se e' uno spazio tutto ok,
altrimenti ridefinisci a livello di ciclo la variabile che contenteva il
valore 400 a 399 e controlli se e' uno spazio, poi 398, 397 ecc, finche' non
trovi lo spazio, mettiamo che lo trovi a 397.
Adesso, la variabile di ciclo vale 397 quindi il nuovo pezzo da tagliare
sara' compreso tra variabile di ciclo+1 e (variabile di
ciclo+application(x)).
Effettua sempre un controllo sulla lunghezza del pezzo successivo:
mid funziona con: mid(stringa,posIniziale,posFinale) se
posFinale>len(stringa) potrebbe essere seccante (non mi ricordo se da errore
o no).
Per sapere quanti cicli fare dividi la len(stringa) per application(x) e
arrotonda per eccesso.
Una volta scritto il codice posso darti una mano per il debug se pubblichi
il codice sul NG.
Ciao
Nettuno

 approssimativamente su un invio a capo per esempio ?
Io farei così:
min = lunghezza massima testo da estrapolare
car = carattere per divisione (es. invio chr(13))
temp = testo dove cercare
n = instr(temp, car)
do while temp <> ""
    do while n < min and
        n = instr(temp, car)
    Loop
    response.write mid(temp, n)
    temp = left(temp, n)
Loop
non so se funzia xchè lo buttato giù in 2 secondi senza pensarci molto, cmq
l'idea è quella di cercare il primo invio, vedere se la posizione è maggiore
del minimo richiesto e se è vero fare il mid, altrimenti continuare.
ciao
--
Kappa
kappa**nospam**@
webngo.net
www.webngo.net

 Loop
n = il primo punto in cui si trova il carattere per la "divisione" partendo
da sinistra.
Allora, alla luce di quanto detto nel mio post si potrebbe processare il
testo 2 volte: la prima volta si mettono dentro i caratteri di
formattazione, poi si fa il "trova e sostituisci".
ad esempio:
dim stringa
stringa = "Quel ramo del lago di como che volge a mezzogiorno...e vissero
tutti feici e contenti"
Stringa contiene un testo di "un di quei capi un po' pericolisi, tal Sandro,
autor d'un romanzetto in cui si narra di promessi sposi"
Il problema e' adunque, di dividere la stringa in n parti di circa 400
caratteri ognuno (400 e' arbitrario, potrebbero essere 3174 o 103 fa lo
stesso).
quindi segue la costante col numero dei caratteri
dim strBlockLenght
strBlockLenght=400
e poi va creata una funzione che si metta a individuare gli spazi in
prossimita' del 400esimo carattere.
Al posto di quello spazio particolare va messo un carattere speciale come §
per esempio.
Carattere che poi provvedera' la funzione di cui sopra a trasformare in
blocchi di testo.
Per individuare il primo spazio in prossimita' del "strBlockLenght esimo"
carattere:
Dim strBlock
Dim testoRimanente
strBlock = left(stringa,strBlockLenght)
testoRimanente = mid(stringa,strBlockLenght+1,len(stringa))
adesso per trovare la posizione del primo spazio dopo il strBlockLenght
esimo carattere basta:
dim PosizionePrimoSpazio
PosizionePrimoSpazio = Instr(testoRimanente," ")
e qunidi per conoscere la posizione relativa del primo spazio rispetto
all'inizio della stringa:
PosizionePrimoSpazio=PosizionePrimoSpazio+strBlockLenght
e il primo blocco di testo diventa:
strBlock=left(stringa,PosizionePrimoSpazio)
Adesso puoi anche decidere di mettere in quella posizione un § per dire di
cambiare pagina, ma mentre scrivo mi e' venuta quest'idea (malsana):
se mettessi ogni strBlock in un array di sessione, dopo, non dovresti far
altro che scrivere:
(nel global.asa)
dim maxPagine
maxPagine=1000
ReDim arrayPagine(maxPagine)
session("pagine")=arrayPagine
(in visualizzazione)
dim pagineMie
pagineMie=session("pagine")
response.write pagineMie(n)
dove n e' il numero della pagina.
Essendo un array dinamico non dovresti avere problei se dovessi aggiungere
il 1001 esimo elemento.
Ciau Ciau
Nettuno
PS: sembra divertente, che ci devi fare?

 PS: sembra divertente, che ci devi fare?
Devo presentare in fase di visualizzazione degli articoli tecnici molto 
lunghi (per un portale su diritto e giurisprudenza) che spesso 
raggiungono le 15/20 cartelle ;o
ciao e grazie mille ancora,
appena finisco questa soluzione ibrida ( segno § + divisione a lunghezza 
fissa) posto il codice.
daniele

meglio definita, addirittura spezzando una parola nel peggiore dei casi.
Ciao,
se vuoi avere già qualcosa di fatto prova a guardare i seguenti articoli:
http://aspfree.com/authors/Luke_Latimer/parsetext.asp
http://www.aspwatch.com/c/200022/d04478D5F3D2011D4AEDF00A0C9E95208.asp
Il link del secondo articolo l'ho preso direttamente dal file html salvato.
Credo che sia giusto altrimenti vai sul sito 
www.aspwarch.com
 e cerca nella
apposita sezione la parola Wordwrap, Parse Text e simili.
A presto,
corradoLE...@tiscalinet.it
[Rimuovere LEVA]
http://members.websamba.com/Message-Board
ICQ 7044062
Como - Italy