src/doc: migrate sidebar to new templates
[nit.git] / src / doc / doc_phases / doc_html.nit
index bde0922..051fdd8 100644 (file)
@@ -170,9 +170,9 @@ redef class DocPage
 
                # build page
                init_title(v, doc)
-               init_sidebar(v, doc)
                init_topmenu(v, doc)
                init_content(v, doc)
+               init_sidebar(v, doc)
 
                # piwik tracking
                var tracker_url = v.ctx.opt_piwik_tracker.value
@@ -211,11 +211,14 @@ redef class DocPage
 
        # Build page sidebar if any.
        fun init_sidebar(v: RenderHTMLPhase, doc: DocModel) do
-               sidebar = new TplSidebar
+               sidebar = new DocSideBar
+               sidebar.boxes.add new DocSideBox("Summary", html_toc)
        end
 
        # Build page content template.
-       fun init_content(v: RenderHTMLPhase, doc: DocModel) do end
+       fun init_content(v: RenderHTMLPhase, doc: DocModel) do
+               root.init_html_render(v, doc, self)
+       end
 end
 
 redef class OverviewPage
@@ -243,20 +246,23 @@ redef class OverviewPage
                sorter.sort mprojects
                var ssection = new TplSection.with_title("projects", "Projects")
                for mproject in mprojects do
-                       var sarticle = mproject.tpl_article
-                       sarticle.subtitle = mproject.tpl_declaration
-                       sarticle.content = mproject.tpl_definition
-                       var mdoc = mproject.mdoc_or_fallback
-                       if mdoc != null then
-                               sarticle.content = mdoc.tpl_short_comment
+                       var sarticle = new TplArticle(mproject.nitdoc_id)
+                       var title = new Template
+                       title.add mproject.html_icon
+                       title.add mproject.html_link
+                       sarticle.title = title
+                       sarticle.title_classes.add "signature"
+                       sarticle.summary_title = mproject.html_name
+                       sarticle.subtitle = mproject.html_declaration
+                       var comment = mproject.html_short_comment
+                       if comment != null then
+                               sarticle.content = comment
                        end
                        ssection.add_child sarticle
                end
                section.add_child ssection
                self.add_section section
        end
-
-       redef fun init_sidebar(v, doc) do sidebar = new TplSidebar
 end
 
 redef class SearchPage
@@ -357,11 +363,12 @@ redef class MGroupPage
                for mclass in sorted do
                        list.add_li tpl_sidebar_item(mclass)
                end
-               sidebar.boxes.add new TplSideBox.with_content("All classes", list)
+               sidebar.boxes.add new DocSideBox("All classes", list)
+               sidebar.boxes.last.is_open = false
        end
 
        private fun tpl_sidebar_item(def: MClass): TplListItem do
-               var classes = def.intro.tpl_css_classes.to_a
+               var classes = def.intro.css_classes
                if intros.has(def) then
                        classes.add "intro"
                else
@@ -398,11 +405,12 @@ redef class MModulePage
                for mclass in sorted do
                        list.add_li tpl_sidebar_item(mclass)
                end
-               sidebar.boxes.add new TplSideBox.with_content("All classes", list)
+               sidebar.boxes.add new DocSideBox("All classes", list)
+               sidebar.boxes.last.is_open = false
        end
 
        private fun tpl_sidebar_item(def: MClass): TplListItem do
-               var classes = def.intro.tpl_css_classes.to_a
+               var classes = def.intro.css_classes
                if def.intro_mmodule == self.mentity then
                        classes.add "intro"
                else
@@ -432,7 +440,8 @@ redef class MClassPage
 
                by_kind.sort_groups(v.name_sorter)
                for g in by_kind.groups do tpl_sidebar_list(g, summary)
-               sidebar.boxes.add new TplSideBox.with_content("All properties", summary)
+               sidebar.boxes.add new DocSideBox("All properties", summary)
+               sidebar.boxes.last.is_open = false
        end
 
        private fun tpl_sidebar_list(mprops: PropertyGroup[MProperty], summary: TplList) do
