private string ExtractArgument() { //Extracts text delimited by BraceStart and BraceEnd //First char must be a BraceStart int aByte = -1; char ch; StringBuilder str_ctrl_word = new StringBuilder(); int counter = 1; aByte = TextReader.Read(); if (aByte == -1) { return(String.Empty); } ch = (char)aByte; TeXControlWordType ctrl_word_type = TeXControlWordType.Find(ch); if (ctrl_word_type.Types != TeXControlWordType.Type.BraceStart) { return(String.Empty); } while (aByte != -1 && counter != 0) { aByte = TextReader.Read(); ch = (char)aByte; ctrl_word_type = TeXControlWordType.Find(ch); if (ctrl_word_type.Types == TeXControlWordType.Type.BraceStart) { counter++; } else if (ctrl_word_type.Types == TeXControlWordType.Type.BraceEnd) { counter--; } // Comment character -> skip to the end of line else if (ctrl_word_type.Types == TeXControlWordType.Type.Comment) { TextReader.ReadLine(); } else if (counter > 0) { str_ctrl_word.Append(ch); } } return(str_ctrl_word.ToString()); }
private ErrorCodes HandleControlWord(string str_ctrl_word) { string str_temp; TeXControlWordType new_ctrl_word_type; TeXControlWordType ctrl_word_type = TeXControlWordType.Find(str_ctrl_word.ToString()); switch (ctrl_word_type.Types) { case TeXControlWordType.Type.MetaDataTag: if (env_data_stack.Count > 0) { str_temp = (string)env_data_stack.Peek(); new_ctrl_word_type = TeXControlWordType.Find(str_temp); switch (new_ctrl_word_type.Types) { case TeXControlWordType.Type.BlockBegin: AppendWord(str_block_sb.ToString()); str_block_sb.Length = 0; break; case TeXControlWordType.Type.BlockEnd: str_temp = str_block_sb.ToString().Trim(); AddProperty(Beagle.Property.New("dc:" + str_ctrl_word, str_temp)); str_block_sb.Length = 0; /*Assuming everything is fine (closed begin-end pairs), discard 2 * objects (current environment, begin) */ for (int i = 0; i < 2; i++) { env_data_stack.Pop(); } break; default: str_temp = ExtractArgument().Trim(); AddProperty(Beagle.Property.New("dc:" + str_ctrl_word, str_temp)); break; } } else { str_temp = ExtractArgument().Trim(); AddProperty(Beagle.Property.New("dc:" + str_ctrl_word, str_temp)); } break; case TeXControlWordType.Type.EscSeq: break; case TeXControlWordType.Type.BlockBegin: env_data_stack.Push(str_ctrl_word); HandleControlWord(ExtractArgument()); AppendWord(str_block_sb.ToString()); str_block_sb.Length = 0; break; case TeXControlWordType.Type.BlockEnd: env_data_stack.Push(str_ctrl_word); HandleControlWord(ExtractArgument()); break; case TeXControlWordType.Type.Document: if (env_data_stack.Count > 0) { str_temp = (string)env_data_stack.Peek(); new_ctrl_word_type = TeXControlWordType.Find(str_temp); switch (new_ctrl_word_type.Types) { case TeXControlWordType.Type.BlockBegin: //TeX files have no document environment, so the following //doesn't index them at all. str_block_sb.Length = 0; break; case TeXControlWordType.Type.BlockEnd: AppendWord(str_block_sb.ToString()); str_block_sb.Length = 0; break; default: Log.Error("ERROR: document is a block environment"); break; } } else { Log.Error("ERROR: document is a block environment"); } env_data_stack.Push(str_ctrl_word); break; case TeXControlWordType.Type.Hot: //There needn't exist an enclosing environment (TeX) if (env_data_stack.Count > 0) { str_temp = (string)env_data_stack.Peek(); new_ctrl_word_type = TeXControlWordType.Find(str_temp); switch (new_ctrl_word_type.Types) { case TeXControlWordType.Type.BlockBegin: AppendWord(str_block_sb.ToString()); str_block_sb.Length = 0; break; case TeXControlWordType.Type.BlockEnd: HotUp(); AppendWord(str_block_sb.ToString()); str_block_sb.Length = 0; HotDown(); break; default: HotUp(); //Console.WriteLine("content: {0}, {1}", ExtractArgument(), str_temp); AppendWord(ExtractArgument()); HotDown(); break; } } else { HotUp(); //Console.WriteLine("content: {0}, {1}", ExtractArgument(), str_temp); AppendWord(ExtractArgument()); HotDown(); } break; case TeXControlWordType.Type.Bibitem: ExtractArgument(); break; case TeXControlWordType.Type.None: if (env_data_stack.Count > 0) { new_ctrl_word_type = TeXControlWordType.Find((string)env_data_stack.Peek()); if (new_ctrl_word_type.Types == TeXControlWordType.Type.BlockBegin || new_ctrl_word_type.Types == TeXControlWordType.Type.BlockEnd) { env_data_stack.Pop(); } if (new_ctrl_word_type.Types == TeXControlWordType.Type.MathMode) { str_block_sb.Append("\\" + str_ctrl_word + ' '); } } //Check unknown macros //Console.WriteLine ("Unimplemented macro: {0}", str_ctrl_word.ToString()); break; } return(ErrorCodes.ERROR_TEX_OK); }