The index is divided up into 'elements'.

§1.

void Elements::test_card(OUTPUT_STREAM, wording W, localisation_dictionary *LD) {
    TEMPORARY_TEXT(elt)
    WRITE_TO(elt, "%+W", W);
    Elements::render(OUT, elt, LD);
    DISCARD_TEXT(elt)
}

void Elements::render(OUTPUT_STREAM, text_stream *elt, localisation_dictionary *LD) {
    if (Str::eq_wide_string(elt, L"A1")) { GroupedElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"A2")) { AlphabeticElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Ar")) { ArithmeticElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Bh")) { BehaviourElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"C"))  { ContentsElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Cd")) { CardElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Ch")) { ChartElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Cm")) { CommandsElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Ev")) { EventsElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Fi")) { FiguresElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Gz")) { GazetteerElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"In")) { InnardsElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Lx")) { LexiconElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Mp")) { MapElement::render(OUT, LD, FALSE); return; }
    if (Str::eq_wide_string(elt, L"MT")) { MapElement::render(OUT, LD, TRUE); return; }
    if (Str::eq_wide_string(elt, L"Ph")) { PhrasebookElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Pl")) { PlotElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Rl")) { RelationsElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"RS")) { RulesForScenesElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"St")) { StandardsElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Tb")) { TablesElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"To")) { TokensElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Vb")) { VerbsElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Vl")) { ValuesElement::render(OUT, LD); return; }
    if (Str::eq_wide_string(elt, L"Xt")) { ExtrasElement::render(OUT, LD); return; }

    HTML_OPEN("p"); WRITE("NO CONTENT"); HTML_CLOSE("p");
}