@@ -447,7 +456,7 @@ redef class MClassPage
        end
 
        private fun tpl_sidebar_item(mprop: MProperty): TplListItem do
-               var classes = mprop.intro.tpl_css_classes.to_a
+               var classes = mprop.intro.css_classes
                if not mprop_is_local(mprop) then
                        classes.add "inherit"
                        var cls_url = mprop.intro.mclassdef.mclass.nitdoc_url
@@ -467,7 +476,7 @@ redef class MClassPage
                end
                var lnk = new Template
                lnk.add new TplLabel.with_classes(classes)
-               lnk.add mprop.tpl_anchor
+               lnk.add mprop.html_link_to_anchor
                return new TplListItem.with_content(lnk)
        end
 
@@ -496,7 +505,7 @@ end
 
 redef class MPropertyPage
        redef fun init_title(v, doc) do
-               title = "{mentity.html_name}{mentity.tpl_signature.write_to_string}"
+               title = "{mentity.html_name}{mentity.html_short_signature.write_to_string}"
        end
 
        redef fun init_topmenu(v, doc) do
@@ -516,6 +525,13 @@ redef class DocComposite
        #
        # FIXME needed to maintain TplSection compatibility.
        fun render(v: RenderHTMLPhase, doc: DocModel, page: MEntityPage, parent: TplSectionElt) is abstract
+
+       # Prepares the HTML rendering for this element.
+       #
+       # This visit is mainly used to set template attributes before rendering.
+       fun init_html_render(v: RenderHTMLPhase, doc: DocModel, page: DocPage) do
+               for child in children do child.init_html_render(v, doc, page)
+       end
 end
 
 redef class DocRoot
@@ -527,14 +543,14 @@ redef class DocRoot
                var section = new TplSection("top")
                var mentity = page.mentity
                section.title = mentity.html_name
-               section.subtitle = mentity.tpl_declaration
+               section.subtitle = mentity.html_declaration
                # FIXME ugly hack to avoid diff
                if mentity isa MGroup and mentity.is_root then
                        section.title = mentity.mproject.html_name
-                       section.subtitle = mentity.mproject.tpl_declaration
+                       section.subtitle = mentity.mproject.html_declaration
                else if mentity isa MProperty then
-                       section.title = "{mentity.html_name}{mentity.intro.tpl_signature.write_to_string}"
-                       section.subtitle = mentity.tpl_namespace
+                       section.title = "{mentity.html_name}{mentity.intro.html_signature.write_to_string}"
+                       section.subtitle = mentity.html_namespace
                        section.summary_title = mentity.html_name
                end
                render(v, doc, page, section)
@@ -575,14 +591,14 @@ redef class ConcernSection
                        title.add "from "
                        section.summary_title = "from {mmodule.html_name}"
                end
-               title.add mmodule.tpl_namespace
+               title.add mmodule.html_namespace
                section.title = title
        end
 
        private fun render_concern_other(page: MEntityPage, section: TplSection, mmodule: MModule) do
                var title = new Template
                title.add "in "
-               title.add mmodule.tpl_namespace
+               title.add mmodule.html_namespace
                section.title = title
                section.summary_title = "in {mmodule.html_name}"
        end
@@ -605,63 +621,97 @@ redef class IntroArticle
                else if mentity isa MPropDef then
                        article.source_link = v.tpl_showsource(mentity.location)
                end
-               # article.subtitle = mentity.tpl_declaration
-               # FIXME diff hack
-               if mentity isa MProperty then
-                       # intro title
-                       var ns = mentity.intro.mclassdef.mmodule.tpl_namespace
-                       var section = new TplSection("intro")
-                       var title = new Template
-                       title.add "Introduction in "
-                       title.add ns
-                       section.title = title
-                       section.summary_title = "Introduction"
-                       var intro = mentity.intro.tpl_article
-                       intro.source_link = v.tpl_showsource(mentity.intro.location)
-                       section.add_child intro
-                       parent.add_child section
-               else
-                       article.content = mentity.tpl_definition
-                       parent.add_child article
-               end
+               # article.subtitle = mentity.html_declaration
+               article.content = write_to_string
+               parent.add_child article
        end
 end
 
 redef class ConcernsArticle
        redef fun render(v, doc, page, parent) do
