switched to Document_Builder helper struct, compressed add_* functions

This commit is contained in:
Allen Webster 2017-07-16 14:22:06 -04:00
parent 64c19f4f12
commit 090d51dff0
2 changed files with 225 additions and 341 deletions

View File

@ -99,14 +99,6 @@ struct Document_Item{
}; };
global Document_Item null_document_item = {0}; global Document_Item null_document_item = {0};
enum{
ItemType_Document,
ItemType_Image,
ItemType_GenericFile,
// never below this
ItemType_COUNT,
};
struct Basic_Node{ struct Basic_Node{
Basic_Node *next; Basic_Node *next;
}; };
@ -118,43 +110,6 @@ struct Basic_List{
Basic_Node *tail; Basic_Node *tail;
}; };
struct Abstract_Item{
i32 item_type;
char *name;
// Document value members
Document_Item *root_item;
// TODO(allen): make these external
// Document building members
Document_Item *section_stack[16];
i32 section_top;
// Image value members
char *source_file;
char *extension;
float w_h_ratio;
float h_w_ratio;
Basic_List img_instantiations;
};
global Abstract_Item null_abstract_item = {0};
struct Image_Instantiation{
i32 w, h;
};
struct Document_System{
Basic_List doc_list;
Basic_List img_list;
Basic_List file_list;
};
internal Document_System
create_document_system(){
Document_System system = {0};
return(system);
}
internal void* internal void*
push_item_on_list(Basic_List *list, i32 item_size){ push_item_on_list(Basic_List *list, i32 item_size){
i32 mem_size = item_size + sizeof(Basic_Node); i32 mem_size = item_size + sizeof(Basic_Node);
@ -172,10 +127,57 @@ push_item_on_list(Basic_List *list, i32 item_size){
list->tail = node; list->tail = node;
} }
void *result = (node+1); void *result = (node + 1);
return(result); return(result);
} }
enum{
ItemType_Document,
ItemType_Image,
ItemType_GenericFile,
// never below this
ItemType_COUNT,
};
struct Abstract_Item{
i32 item_type;
char *name;
// Document value members
Document_Item *root_item;
// Image value members
char *source_file;
char *extension;
float w_h_ratio;
float h_w_ratio;
Basic_List img_instantiations;
};
global Abstract_Item null_abstract_item = {0};
struct Document_Builder{
Abstract_Item *doc;
Document_Item *section_stack[16];
i32 section_top;
};
struct Image_Instantiation{
i32 w, h;
};
struct Document_System{
Basic_List doc_list;
Basic_List img_list;
Basic_List file_list;
};
internal Document_System
create_document_system(){
Document_System system = {0};
return(system);
}
internal Abstract_Item* internal Abstract_Item*
get_item_by_name(Basic_List list, String name){ get_item_by_name(Basic_List list, String name){
Abstract_Item *result = 0; Abstract_Item *result = 0;
@ -299,32 +301,47 @@ set_section_id(Document_Item *item, char *id){
append(&item->section.id, id); append(&item->section.id, id);
} }
#if 0
internal void internal void
begin_document_description(Abstract_Item *doc, char *title, b32 show_title){ begin_document_description(Document_Builder *builder, char *title, b32 show_title){
Abstract_Item *doc = builder->doc;
*doc = null_abstract_item; *doc = null_abstract_item;
doc->item_type = ItemType_Document; doc->item_type = ItemType_Document;
doc->root_item = fm_push_array(Document_Item, 1); doc->root_item = fm_push_array(Document_Item, 1);
*doc->root_item = null_document_item; *doc->root_item = null_document_item;
doc->section_stack[doc->section_top] = doc->root_item; set_section_name(doc->root_item, title, show_title);
doc->root_item->type = Doc_Root; doc->root_item->type = Doc_Root;
set_section_name(doc->root_item, title, show_title); builder->section_stack[builder->section_top] = doc->root_item;
} }
#endif
internal Abstract_Item* internal Document_Builder
begin_document_description(Document_System *system, char *title, char *name, b32 show_title){ begin_document_description(Document_System *system, char *title, char *name, b32 show_title){
Abstract_Item *item = create_item(&system->doc_list, name); Document_Builder builder = {0};
if (item){ Abstract_Item *doc = create_item(&system->doc_list, name);
begin_document_description(item, title, show_title); if (doc != 0){
item->name = name; builder.doc = doc;
*doc = null_abstract_item;
doc->item_type = ItemType_Document;
doc->root_item = fm_push_array(Document_Item, 1);
*doc->root_item = null_document_item;
set_section_name(doc->root_item, title, show_title);
doc->name = name;
doc->root_item->type = Doc_Root;
builder.section_stack[builder.section_top] = doc->root_item;
} }
return(item); return(builder);
} }
internal void internal void
end_document_description(Abstract_Item *item){ end_document_description(Document_Builder *builder){
Assert(item->section_top == 0); Assert(builder->section_top == 0);
} }
internal void internal void
@ -340,236 +357,145 @@ append_child(Document_Item *parent, Document_Item *item){
item->parent = parent; item->parent = parent;
} }
internal Document_Item*
doc_new_item(Document_Builder *builder, u32 type){
Assert(builder->section_top + 1 < ArrayCount(builder->section_stack));
Document_Item *parent = builder->section_stack[builder->section_top];
Document_Item *item = fm_push_array(Document_Item, 1);
*item = null_document_item;
item->type = type;
append_child(parent, item);
return(item);
}
internal void internal void
begin_section(Abstract_Item *item, char *title, char *id){ begin_section(Document_Builder *builder, char *title, char *id){
Assert(item->section_top + 1 < ArrayCount(item->section_stack)); Document_Item *section = doc_new_item(builder, Doc_Section);
builder->section_stack[++builder->section_top] = section;
Document_Item *parent = item->section_stack[item->section_top];
Document_Item *section = fm_push_array(Document_Item, 1);
*section = null_document_item;
item->section_stack[++item->section_top] = section;
section->type = Doc_Section;
set_section_name(section, title, true); set_section_name(section, title, true);
if (id != 0){ if (id != 0){
set_section_id(section, id); set_section_id(section, id);
} }
append_child(parent, section);
} }
internal void internal void
end_section(Abstract_Item *doc){ end_section(Document_Builder *builder){
Assert(doc->section_top > 0); Assert(builder->section_top > 0);
--doc->section_top; --builder->section_top;
} }
internal void internal void
add_error(Abstract_Item *doc, String text){ add_error(Document_Builder *builder, String text){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Assert(builder->section_top + 1 < ArrayCount(builder->section_stack));
Document_Item *parent = doc->section_stack[doc->section_top]; Document_Item *item = doc_new_item(builder, Doc_Error);
Document_Item *item = fm_push_array(Document_Item, 1);
*item = null_document_item;
item->type = Doc_Error;
item->string.string = str_alloc(text.size); item->string.string = str_alloc(text.size);
fm_align(); fm_align();
copy(&item->string.string, text); copy(&item->string.string, text);
append_child(parent, item);
} }
internal void internal void
report_error_missing_body(Abstract_Item *doc, String command_body){ report_error_missing_body(Document_Builder *builder, String command_body){
char space[512]; char space[512];
String error_string = make_fixed_width_string(space); String error_string = make_fixed_width_string(space);
append(&error_string, "missing body for "); append(&error_string, "missing body for ");
append(&error_string, command_body); append(&error_string, command_body);
add_error(doc, error_string); add_error(builder, error_string);
} }
internal void internal void
add_todo(Abstract_Item *doc){ add_todo(Document_Builder *builder){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); doc_new_item(builder, Doc_Todo);
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_Todo;
append_child(parent, item);
} }
internal void internal void
add_element_list(Abstract_Item *doc, Meta_Unit *unit){ add_element_list(Document_Builder *builder, Meta_Unit *unit){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Document_Item *item = doc_new_item(builder, Doc_DocList);
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_DocList;
item->unit_elements.unit = unit; item->unit_elements.unit = unit;
append_child(parent, item);
} }
internal void internal void
add_element_list(Abstract_Item *doc, Meta_Unit *unit, Alternate_Names_Array *alt_names, i32 alt_name_type){ add_element_list(Document_Builder *builder, Meta_Unit *unit, Alternate_Names_Array *alt_names, i32 alt_name_type){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Document_Item *item = doc_new_item(builder, Doc_DocList);
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_DocList;
item->unit_elements.unit = unit; item->unit_elements.unit = unit;
item->unit_elements.alt_names = alt_names; item->unit_elements.alt_names = alt_names;
item->unit_elements.alt_name_type = alt_name_type; item->unit_elements.alt_name_type = alt_name_type;
append_child(parent, item);
} }
internal void internal void
add_full_elements(Abstract_Item *doc, Meta_Unit *unit){ add_full_elements(Document_Builder *builder, Meta_Unit *unit){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Document_Item *item = doc_new_item(builder, Doc_DocFull);
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_DocFull;
item->unit_elements.unit = unit; item->unit_elements.unit = unit;
append_child(parent, item);
} }
internal void internal void
add_full_elements(Abstract_Item *doc, Meta_Unit *unit, Alternate_Names_Array *alt_names, i32 alt_name_type){ add_full_elements(Document_Builder *builder, Meta_Unit *unit, Alternate_Names_Array *alt_names, i32 alt_name_type){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Document_Item *item = doc_new_item(builder, Doc_DocFull);
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_DocFull;
item->unit_elements.unit = unit; item->unit_elements.unit = unit;
item->unit_elements.alt_names = alt_names; item->unit_elements.alt_names = alt_names;
item->unit_elements.alt_name_type = alt_name_type; item->unit_elements.alt_name_type = alt_name_type;
append_child(parent, item);
} }
internal void internal void
add_table_of_contents(Abstract_Item *doc){ add_table_of_contents(Document_Builder *builder){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); doc_new_item(builder, Doc_TableOfContents);
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_TableOfContents;
append_child(parent, item);
} }
internal void internal void
add_plain_old_text(Abstract_Item *doc, String text){ add_plain_old_text(Document_Builder *builder, String text){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Document_Item *item = doc_new_item(builder, Doc_PlainOldText);
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_PlainOldText;
item->string.string = str_alloc(text.size); item->string.string = str_alloc(text.size);
fm_align(); fm_align();
copy(&item->string.string, text); copy(&item->string.string, text);
append_child(parent, item);
} }
internal void internal void
add_enriched_text(Abstract_Item *doc, Enriched_Text *text){ add_enriched_text(Document_Builder *builder, Enriched_Text *text){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Document_Item *item = doc_new_item(builder, Doc_PlainOldText);
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_Include;
item->enriched_text.text = text; item->enriched_text.text = text;
append_child(parent, item);
} }
internal void internal void
add_version(Abstract_Item *doc){ add_version(Document_Builder *builder){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); doc_new_item(builder, Doc_Version);
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_Version;
append_child(parent, item);
} }
internal void internal void
add_begin_style(Abstract_Item *doc, String text){ add_begin_style(Document_Builder *builder, String text){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Document_Item *item = doc_new_item(builder, Doc_BeginStyle);
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->string.string = str_alloc(text.size); item->string.string = str_alloc(text.size);
fm_align(); fm_align();
copy(&item->string.string, text); copy(&item->string.string, text);
append_child(parent, item);
} }
internal void internal void
add_end_style(Abstract_Item *doc){ add_end_style(Document_Builder *builder){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); doc_new_item(builder, Doc_EndStyle);
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_EndStyle;
append_child(parent, item);
} }
internal void internal void
add_document_link(Abstract_Item *doc, String text){ add_document_link(Document_Builder *builder, String text){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Document_Item *item = doc_new_item(builder, Doc_BeginStyle);
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_DocumentLink;
item->string.string = str_alloc(text.size); item->string.string = str_alloc(text.size);
fm_align(); fm_align();
copy(&item->string.string, text); copy(&item->string.string, text);
append_child(parent, item);
} }
internal void internal void
add_begin_link(Abstract_Item *doc, String text){ add_begin_link(Document_Builder *builder, String text){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Document_Item *item = doc_new_item(builder, Doc_BeginLink);
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); item->string.string = str_alloc(text.size);
fm_align(); fm_align();
copy(&item->string.string, text); copy(&item->string.string, text);
append_child(parent, item);
} }
internal void internal void
add_end_link(Abstract_Item *doc){ add_end_link(Document_Builder *builder){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); doc_new_item(builder, Doc_EndLink);
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 internal void
add_image(Abstract_Item *doc, String text, String extra_text){ add_image(Document_Builder *builder, String text, String extra_text){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Document_Item *item = doc_new_item(builder, Doc_Image);
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); item->string.string = str_alloc(text.size);
fm_align(); fm_align();
copy(&item->string.string, text); copy(&item->string.string, text);
@ -578,88 +504,44 @@ add_image(Abstract_Item *doc, String text, String extra_text){
fm_align(); fm_align();
copy(&item->string.string2, extra_text); copy(&item->string.string2, extra_text);
} }
append_child(parent, item);
} }
internal void internal void
add_video(Abstract_Item *doc, String text){ add_video(Document_Builder *builder, String text){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); Document_Item *item = doc_new_item(builder, Doc_Video);
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); item->string.string = str_alloc(text.size);
fm_align(); fm_align();
copy(&item->string.string, text); copy(&item->string.string, text);
append_child(parent, item);
} }
internal void internal void
add_begin_paragraph(Abstract_Item *doc){ add_begin_paragraph(Document_Builder *builder){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); doc_new_item(builder, Doc_BeginParagraph);
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 internal void
add_end_paragraph(Abstract_Item *doc){ add_end_paragraph(Document_Builder *builder){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); doc_new_item(builder, Doc_EndParagraph);
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 internal void
add_begin_list(Abstract_Item *doc){ add_begin_list(Document_Builder *builder){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); doc_new_item(builder, Doc_BeginList);
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 internal void
add_end_list(Abstract_Item *doc){ add_end_list(Document_Builder *builder){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); doc_new_item(builder, Doc_EndList);
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 internal void
add_begin_item(Abstract_Item *doc){ add_begin_item(Document_Builder *builder){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); doc_new_item(builder, Doc_BeginItem);
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 internal void
add_end_item(Abstract_Item *doc){ add_end_item(Document_Builder *builder){
Assert(doc->section_top + 1 < ArrayCount(doc->section_stack)); doc_new_item(builder, Doc_EndItem);
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);
} }
// Document Generation from Enriched Text // Document Generation from Enriched Text
@ -767,7 +649,7 @@ extract_command_body(String l, i32 *i_in_out, String *body_text_out){
internal Abstract_Item* internal Abstract_Item*
make_document_from_text(Document_System *doc_system, char *title, char *name, Enriched_Text *text){ make_document_from_text(Document_System *doc_system, char *title, char *name, Enriched_Text *text){
String source = text->source; String source = text->source;
Abstract_Item *doc = begin_document_description(doc_system, title, name, false); Document_Builder builder = begin_document_description(doc_system, title, name, false);
for (String line = get_first_double_line(source); for (String line = get_first_double_line(source);
line.str; line.str;
@ -775,13 +657,13 @@ make_document_from_text(Document_System *doc_system, char *title, char *name, En
String l = skip_chop_whitespace(line); String l = skip_chop_whitespace(line);
if (l.size == 0) continue; if (l.size == 0) continue;
add_begin_paragraph(doc); add_begin_paragraph(&builder);
i32 start = 0, i = 0; i32 start = 0, i = 0;
for (; i < l.size; ++i){ for (; i < l.size; ++i){
char ch = l.str[i]; char ch = l.str[i];
if (ch == '\\'){ if (ch == '\\'){
add_plain_old_text(doc, substr(l, start, i - start)); add_plain_old_text(&builder, substr(l, start, i - start));
i32 command_start = i + 1; i32 command_start = i + 1;
i32 command_end = command_start; i32 command_end = command_start;
@ -812,7 +694,7 @@ make_document_from_text(Document_System *doc_system, char *title, char *name, En
switch (match_index){ switch (match_index){
case Cmd_BackSlash: case Cmd_BackSlash:
{ {
add_plain_old_text(doc, make_lit_string("\\")); add_plain_old_text(&builder, make_lit_string("\\"));
}break; }break;
case Cmd_BeginStyle: case Cmd_BeginStyle:
@ -820,16 +702,16 @@ make_document_from_text(Document_System *doc_system, char *title, char *name, En
String body_text = {0}; String body_text = {0};
b32 has_body = extract_command_body(l, &i, &body_text); b32 has_body = extract_command_body(l, &i, &body_text);
if (has_body){ if (has_body){
add_begin_style(doc, body_text); add_begin_style(&builder, body_text);
} }
else{ else{
report_error_missing_body(doc, command_string); report_error_missing_body(&builder, command_string);
} }
}break; }break;
case Cmd_EndStyle: case Cmd_EndStyle:
{ {
add_end_style(doc); add_end_style(&builder);
}break; }break;
// TODO(allen): upgrade this bs // TODO(allen): upgrade this bs
@ -838,31 +720,31 @@ make_document_from_text(Document_System *doc_system, char *title, char *name, En
String body_text = {0}; String body_text = {0};
b32 has_body = extract_command_body(l, &i, &body_text); b32 has_body = extract_command_body(l, &i, &body_text);
if (has_body){ if (has_body){
add_document_link(doc, body_text); add_document_link(&builder, body_text);
} }
else{ else{
report_error_missing_body(doc, command_string); report_error_missing_body(&builder, command_string);
} }
}break; }break;
case Cmd_BeginList: case Cmd_BeginList:
{ {
add_begin_list(doc); add_begin_list(&builder);
}break; }break;
case Cmd_EndList: case Cmd_EndList:
{ {
add_end_list(doc); add_end_list(&builder);
}break; }break;
case Cmd_BeginItem: case Cmd_BeginItem:
{ {
add_begin_item(doc); add_begin_item(&builder);
}break; }break;
case Cmd_EndItem: case Cmd_EndItem:
{ {
add_end_item(doc); add_end_item(&builder);
}break; }break;
case Cmd_BeginLink: case Cmd_BeginLink:
@ -870,16 +752,16 @@ make_document_from_text(Document_System *doc_system, char *title, char *name, En
String body_text = {0}; String body_text = {0};
b32 has_body = extract_command_body(l, &i, &body_text); b32 has_body = extract_command_body(l, &i, &body_text);
if (has_body){ if (has_body){
add_begin_link(doc, body_text); add_begin_link(&builder, body_text);
} }
else{ else{
report_error_missing_body(doc, command_string); report_error_missing_body(&builder, command_string);
} }
}break; }break;
case Cmd_EndLink: case Cmd_EndLink:
{ {
add_end_link(doc); add_end_link(&builder);
}break; }break;
case Cmd_Image: case Cmd_Image:
@ -889,10 +771,10 @@ make_document_from_text(Document_System *doc_system, char *title, char *name, En
if (has_body){ if (has_body){
String size_parameter = {0}; String size_parameter = {0};
extract_command_body(l, &i, &size_parameter); extract_command_body(l, &i, &size_parameter);
add_image(doc, body_text, size_parameter); add_image(&builder, body_text, size_parameter);
} }
else{ else{
report_error_missing_body(doc, command_string); report_error_missing_body(&builder, command_string);
} }
}break; }break;
@ -901,10 +783,10 @@ make_document_from_text(Document_System *doc_system, char *title, char *name, En
String body_text = {0}; String body_text = {0};
b32 has_body = extract_command_body(l, &i, &body_text); b32 has_body = extract_command_body(l, &i, &body_text);
if (has_body){ if (has_body){
add_video(doc, body_text); add_video(&builder, body_text);
} }
else{ else{
report_error_missing_body(doc, command_string); report_error_missing_body(&builder, command_string);
} }
}break; }break;
@ -924,31 +806,31 @@ make_document_from_text(Document_System *doc_system, char *title, char *name, En
copy(&id, extra_text); copy(&id, extra_text);
terminate_with_null(&id); terminate_with_null(&id);
begin_section(doc, title.str, id.str); begin_section(&builder, title.str, id.str);
} }
else{ else{
report_error_missing_body(doc, command_string); report_error_missing_body(&builder, command_string);
} }
}break; }break;
case Cmd_EndSection: case Cmd_EndSection:
{ {
end_section(doc); end_section(&builder);
}break; }break;
case Cmd_Version: case Cmd_Version:
{ {
add_version(doc); add_version(&builder);
}break; }break;
case Cmd_TableOfContents: case Cmd_TableOfContents:
{ {
add_table_of_contents(doc); add_table_of_contents(&builder);
}break; }break;
case Cmd_Todo: case Cmd_Todo:
{ {
add_todo(doc); add_todo(&builder);
}break; }break;
default: default:
@ -957,7 +839,7 @@ make_document_from_text(Document_System *doc_system, char *title, char *name, En
String error = make_fixed_width_string(space); String error = make_fixed_width_string(space);
append(&error, "unrecognized command "); append(&error, "unrecognized command ");
append(&error, command_string); append(&error, command_string);
add_error(doc, error); add_error(&builder, error);
}break; }break;
} }
@ -966,14 +848,14 @@ make_document_from_text(Document_System *doc_system, char *title, char *name, En
} }
if (start != i){ if (start != i){
add_plain_old_text(doc, substr(l, start, i - start)); add_plain_old_text(&builder, substr(l, start, i - start));
} }
add_end_paragraph(doc); add_end_paragraph(&builder);
} }
end_document_description(doc); end_document_description(&builder);
return(doc); return(builder.doc);
} }
// HTML Document Generation // HTML Document Generation

View File

@ -109,72 +109,72 @@ generate_4coder_docs(Document_System *doc_system, char *code_directory, char *sr
*lexer_introduction = load_enriched_text(src_directory, "lexer_introduction.txt"); *lexer_introduction = load_enriched_text(src_directory, "lexer_introduction.txt");
// NOTE(allen): Put together the abstract document // NOTE(allen): Put together the abstract document
Abstract_Item *doc = begin_document_description(doc_system, "4coder API Docs", "custom_docs", true); Document_Builder builder = begin_document_description(doc_system, "4coder API Docs", "custom_docs", true);
add_table_of_contents(doc); add_table_of_contents(&builder);
begin_section(doc, "Introduction", "introduction"); begin_section(&builder, "Introduction", "introduction");
add_enriched_text(doc, introduction); add_enriched_text(&builder, introduction);
end_section(doc); end_section(&builder);
begin_section(doc, "4coder Systems", "4coder_systems"); begin_section(&builder, "4coder Systems", "4coder_systems");
add_todo(doc); add_todo(&builder);
end_section(doc); end_section(&builder);
begin_section(doc, "Types and Functions", "types_and_functions"); begin_section(&builder, "Types and Functions", "types_and_functions");
{ {
begin_section(doc, "Function List", 0); begin_section(&builder, "Function List", 0);
add_element_list(doc, custom_funcs_unit, custom_func_names, AltName_Public_Name); add_element_list(&builder, custom_funcs_unit, custom_func_names, AltName_Public_Name);
end_section(doc); end_section(&builder);
begin_section(doc, "Type List", 0); begin_section(&builder, "Type List", 0);
add_element_list(doc, custom_types_unit); add_element_list(&builder, custom_types_unit);
end_section(doc); end_section(&builder);
begin_section(doc, "Function Descriptions", 0); begin_section(&builder, "Function Descriptions", 0);
add_full_elements(doc, custom_funcs_unit, custom_func_names, AltName_Public_Name); add_full_elements(&builder, custom_funcs_unit, custom_func_names, AltName_Public_Name);
end_section(doc); end_section(&builder);
begin_section(doc, "Type Descriptions", 0); begin_section(&builder, "Type Descriptions", 0);
add_full_elements(doc, custom_types_unit); add_full_elements(&builder, custom_types_unit);
end_section(doc); end_section(&builder);
} }
end_section(doc); end_section(&builder);
begin_section(doc, "String Library", "string_library"); begin_section(&builder, "String Library", "string_library");
{ {
begin_section(doc, "String Library Intro", 0); begin_section(&builder, "String Library Intro", 0);
add_todo(doc); add_todo(&builder);
end_section(doc); end_section(&builder);
begin_section(doc, "String Function List", 0); begin_section(&builder, "String Function List", 0);
add_element_list(doc, string_unit); add_element_list(&builder, string_unit);
end_section(doc); end_section(&builder);
begin_section(doc, "String Function Descriptions", 0); begin_section(&builder, "String Function Descriptions", 0);
add_full_elements(doc, string_unit); add_full_elements(&builder, string_unit);
end_section(doc); end_section(&builder);
} }
end_section(doc); end_section(&builder);
begin_section(doc, "Lexer Library", "lexer_library"); begin_section(&builder, "Lexer Library", "lexer_library");
{ {
begin_section(doc, "Lexer Intro", 0); begin_section(&builder, "Lexer Intro", 0);
add_enriched_text(doc, lexer_introduction); add_enriched_text(&builder, lexer_introduction);
end_section(doc); end_section(&builder);
begin_section(doc, "Lexer Function List", 0); begin_section(&builder, "Lexer Function List", 0);
add_element_list(doc, lexer_funcs_unit); add_element_list(&builder, lexer_funcs_unit);
end_section(doc); end_section(&builder);
begin_section(doc, "Lexer Type List", 0); begin_section(&builder, "Lexer Type List", 0);
add_element_list(doc, lexer_types_unit); add_element_list(&builder, lexer_types_unit);
end_section(doc); end_section(&builder);
begin_section(doc, "Lexer Function Descriptions", 0); begin_section(&builder, "Lexer Function Descriptions", 0);
add_full_elements(doc, lexer_funcs_unit); add_full_elements(&builder, lexer_funcs_unit);
end_section(doc); end_section(&builder);
begin_section(doc, "Lexer Type Descriptions", 0); begin_section(&builder, "Lexer Type Descriptions", 0);
add_full_elements(doc, lexer_types_unit); add_full_elements(&builder, lexer_types_unit);
end_section(doc); end_section(&builder);
} }
end_section(doc); end_section(&builder);
end_document_description(doc); end_document_description(&builder);
return(doc); return(builder.doc);
} }
internal Abstract_Item* internal Abstract_Item*
@ -277,6 +277,8 @@ generate_site(char *code_directory, char *asset_directory, char *src_directory,
generate_page(docs, cdir, sdir, "roadmap.txt" , "4coder Roadmap" , "roadmap" ); generate_page(docs, cdir, sdir, "roadmap.txt" , "4coder Roadmap" , "roadmap" );
generate_page(docs, cdir, sdir, "tutorials.txt" , "4coder Tutorials" , "tutorials" ); generate_page(docs, cdir, sdir, "tutorials.txt" , "4coder Tutorials" , "tutorials" );
//resolve_all_includes(&doc_system);
for (Basic_Node *node = doc_system.doc_list.head; for (Basic_Node *node = doc_system.doc_list.head;
node != 0; node != 0;
node = node->next){ node = node->next){