After not much thought it became obvious to me that writing a spell checker for mozilla, or at least integrating one written by someone else, would be orders of magnitude easier than learning to spell. After not much more thought, but a lot more research, I discovered that writing a spell checker was a lot easier than reverse engineering mozilla's infrastructure. I am certainly not ready or willing to declare to the rest of the world that I am even working on it, but I do need some advice on how to proceed.
Currently, I have a class that will read a bunch of words from a file into a hash table and is able to check to see if a word is in the hash table. I haven't yet tied the checking engine to the TextServicesDocument, but that seems straightforward enough, given that I have find and replace to copy from. I have no doubt that I can add getting a list of suggested words, affix compression, and any other spell checky goodness desired without too much trouble, but it seems like now is the time to figure out how to do things right, before I have to redo everything. I have three categories of questions, first, questions about the spell checker itself, second, questions about the mozilla infrastructure, specifically files and strings, and finally questions about I18n. Spell checking: 1) Where do dictionaries go? Both default and personal. I have the system dictionaries living in defaults/dictionaries. 2) Where does the spell checker go? I have included it in editor/txtsvc, but I suspect that it should live in its own module, probably somewhere in the extensions hierarchy. 4) Should NextMispelled word call SetSelection and ScrollSelectionIntoView? Probably. 3) How are you supposed to signal no spelling errors in NextMisspelledWord? Leaving the word parameter blank and returning NS_OK seems to work but is it intended? 4) Should Replace wrap if we are replacing all occurrences? Probably not. 5) How should multiple dictionaries work It seems that if I populate the StringArray, this has no effect on the combo box. How should it be working? Infrastructure. 6) Strings. Is there any more documentation than http://lxr.mozilla.org/seamonkey/source/string/doc/string-guide.html for the new strings? Is there a stretch of code that exercises them elegantly? Till then I am using the old strings, there are more examples of their use. 7) Files. Is there any documentation other than header files on the stuff in xpcom/io? to open the dictionary I do nsCOMPtr<nsIFile> aFile; res = NS_GetSpecialDirectory(NS_APP_DEFAULTS_50_DIR, getter_AddRefs(aFile)); if (NS_FAILED(res)) return res; res = aFile->Append("dictionaries"); if (NS_FAILED(res)) return res; nsXPIDLCString pathBuf; aFile->GetPath(getter_Copies(pathBuf)); nsCOMPtr<nsIFileSpec> tempSpec; res = NS_NewFileSpec(getter_AddRefs(tempSpec)); if (NS_FAILED(res)) return res; res = tempSpec->SetNativePath(pathBuf); if (NS_FAILED(res)) return res; nsFileSpec dirSpec; res = tempSpec->GetFileSpec(&dirSpec); if (NS_FAILED(res)) return res; nsAutoString hashName(dictName); hashName.AppendWithConversion(".dic"); nsInputFileStream strm(dirSpec+hashName); I can almost certainly do without the nsIFileSpec -> FileSpec conversion, but is the rest of that necessary, or even safe. This was copied more or less from the cookie code, so it should work. I18N 8) Are there equivalents to the ctype functions for unicode that should be used. At least for western languages isalpha and isupper and is lower are useful for spell checkers. 9) Is there some documentation/examples on the character conversion routines? I will need to be able to convert words from unicode to whatever charset the dictionary is in and back. Right now I am just happily using ascii, and that is easy to convert, and more than sufficient for a USAian dictionary.
