X-Git-Url: http://nitlanguage.org diff --git a/contrib/nitiwiki/src/wiki_links.nit b/contrib/nitiwiki/src/wiki_links.nit index 6af6d48..33dc61f 100644 --- a/contrib/nitiwiki/src/wiki_links.nit +++ b/contrib/nitiwiki/src/wiki_links.nit @@ -17,6 +17,7 @@ module wiki_links import wiki_base import markdown::wikilinks +import ordered_tree redef class Nitiwiki # Looks up a WikiEntry by its `name`. @@ -30,7 +31,7 @@ redef class Nitiwiki # Returns `null` if no article can be found. fun lookup_entry_by_name(context: WikiEntry, name: String): nullable WikiEntry do var section: nullable WikiEntry = context.parent or else context - var res = section.lookup_entry_by_name(name) + var res = section.as(not null).lookup_entry_by_name(name) if res != null then return res while section != null do if section.name == name then return section @@ -51,7 +52,7 @@ redef class Nitiwiki # Returns `null` if no article can be found. fun lookup_entry_by_title(context: WikiEntry, title: String): nullable WikiEntry do var section: nullable WikiEntry = context.parent or else context - var res = section.lookup_entry_by_title(title) + var res = section.as(not null).lookup_entry_by_title(title) if res != null then return res while section != null do if section.title.to_lower == title.to_lower then return section @@ -86,26 +87,50 @@ redef class Nitiwiki end return entry end + + # Trails between pages + # + # Trails are represented as a forest of entries. + # This way it is possible to represent a flat-trail as a visit of a tree. + var trails = new OrderedTree[WikiEntry] end redef class WikiEntry - # Absolute url to `self` once generated. - # If you use this, the generated files will hard-code `root_url` - fun url: String do return wiki.config.root_url / href - # Relative path to `self` from the target root_url fun href: String do return breadcrumbs.join("/") + # Relative path to the directory `self` from the target root_url + fun dir_href: String do return href.dirname + + # Relative path to the root url from `self` + fun root_href: String do + var root_dir = dir_href.relpath("") + # Avoid issues if used as a macro just followed by a `/` (as with url prefix) + if root_dir == "" then root_dir = "." + return root_dir + end + # A relative `href` to `self` from the page `context`. # # Should be used to navigate between documents. fun href_from(context: WikiEntry): String do - var res = context.href.dirname.relpath(href) + var res = context.dir_href.relpath(href) return res end + # A relative hyperlink to `self` from the page `context`. + # + # If `text` is not given, `title` will be used instead. + fun a_from(context: WikiEntry, text: nullable Text): Writable + do + var title = title.html_escape + if text == null then text = title else text = text.html_escape + var href = href_from(context) + return """{{{text}}}""" + end + redef fun render do super if not is_dirty and not wiki.force_render then return @@ -160,6 +185,8 @@ redef class WikiSection end return new WikiSectionIndex(wiki, "index", self) end + + redef fun dir_href do return href end redef class WikiArticle @@ -173,6 +200,7 @@ redef class WikiArticle fun is_index: Bool do return name == "index" redef fun href do + var parent = self.parent if parent == null then return "{name}.html" else @@ -184,7 +212,7 @@ redef class WikiArticle super if not is_dirty and not wiki.force_render or not has_source then return content = md_proc.process(md.as(not null)) - headlines.recover_with(md_proc.emitter.decorator.headlines) + headlines.add_all(md_proc.emitter.decorator.headlines) end end @@ -198,6 +226,8 @@ class WikiSectionIndex redef fun title do return section.title redef fun href do return section.href + + redef fun dir_href do return section.dir_href end # A MarkdownProcessor able to parse wiki links. @@ -218,7 +248,8 @@ class NitiwikiMdProcessor end end -private class NitiwikiDecorator +# The decorator associated to `MarkdownProcessor`. +class NitiwikiDecorator super HTMLDecorator # Wiki used to resolve links. @@ -233,27 +264,42 @@ private class NitiwikiDecorator var anchor: nullable String = null var link = token.link if link == null then return - if link.has("#") then - var parts = link.split_with("#") - link = parts.first - anchor = parts.subarray(1, parts.length - 1).join("#") - end - if link.has("/") then - target = wiki.lookup_entry_by_path(context, link.to_s) - else - target = wiki.lookup_entry_by_name(context, link.to_s) - if target == null then - target = wiki.lookup_entry_by_title(context, link.to_s) - end - end - v.add " 1 then + command = command_split[0].trim + link = command_split[1].trim + end + + if link.has("#") then + var parts = link.split_with("#") + link = parts.first + anchor = parts.subarray(1, parts.length - 1).join("#") + end + if link.has("/") then + target = wiki.lookup_entry_by_path(context, link.to_s) + else + target = wiki.lookup_entry_by_name(context, link.to_s) + if target == null then + target = wiki.lookup_entry_by_title(context, link.to_s) + end + end + if target != null then + if name == null then name = target.title + link = target.href_from(context) + + if command == "trail" then + if target isa WikiSection then target = target.index + wiki.trails.add(context, target) + end + else + wiki.message("Warning: unknown wikilink `{link}` (in {context.src_path.as(not null)})", 0) + v.add "class=\"broken\" " + end end v.add "href=\"" append_value(v, link)