X-Git-Url: http://nitlanguage.org?ds=sidebyside diff --git a/contrib/nitiwiki/src/wiki_html.nit b/contrib/nitiwiki/src/wiki_html.nit index d5ccc7a..15ae4d7 100644 --- a/contrib/nitiwiki/src/wiki_html.nit +++ b/contrib/nitiwiki/src/wiki_html.nit @@ -36,7 +36,7 @@ redef class Nitiwiki var src = expand_path(config.root_dir, config.assets_dir) var out = expand_path(config.root_dir, config.out_dir) if need_render(src, expand_path(out, config.assets_dir)) then - if src.file_exists then sys.system "cp -R {src} {out}" + if src.file_exists then sys.system "cp -R -- {src.escape_to_sh} {out.escape_to_sh}" end end @@ -62,15 +62,16 @@ end redef class WikiEntry # Get a `` template link to `self` - fun tpl_link: Writable do - return "{title}" + fun tpl_link(context: WikiEntry): Writable do + return "{title}" end end redef class WikiSection # Output directory (where to ouput the HTML pages for this section). - redef fun out_path: String do + redef fun out_path do + var parent = self.parent if parent == null then return wiki.config.out_dir else @@ -83,25 +84,28 @@ redef class WikiSection if is_new then out_full_path.mkdir else - sys.system "touch {out_full_path}" + sys.system "touch -- {out_full_path.escape_to_sh}" end if has_source then - wiki.message("Render section {out_path}", 1) + wiki.message("Render section {name} -> {out_path}", 1) copy_files end var index = self.index if index isa WikiSectionIndex then - wiki.message("Render auto-index for section {out_path}", 1) + wiki.message("Render auto-index for section {name} -> {out_path}", 1) index.is_dirty = true add_child index end + # Hack: Force the rendering of `index` first so that trails are collected + # TODO: Add first-pass analysis to collect global information before doing the rendering + index.render super end # Copy attached files from `src_path` to `out_path`. private fun copy_files do assert has_source - var dir = src_full_path.to_s + var dir = src_full_path.as(not null).to_s for name in dir.files do if name == wiki.config_filename then continue if name.has_suffix(".md") then continue @@ -109,11 +113,11 @@ redef class WikiSection var src = wiki.expand_path(dir, name) var out = wiki.expand_path(out_full_path, name) if not wiki.need_render(src, out) then continue - sys.system "cp -R {src} {out_full_path}" + sys.system "cp -R -- {src.escape_to_sh} {out_full_path.escape_to_sh}" end end - redef fun tpl_link do return index.tpl_link + redef fun tpl_link(context) do return index.tpl_link(context) # Render the section hierarchy as a html tree. # @@ -133,15 +137,15 @@ redef class WikiSection # # ~~~ fun tpl_tree(limit: Int): Template do - return tpl_tree_intern(limit, 1) + return tpl_tree_intern(limit, 1, self) end # Build the template tree for this section recursively. - protected fun tpl_tree_intern(limit, count: Int): Template do + protected fun tpl_tree_intern(limit, count: Int, context: WikiEntry): Template do var out = new Template var index = index out.add "
  • " - out.add tpl_link + out.add tpl_link(context) if (limit < 0 or count < limit) and (children.length > 1 or (children.length == 1)) then out.add " " @@ -164,7 +168,8 @@ end redef class WikiArticle - redef fun out_path: String do + redef fun out_path do + var parent = self.parent if parent == null then return wiki.expand_path(wiki.config.out_dir, "{name}.html") else @@ -175,16 +180,25 @@ redef class WikiArticle redef fun render do super if not is_dirty and not wiki.force_render then return - wiki.message("Render article {name}", 2) var file = out_full_path + wiki.message("Render article {name} -> {file}", 1) file.dirname.mkdir tpl_page.write_to_file file end + # Load a template and resolve page-related macros + fun load_template(template_file: String): TemplateString do + var tpl = wiki.load_template(template_file) + if tpl.has_macro("ROOT_URL") then + tpl.replace("ROOT_URL", root_href) + end + return tpl + end + # Replace macros in the template by wiki data. private fun tpl_page: TemplateString do - var tpl = wiki.load_template(template_file) + var tpl = load_template(template_file) if tpl.has_macro("TOP_MENU") then tpl.replace("TOP_MENU", tpl_menu) end @@ -197,6 +211,9 @@ redef class WikiArticle if tpl.has_macro("FOOTER") then tpl.replace("FOOTER", tpl_footer) end + if tpl.has_macro("TRAIL") then + tpl.replace("TRAIL", tpl_trail) + end return tpl end @@ -204,7 +221,7 @@ redef class WikiArticle fun tpl_header: Writable do var file = header_file if not wiki.has_template(file) then return "" - return wiki.load_template(file) + return load_template(file) end # Generate the HTML page for this article. @@ -262,7 +279,7 @@ redef class WikiArticle fun tpl_menu: Writable do var file = menu_file if not wiki.has_template(file) then return "" - var tpl = wiki.load_template(file) + var tpl = load_template(file) if tpl.has_macro("MENUS") then var items = new Template for child in wiki.root_section.children.values do @@ -273,7 +290,7 @@ redef class WikiArticle items.add " class=\"active\"" end items.add ">" - items.add child.tpl_link + items.add child.tpl_link(self) items.add "
  • " end tpl.replace("MENUS", items) @@ -281,11 +298,46 @@ redef class WikiArticle return tpl end + # Generate navigation links for the trail of this article, if any. + # + # A trail is generated if the article include or is included in a trail. + # See `wiki.trails` for details. + fun tpl_trail: Writable do + if not wiki.trails.has(self) then return "" + + # Get the position of `self` in the trail + var flat = wiki.trails.to_a + var pos = flat.index_of(self) + assert pos >= 0 + + var res = new Template + res.add "" + + return res + end + # Generate the HTML footer for this article. fun tpl_footer: Writable do var file = footer_file if not wiki.has_template(file) then return "" - var tpl = wiki.load_template(file) + var tpl = load_template(file) var time = new Tm.gmtime if tpl.has_macro("YEAR") then tpl.replace("YEAR", (time.year + 1900).to_s) @@ -424,7 +476,7 @@ class TplBreadcrumbs else if article.parent == entry and article.is_index then continue add "
  • " - add entry.tpl_link + add entry.tpl_link(article) add "
  • " end end