Skip to content

Commit

Permalink
src/doc/commands: move cmd processing to commands_html
Browse files Browse the repository at this point in the history
Signed-off-by: Alexandre Terrasa <[email protected]>
  • Loading branch information
Morriar committed Jun 21, 2018
1 parent b305b17 commit 26b2608
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 103 deletions.
103 changes: 0 additions & 103 deletions src/doc/commands/commands_docdown.nit
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,9 @@
# Doc down related queries
module commands_docdown

import commands::commands_parser
import commands::commands_html
import commands::commands_md

intrude import markdown::wikilinks

# Retrieve the MDoc summary
#
# List all MarkdownHeading found and their ids.
Expand Down Expand Up @@ -61,103 +58,3 @@ class CmdSummary
return res
end
end

# Custom Markdown processor able to process doc commands
class CmdDecorator
super NitdocDecorator

redef type PROCESSOR: CmdMarkdownProcessor

# Model used by wikilink commands to find entities
var model: Model

# Filter to apply if any
var filter: nullable ModelFilter

redef fun add_span_code(v, buffer, from, to) do
var text = new FlatBuffer
buffer.read(text, from, to)
var name = text.write_to_string
name = name.replace("nullable ", "")
var mentity = try_find_mentity(name)
if mentity == null then
super
else
v.add "<code>"
v.emit_text mentity.html_link.write_to_string
v.add "</code>"
end
end

private fun try_find_mentity(text: String): nullable MEntity do
var mentity = model.mentity_by_full_name(text, filter)
if mentity != null then return mentity

var mentities = model.mentities_by_name(text, filter)
if mentities.is_empty then
return null
else if mentities.length > 1 then
# TODO smart resolve conflicts
end
return mentities.first
end

redef fun add_wikilink(v, token) do
v.render_wikilink(token, model)
end
end

# Same as `InlineDecorator` but with wikilink commands handling
class CmdInlineDecorator
super InlineDecorator

redef type PROCESSOR: CmdMarkdownProcessor

# Model used by wikilink commands to find entities
var model: Model

redef fun add_wikilink(v, token) do
v.render_wikilink(token, model)
end
end

# Custom MarkdownEmitter for commands
class CmdMarkdownProcessor
super MarkdownProcessor

# Parser used to process doc commands
var parser: CommandParser

# Render a wikilink
fun render_wikilink(token: TokenWikiLink, model: Model) do
var link = token.link
if link == null then return
var name = token.name
if name != null then link = "{name} | {link}"

var command = parser.parse(link.write_to_string)
var error = parser.error

if error isa CmdError then
emit_text error.to_html.write_to_string
return
end
if error isa CmdWarning then
emit_text error.to_html.write_to_string
end
add command.as(not null).to_html
end
end

redef class Text
# Read `self` between `nstart` and `nend` (excluded) and writte chars to `out`.
private fun read(out: FlatBuffer, nstart, nend: Int): Int do
var pos = nstart
while pos < length and pos < nend do
out.add self[pos]
pos += 1
end
if pos == length then return -1
return pos
end
end
104 changes: 104 additions & 0 deletions src/doc/commands/commands_html.nit
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ import commands_catalog
import commands_graph
import commands_ini
import commands_main
import commands_parser
import commands_usage

import templates::templates_html
intrude import markdown::wikilinks

redef class DocCommand

Expand Down Expand Up @@ -358,3 +360,105 @@ redef class CmdTesting
return "<pre>{command}</pre>"
end
end

# MDoc

# Custom Markdown processor able to process doc commands
class CmdDecorator
super NitdocDecorator

redef type PROCESSOR: CmdMarkdownProcessor

# Model used by wikilink commands to find entities
var model: Model

# Filter to apply if any
var filter: nullable ModelFilter

redef fun add_span_code(v, buffer, from, to) do
var text = new FlatBuffer
buffer.read(text, from, to)
var name = text.write_to_string
name = name.replace("nullable ", "")
var mentity = try_find_mentity(name)
if mentity == null then
super
else
v.add "<code>"
v.emit_text mentity.html_link.write_to_string
v.add "</code>"
end
end

private fun try_find_mentity(text: String): nullable MEntity do
var mentity = model.mentity_by_full_name(text, filter)
if mentity != null then return mentity

var mentities = model.mentities_by_name(text, filter)
if mentities.is_empty then
return null
else if mentities.length > 1 then
# TODO smart resolve conflicts
end
return mentities.first
end

redef fun add_wikilink(v, token) do
v.render_wikilink(token, model)
end
end

# Same as `InlineDecorator` but with wikilink commands handling
class CmdInlineDecorator
super InlineDecorator

redef type PROCESSOR: CmdMarkdownProcessor

# Model used by wikilink commands to find entities
var model: Model

redef fun add_wikilink(v, token) do
v.render_wikilink(token, model)
end
end

# Custom MarkdownEmitter for commands
class CmdMarkdownProcessor
super MarkdownProcessor

# Parser used to process doc commands
var parser: CommandParser

# Render a wikilink
fun render_wikilink(token: TokenWikiLink, model: Model) do
var link = token.link
if link == null then return
var name = token.name
if name != null then link = "{name} | {link}"

var command = parser.parse(link.write_to_string)
var error = parser.error

if error isa CmdError then
emit_text error.to_html.write_to_string
return
end
if error isa CmdWarning then
emit_text error.to_html.write_to_string
end
add command.as(not null).to_html
end
end

redef class Text
# Read `self` between `nstart` and `nend` (excluded) and writte chars to `out`.
private fun read(out: FlatBuffer, nstart, nend: Int): Int do
var pos = nstart
while pos < length and pos < nend do
out.add self[pos]
pos += 1
end
if pos == length then return -1
return pos
end
end

0 comments on commit 26b2608

Please sign in to comment.