Ich habe vor drei Jahren einmal ein ähnliches Projekt begonnen gehabt, aber dann nicht zu Ende geführt. Das folgende Beispielprogramm generiert einen RTF-Text (unter MacOS und Windows) und einen mit speziellen Tags versehenen Text unter Linux und erlaubt die Darstellung von fettem, kursivem und unterstrichenem Text (auch kombiniert), der unter Windows, Linux und MacOS im EditorGadget gleich dargestellt wird. Bei einer noch fehlenden Lese- und Speicherfunktion empfiehlt es sich, den Text vor der Ausgabe im EditorGadget abzuspeichern, da das EditorGadget in Linux mit dem RTF-Format nichts anfangen kann und MacOS und Windows das RTF-Format leicht unterschiedlich handhaben. Der Text vor der Ausgabe im EditorGadget kann beliebig zwischen den einzelnen Betriebssystemen ausgetauscht werden.ccode_new hat geschrieben:Der Grund des Ganzen ist:
Ich benötige für das Speichern und das Lesen ein plattformübergreifendes Format.
Und dieses Format möchte ich mir nun basteln.
Also ich möchte die formatierte Textdatei z.B. unter Linux speichern und unter Windows lesen können.
Genauso möchte ich eine formatierte Textdatei unter Windows erstellen können und unter Linux lesen können.
Ich habe das untenstehende Beispiel erfolgreich auf folgenden Betriebssystemen getestet:
- MacOS 10.6.8 (Snow Leopard) mit PB 5.44 x86 im ASCII- und Unicode-Modus und mit PB 5.60 x86
- Linux Mint 18.1 x64 Cinnamon in GTK 2 und GTK 3 mit PB 5.44 x64 im ASCII- und Unicode-Modus und mit PB 5.60 x64
- Lubuntu 16.04 x86 LXDE in GTK 2 und GTK 3 mit PB 5.44 x86 im ASCII- und Unicode-Modus und mit PB 5.60 x86
- Windows XP SP3 mit PB 5.44 x86 im ASCII- und Unicode-Modus und mit PB 5.60 x86
- Windows 7 x64 SP1 mit PB 5.44 x86 und x64 im ASCII- und Unicode-Modus und mit PB 5.60 x86 und x64
Code: Alles auswählen
EnableExplicit
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
ImportC ""
gtk_text_buffer_create_tag(*Buffer.GtkTextBuffer, TagCharacter.P-UTF8,
PropertyName.P-UTF8, PropertyValue.I, Terminator.I = 0)
EndImport
CompilerEndIf
Structure TagEntry
Character.S
AttributeName.S
StartOffset.I
EndOffset.I
EndStructure
Procedure AddTextWithAttributes(EditorGadgetID.I, AttributeText.S)
Static NewList Tag.TagEntry()
Protected Offset.I
Protected RTFTag.S
Protected TagCharacter.S
Protected TagList.S
Protected TagOffset.I
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
Static TagTable.I
Protected AttributeValue.S
Protected EndIter.GtkTextIter
Protected NewTextOffset.I
Protected StartIter.GtkTextIter
Protected *TextBuffer = gtk_text_view_get_buffer_(GadgetID(EditorGadgetID))
CompilerCase #PB_OS_MacOS
Protected AttributeString.I
Protected AttributeTextASCII.S
Protected DataObject.I
Protected TextStorage.I
CompilerCase #PB_OS_Windows
Protected AttributeTextASCII.S
CompilerEndSelect
; ----- Beim ersten Aufruf neue Tag-Tabelle anlegen und die RTF-Tags (für
; MacOS und Windows) oder die Linux-spezifischen Tags definieren
If ListSize(Tag()) = 0
Repeat
Read.S TagCharacter
If TagCharacter = ""
Break
Else
AddElement(Tag())
Tag()\Character = TagCharacter
Read.S Tag()\AttributeName
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
Read.S AttributeValue
gtk_text_buffer_create_tag(*TextBuffer, Tag()\Character,
Tag()\AttributeName, Val(AttributeValue))
CompilerEndIf
EndIf
ForEver
Else
ForEach Tag()
Tag()\StartOffset = 0
Tag()\EndOffset = 0
Next
EndIf
; ----- Alle Tags finden und in LinkedList Tag() mit Tag-Zeichen,
; Attributnamen, Start- und Stopp-Offset eintragen
Repeat
Offset = FindString(AttributeText, "[")
If Offset = 0
Break
Else
TagList = ""
TagOffset = Offset + 1
RTFTag = "{"
Repeat
TagCharacter = Mid(AttributeText, TagOffset, 1)
If TagCharacter = "]"
Break
Else
If FindString(TagList, TagCharacter) = 0
TagList + TagCharacter
EndIf
ForEach Tag()
If Tag()\Character = TagCharacter
If Tag()\StartOffset = 0
Tag()\StartOffset = Offset
RTFTag + "\" + Tag()\AttributeName + " "
Else
Tag()\EndOffset = Offset
RTFTag = "}"
EndIf
Break
EndIf
Next
EndIf
TagOffset + 1
ForEver
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
AttributeText = ReplaceString(AttributeText, "[" + TagList + "]", "",
#PB_String_NoCase, Offset, 1)
CompilerElse
AttributeText = ReplaceString(AttributeText, "[" + TagList + "]",
RTFTag, #PB_String_NoCase, Offset, 1)
AttributeText = ReplaceString(AttributeText, #CR$, "\line")
CompilerEndIf
TagList = ""
EndIf
ForEver
; ----- Neuen Text mit Attributen an schon vorhandenen anhängen
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
NewTextOffset = gtk_text_buffer_get_char_count_(*TextBuffer)
gtk_text_buffer_get_end_iter_(*TextBuffer, @EndIter)
gtk_text_buffer_insert_(*TextBuffer, @EndIter, AttributeText, -1)
If ListSize(Tag()) > 0
; ----- Alle Tags aus Liste in *TextBuffer eintragen
ForEach Tag()
gtk_text_buffer_get_iter_at_offset_(*TextBuffer, @StartIter,
NewTextOffset + Tag()\StartOffset - 1)
gtk_text_buffer_get_iter_at_offset_(*TextBuffer, @EndIter,
NewTextOffset + Tag()\EndOffset - 1)
gtk_text_buffer_apply_tag_by_name_(*TextBuffer, Tag()\Character,
@StartIter, @EndIter)
Next
EndIf
CompilerCase #PB_OS_MacOS
AttributeText = "{\rtf1" + AttributeText + "}"
AttributeTextASCII = Space(StringByteLength(AttributeText, #PB_Ascii))
PokeS(@AttributeTextASCII, AttributeText, -1, #PB_Ascii)
DataObject = CocoaMessage(0, 0,
"NSData dataWithBytes:", @AttributeTextASCII,
"length:", Len(AttributeText))
If DataObject
AttributeString = CocoaMessage(0, 0, "NSAttributedString alloc")
CocoaMessage(@AttributeString, AttributeString,
"initWithRTF:@", @DataObject,
"documentAttributes:", 0)
If AttributeString
TextStorage = CocoaMessage(0, GadgetID(0), "textStorage")
CocoaMessage(0, TextStorage, "appendAttributedString:",
AttributeString)
CocoaMessage(0, AttributeString, "release")
EndIf
EndIf
CompilerCase #PB_OS_Windows
AttributeText = "{\rtf1" + AttributeText + "}"
AttributeTextASCII = Space(StringByteLength(AttributeText, #PB_Ascii))
PokeS(@AttributeTextASCII, AttributeText, -1, #PB_Ascii)
SendMessage_(GadgetID(EditorGadgetID), #EM_SETSEL, -1, -1)
SendMessage_(GadgetID(EditorGadgetID), #EM_REPLACESEL, 0,
AttributeTextASCII)
CompilerEndSelect
EndProcedure
OpenWindow(0, 100, 100, 400, 100, "EditorGadget with text attributes")
EditorGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20)
AddTextWithAttributes(0,
"Dies ist [b]fetter Text[b] und der folgende ist [u]unterstrichen[u]." +
#CR$)
AddTextWithAttributes(0, "Nun folgt noch [i]kursiv[i]." + #CR$)
AddTextWithAttributes(0,
"Und gleichzeitig [biu]fett und kursiv und unterstrichen[biu].")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
End
; ----- Tag-Definitionen
DataSection
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
Data.S "b", "weight", "700"
Data.S "i", "style", "2"
Data.S "u", "underline", "1"
CompilerElse
Data.S "b", "b"
Data.S "i", "i"
Data.S "u", "ul"
CompilerEndIf
Data.S ""
EndDataSection