Convert RTF to and from plain text
Asked Answered
Z

2

13

I have a requirement to convert plain text to and from RTF (RichText Format) using javascript.

I am looking for a function for each conversion, and I am not looking to use a library.

Conversion from plain to RTF

The formatting styles and colours are not important, all that matters is that the plain text i converted into a valid RTF format

Conversion from RTF to plain

Again, the styles are not important. They can be completed removed. All that is required is that all text data remains (no loss of entered data)

Zito answered 28/4, 2015 at 14:57 Comment(0)
Z
15

I found a c# answer here which was a good starting point, but I needed a Javascript solution.

There is no guarantee that these are 100% reliable, but they seem to work well with the data I have tested on.

function convertToRtf(plain) {
    plain = plain.replace(/\n/g, "\\par\n");
    return "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang2057{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}}\n\\viewkind4\\uc1\\pard\\f0\\fs17 " + plain + "\\par\n}";
}

function convertToPlain(rtf) {
    rtf = rtf.replace(/\\par[d]?/g, "");
    return rtf.replace(/\{\*?\\[^{}]+}|[{}]|\\\n?[A-Za-z]+\n?(?:-?\d+)?[ ]?/g, "").trim();
}

Here is a working example of them both in action

Zito answered 28/4, 2015 at 14:57 Comment(7)
or here you've got a javascript RTF parser by lazygyuConney
I would give you 100 upvotes for this if I could, thank you!Palladio
This won’t work well for Unicode input (non-English chars, typographic quotation marks, etc).Elna
@mirabilos: Yeah I would have expected there would be problems with things like that. Unfortunately I don't know enough about RTF format to provide anything more robustZito
rtf.replace(/\\'[0-9a-zA-Z]{2}/g, "").trim(); will remove some of the unwanted unicode charactersZindman
@TjadClark those Unicode characters are wanted and needed to be correctly represented in the outputElna
I suppose it depends from app to app, that was just a general expression for unicode hex. My application seems to permit me to ignoring that. Thanks for the heads up though.Zindman
Z
0

Adding onto Musefan's answer for some hex characters

function convertToPlain(rtf) {
    rtf = rtf.replace(/\\par[d]?/g, "");
    rtf = rtf.replace(/\{\*?\\[^{}]+}|[{}]|\\\n?[A-Za-z]+\n?(?:-?\d+)?[ ]?/g, "")
    return rtf.replace(/\\'[0-9a-zA-Z]{2}/g, "").trim();
}
Zindman answered 15/6, 2017 at 17:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.