int CSuggestor::CheckAndAdd(const CFSWString &szWord) { if (m_fTimeOut>0 && (CFSTime::Now()-m_TimeStart).GetSeconds()>=m_fTimeOut) return -1; if (szWord.IsEmpty()) return -1; CFSWString szTemp; long lLevel=100; if (SpellWord(szWord, szTemp, &lLevel)==SPL_NOERROR && !szTemp.IsEmpty()){ szTemp=m_Cap.GetCap(szTemp); CFSWString szTemp2; long lLevel2; if (SpellWord(szTemp, szTemp2, &lLevel2)==SPL_NOERROR){ SetLevel(GetLevelGroup(lLevel)); m_Items.AddItem(CSuggestorItem(szTemp, lLevel)); return 0; } } return -1; }
void RichEdit::SpellerAdd(const WString& w, int lang) { if(!SpellWord(w, w.GetCount(), lang)) { Speller *f = sGetSpeller(lang); if(f) { FileAppend fa(sUserFile(lang)); fa.PutLine(ToUtf8(w)); f->user.Add(w); speller_cache.Clear(); } } }
Bits RichEdit::SpellParagraph(const RichPara& para) { int len = para.GetLength(); Buffer<wchar> text(len); Buffer<int> lang(len); wchar *s = text; int *g = lang; for(int i = 0; i < para.GetCount(); i++) { const RichPara::Part& p = para[i]; if(p.IsText()) { int l = p.text.GetLength(); memcpy(s, p.text, l * sizeof(wchar)); Fill(g, g + l, fixedlang ? fixedlang : p.format.language); s += l; g += l; } else { *s++ = 127; *g++ = 0; } } Bits e; s = text; wchar *end = text + len; while(s < end) { if(IsLetter(*s)) { const wchar *q = s; while(s < end && IsLetter(*s) || s + 1 < end && *s == '\'' && IsLetter(s[1])) s++; if(!SpellWord(q, int(s - q), lang[q - text])) e.Set(int(q - text), true, int(s - q)); } else s++; } return e; }
int CSuggestor::Suggest(const CFSWString &szWord, bool bStartSentence){ m_TimeStart=CFSTime::Now(); m_Items.Cleanup(); m_Cap.SetCap(szWord); if (bStartSentence && m_Cap.GetCapMode()==CFSStrCap<CFSWString>::CAP_LOWER) { m_Cap.SetCapMode(CFSStrCap<CFSWString>::CAP_INITIAL); } CFSWString szWordHigh=szWord.ToUpper(); INTPTR ipWordLength=szWordHigh.GetLength(); CFSWString szTemp; INTPTR i, j; long lLevel=100; SetLevel(lLevel); // Case problems & change list i=SpellWord(szWordHigh, szTemp, &lLevel); if ((i==SPL_NOERROR || i==SPL_CHANGEONCE) && !szTemp.IsEmpty()){ SetLevel(GetLevelGroup(lLevel)); m_Items.AddItem(CSuggestorItem(szTemp, lLevel)); } else SetLevel(5); // Abbrevations // !!! Unimplemented // Quotes /* if (ipWordLength>=2 && (szAllQuot.Find(szWordHigh[0])>=0 || szAllQuot.Find(szWordHigh[ipWordLength-1])>=0)) { szTemp=szWordHigh; int iPos; if (szAllQuot.Find(szTemp[0])>=0){ if (szQuotLeft.Find(szTemp[0])>=0) { } else if ((iPos=szQuotRight.Find(szTemp[0]))>=0) { szTemp[0]=szQuotLeft[iPos]; } else if (szDQuotLeft.Find(szTemp[0])>=0) { } else if ((iPos=szDQuotRight.Find(szTemp[0]))>=0) { szTemp[0]=szDQuotLeft[iPos]; } if (szAllQuot.Find(szTemp[ipWordLength-1])>=0) { szTemp[ipWordLength-1]=(szQuotRight+szDQuotRight)[(szQuotLeft+szDQuotLeft).Find(szTemp[0])]; } else{ if (szQuotRight.Find(szTemp[ipWordLength-1])>=0) { } else if ((iPos=szQuotLeft.Find(szTemp[ipWordLength-1]))>=0) { szTemp[ipWordLength-1]=szQuotRight[iPos]; } else if (szDQuotRight.Find(szTemp[ipWordLength-1])>=0) { } else if ((iPos=szDQuotLeft.Find(szTemp[ipWordLength-1]))>=0) { szTemp[ipWordLength-1]=szDQuotRight[iPos]; } } CheckAndAdd(szTemp); }*/ // Add space for (i=1; i<ipWordLength-1; i++){ static CFSWString szPunktuation=FSWSTR(".:,;!?"); if (szPunktuation.Find(szWord[i])>=0){ long lLevel1, lLevel2; CFSWString szTemp1, szTemp2; if (SpellWord(szWord.Left(i+1), szTemp1, &lLevel1)==SPL_NOERROR && SpellWord(szWord.Mid(i+1), szTemp2, &lLevel2)==SPL_NOERROR) { m_Items.AddItem(CSuggestorItem(szWord.Left(i+1)+L' '+szWord.Mid(i+1), FSMAX(lLevel1, lLevel2))); } } } // Delete following blocks: le[nnu][nnu]jaam for (i=2; i<=3; i++){ for (j=0; j<ipWordLength-i-i; j++){ if (memcmp((const FSWCHAR *)szWordHigh+j, (const FSWCHAR *)szWordHigh+j+i, i*sizeof(FSWCHAR))==0){ szTemp=szWordHigh.Left(j)+szWordHigh.Mid(j+i); CheckAndAdd(szTemp); } } } // Change following letters: abb -> aab & aab -> abb for (i=1; i<ipWordLength-1; i++){ if (szWordHigh[i]==szWordHigh[i+1]){ szTemp=szWordHigh; szTemp[i]=szTemp[i-1]; if (FSIsLetterEst(szTemp[i])) CheckAndAdd(szTemp); } else if (szWordHigh[i]==szWordHigh[i-1]){ szTemp=szWordHigh; szTemp[i]=szTemp[i+1]; if (FSIsLetterEst(szTemp[i])) CheckAndAdd(szTemp); } } // Exchange letters: van[na]ema -> van[an]ema szTemp=szWordHigh; for (i=1; i<ipWordLength; i++){ if (szTemp[i]!=szTemp[i-1]){ FSWCHAR ch=szTemp[i]; szTemp[i]=szTemp[i-1]; szTemp[i-1]=ch; CheckAndAdd(szTemp); szTemp[i-1]=szTemp[i]; szTemp[i]=ch; } } // Change blocks for (i=0; i<ipWordLength; i++){ for (j=0; j<(INTPTR)(sizeof(ChangeStrings)/sizeof(__CChangeStrings)); j++){ if (szWordHigh.ContainsAt(i, ChangeStrings[j].m_lpszFrom)){ szTemp=szWordHigh.Left(i)+ChangeStrings[j].m_lpszTo+szWordHigh.Mid(i+FSStrLen(ChangeStrings[j].m_lpszFrom)); CheckAndAdd(szTemp); } } } // Change end blocks for (i=0; i<(INTPTR)(sizeof(ChangeStringsEnd)/sizeof(__CChangeStrings)); i++){ if (szWordHigh.EndsWith(ChangeStringsEnd[i].m_lpszFrom)){ szTemp=szWordHigh.Left(ipWordLength-FSStrLen(ChangeStringsEnd[i].m_lpszFrom))+ChangeStringsEnd[i].m_lpszTo; CheckAndAdd(szTemp); } } // Po~o~sas MultiReplace(szWordHigh, 0); // gi/ki: Kylli[gi]le -> Kyllile[gi] for (i=3; i<=6; i++){ if (i>ipWordLength) break; if (memcmp((const FSWCHAR *)szWordHigh+ipWordLength-i, FSWSTR("GI"), 2*sizeof(FSWCHAR))==0){ szTemp=szWordHigh.Left(ipWordLength-i)+szWordHigh.Mid(ipWordLength-i+2)+FSWSTR("GI"); CheckAndAdd(szTemp); szTemp=szWordHigh.Left(ipWordLength-i)+szWordHigh.Mid(ipWordLength-i+2)+FSWSTR("KI"); CheckAndAdd(szTemp); } } // Delete letters: van[n]aema -> vanaema szTemp=szWordHigh.Mid(1); CheckAndAdd(szTemp); for (i=0; i<ipWordLength-1; i++){ if (szTemp[i]!=szWordHigh[i]){ szTemp[i]=szWordHigh[i]; CheckAndAdd(szTemp); } } // Change letters from list for (i=0; i<ipWordLength; i++){ const FSWCHAR *lpszTo=__SuggestChangeLetters(szWordHigh[i]); if (!lpszTo) continue; szTemp=szWordHigh; for (; lpszTo[0]; lpszTo++){ szTemp[i]=lpszTo[0]; CheckAndAdd(szTemp); } } // Insert letters to word body for (i=1; i<ipWordLength; i++){ szTemp=szWordHigh.Left(i)+FSWSTR(' ')+szWordHigh.Mid(i); for (j=0; szInsertLetters[j]; j++){ szTemp[i]=szInsertLetters[j]; CheckAndAdd(szTemp); } } // Insert letters to the beginning szTemp=CFSWString(FSWSTR(" "))+szWordHigh; for (i=0; szInsertLettersBeg[i]; i++){ if (szTemp[1]==szInsertLettersBeg[i]) continue; szTemp[0]=szInsertLettersBeg[i]; CheckAndAdd(szTemp); } // Try apostrophe for names if (szWord[0]!=szWordHigh[0] && szWordHigh.Find('\'')<0){ for (i=0; i<5; i++){ if (i>=ipWordLength) break; szTemp=szWordHigh.Left(ipWordLength-i)+L'\''+szWordHigh.Mid(ipWordLength-i); CheckAndAdd(szTemp); } } Order(); RemoveImmoderate(); RemoveDuplicates(); return 0; }
bool SpellWord(const wchar *ws, int len, int lang) { return SpellWord(WString(ws, len), lang); }
void RichEdit::StdBar(Bar& menu) { int l, h; Id field; String fieldparam; String ofieldparam; RichObject object; if(GetSelection(l, h)) { CopyTool(menu); CutTool(menu); PasteTool(menu); } else { if(objectpos >= 0) { bar_object = GetObject(); if(!bar_object) return; bar_object.Menu(menu, context); if(!menu.IsEmpty()) menu.Separator(); Size sz = bar_object.GetPhysicalSize(); bool b = sz.cx || sz.cy; menu.Add(t_("Object position.."), THISBACK(AdjustObjectSize)); menu.Separator(); menu.Add(b, "20 %", THISBACK1(SetObjectPercent, 20)); menu.Add(b, "40 %", THISBACK1(SetObjectPercent, 40)); menu.Add(b, "60 %", THISBACK1(SetObjectPercent, 60)); menu.Add(b, "80 %", THISBACK1(SetObjectPercent, 80)); menu.Add(b, "90 %", THISBACK1(SetObjectPercent, 90)); menu.Add(b, "100 %", THISBACK1(SetObjectPercent, 100)); menu.Break(); menu.Add(t_("3 pt up"), THISBACK1(SetObjectYDelta, -3)); menu.Add(t_("2 pt up"), THISBACK1(SetObjectYDelta, -2)); menu.Add(t_("1 pt up"), THISBACK1(SetObjectYDelta, -1)); menu.Add(t_("Baseline"), THISBACK1(SetObjectYDelta, 0)); menu.Add(t_("1 pt down"), THISBACK1(SetObjectYDelta, 1)); menu.Add(t_("2 pt down"), THISBACK1(SetObjectYDelta, 2)); menu.Add(t_("3 pt down"), THISBACK1(SetObjectYDelta, 3)); menu.Separator(); CopyTool(menu); CutTool(menu); } else { RichPos p = cursorp; field = p.field; bar_fieldparam = p.fieldparam; RichPara::FieldType *ft = RichPara::fieldtype().Get(field, NULL); if(ft) { ft->Menu(menu, &bar_fieldparam); if(!menu.IsEmpty()) menu.Separator(); CopyTool(menu); CutTool(menu); } else { WString w = GetWordAtCursor(); if(!w.IsEmpty() && !SpellWord(w, w.GetLength(), fixedlang ? fixedlang : formatinfo.language)) { menu.Add(t_("Add to user dictionary"), THISBACK(AddUserDict)); menu.Separator(); } PasteTool(menu); ObjectTool(menu); } } LoadImageTool(menu); } }