Jak zapisać formatowany tekst z RichEdit w JSON?

0

Czy da się zapisać tekst komponentu RichEdit w struktuze JSON?
Oczywiście chodzi mi o zachowanie formatowania tekstu.

1

Tekst w formacie RTF tak naprawdę jest zwykłym tekstem ze znakami specjalnymi, które definiują formatowanie, coś w podobnym stylu, jak HTML, tyle, że znaczniki mają zupełnie inny format. Można zachować w JSON taki tekst pod warunkiem zamiany znaków specjalnych (innych niż standardowe ASCII) na zapis \u1234, gdzie 1234 to numer znaku.

Aby to było możliwe, komponent RichEdit powinien mieć funkcję wyciągania formatu RTF i wprowadzania tekstu w formacie RTF.

0

a może da się łatwiej poprzez MemoryStream?
Albo najpierw zapisać do pliku *.rtf, a ten plik jakoś umieścić w strukturze JSON?
To takie moje pomysły, ale nie wiem jak je wykonać.
Jakiś przykład by się przydał.

3

Musisz zapisać zawartość RichEdit do stream, a następnie ten stream zamienić na base64 i zapisać do json. mniej-więcej coś takiego:

uses
  System.NetEncoding, System.JSON;

procedure TForm1.bRichEditToJsonClick(Sender: TObject);
var
  ms: TMemoryStream;
  json: String;
begin
  ms := TMemoryStream.Create;
  RichEdit1.Lines.SaveToStream(ms);
  json := Format('{"richtext": "%s"}', [TNetEncoding.Base64.EncodeBytesToString(ms.Memory, ms.Size)]);
  Memo1.Lines.Text := json;
  ms.Free;
end;

procedure TForm1.bJsonToRichEditClick(Sender: TObject);
var
  jv: TJSonValue;
  s: String;
  b: TBytes;
  ms: TMemoryStream;
begin
  jv := TJSonObject.ParseJSONValue(Memo1.Lines.Text);
  s := jv.GetValue<string>('richtext');
  b := TNetEncoding.Base64.DecodeStringToBytes(s);
  jv.Free;
  ms := TMemoryStream.Create;
  ms.Write(b[0], Length(b));
  ms.Position := 0;
  RichEdit1.Lines.LoadFromStream(ms);
  ms.Free;
end;
1

a następnie ten stream zamienić na base64

W ogólnym przypadku to prawda, natomiast w przypadku RTF nie ma potrzeby zamiany na base64, bo RTF jest zapisywany zwykłym tekstem. Jedynie każdy znak " i \ należy poprzedzić znakiem \, tworząc odpowiednio \" i \\. Podobnie sprawa dotyczy "białych znaków", które zwyczajowo zapisuje się jako \r, \n i \t. Bardzo możliwe, że biblioteka używana do parsowania JSON ma już w sobie funkcję, która wykonuje taką zamianę, a także wykonuje zamianę w drugą stronę.

1

Warto też sprawdzić, bo być może funkcja przeprowadzająca escape'owanie stringów już istnieje i jest udostępniona jako publiczna w API dla JSON-a. W takim przypadku nie trzeba będzie całej konwersji przeprowadzać ręcznie oraz będzie się miało pewność, że wynikowy string zawsze będzie kompatybilny z formatem oraz samą biblioteką.

Dla przykładu, Free Pascal ma takie funkcje — StringToJSONString i JSONStringToString.

0

Oczywiście, że tak, tworzysz tekst --- obiekt{tekst:"tutaj to co chcesz zapisać ze znakami ucieczki dla " "} - i wszucasz do pliku

1

pomysł z base64 to chyba najprostszy.
Dzięki za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.