+ redef fun html_info(page) do
+ var res = new Buffer
+ res.append("<div class='info'>")
+ if mproperty.visibility <= none_visibility then
+ res.append("private ")
+ else if mproperty.visibility <= protected_visibility then
+ res.append("protected ")
+ end
+ if mproperty.intro_mclassdef.mclass != page.mclass then res.append("redef ")
+ res.append("fun {mproperty.html_namespace(page.mbuilder)}")
+ res.append("</div>")
+ res.append("<div style=\"float: right;\"><a id=\"lblDiffCommit\"></a></div>")
+ return res.to_s
+ end
+end
+
+redef class MVirtualTypeDef
+ redef fun html_full_desc(page) do
+ var res = new Buffer
+ var mprop = mproperty
+ var is_redef = mprop.intro_mclassdef.mclass != page.mclass
+ var classes = new Array[String]
+ classes.add("type")
+ if is_redef then classes.add("redef")
+ if mprop.visibility == none_visibility then
+ classes.add("private")
+ else if mprop.visibility == protected_visibility then
+ classes.add("protected")
+ else
+ classes.add("public")
+ end
+ res.append("<article class='{classes.join(" ")}' id='{anchor}'>")
+ res.append("<h3 class='signature'>{mprop.name}: {bound.link(page.mbuilder)}</h3>")
+ res.append(html_info(page))
+ res.append("<div class='description'>")
+
+ if page.mbuilder.mpropdef2npropdef.has_key(self) and page.mbuilder.mpropdef2npropdef[self].comment != "" then
+ var nprop = page.mbuilder.mpropdef2npropdef[self]
+ res.append("<pre class=\"text_label\" title=\"\" name=\"\" tag=\"\" type=\"1\">{nprop.comment}</pre>")
+ else
+ res.append("<a class=\"newComment\" title=\"32\" tag=\"\">New Comment</a>")
+ end
+ res.append("<textarea id=\"fileContent\" class=\"edit\" cols=\"76\" rows=\"1\" style=\"display: none;\"></textarea><a id=\"cancelBtn\" style=\"display: none;\">Cancel</a><a id=\"commitBtn\" style=\"display: none;\">Commit</a><pre id=\"preSave\" class=\"text_label\" type=\"2\"></pre>")
+ # definitions block
+ res.append("<p class='info'>")
+ page.nitdoc.mainmodule.linearize_mpropdefs(mprop.mpropdefs)
+ var previous_defs = new Array[MVirtualTypeDef]
+ var next_defs = new Array[MVirtualTypeDef]
+ var self_passed = false
+ for def in mprop.mpropdefs do
+ if def == self then
+ self_passed = true
+ continue
+ end
+ if not self_passed then
+ if not page.mclass.ancestors.has(def.mclassdef.mclass) then continue
+ if def.is_intro then continue
+ previous_defs.add(def)
+ else
+ if not page.mclass.descendants.has(def.mclassdef.mclass) then continue
+ next_defs.add(def)
+ end
+ end
+ res.append("defined by {mclassdef.mmodule.html_full_namespace(page.mbuilder)}")
+ if not is_intro then
+ res.append(", introduced by {mprop.intro.mclassdef.mclass.link(page.mbuilder)}")
+ end
+ if not previous_defs.is_empty then
+ res.append(", inherited from ")
+ for i in [0..previous_defs.length[ do
+ res.append(previous_defs[i].mclassdef.mclass.link(page.mbuilder))
+ if i < previous_defs.length - 1 then res.append(", ")
+ end
+ end
+ if not next_defs.is_empty then
+ res.append(", redefined by ")
+ for i in [0..next_defs.length[ do
+ res.append(next_defs[i].mclassdef.mclass.link(page.mbuilder))
+ if i < next_defs.length - 1 then res.append(", ")
+ end
+ end
+ res.append(".</p>")
+ res.append("</div>")
+ res.append("</article>")
+ return res.to_s
+ end
+
+ redef fun html_info(page) do
+ var res = new Buffer
+ res.append("<div class='info'>")
+ if mproperty.intro_mclassdef.mclass != page.mclass then res.append("redef ")
+ res.append("type {mproperty.html_namespace(page.mbuilder)}")
+ res.append("</div>")
+ res.append("<div style=\"float: right;\"><a id=\"lblDiffCommit\"></a></div>")
+ return res.to_s
+ end
+end
+
+#
+# Nodes redefs
+#
+
+redef class AModule
+ private fun comment: String do
+ var ret = new Buffer
+ if n_moduledecl is null or n_moduledecl.n_doc is null then ret
+ if n_moduledecl.n_doc is null then return ""
+ for t in n_moduledecl.n_doc.n_comment do
+ ret.append(t.text.substring_from(1))
+ end
+ return ret.to_s.html_escape
+ end
+
+ private fun short_comment: String do
+ var ret = new Buffer
+ if n_moduledecl != null and n_moduledecl.n_doc != null then
+ ret.append(n_moduledecl.n_doc.n_comment.first.text.substring_from(2).replace("\n", ""))
+ end
+ return ret.to_s.html_escape
+ end
+end
+
+redef class AStdClassdef
+ private fun comment: String do
+ var ret = new Buffer
+ if n_doc != null then
+ for t in n_doc.n_comment do ret.append(t.text.substring_from(1))
+ end
+ return ret.to_s.html_escape
+ end
+
+ private fun short_comment: String do
+ var ret = new Buffer
+ if n_doc != null then ret.append(n_doc.n_comment.first.text.substring_from(2).replace("\n", ""))
+ return ret.to_s.html_escape
+ end
+end
+
+redef class APropdef
+ private fun short_comment: String is abstract
+ private fun html_signature(mbuilder: ModelBuilder): String is abstract
+ private fun comment: String is abstract
+end
+
+redef class AAttrPropdef
+ redef fun short_comment do
+ var ret = new Buffer
+ if n_doc != null then ret.append(n_doc.n_comment.first.text.substring_from(2).replace("\n", ""))
+ return ret.to_s.html_escape
+ end
+
+ redef private fun comment: String do
+ var ret = new Buffer
+ if n_doc != null then
+ for t in n_doc.n_comment do ret.append(t.text.substring_from(1))
+ end
+ return ret.to_s.html_escape
+ end
+
+ redef fun html_signature(mbuilder) do
+ if n_type != null then return n_type.mtype.link(mbuilder)
+ return ""
+ end
+end
+
+redef class AMethPropdef
+ redef fun short_comment do
+ var ret = new Buffer
+ if n_doc != null then ret.append(n_doc.n_comment.first.text.substring_from(2).replace("\n", ""))
+ return ret.to_s.html_escape
+ end
+
+ redef private fun comment: String do
+ var ret = new Buffer
+ if n_doc != null then
+ for t in n_doc.n_comment do ret.append(t.text.substring_from(1))
+ end
+ return ret.to_s.html_escape
+ end
+
+ redef fun html_signature(mbuilder) do
+ if n_signature != null then return n_signature.to_html(mbuilder)
+ return ""
+ end
+end
+
+redef class ATypePropdef
+ redef fun short_comment do
+ var ret = new Buffer
+ if n_doc != null then ret.append(n_doc.n_comment.first.text.substring_from(2).replace("\n", ""))
+ return ret.to_s.html_escape
+ end
+
+ redef private fun comment: String do
+ var ret = new Buffer
+ if n_doc != null then
+ for t in n_doc.n_comment do ret.append(t.text.substring_from(1))
+ end
+ return ret.to_s.html_escape
+ end
+
+ redef fun html_signature(mbuilder) do
+ return mpropdef.bound.link(mbuilder)
+ end
+end
+
+redef class ASignature
+ fun to_html(mbuilder: ModelBuilder): String do
+ #TODO closures
+ var res = new Buffer
+ if not n_params.is_empty then
+ res.append("(")
+ for i in [0..n_params.length[ do
+ res.append(n_params[i].to_html(mbuilder))
+ if i < n_params.length - 1 then res.append(", ")