-               # FIXME diff hack
-               var title = "concerns"
-               if page.mentity isa MProperty then title = "Concerns"
                parent.add_child new TplArticle.
-                       with_content(title, "Concerns", concerns.to_tpl)
+                       with_content("concerns", "Concerns", write_to_string)
        end
 end
 
 redef class DefinitionArticle
        redef fun render(v, doc, page, parent) do
-               var article: TplArticle
+               var title = new Template
+               title.add mentity.html_icon
+               title.add mentity.html_name
+
+               var article = new TplArticle(mentity.nitdoc_id)
+               article.title = title
+               article.title_classes.add "signature"
+               article.subtitle = mentity.html_declaration
+               article.summary_title = mentity.html_name
+               article.content = write_to_string
+
+               # FIXME less hideous hacks...
                var mentity = self.mentity
-               # FIXME hideous hacks...
                if mentity isa MModule then
-                       article = mentity.tpl_article
-                       article.subtitle = mentity.tpl_declaration
-                       article.content = mentity.tpl_definition
+                       title = new Template
+                       title.add mentity.html_icon
+                       title.add mentity.html_namespace
+                       article.title = title
                else if mentity isa MClass then
-                       article = make_mclass_article(v, page)
+                       title = new Template
+                       title.add mentity.html_icon
+                       title.add mentity.html_link
+                       article.title = title
+                       article.subtitle = mentity.html_namespace
+                       article.content = null
                else if mentity isa MClassDef then
-                       article = make_mclassdef_article(v, page)
+                       title = new Template
+                       title.add "in "
+                       title.add mentity.mmodule.html_namespace
+                       article.title = mentity.html_declaration
+                       article.subtitle = title
                        article.source_link = v.tpl_showsource(mentity.location)
-               else if mentity isa MPropDef and page.mentity isa MClass then
-                       article = make_mpropdef_article(v, doc, page)
-               else
-                       article = mentity.tpl_article
-                       article.subtitle = mentity.tpl_declaration
-                       if mentity isa MPropDef then
-                               article.source_link = v.tpl_showsource(mentity.location)
+                       if mentity.is_intro and mentity.mmodule != page.mentity then
+                               article.content = mentity.html_short_comment
                        end
-                       if not mentity isa MVirtualTypeProp then
-                               # article.content = mentity.tpl_comment
+                       if page isa MModulePage then is_toc_hidden = true
+               else if mentity isa MPropDef then
+                       if page.mentity isa MClass then
+                               title = new Template
+                               title.add mentity.html_icon
+                               title.add mentity.html_declaration
+                               article.title = title
+                               article.subtitle = mentity.html_namespace
+                               # TODO move in its own phase? let's see after doc_template refactoring.
+                               # Add linearization
+                               var all_defs = new HashSet[MPropDef]
+                               for local_def in local_defs(page.as(MClassPage), mentity.mproperty) do
+                                       all_defs.add local_def
+                                       var smpropdef = local_def
+                                       while not smpropdef.is_intro do
+                                               smpropdef = smpropdef.lookup_next_definition(
+                                                       doc.mainmodule, smpropdef.mclassdef.bound_mtype)
+                                               all_defs.add smpropdef
+                                       end
+                               end
+                               var lin = all_defs.to_a
+                               doc.mainmodule.linearize_mpropdefs(lin)
+                               if lin.length > 1 then
+                                       var lin_article = new TplArticle("{mentity.nitdoc_id}.lin")
+                                       lin_article.title = "Inheritance"
+                                       var lst = new UnorderedList
+                                       lst.css_classes.add("list-unstyled list-labeled")
+                                       for smpropdef in lin do
+                                               lst.add_li tpl_inheritance_item(smpropdef)
+                                       end
+                                       lin_article.content = lst
+                                       article.add_child lin_article
+                               end
+                       else
+                               title = new Template
+                               title.add "in "
+                               title.add mentity.mclassdef.html_link
+                               article.title = title
+                               toc_title = "in {mentity.mclassdef.html_name}"
                        end
