From bf4b767a0bdfe1ef160f2322c334cc1e4844535b Mon Sep 17 00:00:00 2001 From: Alexandre Terrasa Date: Tue, 12 Jun 2018 12:02:28 -0400 Subject: [PATCH] src/doc/commands: merge `doc_down` intro `templates_html` Signed-off-by: Alexandre Terrasa --- src/doc/commands/commands_docdown.nit | 1 - src/doc/commands/commands_html.nit | 2 - src/doc/doc_down.nit | 207 --------------------------------- src/doc/templates/templates_html.nit | 198 ++++++++++++++++++++++++++++++- src/doc/templates/templates_json.nit | 3 +- src/frontend/parse_examples.nit | 1 - src/nitcatalog.nit | 3 +- src/nitweb.nit | 1 - 8 files changed, 200 insertions(+), 216 deletions(-) delete mode 100644 src/doc/doc_down.nit diff --git a/src/doc/commands/commands_docdown.nit b/src/doc/commands/commands_docdown.nit index c05195b..596f549 100644 --- a/src/doc/commands/commands_docdown.nit +++ b/src/doc/commands/commands_docdown.nit @@ -19,7 +19,6 @@ import commands::commands_parser import commands::commands_html import commands::commands_md -intrude import doc_down intrude import markdown::wikilinks # Retrieve the MDoc summary diff --git a/src/doc/commands/commands_html.nit b/src/doc/commands/commands_html.nit index 56d0e5b..df8b43a 100644 --- a/src/doc/commands/commands_html.nit +++ b/src/doc/commands/commands_html.nit @@ -22,8 +22,6 @@ import commands_main import commands_usage import templates::templates_html -import doc_down -import highlight redef class DocCommand diff --git a/src/doc/doc_down.nit b/src/doc/doc_down.nit deleted file mode 100644 index 1fddb06..0000000 --- a/src/doc/doc_down.nit +++ /dev/null @@ -1,207 +0,0 @@ -# This file is part of NIT ( http://www.nitlanguage.org ). -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Handle markdown formatting in Nit comments. -module doc_down - -import markdown -import htmlight -private import parser_util - -redef class MDoc - - private var markdown_proc: MarkdownProcessor is lazy, writable do - return original_mentity.as(not null).model.nitdoc_md_processor - end - - private var inline_proc: MarkdownProcessor is lazy, writable do - return original_mentity.as(not null).model.nitdoc_inline_processor - end - - # Renders the synopsis as a HTML comment block. - var html_synopsis: Writable is lazy do - var res = new Template - var syn = inline_proc.process(content.first) - res.add "{syn}" - return res - end - - # Renders the comment without the synopsis as a HTML comment block. - var html_comment: Writable is lazy do - var lines = content.to_a - if not lines.is_empty then lines.shift - return lines_to_html(lines) - end - - # Renders the synopsis and the comment as a HTML comment block. - var html_documentation: Writable is lazy do return lines_to_html(content.to_a) - - # Renders markdown line as a HTML comment block. - private fun lines_to_html(lines: Array[String]): Writable do - var res = new Template - var decorator = markdown_proc.decorator.as(NitdocDecorator) - decorator.current_mdoc = self - res.add "
" - # do not use DocUnit as synopsys - if not lines.is_empty then - if not lines.first.has_prefix(" ") and - not lines.first.has_prefix("\t") then - # parse synopsys - var syn = inline_proc.process(lines.shift) - res.add "

{syn}

" - end - end - # check for annotations - for i in [0 .. lines.length[ do - var line = lines[i] - if line.to_upper.has_prefix("ENSURE") or line.to_upper.has_prefix("REQUIRE") then - var html = inline_proc.process(line) - lines[i] = "

{html}

" - else if line.to_upper.has_prefix("TODO") or line.to_upper.has_prefix("FIXME") then - var html = inline_proc.process(line) - lines[i] = "

{html}

