示例#1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="charStack"></param>
        /// <param name="context"></param>
        /// <remarks>由於上、中、下的橫線在明眼字都是以相同的符號表示,可是點字卻不同,因此程式要特別處理:
        /// 每當碰到表格左邊的特定符號時,就設定橫線類型的旗號。</remarks>
        /// <returns></returns>
        public override List <BrailleWord> Convert(Stack <char> charStack, ContextTagManager context)
        {
            if (charStack.Count < 1)
            {
                throw new ArgumentException("傳入空的字元堆疊!");
            }

            bool               done = false;
            char               ch;
            string             text;
            bool               isExtracted;     // 目前處理的字元是否已從堆疊中移出。
            BrailleWord        brWord;
            List <BrailleWord> brWordList = null;

            BarType barType = BarType.Middle;                   // 橫線的種類

            while (!done && charStack.Count > 0)
            {
                ch          = charStack.Peek();          // 只讀取但不從堆疊移走。
                isExtracted = false;

                switch (ch)
                {
                case '┌':
                    barType = BarType.Top;
                    break;

                case '└':
                    barType = BarType.Bottom;
                    break;

                case '├':
                case '│':                               // 左直線
                    barType = BarType.Middle;
                    break;

                default:
                    break;
                }

                text = ch.ToString();

                brWord = base.ConvertToBrailleWord(text);

                if (brWord == null)
                {
                    break;
                }

                // 調整橫線的點字
                if ("─".Equals(brWord.Text))
                {
                    string cellCode;

                    if (barType == BarType.Top)
                    {
                        cellCode        = m_Table["‾"];
                        brWord.Cells[0] = BrailleCell.GetInstance(cellCode);
                    }
                    else if (barType == BarType.Bottom)
                    {
                        cellCode        = m_Table["ˍ"];
                        brWord.Cells[0] = BrailleCell.GetInstance(cellCode);
                    }
                }

                if (!isExtracted)
                {
                    charStack.Pop();
                }

                if (brWordList == null)
                {
                    brWordList = new List <BrailleWord>();
                }
                brWordList.Add(brWord);
            }
            return(brWordList);
        }
示例#2
0
        /// <summary>
        /// 從堆疊中讀取字元,把 ASCII 字元(半形的英數字)轉換成點字。
        /// </summary>
        /// <param name="charStack">輸入的 ASCII 字元堆疊。</param>
        /// <param name="context">情境物件。</param>
        /// <returns>傳回轉換後的點字物件串列,若串列為空串列,表示沒有成功轉換的字元。</returns>
        public override List <BrailleWord> Convert(Stack <char> charStack, ContextTagManager context)
        {
            if (charStack.Count < 1)
            {
                throw new ArgumentException("傳入空的字元堆疊!");
            }

            bool               done = false;
            char               ch;
            string             text;
            bool               isExtracted;     // 目前處理的字元是否已從堆疊中移出。
            BrailleWord        brWord;
            List <BrailleWord> brWordList = null;

            while (!done && charStack.Count > 0)
            {
                ch          = charStack.Peek(); // 只讀取但不從堆疊移走。
                isExtracted = false;

                // 如果在數學區塊中
                if (context.IsActive(ContextTagNames.Math))
                {
                    if (ch == '*' || ch == '.' || ch == ':')
                    {
                        break;                          // 以上符號須交給 MathConverter 處理。
                    }
                }

                // 如果在座標區塊中,'('、',' 和 ')' 必須交給 CoordinateConverter 處理。
                if (context.IsActive(ContextTagNames.Coordinate))
                {
                    if (ch == '(' || ch == ',' || ch == ')')
                    {
                        break;
                    }
                }

                // 如果是半形小於符號,先檢查是否為情境標籤。
                if (ch == '<')
                {
                    char[] charBuf = charStack.ToArray();
                    string s       = new string(charBuf);
                    if (ContextTag.StartsWithContextTag(s))
                    {
                        break;  // 情境標籤必須交給 ContextTagConverter 處理。
                    }
                }

                text = ch.ToString();

                // 處理特殊字元。
                isExtracted = ProcessSpecialEntity(charStack, ref text);

                if (!isExtracted)
                {
                    // 處理刪節號。
                    if (ch == '.' && charStack.Count >= 3)
                    {
                        charStack.Pop();
                        char ch2 = charStack.Pop();
                        char ch3 = charStack.Pop();
                        if (ch2 == '.' && ch3 == '.')   // 連續三個點: 刪節號
                        {
                            isExtracted = true;
                            text        = "...";
                        }
                        else
                        {
                            charStack.Push(ch3);
                            charStack.Push(ch2);
                            charStack.Push(ch);
                            isExtracted = false;
                        }
                    }
                    // Tab 字元視為一個空白。
                    if (ch == '\t')
                    {
                        text = " ";
                    }
                }

                brWord = InternalConvert(text);
                if (brWord == null)
                {
                    break;
                }

                if (!isExtracted)
                {
                    charStack.Pop();
                }

                brWord.Language = BrailleLanguage.English;

                if (context.IsActive(ContextTagNames.Coordinate))   // 若處於座標情境標籤內
                {
                    // 不加數字點位。
                    brWord.NoDigitCell = true;
                }
                else if (":".Equals(text) && context.IsActive(ContextTagNames.Time))                    // 處理時間的冒號。
                {
                    // 在冒號的點字前面加上 456 點。
                    BrailleCell cell = BrailleCell.GetInstance(new int[] { 4, 5, 6 });
                    brWord.Cells.Insert(0, cell);
                }

                if (brWordList == null)
                {
                    brWordList = new List <BrailleWord>();
                }
                brWordList.Add(brWord);
            }
            return(brWordList);
        }