解析RTF不间断空间

时间:2015-08-17 08:45:36

标签: parsing rtf

我正在制作一个从RTF到HTML的简单解析器。

我有以下原始RTF:

who\\~nursed\\~and

根据RTF规范,\〜是非破坏空间的关键字。

关键字的结尾由分隔符标记,分隔符定义如下:

  

空间。这仅用于分隔控制字,在后续处理中被忽略。

     

数字或ASCII减号( - ),表示数字参数与控制字相关联。然后,随后的数字序列由除ASCII数字之外的任何字符(通常以反斜杠开头的另一个控制字)分隔。参数可以是正十进制数或负十进制数。该数值的范围标称为-32768到32767,即带符号的16位整数。少量控制字的取值范围为-2,147,483,648到2,147,483,647(32位有符号整数)。这些控制字包括\ binN,\ revdttmN,\ rsidN相关控制字和一些图片属性,如\ bliptagN。这里N代表数字参数。 RTF解析器必须允许最多10个数字,可选地前面带有减号。如果分隔符是空格,则将其丢弃,也就是说,它不包含在后续处理中。

     

除字母或数字之外的任何字符。在这种情况下,分隔符将终止控制字,而不是控制字的一部分。如反斜杠“\”,表示后面跟着一个新的控制字或控制符号。

据我了解,上面突出显示的部分是此特定实例中使用的规则。但如果是这种情况,那么我的解析器会读到〜符号,并得出结论,因为这不是字母或数字,所以它不是关键字的一部分。 目前这导致以下输出:

  

谁〜调养〜和

我有以下用于阅读关键字的代码:

    public GetKeyword(index: number): KeywordSet {
        var keywordarray: string[] = [];
        var valuearray: string[] = [];
        index++;
        while (index < this.m_input.length) {
            var remainint = this.m_input.substr(index);
            //Keep going until we hit a delimiter
            if (this.m_input[index] == " ") {
                index++;
                break;
            } else if (this.IsNumber(this.m_input[index])) {
                valuearray.push(this.m_input[index]);
            } else if (this.IsDelimiter(this.m_input[index])) {
                break;
            } else keywordarray.push(this.m_input[index]);
            index++;
        }
        var value: number = null;
        if (valuearray.length > 0) value = parseInt(valuearray.join(""));
        var keywordset = new KeywordSet(keywordarray.join(""), index, value);
        return keywordset;
    }

    private IsDelimiter(char: string): boolean {
        if (char == "*" || char == "'") return false;
        return !this.IsLetterOrDigit(char);
    }

当GetKeyword()到达“〜”时,它将其识别为分隔符,并停止读取,从而产生一个空关键字作为返回值。

我没有为此构建AST。不认为这有必要吗?

1 个答案:

答案 0 :(得分:0)

您的问题中的引用描述了名为control word的实体的语法,但\~实际上是名为control symbol的不同实体。控制符号具有不同的语法:

  

控制符号

     

控件符号由反斜杠后跟单个非字母字符组成。例如,\〜(反斜杠代字号)表示不间断的空格。控制符号没有分隔符,即控制符号后面的空格被视为文本,而不是分隔符。

Rich Text Format (RTF) Specification, version 1.9.1第9页。