From fe951cd92ecc692569c3f39f759223e6159db3fe Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 3 Nov 2016 17:37:29 -0400 Subject: [PATCH] building html document generator --- site/4ed_site.ctm | Bin 1988 -> 2948 bytes site/abstract_document.cpp | 465 ++++++++++++++++++++++++++ site/abstract_document.h | 166 --------- site/out_context.cpp | 75 +++++ site/sitegen.cpp | 130 +++---- site/source_material/introduction.txt | 4 + 6 files changed, 589 insertions(+), 251 deletions(-) create mode 100644 site/abstract_document.cpp delete mode 100644 site/abstract_document.h create mode 100644 site/out_context.cpp create mode 100644 site/source_material/introduction.txt diff --git a/site/4ed_site.ctm b/site/4ed_site.ctm index a204f9446f33df990f0a43d88467dca2c33eaa98..ff554d873870113f192d00a08b1b0dce00f5e0ac 100644 GIT binary patch delta 975 zcmY+?T}V@57zgloXZEpX_O+ei3JR(beSwgfgjp$^zBcHli&#-2VVN#47PZ;2=?rUX z4R5T;s09m`WGGz>ToHB=>jSzm3MZLK)Y90cP3!r$_r=r24*NaN`#kUSaL(|u7EAx| zA~jEn&!vjr>vW8<0DfNUf-&x^|GF?5T=*2ZA&iYqjW|00 zvo#TfF~D0I;AzH_5FR4Gh(@x)SiqRBu}J)USf#*p++`Di4)XEwZ&^Lx026n2)fVPy z9B7H1TgZ(8yDXzF7z1RfzGrvbxtQngQtahD$5~;#;*kB!c^K!_pH%Q?a_q7QjFMUO z%S{7s&_T5OcHD+h5T^W*R%fx1=RFh~u^Y>UF>s0hv;yONn$EkGjdjAElH#D9XL?ad-7iZ&B(zGj{ZX4;4%5L{OhPy(_oi8 L*8pR~HKf=G^2s;1^+yd$V diff --git a/site/abstract_document.cpp b/site/abstract_document.cpp new file mode 100644 index 00000000..12e3828a --- /dev/null +++ b/site/abstract_document.cpp @@ -0,0 +1,465 @@ +/* + * Mr. 4th Dimention - Allen Webster + * + * 25.02.2016 + * + * File editing view for 4coder + * + */ + +// TOP + +#if !defined(ABSTRACT_DOCUMENT_H) +#define ABSTRACT_DOCUMENT_H + +#define NotImplemented Assert(!"Not Implemented!") + +// Enriched Text + +struct Enriched_Text{ + String source; +}; + +static Enriched_Text +load_enriched_text(Partition *part, char *directory, char *filename){ + Enriched_Text result = {0}; + + char space[256]; + String fname = make_fixed_width_string(space); + append_sc(&fname, directory); + append_sc(&fname, "\\"); + append_sc(&fname, filename); + terminate_with_null(&fname); + + result.source = file_dump(fname.str); + return(result); + } + +// Document Declaration + +enum{ + Doc_Root, + Doc_Section, + Doc_Todo, + Doc_Enriched_Text, + Doc_Element_List, + Doc_Full_Elements, + Doc_Table_Of_Contents +}; + +struct Document_Item{ + Document_Item *next; + Document_Item *parent; + int32_t type; + union{ + struct{ + Document_Item *first_child; + Document_Item *last_child; + String name; + String id; + } section; + + struct{ + Meta_Unit *unit; + } unit_elements; + + struct{ + Enriched_Text *text; + } text; +}; +}; +static Document_Item null_document_item = {0}; + +struct Abstract_Document{ + // Document value members + Document_Item *root_item; + + // Document building members + Partition *part; + Document_Item *section_stack[16]; + int32_t section_top; +}; +static Abstract_Document null_abstract_document = {0}; + +static void +set_section_name(Partition *part, Document_Item *item, char *name){ + int32_t name_len = str_size(name); + item->section.name = make_string_cap(push_array(part, char, name_len+1), 0, name_len+1); + partition_align(part, 8); + append_sc(&item->section.name, name); +} + +static void +set_section_id(Partition *part, Document_Item *item, char *id){ + int32_t id_len = str_size(id); + item->section.id = make_string_cap(push_array(part, char, id_len+1), 0, id_len+1); + partition_align(part, 8); + append_sc(&item->section.id, id); +} + +static void +begin_document_description(Abstract_Document *doc, Partition *part, char *title){ + *doc = null_abstract_document; + doc->part = part; + + doc->root_item = push_struct(doc->part, Document_Item); + *doc->root_item = null_document_item; + doc->section_stack[doc->section_top] = doc->root_item; + doc->root_item->type = Doc_Root; + + set_section_name(doc->part, doc->root_item, title); +} + +static void +end_document_description(Abstract_Document *doc){ + Assert(doc->section_top == 0); +} + +static void +append_child(Document_Item *parent, Document_Item *item){ + Assert(parent->type == Doc_Root || parent->type == Doc_Section); + if (parent->section.last_child == 0){ + parent->section.first_child = item; + } + else{ + parent->section.last_child->next = item; + } + parent->section.last_child = item; + item->parent = parent; +} + +static void +begin_section(Abstract_Document *doc, char *title, char *id){ + Assert(doc->section_top+1 < ArrayCount(doc->section_stack)); + + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *section = push_struct(doc->part, Document_Item); + *section = null_document_item; + doc->section_stack[++doc->section_top] = section; + + section->type = Doc_Section; + + set_section_name(doc->part, section, title); + if (id){ + set_section_id(doc->part, section, id); + } + + append_child(parent, section); + } + +static void +end_section(Abstract_Document *doc){ + Assert(doc->section_top > 0); + --doc->section_top; +} + +static void +add_todo(Abstract_Document *doc){ + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = push_struct(doc->part, Document_Item); + *item = null_document_item; + item->type = Doc_Todo; + + append_child(parent, item); +} + +static void +add_element_list(Abstract_Document *doc, Meta_Unit *unit){ + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = push_struct(doc->part, Document_Item); + *item = null_document_item; + item->type = Doc_Element_List; + item->unit_elements.unit = unit; + + append_child(parent, item); +} + +static void +add_full_elements(Abstract_Document *doc, Meta_Unit *unit){ + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = push_struct(doc->part, Document_Item); + *item = null_document_item; + item->type = Doc_Full_Elements; + item->unit_elements.unit = unit; + + append_child(parent, item); +} + +static void +add_table_of_contents(Abstract_Document *doc){ + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = push_struct(doc->part, Document_Item); + *item = null_document_item; + item->type = Doc_Table_Of_Contents; + + append_child(parent, item); +} + +static void +add_enriched_text(Abstract_Document *doc, Enriched_Text *text){ + Assert(doc->section_top+1 < ArrayCount(doc->section_stack)); + + Document_Item *parent = doc->section_stack[doc->section_top]; + Document_Item *item = push_struct(doc->part, Document_Item); + *item = null_document_item; + item->type = Doc_Enriched_Text; + item->text.text = text; + + append_child(parent, item); +} + +// Document Generation + +#define HTML_BACK_COLOR "#FAFAFA" +#define HTML_TEXT_COLOR "#0D0D0D" +#define HTML_CODE_BACK "#DFDFDF" +#define HTML_EXAMPLE_BACK "#EFEFDF" + +#define HTML_POP_COLOR_1 "#309030" +#define HTML_POP_BACK_1 "#E0FFD0" +#define HTML_VISITED_LINK "#A0C050" + +#define HTML_POP_COLOR_2 "#005000" + +#define HTML_CODE_STYLE "font-family: \"Courier New\", Courier, monospace; text-align: left;" + +#define HTML_CODE_BLOCK_STYLE(back) \ +"margin-top: 3mm; margin-bottom: 3mm; font-size: .95em; " \ +"background: "back"; padding: 0.25em;" + +#define HTML_DESCRIPT_SECTION_STYLE HTML_CODE_BLOCK_STYLE(HTML_CODE_BACK) +#define HTML_EXAMPLE_CODE_STYLE HTML_CODE_BLOCK_STYLE(HTML_EXAMPLE_BACK) + +#define HTML_DOC_HEAD_OPEN "
" +#define HTML_DOC_HEAD_CLOSE "
" + +#define HTML_DOC_ITEM_HEAD_STYLE "font-weight: 600;" + +#define HTML_DOC_ITEM_HEAD_INL_OPEN "" +#define HTML_DOC_ITEM_HEAD_INL_CLOSE "" + +#define HTML_DOC_ITEM_HEAD_OPEN "
" +#define HTML_DOC_ITEM_HEAD_CLOSE "
" + +#define HTML_DOC_ITEM_OPEN "
" +#define HTML_DOC_ITEM_CLOSE "
" + +#define HTML_EXAMPLE_CODE_OPEN "
" +#define HTML_EXAMPLE_CODE_CLOSE "
" + +struct Section_Counter{ + int32_t counter[16]; + int32_t nest_level; +}; + +static void +append_section_number(String *out, Section_Counter section_counter){ + for (int32_t i = 1; i <= section_counter.nest_level; ++i){ + append_int_to_str(out, section_counter.counter[i]); + if (i != section_counter.nest_level){ + append_sc(out, "."); + } + } +} + +static void +write_enriched_text_html(String *out, Enriched_Text *text){ + String source = text->source; + + append_sc(out, "
"); + + // TODO(allen): get this working +#if 0 + for (String line = get_first_double_line(source); + line.str; + line = get_next_double_line(chunk, line)){ + append_sc(out, "

"); + append_ss(out, line); + append_sc(out, "

"); + } +#endif + append_ss(out, source); + + append_sc(out, "
"); + } + +static void +doc_item_head_html(String *out, Document_Item *item, Section_Counter section_counter){ + switch (item->type){ + case Doc_Root: + { + append_sc(out, + "" + "" + ""); + append_ss(out, item->section.name); + append_sc(out, + "" + "" + "\n" + "" + "
"); + + + append_sc(out, "

"); + append_ss(out, item->section.name); + append_sc(out, "

"); + }break; + + case Doc_Section: + { + if (section_counter.nest_level <= 1){ + if (item->section.id.size > 0){ + append_sc(out, "\n

§"); + } + else{ + append_sc(out, "\n

§"); + } + append_section_number(out, section_counter); + append_sc(out, " "); + append_ss(out, item->section.name); + append_sc(out, "

"); + } + else{ + if (item->section.id.size > 0){ + append_sc(out, "

§"); + } + else{ + append_sc(out, "

§"); + } + append_section_number(out, section_counter); + append_sc(out, " "); + append_ss(out, item->section.name); + append_sc(out, "

"); + } + }break; + + case Doc_Enriched_Text: + { + write_enriched_text_html(out, item->text.text); + }break; + + case Doc_Table_Of_Contents: + { + append_sc(out, "

Table of Contents

"); + }break; + } +} + +static void +doc_item_foot_html(String *out, Document_Item *item, Section_Counter section_counter){ + switch (item->type){ + case Doc_Root: + { + append_sc(out, "
"); + }break; + + case Doc_Section: break; + + case Doc_Table_Of_Contents: break; + } +} + +static void +generate_item_html(String *out, Document_Item *item, Section_Counter *section_counter){ + Section_Counter sc = *section_counter; + doc_item_head_html(out, item, sc); + + if (item->type == Doc_Root || item->type == Doc_Section){ + int32_t level = ++section_counter->nest_level; + section_counter->counter[level] = 1; + for (Document_Item *m = item->section.first_child; + m != 0; + m = m->next){ + generate_item_html(out, m, section_counter); + } + --section_counter->nest_level; + ++section_counter->counter[section_counter->nest_level]; + } + + doc_item_foot_html(out, item, sc); +} + +static void +generate_document_html(String *out, Abstract_Document *doc){ + Section_Counter section_counter = {0}; + section_counter.counter[section_counter.nest_level] = 1; + generate_item_html(out, doc->root_item, §ion_counter); +} + +#endif + +// BOTTOM + diff --git a/site/abstract_document.h b/site/abstract_document.h deleted file mode 100644 index 896c2a0a..00000000 --- a/site/abstract_document.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Mr. 4th Dimention - Allen Webster - * - * 25.02.2016 - * - * File editing view for 4coder - * - */ - -// TOP - -#if !defined(ABSTRACT_DOCUMENT_H) -#define ABSTRACT_DOCUMENT_H - -#define NotImplemented Assert(!"Not Implemented!") - -// Document Declaration - -struct Enriched_Text{ - int32_t t; -}; - -enum{ - Doc_Root, - Doc_Section, - Doc_Todo, - Doc_Element_List, - Doc_Full_Elements, -}; - -struct Document_Item{ - Document_Item *next; - int32_t type; - union{ - struct{ - Document_Item *first_child; - Document_Item *last_child; - String name; - } section; - - struct{ - Meta_Unit *unit; - } unit_elements; -}; -}; -static Document_Item null_document_item = {0}; - -struct Abstract_Document{ - // Document value members - Document_Item *root_item; - - // Document building members - Partition *part; - Document_Item *section_stack[16]; - int32_t section_top; -}; -static Abstract_Document null_abstract_document = {0}; - -static void -begin_document_description(Abstract_Document *doc, Partition *part){ - *doc = null_abstract_document; - doc->part = part; - - doc->root_item = push_struct(doc->part, Document_Item); - *doc->root_item = null_document_item; - doc->section_stack[doc->section_top] = doc->root_item; - doc->root_item->type = Doc_Root; -} - -static void -end_document_description(Abstract_Document *doc){ - Assert(doc->section_top == 0); -} - -static void -append_child(Document_Item *parent, Document_Item *item){ - Assert(parent->type == Doc_Root || parent->type == Doc_Section); - if (parent->section.last_child == 0){ - parent->section.first_child = item; - parent->section.last_child = item; - } - else{ - parent->section.last_child->next = item; - parent->section.last_child = item; - } -} - -static void -begin_section(Abstract_Document *doc, char *title){ - Assert(doc->section_top+1 < ArrayCount(doc->section_stack)); - - Document_Item *parent = doc->section_stack[doc->section_top]; - Document_Item *section = push_struct(doc->part, Document_Item); - *section = null_document_item; - doc->section_stack[++doc->section_top] = section; - - section->type = Doc_Section; - - int32_t title_len = str_size(title); - section->section.name = make_string_cap(push_array(doc->part, char, title_len+1), 0, title_len+1); - partition_align(doc->part, 8); - append_sc(§ion->section.name, title); - - append_child(parent, section); - } - -static void -end_section(Abstract_Document *doc){ - Assert(doc->section_top > 0); - --doc->section_top; -} - -static void -add_todo(Abstract_Document *doc){ - Assert(doc->section_top+1 < ArrayCount(doc->section_stack)); - - Document_Item *parent = doc->section_stack[doc->section_top]; - Document_Item *item = push_struct(doc->part, Document_Item); - *item = null_document_item; - item->type = Doc_Todo; - - append_child(parent, item); -} - -static void -add_element_list(Abstract_Document *doc, Meta_Unit *unit){ - Assert(doc->section_top+1 < ArrayCount(doc->section_stack)); - - Document_Item *parent = doc->section_stack[doc->section_top]; - Document_Item *item = push_struct(doc->part, Document_Item); - *item = null_document_item; - item->type = Doc_Element_List; - item->unit_elements.unit = unit; - - append_child(parent, item); -} - -static void -add_full_elements(Abstract_Document *doc, Meta_Unit *unit){ - Assert(doc->section_top+1 < ArrayCount(doc->section_stack)); - - Document_Item *parent = doc->section_stack[doc->section_top]; - Document_Item *item = push_struct(doc->part, Document_Item); - *item = null_document_item; - item->type = Doc_Full_Elements; - item->unit_elements.unit = unit; - - append_child(parent, item); -} - -static void -add_enriched_text(Abstract_Document *doc, Enriched_Text *text){ - NotImplemented; -} - -// Document Generation - -static void -generate_document_html(Out_Context *context, Abstract_Document *doc){ - -} - -#endif - -// BOTTOM - diff --git a/site/out_context.cpp b/site/out_context.cpp new file mode 100644 index 00000000..f3dc8d45 --- /dev/null +++ b/site/out_context.cpp @@ -0,0 +1,75 @@ +/* + * Mr. 4th Dimention - Allen Webster + * + * 25.02.2016 + * + * File editing view for 4coder + * + */ + +// TOP + +#if !defined(OUT_CONTEXT_4CODER) +#define OUT_CONTEXT_4CODER + +typedef struct Out_Context{ + char out_directory_space[256]; + String out_directory; + FILE *file; + String *str; +} Out_Context; + +static void +set_context_directory(Out_Context *context, char *dst_directory){ + context->out_directory = make_fixed_width_string(context->out_directory_space); + copy_sc(&context->out_directory, dst_directory); +} + +static int32_t +begin_file_out(Out_Context *out_context, char *filename, String *out){ + char str_space[512]; + String name = make_fixed_width_string(str_space); + if (out_context->out_directory.size > 0){ + append_ss(&name, out_context->out_directory); + append_sc(&name, "\\"); + } + append_sc(&name, filename); + terminate_with_null(&name); + + int32_t r = 0; + out_context->file = fopen(name.str, "wb"); + out_context->str = out; + out->size = 0; + if (out_context->file){ + r = 1; + } + + return(r); +} + +static void +dump_file_out(Out_Context out_context){ + fwrite(out_context.str->str, 1, out_context.str->size, out_context.file); + out_context.str->size = 0; +} + +static void +end_file_out(Out_Context out_context){ + dump_file_out(out_context); + fclose(out_context.file); +} + +static String +make_out_string(int32_t x){ + String str; + str.size = 0; + str.memory_size = x; + str.str = (char*)malloc(x); + return(str); +} + +#endif + +// BOTTOM + + diff --git a/site/sitegen.cpp b/site/sitegen.cpp index 69ff272c..98524102 100644 --- a/site/sitegen.cpp +++ b/site/sitegen.cpp @@ -22,68 +22,11 @@ #include "4coder_mem.h" #include "meta_parser.cpp" -#include "abstract_document.h" +#include "out_context.cpp" +#include "abstract_document.cpp" #define InvalidPath Assert(!"Invalid path of execution") -// TODO(allen): Move the Out_Context into it's own file. - -typedef struct Out_Context{ - char out_directory_space[256]; - String out_directory; - FILE *file; - String *str; -} Out_Context; - -static void -set_context_directory(Out_Context *context, char *dst_directory){ - context->out_directory = make_fixed_width_string(context->out_directory_space); - copy_sc(&context->out_directory, dst_directory); -} - -static int32_t -begin_file_out(Out_Context *out_context, char *filename, String *out){ - char str_space[512]; - String name = make_fixed_width_string(str_space); - if (out_context->out_directory.size > 0){ - append_ss(&name, out_context->out_directory); - append_sc(&name, "\\"); - } - append_sc(&name, filename); - terminate_with_null(&name); - - int32_t r = 0; - out_context->file = fopen(name.str, "wb"); - out_context->str = out; - out->size = 0; - if (out_context->file){ - r = 1; - } - - return(r); -} - -static void -dump_file_out(Out_Context out_context){ - fwrite(out_context.str->str, 1, out_context.str->size, out_context.file); - out_context.str->size = 0; -} - -static void -end_file_out(Out_Context out_context){ - dump_file_out(out_context); - fclose(out_context.file); -} - -static String -make_out_string(int32_t x){ - String str; - str.size = 0; - str.memory_size = x; - str.str = (char*)malloc(x); - return(str); -} - ////////////////////////////////////////////////////////////////////////////////////////////////// // @@ -243,6 +186,7 @@ print_macro_html(String *out, String name, Argument_Breakdown breakdown){ #define EXAMPLE_CODE_OPEN "
" #define EXAMPLE_CODE_CLOSE "
" +// TODO(allen): move string iteration utils somewhere cooler (4coder_string.h?) static String get_first_double_line(String source){ String line = {0}; @@ -877,7 +821,7 @@ assert_files_are_equal(char *directory, char *filename1, char *filename2){ String file2 = file_dump(name.str); - if (!match(file1, file2)){ + if (!match_ss(file1, file2)){ fprintf(stderr, "Failed transitional test: %s != %s\n", filename1, filename2); } else{ @@ -945,65 +889,69 @@ generate_site(char *code_directory, char *src_directory, char *dst_directory){ partition_align(part, 4); } + // NOTE(allen): Load enriched text materials + Enriched_Text introduction = load_enriched_text(part, src_directory, "introduction.txt"); // NOTE(allen): Put together the abstract document Abstract_Document doc = {0}; - begin_document_description(&doc, part); + begin_document_description(&doc, part, "4coder API Docs"); - begin_section(&doc, "Intro"); + add_table_of_contents(&doc); + + begin_section(&doc, "Introduction", "introduction"); + add_enriched_text(&doc, &introduction); + end_section(&doc); + + begin_section(&doc, "4coder Systems", "4coder_systems"); add_todo(&doc); end_section(&doc); - begin_section(&doc, "4coder Systems Overview"); - add_todo(&doc); - end_section(&doc); - - begin_section(&doc, "Types and Functions"); + begin_section(&doc, "Types and Functions", "types_and_functions"); { - begin_section(&doc, "Function List"); + begin_section(&doc, "Function List", 0); add_element_list(&doc, &custom_funcs_unit); end_section(&doc); - begin_section(&doc, "Type List"); + begin_section(&doc, "Type List", 0); add_element_list(&doc, &custom_types_unit); end_section(&doc); - begin_section(&doc, "Function Descriptions"); + begin_section(&doc, "Function Descriptions", 0); add_full_elements(&doc, &custom_funcs_unit); end_section(&doc); - begin_section(&doc, "Type Descriptions"); + begin_section(&doc, "Type Descriptions", 0); add_full_elements(&doc, &custom_types_unit); end_section(&doc); } end_section(&doc); - begin_section(&doc, "String Library"); + begin_section(&doc, "String Library", "string_library"); { - begin_section(&doc, "String Library Intro"); + begin_section(&doc, "String Library Intro", 0); add_todo(&doc); end_section(&doc); - begin_section(&doc, "String Function List"); + begin_section(&doc, "String Function List", 0); add_element_list(&doc, &string_unit); end_section(&doc); - begin_section(&doc, "String Function Descriptions"); + begin_section(&doc, "String Function Descriptions", 0); add_full_elements(&doc, &string_unit); end_section(&doc); } end_section(&doc); - begin_section(&doc, "Lexer Library"); + begin_section(&doc, "Lexer Library", "lexer_library"); { - begin_section(&doc, "Lexer Intro"); + begin_section(&doc, "Lexer Intro", 0); add_todo(&doc); end_section(&doc); - begin_section(&doc, "Lexer Function List"); + begin_section(&doc, "Lexer Function List", 0); add_element_list(&doc, &lexer_funcs_unit); end_section(&doc); - begin_section(&doc, "Lexer Type List"); + begin_section(&doc, "Lexer Type List", 0); add_element_list(&doc, &lexer_types_unit); end_section(&doc); - begin_section(&doc, "Lexer Function Descriptions"); + begin_section(&doc, "Lexer Function Descriptions", 0); add_full_elements(&doc, &lexer_funcs_unit); end_section(&doc); - begin_section(&doc, "Lexer Type Descriptions"); + begin_section(&doc, "Lexer Type Descriptions", 0); add_full_elements(&doc, &lexer_types_unit); end_section(&doc); } @@ -1018,7 +966,7 @@ generate_site(char *code_directory, char *src_directory, char *dst_directory){ // Output Docs - General Document Generator if (begin_file_out(&context, "gen-test.html", &out)){ - generate_document_html(&context, &doc); + generate_document_html(&out, &doc); end_file_out(context); } else{ @@ -1083,9 +1031,9 @@ generate_site(char *code_directory, char *src_directory, char *dst_directory){ "" "
" - // "

4cpp Lexing Library

"); + //"

4cpp Lexing Library

"); - "

4coder API

"); + "

4coder API Docs

"); struct Section{ char *id_string; @@ -1102,7 +1050,7 @@ generate_site(char *code_directory, char *src_directory, char *dst_directory){ {"lexer_library", "Lexer Library"} }; - append_sc(&out, "

Table of Contents

""
    "); + append_sc(&out, "

    Table of Contents

      "); int32_t section_count = ArrayCount(sections); for (int32_t i = 0; i < section_count; ++i){ @@ -1348,6 +1296,18 @@ generate_site(char *code_directory, char *src_directory, char *dst_directory){ // TODO(allen): warning } + // Here to test the file equality tester + // Output Docs - General Document Generator + if (begin_file_out(&context, "gen-test2.html", &out)){ + generate_document_html(&out, &doc); + end_file_out(context); + } + else{ + // TODO(allen): warning + } + + assert_files_are_equal(dst_directory, API_DOC, API_DOC); + assert_files_are_equal(dst_directory, "gen-test.html", "gen-test2.html"); assert_files_are_equal(dst_directory, API_DOC, "gen-test.html"); } diff --git a/site/source_material/introduction.txt b/site/source_material/introduction.txt new file mode 100644 index 00000000..fe5e083a --- /dev/null +++ b/site/source_material/introduction.txt @@ -0,0 +1,4 @@ + +This is the documentation for the 4cpp lexer version 1.1. The documentation is the newest piece of this lexer project so it may still have problems. What is here should be correct and mostly complete. + +If you have questions or discover errors please contact \CODE_STYLE{editor@4coder.net} or to get help from members of the 4coder and handmade network community you can post on the 4coder forums hosted at \CODE_STYLE{4coder.handmade.network} \ No newline at end of file