" - end - end - # add other lines - res.add markdown_proc.process(lines.join("\n")) - res.add "
" - decorator.current_mdoc = null - return res - end -end - -# The specific markdown decorator used internally to process MDoc object. -# -# You should use the various methods of `MDoc` like `MDoc::html_documentation` -# -# The class is public so specific behavior can be plugged on it. -class NitdocDecorator - super HTMLDecorator - - private var toolcontext = new ToolContext - - # The currently processed mdoc. - # - # Unfortunately, this seems to be the simpler way to get the currently processed `MDoc` object. - var current_mdoc: nullable MDoc = null - - redef fun add_code(v, block) do - var meta = block.meta or else "nit" - - # Do not try to highlight non-nit code. - if meta != "nit" and meta != "nitish" then - v.add "
"
-			v.emit_in block
-			v.add "
\n" - return - end - # Try to parse code - var code = block.raw_content - var ast = toolcontext.parse_something(code) - if ast isa AError then - v.add "
"
-			v.emit_in block
-			v.add "
\n" - return - end - v.add "
"
-		var hl = new HtmlightVisitor
-		hl.line_id_prefix = ""
-		hl.highlight_node(ast)
-		v.add(hl.html)
-		v.add "
\n" - end - - redef fun add_span_code(v, text, from, to) do - # Try to parse it - var code = code_from_text(text, from, to) - var ast = toolcontext.parse_something(code) - - if ast isa AError then - v.add "" - append_code(v, text, from, to) - else - v.add "" - var hl = new HtmlightVisitor - hl.line_id_prefix = "" - hl.highlight_node(ast) - v.add(hl.html) - end - v.add "" - end - - private fun code_from_text(buffer: Text, from, to: Int): String do - var out = new FlatBuffer - for i in [from..to[ do out.add buffer[i] - return out.write_to_string - end -end - -# Decorator for span elements. -# -# Because inline comments can appear as span elements, -# InlineDecorator do not decorate things like paragraphs or headers. -private class InlineDecorator - super NitdocDecorator - - redef fun add_paragraph(v, block) do - v.emit_in block - end - - redef fun add_headline(v, block) do - # save headline - var line = block.block.first_line - if line == null then return - var txt = line.value - var id = strip_id(txt) - var lvl = block.depth - headlines[id] = new HeadLine(id, txt, lvl) - - v.emit_in block - end - - redef fun add_code(v, block) do - # Try to parse code - var ast = toolcontext.parse_something(block.block.text.to_s) - if ast isa AError then - v.add "" - v.emit_in block - v.add "" - return - end - v.add "" - var hl = new HtmlightVisitor - hl.highlight_node(ast) - v.add(hl.html) - v.add "" - end -end - -redef class Model - # Get a markdown processor for Nitdoc comments. - var nitdoc_md_processor: MarkdownProcessor is lazy, writable do - var proc = new MarkdownProcessor - proc.decorator = new NitdocDecorator - return proc - end - - # Get a markdown inline processor for Nitdoc comments. - # - # This processor is specificaly designed to inlinable doc elements like synopsys. - var nitdoc_inline_processor: MarkdownProcessor is lazy, writable do - var proc = new MarkdownProcessor - proc.decorator = new InlineDecorator - return proc - end -end diff --git a/src/doc/templates/templates_html.nit b/src/doc/templates/templates_html.nit index 77e3980..d715d7b 100644 --- a/src/doc/templates/templates_html.nit +++ b/src/doc/templates/templates_html.nit @@ -16,10 +16,13 @@ module templates_html import model::model_collect -import doc::doc_down -import html::bootstrap import catalog +import markdown +import htmlight +import html::bootstrap +private import parser_util + redef class MEntity # The MEntity unique ID in the HTML output @@ -352,6 +355,8 @@ redef class MParameter end end +# Catalog + redef class Person # HTML uniq id @@ -377,3 +382,192 @@ redef class Person return tpl.write_to_string end end + +# MDoc + +redef class MDoc + + private var markdown_proc: MarkdownProcessor is lazy, writable do + return original_mentity.as(not null).model.nitdoc_md_processor + end + + private var inline_proc: MarkdownProcessor is lazy, writable do + return original_mentity.as(not null).model.nitdoc_inline_processor + end + + # Renders the synopsis as a HTML comment block. + var html_synopsis: Writable is lazy do + var res = new Template + var syn = inline_proc.process(content.first) + res.add "{syn}" + return res + end + + # Renders the comment without the synopsis as a HTML comment block. + var html_comment: Writable is lazy do + var lines = content.to_a + if not lines.is_empty then lines.shift + return lines_to_html(lines) + end + + # Renders the synopsis and the comment as a HTML comment block. + var html_documentation: Writable is lazy do return lines_to_html(content.to_a) + + # Renders markdown line as a HTML comment block. + private fun lines_to_html(lines: Array[String]): Writable do + var res = new Template + var decorator = markdown_proc.decorator.as(NitdocDecorator) + decorator.current_mdoc = self + res.add "
" + # do not use DocUnit as synopsys + if not lines.is_empty then + if not lines.first.has_prefix(" ") and + not lines.first.has_prefix("\t") then + # parse synopsys + var syn = inline_proc.process(lines.shift) + res.add "

{syn}

" + end + end + # check for annotations + for i in [0 .. lines.length[ do + var line = lines[i] + if line.to_upper.has_prefix("ENSURE") or line.to_upper.has_prefix("REQUIRE") then + var html = inline_proc.process(line) + lines[i] = "

{html}

" + else if line.to_upper.has_prefix("TODO") or line.to_upper.has_prefix("FIXME") then + var html = inline_proc.process(line) + lines[i] = "

