WebView: Text-based Browser

...
  • Надо комбинировать два логических события, если не было сдвига курсора (координаты не менялись), то и рисовать не нужно, если это не полная перерисовка окна по событию перерисовки окна.
  • Я кстати написал кашерный скроллбар, могу разъяснить, только надо в исходник заглянуть и освежить в памяти весь процесс.
  • Вот, как смог написал. Надеюсь поймёшь. Если что непонятно, обращайся. :)

    Code: Select all

    =======================================================================================================
    === Алгоритм парсинга мыши для перемещения ползунка по оси у. =========================================
    =======================================================================================================
    а. Выделяем буфер размером в байт, для флага основной (начальной) координаты мыши по оси у.
    б. Выделяем буфер размером в дворд, для значения основной (начальной) координаты мыши по оси у.
    =======================================================================================================
    01. Надо получить координаты мыши в окне.
    02. Проверить где находится мышь.
    03. Если на ползунке, то проверить нажата ли левая кнопка мыши.
    04. Если нажата, то получаем текущую координату мыши по оси у. Если нет, то очещаем флаг основной (начальной) координаты мыши по оси у и выходим.
    05. Проверяем флаг основной (начальной) координаты мыши по оси у. 
    06. Флаг сброшен, то записываем в буфер координату по оси у (буфер б), устанавливаем флаг (буфер а)
    07. Выходим из парсера.
    --------------------------------------------------------------------------------------------------------
    08. Флаг установлен, то тогда сравниваем текущую координату мыши по оси у, с основной (начальной), которая должна быть в буфере (буфер б).
    09. Если текущая координата ниже, чем основная (начальная), то вычисляем разницу между ними. Разница = основная (начальная) корд. по оси у - текущая корд. по оси у.
    10. Эту разницу вычитаем из текущей координаты ползунка по оси у в буфере с координатами ползунка по оси у.
    11. Восстанавливаем основную (начальную) коорд. по оси у в буфере.
    12. Перерисовываем ползунок с новыми координатами.
    13. Выходим из парсера.
    --------------------------------------------------------------------------------------------------------
    14. Если текущая координата выше, чем основная (начальная), то вычисляем разницу между ними. Разница = текущая корд. по оси у. - основная (начальная) коорд. по оси у
    15. Эту разницу прибавляем к текущей координаты ползунка по оси у в буфере с координатами ползунка по оси у.
    16. Восстанавливаем основную (начальную) корд. по оси у в буфере.
    17. Перерисовываем ползунок с новыми координатами.
    18. Выходим из парсера.
    --------------------------------------------------------------------------------------------------------
    
    P.S. Прикрепил кексик скроллбара, поиграться. Сделан по этому алгоритму.
    Attachments
    SCROLLBAR.KEX (2.78 KiB)
    Downloaded 160 times
  • Спасибо! Попробую.
    Из хаоса в космос
  • А boxlib нельзя?
  • Можно, но я не умею.
    Из хаоса в космос
  • HTMLv замечательно открывает книги в формате fb2, только неправильно определяет кодировку. Будет здорово, если кнопки для смены кодировок будут легкодоступны. В fb2 кодировка определяется тегом:

    Code: Select all

    <?xml encoding="UTF-8"> 
    
    или подобным.
  • Я добавил этот тег в обработку, однако, если

    Code: Select all

    <?xml encoding="UTF-8"> 
    
    идёт в самом начале страницы обработчик обламывается почему-то. Он не читает первые несколько символов и почему так для меня загадка. Есть подозрение, что в http://websvn.kolibrios.org/filedetails ... 5&peg=2605 в строке

    Code: Select all

    for (; buf + fsize > bword; bword++;) { 
    в первом "параметре" не должно быть пусто.

    Перекодировка юзера будет, когда будет меню ПКМ. А оно будет однажды. Кнопки "Вперёд" ведь заработали спустя 2 года, и это будет. Обязательно :)
    Из хаоса в космос
  • Leency если не ошибаюсь ты же сам писал HTML Viewer.

    В

    Code: Select all

    for (; buf + fsize > bword; bword++;) {
    Первый параметр уже инициализирован в

    Code: Select all

    ParseHTML(dword bword, fsize)
    , вызов происходит так

    Code: Select all

    ParseHTML(buf, filesize);
    , т.е
    это аналогично если бы ты написал

    Code: Select all

    for (bword = buf; buf + fsize > bword; bword++;) {
    А ты учитываешь возможность присутствия bom маркера ?
  • Всё равно не правильно, у меня в начале вот такая строка:

    <?xml version="1.0" encoding="utf-8"?>

    Всё равно кракозябры...

    Да! Ещё ни в одном дистрибутиве не было такого, чтобы браузер как читалку использовать..предлагаю..расширить функциональность браузера...

    Тогда получается что одна из моих самых хотелок почти осуществилась!
  • Я себе приспособил HTMLv под fb2 читалку добавив шорткат на UTF кодировку, по аналогии с уже существующим Ctrl+K для KOI.

    Code: Select all

    ...
    case 021: //Ctrl+U
    ReadHtml();
    utf8rutodos(buf);
    break;
    Ещё пришлось подредактировать utf8rutodos, для нескольких встретившихся мне символов.
    С encoding разобраться с наскоку не удалось + в стандарте fb2 немного по другому работает тег <title> - он показывает промежуточные заголовки, а не заголовок всего документа.
    ---
    пример - в моей папочке на ftp
  • Оромный респект. Какие символы добавил? Код функции преобразования utf интересен. Алсо скоро ждите в новом билже.
    Из хаоса в космос
  • Что книжку мешало читать, то и добавлял - многоточие, тире, и по мелочи экспериментировал.
    Spoiler:

    Code: Select all

    inline fastcall int utf8rutodos(dword ESI) //-
    {
        EDI=ESI;
      while (BL=ESBYTE[ESI])
      {
        IF (BL == 0xD0) || (BL == 0xD1) EDI--;
            else IF (BL == 0x81) && (ESBYTE[ESI-1]==0xD0) ESBYTE[EDI] = 0xF0; //ш
            else IF (BL == 0x91) && (ESBYTE[ESI-1]==0xD1) ESBYTE[EDI] = 0xF1; //м
            //0xE2 0x80 - сгруппировать
            else IF (BL == 0xE2) && (ESBYTE[ESI+1]==0x80)
            SWITCH (ESBYTE[ESI+2])
            {
            case 0x93: //long defis
            CASE 0x94:
            {
              ESBYTE[EDI] = '-';
              ESI+=2;
                BREAK;
            }
            CASE 0xA2: //central point
            {
              ESBYTE[EDI] = '*';
              ESI+=2;
                BREAK;
            }
            CASE 0xA6: //многоточие
            {
              ESBYTE[EDI] = ESBYTE[EDI+1] = ESBYTE[EDI+2] = '.';
              EDI+=2;
              ESI+=2;
              break;
              }
            }
    
            //0xC2 сгруппировать
    
            else IF (BL == 0xC2) //таблицу перекодировок?
              SWITCH(ESBYTE[ESI+1]) {
                case 0xAB: //"
                CASE 0xBB: //"
                  {
                    ESBYTE[EDI] = '\"';
                    ESI++;
                    BREAK;
                  }
                CASE 0xB7: // _
                  {
                    ESBYTE[EDI] = '_';
                    ESI++;
                    BREAK;
                  }
                CASE 0xA0: // Alt+160 - неразбивающий пробел
                  {
                    ESBYTE[EDI] = ' ';
                    ESI++;
                    BREAK;
                  }
                CASE 0xB0: // градус
                  {
                    ESBYTE[EDI] = '\29';
                    ESI++;
                    BREAK;
                  }
                CASE 0xA9: // (c)
                {
                  ESWORD[EDI] = 'c(';
    //              ESBYTE[EDI] = '(';
    //              ESBYTE[EDI+1] = 'c';
                  ESBYTE[EDI+2] = ')';
                  EDI+=2;
                  ESI++;
                  BREAK;
                }
                CASE 0xAE: // (r)
                {
                  ESWORD[EDI] = 'r(';
                  ESBYTE[EDI+2] = ')';
                  EDI+=2;
                  ESI++;
                  break;
                }
              }
    
            ELSE IF (BL >= 0x90) && (BL <= 0xAF)
        {
          BL -= 0x10;
          ESBYTE[EDI] = BL;
        }
            ELSE IF (BL >= 0x80) && (BL <= 0x8F)
        {
          BL += 0x60;
          ESBYTE[EDI] = BL;
        }
          ELSE IF (BL >= 0xB0) && (BL <= 0xBF)
        {
         BL -= 0x10;
         ESBYTE[EDI] = BL;
        }
        ELSE ESBYTE[EDI] = BL;
        ESI++;
        EDI++;
      }
      WHILE (EDI<ESI)
      {
        ESBYTE[EDI] = ' ';
        EDI++;
       }
    }
  • Может действительно расширить функционал? Не только браузер, но и читалка, для фб2? fb2 лучше парсить asmxml ( viewtopic.php?f=24&t=1701 ) и пользоваться уже результатами обработки этой библиотеки. Тогда и проблем не будет.
  • Who is online

    Users browsing this forum: No registered users and 0 guests