.. 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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``