alipek/rtf2html

将 RTF 转换为 HTML,并反向转换

dev-master 2015-08-13 20:09 UTC

This package is not auto-updated.

Last update: 2024-09-28 18:24:32 UTC


README

$note = new JoshRibakoff_Note;
$note->setRTF($yourRTFDocumentAsText);
$note->formatHTML(); // returns your RTF converted to HTML as best as possible.

在 RTF 文档与 HTML 或纯文本之间进行转换。

我被分配了一个奇怪的任务:在 PHP 网络应用中显示来自一个闭源微软产品的数据,允许在所见即所得编辑器中对其进行操作,并将其写回。结果这个产品使用的是 PHP 可以与之工作的 MSSQL 数据库。问题变成了 RTF 到 HTML 的转换以及反向转换。所以我使用 TDD 创建了这个怪物。比较 HTML 和 RTF 的优雅性很有趣,尽管它们本质上做的是同一件事。

我不建议将 RTF 用于任何事情。这是一个糟糕的微软标准。如果您这样做,可以使用这个库将 RTF 转换为 HTML 并反向转换(当然还有纯文本),它支持字体颜色、大小、粗体、斜体和下划线。

其他用途和设计因素

RTF 的一部分是嵌套的 "{ }",嵌套的数据与正则表达式配合不佳,这就是我为什么编写了一个完整的词法分析器。有一个类可以匹配任何 "{ " 到其匹配的 "}",递归地调用它可以创建一个多维数组。您可以使用这个类创建一个由 PHP 解析的语言(如果您愿意的话)

不足之处

鉴于与微软产品合作的不合理之处,我尽可能少地编写代码以完成任务。我的任务只需要支持粗体、下划线、斜体和颜色。一些其他基本功能得到支持,但与更高级的 RTF(如图片和表格)一起使用时会有未定义的结果。我的任务是将 HTML 编辑器中输入的 HTML 简单地添加到 RTF 文档的顶部。如果您想从头开始将 HTML 文档转换为 RTF,您不能使用这个库。也不应该这样做。主要目标是主要从 RTF 到 HTML,以便在您的网络应用中显示 RTF 文档,同时支持基本的 RTF 操作。

标签顺序

在 RTF 中,标签的关闭顺序可以不同于它们打开的顺序。这是一个词法分析器,这意味着它在 RTF 文本的指针位置查找标记,当它找到标记时,它会做一些工作,然后移动指针,直到没有更多的 RTF 数据可以进行词法分析。如果当前标记关闭的标签不是最后打开的标签,则关闭尽可能少的标签,以便我们可以关闭当前标记的标签。当我们关闭每个标签时,我们将它从打开标签的堆栈中删除,但将其推入第二个堆栈,以便我们可以在关闭当前标记的标签后再次打开它。然后它为当前标记放入一个 HTML 关闭标签,并将其从打开标签的堆栈中删除

换句话说

\b bold \i bold+italics \b0 italics \i0

这将直接翻译成

<b>bold<i>bold+italics</b>italics</i>

这是无效的。所以这个库“猜测”HTML版本的外观并这样做

<b>bold<i>bold+italics</i></b><i>italics</i>

此外,RTF 有一个“字体表”,颜色被索引到标题中的 ID。这个库操作这个字体表标题。

更多示例

将简单的 RTF 片段转换为 HTML

$converter = new JoshRibakoff_Note_RTFToHTML();
$converter->convert('\\ulfoo\\ulnone');

创建这个

<u>foo</u>

修改现有的 RTF 文档以添加一些文本(从 HTML 转换为 RTF)

$startNote = '{\\rtf1\\ansi\\ansicpg1251\\deff0\\deflang1049{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}{\\f1\\fnil\\fcharset204 Microsoft Sans Serif;}}
\\uc1\\pard\\f0\\fs17 4/4/2013 2:36:12 PM - jribakoff: simple note\\par
\\f1\\par
}
';

$note = new JoshRibakoff_Note();
$note->setRTF($startNote);
$note->prependNote(array(
      'text' => '<b style="foo">bold note</b>'
));

创建这个

\\rtf1\\ansi\\ansicpg1251\\deff0\\deflang1049{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}{\\f1\\fnil\\fcharset204 Microsoft Sans Serif;}}
{\\colortbl }
\\f0\\fs17 \b bold note \b0\\par
\\uc1\\pard\\f0\\fs17 4/4/2013 2:36:12 PM - jribakoff: simple note\\par
\\f1\\par

`