crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Надо написать html браузер
bynet
  опции профиля:
сообщение 13.11.2008, 20:38
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 17.3.2008
Из: Belarus
Пользователь №: 124

Спасибо сказали: 0 раз(а)




Репутация:   0  


Мне надо написать html браузер. При написании его нельзя использовать практически никаких библиотек. Тоесть на читом visual studio. Без всяких STL, MFC. Но разрешили на qt,

Решил реализовывать использую регулярные выражения. Но стандартную библиотеку для работы с регуляными выражениями мне использовать нельзя.

Как лучше организовать регулярные выражения(алгоритм)? Или может лучше будет организовать другим способом?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 19.11.2008, 19:04
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(fsMark @ 19.11.2008, 19:55) Link
Помоему надо строить дерево отрожающее структуру HTML файла
это DOM-подход, он сложен.

Цитата(bynet @ 19.11.2008, 15:38) Link
Огромное спасибо, но мне минимум можно использовать стандартных функций. Все практически надо написать самому. Тоесть если строку парсить то надо написать свой парсер
это я понял, я и предлагаю тебе свой парсер написать, но несквозной. А в стиле SAX, т.е. ты создаешь свой класс обзываешь его к примеру MySAX. Интерфейс выглядит примерно так:
Интерфейс

#ifndef MYSAX_H
#define MYSAX_H

class QString;
class QFile;


/*!    SAX парсер.
*/
class MySAX
{


public:
    MySAX();
    ~MySAX();

    /*!    Загрузчик.
     *    
     *    Загружает файл в память и вызывает приватный метод start(), для анализа.
     *
     *    \param    file - файл для разбора.    
     *    \return    false - если неудалось загрузить файл или он неправильный.
     */
    bool load(const QFile &file);

    /*!    Обработчик открывающегося тэга.
     *    \param    tag - имя тэга.
     *    \param    text - текст следующий за тэгом (до символа "<").    
     *    \return    false - если необходимо прервать анализ.
     */
    virtual bool openTag(const QString &tag);

    /*!    Обработчик текста в нутри тэга.
     *    \param    text - текст следующий за тэгом (до символа "<").    
     *    \return    false - если необходимо прервать анализ.
     */
    virtual bool text(const QString &text);    
    
    /*!    Обработчик закрывающегося тэга.
     *    \param    tag - имя тэга.
     *    \return    false - если необходимо прервать анализ.        
     */
    virtual bool closeTag(const QString& tag);  

private:
    /*!    Сам синтаксический анализатор.
     */
    void start();

    int old_pos;
};

#endif //MYSAX_H



В функции start(), собственно парсере, ты ищещ тэги (закрывающий и открывающий).
Помере того как ты их находишь, вызываешь соответствующие методы. Например ты нашел открывающийся тэг, вызвал openTag(const QString &tag), в качестве аргумента передаешь имя тэга. Запоминашь позицию (номер символа)курсора сразу после тэга, ищешь слудющий тэг (или закрывающий или открывающий), когда нашел, то сначало берешь текст от запомненой позиции до текущей, передаешь его в text(const QString &text) затем вызываешь closeTag или openTag в зависимости от того какой тэг нашел. и т.д.

А вот заготовка реализации:
реализация

MySAX::MySAX()
{
}

MySAX::~MySAX()
{
}

bool MySAX::load(const QFile &file)
{
    if (!file.open(QIODevice::ReadOnly))
    {
        qDebug() << "Error: file " << file.fileName() << "is absent";
        return false;
    }

    qDebug() << "Open file: " << file.fileName();
    
    ...
    ...
    ...
    
}

bool MySAX::openTag(const QString &tag)
{
    qDebug() << "Open tag: " << tag;
}

bool MySAX::text(const QString &text)
{
    qDebug() << "\tIn tag text: " << text;
}

bool MySAX::closeTag(const QString &tag)
{
    qDebug() << "Close tag: " << tag;
}

void MySAX::start()
{
  QString    otag, ctag, text;
    
    // анализируем
    while(/*пока файл некончился*/)
    {
        ...
        // Нашли открывающийся тэг
        if (!openTag(otag))
            return;
        
        ...
        // Нашли закрывающийся тэг
        
            // читаем текст от старой позиции до новой
        text = ...;
        if (!text(text))
            return;
            
        if (!closeTag(ctag))
            return;
    }

}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- bynet   Надо написать html браузер   13.11.2008, 20:38
- - ViGOur   Столкнувшись с написанием конвертера HTML в WIKI ф...   13.11.2008, 22:46
|- - bynet   Цитата(ViGOur @ 13.11.2008, 22:46) Поэтом...   13.11.2008, 22:57
- - bobdva   Цитата(bynet @ 13.11.2008, 21:38) Мне над...   13.11.2008, 23:13
|- - bynet   Цитата(bobdva @ 13.11.2008, 23:13) Цитата...   13.11.2008, 23:22
- - ViGOur   Цитата(bobdva @ 13.11.2008, 23:13) Кстати...   14.11.2008, 0:09
|- - bobdva   Цитата(ViGOur @ 14.11.2008, 1:09) Цитата(...   14.11.2008, 8:58
- - Litkevich Yuriy   Цитата(bobdva @ 14.11.2008, 11:58) а чем ...   14.11.2008, 9:59
- - kuler   Цитата(Litkevich Yuriy @ 14.11.2008, 9:59...   14.11.2008, 10:33
- - Litkevich Yuriy   Цитата(kuler @ 14.11.2008, 13:33) Смысл?п...   14.11.2008, 11:06
- - kuler   Цитата(Litkevich Yuriy @ 14.11.2008, 11:0...   14.11.2008, 16:00
- - Litkevich Yuriy   Цитата(kuler @ 14.11.2008, 19:00) почему?...   14.11.2008, 16:51
- - kuler   Цитата(Litkevich Yuriy @ 14.11.2008, 16:5...   14.11.2008, 17:43
- - Litkevich Yuriy   Цитата(kuler @ 14.11.2008, 20:43) а если ...   14.11.2008, 18:05
|- - bynet   Огромное спасибо буду пробовать.   17.11.2008, 12:24
- - bynet   Читаю строку QTextStream::readline как мне онализи...   18.11.2008, 13:12
|- - AD   Цитата(bynet @ 18.11.2008, 13:12) Читаю с...   18.11.2008, 13:19
|- - bynet   Цитата(AD @ 18.11.2008, 13:19) Цитата(byn...   18.11.2008, 21:21
|- - AD   А что именно хочешь? Я не очень понимаю. Вот так о...   19.11.2008, 0:50
|- - bynet   Ок! Вот у меня есть строка Qstring str="a...   19.11.2008, 10:59
|- - AD   QString & QString::remove ( const QString ...   19.11.2008, 13:09
|- - trdm   Цитата(bynet @ 19.11.2008, 10:59) Как из ...   19.11.2008, 17:34
|- - molchanoviv   Цитата(bynet @ 19.11.2008, 10:59) Как из ...   19.11.2008, 20:20
- - Litkevich Yuriy   bynet, яб тебе всетаки рекомендовал использовать п...   19.11.2008, 11:55
- - bynet   Огромное спасибо, но мне минимум можно использоват...   19.11.2008, 12:38
- - bynet   Вот к чему я пришел CODE void Parser::open() { Q...   19.11.2008, 16:09
|- - fsMark   Помоему надо строить дерево отрожающее структуру H...   19.11.2008, 16:55
- - Litkevich Yuriy   Цитата(fsMark @ 19.11.2008, 19:55) Помоем...   19.11.2008, 19:04


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 10.3.2026, 12:06