A format which renders as a plain-text serialisation of the Inweb weave tree, useful only for testing the weaver.


§1. Creation.

void Debugging::create(void) {
    weave_format *wf = Formats::create_weave_format(I"TestingInweb", I".txt");
    METHOD_ADD(wf, RENDER_FOR_MTID, Debugging::render);
}

§2. Methods. For documentation, see "Weave Fornats".

typedef struct debugging_render_state {
    struct text_stream *OUT;
    struct weave_order *wv;
} debugging_render_state;

void Debugging::render(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) {
    weave_document_node *C = RETRIEVE_POINTER_weave_document_node(tree->root->content);
    debugging_render_state drs;
    drs.OUT = OUT;
    drs.wv = C->wv;
    Trees::traverse_from(tree->root, &Debugging::render_visit, (void *) &drs, 0);
}

int Debugging::render_visit(tree_node *N, void *state, int L) {
    debugging_render_state *drs = (debugging_render_state *) state;
    text_stream *OUT = drs->OUT;
    for (int i=0; i<L; i++) WRITE("  ");
    WRITE("%S", N->type->node_type_name);
    if (N->type == weave_document_node_type) Render document2.1
    else if (N->type == weave_head_node_type) Render head2.2
    else if (N->type == weave_body_node_type) Render body2.3
    else if (N->type == weave_tail_node_type) Render tail2.4
    else if (N->type == weave_verbatim_node_type) Render verbatim2.5
    else if (N->type == weave_chapter_header_node_type) Render chapter header2.8
    else if (N->type == weave_chapter_footer_node_type) Render chapter footer2.9
    else if (N->type == weave_section_header_node_type) Render section header2.6
    else if (N->type == weave_section_footer_node_type) Render section footer2.7
    else if (N->type == weave_section_purpose_node_type) Render purpose2.10
    else if (N->type == weave_subheading_node_type) Render subheading2.11
    else if (N->type == weave_bar_node_type) Render bar2.12
    else if (N->type == weave_pagebreak_node_type) Render pagebreak2.13
    else if (N->type == weave_linebreak_node_type) Render linebreak2.14
    else if (N->type == weave_paragraph_heading_node_type) Render paragraph heading2.15
    else if (N->type == weave_endnote_node_type) Render endnote2.16
    else if (N->type == weave_figure_node_type) Render figure2.17
    else if (N->type == weave_audio_node_type) Render audio clip2.18
    else if (N->type == weave_video_node_type) Render video clip2.19
    else if (N->type == weave_download_node_type) Render download2.20
    else if (N->type == weave_material_node_type) Render material2.21
    else if (N->type == weave_embed_node_type) Render embed2.22
    else if (N->type == weave_pmac_node_type) Render pmac2.23
    else if (N->type == weave_vskip_node_type) Render vskip2.24
    else if (N->type == weave_chapter_node_type) Render chapter2.25
    else if (N->type == weave_section_node_type) Render section2.26
    else if (N->type == weave_code_line_node_type) Render code line2.27
    else if (N->type == weave_function_usage_node_type) Render function usage2.28
    else if (N->type == weave_commentary_node_type) Render commentary2.29
    else if (N->type == weave_carousel_slide_node_type) Render carousel slide2.30
    else if (N->type == weave_toc_node_type) Render toc2.31
    else if (N->type == weave_toc_line_node_type) Render toc line2.32
    else if (N->type == weave_chapter_title_page_node_type) Render weave_chapter_title_page_node2.33
    else if (N->type == weave_defn_node_type) Render defn2.34
    else if (N->type == weave_source_code_node_type) Render source code2.35
    else if (N->type == weave_url_node_type) Render URL2.36
    else if (N->type == weave_footnote_cue_node_type) Render footnote cue2.37
    else if (N->type == weave_begin_footnote_text_node_type) Render footnote text2.38
    else if (N->type == weave_display_line_node_type) Render display line2.39
    else if (N->type == weave_function_defn_node_type) Render function defn2.40
    else if (N->type == weave_item_node_type) Render item2.41
    else if (N->type == weave_grammar_index_node_type) Render grammar index2.42
    else if (N->type == weave_inline_node_type) Render inline2.43
    else if (N->type == weave_locale_node_type) Render locale2.44
    else if (N->type == weave_maths_node_type) Render maths2.45
    else WRITE("Unknown node");
    WRITE("\n");
    return TRUE;
}

§2.1. Render document2.1 =

    weave_document_node *C = RETRIEVE_POINTER_weave_document_node(N->content);
    WRITE(" weave order %d", C->wv->allocation_id);

§2.2. Render head2.2 =

    weave_head_node *C = RETRIEVE_POINTER_weave_head_node(N->content);
    WRITE(" banner <%S>", C->banner);

