Пример #1
0
        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());
        }
Пример #2
0
        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);
        }