Skip to content

Commit

Permalink
#116 Markdownパーサーの変更
Browse files Browse the repository at this point in the history
- Forkしたmarkedjを参照するように設定の変更
- MarkdownLogic内のパース呼び出し処理のデフォルトを、上記Forkしたライブラリに変更
- 呼び出せてることをテスト出来るようにした
  • Loading branch information
koda-masaru committed Oct 23, 2015
1 parent 9fdf445 commit 766ce8f
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 2 deletions.
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@
<version>4.3.1</version>
</dependency>

<dependency>
<groupId>io.github.gitbucket</groupId>
<artifactId>markedj</artifactId>
<version>1.0.4-SNAPSHOT</version>
</dependency>

</dependencies>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package org.support.project.knowledge.logic;

import io.github.gitbucket.markedj.Marked;
import io.github.gitbucket.markedj.Options;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
Expand Down Expand Up @@ -30,6 +33,7 @@ public class MarkdownLogic {

public static final int ENGINE_PEGDOWN = 1;
public static final int ENGINE_MARKEDJS = 2;
public static final int ENGINE_MARKEDJ = 3; // スライド表示用の独自拡張(デフォルト)

private ScriptEngine engine = null;
private boolean initEngine = false;
Expand Down Expand Up @@ -57,14 +61,17 @@ public MarkDown markdownToHtml(String markdown) throws ParseException {
public MarkDown markdownToHtml(String markdown, int engine) throws ParseException {
MarkDown result = new MarkDown();
if (engine == ENGINE_MARKEDJS) {
LOG.warn("marked.js parser was deprecated");
markdownToHtmlOnMarkedJs(markdown, result);
} else {
} else if (engine == ENGINE_PEGDOWN) {
LOG.warn("PegDown parser was deprecated");
markdownToHtmlOnPegDown(markdown, result);
} else {
markdownToHtmlOnMarkedJ(markdown, result);
}
return sanitize(markdown, result);
}


/**
* サニタイジング
* @param markdown
Expand Down Expand Up @@ -92,6 +99,37 @@ private MarkDown sanitize(String markdown, MarkDown result) throws ParseExceptio
}
}

/**
* support-project/markedj (https://github.com/support-project/markedj) でマークダウンをパース
* スライド表示の独自拡張を行っている
*
* @param markdown
* @param result
*/
private void markdownToHtmlOnMarkedJ(String markdown, MarkDown result) {
// TODO サニタイズの検討
// 既に、SanitizingLogic の中で org.owasp のモジュールを使ってサニタイズしている
// このため、MarkedJを利用してサニタイズは利用する必要無し?
// Specify options
// Options options = new Options();
// options.setSanitize(true);
// String html2 = Marked.marked(markdown, options);

Date start = new Date();

result.setMarkdown(markdown);
String html = Marked.marked(markdown);
result.setHtml(html);
result.setParsed(true);

if (LOG.isDebugEnabled()) {
Date end = new Date();
// 以前、別のMarkdownパーサーのパースが凄く時間がかかったので、パース時間を出力している
LOG.debug("Parse time (MarkedJ): " + (end.getTime() - start.getTime()) + " [ms]");
}
}


/**
* PegDownでMarkDownのパース
* @param markdown
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,4 +209,26 @@ public void test6() throws ParseException, UnsupportedEncodingException, IOExcep




@Test
@Order(order= 7)
public void testMarkdJ1() throws ParseException, UnsupportedEncodingException, IOException, TransformerFactoryConfigurationError, TransformerException {
String markdown = FileUtil.read(getClass().getResourceAsStream("markdown/markdj-1.md"));
String html = FileUtil.read(getClass().getResourceAsStream("markdown/result-markdj-1.txt"));
String result = MarkdownLogic.get().markdownToHtml(markdown, MarkdownLogic.ENGINE_MARKEDJ).getHtml();
try {
org.junit.Assert.assertArrayEquals(read(html), read(result));
} catch (AssertionError e) {
LOG.info("testMarkdJ1");
LOG.info("[Markdown] : " + markdown);
LOG.info("[Html] : " + html);
LOG.info("[Parsed] : " + result);
LOG.info("[Indent] : " + SanitizingLogic.get().indent(result));
throw e;
}
}




}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# テスト
- 簡単なmarkdown
- <font color="red">HTMLのタグを使える?</font>
- インデント
- 少しだけ複雑
- どうなるか?

## 見出し2
- Javascriptで簡単にパースしていたけど、Java側で実行した方が制御しやすいね
- 危険な<script>タグは使える?</script>

### Script
<script>alert('hoge');</script>
<span onblur="alert('hoge');">これ通る?</span>
<p onblur="alert('hoge');">通らない</p>

- PegDownProcessorだけだと、そのまま出力する(XSSでやばそう)
- サニタイジングする

```ruby:qiita.rb
puts 'The best way to log and share programmers knowledge.'
```

```html
<button>hogehoge</button>
```

```java
private List<Object> params = new ArrayList<>();
```



Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<h1 id="-">テスト</h1>
<ul><li>簡単なmarkdown</li><li><font color="red">HTMLのタグを使える&#xff1f;</font><ul><li>インデント</li><li>少しだけ複雑</li></ul>
</li><li>どうなるか&#xff1f;</li></ul>
<h2 id="-">見出し&#xff12;</h2>
<ul><li>Javascriptで簡単にパースしていたけど、Java側で実行した方が制御しやすいね</li><li>危険な</li></ul>
<h3 id="script">Script</h3>
<p>
これ通る&#xff1f;</p>
<p>通らない</p>

<ul><li>PegDownProcessorだけだと、そのまま出力する&#xff08;XSSでやばそう&#xff09;</li><li>サニタイジングする</li></ul>
<pre><code class="lang-ruby:qiita.rb">puts &#39;The best way to log and share programmers knowledge.&#39;
</code></pre>
<pre><code class="lang-html">&lt;button&gt;hogehoge&lt;/button&gt;
</code></pre>
<pre><code class="lang-java">private List&lt;Object&gt; params &#61; new ArrayList&lt;&gt;();
</code></pre>

0 comments on commit 766ce8f

Please sign in to comment.