§2.3. Render body2.3 =

    ;

§2.4. Render tail2.4 =

    weave_tail_node *C = RETRIEVE_POINTER_weave_tail_node(N->content);
    WRITE(" rennab <%S>", C->rennab);

§2.5. Render verbatim2.5 =

    weave_verbatim_node *C = RETRIEVE_POINTER_weave_verbatim_node(N->content);
    Debugging::show_text(OUT, C->content, 80);

§2.6. Render section header2.6 =

    weave_section_header_node *C = RETRIEVE_POINTER_weave_section_header_node(N->content);
    WRITE(" <%S>", C->sect->md->sect_title);

§2.7. Render section footer2.7 =

    weave_section_footer_node *C = RETRIEVE_POINTER_weave_section_footer_node(N->content);
    WRITE(" <%S>", C->sect->md->sect_title);

§2.8. Render chapter header2.8 =

    weave_chapter_header_node *C = RETRIEVE_POINTER_weave_chapter_header_node(N->content);
    WRITE(" <%S>", C->chap->md->ch_title);

§2.9. Render chapter footer2.9 =

    weave_chapter_footer_node *C = RETRIEVE_POINTER_weave_chapter_footer_node(N->content);
    WRITE(" <%S>", C->chap->md->ch_title);

§2.10. Render purpose2.10 =

    weave_section_purpose_node *C = RETRIEVE_POINTER_weave_section_purpose_node(N->content);
    WRITE(" <%S>", C->purpose);

§2.11. Render subheading2.11 =

    weave_subheading_node *C = RETRIEVE_POINTER_weave_subheading_node(N->content);
    WRITE(" <%S>", C->text);

§2.12. Render bar2.12 =

    ;

§2.13. Render pagebreak2.13 =

    ;

§2.14. Render linebreak2.14 =

    ;

§2.15. Render paragraph heading2.15 =

    weave_paragraph_heading_node *C = RETRIEVE_POINTER_weave_paragraph_heading_node(N->content);
    Debugging::show_para(OUT, C->para);
    if (C->no_skip) WRITE(" (no skip)");

§2.16. Render endnote2.16 =

    ;

§2.17. Render figure2.17 =

    weave_figure_node *C = RETRIEVE_POINTER_weave_figure_node(N->content);
    WRITE(" <%S> %d by %d", C->figname, C->w, C->h);

§2.18. Render audio clip2.18 =

    weave_audio_node *C = RETRIEVE_POINTER_weave_audio_node(N->content);
    WRITE(" <%S> %d", C->audio_name, C->w);

§2.19. Render video clip2.19 =

    weave_video_node *C = RETRIEVE_POINTER_weave_video_node(N->content);
    WRITE(" <%S> %d", C->video_name, C->w);

§2.20. Render download2.20 =

    weave_download_node *C = RETRIEVE_POINTER_weave_download_node(N->content);
    WRITE(" <%S> %S", C->download_name, C->filetype);

§2.21. Render material2.21 =

    weave_material_node *C = RETRIEVE_POINTER_weave_material_node(N->content);
    WRITE(" ");
    Debugging::show_mat(OUT, C->material_type);
    if (C->material_type == CODE_MATERIAL) WRITE(": %S", C->styling->language_name);
    if (C->plainly) WRITE(" (plainly)");

§2.22. Render embed2.22 =

    weave_embed_node *C = RETRIEVE_POINTER_weave_embed_node(N->content);
    WRITE(" service <%S> ID <%S> %d by %d", C->service, C->ID, C->w, C->h);

§2.23. Render pmac2.23 =

    weave_pmac_node *C = RETRIEVE_POINTER_weave_pmac_node(N->content);
    WRITE(" <%S>", C->pmac->macro_name);
    if (C->defn) WRITE(" (definition)");

§2.24. Render vskip2.24 =

    weave_vskip_node *C = RETRIEVE_POINTER_weave_vskip_node(N->content);
    if (C->in_comment) WRITE(" (in comment)");

§2.25. Render chapter2.25 =

    weave_chapter_node *C = RETRIEVE_POINTER_weave_chapter_node(N->content);
    WRITE(" <%S>", C->chap->md->ch_title);

§2.26. Render section2.26 =

    weave_section_node *C = RETRIEVE_POINTER_weave_section_node(N->content);
    WRITE(" <%S>", C->sect->md->sect_title);

§2.27. Render code line2.27 =

    ;

§2.28. Render function usage2.28 =

    weave_function_usage_node *C = RETRIEVE_POINTER_weave_function_usage_node(N->content);
    WRITE(" <%S>", C->fn->function_name);

