X-Git-Url: http://nitlanguage.org diff --git a/src/doc/html_templates/html_model.nit b/src/doc/html_templates/html_model.nit index cc81114..b8727de 100644 --- a/src/doc/html_templates/html_model.nit +++ b/src/doc/html_templates/html_model.nit @@ -17,152 +17,136 @@ module html_model import doc_base import doc_down -import doc_templates +import html_components +import html::bootstrap import ordered_tree - -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 +import model::model_collect redef class MEntity - # ID used as a HTML unique ID and in file names. - # - # **Must** match the following (POSIX ERE) regular expression: - # - # ~~~POSIX ERE - # ^[A-Za-z_][A-Za-z0-9._-]*$ - # ~~~ - # - # That way, the ID is always a valid URI component and a valid XML name. - fun nitdoc_id: String is abstract - # URL of this entity’s Nitdoc page. fun nitdoc_url: String is abstract - # A template link to the mentity `nitdoc_id` - fun tpl_anchor: TplLink do - var tpl = new TplLink("#{nitdoc_id}", nitdoc_name) + # Returns the mentity name without short signature. + # + # * MPackage: `foo` + # * MGroup: `foo` + # * MModule: `foo` + # * MClass: `Foo[E]` + # * MClassDef: `Foo[E]` + # * MProperty: `foo(e)` + # * MPropdef: `foo(e)` + var html_name: String is lazy do return name.html_escape + + # Returns a Link to the mentity `html_url`. + # + # Example: `html_short_name + var html_link: Link is lazy do + var tpl = new Link(nitdoc_url, html_name) var mdoc = mdoc_or_fallback if mdoc != null then - tpl.title = mdoc.short_comment + tpl.title = mdoc.synopsis end return tpl end - # A template link to the mentity `nitdoc_url` - fun tpl_link: TplLink do - var tpl = new TplLink(nitdoc_url, nitdoc_name) + # Returns a Link to the mentity `nitdoc_id`. + # + # Example: `html_short_name + fun html_link_to_anchor: Link do + var tpl = new Link("#{nitdoc_id}", html_name) var mdoc = mdoc_or_fallback if mdoc != null then - tpl.title = mdoc.short_comment + tpl.title = mdoc.synopsis end return tpl end - # A template article that briefly describe the entity - fun tpl_short_article: TplArticle do - var tpl = tpl_article - var mdoc = mdoc_or_fallback - if mdoc != null then - tpl.content = mdoc.tpl_short_comment - end - return tpl - end + # Returns the list of keyword used in `self` declaration. + fun html_modifiers: Array[String] is abstract - # A template article that describe the entity - fun tpl_article: TplArticle do - var tpl = new TplArticle.with_title(nitdoc_id, tpl_title) - tpl.title_classes.add "signature" - tpl.subtitle = tpl_namespace - tpl.summary_title = nitdoc_name + # Returns the complete MEntity declaration decorated with HTML. + # + # * MPackage: `package foo` + # * MGroup: `group foo` + # * MModule: `module foo` + # * MClass: `private abstract class Foo[E: Object]` + # * MClassDef: `redef class Foo[E]` + # * MProperty: `private fun foo(e: Object): Int` + # * MPropdef: `redef fun foo(e)` + fun html_declaration: Template do + var tpl = new Template + tpl.add "" + tpl.add html_modifiers.join(" ") + tpl.add " " + tpl.add html_link + tpl.add "" return tpl end - # A template signature that contains modifiers and parameters - fun tpl_declaration: Template is abstract - - # A template namespace - fun tpl_namespace: Template is abstract - - # A template definition of the mentity - # include name, sysnopsys, comment and namespace - fun tpl_definition: TplDefinition is abstract - - # A li element that can go in a list - fun tpl_list_item: TplListItem do - var lnk = new Template - lnk.add new TplLabel.with_classes(tpl_css_classes) - lnk.add tpl_link + # Returns `self` namespace decorated with HTML links. + # + # * MPackage: `mpackage` + # * MGroup: `mpackage(::group)` + # * MModule: `mgroup::mmodule` + # * MClass: `mpackage::mclass` + # * MClassDef: `mmodule::mclassdef` + # * MProperty: `mclass::mprop` + # * MPropdef: `mclassdef:mpropdef` + fun html_namespace: Template is abstract + + # Returns the synopsis and the comment of this MEntity formatted as HTML. + var html_documentation: nullable Writable is lazy do var mdoc = mdoc_or_fallback - if mdoc != null then - lnk.add ": " - lnk.add mdoc.tpl_short_comment - end - return new TplListItem.with_content(lnk) + if mdoc == null then return null + return mdoc.html_documentation end - var tpl_css_classes = new Array[String] + # Returns the synopsis of this MEntity formatted as HTML. + var html_synopsis: nullable Writable is lazy do + var mdoc = mdoc_or_fallback + if mdoc == null then return null + return mdoc.html_synopsis + end - # Box title for this mentity - fun tpl_title: Template do - var title = new Template - title.add tpl_icon - title.add tpl_namespace - return title + # Returns the the comment without the synopsis formatted as HTML. + var html_comment: nullable Writable is lazy do + var mdoc = mdoc_or_fallback + if mdoc == null then return null + return mdoc.html_comment end # Icon that will be displayed before the title - fun tpl_icon: TplIcon do - var icon = new TplIcon.with_icon("tag") - icon.css_classes.add_all(tpl_css_classes) + fun html_icon: BSIcon do + var icon = new BSIcon("tag") + icon.css_classes.add_all(css_classes) return icon end -end -redef class MConcern - # Return a li element for `self` that can be displayed in a concern list - private fun tpl_concern_item: TplListItem do - var lnk = new Template - lnk.add tpl_anchor - var mdoc = mdoc_or_fallback - if mdoc != null then - lnk.add ": " - lnk.add mdoc.tpl_short_comment + # CSS classes used to decorate `self`. + # + # Mainly used for icons. + var css_classes = new Array[String] + + # A li element that can go in a `HTMLList`. + fun html_list_item: ListItem do + var tpl = new Template + tpl.add new DocHTMLLabel.with_classes(css_classes) + tpl.add html_link + var comment = html_synopsis + if comment != null then + tpl.add ": " + tpl.add comment end - return new TplListItem.with_content(lnk) + return new ListItem(tpl) end end -redef class MProject +redef class MPackage redef var nitdoc_id = name.to_cmangle is lazy redef fun nitdoc_url do return root.nitdoc_url - - redef fun tpl_declaration do - var tpl = new Template - tpl.add "project " - tpl.add tpl_link - tpl.add "" - return tpl - end - - redef fun tpl_namespace do return tpl_link - - redef fun tpl_definition do - var tpl = new TplDefinition - var mdoc = mdoc_or_fallback - if mdoc != null then - tpl.comment = mdoc.tpl_comment - end - return tpl - end - - redef fun tpl_css_classes do return ["public"] + redef var html_modifiers = ["package"] + redef fun html_namespace do return html_link + redef var css_classes = ["public"] end redef class MGroup @@ -174,33 +158,23 @@ redef class MGroup end redef fun nitdoc_url do return "group_{nitdoc_id}.html" + redef var html_modifiers = ["group"] - redef fun tpl_namespace do + # Depends if `self` is root or not. + # + # * If root `mpackage`. + # * Else `mpackage::self`. + redef fun html_namespace do var tpl = new Template - tpl.add mproject.tpl_namespace - if mproject.root != self then + tpl.add mpackage.html_namespace + if mpackage.root != self then tpl.add "::" - tpl.add tpl_link + tpl.add html_link end return tpl end - redef fun tpl_declaration do - var tpl = new Template - tpl.add "group " - tpl.add tpl_link - tpl.add "" - return tpl - end - - redef fun tpl_definition do - var tpl = new TplDefinition - var mdoc = mdoc_or_fallback - if mdoc != null then - tpl.comment = mdoc.tpl_comment - end - return tpl - end + redef var css_classes = ["public"] end redef class MModule @@ -216,35 +190,23 @@ redef class MModule end redef fun nitdoc_url do return "module_{nitdoc_id}.html" + redef var html_modifiers = ["module"] - redef fun tpl_declaration do - var tpl = new Template - tpl.add "module " - tpl.add tpl_namespace - tpl.add "" - return tpl - end - - redef fun tpl_namespace do + # Depends if `self` belongs to a MGroup. + # + # * If mgroup `mgroup::self`. + # * Else `self`. + redef fun html_namespace do var tpl = new Template if mgroup != null then - tpl.add mgroup.tpl_namespace + tpl.add mgroup.html_namespace tpl.add "::" end - tpl.add tpl_link + tpl.add html_link return tpl end - redef fun tpl_definition do - var tpl = new TplClassDefinition - var mdoc = mdoc_or_fallback - if mdoc != null then - tpl.comment = mdoc.tpl_comment - end - return tpl - end - - redef fun tpl_css_classes do return ["public"] + redef var css_classes = ["public"] end redef class MClass @@ -252,106 +214,104 @@ redef class MClass redef fun nitdoc_url do return "class_{nitdoc_id}.html" redef fun mdoc_or_fallback do return intro.mdoc - redef fun tpl_declaration do return intro.tpl_declaration - redef fun tpl_definition do return intro.tpl_definition - - redef fun tpl_namespace do - var tpl = new Template - tpl.add intro_mmodule.mgroup.mproject.tpl_namespace - tpl.add "::" - tpl.add tpl_link - tpl.add "" - return tpl - end - - redef fun tpl_title do - var title = new Template - title.add tpl_icon - title.add tpl_link - title.add tpl_signature - return title - end - - redef fun tpl_icon do return intro.tpl_icon - - fun tpl_signature: Template do + # Format: `Foo[E]` + redef var html_name is lazy do var tpl = new Template + tpl.add name.html_escape if arity > 0 then tpl.add "[" var parameter_names = new Array[String] for p in mparameters do - parameter_names.add(p.nitdoc_name) + parameter_names.add(p.html_name) end tpl.add parameter_names.join(", ") tpl.add "]" end - return tpl + return tpl.write_to_string end - redef fun tpl_article do - var tpl = super - tpl.summary_title = "{nitdoc_name}{tpl_signature.write_to_string}" + redef fun html_modifiers do return intro.html_modifiers + redef fun html_declaration do return intro.html_declaration + + # Returns `mpackage::self`. + redef fun html_namespace do + var tpl = new Template + tpl.add intro_mmodule.mgroup.mpackage.html_namespace + tpl.add "::" + tpl.add html_link + tpl.add "" return tpl end - redef fun tpl_css_classes do return intro.tpl_css_classes + # Returns `intro.html_short_signature`. + fun html_short_signature: Template do return intro.html_short_signature + + # Returns `intro.html_signature`. + fun html_signature: Template do return intro.html_signature + + redef fun html_icon do return intro.html_icon + redef fun css_classes do return intro.css_classes end redef class MClassDef redef var nitdoc_id = "{mmodule.nitdoc_id}__{name.to_cmangle}" is lazy redef fun nitdoc_url do return "{mclass.nitdoc_url}#{nitdoc_id}" - redef fun mdoc_or_fallback do return mdoc or else mclass.mdoc_or_fallback - redef fun tpl_namespace do - var tpl = new Template - tpl.add mmodule.tpl_namespace - tpl.add "::" - tpl.add mclass.tpl_link - tpl.add "" - return tpl + # Depends if `self` is an intro or not. + # + # * If intro contains the visibility and kind. + # * If redef contains the `redef` keyword and kind. + redef fun html_modifiers do + var res = new Array[String] + if not is_intro then + res.add "redef" + else + if mclass.visibility != public_visibility then + res.add mclass.visibility.to_s + end + end + res.add mclass.kind.to_s + return res end - redef fun tpl_article do - var tpl = new TplArticle(nitdoc_id) - tpl.summary_title = "in {mmodule.nitdoc_name}" - tpl.title = tpl_declaration - tpl.title_classes.add "signature" - var title = new Template - title.add "in " - title.add mmodule.tpl_namespace - tpl.subtitle = title - var mdoc = mdoc_or_fallback - if mdoc != null then - tpl.content = mdoc.tpl_comment + # Depends if `self` is an intro or not. + # + # For intro: `private abstract class Foo[E: Object]` + # For redef: `redef class Foo[E]` + redef fun html_declaration do + var tpl = new Template + tpl.add "" + tpl.add html_modifiers.join(" ") + tpl.add " " + tpl.add html_link + if is_intro then + tpl.add html_signature + else + tpl.add html_short_signature end + tpl.add "" return tpl end - redef fun tpl_title do - var title = new Template - title.add tpl_icon - title.add tpl_link - title.add tpl_signature - return title - end - - redef fun tpl_declaration do + # Returns `mmodule::self` + redef fun html_namespace do var tpl = new Template - tpl.add tpl_modifiers - tpl.add tpl_link - tpl.add tpl_signature + tpl.add mmodule.html_namespace + tpl.add "::" + tpl.add mclass.html_link + tpl.add "" return tpl end - fun tpl_signature: Template do + # Returns the MClassDef generic signature without static bounds. + fun html_short_signature: Template do var tpl = new Template var mparameters = mclass.mparameters if not mparameters.is_empty then tpl.add "[" for i in [0..mparameters.length[ do - tpl.add "{mparameters[i].nitdoc_name}: " - tpl.add bound_mtype.arguments[i].tpl_signature + tpl.add mparameters[i].html_name if i < mparameters.length - 1 then tpl.add ", " end tpl.add "]" @@ -359,228 +319,267 @@ redef class MClassDef return tpl end - redef fun tpl_definition do - var tpl = new TplClassDefinition - var mdoc = mdoc_or_fallback - if mdoc != null then - tpl.comment = mdoc.tpl_comment + # Returns the MClassDef generic signature with static bounds. + fun html_signature: Template do + var tpl = new Template + var mparameters = mclass.mparameters + if not mparameters.is_empty then + tpl.add "[" + for i in [0..mparameters.length[ do + tpl.add "{mparameters[i].html_name}: " + tpl.add bound_mtype.arguments[i].html_signature + if i < mparameters.length - 1 then tpl.add ", " + end + tpl.add "]" end return tpl end - redef fun tpl_css_classes do + redef fun css_classes do var set = new HashSet[String] if is_intro then set.add "intro" - for m in mclass.intro.modifiers do set.add m.to_cmangle - for m in modifiers do set.add m.to_cmangle + for m in mclass.intro.collect_modifiers do set.add m.to_cmangle + for m in collect_modifiers do set.add m.to_cmangle return set.to_a end - - fun tpl_modifiers: Template do - var tpl = new Template - for modifier in modifiers do - if modifier == "public" then continue - tpl.add "{modifier.html_escape} " - end - return tpl - end end redef class MProperty redef var nitdoc_id = "{intro_mclassdef.mclass.nitdoc_id}__{name.to_cmangle}" is lazy redef fun nitdoc_url do return "property_{nitdoc_id}.html" - redef fun mdoc_or_fallback do return intro.mdoc + redef fun html_modifiers do return intro.html_modifiers + redef fun html_declaration do return intro.html_declaration - redef fun tpl_namespace do + # Returns `mclass::self`. + redef fun html_namespace do var tpl = new Template - tpl.add intro_mclassdef.mclass.tpl_namespace + tpl.add intro_mclassdef.mclass.html_namespace tpl.add "::" - tpl.add intro.tpl_link + tpl.add intro.html_link tpl.add "" return tpl end - redef fun tpl_declaration do return intro.tpl_declaration - - fun tpl_signature: Template do return new Template + # Returns `intro.html_short_signature`. + fun html_short_signature: Template do return intro.html_short_signature - redef fun tpl_title do return intro.tpl_title + # Returns `intro.html_signature`. + fun html_signature: Template do return intro.html_signature - redef fun tpl_icon do return intro.tpl_icon - - redef fun tpl_css_classes do return intro.tpl_css_classes + redef fun css_classes do return intro.css_classes end redef class MPropDef redef var nitdoc_id = "{mclassdef.nitdoc_id}__{name.to_cmangle}" is lazy redef fun nitdoc_url do return "{mproperty.nitdoc_url}#{nitdoc_id}" - redef fun mdoc_or_fallback do return mdoc or else mproperty.mdoc_or_fallback - redef fun tpl_namespace do - var tpl = new Template - tpl.add mclassdef.tpl_namespace - tpl.add "::" - tpl.add tpl_link - return tpl - end - - redef fun tpl_article do - var tpl = new TplArticle(nitdoc_id) - tpl.summary_title = "in {mclassdef.nitdoc_name}" - var title = new Template - title.add "in " - title.add mclassdef.tpl_link - tpl.title = title - tpl.subtitle = tpl_declaration - var mdoc = mdoc_or_fallback - if mdoc != null then - tpl.content = mdoc.tpl_comment + # Depends if `self` is an intro or not. + # + # * If intro contains the visibility and kind. + # * If redef contains the `redef` keyword and kind. + redef fun html_modifiers do + var res = new Array[String] + if not is_intro then + res.add "redef" + else + if mproperty.visibility != public_visibility then + res.add mproperty.visibility.to_s + end end - return tpl + return res end - redef fun tpl_definition do - var tpl = new TplDefinition - var mdoc = mdoc_or_fallback - if mdoc != null then - tpl.comment = mdoc.tpl_comment + # Depends if `self` is an intro or not. + # + # For intro: `private fun foo(e: Object): Bar is abstract` + # For redef: `redef fun foo(e) is cached` + redef fun html_declaration do + var tpl = new Template + tpl.add "" + tpl.add html_modifiers.join(" ") + tpl.add " " + if is_intro then + tpl.add html_link + tpl.add html_signature + else + tpl.add mproperty.intro.html_link + tpl.add html_short_signature end + tpl.add "" return tpl end - redef fun tpl_declaration do + # Returns `mclassdef::self` + redef fun html_namespace do var tpl = new Template - tpl.add tpl_modifiers - tpl.add tpl_link - tpl.add tpl_signature + tpl.add mclassdef.html_namespace + tpl.add "::" + tpl.add html_link return tpl end - redef fun tpl_css_classes do + # Returns the MPropdDef signature without static types. + fun html_short_signature: Template is abstract + + # Returns the MPropDef signature with static types. + fun html_signature: Template is abstract + + redef fun css_classes do var set = new HashSet[String] if is_intro then set.add "intro" - for m in mproperty.intro.modifiers do set.add m.to_cmangle - for m in modifiers do set.add m.to_cmangle + for m in mproperty.intro.collect_modifiers do set.add m.to_cmangle + for m in collect_modifiers do set.add m.to_cmangle return set.to_a end +end + +redef class MAttributeDef + + redef fun html_modifiers do + var res = super + res.add "var" + return res + end - fun tpl_modifiers: Template do + redef fun html_short_signature do return new Template + + redef fun html_signature do var tpl = new Template - for modifier in modifiers do - if modifier == "public" then continue - tpl.add "{modifier.html_escape} " + if static_mtype != null then + tpl.add ": " + tpl.add static_mtype.html_signature end return tpl end +end - fun tpl_signature: Template do return new Template +redef class MMethodDef - redef fun tpl_list_item do - var lnk = new Template - lnk.add new TplLabel.with_classes(tpl_css_classes.to_a) - var anchor = tpl_link - anchor.href = "{mclassdef.mclass.nitdoc_url}#{mproperty.nitdoc_id}" - lnk.add anchor - var mdoc = mdoc_or_fallback - if mdoc != null then - lnk.add ": " - lnk.add mdoc.tpl_short_comment + # FIXME annotation should be handled in their own way + redef fun html_modifiers do + if mproperty.is_init then + var res = new Array[String] + if mproperty.visibility != public_visibility then + res.add mproperty.visibility.to_s + end + return res end - return new TplListItem.with_content(lnk) + var res = super + if is_abstract then + res.add "abstract" + else if is_intern then + res.add "intern" + end + res.add "fun" + return res end - fun tpl_inheritance_item: TplListItem do - var lnk = new Template - lnk.add new TplLabel.with_classes(tpl_css_classes.to_a) - lnk.add mclassdef.mmodule.tpl_namespace - lnk.add "::" - var anchor = mclassdef.tpl_link - anchor.href = "{mclassdef.mclass.nitdoc_url}#{mproperty.nitdoc_id}" - lnk.add anchor - var mdoc = mdoc_or_fallback - if mdoc != null then - lnk.add ": " - lnk.add mdoc.tpl_short_comment + redef fun html_declaration do + if mproperty.is_init then + var tpl = new Template + tpl.add "" + tpl.add html_modifiers.join(" ") + tpl.add " " + tpl.add html_link + tpl.add html_signature + tpl.add "" + return tpl end - var li = new TplListItem.with_content(lnk) - li.css_classes.add "signature" - return li + return super end -end -redef class MAttributeDef - redef fun tpl_signature do - var tpl = new Template - if static_mtype != null then - tpl.add ": " - tpl.add static_mtype.tpl_signature + redef fun html_short_signature do + if mproperty.is_root_init and new_msignature != null then + return new_msignature.html_short_signature end - return tpl + return msignature.html_short_signature end -end -redef class MMethod - redef fun tpl_signature do - var tpl = new Template - var params = new Array[String] - for param in intro.msignature.mparameters do - params.add param.name.html_escape - end - if not params.is_empty then - tpl.add "(" - tpl.add params.join(", ") - tpl.add ")" + redef fun html_signature do + if mproperty.is_root_init and new_msignature != null then + return new_msignature.html_signature end - return tpl + return msignature.html_signature end end -redef class MMethodDef - redef fun tpl_signature do return msignature.tpl_signature -end - redef class MVirtualTypeProp - redef fun tpl_link do return mvirtualtype.tpl_link - redef fun tpl_signature do return tpl_link + redef fun html_link do return mvirtualtype.html_link end redef class MVirtualTypeDef - redef fun tpl_signature do + + redef fun html_modifiers do + var res = super + res.add "type" + return res + end + + redef fun html_short_signature do return new Template + + redef fun html_signature do var tpl = new Template if bound == null then return tpl tpl.add ": " - tpl.add bound.tpl_signature + tpl.add bound.html_signature return tpl end end redef class MType - fun tpl_signature: Template is abstract + # Returns the signature of this type whithout bounds. + fun html_short_signature: Template is abstract + + # Returns the signature of this type. + fun html_signature: Template is abstract end redef class MClassType - redef fun tpl_link do return mclass.tpl_link - redef fun tpl_signature do return tpl_link + redef fun html_link do return mclass.html_link + redef fun html_short_signature do return html_link + redef fun html_signature do return html_link end redef class MNullableType - redef fun tpl_signature do + + redef fun html_short_signature do var tpl = new Template tpl.add "nullable " - tpl.add mtype.tpl_signature + tpl.add mtype.html_short_signature + return tpl + end + + redef fun html_signature do + var tpl = new Template + tpl.add "nullable " + tpl.add mtype.html_signature return tpl end end redef class MGenericType - redef fun tpl_signature do + redef fun html_short_signature do + var lnk = html_link var tpl = new Template - tpl.add tpl_link + tpl.add new Link.with_title(lnk.href, mclass.name.html_escape, lnk.title) tpl.add "[" for i in [0..arguments.length[ do - tpl.add arguments[i].tpl_signature + tpl.add arguments[i].html_short_signature + if i < arguments.length - 1 then tpl.add ", " + end + tpl.add "]" + return tpl + end + + redef fun html_signature do + var lnk = html_link + var tpl = new Template + tpl.add new Link.with_title(lnk.href, mclass.name.html_escape, lnk.title) + tpl.add "[" + for i in [0..arguments.length[ do + tpl.add arguments[i].html_signature if i < arguments.length - 1 then tpl.add ", " end tpl.add "]" @@ -589,94 +588,132 @@ redef class MGenericType end redef class MParameterType - redef fun tpl_link do - return new TplLink.with_title("{mclass.nitdoc_url}#FT_{name.to_cmangle}", name, "formal type") + redef fun html_link do + return new Link.with_title("{mclass.nitdoc_url}#FT_{name.to_cmangle}", name, "formal type") end - redef fun tpl_signature do return tpl_link + + redef fun html_short_signature do return html_link + redef fun html_signature do return html_link end redef class MVirtualType - redef fun tpl_link do return mproperty.intro.tpl_link - redef fun tpl_signature do return tpl_link + redef fun html_link do return mproperty.intro.html_link + redef fun html_signature do return html_link end redef class MSignature - redef fun tpl_signature do + + redef fun html_short_signature do var tpl = new Template if not mparameters.is_empty then tpl.add "(" for i in [0..mparameters.length[ do - tpl.add mparameters[i].tpl_signature + tpl.add mparameters[i].html_short_signature + if i < mparameters.length - 1 then tpl.add ", " + end + tpl.add ")" + end + return tpl + end + + redef fun html_signature do + var tpl = new Template + if not mparameters.is_empty then + tpl.add "(" + for i in [0..mparameters.length[ do + tpl.add mparameters[i].html_signature if i < mparameters.length - 1 then tpl.add ", " end tpl.add ")" end if return_mtype != null then tpl.add ": " - tpl.add return_mtype.tpl_signature + tpl.add return_mtype.html_signature end return tpl end end redef class MParameter - fun tpl_signature: Template do + + # Returns `self` name and ellipsys if any. + fun html_short_signature: Template do + var tpl = new Template + tpl.add name + if is_vararg then tpl.add "..." + return tpl + end + + # Returns `self` name with it's static type and ellipsys if any. + fun html_signature: Template do var tpl = new Template tpl.add "{name}: " - tpl.add mtype.tpl_signature + tpl.add mtype.html_signature if is_vararg then tpl.add "..." return tpl end end redef class ConcernsTree - - private var seen = new HashSet[MConcern] - - redef fun add(p, e) do - if seen.has(e) then return - seen.add e - super(p, e) - end - - fun to_tpl: TplList do - var lst = new TplList.with_classes(["list-unstyled", "list-definition"]) + # Render `self` as a hierarchical UnorderedList. + fun html_list: UnorderedList do + var lst = new UnorderedList + lst.css_classes.add "list-unstyled list-definition" for r in roots do - var li = r.tpl_concern_item + var li = r.html_concern_item lst.add_li li - build_list(r, li) + build_html_list(r, li) end return lst end - private fun build_list(e: MConcern, li: TplListItem) do + # Build the html list recursively. + private fun build_html_list(e: MConcern, li: ListItem) do if not sub.has_key(e) then return var subs = sub[e] - var lst = new TplList.with_classes(["list-unstyled", "list-definition"]) + var lst = new UnorderedList + lst.css_classes.add "list-unstyled list-definition" for e2 in subs do if e2 isa MGroup and e2.is_root then - build_list(e2, li) + build_html_list(e2, li) else - var sli = e2.tpl_concern_item + var sli = e2.html_concern_item lst.add_li sli - build_list(e2, sli) + build_html_list(e2, sli) end end - li.append lst + var text = new Template + text.add li.text + if not lst.is_empty then text.add lst + li.text = text end end +redef class MConcern + # Return a li element for `self` that can be displayed in a concern list + private fun html_concern_item: ListItem do + var lnk = html_link + var tpl = new Template + tpl.add new Link.with_title("#{nitdoc_id}.concern", lnk.text, lnk.title) + var comment = html_synopsis + if comment != null then + tpl.add ": " + tpl.add comment + end + return new ListItem(tpl) + end +end ################################################################################ # Additions to `model_ext`. redef class MRawType - redef fun tpl_signature do + redef fun html_signature do var tpl = new Template for part in parts do if part.target != null then - tpl.add part.target.as(not null).tpl_link + tpl.add part.target.as(not null).html_link else tpl.add part.text.html_escape end @@ -687,22 +724,13 @@ end redef class MInnerClass redef fun nitdoc_url do return inner.nitdoc_url - redef fun tpl_signature do return inner.tpl_signature + redef fun html_signature do return inner.html_signature end redef class MInnerClassDef redef fun nitdoc_url do return inner.nitdoc_url - redef fun tpl_anchor do return inner.tpl_anchor - redef fun tpl_link do return inner.tpl_link - redef fun tpl_signature do return inner.tpl_signature - - redef fun tpl_definition do - var tpl = new TplClassDefinition - var mdoc = mdoc_or_fallback - if mdoc != null then - tpl.comment = mdoc.tpl_comment - end - return tpl - end + redef fun html_link_to_anchor do return inner.html_link_to_anchor + redef fun html_link do return inner.html_link + redef fun html_signature do return inner.html_signature end