end
private fun overview do
- var overviewpage = new NitdocOverview(ctx, model, mainmodule)
- overviewpage.render.write_to_file("{ctx.output_dir.to_s}/index.html")
+ var page = new NitdocOverview(ctx, model, mainmodule)
+ page.render.write_to_file("{ctx.output_dir.to_s}/{page.page_url}")
end
private fun search do
- var searchpage = new NitdocSearch(ctx, model, mainmodule)
- searchpage.render.write_to_file("{ctx.output_dir.to_s}/search.html")
+ var page = new NitdocSearch(ctx, model, mainmodule)
+ page.render.write_to_file("{ctx.output_dir.to_s}/{page.page_url}")
end
private fun groups do
for mproject in model.mprojects do
for mgroup in mproject.mgroups.to_a do
var page = new NitdocGroup(ctx, model, mainmodule, mgroup)
- page.render.write_to_file("{ctx.output_dir.to_s}/{mgroup.nitdoc_url}")
+ page.render.write_to_file("{ctx.output_dir.to_s}/{page.page_url}")
end
end
end
private fun modules do
for mmodule in model.mmodules do
if mmodule.is_fictive then continue
- var modulepage = new NitdocModule(ctx, model, mainmodule, mmodule)
- modulepage.render.write_to_file("{ctx.output_dir.to_s}/{mmodule.nitdoc_url}")
+ var page = new NitdocModule(ctx, model, mainmodule, mmodule)
+ page.render.write_to_file("{ctx.output_dir.to_s}/{page.page_url}")
end
end
private fun classes do
for mclass in model.mclasses do
- var classpage = new NitdocClass(ctx, model, mainmodule, mclass)
- classpage.render.write_to_file("{ctx.output_dir.to_s}/{mclass.nitdoc_url}")
+ var page = new NitdocClass(ctx, model, mainmodule, mclass)
+ page.render.write_to_file("{ctx.output_dir.to_s}/{page.page_url}")
end
end
private fun properties do
for mproperty in model.mproperties do
var page = new NitdocProperty(ctx, model, mainmodule, mproperty)
- page.render.write_to_file("{ctx.output_dir.to_s}/{mproperty.nitdoc_url}")
+ page.render.write_to_file("{ctx.output_dir.to_s}/{page.page_url}")
end
end
# build page
var tpl = tpl_page
tpl.title = tpl_title
+ tpl.url = page_url
tpl.shareurl = shareurl
tpl.topmenu = tpl_topmenu
tpl_content
return tpl
end
+ # URL to this page.
+ fun page_url: String is abstract
+
# Build page template
fun tpl_page: TplPage is abstract
# Build top menu template
fun tpl_topmenu: TplTopMenu do
- var topmenu = new TplTopMenu
+ var topmenu = new TplTopMenu(page_url)
var brand = ctx.opt_custom_brand.value
if brand != null then
var tpl = new Template
tpl.add "</span>"
topmenu.brand = tpl
end
+ topmenu.add_link new TplLink("index.html", "Overview")
+ topmenu.add_link new TplLink("search.html", "Index")
return topmenu
end
do
if location == null then return null
var source = ctx.opt_source.value
- if source == null then return "{location.file.filename.simplify_path}"
+ if source == null then return location.file.filename.simplify_path
# THIS IS JUST UGLY ! (but there is no replace yet)
var x = source.split_with("%f")
source = x.join(location.file.filename.simplify_path)
article.content = mmodule.tpl_definition
# mclassdefs list
var intros = mmodule.intro_mclassdefs(ctx.min_visibility).to_a
- mainmodule.linearize_mclassdefs(intros)
- var intros_art = new TplArticle.with_title("{mmodule.nitdoc_id}_intros", "Introduces")
- var intros_lst = new TplList.with_classes(["list-unstyled", "list-labeled"])
- for mclassdef in intros do
- intros_lst.add_li new TplListItem.with_content(mclassdef.tpl_list_item)
- end
- if not intros_lst.is_empty then
- intros_art.content = intros_lst
- article.add_child intros_art
+ if not intros.is_empty then
+ mainmodule.linearize_mclassdefs(intros)
+ var intros_art = new TplArticle.with_title("{mmodule.nitdoc_id}_intros", "Introduces")
+ var intros_lst = new TplList.with_classes(["list-unstyled", "list-labeled"])
+ for mclassdef in intros do
+ intros_lst.add_li mclassdef.tpl_list_item
+ end
+ if not intros_lst.is_empty then
+ intros_art.content = intros_lst
+ article.add_child intros_art
+ end
end
var redefs = mmodule.redef_mclassdefs(ctx.min_visibility).to_a
- mainmodule.linearize_mclassdefs(redefs)
- var redefs_art = new TplArticle.with_title("{mmodule.nitdoc_id}_redefs", "Redefines")
- var redefs_lst = new TplList.with_classes(["list-unstyled", "list-labeled"])
- for mclassdef in redefs do
- redefs_lst.add_li new TplListItem.with_content(mclassdef.tpl_list_item)
- end
- if not redefs_lst.is_empty then
- redefs_art.content = redefs_lst
- article.add_child redefs_art
+ if not redefs.is_empty then
+ mainmodule.linearize_mclassdefs(redefs)
+ var redefs_art = new TplArticle.with_title("{mmodule.nitdoc_id}_redefs", "Redefines")
+ var redefs_lst = new TplList.with_classes(["list-unstyled", "list-labeled"])
+ for mclassdef in redefs do
+ redefs_lst.add_li mclassdef.tpl_list_item
+ end
+ if not redefs_lst.is_empty then
+ redefs_art.content = redefs_lst
+ article.add_child redefs_art
+ end
end
return article
end
var intros = new TplArticle.with_title("{mclassdef.nitdoc_id}_intros", "Introduces")
var intros_lst = new TplList.with_classes(["list-unstyled", "list-labeled"])
for mpropdef in mclassdef.collect_intro_mpropdefs(ctx.min_visibility) do
- intros_lst.add_li new TplListItem.with_content(mpropdef.tpl_list_item)
+ intros_lst.add_li mpropdef.tpl_list_item
end
if not intros_lst.is_empty then
intros.content = intros_lst
var redefs = new TplArticle.with_title("{mclassdef.nitdoc_id}_redefs", "Redefines")
var redefs_lst = new TplList.with_classes(["list-unstyled", "list-labeled"])
for mpropdef in mclassdef.collect_redef_mpropdefs(ctx.min_visibility) do
- redefs_lst.add_li new TplListItem.with_content(mpropdef.tpl_list_item)
+ redefs_lst.add_li mpropdef.tpl_list_item
end
if not redefs_lst.is_empty then
redefs.content = redefs_lst
end
end
- redef fun tpl_topmenu do
- var topmenu = super
- topmenu.add_item(new TplLink("#", "Overview"), true)
- topmenu.add_item(new TplLink("search.html", "Index"), false)
- return topmenu
- end
+ redef fun page_url do return "index.html"
# intro text
private fun tpl_intro: TplSection do
redef fun tpl_title do return "Index"
- redef fun tpl_topmenu do
- var topmenu = super
- topmenu.add_item(new TplLink("index.html", "Overview"), false)
- topmenu.add_item(new TplLink("#", "Index"), true)
- return topmenu
- end
+ redef fun page_url do return "search.html"
redef fun tpl_content do
var tpl = new TplSearchPage("search_all")
private var sidebar = new TplSidebar
redef fun tpl_sidebar do return sidebar
- redef fun tpl_title do return "{mgroup.nitdoc_name}"
+ redef fun tpl_title do return mgroup.nitdoc_name
+
+ redef fun page_url do return mgroup.nitdoc_url
redef fun tpl_topmenu do
var topmenu = super
var mproject = mgroup.mproject
- topmenu.add_item(new TplLink("index.html", "Overview"), false)
- if mgroup.is_root then
- topmenu.add_item(new TplLink("#", "{mproject.nitdoc_name}"), true)
- else
- topmenu.add_item(new TplLink(mproject.nitdoc_url, "{mproject.nitdoc_name}"), false)
- topmenu.add_item(new TplLink("#", "{mgroup.nitdoc_name}"), true)
+ if not mgroup.is_root then
+ topmenu.add_link new TplLink(mproject.nitdoc_url, mproject.nitdoc_name)
end
- topmenu.add_item(new TplLink("search.html", "Index"), false)
+ topmenu.add_link new TplLink(page_url, mproject.nitdoc_name)
return topmenu
end
tpl_sidebar.boxes.add new TplSideBox.with_content("All classes", list)
end
- private fun tpl_sidebar_item(def: MClass): Template do
+ private fun tpl_sidebar_item(def: MClass): TplListItem do
var classes = def.intro.tpl_css_classes.to_a
if intros.has(def) then
classes.add "intro"
var lnk = new Template
lnk.add new TplLabel.with_classes(classes)
lnk.add def.tpl_link
- return lnk
+ return new TplListItem.with_content(lnk)
end
# intro text
private var sidebar = new TplSidebar
redef fun tpl_sidebar do return sidebar
- redef fun tpl_title do return "{mmodule.nitdoc_name}"
+ redef fun tpl_title do return mmodule.nitdoc_name
+ redef fun page_url do return mmodule.nitdoc_url
redef fun tpl_topmenu do
var topmenu = super
var mproject = mmodule.mgroup.mproject
- topmenu.add_item(new TplLink("index.html", "Overview"), false)
- topmenu.add_item(new TplLink("{mproject.nitdoc_url}", "{mproject.nitdoc_name}"), false)
- topmenu.add_item(new TplLink("#", "{mmodule.nitdoc_name}"), true)
- topmenu.add_item(new TplLink("search.html", "Index"), false)
+ topmenu.add_link new TplLink(mproject.nitdoc_url, mproject.nitdoc_name)
+ topmenu.add_link new TplLink(page_url, mmodule.nitdoc_name)
return topmenu
end
tpl_sidebar.boxes.add new TplSideBox.with_content("All classes", list)
end
- private fun tpl_sidebar_item(def: MClass): Template do
+ private fun tpl_sidebar_item(def: MClass): TplListItem do
var classes = def.intro.tpl_css_classes.to_a
if def.intro_mmodule == mmodule then
classes.add "intro"
var lnk = new Template
lnk.add new TplLabel.with_classes(classes)
lnk.add def.tpl_link
- return lnk
+ return new TplListItem.with_content(lnk)
end
# intro text
redef fun tpl_sidebar do return sidebar
redef fun tpl_title do return "{mclass.nitdoc_name}{mclass.tpl_signature.write_to_string}"
+ redef fun page_url do return mclass.nitdoc_url
redef fun tpl_topmenu do
var topmenu = super
var mproject = mclass.intro_mmodule.mgroup.mproject
- topmenu.add_item(new TplLink("index.html", "Overview"), false)
- topmenu.add_item(new TplLink("{mproject.nitdoc_url}", "{mproject.nitdoc_name}"), false)
- topmenu.add_item(new TplLink("#", "{mclass.nitdoc_name}"), true)
- topmenu.add_item(new TplLink("search.html", "Index"), false)
+ topmenu.add_link new TplLink("{mproject.nitdoc_url}", "{mproject.nitdoc_name}")
+ topmenu.add_link new TplLink(page_url, mclass.nitdoc_name)
return topmenu
end
summary.elts.add entry
end
- private fun tpl_sidebar_item(mprop: MProperty): Template do
+ private fun tpl_sidebar_item(mprop: MProperty): TplListItem do
var classes = mprop.intro.tpl_css_classes.to_a
if not mprops2mdefs.has_key(mprop) then
classes.add "inherit"
var lnk = new Template
lnk.add new TplLabel.with_classes(classes)
lnk.add mprop.intro.tpl_link
- return lnk
+ return new TplListItem.with_content(lnk)
end
var defs = mprops2mdefs[mprop]
if defs.has(mprop.intro) then
var lnk = new Template
lnk.add new TplLabel.with_classes(classes)
lnk.add mprop.intro.tpl_anchor
- return lnk
+ return new TplListItem.with_content(lnk)
end
private fun tpl_intro: TplSection do
return res
end
- private fun sort_by_public_owner(mmodules: Collection[MModule]): Map[MModule, Set[MModule]] do
- var map = new HashMap[MModule, Set[MModule]]
- for mmodule in mmodules do
- var owner = mmodule
- if mmodule.public_owner != null then owner = mmodule.public_owner.as(not null)
- if not map.has_key(owner) then map[owner] = new HashSet[MModule]
- map[owner].add mmodule
- end
- return map
- end
-
# Generate dot hierarchy for classes
fun tpl_dot(mclasses: Collection[MClass]): nullable TplArticle do
var poset = new POSet[MClass]
return "{mproperty.nitdoc_name}{mproperty.tpl_signature.write_to_string}"
end
+ redef fun page_url do return mproperty.nitdoc_url
+
redef fun tpl_topmenu do
var topmenu = super
var mmodule = mproperty.intro_mclassdef.mmodule
var mproject = mmodule.mgroup.mproject
var mclass = mproperty.intro_mclassdef.mclass
- topmenu.add_item(new TplLink("index.html", "Overview"), false)
- topmenu.add_item(new TplLink("{mproject.nitdoc_url}", "{mproject.nitdoc_name}"), false)
- topmenu.add_item(new TplLink("{mclass.nitdoc_url}", "{mclass.nitdoc_name}"), false)
- topmenu.add_item(new TplLink("#", "{mproperty.nitdoc_name}"), true)
- topmenu.add_item(new TplLink("search.html", "Index"), false)
+ topmenu.add_link new TplLink("{mproject.nitdoc_url}", "{mproject.nitdoc_name}")
+ topmenu.add_link new TplLink("{mclass.nitdoc_url}", "{mclass.nitdoc_name}")
+ topmenu.add_link new TplLink(page_url, mproperty.nitdoc_name)
return topmenu
end
# Page title in HTML header
var title: String is writable, noinit
+ # Page url
+ var url: String is writable, noinit
+
# Directory where css, js and other assets can be found
var shareurl: String is writable, noinit
add "<script src='{shareurl}/vendors/jquery/jquery-1.11.1.min.js'></script>"
add "<script src='{shareurl}/vendors/jquery/jquery-ui-1.10.4.custom.min.js'></script>"
add "<script src='{shareurl}/vendors/bootstrap/js/bootstrap.min.js'></script>"
- add "<script data-main='{shareurl}/js/nitdoc' src='{shareurl}/js/lib/require.js'</script>"
+ add "<script data-main='{shareurl}/js/nitdoc' src='{shareurl}/js/lib/require.js'></script>"
for script in scripts do add script
add """<script>
$(function () {
# Elements of the topmenu
private var elts = new Array[Streamable]
- init do end
+ # The page url where the top menu is displayed.
+ #
+ # Used to select the active link.
+ private var current_url: String
+
+ init(current_url: String) do
+ self.current_url = current_url
+ end
+
+ # Add a new link to the menu.
+ fun add_link(content: TplLink) do
+ var is_active = content.href == current_url
+ add_item(content, is_active)
+ end
# Add a content between `<li>` tags
fun add_item(content: Streamable, is_active: Bool) do
end
redef fun is_empty: Bool do
- return title == null and subtitle == null and content == null
+ return title == null and subtitle == null and content == null and children.is_empty
end
end
var href: String writable
# Text to display in the link
- var text: String writable
+ var text: Streamable writable
# Optional title
var title: nullable String writable
var css_classes = new Array[String]
# Add content wrapped in a <li> element
- fun add_li(content: Streamable) do elts.add new TplListItem.with_content(content)
+ fun add_li(item: TplListItem) do elts.add item
init do end
fun append(content: Streamable) do self.content.add content
redef fun rendering do
- add "<li class='"
- for cls in css_classes do add " {cls}"
- add "'>"
+ add "<li class='{css_classes.join(" ")}'>"
add content
add "</li>"
end
super Template
# Content of the label if any
- var content: nullable Streamable
+ var content: nullable Streamable = null is writable
# CSS classes of the <span> element
var css_classes = new Array[String]
- init do end
init with_content(content: Streamable) do self.content = content
init with_classes(classes: Array[String]) do self.css_classes = classes