Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Написать браузер на c

Alex_R

суббота, 3 сентября 2011 г.

Пишем простенький браузер на C#

Создаём свой веб браузер с помощью Windows Forms C#

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

Итак заходим в VS C# и выбираем создать новый проект Windows Forms

Придумываем название проэкту и жмём ок.

Появившеюся форму можно растягивать как хотим,что мы и сделаем дабы увеличить наше окошко.

1.Далее из ToolBox-а выбираем и перетаскиваем на форму элемент управления WebBrouser.
Если у вас WebBrouser занял как у меня всё место на форме то жмём на треугольничке в правом верхнем углу левой кнопкой мыши -> Unlock in Parent Container,получили форму вида.

Если же пред вами веб браузер предстал в таком виде как на скрине ниже,то ничего не делайте.

3.Поместим её вверхней части экрана.Далее кликаем правой кнопкой мыши на текстбоксе и вызываем свойства(properties) находим свойство Dock и устанавливаем его значение в Top.

4.Далее вспоминаем как мы делали шаг №1,и кликаем на треугольничке на элементе управления веббраузер(WebBrouser) и жмём Dock in Parent Container.

Теперь наша форма приняла вид:

По умолчанию Visual Studio дало текстбоксу и веббраузеру имена textBox1 webBrouser1,хорошим стилем программирования считается менять такие имена на более понятные,то есть имя textBox1 не несёт в себе никакого смысла,вот если я изменю это имя на textBoxUrl,то любой человек догадается что этот текстбокс предназначен для введения веб адреса.Также свойство Text элемента управления textBoxUrl я изменил с значения пустой строки на фразу Enter web adress,для того чтобы даже самый несмышлённый пользователь понял что в это поле нужно ввести название веб адреса.
Имя webBrouser1 я поменял на webBrouser,как по мне поскольку у нас будет использоваться только один элемент управления то индекс 1 можно и убрать.

Скрины приведены ниже:

Пока что наш браузер будет выполнять только одну функцию: после того как пользователь ввёл веб адрес и нажал на клавишу «Enter» браузер загрузит выбранную пользователем страницу.

5.Заходим в свойства текстбокса и переключаемся в роздел Events(события)

Написание своего WEB — браузера с нуля

13 ответов

[QUOTE=c0ut]Ну да есть желание написать полноценный браузер .[/QUOTE]

Со скептицизмом отношусь к этой затее. Для начала оцените, какие браузеры уже существуют, ознакомьтесь с историей их развития. Оцените свои силы. А потом вздохните и откажитесь от своей затеи 😉

Если серьёзно — то самое сложное в браузере — это организовать движок DOM и парсер XML (на основе которого потом строить поддержку XHTML), если автор решил развивать в будущем свой проект. Если это просто эксперимент или любопытство, можно сделать простой разборщик HTML модели и на этом успокоиться. И кстати написать «полноценный» браузер скажем без поддержки CGI-скриптов невозможно, ибо иных сайтов почти не осталось.

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

2 автор: без обид, просто надо реально оценивать силы и знать, что потребуется для реализации этой идеи. то есть за 5 минут в делфи не получится. в идеале — чистый GNU C++ и год работы.

Кстати :-), cgi браузеры вообще не поддероживают. Cgi выполняется на стороне сервера, который генерит HTML код. По-моему это должен знать каждый, кто начинает рассказывать про то, что «самое сложное в браузере — это организовать движок DOM и парсер XML».

P.S. madjahed абсолютно прав.

Не унывай )
Конкретно: если под браузером ты понимаеш прогу которая берет из сети html текст, рендерит страницу и показывает её в красивом скроллящемся окне, самое простое с чего можно начать это определить что:
— страница на экране — это отформатированный текст и графика, которые будучи один
раз положенными на layout страницы не меняют своего положения до изменения размеров самого layout’а (это важно)
— страница только что загруженная из сети — это html текст, который может быть однозначно разобран и по которому можно построить layout страницы видимой на экране.
— layout — совокупность элементов страницы где для каждого элемента задан его тип (текст/ссылка, изображение) и расположение.

