37 lines
1.2 KiB
Text
37 lines
1.2 KiB
Text
fcn formatText(text, // text can be String,Data,File, -->Data
|
|
length=72, calcIndents=True){
|
|
sink:=Data();
|
|
getIndents:='wrap(w){ // look at first two lines to indent paragraph
|
|
reg lines=L(), len=0, prefix="", one=True;
|
|
do(2){
|
|
if(w._next()){
|
|
lines.append(line:=w.value);
|
|
word:=line.split(Void,1)[0,1]; // get first word, if line !blank
|
|
if(word){
|
|
p:=line[0,line.find(word[0]]);
|
|
if(one){ sink.write(p); len=p.len(); one=False; }
|
|
else prefix=p;
|
|
}
|
|
}
|
|
}
|
|
w.push(lines.xplode()); // put first two lines back to be formated
|
|
return(len,prefix);
|
|
};
|
|
|
|
reg len=0, prefix="", w=text.walker(1); // lines
|
|
if(calcIndents) len,prefix=getIndents(w);
|
|
foreach line in (w){
|
|
if(not line.strip()){ // blank line
|
|
sink.write("\n",line); // blank line redux
|
|
if(calcIndents) len,prefix=getIndents(w);
|
|
else len=0; // restart formating
|
|
}else
|
|
len=line.split().reduce('wrap(len,word){
|
|
n:=word.len();
|
|
if(len==0) { sink.write(word); return(n); }
|
|
nn:=n+1+len; if(nn<=length) { sink.write(" ",word); return(nn); }
|
|
sink.write("\n",prefix,word); return(prefix.len()+word.len());
|
|
},len);
|
|
}
|
|
sink
|
|
}
|