diff options
Diffstat (limited to 'src/Document.cxx')
-rw-r--r-- | src/Document.cxx | 62 |
1 files changed, 23 insertions, 39 deletions
diff --git a/src/Document.cxx b/src/Document.cxx index a88468cb1..92be92691 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -15,6 +15,7 @@ #include "Scintilla.h" #include "SVector.h" #include "CellBuffer.h" +#include "CharClassify.h" #include "Document.h" #include "RESearch.h" @@ -50,7 +51,6 @@ Document::Document() { stylingBits = 5; stylingBitsMask = 0x1F; stylingMask = 0; - SetDefaultCharClasses(true); endStyled = 0; styleClock = 0; enteredCount = 0; @@ -836,10 +836,10 @@ int Document::ParaDown(int pos) { return LineEnd(line-1); } -Document::charClassification Document::WordCharClass(unsigned char ch) { +CharClassify::cc Document::WordCharClass(unsigned char ch) { if ((SC_CP_UTF8 == dbcsCodePage) && (ch >= 0x80)) - return ccWord; - return charClass[ch]; + return CharClassify::ccWord; + return charClass.GetClass(ch); } /** @@ -847,7 +847,7 @@ Document::charClassification Document::WordCharClass(unsigned char ch) { * Finds the start of word at pos when delta < 0 or the end of the word when delta >= 0. */ int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) { - charClassification ccStart = ccWord; + CharClassify::cc ccStart = CharClassify::ccWord; if (delta < 0) { if (!onlyWordCharacters) ccStart = WordCharClass(cb.CharAt(pos-1)); @@ -871,19 +871,19 @@ int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) { */ int Document::NextWordStart(int pos, int delta) { if (delta < 0) { - while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccSpace)) + while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace)) pos--; if (pos > 0) { - charClassification ccStart = WordCharClass(cb.CharAt(pos-1)); + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1)); while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) { pos--; } } } else { - charClassification ccStart = WordCharClass(cb.CharAt(pos)); + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos)); while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart)) pos++; - while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccSpace)) + while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace)) pos++; } return pos; @@ -899,22 +899,22 @@ int Document::NextWordStart(int pos, int delta) { int Document::NextWordEnd(int pos, int delta) { if (delta < 0) { if (pos > 0) { - charClassification ccStart = WordCharClass(cb.CharAt(pos-1)); - if (ccStart != ccSpace) { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1)); + if (ccStart != CharClassify::ccSpace) { while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccStart) { pos--; } } - while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccSpace) { + while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace) { pos--; } } } else { - while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccSpace) { + while (pos < Length() && WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace) { pos++; } if (pos < Length()) { - charClassification ccStart = WordCharClass(cb.CharAt(pos)); + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos)); while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccStart) { pos++; } @@ -929,8 +929,8 @@ int Document::NextWordEnd(int pos, int delta) { */ bool Document::IsWordStartAt(int pos) { if (pos > 0) { - charClassification ccPos = WordCharClass(CharAt(pos)); - return (ccPos == ccWord || ccPos == ccPunctuation) && + CharClassify::cc ccPos = WordCharClass(CharAt(pos)); + return (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) && (ccPos != WordCharClass(CharAt(pos - 1))); } return true; @@ -942,8 +942,8 @@ bool Document::IsWordStartAt(int pos) { */ bool Document::IsWordEndAt(int pos) { if (pos < Length()) { - charClassification ccPrev = WordCharClass(CharAt(pos-1)); - return (ccPrev == ccWord || ccPrev == ccPunctuation) && + CharClassify::cc ccPrev = WordCharClass(CharAt(pos-1)); + return (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) && (ccPrev != WordCharClass(CharAt(pos))); } return true; @@ -1004,7 +1004,7 @@ long Document::FindText(int minPos, int maxPos, const char *s, int *length) { if (regExp) { if (!pre) - pre = new RESearch(); + pre = new RESearch(&charClass); if (!pre) return -1; @@ -1266,27 +1266,11 @@ void Document::ChangeCase(Range r, bool makeUpperCase) { } void Document::SetDefaultCharClasses(bool includeWordClass) { - // Initialize all char classes to default values - for (int ch = 0; ch < 256; ch++) { - if (ch == '\r' || ch == '\n') - charClass[ch] = ccNewLine; - else if (ch < 0x20 || ch == ' ') - charClass[ch] = ccSpace; - else if (includeWordClass && (ch >= 0x80 || isalnum(ch) || ch == '_')) - charClass[ch] = ccWord; - else - charClass[ch] = ccPunctuation; - } + charClass.SetDefaultCharClasses(includeWordClass); } -void Document::SetCharClasses(const unsigned char *chars, charClassification newCharClass) { - // Apply the newCharClass to the specifed chars - if (chars) { - while (*chars) { - charClass[*chars] = newCharClass; - chars++; - } - } +void Document::SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass) { + charClass.SetCharClasses(chars, newCharClass); } void Document::SetStylingBits(int bits) { @@ -1430,7 +1414,7 @@ void Document::NotifyModified(DocModification mh) { } bool Document::IsWordPartSeparator(char ch) { - return (WordCharClass(ch) == ccWord) && IsPunctuation(ch); + return (WordCharClass(ch) == CharClassify::ccWord) && IsPunctuation(ch); } int Document::WordPartLeft(int pos) { |