4coder/code/custom/4coder_docs.cpp

207 lines
6.9 KiB
C++

/*
4coder_docs.cpp - Documentation explorers
*/
// TOP
function Doc_Page*
get_doc_page_from_user(Application_Links *app, Doc_Cluster *doc, String_Const_u8 query){
Scratch_Block scratch(app);
Lister_Block lister(app, scratch);
lister_set_query(lister, query);
lister_set_default_handlers(lister);
for (Doc_Page *page = doc->first_page;
page != 0;
page = page->next){
lister_add_item(lister, page->name, SCu8(""), page, 0);
}
Lister_Result l_result = run_lister(app, lister);
Doc_Page *result = 0;
if (!l_result.canceled){
result = (Doc_Page*)l_result.user_data;
}
return(result);
}
function Doc_Page*
get_doc_page_from_user(Application_Links *app, Doc_Cluster *doc, char *query){
return(get_doc_page_from_user(app, doc, SCu8(query)));
}
function void
render_doc_page__content(Application_Links *app, Buffer_Insertion *insert, Doc_Content_List *list){
for (Doc_Content *content = list->first;
content != 0;
content = content->next){
// TODO(allen): actually implement links
if (content->emphasis == DocContentEmphasis_SmallHeader){
insertf(insert, "\n");
}
if (content->emphasis == DocContentEmphasis_Heavy){
insertf(insert, "_");
}
if (content->emphasis == DocContentEmphasis_Stylish){
insertf(insert, "*");
}
insertf(insert, "%.*s", string_expand(content->text));
if (content->page_link.size > 0){
insertf(insert, " (link page %.*s)", string_expand(content->page_link));
}
else if (content->block_link.size > 0){
insertf(insert, " (link block %.*s)", string_expand(content->block_link));
}
if (content->emphasis == DocContentEmphasis_Heavy){
insertf(insert, "_");
}
if (content->emphasis == DocContentEmphasis_Stylish){
insertf(insert, "*");
}
if (content->emphasis == DocContentEmphasis_SmallHeader){
insertf(insert, "\n");
}
else{
if (content->next != 0){
insertf(insert, " ");
}
}
}
}
function void
render_doc_page__code(Application_Links *app, Buffer_Insertion *insert, Doc_Code_Sample_List *code){
for (Doc_Code_Sample *sample = code->first;
sample != 0;
sample = sample->next){
insertf(insert, "language: ");
switch (sample->language){
case DocCodeLanguage_Cpp:
{
insertf(insert, "C++\n");
}break;
case DocCodeLanguage_Bat:
{
insertf(insert, "Batch\n\n");
}break;
}
insertf(insert, "\n%.*s\n", string_expand(sample->contents));
}
}
function void
render_doc_page__table(Application_Links *app, Buffer_Insertion *insert, Vec2_i32 dim, Doc_Content_List *vals){
// TODO(allen): align better or something
Doc_Content_List *val = vals;
for (i32 y = 0; y < dim.y; y += 1){
for (i32 x = 0; x < dim.x; x += 1){
render_doc_page__content(app, insert, val);
insertf(insert, "; ");
val += 1;
}
insertf(insert, "\n");
}
}
function Buffer_ID
render_doc_page(Application_Links *app, Doc_Page *page){
Scratch_Block scratch(app);
String_Const_u8 doc_buffer_name = push_u8_stringf(scratch, "*doc: %.*s*",
string_expand(page->name));
Buffer_Create_Flag flags = BufferCreate_NeverAttachToFile;
Buffer_ID buffer = create_buffer(app, doc_buffer_name, flags);
if (buffer != 0){
buffer_set_setting(app, buffer, BufferSetting_RecordsHistory, false);
buffer_set_setting(app, buffer, BufferSetting_ReadOnly, true);
buffer_set_setting(app, buffer, BufferSetting_Unimportant, true);
i64 size = buffer_get_size(app, buffer);
if (size != 0){
buffer_replace_range(app, buffer, Ii64(0, size), SCu8(""));
}
Buffer_Insertion insert = begin_buffer_insertion_at_buffered(app, buffer, 0, scratch, KB(16));
char dashes[] =
"----------------------------------------------------------------"
"----------------------------------------------------------------"
"----------------------------------------------------------------"
"----------------------------------------------------------------";
insertf(&insert, "%.*s\n%.*s\n",
string_expand(page->title),
page->title.size, dashes);
for (Doc_Block *block = page->first_block;
block != 0;
block = block->next){
insertf(&insert, "%.*s\n\n", string_expand(block->name));
for (Doc_Paragraph *par = block->first_par;
par != 0;
par = par->next){
switch (par->kind){
case DocParagraphKind_Text:
{
render_doc_page__content(app, &insert, &par->text);
}break;
case DocParagraphKind_Code:
{
render_doc_page__code(app, &insert, &par->code);
}break;
case DocParagraphKind_Table:
{
render_doc_page__table(app, &insert, par->table.dim, par->table.vals);
}break;
}
insert_string(&insert, string_u8_litexpr("\n"));
}
insertf(&insert, "%.*s\n", page->title.size, dashes);
}
end_buffer_insertion(&insert);
}
return(buffer);
}
CUSTOM_UI_COMMAND_SIG(custom_api_documentation)
CUSTOM_DOC("Prompts the user to select a Custom API item then loads a doc buffer for that item")
{
View_ID view = get_this_ctx_view(app, Access_ReadWrite);
if (view != 0){
Scratch_Block scratch(app);
Doc_Cluster *docs = get_custom_layer_boundary_docs(app, scratch);
Doc_Page *page = get_doc_page_from_user(app, docs, "Doc Page:");
if (page != 0){
Buffer_ID buffer = render_doc_page(app, page);
view_set_buffer(app, view, buffer, 0);
}
}
}
CUSTOM_UI_COMMAND_SIG(command_documentation)
CUSTOM_DOC("Prompts the user to select a command then loads a doc buffer for that item")
{
View_ID view = get_this_ctx_view(app, Access_Always);
if (view != 0){
Scratch_Block scratch(app);
Doc_Cluster *docs = doc_commands(scratch);
Doc_Page *page = get_doc_page_from_user(app, docs, "Doc Page:");
if (page != 0){
Buffer_ID buffer = render_doc_page(app, page);
view_set_buffer(app, view, buffer, 0);
}
}
}
// BOTTOM