Suche rtf (richedit) Control für Linux

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Suche rtf (richedit) Control für Linux

Beitrag von ccode_new »

Hi Leute,

für Windows gibt es ja eine gute Rtf-Editor Lösung, aber gibt es auch eine für Linux?

Ich würde mich zur Not auch mit Linux-Api beschäftigen.

Kennt hier jemand eine Richedit-Lösung für Purebasic unter Linux.

Scintilla funktioniert ja z.B. auch unter Linux.

Nur wie kann man das evtl. als RTF-Editor verwenden?

????
Zuletzt geändert von ccode_new am 02.07.2017 10:46, insgesamt 3-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Suche rtf (richedit) Control für Linux

Beitrag von RSBasic »

Laut PB-Blog-Seite wird GtkTextView beim EditorGadget unter Linux verwendet.
Beispielcodes zum Formatieren des Textes findest du hier: http://chabba.de > Linux-PureBasic-API > EditorGadget
Ansonsten auch hier: http://www.purebasic.fr/english/search.php
RTF wirst du unter Linux nirgends finden. Das ist von Microsoft.
Entweder benutzt du Scintilla oder GTK. Du kannst natürlich auch einen eigenen Editor basierend auf die RTF-Syntax bauen, aber das ist sehr umfangreich.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Suche rtf (richedit) Control für Linux

Beitrag von Shardik »

Makke hatte schon einmal diese RTF-ähnliche Lösung für Linux gezeigt, die sicherlich als Ausgangspunkt für Dich dienen könnte. Ausgangspunkt seiner Frage war dieser Thread, der aber leider nach kurzer Zeit in Anschuldigungen und Pöbeleien ausartete und daher gesperrt wurde.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Suche rtf (richedit) Control für Linux

Beitrag von ccode_new »

Ok, danke euch beiden.

An Shardik:

Cool! Genau so ein Ansatz ist nicht schlecht.

Mir reichen nur die grundlegenden Formatierungsmöglichkeiten, Bilder, etc. müssen nicht unbedingt unterstützt werden.

Ich werde mir das Beispiel mal genauer ansehen.

Mit dem Ziel das Veränderungen über [r] [g], ...

direkt angezeigt werden sollen.
("direkter - Was ich editiere möchte ich gleich sehen - Editor")

Als mögliche Alternative sehe ich bis jetzt nur eine Lösung über Webgadget mit der Anzeige einer angepassten Javascript-Editor-Komponente (z.B. ckeditor).

Aber gibt es nicht noch irgend eine gute Lib (.so) für Linux?
Mit Beispielen zur Nutzung?

