Docs index filtering

master
Ryan Fleury 2019-12-16 15:13:02 -07:00
parent 471aaaacf9
commit b7992c47ae
3 changed files with 98 additions and 3 deletions

View File

@ -220,6 +220,7 @@ api_parse_source__structure(Arena *arena, String_Const_u8 source_name, String_Co
String_Const_u8 name = {}; String_Const_u8 name = {};
List_String_Const_u8 member_list = {}; List_String_Const_u8 member_list = {};
Token *token = api_parse__token_pos(token_it); Token *token = api_parse__token_pos(token_it);
(void)token;
if (api_parse__match_identifier(token_it, source, &name)){ if (api_parse__match_identifier(token_it, source, &name)){
if (api_parse__match(token_it, TokenCppKind_Semicolon)){ if (api_parse__match(token_it, TokenCppKind_Semicolon)){
result = true; result = true;
@ -254,6 +255,7 @@ api_parse_source__structure(Arena *arena, String_Const_u8 source_name, String_Co
} }
if (result){ if (result){
Token *token_end = api_parse__token_pos(token_it); Token *token_end = api_parse__token_pos(token_it);
(void)token_end;
// TODO(allen): // TODO(allen):
String_Const_u8 definition = {}; String_Const_u8 definition = {};
String_Const_u8 location = api_parse_location(arena, source_name, source, name.str); String_Const_u8 location = api_parse_location(arena, source_name, source, name.str);

View File

@ -38,6 +38,7 @@ char html_header[] = R"HTMLFOO(
<head> <head>
<link rel='shortcut icon' type='image/x-icon' href='4coder_icon.ico' /> <link rel='shortcut icon' type='image/x-icon' href='4coder_icon.ico' />
<link href="https://fonts.googleapis.com/css?family=Inconsolata:700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Inconsolata:700&display=swap" rel="stylesheet">
<script src="../search.js"></script>
<title>%.*s</title> <title>%.*s</title>
<style> <style>
body { body {
@ -179,6 +180,21 @@ background: #181818;
height: 20em; height: 20em;
} }
.docs_menu {
list-style-type:none;
padding: 0;
}
.filter_box {
border: 1px solid #90B080;
font-size: 1.5em;
color: #90B080;
background: none;
text-align: justify;
font-family: 'Inconsolata', monospace;
width: 15em;
}
</style> </style>
</head> </head>
@ -426,6 +442,9 @@ render_doc_cluster_to_html(Arena *scratch, Doc_Cluster *cluster,
fprintf(file_index, "<div class=\"small_spacer\"></div>\n"); fprintf(file_index, "<div class=\"small_spacer\"></div>\n");
fprintf(file_index, "<h1>%.*s Index</h1>\n", string_expand(cluster->title)); fprintf(file_index, "<h1>%.*s Index</h1>\n", string_expand(cluster->title));
fprintf(file_index, "<div class=\"spacer\"></div>\n"); fprintf(file_index, "<div class=\"spacer\"></div>\n");
fprintf(file_index, "<input class=\"filter_box\" type=\"text\" id=\"search_input\" onkeyup=\"SearchKeyUp(event)\" onkeydown=\"SearchKeyDown(event)\""
"placeholder=\"Filter...\" title=\"Filter...\">");
fprintf(file_index, "<div class=\"spacer\"></div>\n");
Doc_Page **ptrs = push_array(scratch, Doc_Page*, cluster->page_count); Doc_Page **ptrs = push_array(scratch, Doc_Page*, cluster->page_count);
i32 counter = 0; i32 counter = 0;
@ -438,14 +457,17 @@ render_doc_cluster_to_html(Arena *scratch, Doc_Cluster *cluster,
sort_doc_page_array(ptrs, 0, counter); sort_doc_page_array(ptrs, 0, counter);
fprintf(file_index, "<div class=\"normal\">");
fprintf(file_index, "<ul class=\"docs_menu\" id=\"docs_menu\">\n");
for (i32 i = 0; i < counter; i += 1){ for (i32 i = 0; i < counter; i += 1){
Doc_Page *node = ptrs[i]; Doc_Page *node = ptrs[i];
fprintf(file_index, "<div class=\"normal\">"); fprintf(file_index, "<li><a href=\"%.*s.html\">%.*s</a></li>",
fprintf(file_index, "<a href=\"%.*s.html\">%.*s</a>",
string_expand(node->name), string_expand(node->name),
string_expand(node->name)); string_expand(node->name));
fprintf(file_index, "</div>\n");
} }
fprintf(file_index, "</ul>\n");
fprintf(file_index, "</div>\n");
fprintf(file_index, html_footer); fprintf(file_index, html_footer);
} }

71
site/search.js Normal file
View File

@ -0,0 +1,71 @@
const menu_id = "docs_menu";
const filter_id = "search_input";
function StringMatch4coderFuzzy(a, b)
{
let match = true;
let b_upper = b.toUpperCase();
let a_substrings = a.toUpperCase().split(/[ _*]+/);
let minimum_index = 0;
for(let i = 0; i < a_substrings.length; ++i)
{
if(a_substrings[i].length > 0)
{
let index_of_substring = b_upper.indexOf(a_substrings[i], minimum_index);
if(index_of_substring < 0 || index_of_substring < minimum_index)
{
match = false;
break;
}
minimum_index = index_of_substring + a_substrings[i].length - 1;
}
}
return match;
}
function SearchKeyDown(event)
{
if(event.keyCode == 13)
{
let ul = document.getElementById(menu_id);
let li = ul.getElementsByTagName("li");
for (let i = 0; i < li.length; i++)
{
if(li[i].style.display == "")
{
window.location.href = li[i].getElementsByTagName("a")[0];
break;
}
}
}
}
function SearchKeyUp(event)
{
let ul = document.getElementById(menu_id);
let li = ul.getElementsByTagName("li");
let input = document.getElementById(filter_id);
let filter = input.value.toUpperCase();
for(let i = 0; i < li.length; i++)
{
if(filter.length > 0)
{
let a = li[i].getElementsByTagName("a")[0];
if(StringMatch4coderFuzzy(filter, a.innerHTML))
{
li[i].style.display = "";
}
else
{
li[i].style.display = "none";
}
}
else
{
li[i].style.display = "";
}
}
}