Esempio n. 1
0
            /// <summary>
            /// Comienza el análisis del documento RTF y provoca la llamada a los distintos métodos
            /// del objeto IRtfReader indicado en el constructor de la clase.
            /// </summary>
            /// <returns>
            /// Resultado del análisis del documento. Si la carga se realiza correctamente
            /// se devuelve el valor 0.
            /// </returns>
            public int Parse()
            {
                //Resultado del análisis
                int res = 0;

                //Comienza el documento
                reader.StartRtfDocument();

                //Se obtiene el primer token
                tok = lex.NextToken();

                while (tok.Type != RtfTokenType.Eof)
                {
                    switch (tok.Type)
                    {
                    case RtfTokenType.GroupStart:
                        reader.StartRtfGroup();
                        break;

                    case RtfTokenType.GroupEnd:
                        reader.EndRtfGroup();
                        break;

                    case RtfTokenType.Keyword:
                        reader.RtfKeyword(tok.Key, tok.HasParameter, tok.Parameter);
                        break;

                    case RtfTokenType.Control:
                        reader.RtfControl(tok.Key, tok.HasParameter, tok.Parameter);
                        break;

                    case RtfTokenType.Text:
                        reader.RtfText(tok.Key);
                        break;

                    default:
                        res = -1;
                        break;
                    }

                    //Se obtiene el siguiente token
                    tok = lex.NextToken();
                }

                //Finaliza el documento
                reader.EndRtfDocument();

                //Se cierra el stream
                rtf.Close();

                return(res);
            }
Esempio n. 2
0
            /// <summary>
            /// Obtiene el siguiente elemento del documento.
            /// </summary>
            /// <returns>Siguiente elemento del documento.</returns>
            public int Next()
            {
                tok = lex.NextToken();

                switch (tok.Type)
                {
                case RtfTokenType.GroupStart:
                    currentEvent = START_GROUP;
                    break;

                case RtfTokenType.GroupEnd:
                    currentEvent = END_GROUP;
                    break;

                case RtfTokenType.Keyword:
                    currentEvent = KEYWORD;
                    break;

                case RtfTokenType.Control:
                    currentEvent = CONTROL;
                    break;

                case RtfTokenType.Text:
                    currentEvent = TEXT;
                    break;

                case RtfTokenType.Eof:
                    currentEvent = END_DOCUMENT;
                    break;
                }

                return(currentEvent);
            }
Esempio n. 3
0
            /// <summary>
            /// Analiza el documento y lo carga con estructura de árbol.
            /// </summary>
            /// <returns>Se devuelve el valor 0 en caso de no producirse ningún error en la carga del documento.
            /// En caso contrario se devuelve el valor -1.</returns>
            private int parseRtfTree()
            {
                //Resultado de la carga del documento
                int res = 0;

                //Codificación por defecto del documento
                Encoding encoding = Encoding.Default;

                //Nodo actual
                RtfTreeNode curNode = rootNode;

                //Nuevos nodos para construir el árbol RTF
                RtfTreeNode newNode = null;

                //Se obtiene el primer token
                tok = lex.NextToken();

                while (tok.Type != RtfTokenType.Eof)
                {
                    switch (tok.Type)
                    {
                    case RtfTokenType.GroupStart:
                        newNode = new RtfTreeNode(RtfNodeType.Group, "GROUP", false, 0);
                        curNode.AppendChild(newNode);
                        curNode = newNode;
                        level++;
                        break;

                    case RtfTokenType.GroupEnd:
                        curNode = curNode.ParentNode;
                        level--;
                        break;

                    case RtfTokenType.Keyword:
                    case RtfTokenType.Control:
                    case RtfTokenType.Text:
                        if (mergeSpecialCharacters)
                        {
                            //Contributed by Jan Stuchlík
                            bool isText = tok.Type == RtfTokenType.Text || (tok.Type == RtfTokenType.Control && tok.Key == "'");
                            if (curNode.LastChild != null && (curNode.LastChild.NodeType == RtfNodeType.Text && isText))
                            {
                                if (tok.Type == RtfTokenType.Text)
                                {
                                    curNode.LastChild.NodeKey += tok.Key;
                                    break;
                                }
                                if (tok.Type == RtfTokenType.Control && tok.Key == "'")
                                {
                                    curNode.LastChild.NodeKey += DecodeControlChar(tok.Parameter, encoding);
                                    break;
                                }
                            }
                            else
                            {
                                //Primer caracter especial \'
                                if (tok.Type == RtfTokenType.Control && tok.Key == "'")
                                {
                                    newNode = new RtfTreeNode(RtfNodeType.Text, DecodeControlChar(tok.Parameter, encoding), false, 0);
                                    curNode.AppendChild(newNode);
                                    break;
                                }
                            }
                        }

                        newNode = new RtfTreeNode(tok);
                        curNode.AppendChild(newNode);

                        if (mergeSpecialCharacters)
                        {
                            //Contributed by Jan Stuchlík
                            if (level == 1 && newNode.NodeType == RtfNodeType.Keyword && newNode.NodeKey == "ansicpg")
                            {
                                encoding = Encoding.GetEncoding(newNode.Parameter);
                            }
                        }

                        break;

                    default:
                        res = -1;
                        break;
                    }

                    //Se obtiene el siguiente token
                    tok = lex.NextToken();
                }

                //Si el nivel actual no es 0 ( == Algun grupo no está bien formado )
                if (level != 0)
                {
                    res = -1;
                }

                //Se devuelve el resultado de la carga
                return(res);
            }