Пример #1
0
        private void ReadStyleSheet(RTF rtf)
        {
            Style         style;
            StringBuilder sb;

            sb = new StringBuilder();

            while (true)
            {
                rtf.GetToken();

                if (rtf.CheckCM(TokenClass.Group, Major.EndGroup))
                {
                    break;
                }

                style = new Style(rtf);

                if (!rtf.CheckCM(TokenClass.Group, Major.BeginGroup))
                {
                    throw new RTFException(rtf, "Missing \"{\"");
                }

                while (true)
                {
                    rtf.GetToken();

                    if ((rtf.rtf_class == TokenClass.EOF) || rtf.CheckCM(TokenClass.Text, (Major)';'))
                    {
                        break;
                    }

                    if (rtf.rtf_class == TokenClass.Control)
                    {
                        if (rtf.CheckMM(Major.ParAttr, Minor.StyleNum))
                        {
                            style.Num  = rtf.param;
                            style.Type = StyleType.Paragraph;
                            continue;
                        }
                        if (rtf.CheckMM(Major.CharAttr, Minor.CharStyleNum))
                        {
                            style.Num  = rtf.param;
                            style.Type = StyleType.Character;
                            continue;
                        }
                        if (rtf.CheckMM(Major.StyleAttr, Minor.SectStyleNum))
                        {
                            style.Num  = rtf.param;
                            style.Type = StyleType.Section;
                            continue;
                        }
                        if (rtf.CheckMM(Major.StyleAttr, Minor.BasedOn))
                        {
                            style.BasedOn = rtf.param;
                            continue;
                        }
                        if (rtf.CheckMM(Major.StyleAttr, Minor.Additive))
                        {
                            style.Additive = true;
                            continue;
                        }
                        if (rtf.CheckMM(Major.StyleAttr, Minor.Next))
                        {
                            style.NextPar = rtf.param;
                            continue;
                        }

                        new StyleElement(style, rtf.rtf_class, rtf.major, rtf.minor, rtf.param, rtf.text_buffer.ToString());
                    }
                    else if (rtf.CheckCM(TokenClass.Group, Major.BeginGroup))
                    {
                        // This passes over "{\*\keycode ... }, among other things
                        rtf.SkipGroup();
                    }
                    else if (rtf.rtf_class == TokenClass.Text)
                    {
                        var name = new StringBuilder();
                        while (rtf.rtf_class == TokenClass.Text)
                        {
                            if (rtf.major == (Major)';')
                            {
                                rtf.UngetToken();
                                break;
                            }

                            sb.Append((char)rtf.major);
                            name.Append((char)rtf.major);
                            rtf.GetToken();
                        }

                        style.InternalName = sb.ToString();
                        style.Name         = name.ToString();
#if RTF_DEBUG
                    }
                    else
                    {
                        Console.WriteLine("ReadStyleSheet: Ignored token " + rtf.text_buffer);
#endif
                    }
                }
                rtf.GetToken();

                if (!rtf.CheckCM(TokenClass.Group, Major.EndGroup))
                {
                    throw new RTFException(rtf, "Missing EndGroup (\"}\"");
                }

                // Sanity checks
                if (style.InternalName == null)
                {
                    throw new RTFException(rtf, "Style must have name");
                }

                if (style.Num < 0)
                {
                    if (!sb.ToString().StartsWith("Normal") && !sb.ToString().StartsWith("Standard"))
                    {
                        throw new RTFException(rtf, "Missing style number");
                    }

                    style.Num = Style.NormalStyleNum;
                }

                if (style.NextPar == -1)
                {
                    style.NextPar = style.Num;
                }
            }

            rtf.RouteToken();
        }
