Word Wrap

BlitzMax Forums/BlitzMax Beginners Area/Word Wrap

Hezkore(Posted 2008) [#1]
Is there any easy way to get word wrapping?


Brucey(Posted 2008) [#2]
Other than calculating it yourself?


Warpy(Posted 2008) [#3]
SuperStrict

Function wordwrap$(txt$,linelength:Int)
	Local words$[]=txt.split(" ")
	Local out$=""
	
	Local i:Int=0
	Local thisline:Int=0
	Local word$
	
	For word$=EachIn words
	
		If thisline+Len(word)>linelength
			out:+"~n"
			thisline=0
		EndIf
		If thisline out:+" "
		out:+word
		thisline:+Len(word)
	Next
	
	Return out
End Function


Print wordwrap("Hello there, this is a very long sentence which will be wrapped to make it fit inside a certain sized box. Another sentence on the end.",20)



Hezkore(Posted 2008) [#4]
Thanks Warpy!
I changed it a bit to make fit my needs.

Function WordWrap:String(txt:String, X:Int, Y:Int, Width:Int, Height:Int)
	Local words:String[] = txt.split(" ")
	Local out:String
	Local i:Int
	Local word:String
	
	For word = EachIn words
		
		If TextWidth(Out + Word) < Width - 1 Then
			Out:+" " + Word
		Else
			Out = Trim(Out)
			DrawText(Out, x, y + i)
			i:+TextHeight(Out)
			Out = Word
		EndIf
		
		If i + TextHeight(Out) >= Height Then Return 0
	Next
	
	If Out Then DrawText(Out, x, y + i)
End Function



Hezkore(Posted 2008) [#5]
Hmm actually, there are still a few problems with this that I can't seem to solve on my own...

First of all, if the word is really long it (of course) doesn't cut it off.
If TextWidth(word) >= Width - 1 Then
	For Local N:Int = Len(word) To 0 Step - 1
		If TextWidth(Left(word, N)) < Width - 1 Then
			Print Left(word, N)
			Exit
		EndIf
	Next
End If

That detects it but I'm not sure how to insert the rest of that into the array...

Also, I need a new line character in there that forces a new line.

Any help? :3