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 0fd008d..b8727de 100644 --- a/src/doc/html_templates/html_model.nit +++ b/src/doc/html_templates/html_model.nit @@ -20,25 +20,15 @@ import doc_down import html_components import html::bootstrap import ordered_tree +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 # Returns the mentity name without short signature. # - # * MProject: `foo` + # * MPackage: `foo` # * MGroup: `foo` # * MModule: `foo` # * MClass: `Foo[E]` @@ -54,7 +44,7 @@ redef class MEntity 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 @@ -66,7 +56,7 @@ redef class MEntity 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 @@ -76,7 +66,7 @@ redef class MEntity # Returns the complete MEntity declaration decorated with HTML. # - # * MProject: `project foo` + # * MPackage: `package foo` # * MGroup: `group foo` # * MModule: `module foo` # * MClass: `private abstract class Foo[E: Object]` @@ -95,21 +85,68 @@ redef class MEntity # Returns `self` namespace decorated with HTML links. # - # * MProject: `mproject` - # * MGroup: `mproject(::group)` + # * MPackage: `mpackage` + # * MGroup: `mpackage(::group)` # * MModule: `mgroup::mmodule` - # * MClass: `mproject::mclass` + # * 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 return null + return mdoc.html_documentation + end + + # 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 + + # 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 html_icon: BSIcon do + var icon = new BSIcon("tag") + icon.css_classes.add_all(css_classes) + return icon + end + + # 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 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 var html_modifiers = ["project"] + redef var html_modifiers = ["package"] redef fun html_namespace do return html_link + redef var css_classes = ["public"] end redef class MGroup @@ -125,17 +162,19 @@ redef class MGroup # Depends if `self` is root or not. # - # * If root `mproject`. - # * Else `mproject::self`. + # * If root `mpackage`. + # * Else `mpackage::self`. redef fun html_namespace do var tpl = new Template - tpl.add mproject.html_namespace - if mproject.root != self then + tpl.add mpackage.html_namespace + if mpackage.root != self then tpl.add "::" tpl.add html_link end return tpl end + + redef var css_classes = ["public"] end redef class MModule @@ -166,6 +205,8 @@ redef class MModule tpl.add html_link return tpl end + + redef var css_classes = ["public"] end redef class MClass @@ -192,10 +233,10 @@ redef class MClass redef fun html_modifiers do return intro.html_modifiers redef fun html_declaration do return intro.html_declaration - # Returns `mproject::self`. + # Returns `mpackage::self`. redef fun html_namespace do var tpl = new Template - tpl.add intro_mmodule.mgroup.mproject.html_namespace + tpl.add intro_mmodule.mgroup.mpackage.html_namespace tpl.add "::" tpl.add html_link tpl.add "" @@ -207,6 +248,9 @@ redef class MClass # 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 @@ -235,14 +279,17 @@ redef class MClassDef # # For intro: `private abstract class Foo[E: Object]` # For redef: `redef class Foo[E]` - # TODO change the implementation to correspond to the comment. redef fun html_declaration do var tpl = new Template tpl.add "" tpl.add html_modifiers.join(" ") tpl.add " " tpl.add html_link - tpl.add html_signature + if is_intro then + tpl.add html_signature + else + tpl.add html_short_signature + end tpl.add "" return tpl end @@ -287,6 +334,14 @@ redef class MClassDef end return tpl end + + redef fun css_classes do + var set = new HashSet[String] + if is_intro then set.add "intro" + 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 end redef class MProperty @@ -311,6 +366,8 @@ redef class MProperty # Returns `intro.html_signature`. fun html_signature: Template do return intro.html_signature + + redef fun css_classes do return intro.css_classes end redef class MPropDef @@ -338,14 +395,18 @@ redef class MPropDef # # For intro: `private fun foo(e: Object): Bar is abstract` # For redef: `redef fun foo(e) is cached` - # TODO change the implementation to correspond to the comment. redef fun html_declaration do var tpl = new Template tpl.add "" tpl.add html_modifiers.join(" ") tpl.add " " - tpl.add html_link - tpl.add html_signature + 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 @@ -364,6 +425,14 @@ redef class MPropDef # 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.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 @@ -390,22 +459,50 @@ redef class MMethodDef # 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 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 + + redef fun html_declaration do if mproperty.is_init then - res.add "init" - else - res.add "fun" + 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 - return res + return super + end + + redef fun html_short_signature do + if mproperty.is_root_init and new_msignature != null then + return new_msignature.html_short_signature + end + return msignature.html_short_signature end - redef fun html_short_signature do return msignature.html_short_signature - redef fun html_signature do return msignature.html_signature + redef fun html_signature do + if mproperty.is_root_init and new_msignature != null then + return new_msignature.html_signature + end + return msignature.html_signature + end end redef class MVirtualTypeProp @@ -557,6 +654,56 @@ redef class MParameter end end +redef class ConcernsTree + # 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.html_concern_item + lst.add_li li + build_html_list(r, li) + end + return lst + end + + # 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 UnorderedList + lst.css_classes.add "list-unstyled list-definition" + for e2 in subs do + if e2 isa MGroup and e2.is_root then + build_html_list(e2, li) + else + var sli = e2.html_concern_item + lst.add_li sli + build_html_list(e2, sli) + end + end + 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`.