uce/site/doc/index.uce
udo b53eb6e4f1 Enhance template parser to handle C++ comments and refactor preprocessing logic
- Updated parser to correctly interpret C++ `//` and `/* ... */` comments within template code.
- Split preprocessing implementation into separate files for better organization.
- Added regression test for comment parsing in templates.
- Adjusted CSS styles for improved layout and readability in documentation.
2026-04-20 21:41:23 +00:00

263 lines
5.9 KiB
Plaintext

void render_see_section(String name)
{
StringList lines = split(file_get_contents("areas/"+name+".txt"), "\n");
s32 idx = 0;
for(auto line : lines)
{
if(idx == 0)
{
<><div class="category"><h3><?= line ?></h3><ul></>
}
else if(line != "")
{
<><li><a href="index.uce?p=<?= uri_encode(line) ?>"><?= line ?><span class="dim">()</span></a></li></>
}
idx += 1;
}
<></ul></div></>
}
RENDER(Request& context)
{
String page = first(context.get["p"], "index");
<><html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1"></meta>
<link rel="stylesheet" href='style.css?v=<?= time() ?>'></link>
</head>
<body>
<h1>
<a href="index.uce">UCE Docs</a><?
if(page != "index")
{
?><span class="dim"> / </span><?= page ?><?
}
?>
</h1>
<?
if(page == "index")
{
?><div class="search-bar">
<input id="doc-search" type="search" placeholder="Search API…" autocomplete="off" spellcheck="false"/>
<span class="search-count" id="search-count"></span>
</div>
<div id="search-results" hidden></div>
<div class="index-pane" id="index-pane">
<div class="index-layout">
<nav class="sidebar"><?
for(auto file_name : ls("areas/"))
{
String ft = nibble(file_name, ".");
render_see_section(ft);
}
?></nav>
<main class="content">
<h2>All API Functions</h2>
<div class="func-grid"><?
for(auto file_name : ls("pages/"))
{
String ft = nibble(file_name, ".");
if(ft.substr(0, 2) == "0_")
{
String fn = ft;
String pre = nibble(fn, "_");
?>
<div class="func-item"><a href="?p=<?= uri_encode(ft) ?>"><?= fn ?><span class="badge">struct</span></a></div>
<?
}
else if(ft.substr(0, 2) == "1_")
{
String fn = ft;
String pre = nibble(fn, "_");
?>
<div class="func-item"><a href="?p=<?= uri_encode(ft) ?>"><?= fn ?><span class="badge">directive</span></a></div>
<?
}
else
{
?>
<div class="func-item"><a href="?p=<?= uri_encode(ft) ?>"><?= ft ?><span class="dim">()</span></a></div>
<?
}
}
?></div>
</main>
</div>
</div>
<?
<><script>
(function () {
var input = document.getElementById('doc-search');
var results = document.getElementById('search-results');
var pane = document.getElementById('index-pane');
var counter = document.getElementById('search-count');
var timer;
function showResults(html) {
results.innerHTML = html;
results.hidden = false;
pane.hidden = true;
var hits = results.querySelectorAll('.search-hit').length;
counter.textContent = hits ? hits + ' result' + (hits > 1 ? 's' : '') : '';
}
function showIndex() {
results.innerHTML = '';
results.hidden = true;
pane.hidden = false;
counter.textContent = '';
}
input.addEventListener('input', function () {
var q = this.value.trim();
clearTimeout(timer);
if (q.length < 2) { showIndex(); return; }
counter.textContent = '\u2026';
timer = setTimeout(function () {
fetch('search.uce?q=' + encodeURIComponent(q))
.then(function (r) { return r.text(); })
.then(showResults);
}, 220);
});
input.addEventListener('keydown', function (e) {
if (e.key === 'Escape') { this.value = ''; showIndex(); }
});
})();
</script></>
}
else
{
auto doc = split(file_get_contents("pages/"+page+".txt"), "\n");
// Pre-extract related lines for sidebar
StringList rel_lines;
bool in_rel = false;
for(auto s : doc)
{
if(s == ":related") { in_rel = true; }
else if(s != "" && s.substr(0, 1) == ":") { in_rel = false; }
else if(in_rel && s != "") { rel_lines.push_back(s); }
}
String detail_class = "detail-layout";
if(rel_lines.size() == 0) detail_class += " no-sidebar";
?><div class="<?= detail_class ?>">
<article class="doc-detail"><?
String layout_class = "text";
u32 line_idx = 0;
bool section_hidden = false;
for(auto s : doc)
{
line_idx++;
if(s == "")
{
}
else if(s.substr(0, 1) == ":")
{
String new_class = s.substr(1);
// Close previous section's div if it was rendered
if(line_idx > 1 && !section_hidden)
{
?></div><?
}
section_hidden = (new_class == "related");
layout_class = new_class;
if(!section_hidden)
{
?><div class="doc-section <?= layout_class ?>"><?
if(layout_class == "params")
{
?><h3>Parameters</h3><?
}
else if(layout_class == "sig")
{
?><h3>Signature</h3><?
}
else if(layout_class == "pre")
{
layout_class = "sig";
}
else if(layout_class == "desc")
{
?><h3>Description</h3><?
}
else if(layout_class == "see")
{
?><h3>Related</h3><?
}
else
{
?><h3><?= layout_class ?></h3><?
}
}
}
else if(!section_hidden)
{
if(s.substr(0, 1) == "-")
{
nibble(s, "-");
?><li><?= (s) ?></li><?
}
else if(layout_class == "sig")
{
?><pre><? print(s); ?></pre><?
}
else if(layout_class == "params")
{
?><div><b><?= trim(nibble(s, ":")) ?></b> : <?= trim(s) ?></div><?
}
else if(layout_class == "see")
{
if(s[0] == '>')
{
render_see_section(s.substr(1));
}
else
{
?><div><a href="index.uce?p=<?= trim(s) ?>"><?= trim(s) ?><span class="dim">()</span></a></div><?
}
}
else
{
?><div><?: markdown_to_html(s) ?></div><?
}
}
}
if(line_idx > 0 && !section_hidden)
{
?></div><?
}
?></article><?
if(rel_lines.size() > 0)
{
?><aside class="detail-sidebar">
<div class="sidebar-card">
<h3>PHP &amp; JS Equivalents</h3><?
for(auto rl : rel_lines)
{
?><div><?: markdown_to_html(rl) ?></div><?
}
?></div>
</aside><?
}
?></div><?
}
?>
</body>
</html></>
}