[DEV] change in etk::RegExp in std::regex
This commit is contained in:
parent
154351e629
commit
243d7e7494
@ -12,39 +12,39 @@
|
|||||||
<pass1><!-- multiline section & parse all file (now) and when modification retrive previous modification -->
|
<pass1><!-- multiline section & parse all file (now) and when modification retrive previous modification -->
|
||||||
<rule name="my comment multiline doxygen">
|
<rule name="my comment multiline doxygen">
|
||||||
<color>commentDoxygen</color>
|
<color>commentDoxygen</color>
|
||||||
<regex>/\*\*.*(\*/|\e)</regex>
|
<regex>/\*\*(.|\r|\n)*?\*/</regex>
|
||||||
</rule>
|
</rule>
|
||||||
<rule name="code Review">
|
<rule name="code Review">
|
||||||
<color>SYNTAX_ERROR</color>
|
<color>SYNTAX_ERROR</color>
|
||||||
<regex>/\*[ \t]*TODO :.*(\*/|\e)</regex>
|
<regex>/\*[ \t]*TODO :(.|\r|\n)*?\*/</regex>
|
||||||
</rule>
|
</rule>
|
||||||
<rule name="my comment multiline">
|
<rule name="my comment multiline">
|
||||||
<color>comment</color>
|
<color>comment</color>
|
||||||
<regex>/\*.*(\*/|\e)</regex>
|
<regex>/\*(.|\r|\n)*?\*/</regex>
|
||||||
</rule>
|
</rule>
|
||||||
<rule name="my if 0">
|
<rule name="my if 0">
|
||||||
<color>preprocesseur</color>
|
<color>preprocesseur</color>
|
||||||
<regex>#[ \t]*if 0.*#(endif|else)</regex>
|
<regex>#[ \t]*if 0(.|\r|\n)*?#(endif|else)</regex>
|
||||||
</rule>
|
</rule>
|
||||||
<rule name="my preprocesseur">
|
<rule name="my preprocesseur">
|
||||||
<color>preprocesseur</color>
|
<color>preprocesseur</color>
|
||||||
<regex>#(\\[\\\n]|.)*$</regex>
|
<regex>#(\\[\\\n]|.)*</regex>
|
||||||
</rule>
|
</rule>
|
||||||
<rule name="my comment doxygen">
|
<rule name="my comment doxygen">
|
||||||
<color>commentDoxygen</color>
|
<color>commentDoxygen</color>
|
||||||
<regex>//!.*$</regex>
|
<regex>//!.*</regex>
|
||||||
</rule>
|
</rule>
|
||||||
<rule name="my todo comment">
|
<rule name="my todo comment">
|
||||||
<color>SYNTAX_ERROR</color>
|
<color>SYNTAX_ERROR</color>
|
||||||
<regex>//[ \t]*TODO[ \t]*:.*$</regex>
|
<regex>//[ \t]*TODO[ \t]*:.*</regex>
|
||||||
</rule>
|
</rule>
|
||||||
<rule name="my comment">
|
<rule name="my comment">
|
||||||
<color>comment</color>
|
<color>comment</color>
|
||||||
<regex>//.*$</regex>
|
<regex>//.*</regex>
|
||||||
</rule>
|
</rule>
|
||||||
<rule name="doubleQuteText">
|
<rule name="doubleQuteText">
|
||||||
<color>doubleQuoteText</color>
|
<color>doubleQuoteText</color>
|
||||||
<regex>"(\\[\\"]|.)*"</regex><!-- " -->
|
<regex>"(\\[\\"]|.)*"</regex>
|
||||||
</rule>
|
</rule>
|
||||||
<rule name="simpleQuteText">
|
<rule name="simpleQuteText">
|
||||||
<color>doubleQuoteText</color>
|
<color>doubleQuoteText</color>
|
||||||
@ -106,17 +106,15 @@
|
|||||||
<color>functionName</color>
|
<color>functionName</color>
|
||||||
<regex>\@(\w|_)+[ \t]*\(</regex>
|
<regex>\@(\w|_)+[ \t]*\(</regex>
|
||||||
</rule>
|
</rule>
|
||||||
-->
|
|
||||||
<rule name="condition">
|
<rule name="condition">
|
||||||
<color>boolean</color>
|
<color>boolean</color>
|
||||||
<regex>==|<=|>=|!=|<{1,2}|>{1,2}|&&|\{|\}|</regex>
|
<regex>==|<=|>=|!=|<{1,2}|>{1,2}|&&|\{|\}|</regex>
|
||||||
</rule>
|
</rule>
|
||||||
<!-- With all elementes :
|
-->
|
||||||
<rule name="BIG LETTER">
|
<rule name="BIG LETTER">
|
||||||
<color>macro</color>
|
<color>macro</color>
|
||||||
<regex>([A-Z]|_){4,500}</regex>
|
<regex>([A-Z]|_){4,500}</regex>
|
||||||
<elemSubColor id="1">doxElem</elemSubColor>
|
<elemSubColor id="1">doxElem</elemSubColor>
|
||||||
</rule>
|
</rule>
|
||||||
-->
|
|
||||||
</pass2>
|
</pass2>
|
||||||
</EdnLang>
|
</EdnLang>
|
||||||
|
@ -17,33 +17,101 @@
|
|||||||
#undef __class__
|
#undef __class__
|
||||||
#define __class__ "Buffer"
|
#define __class__ "Buffer"
|
||||||
|
|
||||||
|
appl::Buffer::Iterator& appl::Buffer::Iterator::operator++ () {
|
||||||
|
m_value = u32char::Null;
|
||||||
|
if (m_current < 0) {
|
||||||
|
m_current = 0;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
if (m_data != nullptr) {
|
||||||
|
if (m_current < (int64_t)m_data->m_data.size() ) {
|
||||||
|
int8_t nbChar = utf8::theoricLen(m_data->m_data[m_current]);
|
||||||
|
if (nbChar != 0) {
|
||||||
|
m_current+=nbChar;
|
||||||
|
} else {
|
||||||
|
m_current++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m_current >= (int64_t)m_data->m_data.size()) {
|
||||||
|
m_current = m_data->m_data.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
appl::Buffer::Iterator& appl::Buffer::Iterator::operator-- () {
|
||||||
|
m_value = u32char::Null;
|
||||||
|
if (m_data != nullptr) {
|
||||||
|
if (m_current > 0) {
|
||||||
|
int32_t iii = -1;
|
||||||
|
while( utf8::theoricFirst(m_data->m_data[m_current+iii]) == false
|
||||||
|
&& iii >= -6
|
||||||
|
&& m_current-iii>0) {
|
||||||
|
--iii;
|
||||||
|
};
|
||||||
|
m_current += iii;
|
||||||
|
} else {
|
||||||
|
m_current = -1;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
} else {
|
||||||
|
m_current = -1;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
char32_t appl::Buffer::Iterator::operator* () {
|
||||||
|
if (m_value != u32char::Null) {
|
||||||
|
return m_value;
|
||||||
|
}
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
APPL_ERROR("request an element that iterator not link");
|
||||||
|
return m_value;
|
||||||
|
}
|
||||||
|
if ( m_current < 0
|
||||||
|
|| m_current >= (int64_t)m_data->m_data.size()) {
|
||||||
|
APPL_ERROR("request an element out of bounding !!! 0 <= " << m_current << " < " << m_data->m_data.size());
|
||||||
|
return m_value;
|
||||||
|
}
|
||||||
|
char tmpVal[5];
|
||||||
|
memset(tmpVal, 0, sizeof(tmpVal));
|
||||||
|
tmpVal[0] = m_data->m_data[m_current];
|
||||||
|
int8_t nbChar = utf8::theoricLen(tmpVal[0]);
|
||||||
|
for (int32_t iii=1; iii<nbChar && m_current+iii<(int64_t)m_data->m_data.size(); ++iii) {
|
||||||
|
tmpVal[iii] = m_data->m_data[m_current+iii];
|
||||||
|
}
|
||||||
|
// transform ...
|
||||||
|
m_value = utf8::convertChar32(tmpVal);
|
||||||
|
return m_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
appl::Buffer::Iterator appl::Buffer::position(int64_t _pos) {
|
appl::Buffer::Iterator appl::Buffer::position(int64_t _pos) {
|
||||||
return m_data.begin() + _pos;
|
return appl::Buffer::Iterator(this, _pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
appl::Buffer::Iterator appl::Buffer::begin() {
|
appl::Buffer::Iterator appl::Buffer::begin() {
|
||||||
return m_data.begin();
|
return position(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
appl::Buffer::Iterator appl::Buffer::end() {
|
appl::Buffer::Iterator appl::Buffer::end() {
|
||||||
// TODO : chek the validity of the char ...
|
// TODO : chek the validity of the char ...
|
||||||
return m_data.end();
|
return position( m_data.size() );
|
||||||
}
|
}
|
||||||
|
|
||||||
appl::Buffer::Iterator appl::Buffer::cursor() {
|
appl::Buffer::Iterator appl::Buffer::cursor() {
|
||||||
if (m_cursorPos<= 0) {
|
if (m_cursorPos<= 0) {
|
||||||
return m_data.begin();
|
return begin();
|
||||||
}
|
}
|
||||||
return m_data.begin() + m_cursorPos;
|
return position( m_cursorPos );
|
||||||
}
|
}
|
||||||
|
|
||||||
appl::Buffer::Iterator appl::Buffer::selectStart() {
|
appl::Buffer::Iterator appl::Buffer::selectStart() {
|
||||||
return m_data.begin() + getStartSelectionPos();
|
return position( getStartSelectionPos() );
|
||||||
}
|
}
|
||||||
|
|
||||||
appl::Buffer::Iterator appl::Buffer::selectStop() {
|
appl::Buffer::Iterator appl::Buffer::selectStop() {
|
||||||
return m_data.begin() + getStopSelectionPos();
|
return position( getStopSelectionPos() );
|
||||||
}
|
}
|
||||||
|
|
||||||
appl::Buffer::Buffer() :
|
appl::Buffer::Buffer() :
|
||||||
@ -84,15 +152,20 @@ bool appl::Buffer::loadFile(const std::string& _name) {
|
|||||||
m_cursorPos = 0;
|
m_cursorPos = 0;
|
||||||
setHighlightType("");
|
setHighlightType("");
|
||||||
m_nbLines = 0;
|
m_nbLines = 0;
|
||||||
etk::FSNode filee(m_fileName);
|
if (file.exist() == false) {
|
||||||
if (filee.exist() == true) {
|
APPL_ERROR("File : '" << m_fileName << "' does not exist...");
|
||||||
m_data = file.fileReadAllU32String();
|
return false;
|
||||||
countNumberofLine();
|
|
||||||
tryFindHighlightType();
|
|
||||||
m_isModify = false;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
if (file.fileOpenRead() == false) {
|
||||||
|
APPL_ERROR("File : '" << m_fileName << "' Fail to open in read mode");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
m_data = file.fileReadAllString();
|
||||||
|
file.fileClose();
|
||||||
|
countNumberofLine();
|
||||||
|
tryFindHighlightType();
|
||||||
|
m_isModify = false;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void appl::Buffer::setFileName(const std::string& _name) {
|
void appl::Buffer::setFileName(const std::string& _name) {
|
||||||
@ -109,8 +182,13 @@ void appl::Buffer::setFileName(const std::string& _name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool appl::Buffer::storeFile() {
|
bool appl::Buffer::storeFile() {
|
||||||
etk::FSNode filee(m_fileName);
|
etk::FSNode file(m_fileName);
|
||||||
filee.fileWriteAll(m_data);
|
if (file.fileOpenWrite() == false) {
|
||||||
|
APPL_ERROR("File : '" << m_fileName << "' Fail to open in write mode");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
file.fileWriteAll(m_data);
|
||||||
|
file.fileClose();
|
||||||
APPL_INFO("saving file : " << m_fileName);
|
APPL_INFO("saving file : " << m_fileName);
|
||||||
setModification(false);
|
setModification(false);
|
||||||
return true;
|
return true;
|
||||||
@ -131,8 +209,10 @@ void appl::Buffer::setModification(bool _status) {
|
|||||||
// TODO : Naming error
|
// TODO : Naming error
|
||||||
void appl::Buffer::countNumberofLine() {
|
void appl::Buffer::countNumberofLine() {
|
||||||
m_nbLines = 1;
|
m_nbLines = 1;
|
||||||
for (auto &it : m_data) {
|
for (Iterator it = begin();
|
||||||
if (it == u32char::Return) {
|
(bool)it == true;
|
||||||
|
++it) {
|
||||||
|
if (*it == u32char::Return) {
|
||||||
++m_nbLines;
|
++m_nbLines;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -161,21 +241,21 @@ appl::Buffer::Iterator appl::Buffer::getEndLine(const appl::Buffer::Iterator& _p
|
|||||||
bool appl::Buffer::search(const appl::Buffer::Iterator& _pos, const char32_t& _search, appl::Buffer::Iterator& _result) {
|
bool appl::Buffer::search(const appl::Buffer::Iterator& _pos, const char32_t& _search, appl::Buffer::Iterator& _result) {
|
||||||
// move in the string
|
// move in the string
|
||||||
for (Iterator it = _pos;
|
for (Iterator it = _pos;
|
||||||
it != m_data.end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
if (*it == _search) {
|
if (*it == _search) {
|
||||||
_result = it;
|
_result = it;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_result = m_data.end();
|
_result = end();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool appl::Buffer::searchBack(const appl::Buffer::Iterator& _pos, const char32_t& _search, appl::Buffer::Iterator& _result) {
|
bool appl::Buffer::searchBack(const appl::Buffer::Iterator& _pos, const char32_t& _search, appl::Buffer::Iterator& _result) {
|
||||||
// move in the string
|
// move in the string
|
||||||
for (Iterator it = _pos - 1;
|
for (Iterator it = _pos - 1;
|
||||||
it != m_data.begin();
|
(bool)it == true;
|
||||||
--it) {
|
--it) {
|
||||||
//APPL_DEBUG("compare : " << *it << " ?= " << _search);
|
//APPL_DEBUG("compare : " << *it << " ?= " << _search);
|
||||||
if (*it == _search) {
|
if (*it == _search) {
|
||||||
@ -198,7 +278,7 @@ bool appl::Buffer::search(const appl::Buffer::Iterator& _pos,
|
|||||||
if (_caseSensitive == true) {
|
if (_caseSensitive == true) {
|
||||||
// move in the string
|
// move in the string
|
||||||
for (Iterator it = _pos;
|
for (Iterator it = _pos;
|
||||||
it == m_data.end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
if (*it == _search[0]) {
|
if (*it == _search[0]) {
|
||||||
// find the first char ==> check next...
|
// find the first char ==> check next...
|
||||||
@ -210,7 +290,7 @@ bool appl::Buffer::search(const appl::Buffer::Iterator& _pos,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
++tmp;
|
++tmp;
|
||||||
if (tmp == m_data.end()) {
|
if ((bool)tmp == false) {
|
||||||
if (iii != _search.size()-1) {
|
if (iii != _search.size()-1) {
|
||||||
find = false;
|
find = false;
|
||||||
}
|
}
|
||||||
@ -227,7 +307,7 @@ bool appl::Buffer::search(const appl::Buffer::Iterator& _pos,
|
|||||||
char32_t firstElement = tolower(_search[0]);
|
char32_t firstElement = tolower(_search[0]);
|
||||||
// move in the string
|
// move in the string
|
||||||
for (Iterator it = _pos;
|
for (Iterator it = _pos;
|
||||||
it == m_data.end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
if ((char32_t)tolower(*it) == firstElement) {
|
if ((char32_t)tolower(*it) == firstElement) {
|
||||||
// find the first char ==> check next...
|
// find the first char ==> check next...
|
||||||
@ -239,7 +319,7 @@ bool appl::Buffer::search(const appl::Buffer::Iterator& _pos,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
++tmp;
|
++tmp;
|
||||||
if (tmp != m_data.end()) {
|
if ((bool)tmp == false) {
|
||||||
if (iii != _search.size()-1) {
|
if (iii != _search.size()-1) {
|
||||||
find = false;
|
find = false;
|
||||||
}
|
}
|
||||||
@ -268,7 +348,7 @@ bool appl::Buffer::searchBack(const appl::Buffer::Iterator& _pos,
|
|||||||
if (_caseSensitive == true) {
|
if (_caseSensitive == true) {
|
||||||
// move in the string
|
// move in the string
|
||||||
for (Iterator it = _pos - 1;
|
for (Iterator it = _pos - 1;
|
||||||
it != m_data.begin();
|
(bool)it == true;
|
||||||
--it) {
|
--it) {
|
||||||
//APPL_DEBUG("compare : " << *it << " ?= " << _search);
|
//APPL_DEBUG("compare : " << *it << " ?= " << _search);
|
||||||
if (*it == lastElement) {
|
if (*it == lastElement) {
|
||||||
@ -281,7 +361,7 @@ bool appl::Buffer::searchBack(const appl::Buffer::Iterator& _pos,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
--_result;
|
--_result;
|
||||||
if (_result == m_data.begin()) {
|
if ((bool)_result == false) {
|
||||||
if (iii != 0) {
|
if (iii != 0) {
|
||||||
find = false;
|
find = false;
|
||||||
}
|
}
|
||||||
@ -298,7 +378,7 @@ bool appl::Buffer::searchBack(const appl::Buffer::Iterator& _pos,
|
|||||||
lastElement = tolower(lastElement);
|
lastElement = tolower(lastElement);
|
||||||
// move in the string
|
// move in the string
|
||||||
for (Iterator it = _pos - 1;
|
for (Iterator it = _pos - 1;
|
||||||
it != m_data.begin();
|
(bool)it == true;
|
||||||
--it) {
|
--it) {
|
||||||
//APPL_DEBUG("compare : " << *it << " ?= " << _search);
|
//APPL_DEBUG("compare : " << *it << " ?= " << _search);
|
||||||
if ((char32_t)tolower(*it) == lastElement) {
|
if ((char32_t)tolower(*it) == lastElement) {
|
||||||
@ -311,7 +391,7 @@ bool appl::Buffer::searchBack(const appl::Buffer::Iterator& _pos,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
--_result;
|
--_result;
|
||||||
if (_result == m_data.begin()) {
|
if ((bool)_result == false) {
|
||||||
if (iii != 0) {
|
if (iii != 0) {
|
||||||
find = false;
|
find = false;
|
||||||
}
|
}
|
||||||
@ -357,15 +437,15 @@ void appl::Buffer::moveCursor(int64_t _pos) {
|
|||||||
bool appl::Buffer::getPosAround(const appl::Buffer::Iterator& _startPos,
|
bool appl::Buffer::getPosAround(const appl::Buffer::Iterator& _startPos,
|
||||||
appl::Buffer::Iterator &_beginPos,
|
appl::Buffer::Iterator &_beginPos,
|
||||||
appl::Buffer::Iterator &_endPos) {
|
appl::Buffer::Iterator &_endPos) {
|
||||||
char32_t currentValue = *_startPos;
|
char32_t currentValue = *position(_startPos);
|
||||||
_beginPos = begin();
|
_beginPos = begin();
|
||||||
_endPos = end();
|
_endPos = end();
|
||||||
if ( currentValue == u32char::Tabulation
|
if ( currentValue == u32char::Tabulation
|
||||||
|| currentValue == u32char::Space) {
|
|| currentValue == u32char::Space) {
|
||||||
APPL_DEBUG("select spacer");
|
APPL_DEBUG("select spacer");
|
||||||
// Search back
|
// Search back
|
||||||
for (Iterator it = --Iterator(_startPos);
|
for (Iterator it = --position(_startPos);
|
||||||
it != m_data.begin();
|
(bool)it == true;
|
||||||
--it) {
|
--it) {
|
||||||
currentValue = *it;
|
currentValue = *it;
|
||||||
if ( currentValue != u32char::Tabulation
|
if ( currentValue != u32char::Tabulation
|
||||||
@ -375,8 +455,8 @@ bool appl::Buffer::getPosAround(const appl::Buffer::Iterator& _startPos,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Search forward
|
// Search forward
|
||||||
for (Iterator it = _startPos;
|
for (Iterator it = position(_startPos);
|
||||||
it != m_data.end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
currentValue = *it;
|
currentValue = *it;
|
||||||
if ( currentValue != u32char::Tabulation
|
if ( currentValue != u32char::Tabulation
|
||||||
@ -390,8 +470,8 @@ bool appl::Buffer::getPosAround(const appl::Buffer::Iterator& _startPos,
|
|||||||
|| currentValue == '_') {
|
|| currentValue == '_') {
|
||||||
APPL_DEBUG("select normal Char");
|
APPL_DEBUG("select normal Char");
|
||||||
// Search back
|
// Search back
|
||||||
for (Iterator it = --Iterator(_startPos);
|
for (Iterator it = --position(_startPos);
|
||||||
it == m_data.begin();
|
(bool)it == true;
|
||||||
--it) {
|
--it) {
|
||||||
currentValue = *it;
|
currentValue = *it;
|
||||||
if ( currentValue != '_'
|
if ( currentValue != '_'
|
||||||
@ -401,8 +481,8 @@ bool appl::Buffer::getPosAround(const appl::Buffer::Iterator& _startPos,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Search forward
|
// Search forward
|
||||||
for (Iterator it = _startPos;
|
for (Iterator it = position(_startPos);
|
||||||
it != m_data.end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
currentValue = *it;
|
currentValue = *it;
|
||||||
if ( currentValue != '_'
|
if ( currentValue != '_'
|
||||||
@ -416,8 +496,8 @@ bool appl::Buffer::getPosAround(const appl::Buffer::Iterator& _startPos,
|
|||||||
APPL_DEBUG("select same char");
|
APPL_DEBUG("select same char");
|
||||||
char32_t comparechar = currentValue;
|
char32_t comparechar = currentValue;
|
||||||
// Search back
|
// Search back
|
||||||
for (Iterator it = --Iterator(_startPos);
|
for (Iterator it = --position(_startPos);
|
||||||
it == m_data.begin();
|
(bool)it == true;
|
||||||
--it) {
|
--it) {
|
||||||
currentValue = *it;
|
currentValue = *it;
|
||||||
if (comparechar != currentValue) {
|
if (comparechar != currentValue) {
|
||||||
@ -426,8 +506,8 @@ bool appl::Buffer::getPosAround(const appl::Buffer::Iterator& _startPos,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Search forward
|
// Search forward
|
||||||
for (Iterator it = --Iterator(_startPos);
|
for (Iterator it = position(_startPos);
|
||||||
it != m_data.end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
currentValue = *it;
|
currentValue = *it;
|
||||||
if (comparechar != currentValue) {
|
if (comparechar != currentValue) {
|
||||||
@ -437,13 +517,13 @@ bool appl::Buffer::getPosAround(const appl::Buffer::Iterator& _startPos,
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
_beginPos = m_data.begin();
|
_beginPos = begin();
|
||||||
_endPos = m_data.begin();
|
_endPos = begin();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void appl::Buffer::setSelectionPos(const appl::Buffer::Iterator& _pos) {
|
void appl::Buffer::setSelectionPos(const appl::Buffer::Iterator& _pos) {
|
||||||
m_cursorSelectPos = std::distance(m_data.begin(), _pos);
|
m_cursorSelectPos = _pos;
|
||||||
signalSelectChange.emit();
|
signalSelectChange.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -499,8 +579,8 @@ appl::Buffer::Iterator appl::Buffer::countForwardNLines(const appl::Buffer::Iter
|
|||||||
char32_t value;
|
char32_t value;
|
||||||
int32_t lineCount = 0;
|
int32_t lineCount = 0;
|
||||||
//APPL_INFO("startPos=" << startPos << " nLines=" << nLines);
|
//APPL_INFO("startPos=" << startPos << " nLines=" << nLines);
|
||||||
for (Iterator it = Iterator(_startPos);
|
for (Iterator it = position(_startPos);
|
||||||
it != m_data.end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
value = *it;
|
value = *it;
|
||||||
if (value == u32char::Return) {
|
if (value == u32char::Return) {
|
||||||
@ -519,8 +599,8 @@ appl::Buffer::Iterator appl::Buffer::countBackwardNLines(const appl::Buffer::Ite
|
|||||||
//APPL_INFO("startPos=" << startPos << " nLines=" << nLines);
|
//APPL_INFO("startPos=" << startPos << " nLines=" << nLines);
|
||||||
char32_t value;
|
char32_t value;
|
||||||
int32_t lineCount = 0;
|
int32_t lineCount = 0;
|
||||||
for (Iterator it = --Iterator(_startPos);
|
for (Iterator it = --position(_startPos);
|
||||||
it != m_data.begin();
|
(bool)it == true;
|
||||||
--it) {
|
--it) {
|
||||||
value = *it;
|
value = *it;
|
||||||
if (value == u32char::Return) {
|
if (value == u32char::Return) {
|
||||||
@ -544,7 +624,7 @@ bool appl::Buffer::copy(std::string& _data) {
|
|||||||
int32_t endPos = getStopSelectionPos();
|
int32_t endPos = getStopSelectionPos();
|
||||||
for (Iterator it = position(startPos);
|
for (Iterator it = position(startPos);
|
||||||
it != position(endPos) &&
|
it != position(endPos) &&
|
||||||
it != m_data.end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
_data += *it;
|
_data += *it;
|
||||||
}
|
}
|
||||||
@ -557,33 +637,39 @@ void appl::Buffer::copy(std::string& _data, const appl::Buffer::Iterator& _pos,
|
|||||||
_data.clear();
|
_data.clear();
|
||||||
for (Iterator it = _pos;
|
for (Iterator it = _pos;
|
||||||
it != _posEnd &&
|
it != _posEnd &&
|
||||||
it != m_data.end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
_data += *it;
|
_data += *it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool appl::Buffer::write(const std::string& _data, const appl::Buffer::Iterator& _pos) {
|
bool appl::Buffer::write(const std::string& _data, const appl::Buffer::Iterator& _pos) {
|
||||||
std::u32string data2 = utf8::convertUnicode(_data);
|
int64_t position = (int64_t)_pos;
|
||||||
APPL_VERBOSE("write at pos: " << std::distance(m_data.begin(), _pos) << " data : " << data2);
|
if (position < 0){
|
||||||
m_data.insert(_pos, data2.begin(), data2.end());
|
position = 0;
|
||||||
|
}
|
||||||
|
APPL_VERBOSE("write at pos: " << (int64_t)_pos << " ==> " << position << " data : " << _data);
|
||||||
|
m_data.insert((size_t)position, _data);
|
||||||
if (m_cursorPos < 0) {
|
if (m_cursorPos < 0) {
|
||||||
m_cursorPos = 0;
|
m_cursorPos = 0;
|
||||||
}
|
}
|
||||||
regenerateHighLightAt(std::distance(m_data.begin(), _pos), 0, data2.size());
|
regenerateHighLightAt(position, 0, _data.size());
|
||||||
m_selectMode = false;
|
m_selectMode = false;
|
||||||
moveCursor(std::distance(m_data.begin(),_pos+data2.size()));
|
moveCursor(position+_data.size());
|
||||||
countNumberofLine(); // TODO : use more intelligent counter
|
countNumberofLine(); // TODO : use more intelligent counter
|
||||||
setModification(true);
|
setModification(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool appl::Buffer::replace(const std::string& _data, const appl::Buffer::Iterator& _pos, const appl::Buffer::Iterator& _posEnd) {
|
bool appl::Buffer::replace(const std::string& _data, const appl::Buffer::Iterator& _pos, const appl::Buffer::Iterator& _posEnd) {
|
||||||
std::u32string data2 = utf8::convertUnicode(_data);
|
int64_t position = (int64_t)_pos;
|
||||||
m_data.replace(_pos, _posEnd, data2.c_str(), data2.size());
|
if (position < 0){
|
||||||
regenerateHighLightAt(std::distance(m_data.begin(),_pos), std::distance(m_data.begin(),_posEnd)-std::distance(m_data.begin(),_pos), data2.size());
|
position = 0;
|
||||||
|
}
|
||||||
|
m_data.replace(m_data.begin() + position, m_data.begin() + (int64_t)_posEnd, _data.begin(), _data.end());
|
||||||
|
regenerateHighLightAt(position, (int64_t)_posEnd-(int64_t)_pos, _data.size());
|
||||||
m_selectMode = false;
|
m_selectMode = false;
|
||||||
moveCursor(std::distance(m_data.begin(),_pos+data2.size()));
|
moveCursor(position+_data.size());
|
||||||
countNumberofLine(); // TODO : use more intelligent counter
|
countNumberofLine(); // TODO : use more intelligent counter
|
||||||
setModification(true);
|
setModification(true);
|
||||||
return true;
|
return true;
|
||||||
@ -817,13 +903,13 @@ void appl::Buffer::hightlightGenerateLines(appl::DisplayHLData& _MData, const ap
|
|||||||
//int64_t timeStart = ewol::getTime();
|
//int64_t timeStart = ewol::getTime();
|
||||||
|
|
||||||
appl::Buffer::Iterator HLStartLine = getStartLine(_HLStart);
|
appl::Buffer::Iterator HLStartLine = getStartLine(_HLStart);
|
||||||
int64_t HLStartPos = std::distance(m_data.begin(),HLStartLine);
|
int64_t HLStartPos = (int64_t)HLStartLine;
|
||||||
_MData.HLData.clear();
|
_MData.HLData.clear();
|
||||||
int64_t HLStop = std::distance(m_data.begin(),countForwardNLines(HLStartLine, _nbLines));
|
int64_t HLStop = (int64_t)countForwardNLines(HLStartLine, _nbLines);
|
||||||
int64_t startId = 0;
|
int64_t startId = 0;
|
||||||
int64_t stopId = 0;
|
int64_t stopId = 0;
|
||||||
// find element previous
|
// find element previous
|
||||||
findMainHighLightPosition(std::distance(m_data.begin(),_HLStart), HLStop, startId, stopId, true);
|
findMainHighLightPosition(_HLStart, HLStop, startId, stopId, true);
|
||||||
|
|
||||||
//APPL_DEBUG("List of section between : "<< startId << " & " << stopId);
|
//APPL_DEBUG("List of section between : "<< startId << " & " << stopId);
|
||||||
int64_t endSearch = stopId+1;
|
int64_t endSearch = stopId+1;
|
||||||
@ -904,7 +990,7 @@ uint32_t appl::Buffer::getCursorLinesId() {
|
|||||||
}
|
}
|
||||||
uint32_t line = 0;
|
uint32_t line = 0;
|
||||||
for (Iterator it = begin();
|
for (Iterator it = begin();
|
||||||
it != m_data.end() && it <= cursor();
|
(bool)it == true && it <= cursor();
|
||||||
++it) {
|
++it) {
|
||||||
if (*it == u32char::Return) {
|
if (*it == u32char::Return) {
|
||||||
++line;
|
++line;
|
||||||
|
@ -29,7 +29,265 @@ namespace appl {
|
|||||||
};
|
};
|
||||||
class Buffer : public ewol::Object {
|
class Buffer : public ewol::Object {
|
||||||
public:
|
public:
|
||||||
using Iterator = std::u32string::iterator;
|
class Iterator {
|
||||||
|
// Private data :
|
||||||
|
private:
|
||||||
|
int64_t m_current; //!< curent Id in the Buffer
|
||||||
|
appl::Buffer* m_data; //!< Pointer on the curent Buffer
|
||||||
|
char32_t m_value; //!< store vlue to prevent multiple calcule of getting the data
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Basic itarator constructor with no link.
|
||||||
|
*/
|
||||||
|
Iterator():
|
||||||
|
m_current(0),
|
||||||
|
m_data(nullptr),
|
||||||
|
m_value(u32char::Null) {
|
||||||
|
// nothing to do ...
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief Recopy constructor.
|
||||||
|
* @param[in] _obj The Iterator that might be copy
|
||||||
|
*/
|
||||||
|
Iterator(const Iterator & _obj):
|
||||||
|
m_current(_obj.m_current),
|
||||||
|
m_data(_obj.m_data),
|
||||||
|
m_value(u32char::Null) {
|
||||||
|
// nothing to do ...
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief Asignation operator.
|
||||||
|
* @param[in] _otherIterator The Iterator that might be copy
|
||||||
|
* @return reference on the curent Iterator
|
||||||
|
*/
|
||||||
|
Iterator& operator=(const Iterator & _obj) {
|
||||||
|
m_current = _obj.m_current;
|
||||||
|
m_data = _obj.m_data;
|
||||||
|
m_value = u32char::Null;
|
||||||
|
return *this;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief Basic destructor
|
||||||
|
*/
|
||||||
|
virtual ~Iterator() {
|
||||||
|
m_current = 0;
|
||||||
|
m_data = nullptr;
|
||||||
|
m_value = u32char::Null;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief basic boolean cast
|
||||||
|
* @return true if the element is present in buffer
|
||||||
|
*/
|
||||||
|
operator bool () const {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_current >= (int64_t)m_data->m_data.size()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_current < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief basic boolean cast
|
||||||
|
* @return true if the element is present in buffer
|
||||||
|
*/
|
||||||
|
operator int64_t () const {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (m_current < 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (m_current > (int64_t)m_data->m_data.size()) {
|
||||||
|
return (int64_t)m_data->m_data.size();
|
||||||
|
}
|
||||||
|
return m_current;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief Incremental operator
|
||||||
|
* @return Reference on the current iterator incremented
|
||||||
|
*/
|
||||||
|
Iterator& operator++ ();
|
||||||
|
/**
|
||||||
|
* @brief Decremental operator
|
||||||
|
* @return Reference on the current iterator decremented
|
||||||
|
*/
|
||||||
|
Iterator& operator-- ();
|
||||||
|
/**
|
||||||
|
* @brief Incremental operator
|
||||||
|
* @return Reference on a new iterator and increment the other one
|
||||||
|
*/
|
||||||
|
Iterator operator++ (int32_t) {
|
||||||
|
Iterator it(*this);
|
||||||
|
++(*this);
|
||||||
|
return it;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief Decremental operator
|
||||||
|
* @return Reference on a new iterator and decrement the other one
|
||||||
|
*/
|
||||||
|
Iterator operator-- (int32_t) {
|
||||||
|
Iterator it(*this);
|
||||||
|
--(*this);
|
||||||
|
return it;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief egality iterator
|
||||||
|
* @return true if the iterator is identical pos
|
||||||
|
*/
|
||||||
|
bool operator== (const Iterator& _obj) const {
|
||||||
|
if ( m_current == _obj.m_current
|
||||||
|
&& m_data == _obj.m_data) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief egality iterator
|
||||||
|
* @return true if the iterator is identical pos
|
||||||
|
*/
|
||||||
|
bool operator!= (const Iterator& _obj) const {
|
||||||
|
if ( m_current != _obj.m_current
|
||||||
|
|| m_data != _obj.m_data) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief <= iterator
|
||||||
|
* @return true if the iterator is identical pos
|
||||||
|
*/
|
||||||
|
bool operator<= (const Iterator& _obj) const {
|
||||||
|
if (m_data != _obj.m_data) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_current <= _obj.m_current) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief >= iterator
|
||||||
|
* @return true if the iterator is identical pos
|
||||||
|
*/
|
||||||
|
bool operator>= (const Iterator& _obj) const {
|
||||||
|
if (m_data != _obj.m_data) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_current >= _obj.m_current) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief < iterator
|
||||||
|
* @return true if the iterator is identical pos
|
||||||
|
*/
|
||||||
|
bool operator< (const Iterator& _obj) const {
|
||||||
|
if (m_data != _obj.m_data) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_current < _obj.m_current) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief > iterator
|
||||||
|
* @return true if the iterator is identical pos
|
||||||
|
*/
|
||||||
|
bool operator> (const Iterator& _obj) const {
|
||||||
|
if (m_data != _obj.m_data) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_current > _obj.m_current) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief Get the value on the current element
|
||||||
|
* @return The request element value
|
||||||
|
*/
|
||||||
|
char32_t operator* ();
|
||||||
|
/**
|
||||||
|
* @brief Get the position in the buffer
|
||||||
|
* @return The requested position.
|
||||||
|
*/
|
||||||
|
int64_t getPos() const {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (m_current < 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (m_current >= (int64_t)m_data->m_data.size()) {
|
||||||
|
return m_data->m_data.size()-1;
|
||||||
|
}
|
||||||
|
return m_current;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief move the element position
|
||||||
|
* @return a new iterator.
|
||||||
|
*/
|
||||||
|
Iterator operator+ (const int64_t _val) const {
|
||||||
|
Iterator tmpp(*this);
|
||||||
|
for (int64_t iii=0; iii<_val; ++iii) {
|
||||||
|
++tmpp;
|
||||||
|
}
|
||||||
|
return tmpp;
|
||||||
|
};
|
||||||
|
Iterator operator+ (const int32_t _val) const {
|
||||||
|
Iterator tmpp(*this);
|
||||||
|
for (int64_t iii=0; iii<_val; ++iii) {
|
||||||
|
++tmpp;
|
||||||
|
}
|
||||||
|
return tmpp;
|
||||||
|
};
|
||||||
|
Iterator operator+ (const size_t _val) const {
|
||||||
|
Iterator tmpp(*this);
|
||||||
|
for (int64_t iii=0; iii<(int64_t)_val; ++iii) {
|
||||||
|
++tmpp;
|
||||||
|
}
|
||||||
|
return tmpp;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @brief move the element position
|
||||||
|
* @return a new iterator.
|
||||||
|
*/
|
||||||
|
Iterator operator- (const int64_t _val) const {
|
||||||
|
Iterator tmpp(*this);
|
||||||
|
for (int64_t iii=0; iii<_val; ++iii) {
|
||||||
|
--tmpp;
|
||||||
|
}
|
||||||
|
return tmpp;
|
||||||
|
};
|
||||||
|
Iterator operator- (const int32_t _val) const {
|
||||||
|
Iterator tmpp(*this);
|
||||||
|
for (int64_t iii=0; iii<_val; ++iii) {
|
||||||
|
--tmpp;
|
||||||
|
}
|
||||||
|
return tmpp;
|
||||||
|
};
|
||||||
|
Iterator operator- (const size_t _val) const {
|
||||||
|
Iterator tmpp(*this);
|
||||||
|
for (int64_t iii=0; iii<(int64_t)_val; ++iii) {
|
||||||
|
--tmpp;
|
||||||
|
}
|
||||||
|
return tmpp;
|
||||||
|
};
|
||||||
|
private:
|
||||||
|
Iterator(Buffer* _obj, int64_t _pos) :
|
||||||
|
m_current(_pos),
|
||||||
|
m_data(_obj),
|
||||||
|
m_value(u32char::Null) {
|
||||||
|
// nothing to do ...
|
||||||
|
};
|
||||||
|
friend class Buffer;
|
||||||
|
};
|
||||||
public:
|
public:
|
||||||
ewol::object::Signal<void> signalIsModify;
|
ewol::object::Signal<void> signalIsModify;
|
||||||
ewol::object::Signal<void> signalIsSave;
|
ewol::object::Signal<void> signalIsSave;
|
||||||
@ -90,9 +348,9 @@ namespace appl {
|
|||||||
*/
|
*/
|
||||||
void setModification(bool _status);
|
void setModification(bool _status);
|
||||||
protected:
|
protected:
|
||||||
std::u32string m_data; //!< copy of the file buffer
|
std::string m_data; //!< copy of the file buffer
|
||||||
public:
|
public:
|
||||||
std::u32string& getData() {
|
std::string& getData() {
|
||||||
return m_data;
|
return m_data;
|
||||||
};
|
};
|
||||||
protected:
|
protected:
|
||||||
|
@ -222,7 +222,7 @@ void appl::TextViewer::onRegenerateDisplay() {
|
|||||||
int64_t startLineId = 0;
|
int64_t startLineId = 0;
|
||||||
if (m_size.y() < m_displayText.getPos().y()) {
|
if (m_size.y() < m_displayText.getPos().y()) {
|
||||||
for (startingIt = m_buffer->begin();
|
for (startingIt = m_buffer->begin();
|
||||||
startingIt != m_buffer->end();
|
(bool)startingIt == true;
|
||||||
++startingIt) {
|
++startingIt) {
|
||||||
if (*startingIt == u32char::Return) {
|
if (*startingIt == u32char::Return) {
|
||||||
++startLineId;
|
++startLineId;
|
||||||
@ -275,7 +275,7 @@ void appl::TextViewer::onRegenerateDisplay() {
|
|||||||
bool DisplayCursorAndSelection = isSelectedLast();
|
bool DisplayCursorAndSelection = isSelectedLast();
|
||||||
appl::Buffer::Iterator it;
|
appl::Buffer::Iterator it;
|
||||||
for (it = startingIt;
|
for (it = startingIt;
|
||||||
it != m_buffer->end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
if (it == m_buffer->cursor()) {
|
if (it == m_buffer->cursor()) {
|
||||||
// need to display the cursor :
|
// need to display the cursor :
|
||||||
@ -307,7 +307,7 @@ void appl::TextViewer::onRegenerateDisplay() {
|
|||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
HLColor = m_buffer->getElementColorAtPosition(displayLocalSyntax, std::distance(m_buffer->begin(),it));
|
HLColor = m_buffer->getElementColorAtPosition(displayLocalSyntax, (int64_t)it);
|
||||||
bool haveBackground = false;
|
bool haveBackground = false;
|
||||||
if ( HLColor != nullptr
|
if ( HLColor != nullptr
|
||||||
&& HLColor->patern != nullptr) {
|
&& HLColor->patern != nullptr) {
|
||||||
@ -639,7 +639,7 @@ appl::Buffer::Iterator appl::TextViewer::getMousePosition(const vec2& _relativeP
|
|||||||
m_displayText.forceLineReturn();
|
m_displayText.forceLineReturn();
|
||||||
positionCurentDisplay = m_displayText.getPos();
|
positionCurentDisplay = m_displayText.getPos();
|
||||||
for (appl::Buffer::Iterator it = m_buffer->begin();
|
for (appl::Buffer::Iterator it = m_buffer->begin();
|
||||||
it != m_buffer->end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
currentValue = *it;
|
currentValue = *it;
|
||||||
if (currentValue == u32char::Return) {
|
if (currentValue == u32char::Return) {
|
||||||
@ -756,7 +756,7 @@ bool appl::TextViewer::moveCursor(const appl::Buffer::Iterator& _pos) {
|
|||||||
updateScrolling();
|
updateScrolling();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
m_buffer->moveCursor(std::distance(m_buffer->begin(),_pos));
|
m_buffer->moveCursor((int64_t)_pos);
|
||||||
updateScrolling();
|
updateScrolling();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -937,7 +937,7 @@ appl::Buffer::Iterator appl::TextViewer::getPosSize(const appl::Buffer::Iterator
|
|||||||
m_displayText.clear();
|
m_displayText.clear();
|
||||||
m_displayText.forceLineReturn();
|
m_displayText.forceLineReturn();
|
||||||
for (appl::Buffer::Iterator it = _startLinePos;
|
for (appl::Buffer::Iterator it = _startLinePos;
|
||||||
it != m_buffer->end();
|
(bool)it == true;
|
||||||
++it) {
|
++it) {
|
||||||
currentValue = *it;
|
currentValue = *it;
|
||||||
m_buffer->expand(countColomn, currentValue, stringToDisplay);
|
m_buffer->expand(countColomn, currentValue, stringToDisplay);
|
||||||
@ -965,7 +965,7 @@ float appl::TextViewer::getScreenSize(const appl::Buffer::Iterator& _startLinePo
|
|||||||
m_displayText.clear();
|
m_displayText.clear();
|
||||||
|
|
||||||
for (appl::Buffer::Iterator it = _startLinePos;
|
for (appl::Buffer::Iterator it = _startLinePos;
|
||||||
it != m_buffer->end() && it <= _stopPos;
|
(bool)it == true && it <= _stopPos;
|
||||||
++it) {
|
++it) {
|
||||||
currentValue = *it;
|
currentValue = *it;
|
||||||
//APPL_DEBUG("parse : " << currentValue);
|
//APPL_DEBUG("parse : " << currentValue);
|
||||||
|
@ -168,7 +168,7 @@ void appl::Highlight::parse(int64_t _start,
|
|||||||
int64_t _stop,
|
int64_t _stop,
|
||||||
std::vector<appl::HighlightInfo> & _metaData,
|
std::vector<appl::HighlightInfo> & _metaData,
|
||||||
int64_t _addingPos,
|
int64_t _addingPos,
|
||||||
std::u32string& _buffer) {
|
std::string& _buffer) {
|
||||||
if (0 > _addingPos) {
|
if (0 > _addingPos) {
|
||||||
_addingPos = 0;
|
_addingPos = 0;
|
||||||
}
|
}
|
||||||
@ -178,6 +178,8 @@ void appl::Highlight::parse(int64_t _start,
|
|||||||
appl::HighlightInfo resultat;
|
appl::HighlightInfo resultat;
|
||||||
while (elementStart <= elementStop) {
|
while (elementStart <= elementStop) {
|
||||||
HL_DEBUG("Parse element in the buffer pos=" << elementStart);
|
HL_DEBUG("Parse element in the buffer pos=" << elementStart);
|
||||||
|
appl::HighlightInfo resultatLast;
|
||||||
|
int64_t findAnOtherId = -1;
|
||||||
//try to fond the HL in ALL of we have
|
//try to fond the HL in ALL of we have
|
||||||
for (int64_t jjj=0; jjj<(int64_t)m_listHighlightPass1.size(); jjj++){
|
for (int64_t jjj=0; jjj<(int64_t)m_listHighlightPass1.size(); jjj++){
|
||||||
enum resultFind ret = HLP_FIND_OK;
|
enum resultFind ret = HLP_FIND_OK;
|
||||||
@ -185,38 +187,53 @@ void appl::Highlight::parse(int64_t _start,
|
|||||||
// Stop the search to the end (to get the end of the pattern)
|
// Stop the search to the end (to get the end of the pattern)
|
||||||
ret = m_listHighlightPass1[jjj]->find(elementStart, _buffer.size(), resultat, _buffer);
|
ret = m_listHighlightPass1[jjj]->find(elementStart, _buffer.size(), resultat, _buffer);
|
||||||
if (HLP_FIND_ERROR != ret) {
|
if (HLP_FIND_ERROR != ret) {
|
||||||
HL_DEBUG("Find Pattern in the Buffer : (" << resultat.start << "," << resultat.stop << ")" );
|
if (elementStart == resultat.start) {
|
||||||
// remove element in the current List where the current Element have a end inside the next...
|
APPL_DEBUG("Find Pattern in the Buffer : (" << resultat.start << "," << resultat.stop << ") startPos=" << elementStart );
|
||||||
int64_t kkk=_addingPos;
|
findAnOtherId = jjj;
|
||||||
while(kkk < (int64_t)_metaData.size() ) {
|
resultatLast = resultat;
|
||||||
if (_metaData[kkk].start <= resultat.stop) {
|
break;
|
||||||
// remove element
|
} else {
|
||||||
HL_DEBUG("Erase element=" << kkk);
|
// stack last find to prevent a unneded seach:
|
||||||
_metaData.erase(_metaData.begin()+kkk, _metaData.begin()+kkk+1);
|
if ( findAnOtherId == -1
|
||||||
// Increase the end of search
|
|| resultat.start < resultatLast.start) {
|
||||||
if (kkk < (int64_t)_metaData.size()) {
|
findAnOtherId = jjj;
|
||||||
// just befor the end of the next element
|
resultatLast = resultat;
|
||||||
elementStop = _metaData[kkk].start-1;
|
|
||||||
} else {
|
|
||||||
// end of the buffer
|
|
||||||
elementStop = _buffer.size();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Not find == > exit the cycle :
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// add curent element in the list ...
|
|
||||||
_metaData.insert(_metaData.begin()+_addingPos, resultat);
|
|
||||||
HL_DEBUG("INSERT at "<< _addingPos << " S=" << resultat.start << " E=" << resultat.stop );
|
|
||||||
// update the current research starting element: (set position at the end of the current element
|
|
||||||
elementStart = resultat.stop-1;
|
|
||||||
// increment the position of insertion:
|
|
||||||
_addingPos++;
|
|
||||||
// We find a pattern == > Stop search for the current element
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (findAnOtherId != -1) {
|
||||||
|
// remove element in the current List where the current Element have a end inside the next...
|
||||||
|
int64_t kkk=_addingPos;
|
||||||
|
while(kkk < (int64_t)_metaData.size() ) {
|
||||||
|
if (_metaData[kkk].start <= resultatLast.stop) {
|
||||||
|
// remove element
|
||||||
|
HL_DEBUG("Erase element=" << kkk);
|
||||||
|
_metaData.erase(_metaData.begin()+kkk, _metaData.begin()+kkk+1);
|
||||||
|
// Increase the end of search
|
||||||
|
if (kkk < (int64_t)_metaData.size()) {
|
||||||
|
// just befor the end of the next element
|
||||||
|
elementStop = _metaData[kkk].start-1;
|
||||||
|
} else {
|
||||||
|
// end of the buffer
|
||||||
|
elementStop = _buffer.size();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Not find == > exit the cycle :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// add curent element in the list ...
|
||||||
|
_metaData.insert(_metaData.begin()+_addingPos, resultatLast);
|
||||||
|
HL_DEBUG("INSERT at "<< _addingPos << " S=" << resultatLast.start << " E=" << resultatLast.stop );
|
||||||
|
// update the current research starting element: (set position at the end of the current element
|
||||||
|
elementStart = resultatLast.stop-1;
|
||||||
|
// increment the position of insertion:
|
||||||
|
_addingPos++;
|
||||||
|
// We find a pattern == > Stop search for the current element
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
// Go to the next element (and search again ...).
|
// Go to the next element (and search again ...).
|
||||||
elementStart++;
|
elementStart++;
|
||||||
}
|
}
|
||||||
@ -230,7 +247,7 @@ void appl::Highlight::parse(int64_t _start,
|
|||||||
void appl::Highlight::parse2(int64_t _start,
|
void appl::Highlight::parse2(int64_t _start,
|
||||||
int64_t _stop,
|
int64_t _stop,
|
||||||
std::vector<appl::HighlightInfo> &_metaData,
|
std::vector<appl::HighlightInfo> &_metaData,
|
||||||
std::u32string&_buffer) {
|
std::string&_buffer) {
|
||||||
HL2_DEBUG("Parse element 0 => " << m_listHighlightPass2.size() <<
|
HL2_DEBUG("Parse element 0 => " << m_listHighlightPass2.size() <<
|
||||||
" == > position search: (" << _start << "," << _stop << ")" );
|
" == > position search: (" << _start << "," << _stop << ")" );
|
||||||
int64_t elementStart = _start;
|
int64_t elementStart = _start;
|
||||||
|
@ -55,11 +55,11 @@ namespace appl {
|
|||||||
int64_t _stop,
|
int64_t _stop,
|
||||||
std::vector<appl::HighlightInfo> &_metaData,
|
std::vector<appl::HighlightInfo> &_metaData,
|
||||||
int64_t _addingPos,
|
int64_t _addingPos,
|
||||||
std::u32string &_buffer);
|
std::string &_buffer);
|
||||||
void parse2(int64_t _start,
|
void parse2(int64_t _start,
|
||||||
int64_t _stop,
|
int64_t _stop,
|
||||||
std::vector<appl::HighlightInfo> &_metaData,
|
std::vector<appl::HighlightInfo> &_metaData,
|
||||||
std::u32string &_buffer);
|
std::string &_buffer);
|
||||||
private:
|
private:
|
||||||
void parseRules(exml::Element* _child,
|
void parseRules(exml::Element* _child,
|
||||||
std::vector<std::unique_ptr<HighlightPattern>> &_mListPatern,
|
std::vector<std::unique_ptr<HighlightPattern>> &_mListPatern,
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
appl::HighlightPattern::HighlightPattern(const std::shared_ptr<appl::GlyphPainting>& _glyphPainting) :
|
appl::HighlightPattern::HighlightPattern(const std::shared_ptr<appl::GlyphPainting>& _glyphPainting) :
|
||||||
m_glyphPainting(_glyphPainting),
|
m_glyphPainting(_glyphPainting),
|
||||||
m_paternName(""),
|
m_paternName(""),
|
||||||
|
m_hasParsingError(true),
|
||||||
|
m_regexValue(""),
|
||||||
m_regExp(),
|
m_regExp(),
|
||||||
m_colorName(""),
|
m_colorName(""),
|
||||||
m_level(0) {
|
m_level(0) {
|
||||||
@ -28,13 +30,13 @@ appl::HighlightPattern::~HighlightPattern() {
|
|||||||
|
|
||||||
void appl::HighlightPattern::setPatern(const std::string& _regExp, bool forceMaximize) {
|
void appl::HighlightPattern::setPatern(const std::string& _regExp, bool forceMaximize) {
|
||||||
m_regexValue = _regExp;
|
m_regexValue = _regExp;
|
||||||
const std::u32string data = utf8::convertUnicode(_regExp);
|
try {
|
||||||
const std::u32string data2 = U"kjhkjhk";
|
m_regExp.assign(_regExp);
|
||||||
const std::string data3 = "kjhkjhk";
|
m_hasParsingError = false;
|
||||||
//std::basic_regex<char32_t, std::u32string> regexp(data2);
|
} catch (std::regex_error e) {
|
||||||
std::basic_regex<char32_t> regexp((const char32_t*)data2.c_str());
|
m_hasParsingError = true;
|
||||||
//m_regExp.assign((const std::u32string)data);
|
APPL_ERROR("can not parse regExp : '" << e.what() << "' for : " << _regExp);
|
||||||
//m_regExp.assign(_regExp);
|
}
|
||||||
//m_regExp.setMaximize(forceMaximize);
|
//m_regExp.setMaximize(forceMaximize);
|
||||||
}
|
}
|
||||||
std::string appl::HighlightPattern::getPaternString() {
|
std::string appl::HighlightPattern::getPaternString() {
|
||||||
@ -97,17 +99,20 @@ void appl::HighlightPattern::parseRules(exml::Element* _child, int32_t _level, b
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef std::match_results<std::u32string::const_iterator> s32match;
|
|
||||||
|
|
||||||
enum resultFind appl::HighlightPattern::find(int32_t _start,
|
enum resultFind appl::HighlightPattern::find(int32_t _start,
|
||||||
int32_t _stop,
|
int32_t _stop,
|
||||||
appl::HighlightInfo& _resultat,
|
appl::HighlightInfo& _resultat,
|
||||||
const std::u32string& _buffer) {
|
const std::string& _buffer) {
|
||||||
//APPL_DEBUG(" try to find the element");
|
//APPL_DEBUG(" try to find the element");
|
||||||
_resultat.start = -1;
|
_resultat.start = -1;
|
||||||
_resultat.stop = -1;
|
_resultat.stop = -1;
|
||||||
_resultat.notEnded = false;
|
_resultat.notEnded = false;
|
||||||
_resultat.patern = this;
|
_resultat.patern = this;
|
||||||
|
if (m_hasParsingError == true) {
|
||||||
|
return HLP_FIND_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// when we have only one element:
|
// when we have only one element:
|
||||||
if (true == m_regExp.processOneElement(_buffer, _start, _stop)) {
|
if (true == m_regExp.processOneElement(_buffer, _start, _stop)) {
|
||||||
@ -119,11 +124,13 @@ enum resultFind appl::HighlightPattern::find(int32_t _start,
|
|||||||
return HLP_FIND_ERROR;
|
return HLP_FIND_ERROR;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
s32match resultMatch;
|
std::smatch resultMatch;
|
||||||
std::regex_search(_buffer, resultMatch, m_regExp);
|
//APPL_DEBUG("find data at : start=" << _start << " stop=" << _stop << " regex='" << m_regexValue << "'");
|
||||||
|
std::regex_search(_buffer.begin() + _start, _buffer.begin() + _stop, resultMatch, m_regExp);
|
||||||
if (resultMatch.size() > 0) {
|
if (resultMatch.size() > 0) {
|
||||||
_resultat.start = std::distance(_buffer.begin(), resultMatch[0].first);;
|
_resultat.start = std::distance(_buffer.begin(), resultMatch[0].first);;
|
||||||
_resultat.stop = std::distance(_buffer.begin(), resultMatch[0].second);
|
_resultat.stop = std::distance(_buffer.begin(), resultMatch[0].second);
|
||||||
|
//APPL_DEBUG("find data at : start=" << _resultat.start << " stop=" << _resultat.stop << " data='" <<std::string(_buffer, _resultat.start, _resultat.stop-_resultat.start) << "'" );
|
||||||
/*
|
/*
|
||||||
if (false){
|
if (false){
|
||||||
TK_DEBUG("in line : '" << etk::to_string(_buffer) << "'");
|
TK_DEBUG("in line : '" << etk::to_string(_buffer) << "'");
|
||||||
|
@ -44,8 +44,9 @@ namespace appl {
|
|||||||
return m_paternName;
|
return m_paternName;
|
||||||
};
|
};
|
||||||
private:
|
private:
|
||||||
|
bool m_hasParsingError;
|
||||||
std::string m_regexValue;
|
std::string m_regexValue;
|
||||||
std::basic_regex<char32_t> m_regExp; //!< Start of Regular expression
|
std::regex m_regExp; //!< Start of Regular expression
|
||||||
public:
|
public:
|
||||||
void setPatern(const std::string& _regExp, bool forceMaximize=false);
|
void setPatern(const std::string& _regExp, bool forceMaximize=false);
|
||||||
std::string getPaternString();
|
std::string getPaternString();
|
||||||
@ -83,7 +84,7 @@ namespace appl {
|
|||||||
enum resultFind find(int32_t _start,
|
enum resultFind find(int32_t _start,
|
||||||
int32_t _stop,
|
int32_t _stop,
|
||||||
appl::HighlightInfo& _resultat,
|
appl::HighlightInfo& _resultat,
|
||||||
const std::u32string& _buffer);
|
const std::string& _buffer);
|
||||||
|
|
||||||
void parseRules(exml::Element* _child, int32_t _level, bool forceMaximize=false);
|
void parseRules(exml::Element* _child, int32_t _level, bool forceMaximize=false);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user