таким образом, алгоритм браузера сводится к:
— скачать html текст
— построить layout
— показать страницу в красивом скроллящемся окне
— подождать действий пользователя

Как организовать форматирование, кошерные ссылки или что лучше использовать для рендеринга — эти вопросы выходят за рамки минимально простого..

Скорее всего, сюда написал бот, сообщение которого было удалено администрацией. Но. движок форума настолько странен, что он почему-то в «Новых сообщениях» всё равно отображает, что тот пользователь писал сюда (и число), поэтому тема и всплыла.

Пишем свой браузер для Linux, и не только для Linux

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

Не секрет, что проекты, разработанные, к примеру, на Delphi c использованием компонента TWebBrowser, являются очень распространенным решением, применяемым во множестве случаев. А как быть, если вы все-таки предпочтете аналогичный проект в среде Linux? Как раз для такого случая стоит использовать программную платформу Qt (ru.wikipedia.org/wiki/Qt). У нее есть много достоинств, в том числе богатство средств и солидная история. К примеру, на базе Qt создана популярная графическая система KDE. Не менее важно, что теперь для написания программ на Qt можно применять современную кросс-платформенную IDE Qt Creator, что с того времени, когда разработчику были доступны только Qt Designer и KDevelop, порог вхождения в мир программирования на Qt стал значительно ниже. В общем, сейчас и в Linux можно программировать перетаскиванием «кнопочек» на «формочки», не рискуя запутаться между разными программными классами и утилитами.

Что такое WebKit и как его использовать
WebKit – современный распространенный движок (ru.wikipedia.org/wiki/WebKit) для отображения веб-контента. Если покопаться в генеалогическом древе, то выяснится, что этот движок находится в родственных отношениях (прямых и не очень) с браузерами Konqueror, Safari и Chrome.
Когда обсуждается возможность использования WebKit на платформе Qt, имеется в виду QWebKit, но имя соответствующего класса в Qt значится как QWebView. Именно этот класс можно так же, как и в Delphi или в C++Builder, визуально перетащить на форму и реализовать за 5 минут собственный веб-браузер.

Читать еще:  Онлайн переводчик браузера

Чтобы загрузить веб-страницу, нужно написать:

Следовательно, для QWebView требуется предоставить адрес в формате класса QUrl. Именно этот класс (а не какой-либо строковый тип) используется для работы с интернет-адресами.

Полное описание класса QWebView имеется на сайте doc.qt.nokia.com, а кроме того, в Qt Creator доступна контекстная справка. Базовые методы этого класса понятны и без справок. К ним относятся:

Собственно, это уже не просто описание методов, а фрагменты кода, и если вы еще не создавали проектов в QtCreator, то сделать это просто:

File -> New File or Project -> Qt C++Project->Qt Gui Application

По умолчанию в таком проекте уже будут существовать объекты menuBar, mainToolBar и statusBar.


В новый проект добавлен объект класса QWebView

