# 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 import json::static # A documentation page class TplPage super Template # The unescaped page title to put in the 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 # 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 Streamable = 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 "" addn "" addn " " addn " " addn " " addn " " addn " " addn " " addn " " addn " " addn " {title.html_escape}" addn "" add "" end # Render the topmenu template private fun render_topmenu do addn "
" add topmenu addn "
" 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 "" 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 "" addn "" addn "" addn "" for script in scripts do add script addn """""" addn "" addn "" end # Render the whole page redef fun rendering do render_head addn "
" render_topmenu addn "
" if sidebar != null then addn "
" render_sidebar addn "
" addn "
" render_content addn "
" else addn "
" render_content addn "
" end addn "
" addn "
" 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 = null is writable # Elements of the topmenu private var elts = new Array[Streamable] # The page url where the top menu is displayed. # # Used to select the active link. private var current_url: String # 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 `
  • ` tags fun add_item(content: Streamable, is_active: Bool) do var tpl = new Template tpl.add "" tpl.add content tpl.addn "
  • " 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 addn "" 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 addn "" end end # Comparator used to sort boxes by order private class OrderComparator super Comparator redef type COMPARED: 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 is noinit # Content to display in the box # box will not be rendered if the content is null var content: nullable Streamable = null is writable # Is the box opened by default # otherwise, the user will have to clic on the title to display the content var is_open = false is writable init do 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" addn "
    " addn "
    " add " " add title addn " " addn "
    " addn "
    " add content.as(not null) addn "
    " addn "
    " 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 addn "
    " addn "
    " add " " add "Summary" addn " " addn "
    " addn "
    " addn " " addn "
    " addn "
    " 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] redef fun add_child(child) do children.add child redef fun rendering do add "
  • " add text if not children.is_empty then addn "\n" end addn "
  • " 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 = null is writable # Subtitle to display if any var subtitle: nullable Streamable = null is writable # Title that appear in the summary # if null use `title` instead var summary_title: nullable String = null is 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 = null 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 addn "
    " if title != null then var lvl = hlvl if lvl == 2 then title_classes.add "well well-sm" addn "" addn title.as(not null) addn "" end if subtitle != null then addn "
    " addn subtitle.as(not null) addn "
    " end for child in children do add child end addn "
    " end end # A page article that can go in a section class TplArticle super TplSectionElt # Content for this article var content: nullable Streamable = null is writable var source_link: nullable Streamable = null is writable 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 addn "
    " 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) addn "" end if subtitle != null then add "
    " add subtitle.as(not null) addn "
    " end if content != null then add content.as(not null) end for child in children do add child end addn """
    """ end redef fun is_empty: Bool do return title == null and subtitle == null and content == null and children.is_empty end end # A module / class / prop definition class TplDefinition super Template # Comment to display var comment: nullable Streamable = null is writable # Namespace for this definition var namespace: nullable Streamable = null is writable # Location link to display var location: nullable Streamable = null is writable private fun render_info do addn "
    " 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 addn "
    " end private fun render_comment do if comment != null then add comment.as(not null) end redef fun rendering do addn "
    " render_comment render_info addn "
    " end end # Class definition class TplClassDefinition super TplDefinition var intros = new Array[TplListElt] var redefs = new Array[TplListElt] redef fun rendering do addn "
    " render_comment render_info render_list("Introduces", intros) render_list("Redefines", redefs) addn "
    " end private fun render_list(name: String, elts: Array[TplListElt]) do if elts.is_empty then return addn "
    {name.html_escape}
    " addn "
      " for elt in elts do add elt addn "
    " 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 var title = self.title if title != null then addn "

    {title.to_s.html_escape}

    " addn "
    " addn "
    " if not modules.is_empty then addn "
    " addn "

    Modules

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

    Classes

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

    Properties

    " addn "
      " for p in props do add "
    • " add p addn "
    • " end addn "
    " addn "
    " end addn "
    " addn "
    " end end ##################### # Basiv HTML elements ##################### # A html link class TplLink super Template # Link href var href: String is writable # The raw HTML content to display in the link var text: Streamable is writable # The unescaped optional title. var title: nullable String = null is writable 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(item: TplListItem) do elts.add item 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 addn "
            " for elt in elts do add elt addn "
          " 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 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 addn "
        • " end end # A Bootstrap tab component that contains `TplTabPanel`. class TplTab super Template # Panels contained in the tab. var panels = new Array[TplTabPanel] # Add a new panel. fun add_panel(panel: TplTabPanel) do panels.add panel # CSS classes of the tab component. var css_classes = new Array[String] redef fun rendering do addn "
          " for panel in panels do add panel addn "
          " end end # A panel that goes in a `TplTab`. class TplTabPanel super Template # CSS classes of the pane element. var css_classes = new Array[String] # The panel id. # # Used to show/hide panel. var id: String is noinit # The panel name. # # Displayed in the tab header or in the pointing link. var name: Streamable # Is the panel visible by default? var is_active = false is writable # Body of the panel var content: nullable Streamable = null is writable # Get a link pointing to this panel. fun tpl_link_to: Streamable do var lnk = new Template lnk.add "" lnk.add name lnk.add "" return lnk end redef fun rendering do add "
          " if content != null then add content.as(not null) addn "
          " end end # A label with a text content class TplLabel super Template # Content of the label if any var content: nullable Streamable = null is writable # CSS classes of the element var css_classes = new Array[String] 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 # `` # # ~~~nit # var attr: TagAttribute # # attr = new TagAttribute("foo", null) # assert attr.write_to_string == " foo=\"\"" # # attr = new TagAttribute("foo", "bar<>") # assert attr.write_to_string == " foo=\"bar<>\"" # ~~~ class TagAttribute super Template var name: String var value: nullable String redef fun rendering do var value = self.value if value == null then # SEE: http://www.w3.org/TR/html5/infrastructure.html#boolean-attributes add " {name.html_escape}=\"\"" else add " {name.html_escape}=\"{value.html_escape}\"" end end end # Javacript template class TplScript super Template var attrs = new Array[TagAttribute] var content: nullable Streamable = null is 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 addn "" end end # JS script for Piwik Tracker class TplPiwikScript super TplScript var tracker_url: String var site_id: String redef fun render_content do var site_id = self.site_id.to_json var tracker_url = self.tracker_url.trim if tracker_url.chars.last != '/' then tracker_url += "/" tracker_url = "://{tracker_url}".to_json addn "" addn "var _paq = _paq || [];" addn " _paq.push([\"trackPageView\"]);" addn " _paq.push([\"enableLinkTracking\"]);" addn "(function() \{" addn " var u=((\"https:\" == document.location.protocol) ? \"https\" : \"http\") + {tracker_url};" addn " _paq.push([\"setTrackerUrl\", u+\"piwik.php\"]);" addn " _paq.push([\"setSiteId\", {site_id}]);" addn " var d=document, g=d.createElement(\"script\"), s=d.getElementsByTagName(\"script\")[0]; g.type=\"text/javascript\";" addn " g.defer=true; g.async=true; g.src=u+\"piwik.js\"; s.parentNode.insertBefore(g,s);" addn "\})();" end end