Нахождение индекса в массиве символов данного столбца и строки? - PullRequest
0 голосов
/ 02 февраля 2011

Вот моя ситуация.

У меня есть алгоритм переноса слов, который генерирует строки текста, когда ширина слишком велика, или он находит \ n или '-' в тексте.

Поэтому он не включает '\ n' в саму строку текста. Это сложная часть для меня.

Я пытаюсь создать алгоритм, который будет возвращать индекс в массиве символов, учитывая строку и столбец.

Таким образом, если длина строки 1 равна 20, а длина строки 2 равна 10, если в строке 1 изначально было '\ n', это следует учитывать.

Ex:

текст:

Hello blue sky\nworld

тогда мы получим 2 строки:

Hello blue sky
world

теперь, если моя каретка представлена ​​знаком '|' и я размещаю это здесь:

  Hello blue sky
  |world

В результате получается не 14-й символ, а 15-й, поскольку необходимо учитывать невидимое '\ n'.

Сложнее всего, если слово wrap решит сгенерировать '\ n'

например:

  Hello blue 
  sky
  |world

В этом случае результат все равно должен быть 15, поскольку перенос по словам перенес новую строку, но не потому, что в тексте был символ \ 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);
}

1 Ответ

1 голос
/ 02 февраля 2011

Мне не совсем понятно, что вам нужно делать с данными. Вы пытаетесь написать редактор или что именно?

Одна вещь, которую вы могли бы сделать, это построить массив указателей на начало каждой строки и, возможно, длину каждой строки.

Таким образом, вы можете представлять все строки без изменения базовых данных.

Но вы действительно должны лучше точно описать требования ваших преобразованных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...