/// <summary> /// 把編號的數字修正成上位點。 /// 注意:此函式會把點字串列中的 # 點字物件刪除。 /// </summary> /// <param name="brLine"></param> public static void FixNumbers(BrailleLine brLine, EnglishBrailleTable brTable) { BrailleWord brWord; bool isNumberMode = false; string brCode; int index = 0; while (index < brLine.WordCount) { brWord = brLine[index]; if (brWord.Text == "#") { isNumberMode = true; brLine.Words.RemoveAt(index); continue; } if (Char.IsDigit(brWord.Text[0])) { if (isNumberMode) { // 把編號的數字改成上位點。 brCode = brTable.FindDigit(brWord.Text, true); if (brWord.Cells.Count > 1) // 第 0 個 cell 可能是數字記號。 { brWord.Cells[1] = BrailleCell.GetInstance(brCode); } else { brWord.Cells[0] = BrailleCell.GetInstance(brCode); } } } else { if (isNumberMode && brWord.Text != "." && brWord.Text != "-" && brWord.Text != ",") { isNumberMode = false; } } index++; } }
/// <summary> /// 把英數字轉換成點字。 /// </summary> /// <param name="text">一個英數字或英文標點符號。</param> /// <returns>若指定的字串是中文字且轉換成功,則傳回轉換之後的點字物件,否則傳回 null。</returns> private BrailleWord InternalConvert(string text) { if (String.IsNullOrEmpty(text)) { return(null); } BrailleWord brWord = new BrailleWord(); brWord.Text = text; string brCode = null; // 如果是刪節號 if (text == "...") { brCode = m_Table.Find(text); brWord.AddCell(brCode); return(brWord); } // 處理英文字母和數字。 if (text.Length == 1) { char ch = text[0]; if (CharHelper.IsAsciiLetter(ch)) { brCode = m_Table.FindLetter(text); if (!String.IsNullOrEmpty(brCode)) { brWord.AddCell(brCode); return(brWord); // 註:大寫記號和連續大寫記號在完成一行之後才處理。 } throw new Exception("找不到對應的點字: " + text); } if (CharHelper.IsAsciiDigit(ch)) { brCode = m_Table.FindDigit(text, false); // 一般數字取下位點。 if (!String.IsNullOrEmpty(brCode)) { brWord.AddCell(brCode); return(brWord); } throw new Exception("找不到對應的點字: " + text); } } // 處理編號。 if (text == "#") { // # 沒有對應的點字碼,只是用它來代表編號數字的開始, // 以便後續處理編號用(將編號數字轉成上位點)。 return(brWord); } brCode = m_Table.Find(text); if (!String.IsNullOrEmpty(brCode)) { brWord.AddCell(brCode); return(brWord); } brWord = null; return(null); }