§2.29. Render commentary2.29 =

    weave_commentary_node *C = RETRIEVE_POINTER_weave_commentary_node(N->content);
    Debugging::show_text(OUT, C->text, 80);
    if (C->in_code) WRITE(" (code)");

§2.30. Render carousel slide2.30 =

    weave_carousel_slide_node *C = RETRIEVE_POINTER_weave_carousel_slide_node(N->content);
    WRITE(" caption <%S>", C->caption);

§2.31. Render toc2.31 =

    weave_toc_node *C = RETRIEVE_POINTER_weave_toc_node(N->content);
    WRITE(" - <%S>", C->text1);

§2.32. Render toc line2.32 =

    weave_toc_line_node *C = RETRIEVE_POINTER_weave_toc_line_node(N->content);
    WRITE(" - <%S, %S>", C->text1, C->text2);
    if (C->para) Debugging::show_para(OUT, C->para);

§2.33. Render weave_chapter_title_page_node2.33 =

    weave_chapter_title_page_node *C = RETRIEVE_POINTER_weave_chapter_title_page_node(N->content);
    WRITE(" - something %d", C->allocation_id);

§2.34. Render defn2.34 =

    weave_defn_node *C = RETRIEVE_POINTER_weave_defn_node(N->content);
    WRITE(" <%S>", C->keyword);

§2.35. Render source code2.35 =

    weave_source_code_node *C = RETRIEVE_POINTER_weave_source_code_node(N->content);
    WRITE(" <%S>\n", C->matter);
    for (int i=0; i<L; i++) WRITE("  ");
    WRITE("           ");
    WRITE(" _%S_", C->colouring);

§2.36. Render URL2.36 =

    weave_url_node *C = RETRIEVE_POINTER_weave_url_node(N->content);
    WRITE(" content <%S> url <%S>", C->content, C->url);

§2.37. Render footnote cue2.37 =

    weave_footnote_cue_node *C = RETRIEVE_POINTER_weave_footnote_cue_node(N->content);
    WRITE(" [%S]", C->cue_text);

§2.38. Render footnote text2.38 =

    weave_begin_footnote_text_node *C = RETRIEVE_POINTER_weave_begin_footnote_text_node(N->content);
    WRITE(" [%S]", C->cue_text);

§2.39. Render display line2.39 =

    weave_display_line_node *C = RETRIEVE_POINTER_weave_display_line_node(N->content);
    WRITE(" <%S>", C->text);

§2.40. Render function defn2.40 =

    weave_function_defn_node *C = RETRIEVE_POINTER_weave_function_defn_node(N->content);
    WRITE(" <%S>", C->fn->function_name);

§2.41. Render item2.41 =

    weave_item_node *C = RETRIEVE_POINTER_weave_item_node(N->content);
    WRITE(" depth %d label <%S>", C->depth, C->label);

§2.42. Render grammar index2.42 =

    ;

§2.43. Render inline2.43 =

    ;

§2.44. Render locale2.44 =

    weave_locale_node *C = RETRIEVE_POINTER_weave_locale_node(N->content);
    Debugging::show_para(OUT, C->par1);
    if (C->par2) {
        WRITE(" to ");
        Debugging::show_para(OUT, C->par2);
    }

§2.45. Render maths2.45 =

    weave_maths_node *C = RETRIEVE_POINTER_weave_maths_node(N->content);
    WRITE(" <%S>", C->content);
    if (C->displayed) WRITE(" (displayed)");

§3.

void Debugging::show_text(text_stream *OUT, text_stream *text, int limit) {
    WRITE(" <");
    for (int i=0; (i<limit) && (i<Str::len(text)); i++)
        if (Str::get_at(text, i) == '\n')
            WRITE("\\n");
        else
            PUT(Str::get_at(text, i));
    WRITE(">");
    if (Str::len(text) > limit) WRITE(" ... continues to %d chars", Str::len(text));
}

void Debugging::show_para(text_stream *OUT, paragraph *P) {
    WRITE(" P%S", P->paragraph_number);
    if (Str::len(P->heading_text) > 0) WRITE("'%S'", P->heading_text);
}

void Debugging::show_mat(text_stream *OUT, int m) {
    switch (m) {
        case COMMENTARY_MATERIAL: WRITE("discussion"); break;
        case MACRO_MATERIAL: WRITE("paragraph macro"); break;
        case DEFINITION_MATERIAL: WRITE("definition"); break;
        case CODE_MATERIAL: WRITE("code"); break;
        case ENDNOTES_MATERIAL: WRITE("endnotes"); break;
        case FOOTNOTES_MATERIAL: WRITE("footnotes"); break;
        default: WRITE("unknown"); break;
    }
}