{html}

" + end + end + # add other lines + res.add markdown_proc.process(lines.join("\n")) + res.add "
" + decorator.current_mdoc = null + return res + end +end + +# The specific markdown decorator used internally to process MDoc object. +# +# You should use the various methods of `MDoc` like `MDoc::html_documentation` +# +# The class is public so specific behavior can be plugged on it. +class NitdocDecorator + super HTMLDecorator + + private var toolcontext = new ToolContext + + # The currently processed mdoc. + # + # Unfortunately, this seems to be the simpler way to get the currently processed `MDoc` object. + var current_mdoc: nullable MDoc = null + + redef fun add_code(v, block) do + var meta = block.meta or else "nit" + + # Do not try to highlight non-nit code. + if meta != "nit" and meta != "nitish" then + v.add "
"
+			v.emit_in block
+			v.add "
\n" + return + end + # Try to parse code + var code = block.raw_content + var ast = toolcontext.parse_something(code) + if ast isa AError then + v.add "
"
+			v.emit_in block
+			v.add "
\n" + return + end + v.add "
"
+		var hl = new HtmlightVisitor
+		hl.line_id_prefix = ""
+		hl.highlight_node(ast)
+		v.add(hl.html)
+		v.add "
\n" + end + + redef fun add_span_code(v, text, from, to) do + # Try to parse it + var code = code_from_text(text, from, to) + var ast = toolcontext.parse_something(code) + + if ast isa AError then + v.add "" + append_code(v, text, from, to) + else + v.add "" + var hl = new HtmlightVisitor + hl.line_id_prefix = "" + hl.highlight_node(ast) + v.add(hl.html) + end + v.add "" + end + + private fun code_from_text(buffer: Text, from, to: Int): String do + var out = new FlatBuffer + for i in [from..to[ do out.add buffer[i] + return out.write_to_string + end +end + +# Decorator for span elements. +# +# Because inline comments can appear as span elements, +# InlineDecorator do not decorate things like paragraphs or headers. +class InlineDecorator + super NitdocDecorator + + redef fun add_paragraph(v, block) do + v.emit_in block + end + + redef fun add_headline(v, block) do + # save headline + var line = block.block.first_line + if line == null then return + var txt = line.value + var id = strip_id(txt) + var lvl = block.depth + headlines[id] = new HeadLine(id, txt, lvl) + + v.emit_in block + end + + redef fun add_code(v, block) do + # Try to parse code + var ast = toolcontext.parse_something(block.block.text.to_s) + if ast isa AError then + v.add "" + v.emit_in block + v.add "" + return + end + v.add "" + var hl = new HtmlightVisitor + hl.highlight_node(ast) + v.add(hl.html) + v.add "" + end +end + +redef class Model + # Get a markdown processor for Nitdoc comments. + var nitdoc_md_processor: MarkdownProcessor is lazy, writable do + var proc = new MarkdownProcessor + proc.decorator = new NitdocDecorator + return proc + end + + # Get a markdown inline processor for Nitdoc comments. + # + # This processor is specificaly designed to inlinable doc elements like synopsys. + var nitdoc_inline_processor: MarkdownProcessor is lazy, writable do + var proc = new MarkdownProcessor + proc.decorator = new InlineDecorator + return proc + end +end diff --git a/src/doc/templates/templates_json.nit b/src/doc/templates/templates_json.nit index 1135460..e1dacf8 100644 --- a/src/doc/templates/templates_json.nit +++ b/src/doc/templates/templates_json.nit @@ -27,7 +27,8 @@ module templates_json import model::model_collect import json::serialization_write import catalog -import doc_down + +import templates_html redef class MEntity serialize diff --git a/src/frontend/parse_examples.nit b/src/frontend/parse_examples.nit index 84c83a6..78258fa 100644 --- a/src/frontend/parse_examples.nit +++ b/src/frontend/parse_examples.nit @@ -22,7 +22,6 @@ module parse_examples import counter import typing import parse_annotations -import doc_down import model::model_examples redef class ToolContext diff --git a/src/nitcatalog.nit b/src/nitcatalog.nit index 244be79..a8b3192 100644 --- a/src/nitcatalog.nit +++ b/src/nitcatalog.nit @@ -22,9 +22,10 @@ module nitcatalog import loader # Scan&load packages, groups and modules -import doc::doc_down # Display mdoc import catalog +import templates_html + # A HTML page in a catalog # # This is just a template with the header pre-filled and the footer injected at rendering. diff --git a/src/nitweb.nit b/src/nitweb.nit index ab16edc..4ba30f5 100644 --- a/src/nitweb.nit +++ b/src/nitweb.nit @@ -17,7 +17,6 @@ module nitweb import frontend import doc::api -import doc::doc_down redef class ToolContext -- 1.7.9.5