Пример #1
0
        private void HandleOptDest(RTF rtf)
        {
            int group_levels = 1;

            while (true)
            {
                GetToken();

                // Here is where we should handle recognised optional
                // destinations.
                //
                // Handle a picture group
                //
                if (rtf.CheckCMM(TokenClass.Control, Major.Destination, Minor.Pict))
                {
                    ReadPictGroup(rtf);
                    return;
                }

                if (rtf.CheckCM(TokenClass.Group, Major.EndGroup))
                {
                    if ((--group_levels) == 0)
                    {
                        break;
                    }
                }

                if (rtf.CheckCM(TokenClass.Group, Major.BeginGroup))
                {
                    group_levels++;
                }
            }
        }
Пример #2
0
        private void ReadColorTbl(RTF rtf)
        {
            Color color;
            int   num;

            num = 0;

            while (true)
            {
                rtf.GetToken();

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

                color     = new Color(rtf);
                color.Num = num++;

                while (rtf.CheckCM(TokenClass.Control, Major.ColorName))
                {
                    switch (rtf.minor)
                    {
                    case Minor.Red: {
                        color.Red = rtf.param;
                        break;
                    }

                    case Minor.Green: {
                        color.Green = rtf.param;
                        break;
                    }

                    case Minor.Blue: {
                        color.Blue = rtf.param;
                        break;
                    }
                    }

                    rtf.GetToken();
                }
                if (!rtf.CheckCM(TokenClass.Text, (Major)';'))
                {
                    throw new RTFException(rtf, "Malformed color entry");
                }
            }
            rtf.RouteToken();
        }
Пример #3
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();
        }
Пример #4
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();
        }
Пример #5
0
        private void ReadPictGroup(RTF rtf)
        {
            bool read_image_data = false;

            Picture picture = new Picture();

            while (true)
            {
                rtf.GetToken();

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

                switch (minor)
                {
                case Minor.PngBlip:
                    picture.ImageType = minor;
                    read_image_data   = true;
                    break;

                case Minor.WinMetafile:
                    picture.ImageType = minor;
                    read_image_data   = true;
                    continue;

                case Minor.PicWid:
                    continue;

                case Minor.PicHt:
                    continue;

                case Minor.PicGoalWid:
                    picture.SetWidthFromTwips(param);
                    continue;

                case Minor.PicGoalHt:
                    picture.SetHeightFromTwips(param);
                    continue;
                }

                if (read_image_data && rtf.rtf_class == TokenClass.Text)
                {
                    picture.Data.Seek(0, SeekOrigin.Begin);

                    //char c = (char) rtf.major;

                    uint digitValue1;
                    uint digitValue2;
                    char hexDigit1 = (char)rtf.major;
                    char hexDigit2;

                    while (true)
                    {
                        while (hexDigit1 == '\n' || hexDigit1 == '\r')
                        {
                            hexDigit1 = (char)source.Peek();
                            if (hexDigit1 == '}')
                            {
                                break;
                            }
                            hexDigit1 = (char)source.Read();
                        }

                        hexDigit2 = (char)source.Peek();
                        if (hexDigit2 == '}')
                        {
                            break;
                        }
                        hexDigit2 = (char)source.Read();
                        while (hexDigit2 == '\n' || hexDigit2 == '\r')
                        {
                            hexDigit2 = (char)source.Peek();
                            if (hexDigit2 == '}')
                            {
                                break;
                            }
                            hexDigit2 = (char)source.Read();
                        }

                        if (Char.IsDigit(hexDigit1))
                        {
                            digitValue1 = (uint)(hexDigit1 - '0');
                        }
                        else if (Char.IsLower(hexDigit1))
                        {
                            digitValue1 = (uint)(hexDigit1 - 'a' + 10);
                        }
                        else if (Char.IsUpper(hexDigit1))
                        {
                            digitValue1 = (uint)(hexDigit1 - 'A' + 10);
                        }
                        else if (hexDigit1 == '\n' || hexDigit1 == '\r')
                        {
                            continue;
                        }
                        else
                        {
                            break;
                        }

                        if (Char.IsDigit(hexDigit2))
                        {
                            digitValue2 = (uint)(hexDigit2 - '0');
                        }
                        else if (Char.IsLower(hexDigit2))
                        {
                            digitValue2 = (uint)(hexDigit2 - 'a' + 10);
                        }
                        else if (Char.IsUpper(hexDigit2))
                        {
                            digitValue2 = (uint)(hexDigit2 - 'A' + 10);
                        }
                        else if (hexDigit2 == '\n' || hexDigit2 == '\r')
                        {
                            continue;
                        }
                        else
                        {
                            break;
                        }

                        picture.Data.WriteByte((byte)checked (digitValue1 * 16 + digitValue2));

                        // We get the first hex digit at the end, since in the very first
                        // iteration we use rtf.major as the first hex digit
                        hexDigit1 = (char)source.Peek();
                        if (hexDigit1 == '}')
                        {
                            break;
                        }
                        hexDigit1 = (char)source.Read();
                    }


                    read_image_data = false;
                    break;
                }
            }

            if (picture.ImageType != Minor.Undefined && !read_image_data)
            {
                this.picture = picture;
                SetToken(TokenClass.Control, Major.PictAttr, picture.ImageType, 0, String.Empty);
            }
        }