+                       article.source_link = v.tpl_showsource(mentity.location)
                end
                for child in children do
                        child.render(v, doc, page, article)
@@ -669,81 +719,6 @@ redef class DefinitionArticle
                parent.add_child article
        end
 
-       # FIXME avoid diff while preserving TplArticle compatibility.
-
-       private fun make_mclass_article(v: RenderHTMLPhase, page: MEntityPage): TplArticle do
-               var article = mentity.tpl_article
-               article.subtitle = mentity.tpl_namespace
-               article.content = null
-               return article
-       end
-
-       private fun make_mclassdef_article(v: RenderHTMLPhase, page: MEntityPage): TplArticle do
-               var mclassdef = mentity.as(MClassDef)
-               var article = mentity.tpl_article
-               if mclassdef.is_intro and mclassdef.mmodule != page.mentity then
-                       article = mentity.tpl_short_article
-               end
-               var title = new Template
-               title.add "in "
-               title.add mclassdef.mmodule.tpl_namespace
-               article.subtitle = title
-               return article
-       end
-
-       private fun make_mpropdef_article(v: RenderHTMLPhase, doc: DocModel, page: MEntityPage): TplArticle
-       do
-               var mpropdef = mentity.as(MPropDef)
-               var mprop = mpropdef.mproperty
-               var article = new TplArticle(mprop.nitdoc_id)
-               var title = new Template
-               title.add mprop.tpl_icon
-               title.add "<span id='{mpropdef.nitdoc_id}'></span>"
-               if mpropdef.is_intro then
-                       title.add mprop.html_link
-                       title.add mprop.intro.tpl_signature
-               else
-                       var cls_url = mprop.intro.mclassdef.mclass.nitdoc_url
-                       var def_url = "{cls_url}#{mprop.nitdoc_id}"
-                       var lnk = new TplLink.with_title(def_url, mprop.html_name,
-                                       "Go to introduction")
-                       title.add "redef "
-                       title.add lnk
-               end
-               article.title = title
-               article.title_classes.add "signature"
-               article.summary_title = "{mprop.html_name}"
-               article.subtitle = mpropdef.tpl_namespace
-               if mpropdef.mdoc_or_fallback != null then
-                       article.content = mpropdef.mdoc_or_fallback.tpl_comment
-               end
-               # TODO move in its own phase? let's see after doc_template refactoring.
-               # Add linearization
-               var all_defs = new HashSet[MPropDef]
-               for local_def in local_defs(page.as(MClassPage), mprop) do
-                       all_defs.add local_def
-                       var smpropdef = local_def
-                       while not smpropdef.is_intro do
-                               smpropdef = smpropdef.lookup_next_definition(
-                                       doc.mainmodule, smpropdef.mclassdef.bound_mtype)
-                               all_defs.add smpropdef
-                       end
-               end
-               var lin = all_defs.to_a
-               doc.mainmodule.linearize_mpropdefs(lin)
-               if lin.length > 1 then
-                       var lin_article = new TplArticle("{mpropdef.nitdoc_id}.lin")
-                       lin_article.title = "Inheritance"
-                       var lst = new TplList.with_classes(["list-unstyled", "list-labeled"])
-                       for smpropdef in lin do
-                               lst.add_li smpropdef.tpl_inheritance_item
-                       end
-                       lin_article.content = lst
-                       article.add_child lin_article
-               end
-               return article
-       end
-
        # Filter `page.mpropdefs` for this `mpropertie`.
        #
        # FIXME compatability with current templates.
