/// <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); }
/// <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); }
/// <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); }