online_ide: update to the new API of the loader
[nit.git] / src / nitcatalog.nit
index ba0cb1c..21847ee 100644 (file)
@@ -86,6 +86,12 @@ class CatalogPage
        # Placeholder to include additional things before the `</head>`.
        var more_head = new Template
 
+       # Relative path to the root directory (with the index file).
+       #
+       # Use "" for pages in the root directory
+       # Use ".." for pages in a subdirectory
+       var rootpath: String
+
        redef init
        do
                add """
@@ -94,7 +100,7 @@ class CatalogPage
 <head>
        <meta charset="utf-8">
        <link rel="stylesheet" media="all" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
-       <link rel="stylesheet" media="all" href="style.css">
+       <link rel="stylesheet" media="all" href="{{{rootpath / "style.css"}}}">
 """
                add more_head
 
@@ -116,7 +122,7 @@ class CatalogPage
     </div>
     <div class='collapse navbar-collapse' id='topmenu-collapse'>
      <ul class='nav navbar-nav'>
-      <li><a href="index.html">Catalog</a></li>
+      <li><a href="{{{rootpath / "index.html"}}}">Catalog</a></li>
      </ul>
     </div>
    </div>
@@ -239,7 +245,7 @@ class Catalog
        end
 
        # Recursively generate a level in the file tree of the *content* section
-       private fun gen_content_level(ot: OrderedTree[Object], os: Array[Object], res: Template)
+       private fun gen_content_level(ot: OrderedTree[MConcern], os: Array[Object], res: Template)
        do
                res.add "<ul>\n"
                for o in os do
@@ -249,13 +255,10 @@ class Catalog
                                var mdoc = o.mdoc
                                if mdoc != null then d = ": {mdoc.html_synopsis.write_to_string}"
                                res.add "<strong>{o.name}</strong>{d} ({o.filepath.to_s})"
-                       else if o isa ModulePath then
+                       else if o isa MModule then
                                var d = ""
-                               var m = o.mmodule
-                               if m != null then
-                                       var mdoc = m.mdoc
-                                       if mdoc != null then d = ": {mdoc.html_synopsis.write_to_string}"
-                               end
+                               var mdoc = o.mdoc
+                               if mdoc != null then d = ": {mdoc.html_synopsis.write_to_string}"
                                res.add "<strong>{o.name}</strong>{d} ({o.filepath.to_s})"
                        else
                                abort
@@ -270,7 +273,7 @@ class Catalog
        # Compute information and generate a full HTML page for a package
        fun package_page(mpackage: MPackage): Writable
        do
-               var res = new CatalogPage
+               var res = new CatalogPage("..")
                var score = score[mpackage].to_f
                var name = mpackage.name.html_escape
                res.more_head.add """<title>{{{name}}}</title>"""
@@ -287,14 +290,14 @@ class Catalog
                end
 
                res.add "<h2>Content</h2>"
-               var ot = new OrderedTree[Object]
+               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.module_paths do
+                       for mp in g.mmodules do
                                ot.add(pa, mp)
                        end
                end
