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..ed895ee 100644 --- a/src/doc/html_templates/html_model.nit +++ b/src/doc/html_templates/html_model.nit @@ -20,19 +20,9 @@ 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 @@ -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 @@ -103,6 +93,52 @@ redef class MEntity # * 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 @@ -110,6 +146,7 @@ redef class MProject redef fun nitdoc_url do return root.nitdoc_url redef var html_modifiers = ["project"] redef fun html_namespace do return html_link + redef var css_classes = ["public"] end redef class MGroup @@ -136,6 +173,8 @@ redef class MGroup 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 @@ -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`.