Für Lazarus (Delphi) scheint es noch etwas zu geben, aber ich weiß jetzt nicht wie ich das mit PureBasic nutzen könnte.
(http://wiki.freepascal.org/KControls)
-> Das scheint aber auch ziemlich fehlerhaft/instabil zu sein.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Suche rtf (richedit) Control für Linux

Beitrag von ccode_new »

Hallo liebe Leute,

ich möchte das Thema mit dem RTF oder Text-Style-Editor nochmal aufgreifen.

Auf http://www.chabba.de/ gibt es ja ein tolles Beispiel:

http://www.chabba.de/Linux/EditorGadget ... GtkDemo.pb

Textstyle kann man ja nun direkt z.B über Buttons/Toolbar, etc.. so ändern:

Bsp.:

Code: Alles auswählen

Procedure Editor_Bold(buffer)
  Protected.GtkTextIter istart, iend
  gtk_text_buffer_get_selection_bounds_(buffer, @istart, @iend)
  gtk_text_buffer_apply_tag_by_name(buffer, "bold", @istart, @iend)
EndProcedure

Procedure Editor_Font(efont.s, size, buffer)
  Protected.GtkTextIter istart, iend
  gtk_text_buffer_create_tag(buffer, efont, "family", @efont) ; Ist das so korrekt ?
  gtk_text_buffer_create_tag(buffer, "new_size", "size", size * #PANGO_SCALE)
  gtk_text_buffer_get_selection_bounds_(buffer, @istart, @iend)
  gtk_text_buffer_apply_tag_by_name(buffer, "bold", @istart, @iend)
EndProcedure

Procedure Editor_Normal(buffer)
  Protected.GtkTextIter istart, iend
  gtk_text_buffer_get_selection_bounds_(buffer, @istart, @iend)
  gtk_text_buffer_remove_all_tags_(buffer, @istart, @iend)
EndProcedure
Meine Frage:
-> Wie kann man einen formatierten Text abspeichern und auch wieder laden ?

Danke an alle Linux-Freaks!!!
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Suche rtf (richedit) Control für Linux

Beitrag von Omi »

Hallo ccode_new,

zuerst mal zum

Code: Alles auswählen

gtk_text_buffer_create_tag(buffer, efont, "family", @efont) ; Ist das so korrekt ?
Respekt, du hast schnell einen kritischen Punkt gefunden :wink:
Das Problem ist hier die starre Parameterübergabe in PureBasic die in C mal ein Integer oder String (Pointer) sein kann.
In Linux wird bei einem String UTF8 erwartet. Wird in PB ein Pointer auf den String übergeben, passt es bei den hier möglichen 'Bezeichnungen' in Ascii fast immer (Ascii und UTF8 sind identisch) und es funktioniert einen Zeiger zu übergeben, in Unicode wird UCS2 (2-byte'ig) übergeben und die API verschluckt sich.

Die downloadbare Demo-Übersetzung hat gerade hier noch einen Fehler (z.B. bei "monospace)" und könnte für ähnliche Fälle folgendermaßen umgangen werden ...
Einen Import-Abkömmling für Strings als 'value'-Parameter anlegen:

Code: Alles auswählen

gtk_text_buffer_create_tagS(*buffer.GtkTextBuffer, tag_name.p-utf8, first_property_name.p-utf8, value.p-utf8, term= #Null) As "gtk_text_buffer_create_tag"
oder unter Verwendung des ursprünglichen Importes:
für PB5.60+ ...

Code: Alles auswählen

gtk_text_buffer_create_tag(buffer, efont, "family", UTF8(efont))
oder als Ersatz für frühere PBs ohne TF8() z.B. ...

Code: Alles auswählen

Procedure.s Pb2sUTF8(sPB.s);                        converts PB-Format to UTF8, Returns pointer to string, free *gMem after each use
	Protected *gMem= AllocateMemory(StringByteLength(sPB, #PB_UTF8) + 1);Mem for string in UTF8
	PokeS(*gMem, sPB, -1,  #PB_UTF8)
	Protected.s sUTF8= PeekS(*gMem, -1)
	FreeMemory(*gMem)
	ProcedureReturn sUTF8
EndProcedure

gtk_text_buffer_create_tag(buffer, efont, "family", Pb2sUTF8(efont))
Erstmal schön dass Du hier den Mut hast in die Hände zu spucken. Mir fehlt und fehlte die Zeit um hier weiter zu machen.
Wenn man mal etwas 'Suchmaschin't' sieht man, dass unter Linux auch auf andere Programmiersprachen die RTF-Anfragen häufig im Selbermachen enden.

Auf Grund der auch mir fehlenden Vision (und keinen Dunst von RTF) wie ich es vernünftig speichern könnte, den Möglichkeiten der Tagverwaltung (über API oder selbstgestrickt), den verschiedenen Arten die Tags anzuwenden (bitte mal die Suche in den PB-Foren betätigen), dem Editier-Problem (innerhalb welcher Tags steht der Cursor gerade, bold?, size?, etc., auch hier hilft einem die API aber es ist komplex), dem auszuarbeitenden Import hab ich's erst mal 'verschoben' :roll: .

Leider bin ich mittlerweile vom Thema wieder ziemlich raus, denke aber, man sollte mal bescheiden beginnen (Textgrößen, Stil/Attribute) und das Ganze wirken lassen, ob das Konzept Zukunft hat.

Gruß Charly
PureBasic Linux-API-Library: http://www.chabba.de
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Suche rtf (richedit) Control für Linux

Beitrag von ccode_new »

Hi "Omi" !!!

Danke für deine Hilfe.

Das mit den Schriftarten funktioniert so toll:

Code: Alles auswählen

Procedure Editor_Font(efont.s, size, buffer)
  Protected.GtkTextIter istart, iend
  Protected *fontbuffer
  *fontbuffer = UTF8(efont)
  gtk_text_buffer_create_tag(buffer, efont, "family", *fontbuffer)
  gtk_text_buffer_create_tag(buffer, "new_size", "size", size * #PANGO_SCALE)
  gtk_text_buffer_get_selection_bounds_(buffer, @istart, @iend)
  gtk_text_buffer_apply_tag_by_name(buffer, efont, @istart, @iend)
  gtk_text_buffer_apply_tag_by_name(buffer, "new_size", @istart, @iend)
  FreeMemory(*fontbuffer)
EndProcedure
Aber das mit dem Speichern und Laden ist noch so ein Problem.

Meine Fragen:

Wie implementiert man folgende Api-Funktion korrekt in PureBasic:

gtk_text_buffer_register_deserialize_tagset(..)
gtk_text_buffer_deserialize(..)
gtk_text_buffer_serialize(..)
gtk_text_buffer_new (GtkTextTagTable *table)

Wie arbeitet man korrekt mit GtkTextTagTable ?
Dies braucht man z.B für gtk_text_buffer_register_deserialize_tagset(..)

oder für die Konstruktor-Funktion: gtk_text_buffer_new()

Mein Vorhaben ist es mehrere Tags (z.B <b> und </b>, <i> und </i> ) zu parsen.
Das heißt an entsprechender Positionen <b>, ... speichern und diese später wieder auslesen. Damit man daraufhin den Text formatieren kann.

...........................
ES IST NERVIG ! :?

Ich habe mir gedacht einen zweiten Buffer anzulegen in dem ich zusätzlich zum ersten Buffer die Sonderanweisungen (<b>, </b>, ...) mit speichere.
Der erste Buffer soll nur angezeigt werden damit man die Sonderbefehle nicht sieht.
Soweit ok!
Weiter gedacht:
Man soll ja auch selber die Zeichen <b>, </b>, <i> , .... im Text eingeben können.
Nichts leichter als das: Einfach ein "ReplaceString" für alle echten Vorkommen der jeweiligen Sonderanweisungen bevor diese gespeichert werden und die Trenner hinzugefügt werden. (Aus <b> wird dann z.Bsp. %#x und aus </b> (§$< oder so ähnlich)

Soviel zur Theorie.

Wie kann man jetzt z.B. ein <b> vor der jeweiligen Selektion hinzufügen und ein </b> danach ?

Das geht z.Bsp. nicht:

Code: Alles auswählen

gtk_text_buffer_get_selection_bounds_(savBuffer,@istart,@iend)
gtk_text_buffer_insert(savBuffer, @istart, "<b>", 3)
gtk_text_buffer_insert(savBuffer, @iend, "</b>", 4)
Je nachdem welche Insert-Anweisung ich weglasse wird entweder das <b> davor, oder das </b> danach eingefügt.
Aber nie BEIDE Anweisungen.

Warum ?

....
Man könnte es ja auch so machen:

Code: Alles auswählen

gtk_text_buffer_insert(savBuffer, @istart, "<b>", 3)  
gtk_text_buffer_insert_at_cursor(savBuffer, "</b>", Len("</b>"))
Ob das so gut ist ?

Eine weitere kritische Frage ist:

Code: Alles auswählen

gtk_text_buffer_get_bounds_(buffer, @istart, @iend)
gtk_text_buffer_get_text_(buffer, @istart, @iend, 0) ; Wie kann ich den Bufferinhalt als String erhalten ?
Danke für jede Hilfe.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Suche rtf (richedit) Control für Linux

Beitrag von ccode_new »

Hi Leute ich hab's hinbekommen.

Es werden weitere Imports benötigt:

Code: Alles auswählen

  gtk_text_buffer_register_serialize_tagset(*buffer.GtkTextBuffer, *tag)
  gtk_text_buffer_register_deserialize_tagset(*buffer.GtkTextBuffer, *tag)
  gtk_text_buffer_deserialize(*regbuffer.GtkTextBuffer, *contbuffer.GtkTextBuffer, *format, *iter, *gdata, slen, term = #Null)
  gtk_text_buffer_serialize(*regbuffer.GtkTextBuffer, *contbuffer.GtkTextBuffer, *format, *start, *end_, slen)
  gtk_text_buffer_unregister_serialize_format(*buffer.GtkTextBuffer, *format)
  gtk_text_buffer_unregister_deserialize_format(*buffer.GtkTextBuffer, *format)
  gtk_text_buffer_insert_at_cursor(*buffer.GtkTextBuffer, text.p-utf8, slen)
  g_file_set_contents(dstFileName.p-utf8, *mem, slen, term = #Null)
  g_file_get_contents(dstFileName.p-utf8, *mem, slen, term = #Null)
  gtk_text_buffer_deserialize_set_can_create_tags(*buffer.GtkTextBuffer, *format)
  gtk_text_buffer_delete(*buffer.GtkTextBuffer, *start, *end_)
  g_free(*mem)
Hier die Funktionen zum formatierten Laden und Speichern.

Code: Alles auswählen

Procedure Editor_Save(buffer, filename.s)
  Protected.GtkTextIter istart, iend
  Protected grtSerializeFormat
  Protected serializedData
  Protected plen
  Protected.b success
  
  grtSerializeFormat = gtk_text_buffer_register_serialize_tagset(buffer, #Null$)
  gtk_text_buffer_get_bounds_(buffer, @istart, @iend)
  serializedData = gtk_text_buffer_serialize(buffer, buffer, grtSerializeFormat, @istart, @iend, @plen)
  success = g_file_set_contents(filename, serializedData, plen, #Null)
  g_free(serializedData)
  gtk_text_buffer_unregister_serialize_format(buffer, grtSerializeFormat)
EndProcedure

Procedure Editor_Load(buffer, filename.s)
  Protected.GtkTextIter istart, iend
  Protected grtDeserializeFormat
  Protected serializedData
  Protected plen
  Protected.b success
  
  success = g_file_get_contents(filename, @serializedData, @plen, #Null)
  grtDeserializeFormat = gtk_text_buffer_register_deserialize_tagset(buffer, #Null$)
  gtk_text_buffer_deserialize_set_can_create_tags(buffer, grtDeserializeFormat)
  gtk_text_buffer_get_bounds_(buffer, @istart, @iend)
  gtk_text_buffer_delete(buffer, @istart, @iend)
  success = gtk_text_buffer_deserialize(buffer, buffer, grtDeserializeFormat, @istart, serializedData, plen, #Null)
  g_free(serializedData)
  gtk_text_buffer_unregister_serialize_format(buffer, grtDeserializeFormat)
EndProcedure
Es funktioniert !!!!

Bin happy :bounce:
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Suche rtf (richedit) Control für Linux

Beitrag von ccode_new »

Ich hab dann mal noch ne Frage.

Hätte jemand eine Idee wie ich den Save-Stream ((serialisierte Daten)- also das was in die Datei gespeichert wird) in einen String umleiten kann?

Ich möchte dabei nicht den Umweg über das auslesen des Files gehen.

Dank 'schön für jede Hilfe!
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Suche rtf (richedit) Control für Linux

Beitrag von Omi »

Hallo ccode_new,

hätte grad mal im Telegrammstil geantwortet (tut mir Leid, bin grad im Umzugsstress).
Dann erstmal Glückwunsch. Habs noch nicht getestet - sieht aber nach sehr sauber umgesetzt aus. Respekt!
So weit hätte ich Dir auf Anhieb eh nicht helfen können.

Du hättest die serializedData gerne als String?
Da in g_file_set_contents() der Parametertyp const gchar *contents ist, denke ich (ungetestet) dass Irgendwas$= PeekS(serializedData, -1, #PB_UTF8) funktionieren könnte.

Da Du Dich doch sehr gut ins Thema reinarbeitest schick ich Dir die nächsten Tage per PM noch 2 ältere unfertige Experimentiercodes bzgl. EditorGadget-Formatierung (müssen noch lauffähig aufbereitet werden). Vielleicht kannst Du was brauchen daraus.

Gruß Charly
PureBasic Linux-API-Library: http://www.chabba.de
Antworten