Generate a full HTML page for a package

Property definitions

nitc :: nitcatalog $ Catalog :: generate_page
	# Generate a full HTML page for a package
	fun generate_page(mpackage: MPackage): Writable
	do
		var res = new_page("..")
		var name = mpackage.name.html_escape
		res.more_head.add """<title>{{{name}}}</title>"""

		res.add """<div class="content">"""

		var mdoc = mpackage.mdoc_or_fallback
		if mdoc == null then
			res.add """<h1 class="package-name">{{{name}}}</h1>"""
		else
			res.add """
<div style="float: left">
	<h1 class="package-name">{{{name}}}&nbsp;-&nbsp;</h1>
</div>
"""
			res.add mdoc.html_documentation
		end

		res.add "<h2>Content</h2>"
		var ot = new OrderedTree[MConcern]
		for g in mpackage.mgroups do
			var pa = g.parent
			if g.is_interesting then
				ot.add(pa, g)
				pa = g
			end
			for mp in g.mmodules do
				ot.add(pa, mp)
			end
		end
		ot.sort_with(alpha_comparator)
		gen_content_level(ot, ot.roots, res)


		res.add """
</div>
<div class="sidebar">
<ul class="box">
"""
		var tryit = mpackage.metadata.metadata("upstream.tryit")
		if tryit != null then
			var e = tryit.html_escape
			res.add "<li><a href=\"{e}\">Try<span style=\"color:white\">n</span>it!</a></li>\n"
		end
		var apk = mpackage.metadata.metadata("upstream.apk")
		if apk != null then
			var e = apk.html_escape
			res.add "<li><a href=\"{e}\">Android apk</a></li>\n"
		end

		res.add """</ul>\n<ul class="box">\n"""

		var homepage = mpackage.metadata.metadata("upstream.homepage")
		if homepage != null then
			var e = homepage.html_escape
			res.add "<li><a href=\"{e}\">{e}</a></li>\n"
		end
		for maintainer in mpackage.metadata.maintainers do
			res.add "<li>{maintainer.to_html}</li>"
		end
		var license = mpackage.metadata.metadata("package.license")
		if license != null then
			var e = license.html_escape
			res.add "<li><a href=\"http://opensource.org/licenses/{e}\">{e}</a> license</li>\n"
		end
		res.add "</ul>\n"

		res.add "<h3>Source Code</h3>\n<ul class=\"box\">\n"
		var browse = mpackage.metadata.metadata("upstream.browse")
		if browse != null then
			var e = browse.html_escape
			res.add "<li><a href=\"{e}\">{e}</a></li>\n"
		end
		var git = mpackage.metadata.metadata("upstream.git")
		if git != null then
			var e = git.html_escape
			res.add "<li><tt>{e}</tt></li>\n"
		end
		var last_date = mpackage.metadata.last_date
		if last_date != null then
			var e = last_date.html_escape
			res.add "<li>most recent commit: {e}</li>\n"
		end
		var first_date = mpackage.metadata.first_date
		if first_date != null then
			var e = first_date.html_escape
			res.add "<li>oldest commit: {e}</li>\n"
		end
		var commits = commits[mpackage]
		if commits != 0 then
			res.add "<li>{commits} commits</li>\n"
		end
		res.add "</ul>\n"

		res.add "<h3>Quality</h3>\n<ul class=\"box\">\n"
		var errors = errors[mpackage]
		if errors > 0 then
			res.add "<li>{errors} errors</li>\n"
		end
		res.add "<li>{warnings[mpackage]} warnings ({warnings_per_kloc[mpackage]}/kloc)</li>\n"
		res.add "<li>{documentation_score[mpackage]}% documented</li>\n"
		res.add "</ul>\n"

		res.add "<h3>Tags</h3>\n"
		var ts2 = new Array[String]
		for t in mpackage.metadata.tags do
			t = t.html_escape
			ts2.add "<a href=\"../index.html#tag_{t}\">{t}</a>"
		end
		res.add_list(ts2, ", ", ", ")

		if deps.vertices.has(mpackage) then
			var reqs = deps.get_all_successors(mpackage)
			reqs.remove(mpackage)
			alpha_comparator.sort(reqs)
			res.add "<h3>Requirements</h3>\n"
			if reqs.is_empty then
				res.add "none"
			else
				var list = new Array[String]
				for r in reqs do
					var direct = deps.has_arc(mpackage, r)
					var s = "<a href=\"{r}.html\">"
					if direct then s += "<strong>"
					s += r.to_s
					if direct then s += "</strong>"
					s += "</a>"
					list.add s
				end
				res.add_list(list, ", ", " and ")
			end

			reqs = deps.get_all_predecessors(mpackage)
			reqs.remove(mpackage)
			alpha_comparator.sort(reqs)
			res.add "<h3>Clients</h3>\n"
			if reqs.is_empty then
				res.add "none"
			else
				var list = new Array[String]
				for r in reqs do
					var direct = deps.has_arc(r, mpackage)
					var s = "<a href=\"{r}.html\">"
					if direct then s += "<strong>"
					s += r.to_s
					if direct then s += "</strong>"
					s += "</a>"
					list.add s
				end
				res.add_list(list, ", ", " and ")
			end
		end

		var contributors = mpackage.metadata.contributors
		if not contributors.is_empty then
			res.add "<h3>Contributors</h3>\n<ul class=\"box\">"
			for c in contributors do
				res.add "<li>{c.to_html}</li>"
			end
			res.add "</ul>"
		end

		res.add """
<h3>Stats</h3>
<ul class="box">
<li>{{{mmodules[mpackage]}}} modules</li>
<li>{{{mclasses[mpackage]}}} classes</li>
<li>{{{mmethods[mpackage]}}} methods</li>
<li>{{{loc[mpackage]}}} lines of code</li>
</ul>
"""

		res.add """
</div>
"""
		return res
	end
src/nitcatalog.nit:229,2--408,4