/// <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());
        }
Beispiel #2
0
        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);
        }
Beispiel #3
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);
        }
Beispiel #4
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);
        }