X-Git-Url: http://nitlanguage.org diff --git a/src/doc/html_templates/html_templates.nit b/src/doc/html_templates/html_templates.nit index 3dba2d9..8849fb3 100644 --- a/src/doc/html_templates/html_templates.nit +++ b/src/doc/html_templates/html_templates.nit @@ -18,6 +18,10 @@ module html_templates import html_model import html::bootstrap import doc_phases::doc_structure +import doc_phases::doc_hierarchies +import doc_phases::doc_graphs +import doc_phases::doc_intros_redefs +import doc_phases::doc_lin # Renders the page as HTML. redef class DocPage @@ -36,11 +40,7 @@ redef class DocPage var topmenu: DocTopMenu is writable, noinit # Sidebar template if any. - var sidebar: nullable TplSidebar = null is writable - - # Content of the page in form a TplSection. - # TODO remove when other templates are migrated. - var sections = new Array[TplSection] + var sidebar: nullable DocSideBar = null is writable # Footer content if any. var footer: nullable Writable = null is writable @@ -48,12 +48,6 @@ redef class DocPage # JS scripts to append at the end of the body var scripts = new Array[TplScript] - # Adds a section to this page. - # TODO remove when other templates are migrated. - fun add_section(section: TplSection) do - sections.add section - end - # Renders the html ``. private fun render_head do var css = (self.shareurl / "css").html_escape @@ -76,23 +70,9 @@ redef class DocPage addn ">" end - # Renders the sidebar template. - # - # Sidebar is automatically populated with a summary of all sections - # TODO remove summary generation when other templates are migrated. - private fun render_sidebar do - if sidebar == null then return - var summary = new TplSummary.with_order(0) - for section in sections do - section.render_summary summary - end - sidebar.boxes.add summary - add sidebar.as(not null) - end - # Renders the footer and content. private fun render_content do - for section in sections do add section + add root if footer != null then addn "" addn "
" + var sidebar = self.sidebar if sidebar != null then addn "
" - render_sidebar + add sidebar addn "
" addn "
" render_content @@ -144,6 +125,16 @@ redef class DocPage addn "
" render_footer end + + # Render table of content for this page. + fun html_toc: UnorderedList do + var lst = new UnorderedList + lst.css_classes.add "nav" + for child in root.children do + child.render_toc_item(lst) + end + return lst + end end # Top menu bar template. @@ -198,16 +189,70 @@ class DocTopMenu end end +# Nitdoc sidebar template. +class DocSideBar + super Template + + # Sidebar contains `DocSideBox`. + var boxes = new Array[DocSideBox] + + redef fun rendering do + if boxes.is_empty then return + addn "" + end +end + +# Something that can be put in a DocSideBar. +class DocSideBox + super Template + + # Box HTML id, used for Bootstrap collapsing feature. + # + # Use `html_title.to_cmangle` by default. + var id: String is lazy do return title.write_to_string.to_cmangle + + # Title of the box to display. + var title: Writable + + # Content to display in the box. + var content: Writable + + # Is the box opened by default? + # + # Otherwise, the user will have to clic on the title to display the content. + # + # Default is `true`. + var is_open = true is writable + + redef fun rendering do + var open = "" + if is_open then open = "in" + addn "
" + addn "
" + add " " + add title + addn " " + addn "
" + addn "
" + add content + addn "
" + addn "
" + end +end + redef class DocComposite super Template # HTML anchor id - var html_id: String is noinit + var html_id: String is writable, lazy do return id # Title to display if any. # # This title can be decorated with HTML. - var html_title: nullable Writable is noinit, writable + var html_title: nullable Writable is writable, lazy do return title # Subtitle to display if any. var html_subtitle: nullable Writable is noinit, writable @@ -215,7 +260,10 @@ redef class DocComposite # Render the element title and subtitle. private fun render_title do if html_title != null then - addn new Header(hlvl, html_title.write_to_string) + var header = new Header(hlvl, html_title.write_to_string) + header.css_classes.add "signature" + if hlvl == 2 then header.css_classes.add "well well-sm" + addn header end if html_subtitle != null then addn "
" @@ -225,7 +273,9 @@ redef class DocComposite end # Render the element body. - private fun render_body do end + private fun render_body do + for child in children do addn child.write_to_string + end redef fun rendering do if is_hidden then return @@ -234,15 +284,47 @@ redef class DocComposite end # Level for HTML heading. - private fun hlvl: Int do - if parent == null then return 1 - return parent.hlvl + 1 + private fun hlvl: Int do return depth + + # A short, undecorated title that goes in the table of contents. + # + # By default, returns `html_title.to_s`, subclasses should redefine it. + var html_toc_title: nullable String is lazy, writable do + if html_title == null then return toc_title + return html_title.write_to_string + end + + # Render this element in a table of contents. + private fun render_toc_item(lst: UnorderedList) do + if is_toc_hidden or html_toc_title == null then return + + var content = new Template + content.add new Link("#{html_id}", html_toc_title.to_s) + if not children.is_empty then + var sublst = new UnorderedList + sublst.css_classes.add "nav" + for child in children do + child.render_toc_item(sublst) + end + content.add sublst + end + lst.add_li new ListItem(content) end - # Is `self` not displayed in the page. + # ID used in HTML tab labels. # - # By default, empty elements are hidden. - fun is_hidden: Bool do return is_empty + # We sanitize it for Boostrap JS panels that do not like ":" and "." in ids. + var html_tab_id: String is lazy do + var id = html_id.replace(":", "") + id = id.replace(".", "") + return "{id}-tab" + end +end + +redef class DocRoot + redef fun rendering do + for child in children do addn child.write_to_string + end end redef class DocSection @@ -253,36 +335,237 @@ redef class DocSection addn "" return end + addn "" + render_title render_body + addn "" end end redef class DocArticle super BSComponent - # Never displays the title for article. + redef fun rendering do + if is_hidden then return + addn "" + render_title + render_body + addn "" + end +end + +redef class TabbedGroup + redef fun render_body do + var tabs = new DocTabs("{html_id}.tabs", "") + for child in children do + if child.is_hidden then continue + var title = child.html_toc_title or else child.toc_title or else "" + tabs.add_panel new DocTabPanel(child.html_tab_id, title, child) + end + addn tabs + end +end + +redef class PanelGroup + redef var html_title = null + redef var toc_title is lazy do return title or else "" + redef var is_toc_hidden = true +end + +redef class HomeArticle + redef var html_title = "Overview" + + # HTML content to display on the home page. # - # This is to maintain compatibility with old components, this may change - # without notice in further version. - redef fun render_title do end + # This attribute is set by the `doc_render` phase who knows the context. + var content: nullable String is noinit, writable + + redef fun render_body do + var content = self.content + if content != null then add content + super + end +end + +redef class IndexArticle + redef var html_title = "Index" + + redef fun render_body do + addn "
" + addn "
" + render_list("Modules", mmodules) + render_list("Classes", mclasses) + render_list("Properties", mprops) + addn "
" + addn "
" + end + + # Displays a list from the content of `mentities`. + private fun render_list(title: String, mentities: Array[MEntity]) do + if mentities.is_empty then return + addn "
" + addn new Header(3, title) + var lst = new UnorderedList + for mentity in mentities do + if mentity isa MProperty then + var tpl = new Template + tpl.add mentity.intro.html_link + tpl.add " (" + tpl.add mentity.intro.mclassdef.mclass.html_link + tpl.add ")" + lst.add_li new ListItem(tpl) + else + lst.add_li new ListItem(mentity.html_link) + end + end + addn lst + addn "
" + end +end + +redef class MEntityComposite + redef var html_title is lazy do return mentity.nitdoc_name +end + +redef class MEntitySection + redef var html_title is lazy do return mentity.html_name + redef var html_subtitle is lazy do return mentity.html_declaration +end + +redef class ConcernSection + redef var html_title is lazy do return "in {mentity.nitdoc_name}" end redef class IntroArticle - redef var html_id is lazy do return "article_intro_{mentity.nitdoc_id}" - redef var html_title is lazy do return null - redef var is_hidden = false + redef var html_title = null + + # Link to source to display if any. + var html_source_link: nullable Writable is noinit, writable redef fun render_body do + var tabs = new DocTabs("{html_id}.tabs", "") var comment = mentity.html_comment - if comment != null then addn comment - super + if comment != null then + tabs.add_panel new DocTabPanel("{html_tab_id}-comment", "Comment", comment) + end + for child in children do + if child.is_hidden then continue + var title = child.html_toc_title or else child.toc_title or else "" + tabs.add_panel new DocTabPanel(child.html_tab_id, title, child) + end + var lnk = html_source_link + if lnk != null then + tabs.drop_list.items.add new ListItem(lnk) + end + addn tabs end end redef class ConcernsArticle - redef var html_id is lazy do return "article_concerns_{mentity.nitdoc_id}" redef var html_title = "Concerns" - redef fun is_hidden do return concerns.is_empty - redef fun render_body do add concerns.html_list end + +redef class DefinitionListArticle + redef var html_title is lazy do + var title = new Template + title.add mentity.html_icon + title.add mentity.html_link + return title + end + + redef var html_subtitle is lazy do return mentity.html_namespace + redef var html_toc_title is lazy do return mentity.html_name +end + +redef class DefinitionArticle + redef var html_title is lazy do return mentity.html_name + redef var html_subtitle is lazy do return mentity.html_declaration + + # Does `self` display only it's title and no body? + # + # FIXME diff hack + var is_no_body: Bool = false is writable + + # Does `self` display only the short content as definition? + # + # FIXME diff hack + var is_short_comment: Bool = false is writable + + # Link to source to display if any. + var html_source_link: nullable Writable is noinit, writable + + redef fun render_body do + var tabs = new DocTabs("{html_id}.tabs", "") + if not is_no_body then + var comment + if is_short_comment then + comment = mentity.html_short_comment + else + comment = mentity.html_comment + end + if comment != null then + tabs.add_panel new DocTabPanel("{html_tab_id}-comment", "Comment", comment) + end + end + for child in children do + if child.is_hidden then continue + var title = child.html_toc_title or else child.toc_title or else "" + tabs.add_panel new DocTabPanel(child.html_tab_id, title, child) + end + var lnk = html_source_link + if lnk != null then + tabs.drop_list.items.add new ListItem(lnk) + end + addn tabs + end +end + +redef class MEntitiesListArticle + redef fun render_body do + var lst = new UnorderedList + lst.css_classes.add "list-unstyled list-definition" + for mentity in mentities do + lst.add_li mentity.html_list_item + end + add lst + end +end + +redef class DefinitionLinArticle + redef fun render_body do + var lst = new UnorderedList + lst.css_classes.add "list-unstyled list-labeled" + for mentity in mentities do + if not mentity isa MPropDef then continue # TODO handle all mentities + var tpl = new Template + tpl.add mentity.mclassdef.html_namespace + var comment = mentity.mclassdef.html_short_comment + if comment != null then + tpl.add ": " + tpl.add comment + end + var li = new ListItem(tpl) + li.css_classes.add "signature" + lst.add_li li + end + add lst + end +end + +redef class GraphArticle + redef var html_title = null + + # HTML map used to display link. + # + # This attribute is set by the `doc_render` phase who knows the context. + var map: String is noinit, writable + + redef fun render_body do + addn "
" + addn " {title or else ""}" + add map + addn "
" + end +end