Language record
HTML
An element becomes a symbol because something can address it — an `id`, or a `name` when there is no id — and the inline `<script>` and `<style>` blocks in the page are handed to the real JavaScript/TypeScript and CSS analyzers, so a component whose logic is inlined gets that logic's call graph rather than an empty one.
The registry row this page is generated from
Read at render time from the same family row the register reads, so nothing in this block can disagree with it.
- Extensions
- .html, .htm, .xhtml, .hbs, .twig, .pug, .erb, .mustache, .ejs, .liquid, .njk, .jinja, .j2
- Registry names
html- Recorded symbols
- elements · anchors · id targets
Relationship types this analyzer constructs
14 of 14 constructed, read from this analyzer's source and re-derived by the languages gate. Each row below is one of the engine's types, in the engine's own order.
| Relationship type | Constructed |
|---|---|
calls | published through delegated analyzers |
extends | published through delegated analyzers |
implements | published through delegated analyzers |
uses | constructed by this analyzer |
imports | published through delegated analyzers |
exports | published through delegated analyzers |
contains | constructed by this analyzer |
references | constructed by this analyzer |
overrides | published through delegated analyzers |
instantiates | published through delegated analyzers |
decorates | published through delegated analyzers |
renders | published through delegated analyzers |
mixes_in | published through delegated analyzers |
part_of | published through delegated analyzers |
14 constructed, 0 not constructed. The 11 types marked as published through delegated analyzers come from the CSS, JavaScript, TypeScript analyzers this one hosts for inline blocks; their edges are stored under HTML. The register explains what each label means.
What this analyzer does not resolve
- Every
callsedge comes from the delegate, and the measurement says so exactly: 3,016callsacross 400 corpus files, 3,016 of them from the inline-block seam and 0 from the markup itself. Markup has no invocation semantics — a<form action>is a navigation the browser performs, which is why it is a member read and never a call. - An external URL is not a dependency of this codebase. Absolute, protocol-relative and
mailto:/tel:/javascript:/data:URLs produce no edge at all, because an earlier version published one per external link and 51 documents were measured emitting 237 such edges into a graph where every edge is scored for architectural criticality. - Most elements produce no symbol. An element is recorded only when something can address it, and
classis a shared styling hook that many elements legitimately carry, so it can never name one — it stays readable on the symbol's own attributes. A duplicateidis invalid HTML: the first in document order keeps the plain name, later ones take a#Nsuffix flagged as such, and a reference to the handle is marked ambiguous rather than pointed at one of them.
Every line above was written against HTML’s own analyzer module and is named against a construct in it, so it can be checked against the source. Nothing here is inherited from a template, or from another language’s page.
Where you meet it in a repository
Recognised by extension — .html, .htm, .xhtml, .hbs, .twig, .pug, .erb, .mustache, .ejs, .liquid, .njk, .jinja, .j2. Everything below is about where those files actually sit in a working repository.
- A server-rendered page often inlines its whole bundle, so its JavaScript lives inside a
<script>block rather than in a.jsfile — which is precisely the case where reading the document gives you the JavaScript analyzer's call graph instead of an empty one. A pipeline that minifies the inline block away before the file is committed removes it from the index entirely. - Each embedded-language delegate is resolved in its own
try/catch, so a broken or unavailable grammar costs exactly the blocks it would have served and the document's own elements, containment, resources, references and lines are untouched. The loss is disclosed on the result rather than swallowed, because a silently missing block set reads as a page with no code in it. <template>content and<slot>fallback are inert where they are written. A named element inside one is owned by the nearest addressable ancestor and flagged, because it never enters the document at that position.
Questions this index answers
Phrased as retrievals, because that is what an index can honestly do: it holds the symbols and the edges between them, and hands them back with the evidence attached.
- Which elements in this document can be addressed, and by which attribute?
- Which resources does this page load, and which of them are inline rather than separate files?
- Which id in this document appears more than once?
- Which functions does this page's inline script declare and call?
What the analyzer sees in code like this
<main id="checkout"> <!-- bb records: element main, named "checkout" -->
<h1 class="title">Cart</h1> <!-- no symbol: class is a shared hook, never an identity -->
<input name="coupon"> <!-- bb records: element input, named "coupon" -->
<input name="coupon"> <!-- bb records: "coupon#2", flagged as a duplicate -->
</main>
<script> <!-- run through the real JavaScript analyzer -->
function track(id) { return id }
track("checkout") <!-- bb records: calls -> track, from the delegate -->
</script>Symbols are stored with the file they came from and the bytes they span, so a hit points at a line rather than at a guess. The annotations in the sample are commentary for the reader, not strings the index would store.
Languages that turn up in the same repository
Web, data & config — the count beside each name is how many relationship types that family’s analyzer constructs.
The extensions, registry names, recorded symbols and relationship types above are the parser registry row for HTML, read while the page rendered — the same row the register reads, so the two surfaces cannot tell two stories. Every relationship type listed as constructed appears in src/ast/real-*, the analyzer modules bb ships. bb 0.1.0 answers from a local store over 50 languages (53 registry ids, three of them aliases). There is no benchmark on this page: every claim here is one you can go and read in the source.