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