@@ -307,6 +310,21 @@ class Catalog
 <div class="sidebar">
 <ul class="box">
 """
+               var tryit = mpackage.metadata("upstream.tryit")
+               if tryit != null then
+                       score += 1.0
+                       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("upstream.apk")
+               if apk != null then
+                       score += 1.0
+                       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("upstream.homepage")
                if homepage != null then
                        score += 5.0
@@ -359,28 +377,27 @@ class Catalog
 
                res.add "<h3>Tags</h3>\n"
                var tags = mpackage.metadata("package.tags")
-               var ts2 = new Array[String]
-               var cat = null
+               var ts = new Array[String]
                if tags != null then
-                       var ts = tags.split(",")
-                       for t in ts do
+                       for t in tags.split(",") do
                                t = t.trim
                                if t == "" then continue
-                               if cat == null then cat = t
-                               tag2proj[t].add mpackage
-                               t = t.html_escape
-                               ts2.add "<a href=\"index.html#tag_{t}\">{t}</a>"
+                               ts.add t
                        end
-                       res.add_list(ts2, ", ", ", ")
                end
-               if ts2.is_empty then
-                       var t = "none"
-                       cat = t
+               if ts.is_empty then ts.add "none"
+               if tryit != null then ts.add "tryit"
+               if apk != null then ts.add "apk"
+               var ts2 = new Array[String]
+               for t in ts do
                        tag2proj[t].add mpackage
-                       res.add "<a href=\"index.html#tag_{t}\">{t}</a>"
+                       t = t.html_escape
+                       ts2.add "<a href=\"../index.html#tag_{t}\">{t}</a>"
                end
-               if cat != null then cat2proj[cat].add mpackage
-               score += ts2.length.score
+               res.add_list(ts2, ", ", ", ")
+               var cat = ts.first
+               cat2proj[cat].add mpackage
+               score += ts.length.score
 
                if deps.has(mpackage) then
                        var reqs = deps[mpackage].greaters.to_a
@@ -444,7 +461,7 @@ class Catalog
                var mmethods = 0
                var loc = 0
                for g in mpackage.mgroups do
-                       mmodules += g.module_paths.length
+                       mmodules += g.mmodules.length
                        for m in g.mmodules do
                                var am = modelbuilder.mmodule2node(m)
                                if am != null then
@@ -496,7 +513,7 @@ class Catalog
        fun li_package(p: MPackage): String
        do
                var res = ""
-               var f = "{p.name}.html"
+               var f = "p/{p.name}.html"
                res += "<a href=\"{f}\">{p}</a>"
                var d = p.mdoc_or_fallback
                if d != null then res += " - {d.html_synopsis.write_to_string}"
@@ -614,7 +631,7 @@ class Catalog
                res.add "</tr></thead>"
                for p in mpackages do
                        res.add "<tr>"
-                       res.add "<td><a href=\"{p.name}.html\">{p.name}</a></td>"
+                       res.add "<td><a href=\"p/{p.name}.html\">{p.name}</a></td>"
                        var maint = "?"
                        if p.maintainers.not_empty then maint = p.maintainers.first
                        res.add "<td>{maint}</td>"
@@ -665,9 +682,11 @@ var modelbuilder = new ModelBuilder(model, tc)
 var catalog = new Catalog(modelbuilder)
 
 # Get files or groups
-for a in tc.option_context.rest do
-       modelbuilder.get_mgroup(a)
-       modelbuilder.identify_file(a)
+var args = tc.option_context.rest
+if opt_no_parse.value then
+       modelbuilder.scan_full(args)
+else
+       modelbuilder.parse_full(args)
 end
 
 # Scan packages and compute information
@@ -678,7 +697,6 @@ for p in model.mpackages do
 
        # Load the module to process importation information
        if opt_no_parse.value then continue
-       modelbuilder.parse_group(g)
 
        catalog.deps.add_node(p)
        for gg in p.mgroups do for m in gg.mmodules do
@@ -700,7 +718,7 @@ if not opt_no_model.value then
 end
 
 var out = opt_dir.value or else "catalog.out"
-out.mkdir
+(out/"p").mkdir
 
 # Generate the css (hard coded)
 var css = """
@@ -806,13 +824,13 @@ css.write_to_file(out/"style.css")
 
 for p in model.mpackages do
        # print p
-       var f = "{p.name}.html"
+       var f = "p/{p.name}.html"
        catalog.package_page(p).write_to_file(out/f)
 end
 
 # INDEX
 
-var index = new CatalogPage
+var index = new CatalogPage("")
 index.more_head.add "<title>Packages in Nit</title>"
 
 index.add """
@@ -859,7 +877,7 @@ index.write_to_file(out/"index.html")
 
 # PEOPLE
 
-var page = new CatalogPage
+var page = new CatalogPage("")
 page.more_head.add "<title>People of Nit</title>"
 page.add """<div class="content">\n<h1>People of Nit</h1>\n"""
 page.add "<h2>By Maintainer</h2>\n"
@@ -871,7 +889,7 @@ page.write_to_file(out/"people.html")
 
 # TABLE
 
-page = new CatalogPage
+page = new CatalogPage("")
 page.more_head.add "<title>Projets of Nit</title>"
 page.add """<div class="content">\n<h1>People of Nit</h1>\n"""
 page.add "<h2>Table of Projets</h2>\n"