diff --git a/site/4ed_abstract_document.cpp b/site/4ed_abstract_document.cpp index 971185ae..6ea0da8d 100644 --- a/site/4ed_abstract_document.cpp +++ b/site/4ed_abstract_document.cpp @@ -36,14 +36,26 @@ enum{ Doc_Root, Doc_Section, Doc_Todo, - Doc_Enriched_Text, - Doc_Element_List, - Doc_Full_Elements, - Doc_Table_Of_Contents, - Doc_Plain_Old_Text, + Doc_Include, + Doc_DocList, + Doc_DocFull, + Doc_TableOfContents, + Doc_PlainOldText, Doc_Version, Doc_BeginStyle, Doc_EndStyle, + Doc_BeginLink, + Doc_EndLink, + Doc_Image, + Doc_Video, + Doc_BeginParagraph, + Doc_EndParagraph, + Doc_BeginSection, + Doc_EndSection, + Doc_BeginList, + Doc_EndList, + Doc_BeginItem, + Doc_EndItem, // Doc_COUNT, }; @@ -84,6 +96,7 @@ struct Document_Item{ struct{ String string; + String string2; } string; struct{ @@ -376,7 +389,7 @@ add_element_list(Abstract_Item *doc, Meta_Unit *unit){ Document_Item *parent = doc->section_stack[doc->section_top]; Document_Item *item = fm_push_array(Document_Item, 1); *item = null_document_item; - item->type = Doc_Element_List; + item->type = Doc_DocList; item->unit_elements.unit = unit; append_child(parent, item); @@ -388,7 +401,7 @@ add_element_list(Abstract_Item *doc, Meta_Unit *unit, Alternate_Names_Array *alt Document_Item *parent = doc->section_stack[doc->section_top]; Document_Item *item = fm_push_array(Document_Item, 1); *item = null_document_item; - item->type = Doc_Element_List; + item->type = Doc_DocList; item->unit_elements.unit = unit; item->unit_elements.alt_names = alt_names; item->unit_elements.alt_name_type = alt_name_type; @@ -402,7 +415,7 @@ add_full_elements(Abstract_Item *doc, Meta_Unit *unit){ Document_Item *parent = doc->section_stack[doc->section_top]; Document_Item *item = fm_push_array(Document_Item, 1); *item = null_document_item; - item->type = Doc_Full_Elements; + item->type = Doc_DocFull; item->unit_elements.unit = unit; append_child(parent, item); @@ -414,7 +427,7 @@ add_full_elements(Abstract_Item *doc, Meta_Unit *unit, Alternate_Names_Array *al Document_Item *parent = doc->section_stack[doc->section_top]; Document_Item *item = fm_push_array(Document_Item, 1); *item = null_document_item; - item->type = Doc_Full_Elements; + item->type = Doc_DocFull; item->unit_elements.unit = unit; item->unit_elements.alt_names = alt_names; item->unit_elements.alt_name_type = alt_name_type; @@ -428,7 +441,7 @@ add_table_of_contents(Abstract_Item *doc){ Document_Item *parent = doc->section_stack[doc->section_top]; Document_Item *item = fm_push_array(Document_Item, 1); *item = null_document_item; - item->type = Doc_Table_Of_Contents; + item->type = Doc_TableOfContents; append_child(parent, item); } @@ -439,7 +452,7 @@ add_plain_old_text(Abstract_Item *doc, String text){ Document_Item *parent = doc->section_stack[doc->section_top]; Document_Item *item = fm_push_array(Document_Item, 1); *item = null_document_item; - item->type = Doc_Plain_Old_Text; + item->type = Doc_PlainOldText; item->string.string = str_alloc(text.size); copy(&item->string.string, text); @@ -452,7 +465,7 @@ add_enriched_text(Abstract_Item *doc, Enriched_Text *text){ Document_Item *parent = doc->section_stack[doc->section_top]; Document_Item *item = fm_push_array(Document_Item, 1); *item = null_document_item; - item->type = Doc_Enriched_Text; + item->type = Doc_Include; item->enriched_text.text = text; append_child(parent, item); @@ -488,7 +501,151 @@ add_end_style(Abstract_Item *doc){ Document_Item *parent = doc->section_stack[doc->section_top]; Document_Item *item = fm_push_array(Document_Item, 1); *item = null_document_item; - item->type = Doc_BeginStyle; + item->type = Doc_EndStyle; + + append_child(parent, item); +} + +internal void +add_begin_link(Abstract_Item *doc, String text){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_BeginLink; + item->string.string = str_alloc(text.size); + copy(&item->string.string, text); + + append_child(parent, item); +} + +internal void +add_end_link(Abstract_Item *doc){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_EndLink; + + append_child(parent, item); +} + +internal void +add_image(Abstract_Item *doc, String text, String extra_text){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_Image; + item->string.string = str_alloc(text.size); + copy(&item->string.string, text); + if (extra_text.size > 0){ + item->string.string2 = str_alloc(extra_text.size); + copy(&item->string.string2, extra_text); + } + + append_child(parent, item); +} + +internal void +add_video(Abstract_Item *doc, String text){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_Video; + item->string.string = str_alloc(text.size); + copy(&item->string.string, text); + + append_child(parent, item); +} + +internal void +add_begin_paragraph(Abstract_Item *doc){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_BeginParagraph; + + append_child(parent, item); +} + +internal void +add_end_paragraph(Abstract_Item *doc){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_EndParagraph; + + append_child(parent, item); +} + +internal void +add_begin_section(Abstract_Item *doc, String text){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_BeginSection; + item->string.string = str_alloc(text.size); + copy(&item->string.string, text); + + append_child(parent, item); +} + +internal void +add_end_section(Abstract_Item *doc){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_EndSection; + + append_child(parent, item); +} + +internal void +add_begin_list(Abstract_Item *doc){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_BeginList; + + append_child(parent, item); +} + +internal void +add_end_list(Abstract_Item *doc){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_EndList; + + append_child(parent, item); +} + +internal void +add_begin_item(Abstract_Item *doc){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_BeginItem; + + append_child(parent, item); +} + +internal void +add_end_item(Abstract_Item *doc){ + Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = fm_push_array(Document_Item, 1); + *item = null_document_item; + item->type = Doc_EndItem; append_child(parent, item); } @@ -535,6 +692,7 @@ add_end_style(Abstract_Item *doc){ struct Section_Counter{ i32 counter[16]; i32 nest_level; + i32 list_item_counter; }; internal b32 @@ -613,9 +771,11 @@ extract_command_body(String *out, String l, i32 *i_in_out, i32 *body_start_out, fprintf(stdout, "error: missing body for %.*s\n", command_name.size, command_name.str); } - *i_in_out = i; - *body_start_out = body_start; - *body_end_out = body_end; + if (result){ + *i_in_out = i; + *body_start_out = body_start; + *body_end_out = body_end; + } return(result); } @@ -677,7 +837,6 @@ enum Command_Types{ Cmd_EndList, Cmd_BeginItem, Cmd_EndItem, - Cmd_BoldFace, Cmd_BeginLink, Cmd_EndLink, Cmd_Image, @@ -706,7 +865,6 @@ get_enriched_commands(){ enriched_commands_global_array[Cmd_EndList] = make_lit_string("END_LIST"); enriched_commands_global_array[Cmd_BeginItem] = make_lit_string("BEGIN_ITEM"); enriched_commands_global_array[Cmd_EndItem] = make_lit_string("END_ITEM"); - enriched_commands_global_array[Cmd_BoldFace] = make_lit_string("BOLD_FACE"); enriched_commands_global_array[Cmd_BeginLink] = make_lit_string("BEGIN_LINK"); enriched_commands_global_array[Cmd_EndLink] = make_lit_string("END_LINK"); enriched_commands_global_array[Cmd_Image] = make_lit_string("IMAGE"); @@ -767,19 +925,176 @@ output_end_style(String *out){ append(out, ""); } +internal void +output_begin_link(Document_System *doc_system, String *out, char *name, u32 length){ + String l = make_string(name, length); + append(out, ""); +} + +internal void +output_end_link(String *out){ + append(out, ""); +} + +internal void +output_image(Document_System *doc_system, String *out, char *name, u32 length, char *name2, u32 length2){ + String l = make_string(name, length); + String l2 = make_string(name2, length2); + + i32 pixel_height = 10; + i32 pixel_width = HTML_WIDTH; + + if (l2.size > 0){ + if (match_part(l2, "width:")){ + String width_string = substr_tail(l2, sizeof("width:")-1); + if (str_is_int(width_string)){ + pixel_width = str_to_int(width_string); + } + } + } + + if (match_part_sc(l, "image:")){ + String img_name = substr_tail(l, sizeof("image:")-1); + Abstract_Item *img_lookup = get_item_by_name(doc_system->img_list, img_name); + + if (img_lookup){ + pixel_height = ceil32(pixel_width*img_lookup->h_w_ratio); + + append(out, ""); + } + } +} + +internal void +output_video(String *out, char *name, u32 length){ + String l = make_string(name, length); + + if (match_part_sc(l, "youtube:")){ + i32 pixel_width = HTML_WIDTH; + i32 pixel_height = (i32)(pixel_width * 0.5625f); + + String youtube_str = substr_tail(l, sizeof("youtube:")-1); + + append(out, ""); + } + else{ + append(out, "! Doc generator error: unrecognized video type !"); + fprintf(stdout, "error: unrecognized video type %.*s\n", l.size, l.str); + } +} + +internal void +output_begin_paragraph(String *out){ + append(out, "

"); +} + +internal void +output_end_paragraph(String *out){ + append(out, "

"); +} + +internal void +output_begin_section(String *out, Section_Counter *section_counter, char *name, u32 length){ + String l = make_string(name, length); + html_render_section_header(out, l, null_string, section_counter); + ++section_counter->nest_level; + section_counter->list_item_counter = 0; +} + +internal void +output_end_section(String *out, Section_Counter *section_counter){ + if (section_counter->nest_level > 0){ + --section_counter->nest_level; + ++section_counter->counter[section_counter->nest_level]; + } + else{ + append(out, "! Doc generator error: unmatched section end !"); + fprintf(stdout, "error: unmatched section end\n"); + } +} + +internal void +output_begin_list(String *out){ + append(out,""); +} + +internal void +output_begin_item(String *out, Section_Counter *section_counter){ + if (section_counter->list_item_counter == 0){ + append(out, "
  • "); + ++section_counter->list_item_counter; + } + else{ + append(out, "
  • "); + section_counter->list_item_counter = 0; + } +} + +internal void +output_end_item(String *out){ + append(out, "
  • "); +} + internal void write_enriched_text_html(String *out, Enriched_Text *text, Document_System *doc_system, Section_Counter *section_counter){ String source = text->source; append(out, "
    "); - i32 item_counter = 0; - for (String line = get_first_double_line(source); line.str; line = get_next_double_line(source, line)){ String l = skip_chop_whitespace(line); - append(out, "

    "); + output_begin_paragraph(out); i32 start = 0, i = 0; for (; i < l.size; ++i){ @@ -853,29 +1168,22 @@ write_enriched_text_html(String *out, Enriched_Text *text, Document_System *doc_ case Cmd_BeginList: { - append(out,"

    "); + output_end_list(out); }break; case Cmd_BeginItem: { - if (item_counter == 0){ - append(out, "
  • "); - ++item_counter; - } - else{ - append(out, "
  • "); - item_counter = 0; - } + output_begin_item(out, section_counter); }break; case Cmd_EndItem: { - append(out, "
  • "); + output_end_item(out); }break; case Cmd_BeginLink: @@ -883,36 +1191,13 @@ write_enriched_text_html(String *out, Enriched_Text *text, Document_System *doc_ String body_text = {0}; b32 has_body = extract_command_body(out, l, &i, &body_text, command_string, true); if (has_body){ - append(out, ""); + output_begin_link(doc_system, out, body_text.str, body_text.size); } }break; case Cmd_EndLink: { - append(out, ""); + output_end_link(out); }break; case Cmd_Image: @@ -920,45 +1205,10 @@ write_enriched_text_html(String *out, Enriched_Text *text, Document_System *doc_ String body_text = {0}; b32 has_body = extract_command_body(out, l, &i, &body_text, command_string, true); if (has_body){ - i32 pixel_height = 10; - i32 pixel_width = HTML_WIDTH; - String size_parameter = {0}; - b32 has_body = extract_command_body(out, l, &i, &size_parameter, command_string, false); - if (has_body){ - if (match_part_sc(size_parameter, "width:")){ - String width_string = substr_tail(size_parameter, sizeof("width:")-1); - if (str_is_int_s(width_string)){ - pixel_width = str_to_int_s(width_string); - } - } - } + extract_command_body(out, l, &i, &size_parameter, command_string, false); - if (match_part_sc(body_text, "image:")){ - String img_name = substr_tail(body_text, sizeof("image:")-1); - Abstract_Item *img_lookup = get_item_by_name(doc_system->img_list, img_name); - - if (img_lookup){ - pixel_height = ceil32(pixel_width*img_lookup->h_w_ratio); - - append(out, ""); - } - } + output_image(doc_system, out, body_text.str, body_text.size, size_parameter.str, size_parameter.size); } }break; @@ -967,20 +1217,7 @@ write_enriched_text_html(String *out, Enriched_Text *text, Document_System *doc_ String body_text = {0}; b32 has_body = extract_command_body(out, l, &i, &body_text, command_string, true); if (has_body){ - if (match_part_sc(body_text, "youtube:")){ - i32 pixel_width = HTML_WIDTH; - i32 pixel_height = (i32)(pixel_width * 0.5625); - - String youtube_str = substr_tail(body_text, sizeof("youtube:")-1); - - append(out, ""); - } + output_video(out, body_text.str, body_text.size); } }break; @@ -989,22 +1226,15 @@ write_enriched_text_html(String *out, Enriched_Text *text, Document_System *doc_ String body_text = {0}; b32 has_body = extract_command_body(out, l, &i, &body_text, command_string, true); if (has_body){ - html_render_section_header(out, body_text, null_string, section_counter); - ++section_counter->nest_level; - item_counter = 0; + String extra_text = {0}; + extract_command_body(out, l, &i, &extra_text, command_string, false); + output_begin_section(out, section_counter, body_text.str, body_text.size); } }break; case Cmd_EndSection: { - if (section_counter->nest_level > 0){ - --section_counter->nest_level; - ++section_counter->counter[section_counter->nest_level]; - } - else{ - append(out, "! Doc generator error: unmatched section end !"); - fprintf(stdout, "error: unmatched section end\n"); - } + output_end_section(out, section_counter); }break; case Cmd_TableOfContents: @@ -1027,7 +1257,7 @@ write_enriched_text_html(String *out, Enriched_Text *text, Document_System *doc_ output_plain_old_text(out, l.str + start, i - start); } - append(out, "

    "); + output_end_paragraph(out); } append(out, "
    "); @@ -1731,16 +1961,14 @@ doc_item_html(String *out, Document_System *doc_system, Used_Links *used_links, } }break; - case Doc_Enriched_Text: + case Doc_Include: { if (head){ - write_enriched_text_html(out, item->enriched_text - - .text, doc_system, section_counter); + write_enriched_text_html(out, item->enriched_text.text, doc_system, section_counter); } }break; - case Doc_Element_List: + case Doc_DocList: { if (head){ append(out, "