.. index:: pair: page; HTML Compatibility Layer
.. _doxid-ui_html_compatibility:
HTML Compatibility Layer
========================
eepp includes an HTML/CSS compatibility layer for rendering document-like content inside the UI system.
This layer is used primarily by:
* ``UIWebView``;
* ``UIMarkdownView``;
* HTML-derived widgets such as ``UIRichText``, ``UITextSpan``, HTML tables, forms, images, and inputs.
It is intentionally distinct from normal eepp application UI authoring.
For ordinary application UI, use native eepp layouts such as ``vbox``, ``hbox``, ``UIRelativeLayout``, ``UIGridLayout``, ``UIFlowLayout``, ``UISplitter``, and ``UITabWidget``. See ```ui_authoring.md```, ```ui_layout_reference.md```, and ```ui_css_for_applications.md```.
This document describes the **HTML compatibility model**, the browser-style layout concepts it implements, and the important places where it differs from a full browser engine.
.. _doxid-ui_html_compatibility_1autotoc_md840:
1. The most important boundary
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
eepp has two related but different layout worlds.
.. _doxid-ui_html_compatibility_1autotoc_md841:
Native application UI
---------------------
Normal eepp application interfaces use:
.. ref-code-block:: cpp
UILinearLayout / vbox / hbox
UIRelativeLayout
UIGridLayout
UIFlowLayout
UISplitter
UITabWidget
UIScrollView
layout-width
layout-height
layout-weight
layout-gravity
CSS can configure those widgets, but CSS does not replace their native layout algorithms.
.. _doxid-ui_html_compatibility_1autotoc_md842:
HTML compatibility UI
---------------------
HTML-derived widgets can instead participate in browser-style formatting contexts:
.. ref-code-block:: cpp
block
inline
inline-block
list-item
flex
inline-flex
grid
inline-grid
table
float / clear
absolute / fixed / sticky positioning
The same CSS parser and property system are shared by both worlds, but the **layout semantics depend on the widget type and formatting context**.
Do not use browser layout properties merely because the stylesheet parser accepts them.
.. _doxid-ui_html_compatibility_1autotoc_md844:
2. UIWebView is the full document host
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
``UIWebView`` is the main host for HTML documents.
It is implemented as a ``UIScrollView`` containing an embedded ``UISceneNode`` dedicated to the loaded document.
Conceptually:
.. ref-code-block:: cpp
UIWebView
scroll viewport
embedded UISceneNode
document container
html
head
body
The embedded scene gives the document its own:
* widget tree;
* stylesheet state;
* document URI;
* resource loading context;
* font-face registrations;
* navigation handling;
* text-selection context.
Use:
.. ref-code-block:: cpp
auto* webView = UIWebView::New();
webView->loadURI( URI( "file:///path/document.html" ) );
or an HTTP/HTTPS URI.
``UIWebView`` supports navigation history through:
.. ref-code-block:: cpp
goHistoryBack();
goHistoryForward();
refresh();
reload();
canGoBack();
canGoForward();
It also exposes navigation events for started, completed, and failed loads.
.. _doxid-ui_html_compatibility_1autotoc_md846:
3. UIMarkdownView uses the HTML compatibility layer too
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
``UIMarkdownView`` converts Markdown to XHTML and then loads the resulting body children as eepp HTML widgets.
Its pipeline is approximately:
.. ref-code-block:: cpp
Markdown
-> Markdown::toXHTML()
-> HTMLFormatter::HTMLBodyToXML()
-> eepp HTML widgets
Unlike ``UIWebView``, ``UIMarkdownView`` is not a standalone browsing context with document navigation and a dedicated embedded scene.
It is a native vertical layout hosting HTML-derived content and loads the **basic HTML default styles** needed for Markdown rendering.
Use ``UIMarkdownView`` for rendered Markdown content, not as a general browser replacement.
.. _doxid-ui_html_compatibility_1autotoc_md848:
4. HTML is parsed before eepp widgets are created
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
``UIWebView`` does not feed arbitrary HTML directly into the normal XML layout parser.
HTML is first parsed with Gumbo, then serialized into strict XML through ``Tools::HTMLFormatter``.
This stage handles browser-style HTML parsing details such as:
* malformed/non-XML HTML syntax;
* omitted closing syntax where HTML permits it;
* HTML void elements;
* boolean attributes;
* normalized tag names.
The resulting strict XML is then loaded through eepp's widget creation system.
This architecture is important:
.. ref-code-block:: cpp
HTML source
-> Gumbo HTML tree
-> strict XML representation
-> UIWidgetCreator
-> eepp widget tree
The final rendered document is therefore still made of eepp widgets.
.. _doxid-ui_html_compatibility_1autotoc_md850:
5. Only registered HTML elements are materialized
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HTML compatibility is not based on a generic DOM element class that accepts every possible tag.
HTML tags are mapped through ``UIWidgetCreator``.
Currently registered HTML elements include the major supported groups:
.. ref-code-block:: cpp
document:
html
head
body
text and inline:
a
label
span
em
b
strong
small
i
cite
kbd
sub
sup
time
u
ins
s
strike
del
font
code
abbr
tt
mark
blocks:
div
p
blockquote
h1 ... h6
br
hr
pre
lists:
ul
ol
dl
dt
dd
li
semantic containers:
header
article
figure
figcaption
footer
main
section
nav
aside
center
interactive/details:
details
summary
media/replaced content:
picture
img
svg
forms:
form
input
textarea
button
tables:
table
thead
tbody
tfoot
tr
th
td
The exact set is defined in:
.. ref-code-block:: cpp
src/eepp/ui/uiwidgetcreator.cpp
An unregistered tag does not automatically become a transparent generic HTML container.
Applications can register additional widget creators if they need custom tags.
.. _doxid-ui_html_compatibility_1autotoc_md852:
6. This is not a JavaScript browser runtime
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
``