这是我的情况。
我有一个自动换行算法,可以在宽度太大时生成文本行,或者在文本中找到\ n或“ - ”。
因此它不包括文本行本身的'\ n'。这对我来说是一个具有挑战性的部分。
我正在尝试制作一个算法,它会在给定行和列的情况下返回字符数组中的索引。
因此,如果第1行的长度为20且第2行的长度为10,如果第1行最初具有'\ n',则应考虑到这一点。
例如:
文字是:
Hello blue sky\nworld
然后我们得到2行:
Hello blue sky
world
现在,如果我的插入符号由'|'表示我把它放在这里:
Hello blue sky
|world
结果不是第14个字符,而是第15个字符,因为必须考虑不可见的'\ n'。
棘手的部分是如果自动换行决定生成'\ n'
例如:
Hello blue
sky
|world
在这种情况下,结果应该仍然是15,因为wordwrap推了一个新行但不是因为'\ n'在文本中。
由于
Here is my mess so far:
int AguiTextBox::indexFromColumnRow( int column, int row )
{
int len = 0;
int charCount = 0;
std::string curChar;
int curLen = 0;
int bytesSkipped = 0;
std::string::const_iterator it = getText().begin();
std::string::const_iterator end = getText().end();
if(textRows.size() == 0)
{
return -1;
}
for(int i = 0; i < row; ++i)
{
len = _unicodeFunctions.getUtf8StringLength(textRows[i]);
for(int j = 0; j < len; ++j)
{
//skip characters that would not have passed the newline test
do
{
curLen = _unicodeFunctions.bringToNextUnichar(it,end);
curChar = getText().substr(bytesSkipped,curLen);
bytesSkipped += curLen;
charCount++;
}
while(curChar[0] < ' ');
}
}
len = len = _unicodeFunctions.getUtf8StringLength(textRows[row]);
if(column == 0 && charCount + 1 < getTextLength())
{
curChar = _unicodeFunctions.getUtf8SubStr(getText(),charCount,1);
while(charCount < getTextLength() - 1)
{
if(curChar[0] < ' ' && curChar[0] != '\n')
{
charCount++;
curLen = _unicodeFunctions.bringToNextUnichar(it,end);
curChar = getText().substr(bytesSkipped,curLen);
bytesSkipped += curLen;
}
else
{
break;
}
}
if(curChar[0] == '\n')
{
charCount++;
curLen = _unicodeFunctions.bringToNextUnichar(it,end);
curChar = getText().substr(bytesSkipped,curLen);
bytesSkipped += curLen;
}
}
for (int i = 0; i < column; ++i)
{
do
{
curLen = _unicodeFunctions.bringToNextUnichar(it,end);
curChar = getText().substr(bytesSkipped,curLen);
bytesSkipped += curLen;
charCount++;
}
while(curChar[0] < ' ');
}
return charCount - 1;
}
//and the opposite
AguiPoint AguiTextBox::columnRowFromIndex( int index )
{
std::string::const_iterator it = getText().begin();
std::string::const_iterator end = getText().end();
std::string curChar;
int charCount = 0;
int len = 0;
int byteCount = 0;
int curLen = 0;
for(int i = 0; i < (int)textRows.size(); ++i)
{
len = _unicodeFunctions.getUtf8StringLength(textRows[i]);
for(int j = 0; j < len; ++j)
{
//skip characters if needed
curLen = _unicodeFunctions.bringToNextUnichar(it,end);
curChar = getText().substr(byteCount,curLen);
byteCount += curLen;
while (curChar[0] < ' ' && curChar[0] != '\n')
{
curLen = _unicodeFunctions.bringToNextUnichar(it,end);
curChar = getText().substr(byteCount,curLen);
byteCount += curLen;
}
if(curChar[0] == '\n')
{
charCount++;
if(charCount == index)
{
return AguiPoint(j,i);
}
}
charCount++;
if(charCount == index)
{
return AguiPoint(j,i);
}
}
}
return AguiPoint(len,textRows.size() - 1);
}
答案 0 :(得分:1)
我不清楚你需要对数据做些什么。你想写一个编辑器还是究竟是什么?
你可以做的一件事就是建立一个指向每一行开头的指针数组,也许也就是每一行的长度。
这样,您可以在不修改基础数据的情况下表示所有行。
但您应该更好地准确描述转换数据的要求。