Пример #2
0
        public void ReadFontTbl(RTF rtf)
        {
            int  old;
            Font font;

            old  = -1;
            font = null;

            while (true)
            {
                rtf.GetToken();

                if (rtf.CheckCM(TokenClass.Group, Major.EndGroup))
                {
                    break;
                }

                if (old < 0)
                {
                    if (rtf.CheckCMM(TokenClass.Control, Major.CharAttr, Minor.FontNum))
                    {
                        old = 1;
                    }
                    else if (rtf.CheckCM(TokenClass.Group, Major.BeginGroup))
                    {
                        old = 0;
                    }
                    else
                    {
                        throw new RTFException(rtf, "Cannot determine format");
                    }
                }

                if (old == 0)
                {
                    if (!rtf.CheckCM(TokenClass.Group, Major.BeginGroup))
                    {
                        throw new RTFException(rtf, "missing \"{\"");
                    }
                    rtf.GetToken();
                }

                font = new Font(rtf);

                while ((rtf.rtf_class != TokenClass.EOF) && (!rtf.CheckCM(TokenClass.Text, (Major)';')) && (!rtf.CheckCM(TokenClass.Group, Major.EndGroup)))
                {
                    if (rtf.rtf_class == TokenClass.Control)
                    {
                        switch (rtf.major)
                        {
                        case Major.FontFamily: {
                            font.Family = (int)rtf.minor;
                            break;
                        }

                        case Major.CharAttr: {
                            switch (rtf.minor)
                            {
                            case Minor.FontNum: {
                                font.Num = rtf.param;
                                break;
                            }

                            default: {
#if RTF_DEBUG
                                Console.WriteLine("Got unhandled Control.CharAttr.Minor: " + rtf.minor);
#endif
                                break;
                            }
                            }
                            break;
                        }

                        case Major.FontAttr: {
                            switch (rtf.minor)
                            {
                            case Minor.FontCharSet: {
                                font.Charset = (CharsetType)rtf.param;
                                break;
                            }

                            case Minor.FontPitch: {
                                font.Pitch = rtf.param;
                                break;
                            }

                            case Minor.FontCodePage: {
                                font.Codepage = rtf.param;
                                break;
                            }

                            case Minor.FTypeNil:
                            case Minor.FTypeTrueType: {
                                font.Type = rtf.param;
                                break;
                            }

                            default: {
#if RTF_DEBUG
                                Console.WriteLine("Got unhandled Control.FontAttr.Minor: " + rtf.minor);
#endif
                                break;
                            }
                            }
                            break;
                        }

                        default: {
#if RTF_DEBUG
                            Console.WriteLine("ReadFontTbl: Unknown Control token " + rtf.major);
#endif
                            break;
                        }
                        }
                    }
                    else if (rtf.CheckCM(TokenClass.Group, Major.BeginGroup))
                    {
                        rtf.SkipGroup();
                    }
                    else if (rtf.rtf_class == TokenClass.Text)
                    {
                        StringBuilder sb;

                        sb = new StringBuilder();

                        while ((rtf.rtf_class != TokenClass.EOF) && (!rtf.CheckCM(TokenClass.Text, (Major)';')) && (!rtf.CheckCM(TokenClass.Group, Major.EndGroup)) && (!rtf.CheckCM(TokenClass.Group, Major.BeginGroup)))
                        {
                            sb.Append((char)rtf.major);
                            rtf.GetToken();
                        }

                        if (rtf.CheckCM(TokenClass.Group, Major.EndGroup))
                        {
                            rtf.UngetToken();
                        }

                        font.Name = sb.ToString();
                        continue;
#if RTF_DEBUG
                    }
                    else
                    {
                        Console.WriteLine("ReadFontTbl: Unknown token " + rtf.text_buffer);
#endif
                    }

                    rtf.GetToken();
                }

                if (old == 0)
                {
                    rtf.GetToken();

                    if (!rtf.CheckCM(TokenClass.Group, Major.EndGroup))
                    {
                        throw new RTFException(rtf, "Missing \"}\"");
                    }
                }
            }

            if (font == null)
            {
                throw new RTFException(rtf, "No font created");
            }

            if (font.Num == -1)
            {
                throw new RTFException(rtf, "Missing font number");
            }

            rtf.RouteToken();
        }