From 3e60a65e71b4fb6af32dffd5e905056d42021d05 Mon Sep 17 00:00:00 2001 From: Alexandre Terrasa Date: Tue, 29 Aug 2017 19:32:12 -0400 Subject: [PATCH] nitweb: use new doc commands parser Signed-off-by: Alexandre Terrasa --- src/web/api_docdown.nit | 106 ++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 56 deletions(-) diff --git a/src/web/api_docdown.nit b/src/web/api_docdown.nit index bbdc9db..e2721a4 100644 --- a/src/web/api_docdown.nit +++ b/src/web/api_docdown.nit @@ -87,10 +87,7 @@ class NitwebDecorator end redef fun add_wikilink(v, token) do - var link = token.link - if link == null then return - var cmd = new DocCommand(link.write_to_string) - cmd.render(v, token, view) + v.render_wikilink(token, view) end end @@ -105,20 +102,51 @@ class NitwebInlineDecorator var modelbuilder: ModelBuilder redef fun add_wikilink(v, token) do - var link = token.link - if link == null then return - var cmd = new DocCommand(link.write_to_string) - cmd.render(v, token, view) + v.render_wikilink(token, view) end end redef class MarkdownEmitter + + # Parser used to process doc commands + var parser = new DocCommandParser + + # Render a wikilink + fun render_wikilink(token: TokenWikiLink, model: ModelView) do + var link = token.link + if link == null then return + var name = token.name + if name != null then link = "{name} | {link}" + var cmd = parser.parse(link.write_to_string) + if cmd == null then + var full_name = if token.link != null then token.link.as(not null).write_to_string.trim else null + if full_name == null or full_name.is_empty then + write_error("empty wikilink") + return + end + var mentity = find_mentity(model, full_name) + if mentity == null then return + name = if token.name != null then token.name.as(not null).to_s else null + write_mentity_link(mentity, name) + return + else + for message in parser.errors do + if message.level == 1 then + write_error(message.message) + else if message.level > 1 then + write_warning(message.message) + end + end + end + cmd.render(self, token, model) + end + # Find the MEntity that matches `name`. # # Write an error if the entity is not found fun find_mentity(model: ModelView, name: nullable String): nullable MEntity do if name == null then - write_error("No MEntity found") + write_error("no MEntity found") return null end # Lookup by full name @@ -129,7 +157,7 @@ redef class MarkdownEmitter if mentities.is_empty then var suggest = model.find(name, 3) var msg = new Buffer - msg.append "No MEntity found for name `{name}`" + msg.append "no MEntity found for name `{name}`" if suggest.not_empty then msg.append " (suggestions: " var i = 0 @@ -144,7 +172,7 @@ redef class MarkdownEmitter return null else if mentities.length > 1 then var msg = new Buffer - msg.append "Conflicts for name `{name}`" + msg.append "conflicts for name `{name}`" msg.append " (conflicts: " var i = 0 for s in mentities do @@ -195,40 +223,22 @@ redef class MarkdownEmitter end end -redef interface DocCommand +redef class DocCommand # Emit the HTML related to the execution of this doc command fun render(v: MarkdownEmitter, token: TokenWikiLink, model: ModelView) do - v.write_error("Not yet implemented command `{token.link or else "null"}`") - end -end - -redef class UnknownCommand - redef fun render(v, token, model) do - var link = token.link - if link == null then - v.write_error("Empty command") - return - end - var full_name = link.write_to_string - var mentity = v.find_mentity(model, full_name) - if mentity == null then return - v.write_mentity_link(mentity) + v.write_error("not yet implemented command `{token.link or else "null"}`") end end redef class ArticleCommand redef fun render(v, token, model) do - if args.is_empty then - v.write_error("Expected one arg: the MEntity name") - return - end - var name = args.first + var name = arg var mentity = v.find_mentity(model, name) if mentity == null then return var mdoc = mentity.mdoc_or_fallback if mdoc == null then - v.write_warning("No MDoc for mentity `{name}`") + v.write_warning("no MDoc for mentity `{name}`") return end v.add "

" @@ -242,16 +252,12 @@ end redef class CommentCommand redef fun render(v, token, model) do - if args.is_empty then - v.write_error("Expected one arg: the MEntity name") - return - end - var name = args.first + var name = arg var mentity = v.find_mentity(model, name) if mentity == null then return var mdoc = mentity.mdoc_or_fallback if mdoc == null then - v.write_warning("No MDoc for mentity `{name}`") + v.write_warning("no MDoc for mentity `{name}`") return end v.add v.processor.process(mdoc.comment).write_to_string @@ -260,11 +266,7 @@ end redef class ListCommand redef fun render(v, token, model) do - if args.is_empty then - v.write_error("Expected one arg: the MEntity name") - return - end - var name = args.first + var name = arg var mentity = v.find_mentity(model, name) if mentity == null then return if mentity isa MPackage then @@ -283,25 +285,21 @@ redef class ListCommand else if mentity isa MProperty then v.write_mentity_list(mentity.mpropdefs) else - v.write_error("No list found for name `{name}`") + v.write_error("no list found for name `{name}`") end end end redef class CodeCommand redef fun render(v, token, model) do - if args.is_empty then - v.write_error("Expected one arg: the MEntity name") - return - end - var name = args.first + var name = arg var mentity = v.find_mentity(model, name) if mentity == null then return if mentity isa MClass then mentity = mentity.intro if mentity isa MProperty then mentity = mentity.intro var source = render_source(mentity, v.decorator.as(NitwebDecorator).modelbuilder) if source == null then - v.write_error("No source for MEntity `{name}`") + v.write_error("no source for MEntity `{name}`") return end v.add "
"
@@ -321,11 +319,7 @@ end
 
 redef class GraphCommand
 	redef fun render(v, token, model) do
-		if args.is_empty then
-			v.write_error("Expected one arg: the MEntity name")
-			return
-		end
-		var name = args.first
+		var name = arg
 		var mentity = v.find_mentity(model, name)
 		if mentity == null then return
 		var g = new InheritanceGraph(mentity, model)
-- 
1.7.9.5