Base | Navigating To | Result |
---|---|---|
http://myapp.com/ | abc | http://myapp.com/abc |
http://myapp.com | abc | http://myapp.comabc |
Case Sensitive | Case Insensitive | Description |
---|---|---|
startsWith | iStartsWith | Matches values that start with the given value | \n" + - "
contains | iContains | Matches values that contain the given value anywhere | \n" + - "
endsWith | iEndsWith | Matches values that end with the given value | \n" + - "
containsWord | iContainsWord | Matches values that contain the given value surrounded by either whitespace or the beginning or end of the value | \n" + - "
notStartsWith | iNotStartsWith | Matches values that DO NOT start with the given value | \n" + - "
notContains | iNotContains | Matches values that DO NOT contain the given value anywhere | \n" + - "
notEndsWith | iNotEndsWith | Matches values that DO NOT end with the given value | \n" + - "
notContainsWord | iNotContainsWord | Matches values that DO NOT contain the given value surrounded by either whitespace or the beginning or end of the value | \n" + - " \n" + - "
Short Name | Driver |
---|---|
htmlunit | \n" +
- " org.openqa.selenium.htmlunit.HtmlUnitDriver | \n" + - "
firefox | \n" +
- " org.openqa.selenium.firefox.FirefoxDriver | \n" + - "
ie | \n" +
- " org.openqa.selenium.ie.InternetExplorerDriver | \n" + - "
chrome | \n" +
- " org.openqa.selenium.chrome.ChromeDriver | \n" + - "
Base | Navigating To | Result |
---|---|---|
http://myapp.com/ | abc | http://myapp.com/abc |
http://myapp.com | abc | http://myapp.comabc |
and &` for everything
-
-# inline-code-with-visible-backtick
-
-``We love `code` for everything``
-
-# inline-code
-
-``We love `code` for everything``
-
-# line-break-2-spaces
-
-A first sentence
-and a line break.
-
-# line-break-5-spaces
-
-A first sentence
-and a line break.
-
-# link-automatic
-
-This is an automatic link
-
-# link-bracket-paranthesis-title
-
-[W3C](http://www.w3.org/ "Discover w3c")
-
-# link-bracket-paranthesis
-
-[W3C](http://www.w3.org/)
-
-# link-idref-angle-bracket
-
-[World Wide Web Consortium][w3c]
-
-[w3c]:
-
-# link-idref-implicit-spaces
-
-[World Wide Web Consortium][]
-
-[World Wide Web Consortium]: http://www.w3.org/
-
-# link-idref-implicit
-
-[w3c][]
-
-[w3c]: http://www.w3.org/
-
-# link-idref-space
-
-[World Wide Web Consortium] [w3c]
-
-[w3c]: http://www.w3.org/
-
-# link-idref-title-next-line
-
-[World Wide Web Consortium][w3c]
-
-[w3c]: http://www.w3.org/
- "Discover W3C"
-
-# link-idref-title-paranthesis
-
-[World Wide Web Consortium][w3c]
-
-[w3c]: http://www.w3.org/ (Discover w3c)
-
-# link-idref-title-single-quote
-
-[World Wide Web Consortium][w3c]
-
-[w3c]: http://www.w3.org/ 'Discover w3c'
-
-# link-idref-title
-
-[World Wide Web Consortium][w3c]
-
-[w3c]: http://www.w3.org/ "Discover w3c"
-
-# link-idref
-
-[World Wide Web Consortium][w3c]
-
-[w3c]: http://www.w3.org/
-
-# list-blockquote
-
-* a list containing a blockquote
-
- > this the blockquote in the list
-
-# list-code-1-space
-
-* a
-
- b
-
-
-# list-code
-
-* a list containing a block of code
-
- 10 PRINT HELLO INFINITE
- 20 GOTO 10
-
-# list-multiparagraphs-tab
-
-* This is a list item with two paragraphs. Lorem ipsum dolor
- sit amet, consectetuer adipiscing elit. Aliquam hendrerit
- mi posuere lectus.
-
- Vestibulum enim wisi, viverra nec, fringilla in, laoreet
- vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
- sit amet velit.
-
-* Suspendisse id sem consectetuer libero luctus adipiscing.
-
-# list-multiparagraphs
-
-* This is a list item with two paragraphs. Lorem ipsum dolor
- sit amet, consectetuer adipiscing elit. Aliquam hendrerit
- mi posuere lectus.
-
- Vestibulum enim wisi, viverra nec, fringilla in, laoreet
- vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
- sit amet velit.
-
-* Suspendisse id sem consectetuer libero luctus adipiscing.
-
-# ordered-list-escaped
-
-1\. ordered list escape
-
-# ordered-list-inner-par-list
-
-1. 1
-
- - inner par list
-
-2. 2
-
-
-# ordered-list-items-random-number
-
-1. list item 1
-8. list item 2
-1. list item 3
-
-# ordered-list-items
-
-1. list item 1
-2. list item 2
-3. list item 3
-
-# paragraph-hard-return
-
-This is a paragraph
-on multiple lines
-with hard return.
-
-# paragraph-line
-
-This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.
-
-# paragraph-trailing-leading-spaces
-
- This is a paragraph with a trailing and leading space.
-
-# paragraph-trailing-tab
-
-This is a paragraph with 1 trailing tab.
-
-# paragraphs-2-leading-spaces
-
- This is a paragraph with 2 leading spaces.
-
-# paragraphs-3-leading-spaces
-
- This is a paragraph with 3 leading spaces.
-
-# paragraphs-leading-space
-
- This is a paragraph with 1 leading space.
-
-# paragraphs-trailing-spaces
-
-This is a paragraph with a trailing space.
-
-# strong-middle-word
-
-as**te**risks
-
-# strong-star
-
-**double asterisks**
-
-# strong-underscore
-
-__double underscores__
-
-# unordered-list-items-asterisk
-
-* list item 1
-* list item 2
-* list item 3
-
-
-# unordered-list-items-dashsign
-
-- list item 1
-- list item 2
-- list item 3
-
-# unordered-list-items-leading-1space
-
- * list item 1
- * list item 2
- * list item 3
-
-# unordered-list-items-leading-2spaces
-
- * list item 1
- * list item 2
- * list item 3
-
-# unordered-list-items-leading-3spaces
-
- * list item 1
- * list item 2
- * list item 3
-
-# unordered-list-items-plussign
-
-+ list item 1
-+ list item 2
-+ list item 3
-
-# unordered-list-paragraphs
-
-* list item in paragraph
-
-* another list item in paragraph
-
-# unordered-list-unindented-content
-
-* This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph in a list.
-* and yet another long long long long long long long long long long long long long long long long long long long long long long line.
-
-# unordered-list-with-indented-content
-
-* This is a list item
- with the content on
- multiline and indented.
-* And this another list item
- with the same principle.
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# autolink-no-bracket
-
-http://a.com
-
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# fenced-code-block
-
-```
-a
-```
-
-# utf8
-
-€
-
-# autolink-no-bracket
-
-http://a.com
-
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
-# fenced-code-block
-
-```
-a
-```
-
-# link-idref-implicit-no-bracket
-
-[a]
-
-[a]: b
-
-
-# utf8
-
-€
-
diff --git a/markdownToAsciidoc/README.adoc b/markdownToAsciidoc/README.adoc
new file mode 100644
index 00000000..c2903423
--- /dev/null
+++ b/markdownToAsciidoc/README.adoc
@@ -0,0 +1,31 @@
+= Markdown to AsciiDoc converter
+
+A small, lightweight converter for Markdown to http://www.asciidoc.org[AsciiDoc] written in Java, and using Javascript.
+
+It's a fork from https://github.com/asciidocfx/MarkdownToAsciidoc/tree/master[Github] +
+We added Graal dependences to run JS without using Java 8 JVM compiler.
+
+== Usage
+
+To use the library, call the following:
+
+.Synchronous way
+[source,java]
+----
+String result = MarkdownToAsciidoc.convert("# Tittle");
+----
+
+.Asynchronous way
+[source,java]
+----
+MarkdownToAsciidoc.convert("# Tittle", r -> {
+ System.out.println(r);
+});
+----
+
+.Path way
+[source,java]
+----
+Path outputPath = Paths.get("C:\\output.asciidoc");
+MarkdownToAsciidoc.convert("# Tittle", outputPath);
+----
\ No newline at end of file
diff --git a/markdownToAsciidoc/pom.xml b/markdownToAsciidoc/pom.xml
new file mode 100644
index 00000000..ace6f4e7
--- /dev/null
+++ b/markdownToAsciidoc/pom.xml
@@ -0,0 +1,29 @@
+
+
+ 4.0.0
+
+
+ io.github.Riduidel.aadarchi
+ system
+ 0.1.12-SNAPSHOT
+
+ MarkdownToAsciidoc
+ Aadarchi : Markdown to Asciidoc
+
+
+
+ org.graalvm.js
+ js
+ 22.0.0
+
+
+ org.graalvm.js
+ js-scriptengine
+ 22.0.0
+
+
+
+
+
\ No newline at end of file
diff --git a/markdownToAsciidoc/src/main/java/com/kodcu/asciidocfx/ConversionException.java b/markdownToAsciidoc/src/main/java/com/kodcu/asciidocfx/ConversionException.java
new file mode 100644
index 00000000..777303a8
--- /dev/null
+++ b/markdownToAsciidoc/src/main/java/com/kodcu/asciidocfx/ConversionException.java
@@ -0,0 +1,12 @@
+package com.kodcu.asciidocfx;
+
+import javax.script.ScriptException;
+
+/**
+ * Created by usta on 15.03.2015.
+ */
+public class ConversionException extends RuntimeException {
+ public ConversionException(Exception e) {
+ super(e);
+ }
+}
diff --git a/markdownToAsciidoc/src/main/java/com/kodcu/asciidocfx/MarkdownToAsciidoc.java b/markdownToAsciidoc/src/main/java/com/kodcu/asciidocfx/MarkdownToAsciidoc.java
new file mode 100644
index 00000000..23cd03b0
--- /dev/null
+++ b/markdownToAsciidoc/src/main/java/com/kodcu/asciidocfx/MarkdownToAsciidoc.java
@@ -0,0 +1,114 @@
+package com.kodcu.asciidocfx;
+
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import java.io.*;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+/**
+ * Created by usta on 15.03.2015.
+ */
+public class MarkdownToAsciidoc {
+
+ private static final ScriptEngineManager engineManager = new ScriptEngineManager();
+ private static final ScriptEngine engine = engineManager.getEngineByName("graal.js");
+
+ static {
+
+ try (InputStream markedStream = MarkdownToAsciidoc.class.getResourceAsStream("/marked.js");
+ InputStream markedExtensionStream = MarkdownToAsciidoc.class.getResourceAsStream("/marked-extension.js");
+ InputStreamReader markedIn = new InputStreamReader(markedStream, "UTF-8");
+ InputStreamReader markedExtensionIn = new InputStreamReader(markedExtensionStream, "UTF-8");
+ BufferedReader markedReader = new BufferedReader(markedIn);
+ BufferedReader markedExtensionReader = new BufferedReader(markedExtensionIn);) {
+
+ String markedScript = markedReader.lines().collect(Collectors.joining("\n"));
+ String markedExtensionScript = markedExtensionReader.lines().collect(Collectors.joining("\n"));
+
+ engine.eval(markedScript);
+ engine.eval(markedExtensionScript);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static String convert(String markdown) {
+ try {
+ engine.put("markdown", markdown);
+ return (String) engine.eval("markdownToAsciidoc(markdown)");
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+ }
+
+ public static String convert(Path markdownPath) {
+ try {
+ List markdownContent = Files.readAllLines(markdownPath);
+ String markdown = String.join("\n", markdownContent);
+ engine.put("markdown", markdown);
+ return (String) engine.eval("markdownToAsciidoc(markdown)");
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+ }
+
+ public static void convert(Path markdownPath, Path asciidocPath, StandardOpenOption... openOption) {
+
+ try {
+ String markdownContent = convert(markdownPath);
+ Files.write(asciidocPath, markdownContent.getBytes(Charset.forName("UTF-8")), openOption);
+ } catch (IOException e) {
+ throw new ConversionException(e);
+ }
+ }
+
+ public static void convert(File markdownFile, File asciidocFile, StandardOpenOption... openOption) {
+ convert(markdownFile.toPath(), asciidocFile.toPath(), openOption);
+ }
+
+ public static void convert(Path markdownPath, Consumer resultCallback) {
+
+ CompletableFuture.runAsync(() -> {
+ resultCallback.accept(convert(markdownPath));
+ });
+
+ }
+
+ public static String convert(File markdownFile) {
+ return convert(markdownFile.toPath());
+ }
+
+ public static void convert(File markdownFile, Consumer resultCallback) {
+ CompletableFuture.runAsync(() -> {
+ resultCallback.accept(convert(markdownFile));
+ });
+ }
+
+ public static void convert(String markdown, Consumer resultCallback) {
+ CompletableFuture.runAsync(() -> {
+ resultCallback.accept(convert(markdown));
+ });
+ }
+
+ public static void convert(String markdown, Path asciidocPath, StandardOpenOption... openOption) {
+ try {
+ String markdownContent = convert(markdown);
+ Files.write(asciidocPath, markdownContent.getBytes(Charset.forName("UTF-8")), openOption);
+ } catch (IOException e) {
+ throw new ConversionException(e);
+ }
+ }
+
+ public static void convert(String markdown, File asciidocFile, StandardOpenOption... openOption) {
+ convert(markdown, asciidocFile.toPath(), openOption);
+ }
+}
diff --git a/markdownToAsciidoc/src/main/resources/marked-extension.js b/markdownToAsciidoc/src/main/resources/marked-extension.js
new file mode 100644
index 00000000..1fb50e01
--- /dev/null
+++ b/markdownToAsciidoc/src/main/resources/marked-extension.js
@@ -0,0 +1,126 @@
+var md2AscRenderer = new marked.Renderer();
+
+md2AscRenderer.heading = function (text, level) {
+ return "\n" + repeatStuff("=", level) + " " + text + "\n";
+};
+md2AscRenderer.hr = function () {
+ return "\n'''\n";
+};
+
+md2AscRenderer.list = function (body, ordered) {
+ body = body.replace(/(\r\n|\r|\n|\t)/, "");
+
+ var include = body.match(/include::.*?\[.*?\]/ig);
+ if (include) {
+ return body.replace(/\$list-start\$/g, "\n\n");
+ }
+
+ var symbol = ordered ? ". " : "* ";
+ return body.replace(/\$list-start\$/g, "\n" + symbol);
+};
+
+md2AscRenderer.listitem = function (text) {
+ return '$list-start$' + text.replace(/(\r\n|\r|\n)/, "").trim();
+};
+
+function replaceTags(text, tag, first, second) {
+ var match = text.match(new RegExp("<" + tag + ">(.*?)<\/" + tag + ">", "ig")) || [];
+ match.forEach(function (item) {
+ text = text.replace(item, item.replace("<" + tag + ">", first).replace("" + tag + ">", second));
+ });
+ return text;
+}
+
+md2AscRenderer.paragraph = function (text) {
+ text = replaceTags(text, "u", "+++", "+++");
+ text = replaceTags(text, "sub", "~", "~");
+ text = replaceTags(text, "sup", "^", "^");
+
+ // if ise hatalı
+ //return "\n[%hardbreaks]";
+ return "\n" + text + "\n";
+};
+
+md2AscRenderer.table = function (header, body) {
+ var headerContent = "\n[width=\"100%\",options=\"header\"]";
+ var start = "\n|====";
+ var end = "\n|====\n";
+ return headerContent + start + header + body + end;
+};
+
+md2AscRenderer.tablerow = function (content) {
+ return "\n" + content;
+};
+
+md2AscRenderer.tablecell = function (content, flags) {
+ return "| " + content + " ";
+};
+
+md2AscRenderer.blockquote = function (quote) {
+ return "\n\n[quote]\n____" + quote + "\n____\n\n";
+};
+
+md2AscRenderer.code = function (code, lang, escaped) {
+ if (!lang) {
+ return "\n\n----\n" + code + "\n----\n\n"
+ }
+ return "\n\n[source," + lang + "]\n----\n" + code + "\n----\n\n";
+};
+
+md2AscRenderer.codespan = function (text) {
+ //text = text.replace(/\*/g, "\\*");
+ text = text.replace(/\*\*/g, "{asterisk}{asterisk}");
+ if ((text.match(/#/g) || "").length % 2 == 1)
+ text = text.replace(/#/g, "\\#");
+
+ return "`" + text + "`";
+};
+
+md2AscRenderer.strong = function (text) {
+ return '**' + text + '**';
+};
+
+md2AscRenderer.em = function (text) {
+ return '__' + text + '__';
+};
+
+md2AscRenderer.br = function (text) {
+ return text + ' +\n';
+};
+
+md2AscRenderer.del = function (text) {
+ return '+++' + text + '+++';
+};
+
+md2AscRenderer.link = function (href, title, text) {
+ var relative = !href.match(/(https?|ftp|irc|mailto|email).*/);
+ var markupFile = href.match(/.*\.(asc|asciidoc|adoc|md|markdown|ad)$/ig);
+
+ return "\n" + ( relative ? (markupFile ? "include::" : "link:") : "") + href + "[" + text + "]\n";
+};
+
+md2AscRenderer.image = function (href, title, text) {
+ var alt = text ? "alt=" + text + (title ? "," : "") : "";
+ var imageTitle = title ? "title=" + title : "";
+ return "\nimage::" + href + "[" + alt + imageTitle + "]\n";
+};
+
+function markdownToAsciidoc(input) {
+ var result = "";
+ try {
+ var result = marked(input, {renderer: md2AscRenderer});
+ }
+ catch (e) {
+ throw e;
+ }
+ return result;
+}
+
+function repeatStuff(s, n) {
+ var a = [];
+ while (a.length < n) {
+ a.push(s);
+ }
+ return a.join('');
+}
+
diff --git a/markdownToAsciidoc/src/main/resources/marked.js b/markdownToAsciidoc/src/main/resources/marked.js
new file mode 100644
index 00000000..9f2ae1b4
--- /dev/null
+++ b/markdownToAsciidoc/src/main/resources/marked.js
@@ -0,0 +1,1123 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/chjj/marked
+ */
+
+var window = {};
+
+;(function() {
+
+ /**
+ * Block-Level Grammar
+ */
+
+ var block = {
+ newline: /^\n+/,
+ code: /^( {4}[^\n]+\n*)+/,
+ fences: noop,
+ hr: /^( *[-*_]){3,} *(?:\n+|$)/,
+ heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
+ nptable: noop,
+ blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,
+ list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
+ html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
+ def: /^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
+ table: noop,
+ paragraph: /^((?:[^\n]+\n?(?!hr|heading|blockquote|tag|def))+)\n*/,
+ text: /^[^\n]+/
+ };
+
+ block.bullet = /(?:[*+-]|\d+\.)/;
+ block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
+ block.item = replace(block.item, 'gm')
+ (/bull/g, block.bullet)
+ ();
+
+ block.list = replace(block.list)
+ (/bull/g, block.bullet)
+ ('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')
+ ('def', '\\n+(?=' + block.def.source + ')')
+ ();
+
+ block.blockquote = replace(block.blockquote)
+ ('def', block.def)
+ ();
+
+ block._tag = '(?!(?:'
+ + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
+ + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
+ + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b';
+
+ block.html = replace(block.html)
+ ('comment', //)
+ ('closed', /<(tag)[\s\S]+?<\/\1>/)
+ ('closing', /])*?>/)
+ (/tag/g, block._tag)
+ ();
+
+ block.paragraph = replace(block.paragraph)
+ ('hr', block.hr)
+ ('heading', block.heading)
+ ('blockquote', block.blockquote)
+ ('tag', '<' + block._tag)
+ ('def', block.def)
+ ();
+
+ /**
+ * Normal Block Grammar
+ */
+
+ block.normal = merge({}, block);
+
+ /**
+ * GFM Block Grammar
+ */
+
+ block.gfm = merge({}, block.normal, {
+ fences: /^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,
+ paragraph: /^/
+ });
+
+ block.gfm.paragraph = replace(block.paragraph)
+ ('(?!', '(?!'
+ + block.gfm.fences.source.replace('\\1', '\\2') + '|'
+ + block.list.source.replace('\\1', '\\3') + '|')
+ ();
+
+ /**
+ * GFM + Tables Block Grammar
+ */
+
+ block.tables = merge({}, block.gfm, {
+ nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
+ table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
+ });
+
+ /**
+ * Block Lexer
+ */
+
+ function Lexer(options) {
+ this.tokens = [];
+ this.tokens.links = {};
+ this.options = options || marked.defaults;
+ this.rules = block.normal;
+
+ if (this.options.gfm) {
+ if (this.options.tables) {
+ this.rules = block.tables;
+ } else {
+ this.rules = block.gfm;
+ }
+ }
+ }
+
+ /**
+ * Expose Block Rules
+ */
+
+ Lexer.rules = block;
+
+ /**
+ * Static Lex Method
+ */
+
+ Lexer.lex = function(src, options) {
+ var lexer = new Lexer(options);
+ return lexer.lex(src);
+ };
+
+ /**
+ * Preprocessing
+ */
+
+ Lexer.prototype.lex = function(src) {
+ src = src
+ .replace(/\r\n|\r/g, '\n')
+ .replace(/\t/g, ' ')
+ .replace(/\u00a0/g, ' ')
+ .replace(/\u2424/g, '\n');
+
+ return this.token(src, true);
+ };
+
+ /**
+ * Lexing
+ */
+
+ Lexer.prototype.token = function(src, top, bq) {
+ var src = src.replace(/^ +$/gm, '')
+ , next
+ , loose
+ , cap
+ , bull
+ , b
+ , item
+ , space
+ , i
+ , l;
+
+ while (src) {
+ // newline
+ if (cap = this.rules.newline.exec(src)) {
+ src = src.substring(cap[0].length);
+ if (cap[0].length > 1) {
+ this.tokens.push({
+ type: 'space'
+ });
+ }
+ }
+
+ // code
+ if (cap = this.rules.code.exec(src)) {
+ src = src.substring(cap[0].length);
+ cap = cap[0].replace(/^ {4}/gm, '');
+ this.tokens.push({
+ type: 'code',
+ text: !this.options.pedantic
+ ? cap.replace(/\n+$/, '')
+ : cap
+ });
+ continue;
+ }
+
+ // fences (gfm)
+ if (cap = this.rules.fences.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'code',
+ lang: cap[2],
+ text: cap[3]
+ });
+ continue;
+ }
+
+ // heading
+ if (cap = this.rules.heading.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'heading',
+ depth: cap[1].length,
+ text: cap[2]
+ });
+ continue;
+ }
+
+ // table no leading pipe (gfm)
+ if (top && (cap = this.rules.nptable.exec(src))) {
+ src = src.substring(cap[0].length);
+
+ item = {
+ type: 'table',
+ header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
+ align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+ cells: cap[3].replace(/\n$/, '').split('\n')
+ };
+
+ for (i = 0; i < item.align.length; i++) {
+ if (/^ *-+: *$/.test(item.align[i])) {
+ item.align[i] = 'right';
+ } else if (/^ *:-+: *$/.test(item.align[i])) {
+ item.align[i] = 'center';
+ } else if (/^ *:-+ *$/.test(item.align[i])) {
+ item.align[i] = 'left';
+ } else {
+ item.align[i] = null;
+ }
+ }
+
+ for (i = 0; i < item.cells.length; i++) {
+ item.cells[i] = item.cells[i].split(/ *\| */);
+ }
+
+ this.tokens.push(item);
+
+ continue;
+ }
+
+ // hr
+ if (cap = this.rules.hr.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'hr'
+ });
+ continue;
+ }
+
+ // blockquote
+ if (cap = this.rules.blockquote.exec(src)) {
+ src = src.substring(cap[0].length);
+
+ this.tokens.push({
+ type: 'blockquote_start'
+ });
+
+ cap = cap[0].replace(/^ *> ?/gm, '');
+
+ // Pass `top` to keep the current
+ // "toplevel" state. This is exactly
+ // how markdown.pl works.
+ this.token(cap, top, true);
+
+ this.tokens.push({
+ type: 'blockquote_end'
+ });
+
+ continue;
+ }
+
+ // list
+ if (cap = this.rules.list.exec(src)) {
+ src = src.substring(cap[0].length);
+ bull = cap[2];
+
+ this.tokens.push({
+ type: 'list_start',
+ ordered: bull.length > 1
+ });
+
+ // Get each top-level item.
+ cap = cap[0].match(this.rules.item);
+
+ next = false;
+ l = cap.length;
+ i = 0;
+
+ for (; i < l; i++) {
+ item = cap[i];
+
+ // Remove the list item's bullet
+ // so it is seen as the next token.
+ space = item.length;
+ item = item.replace(/^ *([*+-]|\d+\.) +/, '');
+
+ // Outdent whatever the
+ // list item contains. Hacky.
+ if (~item.indexOf('\n ')) {
+ space -= item.length;
+ item = !this.options.pedantic
+ ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
+ : item.replace(/^ {1,4}/gm, '');
+ }
+
+ // Determine whether the next list item belongs here.
+ // Backpedal if it does not belong in this list.
+ if (this.options.smartLists && i !== l - 1) {
+ b = block.bullet.exec(cap[i + 1])[0];
+ if (bull !== b && !(bull.length > 1 && b.length > 1)) {
+ src = cap.slice(i + 1).join('\n') + src;
+ i = l - 1;
+ }
+ }
+
+ // Determine whether item is loose or not.
+ // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+ // for discount behavior.
+ loose = next || /\n\n(?!\s*$)/.test(item);
+ if (i !== l - 1) {
+ next = item.charAt(item.length - 1) === '\n';
+ if (!loose) loose = next;
+ }
+
+ this.tokens.push({
+ type: loose
+ ? 'loose_item_start'
+ : 'list_item_start'
+ });
+
+ // Recurse.
+ this.token(item, false, bq);
+
+ this.tokens.push({
+ type: 'list_item_end'
+ });
+ }
+
+ this.tokens.push({
+ type: 'list_end'
+ });
+
+ continue;
+ }
+
+ // html
+ if (cap = this.rules.html.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: this.options.sanitize
+ ? 'paragraph'
+ : 'html',
+ pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',
+ text: cap[0]
+ });
+ continue;
+ }
+
+ // def
+ if ((!bq && top) && (cap = this.rules.def.exec(src))) {
+ src = src.substring(cap[0].length);
+ this.tokens.links[cap[1].toLowerCase()] = {
+ href: cap[2],
+ title: cap[3]
+ };
+ continue;
+ }
+
+ // table (gfm)
+ if (top && (cap = this.rules.table.exec(src))) {
+ src = src.substring(cap[0].length);
+
+ item = {
+ type: 'table',
+ header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
+ align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+ cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
+ };
+
+ for (i = 0; i < item.align.length; i++) {
+ if (/^ *-+: *$/.test(item.align[i])) {
+ item.align[i] = 'right';
+ } else if (/^ *:-+: *$/.test(item.align[i])) {
+ item.align[i] = 'center';
+ } else if (/^ *:-+ *$/.test(item.align[i])) {
+ item.align[i] = 'left';
+ } else {
+ item.align[i] = null;
+ }
+ }
+
+ for (i = 0; i < item.cells.length; i++) {
+ item.cells[i] = item.cells[i]
+ .replace(/^ *\| *| *\| *$/g, '')
+ .split(/ *\| */);
+ }
+
+ this.tokens.push(item);
+
+ continue;
+ }
+
+ // top-level paragraph
+ if (top && (cap = this.rules.paragraph.exec(src))) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'paragraph',
+ text: cap[1].charAt(cap[1].length - 1) === '\n'
+ ? cap[1].slice(0, -1)
+ : cap[1]
+ });
+ continue;
+ }
+
+ // text
+ if (cap = this.rules.text.exec(src)) {
+ // Top-level should never reach here.
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'text',
+ text: cap[0]
+ });
+ continue;
+ }
+
+ if (src) {
+ throw new
+ Error('Infinite loop on byte: ' + src.charCodeAt(0));
+ }
+ }
+
+ return this.tokens;
+ };
+
+ /**
+ * Inline-Level Grammar
+ */
+
+ var inline = {
+ escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
+ autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
+ url: noop,
+ tag: /^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
+ link: /^!?\[(inside)\]\(href\)/,
+ reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
+ nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
+ strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
+ em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
+ code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,
+ br: /^ {2,}\n(?!\s*$)/,
+ del: noop,
+ text: /^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/;
+
+ inline.link = replace(inline.link)
+ ('inside', inline._inside)
+ ('href', inline._href)
+ ();
+
+ inline.reflink = replace(inline.reflink)
+ ('inside', inline._inside)
+ ();
+
+ /**
+ * Normal Inline Grammar
+ */
+
+ inline.normal = merge({}, inline);
+
+ /**
+ * Pedantic Inline Grammar
+ */
+
+ inline.pedantic = merge({}, inline.normal, {
+ strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+ em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
+ });
+
+ /**
+ * GFM Inline Grammar
+ */
+
+ inline.gfm = merge({}, inline.normal, {
+ escape: replace(inline.escape)('])', '~|])')(),
+ url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
+ del: /^~~(?=\S)([\s\S]*?\S)~~/,
+ text: replace(inline.text)
+ (']|', '~]|')
+ ('|', '|https?://|')
+ ()
+ });
+
+ /**
+ * GFM + Line Breaks Inline Grammar
+ */
+
+ inline.breaks = merge({}, inline.gfm, {
+ br: replace(inline.br)('{2,}', '*')(),
+ text: replace(inline.gfm.text)('{2,}', '*')()
+ });
+
+ /**
+ * Inline Lexer & Compiler
+ */
+
+ function InlineLexer(links, options) {
+ this.options = options || marked.defaults;
+ this.links = links;
+ this.rules = inline.normal;
+ this.renderer = this.options.renderer || new Renderer;
+ this.renderer.options = this.options;
+
+ if (!this.links) {
+ throw new
+ Error('Tokens array requires a `links` property.');
+ }
+
+ if (this.options.gfm) {
+ if (this.options.breaks) {
+ this.rules = inline.breaks;
+ } else {
+ this.rules = inline.gfm;
+ }
+ } else if (this.options.pedantic) {
+ this.rules = inline.pedantic;
+ }
+ }
+
+ /**
+ * Expose Inline Rules
+ */
+
+ InlineLexer.rules = inline;
+
+ /**
+ * Static Lexing/Compiling Method
+ */
+
+ InlineLexer.output = function(src, links, options) {
+ var inline = new InlineLexer(links, options);
+ return inline.output(src);
+ };
+
+ /**
+ * Lexing/Compiling
+ */
+
+ InlineLexer.prototype.output = function(src) {
+ var out = ''
+ , link
+ , text
+ , href
+ , cap;
+
+ while (src) {
+ // escape
+ if (cap = this.rules.escape.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += cap[1];
+ continue;
+ }
+
+ // autolink
+ if (cap = this.rules.autolink.exec(src)) {
+ src = src.substring(cap[0].length);
+ if (cap[2] === '@') {
+ text = cap[1].charAt(6) === ':'
+ ? this.mangle(cap[1].substring(7))
+ : this.mangle(cap[1]);
+ href = this.mangle('mailto:') + text;
+ } else {
+ text = escape(cap[1]);
+ href = text;
+ }
+ out += this.renderer.link(href, null, text);
+ continue;
+ }
+
+ // url (gfm)
+ if (!this.inLink && (cap = this.rules.url.exec(src))) {
+ src = src.substring(cap[0].length);
+ text = escape(cap[1]);
+ href = text;
+ out += this.renderer.link(href, null, text);
+ continue;
+ }
+
+ // tag
+ if (cap = this.rules.tag.exec(src)) {
+ if (!this.inLink && /^/i.test(cap[0])) {
+ this.inLink = false;
+ }
+ src = src.substring(cap[0].length);
+ out += this.options.sanitize
+ ? escape(cap[0])
+ : cap[0];
+ continue;
+ }
+
+ // link
+ if (cap = this.rules.link.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.inLink = true;
+ out += this.outputLink(cap, {
+ href: cap[2],
+ title: cap[3]
+ });
+ this.inLink = false;
+ continue;
+ }
+
+ // reflink, nolink
+ if ((cap = this.rules.reflink.exec(src))
+ || (cap = this.rules.nolink.exec(src))) {
+ src = src.substring(cap[0].length);
+ link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+ link = this.links[link.toLowerCase()];
+ if (!link || !link.href) {
+ out += cap[0].charAt(0);
+ src = cap[0].substring(1) + src;
+ continue;
+ }
+ this.inLink = true;
+ out += this.outputLink(cap, link);
+ this.inLink = false;
+ continue;
+ }
+
+ // strong
+ if (cap = this.rules.strong.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.strong(this.output(cap[2] || cap[1]));
+ continue;
+ }
+
+ // em
+ if (cap = this.rules.em.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.em(this.output(cap[2] || cap[1]));
+ continue;
+ }
+
+ // code
+ if (cap = this.rules.code.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.codespan(escape(cap[2], true));
+ continue;
+ }
+
+ // br
+ if (cap = this.rules.br.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.br();
+ continue;
+ }
+
+ // del (gfm)
+ if (cap = this.rules.del.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.del(this.output(cap[1]));
+ continue;
+ }
+
+ // text
+ if (cap = this.rules.text.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += escape(this.smartypants(cap[0]));
+ continue;
+ }
+
+ if (src) {
+ throw new
+ Error('Infinite loop on byte: ' + src.charCodeAt(0));
+ }
+ }
+
+ return out;
+ };
+
+ /**
+ * Compile Link
+ */
+
+ InlineLexer.prototype.outputLink = function(cap, link) {
+ var href = escape(link.href)
+ , title = link.title ? escape(link.title) : null;
+
+ return cap[0].charAt(0) !== '!'
+ ? this.renderer.link(href, title, this.output(cap[1]))
+ : this.renderer.image(href, title, escape(cap[1]));
+ };
+
+ /**
+ * Smartypants Transformations
+ */
+
+ InlineLexer.prototype.smartypants = function(text) {
+ if (!this.options.smartypants) return text;
+ return text
+ // em-dashes
+ .replace(/--/g, '\u2014')
+ // opening singles
+ .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
+ // closing singles & apostrophes
+ .replace(/'/g, '\u2019')
+ // opening doubles
+ .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
+ // closing doubles
+ .replace(/"/g, '\u201d')
+ // ellipses
+ .replace(/\.{3}/g, '\u2026');
+ };
+
+ /**
+ * Mangle Links
+ */
+
+ InlineLexer.prototype.mangle = function(text) {
+ var out = ''
+ , l = text.length
+ , i = 0
+ , ch;
+
+ for (; i < l; i++) {
+ ch = text.charCodeAt(i);
+ if (Math.random() > 0.5) {
+ ch = 'x' + ch.toString(16);
+ }
+ out += '' + ch + ';';
+ }
+
+ return out;
+ };
+
+ /**
+ * Renderer
+ */
+
+ function Renderer(options) {
+ this.options = options || {};
+ }
+
+
+
+ /**
+ * Parsing & Compiling
+ */
+
+ function Parser(options) {
+ this.tokens = [];
+ this.token = null;
+ this.options = options || marked.defaults;
+ this.options.renderer = this.options.renderer || new Renderer;
+ this.renderer = this.options.renderer;
+ this.renderer.options = this.options;
+ }
+
+ /**
+ * Static Parse Method
+ */
+
+ Parser.parse = function(src, options, renderer) {
+ var parser = new Parser(options, renderer);
+ return parser.parse(src);
+ };
+
+ /**
+ * Parse Loop
+ */
+
+ Parser.prototype.parse = function(src) {
+ this.inline = new InlineLexer(src.links, this.options, this.renderer);
+ this.tokens = src.reverse();
+
+ var out = '';
+ while (this.next()) {
+ out += this.tok();
+ }
+
+ return out;
+ };
+
+ /**
+ * Next Token
+ */
+
+ Parser.prototype.next = function() {
+ return this.token = this.tokens.pop();
+ };
+
+ /**
+ * Preview Next Token
+ */
+
+ Parser.prototype.peek = function() {
+ return this.tokens[this.tokens.length - 1] || 0;
+ };
+
+ /**
+ * Parse Text Tokens
+ */
+
+ Parser.prototype.parseText = function() {
+ var body = this.token.text;
+
+ while (this.peek().type === 'text') {
+ body += '\n' + this.next().text;
+ }
+
+ return this.inline.output(body);
+ };
+
+ /**
+ * Parse Current Token
+ */
+
+ Parser.prototype.tok = function() {
+ switch (this.token.type) {
+ case 'space': {
+ return '';
+ }
+ case 'hr': {
+ return this.renderer.hr();
+ }
+ case 'heading': {
+ return this.renderer.heading(
+ this.inline.output(this.token.text),
+ this.token.depth,
+ this.token.text);
+ }
+ case 'code': {
+ return this.renderer.code(this.token.text,
+ this.token.lang,
+ this.token.escaped);
+ }
+ case 'table': {
+ var header = ''
+ , body = ''
+ , i
+ , row
+ , cell
+ , flags
+ , j;
+
+ // header
+ cell = '';
+ for (i = 0; i < this.token.header.length; i++) {
+ flags = { header: true, align: this.token.align[i] };
+ cell += this.renderer.tablecell(
+ this.inline.output(this.token.header[i]),
+ { header: true, align: this.token.align[i] }
+ );
+ }
+ header += this.renderer.tablerow(cell);
+
+ for (i = 0; i < this.token.cells.length; i++) {
+ row = this.token.cells[i];
+
+ cell = '';
+ for (j = 0; j < row.length; j++) {
+ cell += this.renderer.tablecell(
+ this.inline.output(row[j]),
+ { header: false, align: this.token.align[j] }
+ );
+ }
+
+ body += this.renderer.tablerow(cell);
+ }
+ return this.renderer.table(header, body);
+ }
+ case 'blockquote_start': {
+ var body = '';
+
+ while (this.next().type !== 'blockquote_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.blockquote(body);
+ }
+ case 'list_start': {
+ var body = ''
+ , ordered = this.token.ordered;
+
+ while (this.next().type !== 'list_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.list(body, ordered);
+ }
+ case 'list_item_start': {
+ var body = '';
+
+ while (this.next().type !== 'list_item_end') {
+ body += this.token.type === 'text'
+ ? this.parseText()
+ : this.tok();
+ }
+
+ return this.renderer.listitem(body);
+ }
+ case 'loose_item_start': {
+ var body = '';
+
+ while (this.next().type !== 'list_item_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.listitem(body);
+ }
+ case 'html': {
+ var html = !this.token.pre && !this.options.pedantic
+ ? this.inline.output(this.token.text)
+ : this.token.text;
+ return this.renderer.html(html);
+ }
+ case 'paragraph': {
+ return this.renderer.paragraph(this.inline.output(this.token.text));
+ }
+ case 'text': {
+ return this.renderer.paragraph(this.parseText());
+ }
+ }
+ };
+
+ /**
+ * Helpers
+ */
+
+ function escape(html, encode) {
+ return html;
+ }
+
+ function unescape(html) {
+ return html.replace(/&([#\w]+);/g, function(_, n) {
+ n = n.toLowerCase();
+ if (n === 'colon') return ':';
+ if (n.charAt(0) === '#') {
+ return n.charAt(1) === 'x'
+ ? String.fromCharCode(parseInt(n.substring(2), 16))
+ : String.fromCharCode(+n.substring(1));
+ }
+ return '';
+ });
+ }
+
+ function replace(regex, opt) {
+ regex = regex.source;
+ opt = opt || '';
+ return function self(name, val) {
+ if (!name) return new RegExp(regex, opt);
+ val = val.source || val;
+ val = val.replace(/(^|[^\[])\^/g, '$1');
+ regex = regex.replace(name, val);
+ return self;
+ };
+ }
+
+ function noop() {}
+ noop.exec = noop;
+
+ function merge(obj) {
+ var i = 1
+ , target
+ , key;
+
+ for (; i < arguments.length; i++) {
+ target = arguments[i];
+ for (key in target) {
+ if (Object.prototype.hasOwnProperty.call(target, key)) {
+ obj[key] = target[key];
+ }
+ }
+ }
+
+ return obj;
+ }
+
+
+ /**
+ * Marked
+ */
+
+ function marked(src, opt, callback) {
+ if (callback || typeof opt === 'function') {
+ if (!callback) {
+ callback = opt;
+ opt = null;
+ }
+
+ opt = merge({}, marked.defaults, opt || {});
+
+ var highlight = opt.highlight
+ , tokens
+ , pending
+ , i = 0;
+
+ try {
+ tokens = Lexer.lex(src, opt)
+ } catch (e) {
+ return callback(e);
+ }
+
+ pending = tokens.length;
+
+ var done = function(err) {
+ if (err) {
+ opt.highlight = highlight;
+ return callback(err);
+ }
+
+ var out;
+
+ try {
+ out = Parser.parse(tokens, opt);
+ } catch (e) {
+ err = e;
+ }
+
+ opt.highlight = highlight;
+
+ return err
+ ? callback(err)
+ : callback(null, out);
+ };
+
+ if (!highlight || highlight.length < 3) {
+ return done();
+ }
+
+ delete opt.highlight;
+
+ if (!pending) return done();
+
+ for (; i < tokens.length; i++) {
+ (function(token) {
+ if (token.type !== 'code') {
+ return --pending || done();
+ }
+ return highlight(token.text, token.lang, function(err, code) {
+ if (err) return done(err);
+ if (code == null || code === token.text) {
+ return --pending || done();
+ }
+ token.text = code;
+ token.escaped = true;
+ --pending || done();
+ });
+ })(tokens[i]);
+ }
+
+ return;
+ }
+ try {
+ if (opt) opt = merge({}, marked.defaults, opt);
+ return Parser.parse(Lexer.lex(src, opt), opt);
+ } catch (e) {
+ e.message += '\nPlease report this to https://github.com/chjj/marked.';
+ if ((opt || marked.defaults).silent) {
+ return 'An error occured:
'
+ + escape(e.message + '', true)
+ + '
';
+ }
+ throw e;
+ }
+ }
+
+ /**
+ * Options
+ */
+
+ marked.options =
+ marked.setOptions = function(opt) {
+ merge(marked.defaults, opt);
+ return marked;
+ };
+
+ marked.defaults = {
+ gfm: true,
+ tables: true,
+ breaks: false,
+ pedantic: false,
+ sanitize: false,
+ smartLists: false,
+ silent: false,
+ highlight: null,
+ langPrefix: 'lang-',
+ smartypants: false,
+ headerPrefix: '',
+ renderer: new Renderer,
+ xhtml: false
+ };
+
+ /**
+ * Expose
+ */
+
+ marked.Parser = Parser;
+ marked.parser = Parser.parse;
+
+ marked.Renderer = Renderer;
+
+ marked.Lexer = Lexer;
+ marked.lexer = Lexer.lex;
+
+ marked.InlineLexer = InlineLexer;
+ marked.inlineLexer = InlineLexer.output;
+
+ marked.parse = marked;
+
+ if (typeof module !== 'undefined' && typeof exports === 'object') {
+ module.exports = marked;
+ } else if (typeof define === 'function' && define.amd) {
+ define(function() { return marked; });
+ } else {
+ this.marked = marked;
+ }
+
+}).call(function() {
+ return this || (typeof window !== 'undefined' ? window : global);
+ }());
diff --git a/maven-metadata-inferer/pom.xml b/maven-metadata-inferer/pom.xml
index 655b4866..5eb7a479 100644
--- a/maven-metadata-inferer/pom.xml
+++ b/maven-metadata-inferer/pom.xml
@@ -1,11 +1,9 @@
-
+
4.0.0
io.github.Riduidel.aadarchi
system
- 0.1.11-SNAPSHOT
+ 0.1.12-SNAPSHOT
maven-metadata-inferer
Aadarchi : Maven metadata inferer
@@ -44,11 +42,10 @@
${project.version}
test
-
- org.json
- json
- 20230618
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.15.2
@@ -66,8 +63,7 @@
Download popular artifacts
-
- ${project.build.directory}/generated/resources/mvnrepository/artifacts.json
+
@@ -87,8 +83,14 @@
good -->
false
+ true
+ true
mvnrepository.json
+
+ 10000
+
+ 10
diff --git a/maven-metadata-inferer/src/main/java/org/ndx/aadarchi/inferer/maven/MavenEnhancer.java b/maven-metadata-inferer/src/main/java/org/ndx/aadarchi/inferer/maven/MavenEnhancer.java
index 990ed50e..879f014b 100644
--- a/maven-metadata-inferer/src/main/java/org/ndx/aadarchi/inferer/maven/MavenEnhancer.java
+++ b/maven-metadata-inferer/src/main/java/org/ndx/aadarchi/inferer/maven/MavenEnhancer.java
@@ -1,7 +1,11 @@
package org.ndx.aadarchi.inferer.maven;
+import java.util.Map;
+
import org.ndx.aadarchi.base.enhancers.ModelElementKeys;
+import com.fasterxml.jackson.core.type.TypeReference;
+
public interface MavenEnhancer {
/**
* URL of the maven pom the model element represents.
@@ -29,4 +33,7 @@ public interface MavenEnhancer {
* When set, this allows users to enter a list of profiles names separated by ";"
*/
String AGILE_ARCHITECTURE_MAVEN_ADDITIONAL_PROFILES = ModelElementKeys.PREFIX+"maven.profiles";
+
+ String AGILE_ARCHITECTURE_MAVEN_TECHNOLOGIES = ModelElementKeys.PREFIX+"maven.technologies";
+ TypeReference