Визуальный доступ к методам back, forward, reload и stop традиционно принято предоставлять из панели быстрого вызова (mainToolBar). Конечно, это можно реализовать в Qt-приложении, но следует соблюдать осторожность — не все в Qt Creator интуитивно понятно. Если пункт Add Tool Bar на дереве объектов легко найти через всплывающее меню, то добавить сами кнопки будет сложнее.
К примеру, требуется добавить возможность обновления страницы. Для этого сначала необходимо ввести нужное действие (Action) в Action Editor, а потом уже методом Drag-and-Drop связать его с mainToolBar и … о чудо! – в ToolBar появляется новая кнопка.
А теперь по порядку.
Класс QAction описывает какое-либо действие вне жесткой связи с источником и типом события, а также с его процедурой-обработчиком ((http://doc.crossplatform.ru/qt/4.7.x/qaction.html#details).

Такой посредник дает программисту более гибкий механизм создания интерактивного графического интерфейса, где, благодаря древнему принципу повторяемости кода, одновременно сохраняются и эффективность, и эстетика. Разработчик описывает заголовок (который потом может стать пунктом меню) и другие атрибуты действия. К примеру, мы можем один раз описать действие обновления страницы. Для этого нужно добавить это действие в Action Editor, привязать к нему кнопку быстрого запуска (Shortcut), задать его имя (Object name) и значок, а потом включить в mainToolBar и в menuBar. Причем дело даже не успевает дойти до фактического описания программного события.


. Редактирование информации о действиях в Action Editor

Осталось создать необходимый код, соответствующий нажатию кнопки, т.е. описать внутреннюю кухню этого нового действия.
Следует вернуться в Action Editor и для созданного действия actionReload через всплывающее меню в пункте Go to slot. найти подходящий сигнал. После чего нужно привязать к нему необходимый код (Qt Creator любезно подскажет, куда именно его вписать) и вставить одну строку программы:


Выбор нужного сигнала

Аналогично можно поступить с методами back(), forward() и stop().

Адресная строка
А вот чтобы создать в том же ToolBar адресную строку с помощью компонента QLineEdit, визуальное программирование уже не поможет. Нужно открыть файл mainwindows.h и добавить в описание класса MainWindow эту самую адресную строку следующим образом:

Чтобы компилятор понял, что такое QLineEdit, вверху файла необходимо добавить:

Теперь в конструкторе в файле mainwindow.h требуется создать адресную строку и привязать ее к mainToolBar:

Пора подумать, как привязать к созданной адресной строке нужный код. Для начала в файле mainwindow.h следует найти секцию private slots и декларировать там обработчик события нажатия клавиши в адресной строке:

а в файле mainwindow.cpp нужно описать соответствующую реализацию:

Если же осталось ощущение, что slotGoEnterPressed() и UrlPath на самом деле ничего не связывает, то оно верное, потому что нужно записать магическую строку в конструкторе главного окна в файле mainwindow.h. В этой строке будет описано, что к чему привязывается и на каких условиях:

Раскроем ее для непосвященных.
Функция connect предназначена для связи сигнала с обработчиком приемника, указанным в макросе SLOT. Адресная строка UrlPath посылает стандартный сигнал нажатия клавиши . А то, что обрабатывается именно этот сигнал, указано в макросе SIGNAL.

Ура! В самом первом приближении адресная строка готова.

Отображение степени загрузки страницы
Для отображения степени загрузки нужно выделить в визуальном редакторе объект WebView и через пункт Go to slot… выбрать в открывшемся списке сигналов сигнал loadProgress(int). Оказавшись в редакторе кода, следует заполнить автоматически сгенерированную заготовку обработчика:

Но этой строчкой просто отображается сам факт загрузки очередной страницы, а с процентами можно поступить хитрее. В файле mainwindow.h следует описать внутри класса MainWindow графический индикатор:

Таким образом PageProgress будет не только создан, но и размещен внутри statusBar. Предполагается, что PageProgress будет виден только в периоды загрузки страницы, в чем помогут сигналы loadStarted() и loadFinished(bool).
Теперь обработчик on_webView_loadProgress можно дополнить строкой:

В итоге получился вполне достойный результат. С одной стороны, все очень удобно: информация о реальной загружаемой странице отображается в левой части statusBar, а PageProgress сам собой точно расположился в правой части. А каплей дегтя оказались проблемы с русским языком — вместо слова «Загрузка» получилась «кракозябра». Решается это просто:

Отображение истории
Процесс создания главного меню браузера представляет собой рутинную работу, так что описывать его полностью вряд ли уместно. К тому же нет пределов совершенства любой программы. Но все же для примера динамически отобразим историю работы с браузером, т.е. будем перестраивать соответствующий пункт главного меню по мере необходимости:

Таким образом, в динамическом режиме перестраивается список интернет-адресов, и к каждому пункту вновь привязывается обработчик следующего содержания:

//Декларация обработчика пункта меню истории браузера в файле mainwindow.h
.
private slots:
void slotLoadHistPage();

/* Файл mainwindow.h
Реализация приемника сигнала пункта меню истории браузера выглядит очень загадочно */
void MainWindow::slotLoadHistPage() <
//Извлекаем из источника сигнала информацию для загрузки страницы
QAction* a = qobject_cast ( sender() );

//Загружаем страницу из истории
ui->webView->load(QUrl(a->text()));
>

Улучшение метода загрузки страницы
Попробуем запустить программу с реализованным вариантом адресной строки, набрав там, к примеру, www.mail.ru . В результате ничего не получится, потому что наш браузер оказался очень привередливым. Он знать ничего не хочет про тип ресурса, который ему хотят передать, если этот тип явно не указывают. Значит, имеет смысл написать некий универсальный метод загрузки, решающий эту проблему, например такой:

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

Загрузка файла или HTML-строки
А если нужно загрузить HTML-страницу с диска? Тогда следует просто указать соответствующий тип данных:

Читать еще:  Картинки для яндекс браузера

И конечно, допустимо загрузить строку гипертекста напрямую, так можно поступить при выводе информации о браузере:

» +
trUtf8(«Этот браузер создан на базе класса QWebView»)+ «

Вылавливание инструкции на открытие новых окон
Теперь проведем следующий тест. Загрузим в наш браузер сайт www.mail.ru и попробуем перейти по одной из новостных ссылок, которые находятся примерно в середине экрана. Не выходит? А если добавить в конструктор главного окна строку:

Опять ничего? Действительно, мы просто попросили браузер не обрабатывать самостоятельно ссылки со страницы при щелчке, а вместо этого выдать сигнал, под который мы и сделаем обработчик. В списке сигналов для WebView найдем сигнал linkClicked(QUrl) и напишем для него обработчик:

На традиционный вопрос: «А что было?» — ответ прост: мы научили наш однооконный браузер загружать страницу, которую обычный браузер загружал бы в новое окно.

Три волшебные строки
В проекте нужно обязательно упомянуть про три строки, которые, скорее всего, при создании браузера придется добавить в функцию main (main.cpp) :

/* Разрешение на автоматическую загрузку картинок в странице*/
QWebSettings::globalSettings()->setAttribute(QWebSettings::AutoLoadImages,true);
/* Разрешение на запуск java-скриптов*/
QWebSettings::globalSettings()->setAttribute(QWebSettings::JavascriptEnabled, true);
/* Разрешение на использование плагинов*/
QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);

В руководстве написано, что первые две опции активны по умолчанию, но в Рунете много раз встречаются все три разрешения вместе, особенно когда речь идет об активизации Flash.


Новый браузер – почти за 5 минут

Браузер готов?
В заключение стоит отметить, что на форумах самыми проблемными темами, связанными с QWebView, являются вопросы взаимодействия с Flash и Java-скриптами. К примеру, если у вас наконец заработал в браузере Flash, то, возможно, радоваться еще рано, погоняйте браузер с разными сайтами — велика вероятность новых сюрпризов… Однако в тех случаях, когда речь идет не об обычном публичном браузере, а о проекте с заранее известными характеристиками отображаемого контента (например, платежный терминал), все становится проще. Но такой вариант уже будет темой отдельной статьи.

Как создать свой собственный веб-браузер в Visual Studio Community

Чтобы создать сегодня свой сайт, совсем необязательно знать языки программирования, большинство веб-ресурсов не пишется, а собирается в различных программах-конструкторах, получивших в последнее время широкое распространение. Конструкторы эти становятся настолько совершенными, что создавать в них можно даже собственные десктопные приложения. Пример работы в одном из таких конструкторов мы сегодня рассмотрим, создав в нём с нуля свой браузер.

Естественно, браузер будет обладать минимальным набором функций, но ведь мы и не претендуем на звание профессиональных разработчиков. В качестве конструктора мы будем использовать Visual Studio Community 2019 — бесплатную интегрированную среду разработки для написания и запуска кода на разных платформах. Название может показаться пугающим, в действительности ничего такого архисложного нет, код писать почти не придется, вместо него мы будем собирать его готовые блоки, представленные графическими элементами.

Итак, идем на сайт visualstudio.microsoft.com/ru, скачиваем файл автономного установщика и запускаем.

Выбираем установку Visual Studio Community 2019.

В меню «Рабочие нагрузки» выбираем блок «Windows», а в нём — опцию «Разработка классических приложений .NET». Жмем «Установить».

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

По завершении установки и запуска платформы.

Выбираем в меню «Создание проекта».

Прокручиваем список шаблонов и находим в нём Приложение Windows Forms в (.NET Framework).

Жмем «Далее», даем будущему браузеру имя и нажимаем «Создать».

Через несколько секунд перед нами предстает пустая форма, в ней будем размещать элементы управления веб-обозревателем. Вызываем нажатием на узкую полоску слева панель инструментов, раскрываем пункт «Все формы Windows Form» и выбираем двойным кликом «WebBrowser».

Справа располагаются другие две панели, верхняя содержит список файлов проекта, нижняя — свойства пока еще пустого окна. Здесь можно изменять параметры выбранного элемента — устанавливать размеры окна, его прозрачность, фон, включать и отключать полосы прокрутки и так далее. Если это будет не окно, а другой элемент, скажем, кнопка, то и параметры будут другие.

Рабочее окно уже есть, теперь следует позаботиться об элементах управления. Создадим область для панели инструментов обозревателя. Кликаем по маленькой иконке-треугольнику около кнопки закрытия окна и жмем «Открепить в родительском контейнере».

А затем растягиваем появившуюся пунктирную линию в окне будущего браузера, формируя таким образом панель управления.

Теперь создадим кнопки «Вперед», «Назад» и «Домой», «Обновить», для чего возвращаемся на панель инструментов и перетаскиваем на форму элемент «Button» столько раз, сколько нужно создать кнопок.

Желающие также могут создать текстовое поле для ввода текстовых данных (TextBox) и кнопки перехода, но мы ограничимся четырьмя элементами. Разместив их на форме должным образом, кликаем по каждому из них и настраиваем их параметры — даем им соответствующие наименования, меняем, если нужно, цвет и так далее. Теперь настала пора самого главного — назначения управляющим элементам действий. Для этого дважды кликаем по каждой из кнопок и прописываем в месте, где установился курсор следующий код:

• Для кнопки «Обновить» — webBrowser1.Refresh();
• Для кнопки «Домой» — webBrowser1.Navigate(«www.google.com»);
• Для кнопки «Вперед» — webBrowser1.GoForward();
• Для кнопки «Назад» — webBrowser1.GoBack();

Сохраняем результат через меню «Файл» -> «Сохранить всё» и запускаем компиляцию приложения нажатием кнопки «Пуск» на панели управления средой разработки (исполняемый файл находится в папке проекта) .

Через несколько секунд собственноручно сконструированный браузер запустится.

Если элементы на форме окажутся не там, где предполагалось, исправляем, перемещая их в визуальном редакторе.

Конечно, это будет очень простой браузер без закладок, поддержки тем и расширений, да и корректность отображения сайтов в нём в не гарантируется, зато вы можете быть уверены в его «чистоте».

Размер созданного браузера у нас составил всего 9,5 килобайт, но этого вполне хватило, чтобы вместить в него базовый функционал, обеспечивающий не только веб-серфинг, но и скачивание файлов, а также просмотр мультимедийного контента в потоковом режиме.

Написать браузер на c

Здравствуйте, graviton9, Вы писали:

G>Привет. Хочу написать свой браузер причем с нуля в инете везде советуется встроенная в visual studio тулза CppWebBrowser но мне это не устраивает.

До пенсии планируешь закончить? Или уже внукам отдашь эстафету?

G> Опыт у меня достаточно.
(1)
G> С чего начать какие функции, апи, книги статии и тгд посоветуйте.
(2)

Читать еще:  Лагает youtube в яндекс браузере

эти два пункта, мягко говоря, противоречат друг другу.

Итак, что нужно
Расскажу что нужно для простого браузера который умеет открывать html и поддерживать css, без js.

Сначала для невизуальной части
Модель хранящую структуру документа:
текст, форматирование(свойства) текста, стили текста
параграфы, форматирование параграфов,
изображения,
нумерованные списки
таблицы, форматирование таблиц, строк, ячеек, бордюров
поддержка блоков

Парсер html я (вручную написанный), который умеет применять стили и форматирование к добавленным в модель объектам, должен переваривать любые плохие html и, c незакрытыми тегами, обрабатывать ошибки (обобый гемор тут с таблицами, потому большинство страниц используют табличную верстку, и если в процессе импорта у вас ошибка в расчете табличного грида(span пропустили) — все разъедится или упадет.
Также нужен парсер секции со стилями и алгоритм применения стилей (не так просто, как звучит).

Чтобы эту радость показать нужно создать лайаут страницы. Тут нужно вам написать форматировщик, умещающий текст на строке , разбивающий на параграфы, учитывающий все отступы, + расчет таблиц, и расположение текста внутри( fit или нефит), потом блоки, обтекание текста..и прочий гемор.
Когда лайаут получен отрисовать его на форме дело техники, там и хиттест, селекшн (а селекшн хитрый, не просто по словам, там еще куча логики при выделении таблиц, ) .
Так, забыл, еще нужно поддержать копирование (алгоритм копирования не так прост) тут нужно еще rtf v1.9 поддержать, прийдется писать экспортёр для него ,и txt все это кладется вместе в клиборд при копировании. (+ экспортёр в html тоже).
Асинхронно грузить картинки.
еще 100500 всего, что я не слёту не вспомню.
Все это нужно чуть взболтать заоптимизить чтобы не лагало. примерно 6 человеколет упорного 8h/d труда. Удачи вам, надеюсь передумали. А если сможите 0.01 ую часть реализовать и не забъёте вы молодец.

Здравствуйте, graviton9, Вы писали:

Первым делом надо придумать красивое название новому браузеру.

Здравствуйте, graviton9, Вы писали:

G>Здравствуйте, DorfDepp, Вы писали:

DD>>Здравствуйте, graviton9, Вы писали:

G>>>Речь не идет о написании браузера типо chrome, mozzila, opera. имею ввиду простенкий браузер для отображения страниц

DD>>Для «отображения страниц» нужно освоить, как минимум, HTML и CSS, спецификации которых весьма путанны и неоднозначны, к тому же существуют разные версии. Потом еще нужно сделать восстановление после возникших ошибок парсинга. И еще тысяча вещей.

DD>>Одному человеку это не под силу.
G>Спасибо за ответы. Просто на одном форуме посоветовали (видимо пошутили). Просто после процессного менеджера и файл менеджера (закончил на 40 % примерно) хотелось что то посерезнее, кстати что посоветуйте напистаь ?

Тут главное, не размениваться на мелочи. Лучше сразу начинать писать свою ось. Тем более что есть масса положительных примеров: Таненбаум, Торвальдс.

Здравствуйте, graviton9, Вы писали:

G>Привет. Хочу написать свой браузер причем с нуля в инете везде советуется встроенная в visual studio тулза CppWebBrowser но мне это не устраивает. Опыт у меня достаточно. С чего начать какие функции, апи, книги статии и тгд посоветуйте. Спасибо.
Начать можно покурив травы отсюда

Здравствуйте, graviton9, Вы писали:

G>Привет. Хочу написать свой браузер причем с нуля в инете везде советуется встроенная в visual studio тулза CppWebBrowser но мне это не устраивает. Опыт у меня достаточно. С чего начать какие функции, апи, книги статии и тгд посоветуйте. Спасибо.

Я рекомендую взяться за Qt. Там есть Webkit, и вам не придется заниматься велосипедостроением. Подробнее, можете подсмотреть здесь — http://doc.qt.nokia.com/latest/qtwebkit-guide.html
http://doc.qt.nokia.com/latest/qwebview.html

Здравствуйте, Xronosd, Вы писали:

X>Итак, что нужно
X>Расскажу что нужно для простого браузера который умеет открывать html и поддерживать css, без js.

X>Сначала для невизуальной части
X>Модель хранящую структуру документа:
X>текст, форматирование(свойства) текста, стили текста
X>параграфы, форматирование параграфов,
X>изображения,
X>нумерованные списки
X>таблицы, форматирование таблиц, строк, ячеек, бордюров
X>поддержка блоков
Я бы сюда добавил обработку стилей CSS, как то каскадирование, наследование, assigning.

X>Парсер html я (вручную написанный), который умеет применять стили и форматирование к добавленным в модель объектам, должен переваривать любые плохие html и, c незакрытыми тегами, обрабатывать ошибки (обобый гемор тут с таблицами, потому большинство страниц используют табличную верстку, и если в процессе импорта у вас ошибка в расчете табличного грида(span пропустили) — все разъедится или упадет.
Именно парсер html можно, полагаю, выбрать из уже написанных. Хотя, тут я немного не в теме, т.к. у нас xhtml.
X>Также нужен парсер секции со стилями и алгоритм применения стилей (не так просто, как звучит).
Совсем непросто. Но кроме секции со стилями, нужен еще и разбор внешних CSS, инлайн CSS.

X>Чтобы эту радость показать нужно создать лайаут страницы. Тут нужно вам написать форматировщик, умещающий текст на строке , разбивающий на параграфы, учитывающий все отступы, + расчет таблиц, и расположение текста внутри( fit или нефит), потом блоки, обтекание текста..и прочий гемор.
X>Когда лайаут получен отрисовать его на форме дело техники, там и хиттест, селекшн (а селекшн хитрый, не просто по словам, там еще куча логики при выделении таблиц, ) .
X>Так, забыл, еще нужно поддержать копирование (алгоритм копирования не так прост) тут нужно еще rtf v1.9 поддержать, прийдется писать экспортёр для него ,и txt все это кладется вместе в клиборд при копировании. (+ экспортёр в html тоже).
Выделение и копирование к самой собственно разметке не относятся. Имхо, это уже дополнительные фенечки, которые нужны не для всех задач, где нужна разметка.

X>Асинхронно грузить картинки.
Фенечка
X>еще 100500 всего, что я не слёту не вспомню.
+1
Например, загрузка шрифтов, чтение метрик, Font matching, не вспоминая уж о разметке под кернинг и т.п.

X>Все это нужно чуть взболтать заоптимизить чтобы не лагало. примерно 6 человеколет упорного 8h/d труда.
Это мало взболтать и запотимизить, т.к. кроме того, что бы собственно написать какой-то вариант какой-нибудь фичи, нужно долго болеть головой о том, какой же из существующих движков делает это более правильно, с чего лизать свою реализацию.
X>Удачи вам, надеюсь передумали. А если сможите 0.01 ую часть реализовать и не забъёте вы молодец.
Очень здорово, когда задача разметки ограничена и не нужно поддерживать всевозможные html. Например, отсутствие js — значительное облегчение. ограничение только xhtml — тоже.

Ссылка на основную публикацию
Adblock
detector