@@ -756,21 +731,33 @@ redef class DefinitionArticle
                end
                return mpropdefs
        end
+
+       private fun tpl_inheritance_item(mpropdef: MPropDef): ListItem do
+               var lnk = new Template
+               lnk.add new TplLabel.with_classes(css_classes)
+               lnk.add mpropdef.mclassdef.mmodule.html_namespace
+               lnk.add "::"
+               var atext = mpropdef.mclassdef.html_link.text
+               var ahref = "{mpropdef.mclassdef.mclass.nitdoc_url}#{mpropdef.mproperty.nitdoc_id}"
+               var atitle = mpropdef.mclassdef.html_link.title
+               var anchor = new Link.with_title(ahref, atext, atitle)
+               lnk.add anchor
+               var comment = mpropdef.html_short_comment
+               if comment != null then
+                       lnk.add ": "
+                       lnk.add comment
+               end
+               var li = new ListItem(lnk)
+               li.css_classes.add "signature"
+               return li
+       end
 end
 
 redef class IntrosRedefsListArticle
        redef fun render(v, doc, page, parent) do
                if mentities.is_empty then return
-               var title = list_title
-               # FIXME diff hack
-               var id = "intros"
-               if title == "Redefines" then id = "redefs"
-               var article = new TplArticle.with_title("{mentity.nitdoc_id}.{id}", title)
-               var list = new TplList.with_classes(["list-unstyled", "list-labeled"])
-               for mentity in mentities do
-                       list.add_li mentity.tpl_list_item
-               end
-               article.content = list
+               var article = new TplArticle.with_title(list_title.to_lower, list_title)
+               article.content = write_to_string
                parent.add_child article
        end
 end
@@ -801,14 +788,8 @@ end
 redef class HierarchyListArticle
        redef fun render(v, doc, page, parent) do
                if mentities.is_empty then return
-               var title = list_title
-               var id = list_title.to_lower
-               var article = new TplArticle.with_title(id, title)
-               var list = new TplList.with_classes(["list-unstyled", "list-definition"])
-               for mentity in mentities do
-                       list.elts.add mentity.tpl_list_item
-               end
-               article.content = list
+               var article = new TplArticle.with_title(list_title.to_lower, list_title)
+               article.content = write_to_string
                parent.add_child article
        end
 end
@@ -823,22 +804,22 @@ redef class GraphArticle
                file.close
                sys.system("\{ test -f {path_sh}.png && test -f {path_sh}.s.dot && diff -- {path_sh}.dot {path_sh}.s.dot >/dev/null 2>&1 ; \} || \{ cp -- {path_sh}.dot {path_sh}.s.dot && dot -Tpng -o{path_sh}.png -Tcmapx -o{path_sh}.map {path_sh}.s.dot ; \}")
                var fmap = new FileReader.open("{path}.map")
-               var map = fmap.read_all
+               map = fmap.read_all
                fmap.close
 
                var article = new TplArticle("graph")
-               var alt = ""
-               # FIXME diff hack
-               # if title != null then
-                       # article.title = title
-                       # alt = "alt='{title.html_escape}'"
-               # end
                article.css_classes.add "text-center"
-               var content = new Template
-               var name_html = id.html_escape
-               content.add "<img src='{name_html}.png' usemap='#{name_html}' style='margin:auto' {alt}/>"
-               content.add map
-               article.content = content
+               article.content = write_to_string
                parent.add_child article
        end
 end
+
+redef class Location
+       # Github url based on this location
+       fun github(gitdir: String): String do
+               var base_dir = getcwd.join_path(gitdir).simplify_path
+               var file_loc = getcwd.join_path(file.filename).simplify_path
+               var gith_loc = file_loc.substring(base_dir.length + 1, file_loc.length)
+               return "{gith_loc}:{line_start},{column_start}--{line_end},{column_end}"
+       end
+end