|
void _repos_macro_tool_nav_express_level (XML * result, XML * repository, XML * page, XML * object, XML * template, int curlevel, int pagelevel)
{
XML * defn;
XML * mark;
/* Limit this whole thing to one level down from the current page. */
if (curlevel > pagelevel + 1) return;
/* Let's find the appropriate level expression in the nav template. */
defn = xml_firstelem (template);
while (defn && xml_is (defn, "nav:level")) {
if (!strcmp (xml_attrval (defn, "level"), "*")) break;
if (atoi (xml_attrval (defn, "level")) == curlevel) break;
defn = xml_nextelem (defn);
}
/* If there is no level which matches, but we're not at the current page's level, then we increment the level and try again.
This might be a series of local nav bars, after all. */
if (!defn) {
_repos_macro_tool_nav_express_level (result, repository, page, object, template, curlevel + 1, pagelevel);
return;
}
/* Now we scan up to curlevel in the site tree above the current page, and generate the entries for the ancestor and all siblings
of the ancestor. When we hit a nav:level element, we'll increment curlevel and call this function again. */
mark = xml_first (defn);
while (mark) {
_repos_macro_tool_nav_express (result, repository, page, object, template, mark, curlevel, pagelevel);
mark = xml_next (mark);
}
}
void _repos_macro_tool_nav_express_piece (XML * result,
XML * repository, XML * page, XML * origpage, XML * object,
XML * master, XML * template,
int curlevel, int pagelevel,
int selected, int parent_selected); /* A mouthful! */
void _repos_macro_tool_nav_express (XML * result, XML * repository, XML * page, XML * object, XML * master, XML * template, int curlevel, int pagelevel)
{
XML * res;
XML * mark;
XML * mark_but_one;
XML * mark2;
int i;
if (!xml_is_element (template)) {
xml_append (result, xml_copy (template));
return;
}
if (!strcmp (xml_name (template), "nav:list")) {
/* Find the right level. */
if (curlevel > pagelevel) {
mark_but_one = NULL;
mark = page;
} else if (curlevel == pagelevel) {
mark_but_one = page;
mark = xml_parent (page);
} else {
mark_but_one = page;
mark = xml_parent(page);
for (i = curlevel; i < pagelevel; i++) {
mark_but_one = xml_parent (mark_but_one);
mark = xml_parent (mark);
}
}
/* Iterate through it, expressing pages. */
mark = xml_firstelem (mark);
while (mark) {
if (xml_is (mark, "page")) {
mark2 = xml_first (template);
while (mark2) {
_repos_macro_tool_nav_express_piece (result, repository, mark, page, object, master, mark2, curlevel, pagelevel, mark == page, mark == mark_but_one);
mark2 = xml_next (mark2);
}
}
mark = xml_nextelem (mark);
}
} else if (!strncmp (xml_name (template), "template:", 9)) {
res = xml_template_apply (page, template, object, _repos_publish_getvalue);
mark = xml_first (res);
while (mark) {
xml_append (result, xml_copy(mark));
mark = xml_next (mark);
}
xml_free (res);
} else {
res = xml_create (xml_name (template));
xml_copyattrs (res, template);
mark = xml_first (template);
while (mark) {
_repos_macro_tool_nav_express (res, repository, page, object, master, mark, curlevel, pagelevel);
mark = xml_next (mark);
}
xml_append (result, res);
}
}
void _repos_macro_tool_nav_express_piece (XML * result,
XML * repository, XML * page, XML * origpage, XML * object,
XML * master, XML * template,
int curlevel, int pagelevel,
int selected, int parent_selected)
{
XML * res;
XML * mark;
XML * mark_but_one;
XML * mark2;
int test;
int i;
if (!xml_is_element (template)) {
xml_append (result, xml_copy (template));
return;
}
if (!strcmp (xml_name (template), "nav:type")) {
/* Determine whether we express this or not. */
if (!strcmp (xml_attrval (template, "test"), "selected")) {
test = selected;
} else if (!strcmp (xml_attrval (template, "test"), "unselected")) {
test = !selected && !parent_selected;
} else if (!strcmp (xml_attrval (template, "test"), "parentselected")) {
test = parent_selected && !selected;
} else {
test = *xml_attrval (page, xml_attrval (template, "test"));
}
if (test) {
res = xml_create ("nav");
mark = xml_first (template);
while (mark) {
_repos_macro_tool_nav_express_piece (res, repository, page, origpage, object, master, mark, curlevel, pagelevel, selected, parent_selected);
mark = xml_next (mark);
}
mark = xml_first (res);
while (mark) {
xml_append (result, xml_copy(mark));
mark = xml_next (mark);
}
xml_free (res);
}
} else if (!strcmp (xml_name (template), "nav:level")) {
_repos_macro_tool_nav_express_level (result, repository, origpage, object, master, curlevel + 1, pagelevel);
} else if (!strncmp (xml_name (template), "template:", 9)) {
res = xml_template_apply (page, template, object, _repos_publish_getvalue);
if (xml_is_element (res)) {
mark = xml_first (res);
while (mark) {
xml_append (result, xml_copy(mark));
mark = xml_next (mark);
}
xml_free (res);
} else {
xml_append (result, res);
}
} else {
res = xml_create (xml_name (template));
xml_copyattrs (res, template);
mark = xml_first (template);
while (mark) {
_repos_macro_tool_nav_express_piece (res, repository, page, origpage, object, master, mark, curlevel, pagelevel, selected, parent_selected);
mark = xml_next (mark);
}
xml_append (result, res);
}
}
|