# 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 html_components
import doc_base
import template
import json::static
#########################
# general layout elements
#########################
# 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 Writable = 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: Writable) 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 "
"
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 "
"
addn "
"
addn "
"
for entry in children do add entry
addn "
"
addn "
"
addn "
"
end
end
# A summary entry
class TplSummaryEntry
super TplSummaryElt
# Text to display
var text: Writable
# 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"
for entry in children do add entry
addn "
"
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 Writable = null is writable
# Subtitle to display if any
var subtitle: nullable Writable = 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: Writable) 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 Writable = null is writable
var source_link: nullable Writable = null is writable
init with_content(id: String, title: Writable, content: Writable) 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 ""
add source_link.as(not null)
addn "
"
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 Writable = null is writable
# Namespace for this definition
var namespace: nullable Writable = null is writable
# Location link to display
var location: nullable Writable = null is writable
private fun render_info do
addn ""
if namespace != null then
if comment == null then
add ""
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[Writable]
var classes = new Array[Writable]
var props = new Array[Writable]
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: Writable 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