Index

HtmlPrinter

MMO\doc · 1 symbol · generated 30 Sep 2026

class

HtmlPrinter

HtmlPrinter.php:23

Renders a documentation page (DocPage) as html, for DocPageController.

class MMO\doc\HtmlPrinter extends MMO\core\printers\TextPrinter
Namespace
MMO\doc
Extends
TextPrinter
It is the exact counterpart of [`MarkdownPrinter`](https://mmoframework.fr/documentation/mmo.doc/php/MarkdownPrinter.md#markdownprinter) -- same model in, same sections, same anchors -- but where the markdown is written to stay portable, this one is written to be *used*: it leans on mmo.client's own elements (`<mmo-code>` for every signature, `<mmo-markdown>` for every description, `<mmo-doc-example>` for a runnable `@example`) and on the Simple CSS design system's tokens through `src/styles/documentation.scs`. No style is written inline: every class it emits is declared there. Nothing is fetched and nothing is computed at request time -- the model already holds resolved types, resolved links and the call graph, so rendering a page is a single pass over it.
$html = \MMO\doc\HtmlPrinter::Print($page, ['exampleUrl' => \MMO\url('doc/example/run')]);

Index

defaultLanguage
kindIcons
markdownLevel
code($source, $language)
crumbs($crumbs)
escape($text)
examples($examples, $language, $options)Every @example. A php one whose symbol is known becomes a runnable block: <mmo-doc-example> posts only {symbol, index}, and the server re-reads the code from that symbol's own doc comment…
exportIndex($sections, $options)The index page's body: every namespace, class, interface, trait, enum, exception, function, element… of every library, one section per kind (DocIndex::Sections).
exportMember($member, $options)
exportPage($page, $options)
exportSymbol($symbol, $options)
firstSentence($text)
href($reference)Resolve a reference to a url now, in the context of this request.
index($sections)
indexEntry($entry)One line of the index page: what it is, its name -- namespace included, so two entities or two Routes are told apart at a glance --, what it does.
inherited($symbol)
inline($text)Render the small subset of markdown a one-line summary actually uses, without pulling in a parser or an element for every cell of every table on the page.
languageOf($symbol)
lead($text)The lead paragraph under a heading -- a symbol's or a member's summary.
markdown($text)
memberLabel($member)
memberLanguage($symbol, $member)
parameters($params, $return, $throws, $sees)The contract of a callable, as one table: what goes in, what comes out, what can go wrong.
reference($reference)
relations($symbol)
renderRail($page, $options)The sticky outline: every symbol of the page, and under each one its members grouped by kind.
renderTopbar($options)The bar pinned at the top of every documentation page: the way back to the index.
see($text, $sees)
source($file, $line)
type($type)
usage($symbol)
__construct($config)

Properties3

defaultLanguage

string $defaultLanguage = 'php'
Type
string

kindIcons

array $kindIcons = […13 items]
Type
array

markdownLevel

int $markdownLevel = 5
Type
int

Methods29

code($source, $language)

HtmlPrinter.php:523
function code(string $source, string $language): string
$sourcestring
$languagestring
returnsstringa <mmo-code> block; the element highlights it client side through Prism.

examples($examples, $language, $options)

HtmlPrinter.php:496

Every @example. A php one whose symbol is known becomes a runnable block: <mmo-doc-example> posts only {symbol, index}, and the server re-reads the code from that symbol's own doc comment before running it in a sandbox (ExampleController) -- the browser never submits code.

protected function examples(array $examples, string $language, array $options): string
$examplesarray
$languagestring
$optionsarray
returnsstring

exportIndex($sections, $options)

HtmlPrinter.php:151

The index page's body: every namespace, class, interface, trait, enum, exception, function, element… of every library, one section per kind (DocIndex::Sections). Each entry carries what the page's filters need (data-lib, data-lang, data-text), so filtering never goes back to the server.

function exportIndex(array $sections, array $options = []): string
$sectionsarraykind => entries
$options = []arrayunused, kept for the printer's signature
returnsstring

exportPage($page, $options)

HtmlPrinter.php:70
function exportPage(MMO\doc\models\DocPage $page, array $options = []): string
$pageDocPage
$options = []arrayexampleUrl: where ExampleController runs a snippet (no run button without it); crumbs: [label => url|null] shown above the title
returnsstringthe page body -- the rail is rendered separately, renderRail

firstSentence($text)

HtmlPrinter.php:678
protected function firstSentence(string $text): string
$textstring
returnsstringthe first sentence of a text -- what an index row or a tooltip has room for. A summary written across several lines would otherwise blow a table row up to five lines high

href($reference)

HtmlPrinter.php:610

Resolve a reference to a url now, in the context of this request.

function href(array $reference): ?stringA generated page is stored as a path (`mmo.core/php/server/Route.md`) rather than a url, because the generator usually runs from a shell where `{siteurl}` means nothing -- [`Documentor::getPagePath`](https://mmoframework.fr/documentation/mmo.doc/php/Documentor.md#documentor-getpagepath). An external target (php.net) is already absolute and is used as it is.
$referencearray
returnsnull | string

index($sections)

HtmlPrinter.php:326
protected function index(array $sections): string
$sectionsarray
returnsstringthe member index -- the whole api of a symbol on one screen

indexEntry($entry)

HtmlPrinter.php:204

One line of the index page: what it is, its name -- namespace included, so two entities or two Routes are told apart at a glance --, what it does. A guide has no namespace: the folder it sits in says where it is.

protected function indexEntry(array $entry): string
$entryarray
returnsstring

inherited($symbol)

HtmlPrinter.php:349
protected function inherited(MMO\doc\models\DocSymbol $symbol): string
$symbolDocSymbol
returnsstringthe inherited members, folded away but linked to wherever they are really documented.

inline($text)

HtmlPrinter.php:564

Render the small subset of markdown a one-line summary actually uses, without pulling in a parser or an element for every cell of every table on the page.

function inline(string $text): stringThe result is always **one line**: this feeds table cells and lead paragraphs, and a source comment wrapped over three lines is still one sentence.
$textstring
returnsstringhtml -- escaped first, so nothing in the source can inject markup

languageOf($symbol)

HtmlPrinter.php:685
protected function languageOf(MMO\doc\models\DocSymbol $symbol): string
$symbolDocSymbol
returnsstringthe fenced-code language a symbol's own declaration is highlighted as.

lead($text)

HtmlPrinter.php:545

The lead paragraph under a heading -- a symbol's or a member's summary.

function lead(string $text): stringMost summaries are one sentence wrapped over a few source lines, and those only need the cheap inline pass. A few really are markdown (a heading, a list, a fenced block), and paying for an `<mmo-markdown>` on those, and only those, keeps a page of ninety members from instantiating ninety elements.
$textstring
returnsstring

markdown($text)

HtmlPrinter.php:532
function markdown(string $text): string
$textstringmarkdown
returnsstringan <mmo-markdown> block. The text is entity-encoded on purpose: the element decodes its own innerHTML before parsing it, so anything that looks like a tag survives intact

memberLanguage($symbol, $member)

HtmlPrinter.php:697
protected function memberLanguage(MMO\doc\models\DocSymbol $symbol, MMO\doc\models\DocMember $member): string
$symbolDocSymbol
$memberDocMember
returnsstringthe language that member's signature is highlighted as -- markup for the parts that really are markup (an attribute, a slot, a css hook), the host language for everything else

parameters($params, $return, $throws, $sees)

HtmlPrinter.php:458

The contract of a callable, as one table: what goes in, what comes out, what can go wrong.

protected function parameters(array $params, ?array $return, array $throws, array $sees = []): string
$paramsarray
$returnnull | array
$throwsarray
$sees = []arraythe @see references of the callable, see
returnsstring

reference($reference)

HtmlPrinter.php:592
function reference(?array $reference): string
$referencenull | arraya {name, short, page, anchor, url} reference
returnsstringa link to wherever it is documented, or inline code when it is documented nowhere

relations($symbol)

HtmlPrinter.php:296
protected function relations(MMO\doc\models\DocSymbol $symbol): string
$symbolDocSymbol
returnsstringthe extends/implements/uses/source definition list, or '' when there is nothing to say.

renderRail($page, $options)

HtmlPrinter.php:98

The sticky outline: every symbol of the page, and under each one its members grouped by kind. This is the page's navigation -- the reason a 90-method class stays usable.

function renderRail(MMO\doc\models\DocPage $page, array $options = []): string
$pageDocPage
$options = []array
returnsstring

renderTopbar($options)

HtmlPrinter.php:130

The bar pinned at the top of every documentation page: the way back to the index. It has no search box: the documentation is searched from <mmo-app>'s command palette, the one search box of the application (addSearchSource).

function renderTopbar(array $options = []): string
$options = []arrayindexUrl: the index page; current: true on the index itself
returnsstring
\MMO\doc\HtmlPrinter::Shared()->renderTopbar(['indexUrl' => \MMO\url('documentation')]);

see($text, $sees)

HtmlPrinter.php:584
function see(string $text, array $sees): string
$textstringmarkdown
$seesarraythe @see references of the node the text belongs to
returnsstring$text, each of its @see references turned into a markdown link to wherever its target is documented (linkSees) -- inline and <mmo-markdown> both render those

type($type)

HtmlPrinter.php:616
function type(MMO\doc\models\DocType $type): string
$typeDocType
returnsstringevery atom of a type, each linked to wherever it is documented.

usage($symbol)

HtmlPrinter.php:372
protected function usage(MMO\doc\models\DocSymbol $symbol): string
$symbolDocSymbol
returnsstringthe call graph slice, rendered server side (the model already holds it).
Inherited members (102)
ConstantsDeclared byDescription
ALERTiLogLevelAlert: Action must be taken immediately.
ALLiLogLevelMask for all
ALL_PLUSiLogLeveldebug everything
BACKTRACEiLogLevel
CRITICALiLogLevelCritical: Critical conditions.
DEBUGiLogLevelDebug: Detailed debug information.
DEEPiLogLeveldebug everything with arguments
EMERGENCYiLogLevelEmergency: System is unusable.
ERRORiLogLevelError: Runtime errors that do not require immediate action but should typically be logged and monitored.
ERROR_PLUSiLogLevelMask for all error
FATALiLogLevelMask for all fatal error
INFOiLogLevelInfo: Interesting events.
INFO_PLUSiLogLevelMask for all errors/warning/notices/info
MEMORYiLogLevelinclude backtrace object
NOTICEiLogLevelNotice: Normal but significant events.
NOTICE_PLUSiLogLevelMask for all errors/warning/notices/info
TRACEiLogLevelinclude backtrace as origins
WARNINGiLogLevelWarning: Exceptional occurrences that are not errors.
WARNING_PLUSiLogLevelMask for all errors and warnings
PropertiesDeclared byDescription
functionsaConverter
globalOptionsTextPrinter
templatesTextPrinter
verbosityaModule
MethodsDeclared byDescription
addOptions($type, $options)aConverterMerge $options into $type's existing options (via merge), rather than replacing them wholesale like setOptions.
alert($message, $context)aModuleAction must be taken immediately.
backtraces($message, $context)aModuleForce-log a message at INFO level together with a full stack trace/memory snapshot (iLogLevel::BACKTRACE), bypassing the verbosity mask entirely (any non-zero verbosity is enough to trigger it).
call($type, $value, $options)aConverterCall the function associated to a type
clear()TextPrinterReset both the exporter state (aExporter::clear) and $templates.
Configure($config)aModuleMerge $config into this module's configuration in the shared Configuration.
critical($message, $context)aModuleCritical conditions. No-op if CRITICAL is currently filtered out by the verbosity mask.
debug($message, $context)aModuleDetailed debug information.
debugName()aModuleHuman-readable identifier used as the default {origin} in this instance's log messages.
DefaultConfig()aModuleThe config a module starts from before anything loaded via Configuration is merged in.
dump($values)TextPrinterEcho one or more values in dump mode (see idump), with a header naming the calling file/line and a footer.
emergency($message, $context)aModuleSystem is unusable. No-op if EMERGENCY is currently filtered out by the verbosity mask.
error($message, $context)aModuleRuntime errors that do not require immediate action but should typically be logged and monitored.
Export($value, $options, $type)aExporterExport any value, dispatching to the right converter based on its type (or the explicit $type).
exportArray($value, $options)aExporterBuilt-in 'array' converter (a list): recursively exports every value, in place.
exportBoolean($value, $options)TextPrinterTypecast to a boolean and return template 'true' or 'false'
exportClosure($value, $options)TextPrinterClosure
exportDateTime($value, $options)TextPrinterRender a DatimeInterface
exportDump($value, $options)TextPrinterThe 'dump' type exporter -- same as idump but registered for explicit dispatch via __invoke($v, [], 'dump').
exportEntity($value, $options)TextPrinterAn entity (any iArrayProperties) is printed as its toArray() -- what an API returns of it -- the same as
exportEnum($value, $options)TextPrinter
exportFilename($value, $options)TextPrinterRender a relative filename
exportInstance($value, $options)TextPrinterobject options: - {int} scope: binary combinaison of the class constants PROPERTY_*.
exportLog($value, $options)TextPrinterMMO\core\events\Log
exportNull($value, $options)TextPrinterReturn template 'null'
exportNumber($value, $options)TextPrinterFormat number
exportObject($value, $options)TextPrinterarray options: {HashList} hashes: the hash list {int|false} max-level: the max level to go to.
ExportProperties($value, $options)aExporterExport an object exportInstance method
exportRenderable($value, $options)TextPrinter
exportResource($value, $options)TextPrinterResource
exportSplObjectStorage($value, $options)TextPrinter
exportsProperty($prop, $value)TextPrinterSame as aExporter::exportsProperty, and a property marked #[NoDump] (a back-reference, such as a collection's repository) is not printed either: an object is printed without what its dump leav…
exportString($value, $options)TextPrinterTypecast to a string
exportThrowable($value, $options)TextPrinter
exportTraces($value, $options)TextPrinterMMO\core\messages\Log::traces
exportValidatorError($value, $options)TextPrinter
getClassFunction($class)aConverterFind which registered type (a class or interface name) applies to $class: itself if directly registered, else the closest registered ancestor class or implemented interface.
getFunction($type)aConverter
getFunctions()aConverter
getIndent($options)TextPrinter
getOptions($type)aConverter
getTemplate($name)TextPrinter
getTemplates()TextPrinter
getType($value, $allowClass)aConverterNormalize $value's type into one of this converter's type names.
getVerbosity()aModule
hash($value, $options)TextPrinter
hasTemplate($name)TextPrinter
hasType($type)aConverter
hiddenProperties($value)TextPrinterThe properties of $value whose value a dump does not show (exportInstance): for an iArrayProperties (an entity), those behind a hidden ArrayProperty (ArrayProper…
idump($value, $options)TextPrinter
info($message, $context)aModuleInteresting events. No-op if INFO is currently filtered out by the verbosity mask.
Instantiate($config)aModule(Re)create the shared instance immediately, configured with $config merged into the class's existing config.
IsShared()aModule
log($level, $message, $context)aModuleLogs with an arbitrary level.
notice($message, $context)aModuleNormal but significant events.
offsetExists($key)aModule\ArrayAccess::offsetExists -- tells whether $key is a declared property at all, regardless of whether it is currently readable/writable through array access.
offsetGet($key)aModule\ArrayAccess::offsetGet -- reads a property directly, unless it has a #[Serialize(serialize: 'methodName')] attribute, in which case that zero-argument method is called instead (e.g.
offsetSet($key, $value)aModule\ArrayAccess::offsetSet -- sets a property directly, unless it has a #[Serialize(unserialize: 'methodName')] attribute, in which case that method is called with $value instead (e.g.
offsetUnset($key)aModule\ArrayAccess::offsetUnset -- equivalent to $module[$key] = null.
Print($value, $options, $type)TextPrinter
renderMaxLevel($value, $options)TextPrinter
renderPrintError($e)TextPrinterWhat a value whose exporter threw is printed as (__invoke): the exception's class and message, as text (renderText) -- never its stack trace.
renderTemplate($name, $data)TextPrinterRender a template
renderText($text)TextPrinterThe text a template holds that comes from the value printed: the keys and property names of a dump (a decoded request body's...), a resource's uri, a validation error's message, a log's message and…
resetHash($value, $options)aExporterForget that $value was already seen, within the given $options['hashes'] tracking map: the next time $value is encountered in this same export, it is exported in full again instead of collapsing to…
serialize($path, $serializer)aModule\MMO\core\interfaces\iSerializable::serialize -- exports every property (via
setFunction($type, $fn, $options)aConverterSet a coercer
setFunctions($fns)aConverterRegister many functions at once, e.g.
setOptions($type, $options)aConverterReplace $type's options wholesale.
setTemplate($name, $tpl)TextPrinterSet template
setTemplates($tpls)TextPrinter
setVerbosity($verb)aModuleSet the current verbosity mask, replacing whatever it was before.
Shared()aModuleGet the shared instance, creating (and configuring) it on first call.
testVerbosity($level)aModuleTest whether a given level (or set of levels) is currently enabled by this instance's verbosity mask.
traitUnshare($serialize)aModuleRemove the shared instance, so the next Shared() call creates a fresh one.
unserialize($data, $path, $instances)aModule\MMO\core\interfaces\iSerializable::unserialize -- merges $data onto DefaultConfig, runs it through the (possibly overridden) constructor, then applies each resulting value to its property (via
Unshare($serialize)aModuleLike tSingleton::Unshare, but also disconnects this module's instance from every event it was listening to (via Event::DisconnectListeners) before dropping it.
warning($message, $context)aModuleExceptional occurrences that are not errors.
__invoke($value, $options, $type)TextPrinterRender $value. Never throws: a failing exporter's exception is caught and printed inline instead (its class and message: renderPrintError), and a type with no registered exporter falls back to…