got every enriched text feature working in abstract document, some bad hackery
							parent
							
								
									0ced4558ab
								
							
						
					
					
						commit
						b4cb715ff8
					
				| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    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, "</span>");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
internal void
 | 
			
		||||
output_begin_link(Document_System *doc_system, String *out, char *name, u32 length){
 | 
			
		||||
    String l = make_string(name, length);
 | 
			
		||||
    append(out, "<a ");
 | 
			
		||||
    if (l.str[0] == '!'){
 | 
			
		||||
        append(out, "target='_blank' ");
 | 
			
		||||
        l.str++;
 | 
			
		||||
        l.size--;
 | 
			
		||||
    }
 | 
			
		||||
    append(out, "href='");
 | 
			
		||||
    if (match_part_sc(l, "document:")){
 | 
			
		||||
        String doc_name = substr_tail(l, sizeof("document:")-1);
 | 
			
		||||
        Abstract_Item *doc_lookup = get_item_by_name(doc_system->doc_list, doc_name);
 | 
			
		||||
        if (doc_lookup){
 | 
			
		||||
            char space[256];
 | 
			
		||||
            if (doc_get_link_string(doc_lookup, space, sizeof(space))){
 | 
			
		||||
                append(out, space);
 | 
			
		||||
            }
 | 
			
		||||
            else{
 | 
			
		||||
                NotImplemented;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else{
 | 
			
		||||
        append(out, l);
 | 
			
		||||
    }
 | 
			
		||||
    append(out, "'>");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
internal void
 | 
			
		||||
output_end_link(String *out){
 | 
			
		||||
    append(out, "</a>");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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, "<img src='");
 | 
			
		||||
            
 | 
			
		||||
            char space[256];
 | 
			
		||||
            if (img_get_link_string(img_lookup, space, sizeof(space), pixel_width, pixel_height)){
 | 
			
		||||
                append(out, space);
 | 
			
		||||
                add_image_instantiation(&img_lookup->img_instantiations, pixel_width, pixel_height);
 | 
			
		||||
            }
 | 
			
		||||
            else{
 | 
			
		||||
                NotImplemented;
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            append(out, "' style='width: ");
 | 
			
		||||
            append_int_to_str(out, pixel_width);
 | 
			
		||||
            append(out, "px; height: ");
 | 
			
		||||
            append_int_to_str(out, pixel_height);
 | 
			
		||||
            append(out, "px;'>");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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, "<iframe  width='");
 | 
			
		||||
        append_int_to_str(out, pixel_width);
 | 
			
		||||
        append(out, "' height='");
 | 
			
		||||
        append_int_to_str(out, pixel_height);
 | 
			
		||||
        append(out, "' src='");
 | 
			
		||||
        append(out, youtube_str);
 | 
			
		||||
        append(out, "' allowfullscreen> </iframe>");
 | 
			
		||||
    }
 | 
			
		||||
    else{
 | 
			
		||||
        append(out, "<span style='color:#F00'>! Doc generator error: unrecognized video type !</span>");
 | 
			
		||||
        fprintf(stdout, "error: unrecognized video type %.*s\n", l.size, l.str);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
internal void
 | 
			
		||||
output_begin_paragraph(String *out){
 | 
			
		||||
    append(out, "<p>");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
internal void
 | 
			
		||||
output_end_paragraph(String *out){
 | 
			
		||||
    append(out, "</p>");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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, "<span style='color:#F00'>! Doc generator error: unmatched section end !</span>");
 | 
			
		||||
        fprintf(stdout, "error: unmatched section end\n");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
internal void
 | 
			
		||||
output_begin_list(String *out){
 | 
			
		||||
    append(out,"<ul style='margin-top: 5mm; margin-left: 1mm;'>");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
internal void
 | 
			
		||||
output_end_list(String *out){
 | 
			
		||||
    append(out, "</ul>");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
internal void
 | 
			
		||||
output_begin_item(String *out, Section_Counter *section_counter){
 | 
			
		||||
    if (section_counter->list_item_counter == 0){
 | 
			
		||||
        append(out, "<li style='font-size: 95%; background: #EFEFDF;'>");
 | 
			
		||||
        ++section_counter->list_item_counter;
 | 
			
		||||
    }
 | 
			
		||||
    else{
 | 
			
		||||
        append(out, "<li style='font-size: 95%;'>");
 | 
			
		||||
        section_counter->list_item_counter = 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
internal void
 | 
			
		||||
output_end_item(String *out){
 | 
			
		||||
    append(out, "</li>");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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, "<div>");
 | 
			
		||||
    
 | 
			
		||||
    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, "<p>");
 | 
			
		||||
        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,"<ul style='margin-top: 5mm; margin-left: 1mm;'>");
 | 
			
		||||
                        output_begin_list(out);
 | 
			
		||||
                    }break;
 | 
			
		||||
                    
 | 
			
		||||
                    case Cmd_EndList:
 | 
			
		||||
                    {
 | 
			
		||||
                        append(out, "</ul>");
 | 
			
		||||
                        output_end_list(out);
 | 
			
		||||
                    }break;
 | 
			
		||||
                    
 | 
			
		||||
                    case Cmd_BeginItem:
 | 
			
		||||
                    {
 | 
			
		||||
                        if (item_counter == 0){
 | 
			
		||||
                            append(out, "<li style='font-size: 95%; background: #EFEFDF;'>");
 | 
			
		||||
                            ++item_counter;
 | 
			
		||||
                        }
 | 
			
		||||
                        else{
 | 
			
		||||
                            append(out, "<li style='font-size: 95%;'>");
 | 
			
		||||
                            item_counter = 0;
 | 
			
		||||
                        }
 | 
			
		||||
                        output_begin_item(out, section_counter);
 | 
			
		||||
                    }break;
 | 
			
		||||
                    
 | 
			
		||||
                    case Cmd_EndItem:
 | 
			
		||||
                    {
 | 
			
		||||
                        append(out, "</li>");
 | 
			
		||||
                        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, "<a ");
 | 
			
		||||
                            if (body_text.str[0] == '!'){
 | 
			
		||||
                                append(out, "target='_blank' ");
 | 
			
		||||
                                body_text.str++;
 | 
			
		||||
                                body_text.size--;
 | 
			
		||||
                            }
 | 
			
		||||
                            append(out, "href='");
 | 
			
		||||
                            if (match_part_sc(body_text, "document:")){
 | 
			
		||||
                                String doc_name = substr_tail(body_text, sizeof("document:")-1);
 | 
			
		||||
                                Abstract_Item *doc_lookup = get_item_by_name(doc_system->doc_list, doc_name);
 | 
			
		||||
                                if (doc_lookup){
 | 
			
		||||
                                    char space[256];
 | 
			
		||||
                                    if (doc_get_link_string(doc_lookup, space, sizeof(space))){
 | 
			
		||||
                                        append(out, space);
 | 
			
		||||
                                    }
 | 
			
		||||
                                    else{
 | 
			
		||||
                                        NotImplemented;
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            else{
 | 
			
		||||
                                append(out, body_text);
 | 
			
		||||
                            }
 | 
			
		||||
                            append(out, "'>");
 | 
			
		||||
                            output_begin_link(doc_system, out, body_text.str, body_text.size);
 | 
			
		||||
                        }
 | 
			
		||||
                    }break;
 | 
			
		||||
                    
 | 
			
		||||
                    case Cmd_EndLink:
 | 
			
		||||
                    {
 | 
			
		||||
                        append(out, "</a>");
 | 
			
		||||
                        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, "<img src='");
 | 
			
		||||
                                    
 | 
			
		||||
                                    char space[256];
 | 
			
		||||
                                    if (img_get_link_string(img_lookup, space, sizeof(space), pixel_width, pixel_height)){
 | 
			
		||||
                                        append(out, space);
 | 
			
		||||
                                        add_image_instantiation(&img_lookup->img_instantiations, pixel_width, pixel_height);
 | 
			
		||||
                                    }
 | 
			
		||||
                                    else{
 | 
			
		||||
                                        NotImplemented;
 | 
			
		||||
                                    }
 | 
			
		||||
                                    
 | 
			
		||||
                                    append(out, "' style='width: ");
 | 
			
		||||
                                    append_int_to_str(out, pixel_width);
 | 
			
		||||
                                    append(out, "px; height: ");
 | 
			
		||||
                                    append_int_to_str(out, pixel_height);
 | 
			
		||||
                                    append(out, "px;'>");
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            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, "<iframe  width='");
 | 
			
		||||
                                append_int_to_str(out, pixel_width);
 | 
			
		||||
                                append(out, "' height='");
 | 
			
		||||
                                append_int_to_str(out, pixel_height);
 | 
			
		||||
                                append(out, "' src='");
 | 
			
		||||
                                append(out, youtube_str);
 | 
			
		||||
                                append(out, "' allowfullscreen> </iframe>");
 | 
			
		||||
                            }
 | 
			
		||||
                            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, "<span style='color:#F00'>! Doc generator error: unmatched section end !</span>");
 | 
			
		||||
                            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, "</p>");
 | 
			
		||||
        output_end_paragraph(out);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    append(out, "</div>");
 | 
			
		||||
| 
						 | 
				
			
			@ -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, "<ul>");
 | 
			
		||||
| 
						 | 
				
			
			@ -1776,7 +2004,7 @@ doc_item_html(String *out, Document_System *doc_system, Used_Links *used_links,
 | 
			
		|||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_Full_Elements:
 | 
			
		||||
        case Doc_DocFull:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                Meta_Unit *unit = item->unit_elements.unit;
 | 
			
		||||
| 
						 | 
				
			
			@ -1803,7 +2031,7 @@ doc_item_html(String *out, Document_System *doc_system, Used_Links *used_links,
 | 
			
		|||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_Table_Of_Contents:
 | 
			
		||||
        case Doc_TableOfContents:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                append(out, "<h3 style='margin:0;'>Table of Contents</h3><ul>");
 | 
			
		||||
| 
						 | 
				
			
			@ -1833,21 +2061,117 @@ doc_item_html(String *out, Document_System *doc_system, Used_Links *used_links,
 | 
			
		|||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_Plain_Old_Text:
 | 
			
		||||
        case Doc_PlainOldText:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_plain_old_text(out, item->string.string.str, item->string.string.size);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_Version: append(out, VERSION); break;
 | 
			
		||||
        case Doc_Version:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                append(out, VERSION);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_BeginStyle:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_begin_style(out, item->string.string.str, item->string.string.size);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_EndStyle:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_end_style(out);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_BeginLink:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_begin_link(doc_system, out, item->string.string.str, item->string.string.size);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_EndLink:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_end_link(out);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_Image:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_image(doc_system, out, item->string.string.str, item->string.string.size, item->string.string2.str, item->string.string2.size);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_Video:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_video(out, item->string.string.str, item->string.string.size);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_BeginParagraph:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_begin_paragraph(out);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_EndParagraph:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_end_paragraph(out);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        // HACK(allen): There is also a Doc_Section type item where the section is actually a parent to the children and begin/end are handled by the one item.  That should be the only type.
 | 
			
		||||
        case Doc_BeginSection:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_begin_section(out, section_counter, item->string.string.str, item->string.string.size);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_EndSection:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_end_section(out, section_counter);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_BeginList:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_begin_list(out);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_EndList:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_end_list(out);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_BeginItem:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_begin_item(out, section_counter);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
        
 | 
			
		||||
        case Doc_EndItem:
 | 
			
		||||
        {
 | 
			
		||||
            if (head){
 | 
			
		||||
                output_end_item(out);
 | 
			
		||||
            }
 | 
			
		||||
        }break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -315,12 +315,12 @@ generate_site(char *code_directory, char *asset_directory, char *src_directory,
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    generate_4coder_docs(&doc_system, code_directory, src_directory);
 | 
			
		||||
    
 | 
			
		||||
    char *cdir = code_directory;
 | 
			
		||||
    char *sdir = src_directory;
 | 
			
		||||
    Document_System *docs = &doc_system;
 | 
			
		||||
    
 | 
			
		||||
    generate_4coder_docs(docs, cdir, sdir);
 | 
			
		||||
    
 | 
			
		||||
    // TODO(allen): From the text file get the          "Big Title" and        "smallname".
 | 
			
		||||
    generate_page(docs, cdir, sdir, "home.txt"        , "4coder Home"        , "home"        );
 | 
			
		||||
    generate_page(docs, cdir, sdir, "docs.txt"        , "4coder API Docs"    , "custom_docs_2" );
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,18 +11,15 @@
 | 
			
		|||
 | 
			
		||||
\TABLE_OF_CONTENTS
 | 
			
		||||
 | 
			
		||||
\SECTION{Introduction}
 | 
			
		||||
 \SECTION_LINK{introduction}
 | 
			
		||||
\SECTION{Introduction}{introduction}
 | 
			
		||||
 \INCLUDE{introduction.txt}
 | 
			
		||||
\END_SECTION
 | 
			
		||||
 | 
			
		||||
\SECTION{4coder Systems}
 | 
			
		||||
 \SECTION_LINK{4coder_systems}
 | 
			
		||||
\SECTION{4coder Systems}{4coder_systems}
 | 
			
		||||
 \TODO
 | 
			
		||||
\END_SECTION
 | 
			
		||||
 | 
			
		||||
\SECTION{Types and Functions}
 | 
			
		||||
 \SECTION_LINK{types_and_functions}
 | 
			
		||||
\SECTION{Types and Functions}{types_and_functions}
 | 
			
		||||
 | 
			
		||||
 \SECTION{Function List}
 | 
			
		||||
  \DOC_LIST{custom_funcs}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue