mirror of
https://github.com/Relintai/sfw.git
synced 2025-01-03 05:09:36 +01:00
Rework the doc tool a bit. Now it need a new template which needs to have classes added manually, and it will generate a list from the unused classes.
This commit is contained in:
parent
0c22c5fa96
commit
564196394b
162
tools/doc/index_remaining_template.md.html
Normal file
162
tools/doc/index_remaining_template.md.html
Normal file
@ -0,0 +1,162 @@
|
||||
<meta charset="utf-8">
|
||||
**Sample API Doc**
|
||||
1.1 Release
|
||||
|
||||
|
||||
This is the markdeep generic "Company API" template. Replace
|
||||
`company-logo-512.png` with your organization's logo and adjust the
|
||||
`company-api.css` styling to match the desired colors.
|
||||
|
||||
See `CA::OpenHandle()` for an example of an auto-generated API link.
|
||||
The rest of the information on this page is bogus placeholder to show the formatting.
|
||||
|
||||
|
||||
API Modules
|
||||
====================================================================================
|
||||
|
||||
The CA library is a layer on top of the resource manager and parsing libraries that
|
||||
provides utilities for streaming processing and client-side process construction.
|
||||
|
||||
|
||||
ENUMS
|
||||
====================================================================================
|
||||
|
||||
$ENUMS$
|
||||
|
||||
STRUCTS
|
||||
====================================================================================
|
||||
|
||||
$STRUCTS$
|
||||
|
||||
CLASSES
|
||||
====================================================================================
|
||||
|
||||
$CLASSES$
|
||||
|
||||
Modules
|
||||
----------------------------------------------------------------------------------------
|
||||
|
||||
The CA library contains the APIs for applications to allocate and exchange resources.
|
||||
|
||||
|
||||
!!! Attention Attention
|
||||
Always read all of the documentation.
|
||||
|
||||
[CA APIs](#CA)
|
||||
: List of APIs to manage external processes.
|
||||
|
||||
CA Buffer List APIs
|
||||
: Methods to process buffer resources separate from computation.
|
||||
|
||||
CA Data Structures
|
||||
: Specifies the data structures used for complex cases.
|
||||
|
||||
|
||||
## Handles
|
||||
|
||||
`CA::OpenHandle(const std::string&)`
|
||||
: Open a reference handle.
|
||||
|
||||
`CA::ReadMetaData(const Handle&)`
|
||||
: Metadata about the event.
|
||||
|
||||
`CA::CloseHandle(const Handle&)`
|
||||
: Free all handle resources, recursively.
|
||||
|
||||
|
||||
CA
|
||||
====================================================================================
|
||||
|
||||
!!! Warning Warning
|
||||
The API content represents the set of APIs you can use directly. Some APIs
|
||||
are not documented and we advise you do not use them directly. Using undocumented
|
||||
APIs can lead to incompatibility when upgrading to later releases.
|
||||
|
||||
|
||||
These examples assume that your directory structure is:
|
||||
|
||||
**********************************************************
|
||||
*
|
||||
* 📂 ca1
|
||||
* |
|
||||
* +-- 📄 bar.txt
|
||||
* |
|
||||
* +-- 📂 foo
|
||||
* | |
|
||||
* | ⋮
|
||||
* |
|
||||
* +-- 📂 xsource
|
||||
* | |
|
||||
* | +-- 📂 data
|
||||
* | | |
|
||||
* | | +-- 📄 manifest.json
|
||||
* | | |
|
||||
* | ⋮ ⋮
|
||||
* |
|
||||
* ⋮
|
||||
**********************************************************
|
||||
[Directory structure.]
|
||||
|
||||
|
||||
Table
|
||||
------------------------------------------------------------------
|
||||
|
||||
|
||||
Screen | Factor | Used | Efficiency
|
||||
----------:|------------:|----------:|---------:
|
||||
1366x768 | 3x | 1152x672 | 74%
|
||||
1440x900 | 3x | 1152x672 | 60%
|
||||
*1600x900* | *4x* | 1536x896 | *96%*
|
||||
1680x1050 | 4x | 1536x896 | 78%
|
||||
1920x1080 | 4x | 1536x896 | 66%
|
||||
*1920x1200*| *5x* | 1920x1120 | *93%*
|
||||
[A Table]
|
||||
|
||||
|
||||
More Info
|
||||
------------------------------------------------------------------
|
||||
|
||||
******************************************************************
|
||||
* ^ y
|
||||
* |
|
||||
* .---------. .----|----.
|
||||
* | | | | |
|
||||
* | *-------> x | *--------> x
|
||||
* | | | | |
|
||||
* '----|----' '---------'
|
||||
* |
|
||||
* v y
|
||||
******************************************************************
|
||||
[Figure 1: Coordinate Example]
|
||||
|
||||
|
||||
-----
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL
|
||||
vec3 sphNormal(in vec3 pos, in vec4 sph) {
|
||||
return normalize(pos-sph.xyz);
|
||||
}
|
||||
|
||||
vec3 camera(vec2 U, vec2 r, vec3 ro, vec3 la, float fl) {
|
||||
vec2 uv = (U - r*.5)/r.y;
|
||||
vec3 fwd = normalize(la-ro),
|
||||
rgt = normalize(vec3(fwd.z, 0., -fwd.x));
|
||||
return normalize(fwd + fl*uv.x*rgt + fl*uv.y*cross(fwd, rgt));
|
||||
}
|
||||
|
||||
float vMap(vec3 p) {
|
||||
float hit = 0.0;
|
||||
vec2 h2 = hash22(floor(p.xz*0.25));
|
||||
if (p.z > 0.0) {
|
||||
if (p.y < -10.0 && h2.x > 0.5) hit=1.0;
|
||||
if (p.y > 10.0 && h2.y > 0.5) hit=1.0;
|
||||
}
|
||||
return hit;
|
||||
}
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[Code listing]
|
||||
|
||||
<script>markdeepOptions = {tocStyle:'long', definitionStyle:'long', linkAPIDefinitions: true};</script>
|
||||
<link rel="stylesheet" href="slate.css">
|
||||
<!-- Markdeep: --><style class="fallback">body{visibility:hidden;white-space:pre;font-family:monospace}</style><script src="markdeep.min.js"></script><script src="https://casual-effects.com/markdeep/latest/markdeep.min.js?"></script><script>window.alreadyProcessedMarkdeep||(document.body.style.visibility="visible")</script>
|
||||
|
@ -11,6 +11,25 @@ See `CA::OpenHandle()` for an example of an auto-generated API link.
|
||||
The rest of the information on this page is bogus placeholder to show the formatting.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ENUMS
|
||||
====================================================================================
|
||||
|
||||
|
||||
ClockDirection
|
||||
----------------------------------------------------------------------------------------
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
|
||||
|||ENUM_ClockDirection|||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
API Modules
|
||||
====================================================================================
|
||||
|
||||
|
@ -7,6 +7,12 @@ void print_list(const List<String> &list) {
|
||||
}
|
||||
}
|
||||
|
||||
void print_class_index_keys(const HashMap<String, String> &class_index) {
|
||||
for (const HashMap<String, String>::Element *E = class_index.front(); E; E = E->next) {
|
||||
ERR_PRINT(E->key());
|
||||
}
|
||||
}
|
||||
|
||||
String get_structure_name(const String &data) {
|
||||
String fl = data.get_slicec('{', 0);
|
||||
String l = fl.get_slicec('\n', fl.get_slice_count("\n") - 1);
|
||||
@ -43,7 +49,7 @@ bool is_structure_template_specialization_or_parent_is_template(const String &da
|
||||
return get_structure_parents(data).contains("<");
|
||||
}
|
||||
|
||||
String generate_section_class_list(const List<String> &list) {
|
||||
String generate_section_class_list(const List<String> &list, const String &cls_prefix, const HashSet<String> &used_keywords) {
|
||||
FileAccess f;
|
||||
String code_template = f.read_file("code_template.md.html");
|
||||
String d;
|
||||
@ -53,17 +59,53 @@ String generate_section_class_list(const List<String> &list) {
|
||||
|
||||
String sname = get_structure_name(c);
|
||||
|
||||
if (sname.empty() || sname.begins_with("_")) {
|
||||
if (sname.empty()) {
|
||||
//ERR_PRINT(sname);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (used_keywords.has(cls_prefix + sname)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
d += code_template.replace("$CODE$", c).replace("$NAME$", sname);
|
||||
}
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
void generate_class_index(const List<String> &list, const String &cls_prefix, HashMap<String, String> *cls_index) {
|
||||
ERR_FAIL_COND(!cls_index);
|
||||
|
||||
for (const List<String>::Element *E = list.front(); E; E = E->next()) {
|
||||
String c = E->get();
|
||||
|
||||
String sname = get_structure_name(c);
|
||||
|
||||
if (sname.empty()) {
|
||||
//ERR_PRINT(sname);
|
||||
continue;
|
||||
}
|
||||
|
||||
(*cls_index)[cls_prefix + sname] = c;
|
||||
}
|
||||
}
|
||||
|
||||
List<String> get_template_keywords(const String &tmpl) {
|
||||
List<String> ret;
|
||||
|
||||
//awful, but oh well
|
||||
Vector<String> sp = tmpl.split("|||");
|
||||
|
||||
ERR_FAIL_COND_V_MSG(sp.size() % 2 == 0, ret, "Template has unterminated keywords!");
|
||||
|
||||
for (int i = 1; i < sp.size(); i += 2) {
|
||||
ret.push_back(sp[i]);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
List<String> process_classes_and_structs(const List<String> &list) {
|
||||
List<String> ret;
|
||||
|
||||
@ -330,7 +372,7 @@ void process_file(const String &path) {
|
||||
//Not we should be able to do this, because of how the code style is
|
||||
if (l.contains("enum ") && l.contains("{")) {
|
||||
if (l.contains("}")) {
|
||||
enums.push_back(current_str);
|
||||
enums.push_back(current_str.strip_edges());
|
||||
//ERR_PRINT("TYPE_ENUM");
|
||||
//ERR_PRINT(current_str);
|
||||
current_str.clear();
|
||||
@ -388,7 +430,7 @@ void process_file(const String &path) {
|
||||
//cant happen
|
||||
break;
|
||||
case TYPE_ENUM:
|
||||
enums.push_back(current_str);
|
||||
enums.push_back(current_str.strip_edges());
|
||||
//ERR_PRINT("TYPE_ENUM");
|
||||
break;
|
||||
case TYPE_STRUCT:
|
||||
@ -461,12 +503,42 @@ void process_file(const String &path) {
|
||||
//ERR_PRINT(itos(structs.size()));
|
||||
//ERR_PRINT(itos(classes.size()));
|
||||
|
||||
String index_template = f.read_file("index_template.md.html");
|
||||
String d = index_template;
|
||||
HashMap<String, String> class_index;
|
||||
|
||||
d = d.replace("$ENUMS$", generate_section_class_list(enums));
|
||||
d = d.replace("$STRUCTS$", generate_section_class_list(structs));
|
||||
d = d.replace("$CLASSES$", generate_section_class_list(classes));
|
||||
generate_class_index(enums, "ENUM_", &class_index);
|
||||
generate_class_index(structs, "STRUCT_", &class_index);
|
||||
generate_class_index(classes, "CLASS_", &class_index);
|
||||
|
||||
//print_class_index_keys(class_index);
|
||||
|
||||
String index_template = f.read_file("index_template.md.html");
|
||||
List<String> index_template_keywords = get_template_keywords(index_template);
|
||||
HashSet<String> used_keywords;
|
||||
|
||||
//print_list(index_template_keywords);
|
||||
|
||||
String index_str = index_template;
|
||||
|
||||
for (const List<String>::Element *E = index_template_keywords.front(); E; E = E->next()) {
|
||||
String c = E->get();
|
||||
|
||||
ERR_CONTINUE_MSG(!class_index.has(c), "!class_index.has(): " + c);
|
||||
|
||||
String keyword = "|||" + E->get() + "|||";
|
||||
|
||||
index_str = index_str.replace(keyword, class_index[c]);
|
||||
used_keywords.insert(c);
|
||||
}
|
||||
|
||||
f.write_file("out/index.md.html", index_str);
|
||||
|
||||
//Generate a list from the unused classes.
|
||||
String index_remaining_template = f.read_file("index_remaining_template.md.html");
|
||||
String d = index_remaining_template;
|
||||
|
||||
d = d.replace("$ENUMS$", generate_section_class_list(enums, "ENUM_", used_keywords));
|
||||
d = d.replace("$STRUCTS$", generate_section_class_list(structs, "STRUCT_", used_keywords));
|
||||
d = d.replace("$CLASSES$", generate_section_class_list(classes, "CLASS_", used_keywords));
|
||||
|
||||
f.write_file("out/index_remaining.gen.md.html", d);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user