/// <summary> /// 傳回點字頁尾。 /// </summary> /// <param name="lineIdx">目前列印的列索引。用來計算頁尾的文件標題。</param> /// <param name="pageNum">頁碼。</param> /// <param name="beginOrgPageNum">起始原書頁碼。</param> /// <param name="endOrgPageNum">終止原書頁碼。</param> /// <returns></returns> /// <remarks>注意:點字頁碼的 # 號要固定印在第 37 方的位置(requested by 秋華)</remarks> private string GetBraillePageFoot(int lineIdx, int pageNum, int beginOrgPageNum, int endOrgPageNum) { StringBuilder sb = new StringBuilder(); StringBuilder sbPageNum = new StringBuilder(); // 標題 BrailleLine titleLine = m_BrDoc.GetPageTitle(lineIdx); string title = BrailleCharConverter.ToString(titleLine); // 原書頁碼 if (beginOrgPageNum >= 0) { string orgPageNum = ""; if (endOrgPageNum < 0) { orgPageNum = BrailleCharConverter.GetDigitCharCode(beginOrgPageNum, true); } else { if (beginOrgPageNum == endOrgPageNum) { orgPageNum = BrailleCharConverter.GetDigitCharCode(beginOrgPageNum, true); } else { orgPageNum = BrailleCharConverter.GetDigitCharCode(beginOrgPageNum, true) + BrailleCharConverter.ToChar(BrailleCell.DotsToByte(3, 6).ToString("X2")) + BrailleCharConverter.GetDigitCharCode(endOrgPageNum, true); } } sbPageNum.Append('#'); // 數字點 sbPageNum.Append(orgPageNum); // 原書頁碼 sbPageNum.Append(' '); // 空方 } sbPageNum.Append('#'); // 數字點 string pageNumStr = BrailleCharConverter.GetDigitCharCode(pageNum, true); sbPageNum.Append(pageNumStr.PadRight(3)); // 點字頁碼的數字部分固定佔三方,亦即 # 固定在第 37 方的位置 // 計算剩餘可容納標題的空間。 int roomForTitle = m_BrDoc.CellsPerLine - sbPageNum.Length - 1; // 多留一個空白 if (title.Length > roomForTitle) { title = title.Substring(0, roomForTitle); } else { title = title.PadRight(roomForTitle); } sb.Append(title); // 標題 sb.Append(' '); // 空方 sb.Append(sbPageNum.ToString()); // 原書頁碼、點字頁碼 return(sb.ToString()); }
private void btnConvert_Click(object sender, EventArgs e) { int[] dots = new int[txtDots.Text.Length]; for (int i = 0; i < txtDots.Text.Length && i < 8; i++) { dots[i] = Convert.ToInt32(new string(txtDots.Text[i], 1)); } byte value = BrailleCell.DotsToByte(dots); txtByte.Text = String.Format("{0:X}", value); }
/// <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); }