Code: Select all
; AltFont
; A simple program to do elementary RTF-like modifications
; to plain text.
;
; FontIdx --------->[ 1 ] [ 2 ] [ 3 ] [ 4 ]
Global FontList$ = "Arial.Courier New.Comic Sans MS.Segoe Script."
Global ColorList$ = "blu.16711680.grn.65280.red.255.cya.16776960.gray.8421504.wht.16777215.yel.65535.blk.0."
ColorList$ + "dgrn.$336633.dred.$3300CC.dblu.$cc6600.lgra.$eeeeee."
; Dark Grn | Dark Red | Dark Blue | Light Gray etc.
; ===========================================================================
; Defaults
Global D_FntIdx = 1 ; <----- DEFAULT FONT from FontList$
Global D_FontName$ = StringField(FontList$, D_FntIdx, ".")
Global D_FontSize = 11
Global D_FontStyle = 0
Global D_FGColor = $000000 ; or $0
Global D_BGColor = $ffffff
Global afd.s = "\" ; Alt Font Demark. Changeable if conflict.
Global EdBox, Win_mb, Ed_Width, Ed_Height
Declare.s GetFontVars(m$)
Declare SetFontMods()
Declare WinMgr()
Structure AT
TStart.i ; Chr location of first letter of text block to be modified
TEnd.i ; Chr location of last letter
TFont.i ; Font Index
TSize.i ; Size in points
TStyle.i ; Font Style, i,b,u
FColor.i ; Font color, if any.
BColor.i ; Back color
EndStructure
Global NewList AltFont.AT() ; List of text, location, size, style, and
; color of text blocks you want to modify.
; ===========================================================================
WinWidth = 350: WinHeight = 510: RM = 10: LM = 10
Msg$ = "\Main Title\s:20.i.b.u.c:dblu/yel.\||" + ; load it all up...
"\First Heading\f:4.s:16.b.c:blu.\|" +
"\\chr:169.\In these examples, the \default\i.b.\ font is black." +
"This font is set to the EditorGadget prior to " +
"modification by these procedures." +
"You can modify this text any way you " +
"wish \so long as you complete\f:3.u.c:dred/lgra.\ " +
"each mod before you begin another.|" +
"\Keep track of all your demarks. A missing one " +
"will mess up all following text.\c:blu.\||" +
"\Some ''Latin''\f:1.s:16.i.b.c:dgrn.\|" +
"Donec dapibus tristique. Mauris" +
"tib sollicitudin \nunc nulla\u.\ urna Aenean" +
"Tincidunt ipsum nec neque Praesent|" +
"\Here's some smaller (8) text.\s:8.\||" +
"\Third Heading\f:2.b.s:16.i.d.c:dred.\|" +
"\This is a text block of all one color using " +
"Comic Sans MS with the default size but " +
"blue color.\f:3.c:blu.\ \If you want to modify\c:red.\" +
"\ this pargraph, you have to split blocks. " +
"Check out the text code for this paragraph.\f:3.c:blu.\"
Msg$ = ReplaceString(Msg$, "|", #LF$)
Msg$ = ReplaceString(Msg$, "''", Chr(34))
; ========================================================
;--- MAKE WINDOW
; =============================
WinFlag = #PB_Window_Invisible | #PB_Window_Tool|#PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_SizeGadget
Win_mb = OpenWindow(#PB_Any, 0, 0, WinWidth, WinHeight, "", WinFlag)
EdBoxFlag = #PB_Editor_WordWrap
EdBox = EditorGadget(#PB_Any, 5, 5, Ed_Width, Ed_Height, EdBoxFlag )
BindEvent(#PB_Event_SizeWindow, @WinMgr(), Win_mb)
SendMessage_(GadgetID(EdBox), #EM_SETMARGINS, #EC_LEFTMARGIN, LM|0 << 16)
SendMessage_(GadgetID(EdBox), #EM_SETMARGINS, #EC_RIGHTMARGIN, 0|RM << 16)
DefaultFontID = FontID(LoadFont(#PB_Any, D_FontName$, D_FontSize, D_FontStyle))
SetGadgetFont(EdBox, DefaultFontID)
; -----------------------------------------------------------------------------
PlainText$ = GetFontVars(Msg$) ; Get font info, strip Msg$ of font stuff.
SetGadgetText(EdBox, PlainText$) ; Set raw text to EdBox
SetFontMods() ; Modify to suit.
; -----------------------------------------------------------------------------
HideWindow(Win_mb, 0)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
; ========================================================
; =================================
;--- MAP TEXT for LOCN & FONT INFO
; =================================
Procedure.s GetFontVars(Msg$)
; For each text block...
tStart = FindString(Msg$, afd)
While tStart
FIdx = D_FntIdx: Style = D_FontStyle: Size = D_FontSize: FClr = D_FGColor: BClr = D_BGColor: ClrCalc = 0 ; Set defaults each time.
tEnd = FindString(Msg$, afd, tStart+1)
cEnd = FindString(Msg$, afd, tEnd+1)
CmdList$ = Mid(Msg$, tEnd+1, cEnd - tEnd-1)
For i = 1 To CountString(CmdList$, ".")
Cmd$ = StringField(CmdList$, i, ".") ; ea cmd
Dm = FindString(Cmd$, ":") ; cmd arg?
If Dm
CKey$ = Left(Cmd$, Dm)
CVal$ = RemoveString(Cmd$, CKey$)
CVal = Val(CVal$)
Else
CKey$ = Cmd$
EndIf
Select CKey$
Case "b": Style | #CFM_BOLD ; Styles
Case "i": Style | #CFM_ITALIC
Case "u": Style | #CFM_UNDERLINE
Case "f:": FIdx = CVal ; Font Index
Case "s:": Size = CVal ; Size
Case "c:"
Dm = FindString(CVal$, "/") ; ie. fg/bg
If Dm
FG$ = Left(CVal$, Dm-1)
BG$ = Right(CVal$, Len(CVal$)-Dm)
Else
FG$ = CVal$
EndIf
; always get fg
P1 = FindString(ColorList$, FG$)
P2 = P1 + Len(FG$)+1
P3 = FindString(ColorList$, ".", P2)
FClr = Val(Mid(ColorList$, P2, P3-P2))
If Dm ; get bg
P1 = FindString(ColorList$, BG$)
P2 = P1 + Len(BG$)+1
P3 = FindString(ColorList$, ".", P2)
BClr = Val(Mid(ColorList$, P2, P3 - P2))
EndIf
EndSelect
Next
Msg$ = RemoveString(Msg$, afd, #PB_String_NoCase, tStart, 2) ; Remove 1st two demarks
Msg$ = RemoveString(Msg$, CmdList$ + afd, #PB_String_NoCase, tStart, 1) ; Remove CmdList$ + 3rd demark.
AddElement(AltFont())
AltFont()\TStart = tStart-1 ;-1 ; because 1st afd was del.
AltFont()\TEnd = tEnd-2 ; ... and so is the 2nd.
AltFont()\TFont = FIdx
AltFont()\TSize = Size
AltFont()\TStyle = Style
AltFont()\FColor = FClr
AltFont()\BColor = BClr
tStart = FindString(Msg$, afd, tEnd-1) ; Go get the next one.
Wend
ProcedureReturn Msg$ ; Msg$ clear of all dmks and cmds
EndProcedure
; =============================
;--- INSERT FONT MODS
; =============================
Procedure SetFontMods ()
If ListSize(AltFont())
#CFM_BACKCOLOR = $4000000
chr.charformat2\cbSize = SizeOf(CHARFORMAT2)
sel.CHARRANGE
ForEach AltFont() ;...Block of text
; ---- SET TEXT SELECTION ---------------
SendMessage_(GadgetID(EdBox),#EM_SETSEL, AltFont()\TStart, AltFont()\TEnd)
chr.CHARFORMAT2
chr\cbSize = SizeOf(CHARFORMAT2)
; ---- FONT ------------------------------
FontName$ = StringField(FontList$, AltFont()\TFont, ".")
chr\cbSize = SizeOf(CHARFORMAT2)
chr\dwMask = #CFM_FACE
PokeS(@chr\szFaceName, FontName$)
SendMessage_(GadgetID(EdBox), #EM_SETCHARFORMAT, #SCF_SELECTION, chr)
; ---- SIZE ------------------------------
chr\dwMask = #CFM_SIZE
chr\yHeight = AltFont()\TSize*20 ; Convert points to "twips" for EG
SendMessage_(GadgetID(EdBox), #EM_SETCHARFORMAT, #SCF_SELECTION, chr)
; ---- COLOR -----------------------------
chr\dwMask = #CFM_BACKCOLOR|#CFM_COLOR
chr\crTextColor = AltFont()\FColor
chr\crBackColor = AltFont()\BColor
SendMessage_(GadgetID(EdBox), #EM_SETCHARFORMAT, #SCF_SELECTION, chr)
; ---- STYLE -----------------------------
chr\dwMask = #CFM_ITALIC|#CFM_BOLD|#CFM_UNDERLINE ; Could also add the others.
chr\dwEffects = AltFont()\TStyle
SendMessage_(GadgetID(EdBox), #EM_SETCHARFORMAT, #SCF_SELECTION, chr)
Next
SendMessage_(GadgetID(EdBox),#EM_SETSEL,0,0) ; Clear the selection.
EndIf
EndProcedure
Procedure WinMgr()
Ed_Width = WindowWidth(Win_mb) - 10
Ed_Height = WindowHeight(Win_mb) - 10
ResizeGadget(EdBox, 5, 5, Ed_Width, Ed_Height)
SetWindowTitle(Win_mb, Str(Ed_Width) + " X " + Str(Ed_Height))
EndProcedure