redef fun apply do
init_output_dir
for page in doc.pages do
- page.render(self, doc).write_to_file("{ctx.output_dir.to_s}/{page.page_url}")
+ page.render(self, doc).write_to_file("{ctx.output_dir.to_s}/{page.html_url}")
end
end
shareurl = v.ctx.opt_shareurl.value.as(not null)
end
- # build page
- self.title = tpl_title(v, doc)
- self.url = page_url
+ # init page options
self.shareurl = shareurl
- self.topmenu = tpl_topmenu(v, doc)
- self.add_section tpl_content(v, doc)
self.footer = v.ctx.opt_custom_footer.value
self.body_attrs.add(new TagAttribute("data-bootstrap-share", shareurl))
- self.sidebar = tpl_sidebar(v, doc)
+
+ # build page
+ init_title(v, doc)
+ init_sidebar(v, doc)
+ init_topmenu(v, doc)
+ init_content(v, doc)
# piwik tracking
var tracker_url = v.ctx.opt_piwik_tracker.value
# FIXME diff hack
# all properties below are roughly copied from `doc_pages`
- # URL to this page.
- fun page_url: String is abstract
-
- # Build page sidebar if any
- fun tpl_sidebar(v: RenderHTMLPhase, doc: DocModel): nullable TplSidebar do return null
-
# Build page title string
- fun tpl_title(v: RenderHTMLPhase, doc: DocModel): String do
- if v.ctx.opt_custom_title.value != null then
- return v.ctx.opt_custom_title.value.to_s
- end
- return "Nitdoc"
- end
+ fun init_title(v: RenderHTMLPhase, doc: DocModel) is abstract
- # Build top menu template
- fun tpl_topmenu(v: RenderHTMLPhase, doc: DocModel): TplTopMenu do
- var topmenu = new TplTopMenu(page_url)
+ # Build top menu template if any.
+ fun init_topmenu(v: RenderHTMLPhase, doc: DocModel) do
+ topmenu = new TplTopMenu(html_url)
var brand = v.ctx.opt_custom_brand.value
if brand != null then
var tpl = new Template
end
topmenu.add_link new TplLink("index.html", "Overview")
topmenu.add_link new TplLink("search.html", "Index")
- return topmenu
end
- # Build page content template
- fun tpl_content(v: RenderHTMLPhase, doc: DocModel): TplSection is abstract
+ # Build page sidebar if any.
+ fun init_sidebar(v: RenderHTMLPhase, doc: DocModel) do
+ sidebar = new TplSidebar
+ end
+
+ # Build page content template.
+ fun init_content(v: RenderHTMLPhase, doc: DocModel) do end
end
redef class OverviewPage
- redef fun page_url do return "index.html"
+ redef var html_url = "index.html"
- redef fun tpl_title(v, doc) do
+ redef fun init_title(v, doc) do
+ title = "Overview"
if v.ctx.opt_custom_title.value != null then
- return v.ctx.opt_custom_title.value.to_s
- else
- return "Overview"
+ title = v.ctx.opt_custom_title.value.to_s
end
end
# TODO this should be done in StructurePhase.
- redef fun tpl_content(v, doc) do
+ redef fun init_content(v, doc) do
# intro text
- var section = new TplSection.with_title("overview", tpl_title(v, doc))
+ var section = new TplSection.with_title("overview", title)
var article = new TplArticle("intro")
if v.ctx.opt_custom_intro.value != null then
article.content = v.ctx.opt_custom_intro.value.to_s
ssection.add_child sarticle
end
section.add_child ssection
- return section
+ self.add_section section
end
- redef fun tpl_sidebar(v, doc) do return new TplSidebar
+ redef fun init_sidebar(v, doc) do sidebar = new TplSidebar
end
redef class SearchPage
- redef fun page_url do return "search.html"
- redef fun tpl_title(v, doc) do return "Index"
+ redef var html_url = "search.html"
+ redef fun init_title(v, doc) do title = "Index"
+ redef fun init_sidebar(v, doc) do end
# TODO this should be done in StructurePhase.
- redef fun tpl_content(v, doc) do
+ redef fun init_content(v, doc) do
var tpl = new TplSearchPage("search_all")
var section = new TplSection("search")
# title
tpl.props.add m
end
section.add_child tpl
- return section
+ self.add_section section
end
# Extract mmodule list to display (sorted by name)
end
redef class MEntityPage
- redef fun page_url do return mentity.nitdoc_url
- redef fun tpl_title(v, doc) do return mentity.nitdoc_name
- redef fun tpl_content(v, doc) do return root.start_rendering(v, doc, self)
+ redef var html_url is lazy do return mentity.nitdoc_url
+ redef fun init_title(v, doc) do title = mentity.nitdoc_name
+ redef fun init_content(v, doc) do add_section root.start_rendering(v, doc, self)
end
# FIXME all clases below are roughly copied from `doc_pages` and adapted to new
# `doc_templates` module.
redef class MGroupPage
- redef fun tpl_topmenu(v, doc) do
- var topmenu = super
+ redef fun init_topmenu(v, doc) do
+ super
var mproject = mentity.mproject
if not mentity.is_root then
topmenu.add_link new TplLink(mproject.nitdoc_url, mproject.nitdoc_name)
end
- topmenu.add_link new TplLink(page_url, mproject.nitdoc_name)
- return topmenu
+ topmenu.add_link new TplLink(html_url, mproject.nitdoc_name)
end
- redef fun tpl_sidebar(v, doc) do
- var sidebar = new TplSidebar
+ redef fun init_sidebar(v, doc) do
+ super
var mclasses = new HashSet[MClass]
mclasses.add_all intros
mclasses.add_all redefs
- if mclasses.is_empty then return sidebar
+ if mclasses.is_empty then return
var list = new TplList.with_classes(["list-unstyled", "list-labeled"])
var sorted = mclasses.to_a
list.add_li tpl_sidebar_item(mclass)
end
sidebar.boxes.add new TplSideBox.with_content("All classes", list)
- return sidebar
end
private fun tpl_sidebar_item(def: MClass): TplListItem do
end
redef class MModulePage
- redef fun tpl_topmenu(v, doc) do
- var topmenu = super
+ redef fun init_topmenu(v, doc) do
+ super
var mproject = mentity.mproject
topmenu.add_link new TplLink(mproject.nitdoc_url, mproject.nitdoc_name)
topmenu.add_link new TplLink(mentity.nitdoc_url, mentity.nitdoc_name)
- return topmenu
end
# Class list to display in sidebar
- redef fun tpl_sidebar(v, doc) do
+ redef fun init_sidebar(v, doc) do
# TODO filter here?
- var sidebar = new TplSidebar
+ super
var mclasses = new HashSet[MClass]
mclasses.add_all mentity.filter_intro_mclasses(v.ctx.min_visibility)
mclasses.add_all mentity.filter_redef_mclasses(v.ctx.min_visibility)
- if mclasses.is_empty then return sidebar
+ if mclasses.is_empty then return
var list = new TplList.with_classes(["list-unstyled", "list-labeled"])
var sorted = mclasses.to_a
list.add_li tpl_sidebar_item(mclass)
end
sidebar.boxes.add new TplSideBox.with_content("All classes", list)
- return sidebar
end
private fun tpl_sidebar_item(def: MClass): TplListItem do
redef class MClassPage
- redef fun tpl_title(v, doc) do
- return "{mentity.nitdoc_name}{mentity.tpl_signature.write_to_string}"
+ redef fun init_title(v, doc) do
+ title = "{mentity.nitdoc_name}{mentity.tpl_signature.write_to_string}"
end
- redef fun tpl_topmenu(v, doc) do
- var topmenu = super
+ redef fun init_topmenu(v, doc) do
+ super
var mproject = mentity.intro_mmodule.mgroup.mproject
topmenu.add_link new TplLink("{mproject.nitdoc_url}", "{mproject.nitdoc_name}")
- topmenu.add_link new TplLink(page_url, mentity.nitdoc_name)
- return topmenu
+ topmenu.add_link new TplLink(html_url, mentity.nitdoc_name)
end
- redef fun tpl_sidebar(v, doc) do
- var sidebar = new TplSidebar
+ redef fun init_sidebar(v, doc) do
+ super
var by_kind = new PropertiesByKind.with_elements(mclass_inherited_mprops(v, doc))
var summary = new TplList.with_classes(["list-unstyled"])
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)
- return sidebar
end
private fun tpl_sidebar_list(mprops: PropertyGroup[MProperty], summary: TplList) do
end
redef class MPropertyPage
- redef fun tpl_topmenu(v, doc) do
- var topmenu = super
+ redef fun init_title(v, doc) do
+ title = "{mentity.nitdoc_name}{mentity.tpl_signature.write_to_string}"
+ end
+
+ redef fun init_topmenu(v, doc) do
+ super
var mmodule = mentity.intro_mclassdef.mmodule
var mproject = mmodule.mgroup.mproject
var mclass = mentity.intro_mclassdef.mclass
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, mentity.nitdoc_name)
- return topmenu
+ topmenu.add_link new TplLink(html_url, mentity.nitdoc_name)
end
-
- redef fun tpl_title(v, doc) do
- return "{mentity.nitdoc_name}{mentity.tpl_signature.write_to_string}"
- end
-
- redef fun tpl_sidebar(v, doc) do return new TplSidebar
end
redef class DocComposite
import template
import json::static
-# A documentation page
-redef class DocPage
- super Template
-
- # Page url
- var url: String is writable, noinit
-
- # Directory where css, js and other assets can be found
- var shareurl: String is writable, noinit
-
- # Attributes of the body tag element
- var body_attrs = new Array[TagAttribute]
-
- # Top menu template if any
- var topmenu: TplTopMenu is writable, noinit
-
- # Sidebar template if any
- var sidebar: nullable TplSidebar = null is writable
-
- # Content of the page in form a TplSection
- var sections = new Array[TplSection]
-
- # Footer content if any
- var footer: nullable Writable = null is writable
-
- # JS scripts to append at the end of the body
- var scripts = new Array[TplScript]
-
- # Add a section to this page
- fun add_section(section: TplSection) do
- sections.add section
- end
-
- # Render the html header
- private fun render_head do
- var css = (self.shareurl / "css").html_escape
- var vendors = (self.shareurl / "vendors").html_escape
-
- addn "<!DOCTYPE html>"
- addn "<head>"
- addn " <meta charset='utf-8'/>"
- addn " <!--link rel='stylesheet' href='{css}/Nitdoc.UI.css' type='text/css'/-->"
- addn " <link rel='stylesheet' href='{vendors}/bootstrap/css/bootstrap.min.css'/>"
- addn " <link rel='stylesheet' href='{css}/nitdoc.bootstrap.css'/>"
- addn " <link rel='stylesheet' href='{css}/nitdoc.css'/>"
- addn " <link rel='stylesheet' href='{css}/Nitdoc.QuickSearch.css'/>"
- addn " <link rel='stylesheet' href='{css}/Nitdoc.ModalBox.css'/>"
- addn " <link rel='stylesheet' href='{css}/Nitdoc.GitHub.css'/>"
- addn " <title>{title.html_escape}</title>"
- addn "</head>"
- add "<body"
- for attr in body_attrs do add attr
- addn ">"
- end
-
- # Render the topmenu template
- private fun render_topmenu do
- addn " <div class='row'>"
- add topmenu
- addn " </div>"
- end
-
- # Render the sidebar
- # Sidebar is automatically populated with a summary of all sections
- 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
- # Render the footer and content
- private fun render_content do
- for section in sections do add section
- if footer != null then
- addn "<div class='well footer'>"
- add footer.as(not null)
- addn "</div>"
- end
- end
-
- # Render JS scripts
- private fun render_footer do
- var vendors = (self.shareurl / "vendors").html_escape
- var js = (self.shareurl / "js").html_escape
-
- addn "<script src='{vendors}/jquery/jquery-1.11.1.min.js'></script>"
- addn "<script src='{vendors}/jquery/jquery-ui-1.10.4.custom.min.js'></script>"
- addn "<script src='{vendors}/bootstrap/js/bootstrap.min.js'></script>"
- addn "<script data-main='{js}/nitdoc' src='{js}/lib/require.js'></script>"
- for script in scripts do add script
- addn """<script>
- $(function () {
- $("[data-toggle='tooltip']").tooltip();
- $("[data-toggle='popover']").popover();
- });
- </script>"""
- addn "</body>"
- addn "</html>"
- end
-
- # Render the whole page
- redef fun rendering do
- render_head
- addn "<div class='container-fluid'>"
- render_topmenu
- addn " <div class='row' id='content'>"
- if sidebar != null then
- addn "<div class='col col-xs-3 col-lg-2'>"
- render_sidebar
- addn "</div>"
- addn "<div class='col col-xs-9 col-lg-10' data-spy='scroll' data-target='.summary'>"
- render_content
- addn "</div>"
- else
- addn "<div class='col col-xs-12'>"
- render_content
- addn "</div>"
- end
- addn " </div>"
- addn "</div>"
- render_footer
- end
-end
-
#########################
# general layout elements
#########################
module html_templates
import html_model
+
+# Renders the page as HTML.
+redef class DocPage
+ super Template
+
+ # Page url.
+ var html_url: String is writable, noinit
+
+ # Directory where css, js and other assets can be found.
+ var shareurl: String is writable, noinit
+
+ # Attributes of the body tag element.
+ var body_attrs = new Array[TagAttribute]
+
+ # Top menu template if any.
+ var topmenu: TplTopMenu 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]
+
+ # Footer content if any.
+ var footer: nullable Writable = null is writable
+
+ # 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 `<head>`.
+ private fun render_head do
+ var css = (self.shareurl / "css").html_escape
+ var vendors = (self.shareurl / "vendors").html_escape
+
+ addn "<!DOCTYPE html>"
+ addn "<head>"
+ addn " <meta charset='utf-8'/>"
+ addn " <!--link rel='stylesheet' href='{css}/Nitdoc.UI.css' type='text/css'/-->"
+ addn " <link rel='stylesheet' href='{vendors}/bootstrap/css/bootstrap.min.css'/>"
+ addn " <link rel='stylesheet' href='{css}/nitdoc.bootstrap.css'/>"
+ addn " <link rel='stylesheet' href='{css}/nitdoc.css'/>"
+ addn " <link rel='stylesheet' href='{css}/Nitdoc.QuickSearch.css'/>"
+ addn " <link rel='stylesheet' href='{css}/Nitdoc.ModalBox.css'/>"
+ addn " <link rel='stylesheet' href='{css}/Nitdoc.GitHub.css'/>"
+ addn " <title>{title.html_escape}</title>"
+ addn "</head>"
+ add "<body"
+ for attr in body_attrs do add attr
+ addn ">"
+ end
+
+ # Renders the topmenu template.
+ private fun render_topmenu do
+ addn " <div class='row'>"
+ add topmenu
+ addn " </div>"
+ 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
+ if footer != null then
+ addn "<div class='well footer'>"
+ add footer.as(not null)
+ addn "</div>"
+ end
+ end
+
+ # Render JS scripts
+ private fun render_footer do
+ var vendors = (self.shareurl / "vendors").html_escape
+ var js = (self.shareurl / "js").html_escape
+
+ addn "<script src='{vendors}/jquery/jquery-1.11.1.min.js'></script>"
+ addn "<script src='{vendors}/jquery/jquery-ui-1.10.4.custom.min.js'></script>"
+ addn "<script src='{vendors}/bootstrap/js/bootstrap.min.js'></script>"
+ addn "<script data-main='{js}/nitdoc' src='{js}/lib/require.js'></script>"
+ for script in scripts do add script
+ addn """<script>
+ $(function () {
+ $("[data-toggle='tooltip']").tooltip();
+ $("[data-toggle='popover']").popover();
+ });
+ </script>"""
+ addn "</body>"
+ addn "</html>"
+ end
+
+ # Render the whole page
+ redef fun rendering do
+ render_head
+ addn "<div class='container-fluid'>"
+ render_topmenu
+ addn " <div class='row' id='content'>"
+ if sidebar != null then
+ addn "<div class='col col-xs-3 col-lg-2'>"
+ render_sidebar
+ addn "</div>"
+ addn "<div class='col col-xs-9 col-lg-10' data-spy='scroll' data-target='.summary'>"
+ render_content
+ addn "</div>"
+ else
+ addn "<div class='col col-xs-12'>"
+ render_content
+ addn "</div>"
+ end
+ addn " </div>"
+ addn "</div>"
+ render_footer
+ end
+end