X-Git-Url: http://nitlanguage.org
diff --git a/contrib/nitiwiki/src/wiki_links.nit b/contrib/nitiwiki/src/wiki_links.nit
index bdc69ac..c1785b2 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`.
@@ -54,9 +55,9 @@ redef class Nitiwiki
var res = section.lookup_entry_by_title(title)
if res != null then return res
while section != null do
- if section.title == title then return section
+ if section.title.to_lower == title.to_lower then return section
for child in section.children.values do
- if child.title == title then return child
+ if child.title.to_lower == title.to_lower then return child
end
section = section.parent
end
@@ -70,7 +71,7 @@ redef class Nitiwiki
#
# Returns `null` if no article can be found.
fun lookup_entry_by_path(context: WikiEntry, path: String): nullable WikiEntry do
- var entry: nullable WikiEntry = context.parent or else context
+ var entry = context.parent or else context
var parts = path.split_with("/")
if path.has_prefix("/") then
entry = root_section
@@ -80,17 +81,55 @@ redef class Nitiwiki
while not parts.is_empty do
var name = parts.shift
if name.is_empty then continue
+ if entry.name == name then continue
if not entry.children.has_key(name) then return null
entry = entry.children[name]
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
- # Url to `self` once generated.
- fun url: String do return wiki.config.root_url.join_path(breadcrumbs.join("/"))
+ # 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.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
@@ -111,7 +150,7 @@ redef class WikiEntry
# Search in `self` then `self.children` if an entry has the title `title`.
fun lookup_entry_by_title(title: String): nullable WikiEntry do
for child in children.values do
- if child.title == title then return child
+ if child.title.to_lower == title.to_lower then return child
end
for child in children.values do
var res = child.lookup_entry_by_title(title)
@@ -146,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
@@ -158,11 +199,11 @@ redef class WikiArticle
# Checks if `self.name == "index"`.
fun is_index: Bool do return name == "index"
- redef fun url do
+ redef fun href do
if parent == null then
- return wiki.config.root_url.join_path("{name}.html")
+ return "{name}.html"
else
- return parent.url.join_path("{name}.html")
+ return parent.href.join_path("{name}.html")
end
end
@@ -183,7 +224,9 @@ class WikiSectionIndex
redef fun title do return section.title
- redef fun url do return section.url
+ redef fun href do return section.href
+
+ redef fun dir_href do return section.dir_href
end
# A MarkdownProcessor able to parse wiki links.
@@ -204,7 +247,8 @@ class NitiwikiMdProcessor
end
end
-private class NitiwikiDecorator
+# The decorator associated to `MarkdownProcessor`.
+class NitiwikiDecorator
super HTMLDecorator
# Wiki used to resolve links.
@@ -213,12 +257,23 @@ private class NitiwikiDecorator
# Article used to contextualize links.
var context: WikiEntry
- redef fun add_wikilink(v, link, name, comment) do
+ redef fun add_wikilink(v, token) do
+ var wiki = v.processor.as(NitiwikiMdProcessor).wiki
+ var target: nullable WikiEntry = null
var anchor: nullable String = null
+ var link = token.link
+ if link == null then return
+ var name = token.name
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
@@ -234,10 +289,14 @@ private class NitiwikiDecorator
end
if target != null then
if name == null then name = target.title
- link = target.url
+ link = target.href_from(context)
+
+ if command == "trail" then
+ if target isa WikiSection then target = target.index
+ wiki.trails.add(context, target)
+ end
else
- var loc = context.src_path or else context.name
- wiki.message("Warning: unknown wikilink `{link}` (in {loc})", 0)
+ wiki.message("Warning: unknown wikilink `{link}` (in {context.src_path.as(not null)})", 0)
v.add "class=\"broken\" "
end
end
@@ -245,6 +304,7 @@ private class NitiwikiDecorator
append_value(v, link)
if anchor != null then append_value(v, "#{anchor}")
v.add "\""
+ var comment = token.comment
if comment != null and not comment.is_empty then
v.add " title=\""
append_value(v, comment)