# This file is part of NIT ( http://www.nitlanguage.org ). # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # HTML templates used by Nitdoc to generate API documentation # Pages are assembled using `Template` module doc_templates import template # A documentation page class TplPage super Template # Page title in HTML header var title: String writable # Directory where css, js and other assets can be found var shareurl: String writable # Attributes of the body tag element var body_attrs = new Array[TagAttribute] # Top menu template if any var topmenu: TplTopMenu writable # Sidebar template if any var sidebar: nullable TplSidebar writable # Content of the page in form a TplSection var sections = new Array[TplSection] # Footer content if any var footer: nullable Streamable writable # JS scripts to append at the end of the body var scripts = new Array[TplScript] init do end # 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 add "" add "" add " " add " " add " " add " " add " " add " " add " " add " " add " {title}" add "" add "" end # Render the topmenu template private fun render_topmenu do add "
" add topmenu add "
" 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 add "" end end # Render JS scripts private fun render_footer do add "" add "" add "" add """" add "" add "" end # Render the whole page redef fun rendering do render_head add "
" render_topmenu add "
" if sidebar != null then add "
" render_sidebar add "
" add "
" render_content add "
" else add "
" render_content add "
" end add "
" add "
" render_footer end end ######################### # general layout elements ######################### # Top menu bar template class TplTopMenu super Template # Brand link to display in first position of the top menu private var brand: nullable Streamable writable # Elements of the topmenu private var elts = new Array[Streamable] init do end # Add a content between `
  • ` tags fun add_item(content: Streamable, is_active: Bool) do var tpl = new Template tpl.add "" tpl.add content tpl.add "
  • " add_raw(tpl) end # Add a raw content to the menu fun add_raw(content: Streamable) do elts.add content end redef fun rendering do if brand == null and elts.is_empty then return add "" end end # A sidebar template class TplSidebar super Template # Sidebar contains sidebar element templates called boxes var boxes = new Array[TplSidebarElt] # Sort boxes by order priority private fun order_boxes do var sorter = new OrderComparator sorter.sort(boxes) end redef fun rendering do if boxes.is_empty then return order_boxes add "" end end # Comparator used to sort boxes by order private class OrderComparator super Comparator[TplSidebarElt] redef fun compare(a, b) do if a.order < b.order then return -1 if a.order > b.order then return 1 return 0 end end # Something that can be put in the sidebar class TplSidebarElt super Template # Order of the box in the sidebar var order: Int = 1 init with_order(order: Int) do self.order = order end # Agenericbox that can be added to sidebar class TplSideBox super TplSidebarElt # Title of the box to display # Title is also a placeholder for the collapse link var title: String # Box HTML id # equals to `title.to_cmangle` by default # Used for collapsing var id: String # Content to display in the box # box will not be rendered if the content is null var content: nullable Streamable writable # Is the box opened by default # otherwise, the user will have to clic on the title to display the content var is_open writable = false init(title: String) do self.title = title self.id = title.to_cmangle end init with_content(title: String, content: Streamable) do init(title) self.content = content end redef fun rendering do if content == null then return var open = "" if is_open then open = "in" add "
    " add "
    " add " " add title add " " add "
    " add "
    " add content.as(not null) add "
    " add "
    " end end # Something that can go on a summary template class TplSummaryElt super Template # Add an element to the summary fun add_child(child: TplSummaryElt) is abstract end # A summary that can go on the sidebar # If the page contains a sidebar, the summary is automatically placed # on top of the sidebarauto-generated # summary contains anchors to all sections displayed in the page class TplSummary super TplSidebarElt super TplSummaryElt # Summary elements to display var children = new Array[TplSummaryElt] redef fun add_child(child) do children.add child redef fun rendering do if children.is_empty then return add "
    " add "
    " add " " add "Summary" add " " add "
    " add "
    " add " " add "
    " add "
    " end end # A summary entry class TplSummaryEntry super TplSummaryElt # Text to display var text: Streamable # Children of this entry # Will be displayed as a tree var children = new Array[TplSummaryElt] init(text: Streamable) do self.text = text redef fun add_child(child) do children.add child redef fun rendering do add "
  • " add text if not children.is_empty then add "" end add "
  • " end end # Something that can go in a section # Sections are automatically collected to populate the menu class TplSectionElt super Template # HTML anchor id var id: String # Title to display if any # if both `title` and `summary_title` are null then # the section will not appear in the summary var title: nullable Streamable writable # Subtitle to display if any var subtitle: nullable Streamable writable # Title that appear in the summary # if null use `title` instead var summary_title: nullable String writable # CSS classes to apply on the section element var css_classes = new Array[String] # CSS classes to apply on the title heading element var title_classes = new Array[String] # Parent article/section if any var parent: nullable TplSectionElt init(id: String) do self.id = id init with_title(id: String, title: Streamable) do init(id) self.title = title end # Level for HTML heading protected fun hlvl: Int do if parent == null then return 1 return parent.hlvl + 1 end # Elements contained by this section var children = new Array[TplSectionElt] # Add an element in this section fun add_child(child: TplSectionElt) do child.parent = self children.add child end # Is the section empty (no content at all) fun is_empty: Bool do return children.is_empty # Render this section in the summary fun render_summary(parent: TplSummaryElt) do if is_empty then return var title = summary_title if title == null and self.title != null then title = self.title.write_to_string if title == null then return var lnk = new TplLink("#{id}", title) var entry = new TplSummaryEntry(lnk) for child in children do child.render_summary(entry) end parent.add_child entry end end # A HTML
    element class TplSection super TplSectionElt redef fun rendering do add "
    " if title != null then var lvl = hlvl if lvl == 2 then title_classes.add "well well-sm" add "" add title.as(not null) add "" end if subtitle != null then add "
    " add subtitle.as(not null) add "
    " end for child in children do add child end add "
    " end end # A page article that can go in a section class TplArticle super TplSectionElt # Content for this article var content: nullable Streamable writable = null var source_link: nullable Streamable writable = null init with_content(id: String, title: Streamable, content: Streamable) do with_title(id, title) self.content = content end redef fun render_summary(parent) do if is_empty then return var title = summary_title if title == null and self.title != null then title = self.title.write_to_string if title == null then return var lnk = new TplLink("#{id}", title) parent.add_child new TplSummaryEntry(lnk) end redef fun rendering do if is_empty then return add "
    " if source_link != null then add "" end if title != null then var lvl = hlvl if lvl == 2 then title_classes.add "well well-sm" add "" add title.as(not null) add "" end if subtitle != null then add "
    " add subtitle.as(not null) add "
    " end if content != null then add content.as(not null) end for child in children do add child end add """
    """ end redef fun is_empty: Bool do return title == null and subtitle == null and content == null end end # A module / class / prop definition class TplDefinition super Template # Comment to display var comment: nullable Streamable writable # Namespace for this definition var namespace: nullable Streamable writable # Location link to display var location: nullable Streamable writable init do end private fun render_info do add "
    " if namespace != null then if comment == null then add "no comment for " end add namespace.as(not null) end if location != null then add " " add location.as(not null) end add "
    " end private fun render_comment do if comment != null then add comment.as(not null) end redef fun rendering do add "
    " render_comment render_info add "
    " end end # Class definition class TplClassDefinition super TplDefinition var intros = new Array[TplListElt] var redefs = new Array[TplListElt] init do end redef fun rendering do add "
    " render_comment render_info render_list("Introduces", intros) render_list("Redefines", redefs) add "
    " end private fun render_list(name: String, elts: Array[TplListElt]) do if elts.is_empty then return add "
    {name}
    " add "
      " for elt in elts do add elt add "
    " end end # Layout for Search page class TplSearchPage super TplSectionElt var modules = new Array[Streamable] var classes = new Array[Streamable] var props = new Array[Streamable] redef fun rendering do if title != null then add "

    {title}

    " add "
    " add "
    " if not modules.is_empty then add "
    " add "

    Modules

    " add "
      " for m in modules do add "
    • " add m add "
    • " end add "
    " add "
    " end if not classes.is_empty then add "
    " add "

    Classes

    " add "
      " for c in classes do add "
    • " add c add "
    • " end add "
    " add "
    " end if not props.is_empty then add "
    " add "

    Properties

    " add "
      " for p in props do add "
    • " add p add "
    • " end add "
    " add "
    " end add "
    " add "
    " end end ##################### # Basiv HTML elements ##################### # A html link class TplLink super Template # Link href var href: String writable # Text to display in the link var text: String writable # Optional title var title: nullable String writable init(href, text: String) do self.href = href self.text = text end init with_title(href, text, title: String) do init(href, text) self.title = title end redef fun rendering do add "" add text add "" end end # A
      list class TplList super TplListElt # Elements contained in this list # can be
    • or
        elements var elts = new Array[TplListElt] # CSS classes of the
          element var css_classes = new Array[String] # Add content wrapped in a
        • element fun add_li(content: Streamable) do elts.add new TplListItem.with_content(content) init do end init with_classes(classes: Array[String]) do self.css_classes = classes fun is_empty: Bool do return elts.is_empty redef fun rendering do if elts.is_empty then return add "
            " for elt in elts do add elt add "
          " end end # Something that can be added to a TplList class TplListElt super Template end # A list item
        • class TplListItem super TplListElt # Content of the list item var content = new Template # CSS classes of the
        • element var css_classes = new Array[String] init do end init with_content(content: Streamable) do append(content) init with_classes(content: Streamable, classes: Array[String]) do with_content(content) css_classes = classes end # Append `content` to the item # similar to `self.content.add` fun append(content: Streamable) do self.content.add content redef fun rendering do add "
        • " add content add "
        • " end end # A label with a text content class TplLabel super Template # Content of the label if any var content: nullable Streamable # CSS classes of the 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 redef fun rendering do add "" if content != null then add content.as(not null) add "" end end # A label with an icon class TplIcon super TplLabel # Bootsrap icon name # see: http://getbootstrap.com/components/#glyphicons var icon: String init with_icon(icon: String) do self.icon = icon redef fun rendering do add "" if content != null then add content.as(not null) add "" end end # A HTML tag attribute # `` class TagAttribute super Template var name: String var value: nullable String init(name: String, value: nullable String) do self.name = name self.value = value end redef fun rendering do if value == null then add(" {name}") else add(" {name}=\"{value}\"") end end end # Javacript template class TplScript super Template var attrs = new Array[TagAttribute] var content: nullable Streamable writable init do attrs.add(new TagAttribute("type", "text/javascript")) end protected fun render_content do if content != null then add content.as(not null) end redef fun rendering do add "" render_content add "" end end # JS script for Piwik Tracker class TplPiwikScript super TplScript var tracker_url: String var site_id: String init(tracker_url, site_id: String) do super self.tracker_url = tracker_url self.site_id = site_id end redef fun render_content do add "" add "var _paq = _paq || [];" add " _paq.push([\"trackPageView\"]);" add " _paq.push([\"enableLinkTracking\"]);" add "(function() \{" add " var u=((\"https:\" == document.location.protocol) ? \"https\" : \"http\") + \"://{tracker_url}\";" add " _paq.push([\"setTrackerUrl\", u+\"piwik.php\"]);" add " _paq.push([\"setSiteId\", \"{site_id}\"]);" add " var d=document, g=d.createElement(\"script\"), s=d.getElementsByTagName(\"script\")[0]; g.type=\"text/javascript\";" add " g.defer=true; g.async=true; g.src=u+\"piwik.js\"; s.parentNode.insertBefore(g,s);" add "\})();" end end