Author Topic: Word Wrapping  (Read 1074 times)

MrTAToad

  • Guest
Word Wrapping
« on: 2011-Dec-03 »
This is a proportional font word wrapping routine that is also designed to deal with words that wont fit into the allotted size.  It will convert CHR$(10) to CHR$(13) and treat CHR$(13) as a new line.  CHR$(9) is treated as 4 spaces.

Code: GLBasic [Select]
 TYPE TWordWrap
        FUNCTION Initialise%:
                RETURN TRUE
        ENDFUNCTION

        FUNCTION Wrap%:text$,maxWidth%,store$[]
        LOCAL words$[]
        LOCAL loop$
        LOCAL curLineLength%

                IF maxWidth%<LEN("W",TRUE) THEN RETURN FALSE
                IF self.Explode(text$,words$[])=FALSE THEN RETURN FALSE

                curLineLength%=0
                FOREACH loop$ IN words$[]
                        DEBUG "Loop : "+loop$+"\n"
                        IF loop$<>""
                                IF      curLineLength%+LEN(loop$,TRUE)>maxWidth%
                                        IF curLineLength%>0
                                                curLineLength%=0
                                        ENDIF
       
                                        WHILE LEN(loop$,TRUE)>maxWidth%
                                        LOCAL temp$
                                        LOCAL l%
       
                                                l%=1
                                                WHILE LEN(LEFT$(loop$,l%)+"-",TRUE)<maxWidth% AND l%<LEN(loop$)
                                                        INC l%
                                                WEND
       
                                                DIMPUSH store$[],LEFT$(loop$,l%-1)+"-"
                                                loop$=MID$(loop$,l%)
                                        WEND
       
                                        curLineLength%=0
                                ENDIF
                        ELSE
                                curLineLength%=0
                        ENDIF
                       
                        IF curLineLength%=0
                                DIMPUSH store$[],loop$
                        ELSE
                                INC store$[-1]," "+loop$
                        ENDIF

                        IF loop$<>"" THEN INC curLineLength%,LEN(loop$+" ",TRUE)
                NEXT

                RETURN TRUE
        ENDFUNCTION

        FUNCTION Explode%:text$,store$[]
        LOCAL temp$[]
        LOCAL temp2$[]
        LOCAL loop$,loop2$
       
                DIM store$[0]
                DIM temp$[0]
               
                IF text$="" THEN RETURN FALSE

                text$=REPLACE$(REPLACE$(text$,CHR$(9),"    "),CHR$(10),CHR$(13))
               
                IF SPLITSTR(text$,temp$[],CHR$(13))>0
                        FOREACH loop$ IN temp$[]
                                DIM temp2$[0]
                                IF SPLITSTR(loop$,temp2$[]," ")>0
                                        FOREACH loop2$ IN temp2$[]
                                                DIMPUSH store$[],loop2$
                                        NEXT
                                ENDIF
                                DIMPUSH store$[],""
                        NEXT
                ENDIF
                RETURN TRUE
        ENDFUNCTION
ENDTYPE

LOCAL wordWrap AS TWordWrap
LOCAL output$[]
LOCAL fW%,fH%,y%,size%=60

        LOADFONT "Media/smalfont.png",0
        SETFONT 0
        GETFONTSIZE fW%,fH%
        y%=0
        wordWrap.Initialise()
        wordWrap.Wrap("This is a test of the word"+CHR$(13)+"wrapping routine which wraps to a given font width.  bshkbsdkhbsdkbsdvkbsdkvbkdvdkjvkbkdbkjebfjkadbfasdjkbsdjkbsdjbsdjkbsdsbdk",size%,output$[])

        DRAWRECT 0,0,size%-1,100,RGB(255,0,0)
        FOREACH loop$ IN output$[]
                PRINT loop$,0,y%,TRUE
                INC y%,fH%
        NEXT

        SHOWSCREEN
        KEYWAIT
 

[attachment deleted by admin]